@@ -54,20 +54,23 @@ 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
- pub telemetry_metrics : Arc < Mutex < HashMap < String , ContextKey > > > ,
66
- pub handle : Arc < Mutex < Option < JoinHandle < ( ) > > > > ,
68
+ pub telemetry_metrics : HashMap < String , ContextKey > ,
69
+ pub handle : Option < JoinHandle < ( ) > > ,
67
70
}
68
71
69
72
impl TelemetryCachedClient {
70
- pub fn new (
73
+ fn new (
71
74
service : & str ,
72
75
env : & str ,
73
76
instance_id : & InstanceId ,
@@ -90,17 +93,16 @@ impl TelemetryCachedClient {
90
93
91
94
info ! ( "spawning telemetry worker {config:?}" ) ;
92
95
Self {
93
- client : handle. clone ( ) ,
94
- shm_writer : Arc :: new (
96
+ worker : handle. clone ( ) ,
97
+ shm_writer : {
95
98
#[ allow( clippy:: unwrap_used) ]
96
- OneWayShmWriter :: < NamedShmHandle > :: new ( path_for_telemetry ( service, env) ) . unwrap ( ) ,
97
- ) ,
98
- last_used : Instant :: now ( ) ,
99
+ OneWayShmWriter :: < NamedShmHandle > :: new ( path_for_telemetry ( service, env) ) . unwrap ( )
100
+ } ,
99
101
config_sent : false ,
100
102
buffered_integrations : HashSet :: new ( ) ,
101
103
buffered_composer_paths : HashSet :: new ( ) ,
102
104
telemetry_metrics : Default :: default ( ) ,
103
- handle : Arc :: new ( Mutex :: new ( None ) ) ,
105
+ handle : None ,
104
106
}
105
107
}
106
108
@@ -116,12 +118,11 @@ impl TelemetryCachedClient {
116
118
}
117
119
}
118
120
119
- pub fn register_metric ( & self , metric : MetricContext ) {
120
- let mut metrics = self . telemetry_metrics . lock_or_panic ( ) ;
121
- if !metrics. contains_key ( & metric. name ) {
122
- metrics. insert (
121
+ pub fn register_metric ( & mut self , metric : MetricContext ) {
122
+ if !self . telemetry_metrics . contains_key ( & metric. name ) {
123
+ self . telemetry_metrics . insert (
123
124
metric. name . clone ( ) ,
124
- self . client . register_metric_context (
125
+ self . worker . register_metric_context (
125
126
metric. name ,
126
127
metric. tags ,
127
128
metric. metric_type ,
@@ -137,14 +138,13 @@ impl TelemetryCachedClient {
137
138
( name, val, tags) : ( String , f64 , Vec < Tag > ) ,
138
139
) -> TelemetryActions {
139
140
#[ allow( clippy:: unwrap_used) ]
140
- TelemetryActions :: AddPoint ( (
141
- val,
142
- * self . telemetry_metrics . lock_or_panic ( ) . get ( & name) . unwrap ( ) ,
143
- tags,
144
- ) )
141
+ TelemetryActions :: AddPoint ( ( val, * self . telemetry_metrics . get ( & name) . unwrap ( ) , tags) )
145
142
}
146
143
147
- pub fn process_actions ( & self , sidecar_actions : Vec < SidecarAction > ) -> Vec < TelemetryActions > {
144
+ pub fn process_actions (
145
+ & mut self ,
146
+ sidecar_actions : Vec < SidecarAction > ,
147
+ ) -> Vec < TelemetryActions > {
148
148
let mut actions = vec ! [ ] ;
149
149
for action in sidecar_actions {
150
150
match action {
@@ -239,13 +239,13 @@ type EnvString = String;
239
239
type TelemetryCachedClientKey = ( ServiceString , EnvString ) ;
240
240
241
241
pub struct TelemetryCachedClientSet {
242
- pub inner : Arc < Mutex < HashMap < TelemetryCachedClientKey , TelemetryCachedClient > > > ,
242
+ pub inner : Arc < Mutex < HashMap < TelemetryCachedClientKey , TelemetryCachedEntry > > > ,
243
243
cleanup_handle : Option < tokio:: task:: JoinHandle < ( ) > > ,
244
244
}
245
245
246
246
impl Default for TelemetryCachedClientSet {
247
247
fn default ( ) -> Self {
248
- let inner: Arc < Mutex < HashMap < TelemetryCachedClientKey , TelemetryCachedClient > > > =
248
+ let inner: Arc < Mutex < HashMap < TelemetryCachedClientKey , TelemetryCachedEntry > > > =
249
249
Arc :: new ( Default :: default ( ) ) ;
250
250
let clients = inner. clone ( ) ;
251
251
@@ -289,7 +289,7 @@ impl TelemetryCachedClientSet {
289
289
instance_id : & InstanceId ,
290
290
runtime_meta : & RuntimeMetadata ,
291
291
get_config : F ,
292
- ) -> TelemetryCachedClient
292
+ ) -> Arc < Mutex < TelemetryCachedClient > >
293
293
where
294
294
F : FnOnce ( ) -> ddtelemetry:: config:: Config ,
295
295
{
@@ -299,32 +299,37 @@ impl TelemetryCachedClientSet {
299
299
300
300
if let Some ( existing) = map. get_mut ( & key) {
301
301
existing. last_used = Instant :: now ( ) ;
302
- let client = existing. clone ( ) ;
303
302
tokio:: spawn ( {
304
- let telemetry = client. clone ( ) ;
303
+ let worker = existing . client . lock_or_panic ( ) . worker . clone ( ) ;
305
304
async move {
306
- telemetry
307
- . client
305
+ worker
308
306
. send_msg ( TelemetryActions :: Lifecycle ( LifecycleAction :: Start ) )
309
307
. await
310
308
. ok ( ) ;
311
309
}
312
310
} ) ;
313
311
314
312
info ! ( "Reusing existing telemetry client for {key:?}" ) ;
315
- return client;
313
+ return existing . client . clone ( ) ;
316
314
}
317
315
318
- let client =
319
- TelemetryCachedClient :: new ( service, env, instance_id, runtime_meta, get_config) ;
316
+ let entry = TelemetryCachedEntry {
317
+ last_used : Instant :: now ( ) ,
318
+ client : Arc :: new ( Mutex :: new ( TelemetryCachedClient :: new (
319
+ service,
320
+ env,
321
+ instance_id,
322
+ runtime_meta,
323
+ get_config,
324
+ ) ) ) ,
325
+ } ;
320
326
321
- map. insert ( key. clone ( ) , client . clone ( ) ) ;
327
+ let entry = map. entry ( key. clone ( ) ) . or_insert ( entry ) ;
322
328
323
329
tokio:: spawn ( {
324
- let telemetry = client. clone ( ) ;
330
+ let worker = entry . client . lock_or_panic ( ) . worker . clone ( ) ;
325
331
async move {
326
- telemetry
327
- . client
332
+ worker
328
333
. send_msg ( TelemetryActions :: Lifecycle ( LifecycleAction :: Start ) )
329
334
. await
330
335
. ok ( ) ;
@@ -333,7 +338,7 @@ impl TelemetryCachedClientSet {
333
338
334
339
info ! ( "Created new telemetry client for {key:?}" ) ;
335
340
336
- client
341
+ entry . client . clone ( )
337
342
}
338
343
339
344
pub fn remove_telemetry_client ( & self , service : & str , env : & str ) {
@@ -391,10 +396,11 @@ pub(crate) async fn telemetry_action_receiver_task(sidecar: SidecarServer) {
391
396
& actions. service_name ,
392
397
& actions. env_name ,
393
398
) ;
399
+ let client = telemetry_client. lock_or_panic ( ) . worker . clone ( ) ;
394
400
395
401
for action in actions. actions {
396
402
let action_str = format ! ( "{action:?}" ) ;
397
- match telemetry_client . client . send_msg ( action) . await {
403
+ match client. send_msg ( action) . await {
398
404
Ok ( _) => {
399
405
debug ! ( "Sent telemetry action to TelemetryWorker: {action_str}" ) ;
400
406
}
@@ -412,7 +418,7 @@ fn get_telemetry_client(
412
418
instance_id : & InstanceId ,
413
419
service_name : & str ,
414
420
env_name : & str ,
415
- ) -> TelemetryCachedClient {
421
+ ) -> Arc < Mutex < TelemetryCachedClient > > {
416
422
let session = sidecar. get_session ( & instance_id. session_id ) ;
417
423
let trace_config = session. get_trace_config ( ) ;
418
424
let runtime_meta = RuntimeMetadata :: new (
0 commit comments