@@ -7,19 +7,43 @@ use std::collections::HashMap;
77#[ derive( Debug , Deserialize ) ]
88#[ cfg_attr( feature = "test" , derive( Default , Serialize ) ) ]
99pub struct DynamicConfigTarget {
10- pub service : String ,
11- pub env : String ,
10+ #[ serde( default ) ]
11+ pub service : Option < String > ,
12+ #[ serde( default ) ]
13+ pub env : Option < String > ,
1214}
1315
1416#[ derive( Debug , Deserialize ) ]
1517#[ cfg_attr( feature = "test" , derive( Serialize ) ) ]
1618pub struct DynamicConfigFile {
1719 pub action : String ,
18- pub service_target : DynamicConfigTarget ,
20+ #[ serde( default ) ]
21+ pub service_target : Option < DynamicConfigTarget > ,
1922 pub lib_config : DynamicConfig ,
2023}
2124
22- #[ derive( Debug , Deserialize ) ]
25+ impl DynamicConfigFile {
26+ /// Returns the priority of this config for merge ordering.
27+ /// Lower value = higher priority.
28+ /// 0 = service+env specific, 1 = service only, 2 = env only,
29+ /// 3 = reserved (k8s cluster), 4 = org-level (wildcard/absent)
30+ pub fn priority ( & self ) -> u8 {
31+ fn is_specific ( s : & Option < String > ) -> bool {
32+ s. as_deref ( ) . is_some_and ( |v| v != "*" )
33+ }
34+ match & self . service_target {
35+ None => 4 ,
36+ Some ( t) => match ( is_specific ( & t. service ) , is_specific ( & t. env ) ) {
37+ ( true , true ) => 0 ,
38+ ( true , false ) => 1 ,
39+ ( false , true ) => 2 ,
40+ ( false , false ) => 4 ,
41+ } ,
42+ }
43+ }
44+ }
45+
46+ #[ derive( Debug , Clone , Deserialize ) ]
2347#[ cfg_attr( feature = "test" , derive( Serialize ) ) ]
2448pub ( crate ) struct TracingHeaderTag {
2549 pub header : String ,
@@ -33,14 +57,14 @@ pub enum TracingSamplingRuleProvenance {
3357 Dynamic ,
3458}
3559
36- #[ derive( Debug , Deserialize ) ]
60+ #[ derive( Debug , Clone , Deserialize ) ]
3761#[ cfg_attr( feature = "test" , derive( Serialize ) ) ]
3862pub struct TracingSamplingRuleTag {
3963 pub key : String ,
4064 pub value_glob : String ,
4165}
4266
43- #[ derive( Debug , Deserialize ) ]
67+ #[ derive( Debug , Clone , Deserialize ) ]
4468#[ cfg_attr( feature = "test" , derive( Serialize ) ) ]
4569pub struct TracingSamplingRule {
4670 pub service : String ,
@@ -102,6 +126,7 @@ impl From<DynamicConfig> for Vec<Configs> {
102126 }
103127}
104128
129+ #[ derive( Clone ) ]
105130pub enum Configs {
106131 TracingHeaderTags ( HashMap < String , String > ) ,
107132 TracingSampleRate ( f64 ) ,
@@ -125,7 +150,7 @@ pub mod tests {
125150 pub fn dummy_dynamic_config ( enabled : bool ) -> DynamicConfigFile {
126151 DynamicConfigFile {
127152 action : "" . to_string ( ) ,
128- service_target : DynamicConfigTarget :: default ( ) ,
153+ service_target : None ,
129154 lib_config : DynamicConfig {
130155 tracing_enabled : Some ( enabled) ,
131156 ..DynamicConfig :: default ( )
0 commit comments