1+ use crate :: metrics:: configure_metrics;
12pub use crate :: options:: Options ;
23
34mod domain;
5+ mod metrics;
46mod names;
57mod options;
68mod process;
@@ -11,7 +13,9 @@ use geth_mikoshi::{
1113use opentelemetry:: { trace:: TracerProvider , KeyValue } ;
1214use opentelemetry_appender_tracing:: layer:: OpenTelemetryTracingBridge ;
1315use opentelemetry_otlp:: WithExportConfig ;
14- use opentelemetry_sdk:: { logs:: SdkLoggerProvider , trace:: SdkTracerProvider , Resource } ;
16+ use opentelemetry_sdk:: {
17+ logs:: SdkLoggerProvider , metrics:: PeriodicReader , trace:: SdkTracerProvider , Resource ,
18+ } ;
1519pub use process:: {
1620 indexing:: IndexClient ,
1721 manager:: { start_process_manager_with_catalog, Catalog , CatalogBuilder , ManagerClient } ,
@@ -87,6 +91,7 @@ impl EmbeddedClient {
8791struct TelemetryHandles {
8892 traces : Option < SdkTracerProvider > ,
8993 logs : Option < SdkLoggerProvider > ,
94+ metrics : Option < opentelemetry_sdk:: metrics:: SdkMeterProvider > ,
9095}
9196
9297impl TelemetryHandles {
@@ -99,11 +104,17 @@ impl TelemetryHandles {
99104 provider. shutdown ( ) ?;
100105 }
101106
107+ if let Some ( provider) = self . metrics {
108+ provider. shutdown ( ) ?;
109+ }
110+
102111 Ok ( ( ) )
103112 }
104113}
105114
106115pub async fn run_embedded ( options : & Options ) -> eyre:: Result < EmbeddedClient > {
116+ configure_metrics ( ) ;
117+
107118 let handles = if options. telemetry . disabled {
108119 TelemetryHandles :: default ( )
109120 } else {
@@ -176,7 +187,7 @@ fn init_telemetry(options: &Options) -> eyre::Result<TelemetryHandles> {
176187
177188 let log_provider = SdkLoggerProvider :: builder ( )
178189 . with_batch_exporter ( log_exporter)
179- . with_resource ( resource)
190+ . with_resource ( resource. clone ( ) )
180191 . build ( ) ;
181192
182193 handles. logs = Some ( log_provider. clone ( ) ) ;
@@ -186,6 +197,31 @@ fn init_telemetry(options: &Options) -> eyre::Result<TelemetryHandles> {
186197 None
187198 } ;
188199
200+ if let Some ( endpoint) = options
201+ . telemetry
202+ . metrics_endpoint
203+ . as_ref ( )
204+ . or ( options. telemetry . endpoint . as_ref ( ) )
205+ {
206+ let metric_exporter = opentelemetry_otlp:: MetricExporter :: builder ( )
207+ . with_http ( )
208+ . with_endpoint ( format ! ( "{endpoint}/ingest/otlp/v1/metrics" ) )
209+ . build ( ) ?;
210+
211+ let reader = PeriodicReader :: builder ( metric_exporter)
212+ . with_interval ( std:: time:: Duration :: from_secs ( 10 ) )
213+ . build ( ) ;
214+
215+ let meter_provider = opentelemetry_sdk:: metrics:: SdkMeterProvider :: builder ( )
216+ . with_reader ( reader)
217+ . with_resource ( resource)
218+ . build ( ) ;
219+
220+ handles. metrics = Some ( meter_provider. clone ( ) ) ;
221+
222+ opentelemetry:: global:: set_meter_provider ( meter_provider) ;
223+ }
224+
189225 let fmt_layer = if options. telemetry . endpoint . is_none ( ) {
190226 let layer = tracing_subscriber:: fmt:: layer ( )
191227 . with_file ( true )
0 commit comments