1
1
import os
2
2
from typing import Literal , TypedDict
3
3
4
- from opentelemetry .environment_variables import OTEL_TRACES_EXPORTER
4
+ from opentelemetry .environment_variables import OTEL_METRICS_EXPORTER , OTEL_TRACES_EXPORTER
5
5
from opentelemetry .sdk .environment_variables import OTEL_SERVICE_NAME
6
+ from opentelemetry .sdk .metrics import MeterProvider
7
+ from opentelemetry .sdk .metrics .export import (
8
+ ConsoleMetricExporter ,
9
+ MetricReader ,
10
+ PeriodicExportingMetricReader ,
11
+ )
6
12
from opentelemetry .sdk .resources import SERVICE_NAME , Resource
7
13
from opentelemetry .sdk .trace import TracerProvider
8
14
from opentelemetry .sdk .trace .export import (
9
15
ConsoleSpanExporter ,
10
16
SimpleSpanProcessor ,
11
17
)
12
18
13
- ExporterType = Literal ["otlp" , "jaeger" , "zipkin" , "console" ]
19
+ TraceExporterType = Literal ["otlp" , "jaeger" , "zipkin" , "console" ]
20
+ MetricExporterType = Literal ["otlp" , "prometheus" , "none" ]
14
21
15
22
16
23
class OtelSettings (TypedDict ):
17
24
service_name : str
18
- exporters : list [ExporterType ]
25
+ trace_exporters : list [TraceExporterType ]
26
+ metric_exporters : list [MetricExporterType ]
19
27
20
28
21
29
def get_settings () -> OtelSettings :
22
30
service_name = os .environ .get (OTEL_SERVICE_NAME , "unknown_service" )
23
- exporters = os .environ .get (OTEL_TRACES_EXPORTER )
24
- exporters = exporters .split ("," ) if exporters else []
25
- return OtelSettings (service_name = service_name , exporters = exporters )
31
+ trace_exporters = os .environ .get (OTEL_TRACES_EXPORTER )
32
+ trace_exporters = trace_exporters .split ("," ) if trace_exporters else []
33
+
34
+ metric_exporters = os .environ .get (OTEL_METRICS_EXPORTER )
35
+ metric_exporters = metric_exporters .split ("," ) if metric_exporters else []
36
+ return OtelSettings (
37
+ service_name = service_name ,
38
+ trace_exporters = trace_exporters ,
39
+ metric_exporters = metric_exporters ,
40
+ )
26
41
27
42
28
- def get_provider () -> TracerProvider :
43
+ def get_trace_provider () -> TracerProvider :
29
44
settings = get_settings ()
45
+ print (settings )
30
46
provider = TracerProvider (resource = Resource ({SERVICE_NAME : settings ["service_name" ]}))
31
47
32
- for exporter_type in settings ["exporters " ]:
33
- _add_exporter (exporter_type = exporter_type , provider = provider )
48
+ for trace_exporter_type in settings ["trace_exporters " ]:
49
+ _add_trace_exporter (exporter_type = trace_exporter_type , provider = provider )
34
50
35
51
return provider
36
52
37
53
38
- def _add_exporter (exporter_type : ExporterType , provider : TracerProvider ):
54
+ def get_metric_provider () -> MeterProvider :
55
+ settings = get_settings ()
56
+ readers = []
57
+ for metric_exporter_type in settings ["metric_exporters" ]:
58
+ readers .append (_get_metrics_reader (exporter_type = metric_exporter_type ))
59
+ return MeterProvider (
60
+ resource = Resource ({SERVICE_NAME : settings ["service_name" ]}), metric_readers = readers
61
+ )
62
+
63
+
64
+ def _add_trace_exporter (exporter_type : TraceExporterType , provider : TracerProvider ):
39
65
if exporter_type == "otlp" :
40
66
_add_traces_otlp_exporter (
41
67
provider ,
@@ -47,6 +73,14 @@ def _add_exporter(exporter_type: ExporterType, provider: TracerProvider):
47
73
raise NotImplementedError (f"{ exporter_type } implementation not supported yet" )
48
74
49
75
76
+ def _get_metrics_reader (exporter_type : MetricExporterType ) -> MetricReader :
77
+ if exporter_type == "otlp" :
78
+ return _get_metric_otlp_reader ()
79
+ if exporter_type == "console" :
80
+ return _get_metric_console_reader ()
81
+ raise NotImplementedError (f"{ exporter_type } implementation not supported yet" )
82
+
83
+
50
84
def _add_traces_console_exporter (provider : TracerProvider ) -> None :
51
85
exporter = ConsoleSpanExporter ()
52
86
processor = SimpleSpanProcessor (exporter )
@@ -59,3 +93,15 @@ def _add_traces_otlp_exporter(provider: TracerProvider) -> None:
59
93
exporter = OTLPSpanExporter ()
60
94
processor = SimpleSpanProcessor (exporter )
61
95
provider .add_span_processor (processor )
96
+
97
+
98
+ def _get_metric_otlp_reader () -> MetricReader :
99
+ from opentelemetry .exporter .otlp .proto .grpc .metric_exporter import OTLPMetricExporter
100
+
101
+ exporter = OTLPMetricExporter ()
102
+ return PeriodicExportingMetricReader (exporter )
103
+
104
+
105
+ def _get_metric_console_reader () -> MetricReader :
106
+ exporter = ConsoleMetricExporter ()
107
+ return PeriodicExportingMetricReader (exporter )
0 commit comments