@@ -54,21 +54,24 @@ struct ComposerPackages {
54
54
packages : Vec < data:: Dependency > ,
55
55
}
56
56
57
- #[ derive( Clone ) ]
57
+ pub struct TelemetryCachedEntry {
58
+ last_used : Instant ,
59
+ pub client : Arc < Mutex < TelemetryCachedClient > > ,
60
+ }
61
+
58
62
pub struct TelemetryCachedClient {
59
- pub client : TelemetryWorkerHandle ,
60
- pub shm_writer : Arc < OneWayShmWriter < NamedShmHandle > > ,
61
- pub last_used : Instant ,
63
+ pub worker : TelemetryWorkerHandle ,
64
+ pub shm_writer : OneWayShmWriter < NamedShmHandle > ,
62
65
pub config_sent : bool ,
63
66
pub buffered_integrations : HashSet < Integration > ,
64
67
pub buffered_composer_paths : HashSet < PathBuf > ,
65
68
pub last_endpoints_push : SystemTime ,
66
- pub telemetry_metrics : Arc < Mutex < HashMap < String , ContextKey > > > ,
67
- pub handle : Arc < Mutex < Option < JoinHandle < ( ) > > > > ,
69
+ pub telemetry_metrics : HashMap < String , ContextKey > ,
70
+ pub handle : Option < JoinHandle < ( ) > > ,
68
71
}
69
72
70
73
impl TelemetryCachedClient {
71
- pub fn new (
74
+ fn new (
72
75
service : & str ,
73
76
env : & str ,
74
77
instance_id : & InstanceId ,
@@ -91,18 +94,17 @@ impl TelemetryCachedClient {
91
94
92
95
info ! ( "spawning telemetry worker {config:?}" ) ;
93
96
Self {
94
- client : handle. clone ( ) ,
95
- shm_writer : Arc :: new (
97
+ worker : handle. clone ( ) ,
98
+ shm_writer : {
96
99
#[ allow( clippy:: unwrap_used) ]
97
- OneWayShmWriter :: < NamedShmHandle > :: new ( path_for_telemetry ( service, env) ) . unwrap ( ) ,
98
- ) ,
99
- last_used : Instant :: now ( ) ,
100
+ OneWayShmWriter :: < NamedShmHandle > :: new ( path_for_telemetry ( service, env) ) . unwrap ( )
101
+ } ,
100
102
config_sent : false ,
101
103
buffered_integrations : HashSet :: new ( ) ,
102
104
buffered_composer_paths : HashSet :: new ( ) ,
103
105
last_endpoints_push : SystemTime :: UNIX_EPOCH ,
104
106
telemetry_metrics : Default :: default ( ) ,
105
- handle : Arc :: new ( Mutex :: new ( None ) ) ,
107
+ handle : None ,
106
108
}
107
109
}
108
110
@@ -119,12 +121,11 @@ impl TelemetryCachedClient {
119
121
}
120
122
}
121
123
122
- pub fn register_metric ( & self , metric : MetricContext ) {
123
- let mut metrics = self . telemetry_metrics . lock_or_panic ( ) ;
124
- if !metrics. contains_key ( & metric. name ) {
125
- metrics. insert (
124
+ pub fn register_metric ( & mut self , metric : MetricContext ) {
125
+ if !self . telemetry_metrics . contains_key ( & metric. name ) {
126
+ self . telemetry_metrics . insert (
126
127
metric. name . clone ( ) ,
127
- self . client . register_metric_context (
128
+ self . worker . register_metric_context (
128
129
metric. name ,
129
130
metric. tags ,
130
131
metric. metric_type ,
@@ -140,14 +141,13 @@ impl TelemetryCachedClient {
140
141
( name, val, tags) : ( String , f64 , Vec < Tag > ) ,
141
142
) -> TelemetryActions {
142
143
#[ allow( clippy:: unwrap_used) ]
143
- TelemetryActions :: AddPoint ( (
144
- val,
145
- * self . telemetry_metrics . lock_or_panic ( ) . get ( & name) . unwrap ( ) ,
146
- tags,
147
- ) )
144
+ TelemetryActions :: AddPoint ( ( val, * self . telemetry_metrics . get ( & name) . unwrap ( ) , tags) )
148
145
}
149
146
150
- pub fn process_actions ( & self , sidecar_actions : Vec < SidecarAction > ) -> Vec < TelemetryActions > {
147
+ pub fn process_actions (
148
+ & mut self ,
149
+ sidecar_actions : Vec < SidecarAction > ,
150
+ ) -> Vec < TelemetryActions > {
151
151
let mut actions = vec ! [ ] ;
152
152
for action in sidecar_actions {
153
153
match action {
@@ -236,13 +236,13 @@ type EnvString = String;
236
236
type TelemetryCachedClientKey = ( ServiceString , EnvString ) ;
237
237
238
238
pub struct TelemetryCachedClientSet {
239
- pub inner : Arc < Mutex < HashMap < TelemetryCachedClientKey , TelemetryCachedClient > > > ,
239
+ pub inner : Arc < Mutex < HashMap < TelemetryCachedClientKey , TelemetryCachedEntry > > > ,
240
240
cleanup_handle : Option < tokio:: task:: JoinHandle < ( ) > > ,
241
241
}
242
242
243
243
impl Default for TelemetryCachedClientSet {
244
244
fn default ( ) -> Self {
245
- let inner: Arc < Mutex < HashMap < TelemetryCachedClientKey , TelemetryCachedClient > > > =
245
+ let inner: Arc < Mutex < HashMap < TelemetryCachedClientKey , TelemetryCachedEntry > > > =
246
246
Arc :: new ( Default :: default ( ) ) ;
247
247
let clients = inner. clone ( ) ;
248
248
@@ -286,7 +286,7 @@ impl TelemetryCachedClientSet {
286
286
instance_id : & InstanceId ,
287
287
runtime_meta : & RuntimeMetadata ,
288
288
get_config : F ,
289
- ) -> TelemetryCachedClient
289
+ ) -> Arc < Mutex < TelemetryCachedClient > >
290
290
where
291
291
F : FnOnce ( ) -> ddtelemetry:: config:: Config ,
292
292
{
@@ -296,32 +296,37 @@ impl TelemetryCachedClientSet {
296
296
297
297
if let Some ( existing) = map. get_mut ( & key) {
298
298
existing. last_used = Instant :: now ( ) ;
299
- let client = existing. clone ( ) ;
300
299
tokio:: spawn ( {
301
- let telemetry = client. clone ( ) ;
300
+ let worker = existing . client . lock_or_panic ( ) . worker . clone ( ) ;
302
301
async move {
303
- telemetry
304
- . client
302
+ worker
305
303
. send_msg ( TelemetryActions :: Lifecycle ( LifecycleAction :: Start ) )
306
304
. await
307
305
. ok ( ) ;
308
306
}
309
307
} ) ;
310
308
311
309
info ! ( "Reusing existing telemetry client for {key:?}" ) ;
312
- return client;
310
+ return existing . client . clone ( ) ;
313
311
}
314
312
315
- let client =
316
- TelemetryCachedClient :: new ( service, env, instance_id, runtime_meta, get_config) ;
313
+ let entry = TelemetryCachedEntry {
314
+ last_used : Instant :: now ( ) ,
315
+ client : Arc :: new ( Mutex :: new ( TelemetryCachedClient :: new (
316
+ service,
317
+ env,
318
+ instance_id,
319
+ runtime_meta,
320
+ get_config,
321
+ ) ) ) ,
322
+ } ;
317
323
318
- map. insert ( key. clone ( ) , client . clone ( ) ) ;
324
+ let entry = map. entry ( key. clone ( ) ) . or_insert ( entry ) ;
319
325
320
326
tokio:: spawn ( {
321
- let telemetry = client. clone ( ) ;
327
+ let worker = entry . client . lock_or_panic ( ) . worker . clone ( ) ;
322
328
async move {
323
- telemetry
324
- . client
329
+ worker
325
330
. send_msg ( TelemetryActions :: Lifecycle ( LifecycleAction :: Start ) )
326
331
. await
327
332
. ok ( ) ;
@@ -330,7 +335,7 @@ impl TelemetryCachedClientSet {
330
335
331
336
info ! ( "Created new telemetry client for {key:?}" ) ;
332
337
333
- client
338
+ entry . client . clone ( )
334
339
}
335
340
336
341
pub fn remove_telemetry_client ( & self , service : & str , env : & str ) {
@@ -388,10 +393,11 @@ pub(crate) async fn telemetry_action_receiver_task(sidecar: SidecarServer) {
388
393
& actions. service_name ,
389
394
& actions. env_name ,
390
395
) ;
396
+ let client = telemetry_client. lock_or_panic ( ) . worker . clone ( ) ;
391
397
392
398
for action in actions. actions {
393
399
let action_str = format ! ( "{action:?}" ) ;
394
- match telemetry_client . client . send_msg ( action) . await {
400
+ match client. send_msg ( action) . await {
395
401
Ok ( _) => {
396
402
debug ! ( "Sent telemetry action to TelemetryWorker: {action_str}" ) ;
397
403
}
@@ -409,7 +415,7 @@ fn get_telemetry_client(
409
415
instance_id : & InstanceId ,
410
416
service_name : & str ,
411
417
env_name : & str ,
412
- ) -> TelemetryCachedClient {
418
+ ) -> Arc < Mutex < TelemetryCachedClient > > {
413
419
let session = sidecar. get_session ( & instance_id. session_id ) ;
414
420
let trace_config = session. get_trace_config ( ) ;
415
421
let runtime_meta = RuntimeMetadata :: new (
0 commit comments