@@ -84,9 +84,9 @@ impl From<amzn_toolkit_telemetry_client::operation::post_metrics::PostMetricsErr
84
84
}
85
85
}
86
86
87
- impl From < mpsc:: error:: SendError < Event > > for TelemetryError {
88
- fn from ( value : mpsc:: error:: SendError < Event > ) -> Self {
89
- Self :: Send ( Box :: new ( value) )
87
+ impl From < Box < mpsc:: error:: SendError < Event > > > for TelemetryError {
88
+ fn from ( value : Box < mpsc:: error:: SendError < Event > > ) -> Self {
89
+ Self :: Send ( value)
90
90
}
91
91
}
92
92
@@ -125,10 +125,44 @@ impl TelemetryStage {
125
125
}
126
126
}
127
127
128
+ #[ derive( Debug ) ]
129
+ enum TelemetrySender {
130
+ Strong ( mpsc:: UnboundedSender < Event > ) ,
131
+ Weak ( mpsc:: WeakUnboundedSender < Event > ) ,
132
+ }
133
+
134
+ impl TelemetrySender {
135
+ fn send ( & self , ev : Event ) -> Result < ( ) , Box < mpsc:: error:: SendError < Event > > > {
136
+ match self {
137
+ Self :: Strong ( sender) => sender. send ( ev) . map_err ( Box :: new) ,
138
+ Self :: Weak ( sender) => {
139
+ if let Some ( sender) = sender. upgrade ( ) {
140
+ sender. send ( ev) . map_err ( Box :: new)
141
+ } else {
142
+ tracing:: error!(
143
+ "Attempted to send telemetry after telemetry thread has been dropped. Event attempted {:?}" ,
144
+ ev
145
+ ) ;
146
+ Ok ( ( ) )
147
+ }
148
+ } ,
149
+ }
150
+ }
151
+ }
152
+
153
+ impl Clone for TelemetrySender {
154
+ fn clone ( & self ) -> Self {
155
+ match self {
156
+ Self :: Strong ( sender) => Self :: Weak ( sender. downgrade ( ) ) ,
157
+ Self :: Weak ( sender) => Self :: Weak ( sender. clone ( ) ) ,
158
+ }
159
+ }
160
+ }
161
+
128
162
#[ derive( Debug ) ]
129
163
pub struct TelemetryThread {
130
164
handle : Option < JoinHandle < ( ) > > ,
131
- tx : mpsc :: UnboundedSender < Event > ,
165
+ tx : TelemetrySender ,
132
166
}
133
167
134
168
impl Clone for TelemetryThread {
@@ -144,6 +178,7 @@ impl TelemetryThread {
144
178
pub async fn new ( env : & Env , database : & mut Database ) -> Result < Self , TelemetryError > {
145
179
let telemetry_client = TelemetryClient :: new ( env, database) . await ?;
146
180
let ( tx, mut rx) = mpsc:: unbounded_channel ( ) ;
181
+ let tx = TelemetrySender :: Strong ( tx) ;
147
182
let handle = tokio:: spawn ( async move {
148
183
while let Some ( event) = rx. recv ( ) . await {
149
184
trace ! ( "TelemetryThread received new telemetry event: {:?}" , event) ;
0 commit comments