-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtrace_module.py
58 lines (48 loc) · 2.32 KB
/
trace_module.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
from opentelemetry import trace
from opentelemetry.sdk.resources import SERVICE_NAME, Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor, ConsoleSpanExporter
from opentelemetry.trace import Status, StatusCode
from opentelemetry.exporter.jaeger.thrift import JaegerExporter
import threading
class SimpleTracer:
_provider_initialized = False
_provider_lock = threading.Lock()
def __init__(self, service_name, jaeger_host='localhost', jaeger_port=6831):
self.service_name = service_name
self.jaeger_host = jaeger_host
self.jaeger_port = jaeger_port
self._initialize_tracer_provider()
self.tracer = trace.get_tracer(service_name)
def _initialize_tracer_provider(self):
# This method ensures the provider is initialized only once
if not self._provider_initialized:
with self._provider_lock:
if not self._provider_initialized:
resource = Resource(attributes={
SERVICE_NAME: self.service_name
})
provider = TracerProvider(resource=resource)
# Set the tracer provider
trace.set_tracer_provider(provider)
# Set up the Jaeger exporter
jaeger_exporter = JaegerExporter(
agent_host_name=self.jaeger_host,
agent_port=self.jaeger_port,
)
span_processor = BatchSpanProcessor(jaeger_exporter)
provider.add_span_processor(span_processor)
# Also log to console
console_exporter = ConsoleSpanExporter()
console_span_processor = BatchSpanProcessor(console_exporter)
provider.add_span_processor(console_span_processor)
self._provider_initialized = True
def log(self, span_name, func, *args, **kwargs):
with self.tracer.start_as_current_span(span_name) as span:
try:
result = func(*args, **kwargs)
span.set_status(Status(StatusCode.OK))
return result
except Exception as e:
span.set_status(Status(StatusCode.ERROR, str(e)))
raise e