11use std:: { fmt, path:: Path } ;
22
3+ use code0_flow:: flow_telemetry:: OpenTelemetry ;
34use config:: { Config as ConfigLoader , ConfigError , File } ;
45use serde:: { Deserialize , Serialize } ;
56
@@ -14,6 +15,9 @@ pub struct Config {
1415 pub environment : Environment ,
1516 pub mode : Mode ,
1617 pub log_level : String ,
18+ #[ serde( alias = "telemetry" ) ]
19+ #[ serde( default = "default_opentelemetry" ) ]
20+ pub opentelemetry : OpenTelemetry ,
1721 pub nats : Nats ,
1822 pub static_config : StaticConfig ,
1923 pub dynamic_config : DynamicConfig ,
@@ -78,6 +82,7 @@ impl Default for Config {
7882 environment : Environment :: Development ,
7983 mode : Mode :: Static ,
8084 log_level : "debug" . into ( ) ,
85+ opentelemetry : default_opentelemetry ( ) ,
8186 nats : Nats :: default ( ) ,
8287 static_config : StaticConfig :: default ( ) ,
8388 dynamic_config : DynamicConfig :: default ( ) ,
@@ -87,6 +92,13 @@ impl Default for Config {
8792 }
8893}
8994
95+ fn default_opentelemetry ( ) -> OpenTelemetry {
96+ OpenTelemetry {
97+ service_name : env ! ( "CARGO_PKG_NAME" ) . into ( ) ,
98+ ..OpenTelemetry :: default ( )
99+ }
100+ }
101+
90102impl Default for Nats {
91103 fn default ( ) -> Self {
92104 Self {
@@ -175,6 +187,28 @@ impl fmt::Display for Config {
175187 writeln ! ( formatter, " Environment: {}" , self . environment) ?;
176188 writeln ! ( formatter, " Mode: {}" , self . mode) ?;
177189 writeln ! ( formatter, " Log level: {}" , self . log_level) ?;
190+ writeln ! ( formatter, " OpenTelemetry" ) ?;
191+ writeln ! ( formatter, " Enabled: {}" , self . opentelemetry. enabled) ?;
192+ writeln ! (
193+ formatter,
194+ " Service: {}" ,
195+ self . opentelemetry. service_name
196+ ) ?;
197+ writeln ! (
198+ formatter,
199+ " Logs: {}" ,
200+ display_optional_url( & self . opentelemetry. logs_endpoint)
201+ ) ?;
202+ writeln ! (
203+ formatter,
204+ " Metrics: {}" ,
205+ display_optional_url( & self . opentelemetry. metrics_endpoint)
206+ ) ?;
207+ writeln ! (
208+ formatter,
209+ " Traces: {}" ,
210+ display_optional_url( & self . opentelemetry. traces_endpoint)
211+ ) ?;
178212 writeln ! ( formatter, " NATS" ) ?;
179213 writeln ! ( formatter, " URL: {}" , self . nats. url) ?;
180214 writeln ! ( formatter, " Bucket: {}" , self . nats. bucket) ?;
@@ -222,11 +256,21 @@ impl fmt::Display for Config {
222256 }
223257}
224258
259+ fn display_optional_url ( url : & Option < String > ) -> & str {
260+ url. as_deref ( )
261+ . filter ( |value| !value. trim ( ) . is_empty ( ) )
262+ . unwrap_or ( "<disabled>" )
263+ }
264+
225265#[ cfg( test) ]
226266mod tests {
227267 use std:: sync:: Mutex ;
228268
229- use super :: Config ;
269+ use config:: Config as ConfigLoader ;
270+
271+ use code0_flow:: flow_telemetry:: OpenTelemetry ;
272+
273+ use super :: { Config , default_opentelemetry} ;
230274
231275 static ENV_LOCK : Mutex < ( ) > = Mutex :: new ( ( ) ) ;
232276
@@ -275,4 +319,39 @@ mod tests {
275319 assert ! ( !output. contains( "super-secret" ) ) ;
276320 assert ! ( !output. contains( "Config {" ) ) ;
277321 }
322+
323+ #[ test]
324+ fn opentelemetry_endpoints_are_enabled_by_presence ( ) {
325+ let config: OpenTelemetry = ConfigLoader :: builder ( )
326+ . add_source (
327+ ConfigLoader :: try_from ( & default_opentelemetry ( ) )
328+ . expect ( "default telemetry config should serialize" ) ,
329+ )
330+ . set_override ( "enabled" , true )
331+ . expect ( "enabled override should apply" )
332+ . set_override ( "service_name" , "sagittarius" )
333+ . expect ( "service name override should apply" )
334+ . set_override ( "logs_endpoint" , "" )
335+ . expect ( "logs override should apply" )
336+ . set_override ( "metrics_endpoint" , " " )
337+ . expect ( "metrics override should apply" )
338+ . set_override ( "traces_endpoint" , "http://localhost:4317" )
339+ . expect ( "traces override should apply" )
340+ . build ( )
341+ . expect ( "telemetry config should build" )
342+ . try_deserialize ( )
343+ . expect ( "telemetry config should deserialize" ) ;
344+
345+ assert ! ( config. enabled) ;
346+ assert_eq ! ( config. service_name, "sagittarius" ) ;
347+ assert_eq ! ( config. logs_endpoint( ) , None ) ;
348+ assert_eq ! ( config. metrics_endpoint( ) , None ) ;
349+ assert_eq ! ( config. traces_endpoint( ) , Some ( "http://localhost:4317" ) ) ;
350+ assert ! ( config. has_enabled_exporter( ) ) ;
351+ }
352+
353+ #[ test]
354+ fn opentelemetry_default_service_name_is_aquila ( ) {
355+ assert_eq ! ( Config :: default ( ) . opentelemetry. service_name, "aquila" ) ;
356+ }
278357}
0 commit comments