-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathopentelemetry_tracer.py
149 lines (120 loc) · 5.06 KB
/
opentelemetry_tracer.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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
import os
from dotenv import load_dotenv
# from opentelemetry.sdk.resources import Resource
# from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
# from opentelemetry.trace import set_tracer_provider, get_tracer_provider
# from opentelemetry.sdk.trace import TracerProvider, sampling
# from opentelemetry.sdk.trace.export import BatchSpanProcessor
# import json
import json
import logging
from opentelemetry.sdk.resources import Resource
# Import exporters
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter
from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter
# Trace imports
from opentelemetry.trace import set_tracer_provider, get_tracer_provider
from opentelemetry.sdk.trace import TracerProvider, sampling
from opentelemetry.sdk.trace.export import BatchSpanProcessor
# Metric imports
from opentelemetry import metrics as metrics
from opentelemetry.sdk.metrics.export import (
AggregationTemporality,
PeriodicExportingMetricReader,
)
from opentelemetry.sdk.metrics import MeterProvider, Counter, UpDownCounter, Histogram, ObservableCounter, ObservableUpDownCounter
from opentelemetry.metrics import set_meter_provider, get_meter_provider
# Logs import
from opentelemetry.sdk._logs import LoggerProvider, LoggingHandler
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
from opentelemetry._logs import set_logger_provider
load_dotenv()
DT_API_URL = os.getenv("DT_API_URL")
DT_API_TOKEN = os.getenv("DT_API_TOKEN")
# def init_tracer():
# merged = dict()
# for name in ["dt_metadata_e617c525669e072eebe3d0f08212e8f2.json", "/var/lib/dynatrace/enrichment/dt_metadata.json", "/var/lib/dynatrace/enrichment/dt_host_metadata.json"]:
# try:
# data = ''
# with open(name) as f:
# data = json.load(f if name.startswith("/var") else open(f.read()))
# merged.update(data)
# except:
# pass
# merged.update({
# "service.name": "python-quickstart", #TODO Replace with the name of your application
# "service.version": "1.0.1", #TODO Replace with the version of your application
# })
# resource = Resource.create(merged)
# tracer_provider = TracerProvider(sampler=sampling.ALWAYS_ON, resource=resource)
# set_tracer_provider(tracer_provider)
# tracer_provider.add_span_processor(
# BatchSpanProcessor(
# OTLPSpanExporter(
# endpoint=f"{DT_API_URL}/v1/traces",
# headers={"Authorization": f"Api-Token {DT_API_TOKEN}"}
# )
# )
# )
def get_tracer():
return get_tracer_provider().get_tracer(__name__)
def get_meter():
return get_meter_provider().get_meter(__name__)
def init_all():
merged = dict()
for name in ["dt_metadata_e617c525669e072eebe3d0f08212e8f2.json", "/var/lib/dynatrace/enrichment/dt_metadata.json", "/var/lib/dynatrace/enrichment/dt_host_metadata.json"]:
try:
data = ''
with open(name) as f:
data = json.load(f if name.startswith("/var") else open(f.read()))
merged.update(data)
except:
pass
merged.update({
"service.name": "python-quickstart2", #TODO Replace with the name of your application
"service.version": "1.0.1", #TODO Replace with the version of your application
})
resource = Resource.create(merged)
# ===== TRACING SETUP =====
tracer_provider = TracerProvider(sampler=sampling.ALWAYS_ON, resource=resource)
set_tracer_provider(tracer_provider)
tracer_provider.add_span_processor(
BatchSpanProcessor(
OTLPSpanExporter(
endpoint = DT_API_URL + "/v1/traces",
headers = {
"Authorization": "Api-Token " + DT_API_TOKEN
}
)
)
)
# ===== METRIC SETUP =====
exporter = OTLPMetricExporter(
endpoint = DT_API_URL + "/v1/metrics",
headers = {"Authorization": "Api-Token " + DT_API_TOKEN},
preferred_temporality = {
Counter: AggregationTemporality.DELTA,
UpDownCounter: AggregationTemporality.CUMULATIVE,
Histogram: AggregationTemporality.DELTA,
ObservableCounter: AggregationTemporality.DELTA,
ObservableUpDownCounter: AggregationTemporality.CUMULATIVE,
}
)
reader = PeriodicExportingMetricReader(exporter)
provider = MeterProvider(metric_readers=[reader], resource=resource)
set_meter_provider(provider)
# ===== LOG SETUP =====
logger_provider = LoggerProvider(resource=resource)
set_logger_provider(logger_provider)
logger_provider.add_log_record_processor(
BatchLogRecordProcessor(OTLPLogExporter(
endpoint = DT_API_URL + "/v1/logs",
headers = {"Authorization": "Api-Token " + DT_API_TOKEN}
))
)
handler = LoggingHandler(level=logging.NOTSET, logger_provider=logger_provider)
# Attach OTLP handler to root logger
logging.getLogger().addHandler(handler)
def get_logger():
return logging.getLogger(__name__)