27
27
28
28
.. code:: python
29
29
30
- from opentelemetry import metrics
31
- from opentelemetry.exporter.prometheus import PrometheusMetricExporter
32
- from opentelemetry.sdk.metrics import Meter
33
30
from prometheus_client import start_http_server
34
31
32
+ from opentelemetry._metrics import get_meter_provider, set_meter_provider
33
+ from opentelemetry.exporter.prometheus import PrometheusMetricExporter
34
+ from opentelemetry.sdk._metrics import MeterProvider
35
+ from opentelemetry.sdk._metrics.export import PullMetricExporterReader
36
+
35
37
# Start Prometheus client
36
38
start_http_server(port=8000, addr="localhost")
37
39
38
- # Meter is responsible for creating and recording metrics
39
- metrics.set_meter_provider(MeterProvider())
40
- meter = metrics.get_meter(__name__)
41
40
# exporter to export metrics to Prometheus
42
41
prefix = "MyAppPrefix"
43
42
exporter = PrometheusMetricExporter(prefix)
44
- # Starts the collect/export pipeline for metrics
45
- metrics.get_meter_provider().start_pipeline(meter, exporter, 5)
43
+ reader = PullMetricExporterReader(exporter)
44
+
45
+ # Meter is responsible for creating and recording metrics
46
+ set_meter_provider(MeterProvider(metric_readers=[reader]))
47
+ meter = get_meter_provider().get_meter(__name__)
46
48
47
49
counter = meter.create_counter(
48
50
"requests",
49
- "number of requests",
50
51
"requests",
51
- int ,
52
+ "number of requests" ,
52
53
)
53
54
54
55
# Labels are used to identify key-values that are associated with a specific
71
72
from prometheus_client import core
72
73
73
74
from opentelemetry .sdk ._metrics .export import (
74
- MetricExporter ,
75
75
MetricExportResult ,
76
+ PullMetricExporter ,
76
77
)
77
78
from opentelemetry .sdk ._metrics .point import Gauge , Histogram , Metric , Sum
78
79
79
- logger = logging .getLogger (__name__ )
80
+ _logger = logging .getLogger (__name__ )
80
81
81
82
82
83
def _convert_buckets (metric : Metric ) -> Sequence [Tuple [str , int ]]:
@@ -93,7 +94,7 @@ def _convert_buckets(metric: Metric) -> Sequence[Tuple[str, int]]:
93
94
return buckets
94
95
95
96
96
- class PrometheusMetricExporter (MetricExporter ):
97
+ class PrometheusMetricExporter (PullMetricExporter ):
97
98
"""Prometheus metric exporter for OpenTelemetry.
98
99
99
100
Args:
@@ -102,7 +103,8 @@ class PrometheusMetricExporter(MetricExporter):
102
103
"""
103
104
104
105
def __init__ (self , prefix : str = "" ):
105
- self ._collector = _CustomCollector (prefix )
106
+ self ._collect = None
107
+ self ._collector = _CustomCollector (self .collect , prefix )
106
108
core .REGISTRY .register (self ._collector )
107
109
108
110
def export (self , metrics : Sequence [Metric ]) -> MetricExportResult :
@@ -118,8 +120,9 @@ class _CustomCollector:
118
120
https://github.com/prometheus/client_python#custom-collectors
119
121
"""
120
122
121
- def __init__ (self , prefix : str = "" ):
123
+ def __init__ (self , callback , prefix : str = "" ):
122
124
self ._prefix = prefix
125
+ self ._callback = callback
123
126
self ._metrics_to_export = collections .deque ()
124
127
self ._non_letters_nor_digits_re = re .compile (
125
128
r"[^\w]" , re .UNICODE | re .IGNORECASE
@@ -135,6 +138,8 @@ def collect(self) -> None:
135
138
Collect is invoked every time a prometheus.Gatherer is run
136
139
for example when the HTTP endpoint is invoked by Prometheus.
137
140
"""
141
+ if self ._callback :
142
+ self ._callback ()
138
143
139
144
while self ._metrics_to_export :
140
145
for export_record in self ._metrics_to_export .popleft ():
@@ -193,7 +198,7 @@ def _translate_to_prometheus(
193
198
labels = label_values , buckets = buckets , sum_value = value
194
199
)
195
200
else :
196
- logger .warning ("Unsupported metric type. %s" , type (metric .point ))
201
+ _logger .warning ("Unsupported metric type. %s" , type (metric .point ))
197
202
return prometheus_metric
198
203
199
204
def _sanitize (self , key : str ) -> str :
0 commit comments