@@ -103,10 +103,10 @@ where
103103 }
104104
105105 /// Create a [PeriodicReader] with the given config.
106- pub fn build ( self ) -> PeriodicReader {
106+ pub fn build ( self ) -> PeriodicReader < E > {
107107 let ( message_sender, message_receiver) = mpsc:: channel ( 256 ) ;
108108
109- let worker = move |reader : & PeriodicReader | {
109+ let worker = move |reader : & PeriodicReader < E > | {
110110 let runtime = self . runtime . clone ( ) ;
111111 let reader = reader. clone ( ) ;
112112 self . runtime . spawn ( Box :: pin ( async move {
@@ -184,33 +184,40 @@ where
184184/// # drop(reader);
185185/// # }
186186/// ```
187- #[ derive( Clone ) ]
188- pub struct PeriodicReader {
189- exporter : Arc < dyn PushMetricExporter > ,
190- inner : Arc < Mutex < PeriodicReaderInner > > ,
187+ pub struct PeriodicReader < E : PushMetricExporter > {
188+ exporter : Arc < E > ,
189+ inner : Arc < Mutex < PeriodicReaderInner < E > > > ,
191190}
192191
193- impl PeriodicReader {
192+ impl < E : PushMetricExporter > Clone for PeriodicReader < E > {
193+ fn clone ( & self ) -> Self {
194+ Self {
195+ exporter : Arc :: clone ( & self . exporter ) ,
196+ inner : Arc :: clone ( & self . inner ) ,
197+ }
198+ }
199+ }
200+
201+ impl < E : PushMetricExporter > PeriodicReader < E > {
194202 /// Configuration options for a periodic reader
195- pub fn builder < E , RT > ( exporter : E , runtime : RT ) -> PeriodicReaderBuilder < E , RT >
203+ pub fn builder < RT > ( exporter : E , runtime : RT ) -> PeriodicReaderBuilder < E , RT >
196204 where
197- E : PushMetricExporter ,
198205 RT : Runtime ,
199206 {
200207 PeriodicReaderBuilder :: new ( exporter, runtime)
201208 }
202209}
203210
204- impl fmt:: Debug for PeriodicReader {
211+ impl < E : PushMetricExporter > fmt:: Debug for PeriodicReader < E > {
205212 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
206213 f. debug_struct ( "PeriodicReader" ) . finish ( )
207214 }
208215}
209216
210- struct PeriodicReaderInner {
217+ struct PeriodicReaderInner < E : PushMetricExporter > {
211218 message_sender : mpsc:: Sender < Message > ,
212219 is_shutdown : bool ,
213- sdk_producer_or_worker : ProducerOrWorker ,
220+ sdk_producer_or_worker : ProducerOrWorker < E > ,
214221}
215222
216223#[ derive( Debug ) ]
@@ -220,19 +227,20 @@ enum Message {
220227 Shutdown ( oneshot:: Sender < OTelSdkResult > ) ,
221228}
222229
223- enum ProducerOrWorker {
230+ enum ProducerOrWorker < E : PushMetricExporter > {
224231 Producer ( Weak < dyn SdkProducer > ) ,
225- Worker ( Box < dyn FnOnce ( & PeriodicReader ) + Send + Sync > ) ,
232+ #[ allow( clippy:: type_complexity) ]
233+ Worker ( Box < dyn FnOnce ( & PeriodicReader < E > ) + Send + Sync > ) ,
226234}
227235
228- struct PeriodicReaderWorker < RT : Runtime > {
229- reader : PeriodicReader ,
236+ struct PeriodicReaderWorker < E : PushMetricExporter , RT : Runtime > {
237+ reader : PeriodicReader < E > ,
230238 timeout : Duration ,
231239 runtime : RT ,
232240 rm : ResourceMetrics ,
233241}
234242
235- impl < RT : Runtime > PeriodicReaderWorker < RT > {
243+ impl < E : PushMetricExporter , RT : Runtime > PeriodicReaderWorker < E , RT > {
236244 async fn collect_and_export ( & mut self ) -> OTelSdkResult {
237245 self . reader
238246 . collect ( & mut self . rm )
@@ -323,7 +331,7 @@ impl<RT: Runtime> PeriodicReaderWorker<RT> {
323331 }
324332}
325333
326- impl MetricReader for PeriodicReader {
334+ impl < E : PushMetricExporter > MetricReader for PeriodicReader < E > {
327335 fn register_pipeline ( & self , pipeline : Weak < Pipeline > ) {
328336 let mut inner = match self . inner . lock ( ) {
329337 Ok ( guard) => guard,
0 commit comments