@@ -3,23 +3,20 @@ use crate::http::config::HttpConfig;
33use crate :: instrumentation:: config:: otel:: OtelConfig ;
44use crate :: instrumentation:: tracing:: LayerBox ;
55use opentelemetry:: trace:: TracerProvider ;
6+ use opentelemetry:: KeyValue ;
67use opentelemetry_appender_tracing:: layer:: OpenTelemetryTracingBridge ;
78use opentelemetry_http:: HttpClient as OtelHttpClient ;
89use opentelemetry_otlp:: { ExporterBuildError , WithExportConfig , WithHttpConfig } ;
910use opentelemetry_sdk:: logs:: { BatchLogProcessor , SdkLoggerProvider } ;
1011use opentelemetry_sdk:: metrics:: { PeriodicReader , SdkMeterProvider } ;
1112use opentelemetry_sdk:: trace:: { BatchSpanProcessor , SdkTracerProvider } ;
1213use opentelemetry_sdk:: Resource ;
13- use std:: sync:: LazyLock ;
1414use thiserror:: Error ;
1515use tracing_opentelemetry:: MetricsLayer ;
1616use tracing_subscriber:: { EnvFilter , Layer } ;
1717
1818const TRACER_NAME : & str = "agent-control-self-instrumentation" ;
1919
20- static RESOURCE : LazyLock < Resource > =
21- LazyLock :: new ( || Resource :: builder ( ) . with_service_name ( TRACER_NAME ) . build ( ) ) ;
22-
2320/// Enumerates the possible error building OpenTelemetry providers.
2421#[ derive( Debug , Error ) ]
2522pub enum OtelBuildError {
@@ -64,23 +61,40 @@ impl OtelLayers {
6461 where
6562 C : OtelHttpClient + Send + Sync + Clone + ' static ,
6663 {
67- let traces_provider = config
68- . traces
69- . enabled
70- . then ( || Self :: traces_provider ( client. clone ( ) , config) )
71- . transpose ( ) ?;
72-
73- let metrics_provider = config
74- . metrics
75- . enabled
76- . then ( || Self :: metrics_provider ( client. clone ( ) , config) )
77- . transpose ( ) ?;
78-
79- let logs_provider = config
80- . logs
81- . enabled
82- . then ( || Self :: logs_provider ( client, config) )
83- . transpose ( ) ?;
64+ let mut traces_provider = None ;
65+ let mut metrics_provider = None ;
66+ let mut logs_provider = None ;
67+
68+ if config. traces . enabled || config. metrics . enabled || config. logs . enabled {
69+ let attributes: Vec < KeyValue > = config
70+ . custom_attributes
71+ . iter ( )
72+ . map ( |( k, v) | KeyValue :: new ( k. clone ( ) , v. clone ( ) ) )
73+ . collect ( ) ;
74+
75+ let resource = Resource :: builder ( )
76+ . with_service_name ( TRACER_NAME )
77+ . with_attributes ( attributes)
78+ . build ( ) ;
79+
80+ traces_provider = config
81+ . traces
82+ . enabled
83+ . then ( || Self :: traces_provider ( client. clone ( ) , config, resource. clone ( ) ) )
84+ . transpose ( ) ?;
85+
86+ metrics_provider = config
87+ . metrics
88+ . enabled
89+ . then ( || Self :: metrics_provider ( client. clone ( ) , config, resource. clone ( ) ) )
90+ . transpose ( ) ?;
91+
92+ logs_provider = config
93+ . logs
94+ . enabled
95+ . then ( || Self :: logs_provider ( client, config, resource) )
96+ . transpose ( ) ?;
97+ }
8498
8599 let filter = EnvFilter :: builder ( )
86100 . parse ( & config. insecure_level )
@@ -100,6 +114,7 @@ impl OtelLayers {
100114 fn traces_provider < C > (
101115 client : C ,
102116 config : & OtelConfig ,
117+ resource : Resource ,
103118 ) -> Result < SdkTracerProvider , OtelBuildError >
104119 where
105120 C : OtelHttpClient + Send + Sync + ' static ,
@@ -117,13 +132,14 @@ impl OtelLayers {
117132
118133 Ok ( SdkTracerProvider :: builder ( )
119134 . with_span_processor ( batch_processor)
120- . with_resource ( RESOURCE . clone ( ) )
135+ . with_resource ( resource )
121136 . build ( ) )
122137 }
123138
124139 fn metrics_provider < C > (
125140 client : C ,
126141 config : & OtelConfig ,
142+ resource : Resource ,
127143 ) -> Result < SdkMeterProvider , OtelBuildError >
128144 where
129145 C : OtelHttpClient + Send + Sync + ' static ,
@@ -141,11 +157,15 @@ impl OtelLayers {
141157
142158 Ok ( SdkMeterProvider :: builder ( )
143159 . with_reader ( periodic_reader)
144- . with_resource ( RESOURCE . clone ( ) )
160+ . with_resource ( resource )
145161 . build ( ) )
146162 }
147163
148- fn logs_provider < C > ( client : C , config : & OtelConfig ) -> Result < SdkLoggerProvider , OtelBuildError >
164+ fn logs_provider < C > (
165+ client : C ,
166+ config : & OtelConfig ,
167+ resource : Resource ,
168+ ) -> Result < SdkLoggerProvider , OtelBuildError >
149169 where
150170 C : OtelHttpClient + Send + Sync + ' static ,
151171 {
@@ -162,7 +182,7 @@ impl OtelLayers {
162182
163183 Ok ( SdkLoggerProvider :: builder ( )
164184 . with_log_processor ( batch_processor)
165- . with_resource ( RESOURCE . clone ( ) )
185+ . with_resource ( resource )
166186 . build ( ) )
167187 }
168188
@@ -190,6 +210,7 @@ impl OtelLayers {
190210#[ cfg( test) ]
191211mod tests {
192212 use http:: Response ;
213+ use opentelemetry_sdk:: Resource ;
193214 use tracing:: { debug, info, trace} ;
194215 use tracing_subscriber:: layer:: SubscriberExt ;
195216 use tracing_subscriber:: EnvFilter ;
@@ -232,6 +253,7 @@ mod tests {
232253 } ,
233254 ..Default :: default ( )
234255 } ,
256+ Resource :: builder ( ) . build ( ) ,
235257 )
236258 . unwrap ( ) ;
237259
0 commit comments