11pub use { future:: * , once_cell:: sync:: Lazy , opentelemetry as otel, task:: * } ;
22use {
3- opentelemetry:: {
4- metrics:: { Meter , MeterProvider } ,
5- sdk:: {
6- export:: metrics:: aggregation,
7- metrics:: { processors, selectors} ,
8- } ,
9- } ,
10- opentelemetry_prometheus:: PrometheusExporter ,
11- prometheus:: { Error as PrometheusError , TextEncoder } ,
3+ opentelemetry_sdk:: metrics:: SdkMeterProvider ,
4+ otel:: metrics:: { Meter , MeterProvider } ,
5+ prometheus:: { Error as PrometheusError , Registry , TextEncoder } ,
126 std:: {
137 sync:: { Arc , Mutex } ,
148 time:: Duration ,
@@ -26,35 +20,26 @@ static SERVICE_NAME: Mutex<Option<&str>> = Mutex::new(None);
2620static METRICS_CORE : Lazy < Arc < ServiceMetrics > > = Lazy :: new ( || {
2721 let service_name = SERVICE_NAME . lock ( ) . unwrap ( ) . unwrap_or ( DEFAULT_SERVICE_NAME ) ;
2822
29- let controller = otel:: sdk:: metrics:: controllers:: basic ( processors:: factory (
30- selectors:: simple:: histogram ( vec ! [ ] ) ,
31- aggregation:: cumulative_temporality_selector ( ) ,
32- ) )
33- . with_resource ( otel:: sdk:: Resource :: new ( vec ! [ otel:: KeyValue :: new(
34- "service_name" ,
35- service_name,
36- ) ] ) )
37- . build ( ) ;
38-
39- let prometheus_exporter = opentelemetry_prometheus:: exporter ( controller) . init ( ) ;
40- let meter = prometheus_exporter
41- . meter_provider ( )
42- . unwrap ( )
43- . meter ( service_name) ;
44-
45- Arc :: new ( ServiceMetrics {
46- meter,
47- prometheus_exporter,
48- } )
23+ let registry = Registry :: new ( ) ;
24+ let prometheus_exporter = opentelemetry_prometheus:: exporter ( )
25+ . with_registry ( registry. clone ( ) )
26+ . build ( )
27+ . unwrap ( ) ;
28+ let provider = SdkMeterProvider :: builder ( )
29+ . with_reader ( prometheus_exporter)
30+ . build ( ) ;
31+ let meter = provider. meter ( service_name) ;
32+
33+ Arc :: new ( ServiceMetrics { registry, meter } )
4934} ) ;
5035
5136/// Global application metrics access.
5237///
5338/// The main functionality is to provide global access to opentelemetry's
5439/// [`Meter`].
5540pub struct ServiceMetrics {
41+ registry : Registry ,
5642 meter : Meter ,
57- prometheus_exporter : PrometheusExporter ,
5843}
5944
6045impl ServiceMetrics {
@@ -81,7 +66,7 @@ impl ServiceMetrics {
8166
8267 /// Generates export data in Prometheus format, serialized into string.
8368 pub fn export ( ) -> Result < String , PrometheusError > {
84- let data = Self :: get ( ) . prometheus_exporter . registry ( ) . gather ( ) ;
69+ let data = Self :: get ( ) . registry . gather ( ) ;
8570 TextEncoder :: new ( ) . encode_to_string ( & data)
8671 }
8772
0 commit comments