@@ -77,19 +77,23 @@ impl From<MetricType> for openmetrics_data_model::MetricType {
7777
7878/// Trait implemented by each metric type, e.g. [`Counter`], to implement its encoding.
7979pub trait EncodeMetric {
80+ type Iterator : Iterator < Item = openmetrics_data_model:: Metric > ;
81+
8082 fn encode (
8183 & self ,
8284 labels : Vec < openmetrics_data_model:: Label > ,
83- ) -> Vec < openmetrics_data_model :: Metric > ;
85+ ) -> Self :: Iterator ;
8486
8587 fn metric_type ( & self ) -> MetricType ;
8688}
8789
88- impl EncodeMetric for Box < dyn EncodeMetric > {
90+ impl < ' a > EncodeMetric for Box < dyn EncodeMetric < Iterator = std:: slice:: Iter < ' a , openmetrics_data_model:: Metric > > > {
91+ type Iterator = std:: slice:: Iter < ' a , openmetrics_data_model:: Metric > ;
92+
8993 fn encode (
9094 & self ,
9195 labels : Vec < openmetrics_data_model:: Label > ,
92- ) -> Vec < openmetrics_data_model :: Metric > {
96+ ) -> Self :: Iterator {
9397 self . deref ( ) . encode ( labels)
9498 }
9599
@@ -102,11 +106,13 @@ pub trait SendEncodeMetric: EncodeMetric + Send {}
102106
103107impl < T : EncodeMetric + Send > SendEncodeMetric for T { }
104108
105- impl EncodeMetric for Box < dyn SendEncodeMetric > {
109+ impl < ' a > EncodeMetric for Box < dyn SendEncodeMetric < Iterator = std:: slice:: Iter < ' a , openmetrics_data_model:: Metric > > > {
110+ type Iterator = std:: slice:: Iter < ' a , openmetrics_data_model:: Metric > ;
111+
106112 fn encode (
107113 & self ,
108114 labels : Vec < openmetrics_data_model:: Label > ,
109- ) -> Vec < openmetrics_data_model :: Metric > {
115+ ) -> Self :: Iterator {
110116 self . deref ( ) . encode ( labels)
111117 }
112118
@@ -183,32 +189,36 @@ where
183189 N : EncodeCounterValue ,
184190 A : counter:: Atomic < N > ,
185191{
192+ type Iterator = std:: slice:: Iter < ' a , openmetrics_data_model:: Metric > ;
193+
186194 fn encode (
187195 & self ,
188196 labels : Vec < openmetrics_data_model:: Label > ,
189- ) -> Vec < openmetrics_data_model :: Metric > {
197+ ) -> Self :: Iterator {
190198 let mut metric = encode_counter_with_maybe_exemplar ( self . get ( ) , None ) ;
191199 metric. labels = labels;
192200
193- vec ! [ metric]
201+ vec ! [ metric] . iter ( )
194202 }
195203
196204 fn metric_type ( & self ) -> MetricType {
197205 Self :: TYPE
198206 }
199207}
200208
201- impl < S , N , A > EncodeMetric for CounterWithExemplar < S , N , A >
209+ impl < ' a , S , N , A > EncodeMetric for CounterWithExemplar < S , N , A >
202210where
203211 S : EncodeLabel ,
204212 N : Clone + EncodeCounterValue ,
205213 A : counter:: Atomic < N > ,
206214 f64 : From < N > ,
207215{
216+ type Iterator = std:: slice:: Iter < ' a , openmetrics_data_model:: Metric > ;
217+
208218 fn encode (
209219 & self ,
210220 labels : Vec < openmetrics_data_model:: Label > ,
211- ) -> Vec < openmetrics_data_model :: Metric > {
221+ ) -> Self :: Iterator {
212222 let ( value, exemplar) = self . get ( ) ;
213223
214224 let exemplar_proto = if let Some ( e) = exemplar. as_ref ( ) {
@@ -220,7 +230,7 @@ where
220230 let mut metric = encode_counter_with_maybe_exemplar ( value. clone ( ) , exemplar_proto) ;
221231 metric. labels = labels;
222232
223- vec ! [ metric]
233+ vec ! [ metric] . iter ( )
224234 }
225235
226236 fn metric_type ( & self ) -> MetricType {
@@ -275,15 +285,17 @@ impl EncodeGaugeValue for f64 {
275285 }
276286}
277287
278- impl < N , A > EncodeMetric for Gauge < N , A >
288+ impl < ' a , N , A > EncodeMetric for Gauge < N , A >
279289where
280290 N : EncodeGaugeValue ,
281291 A : gauge:: Atomic < N > ,
282292{
293+ type Iterator = std:: slice:: Iter < ' a , openmetrics_data_model:: Metric > ;
294+
283295 fn encode (
284296 & self ,
285297 labels : Vec < openmetrics_data_model:: Label > ,
286- ) -> Vec < openmetrics_data_model :: Metric > {
298+ ) -> Self :: Iterator {
287299 let mut metric = openmetrics_data_model:: Metric :: default ( ) ;
288300
289301 metric. metric_points = {
@@ -301,7 +313,7 @@ where
301313 } ;
302314
303315 metric. labels = labels;
304- vec ! [ metric]
316+ vec ! [ metric] . iter ( )
305317 }
306318
307319 fn metric_type ( & self ) -> MetricType {
@@ -312,16 +324,18 @@ where
312324/////////////////////////////////////////////////////////////////////////////////
313325// Family
314326
315- impl < S , M , C > EncodeMetric for Family < S , M , C >
327+ impl < ' a , S , M , C > EncodeMetric for Family < S , M , C >
316328where
317329 S : Clone + std:: hash:: Hash + Eq + EncodeLabel ,
318330 M : EncodeMetric + TypedMetric ,
319331 C : MetricConstructor < M > ,
320332{
333+ type Iterator = std:: slice:: Iter < ' a , openmetrics_data_model:: Metric > ;
334+
321335 fn encode (
322336 & self ,
323337 labels : Vec < openmetrics_data_model:: Label > ,
324- ) -> Vec < openmetrics_data_model :: Metric > {
338+ ) -> Self :: Iterator {
325339 let mut metrics = vec ! [ ] ;
326340
327341 let guard = self . read ( ) ;
@@ -331,7 +345,7 @@ where
331345 metrics. extend ( metric. encode ( label) ) ;
332346 }
333347
334- metrics
348+ metrics. iter ( )
335349 }
336350
337351 fn metric_type ( & self ) -> MetricType {
@@ -342,37 +356,41 @@ where
342356/////////////////////////////////////////////////////////////////////////////////
343357// Histogram
344358
345- impl EncodeMetric for Histogram {
359+ impl < ' a > EncodeMetric for Histogram {
360+ type Iterator = std:: slice:: Iter < ' a , openmetrics_data_model:: Metric > ;
361+
346362 fn encode (
347363 & self ,
348364 labels : Vec < openmetrics_data_model:: Label > ,
349- ) -> Vec < openmetrics_data_model :: Metric > {
365+ ) -> Self :: Iterator {
350366 let ( sum, count, buckets) = self . get ( ) ;
351367 // TODO: Would be better to use never type instead of `()`.
352368 let mut metric = encode_histogram_with_maybe_exemplars :: < ( ) > ( sum, count, & buckets, None ) ;
353369 metric. labels = labels;
354- vec ! [ metric]
370+ vec ! [ metric] . iter ( )
355371 }
356372
357373 fn metric_type ( & self ) -> MetricType {
358374 Self :: TYPE
359375 }
360376}
361377
362- impl < S > EncodeMetric for HistogramWithExemplars < S >
378+ impl < ' a , S > EncodeMetric for HistogramWithExemplars < S >
363379where
364380 S : EncodeLabel ,
365381{
382+ type Iterator = std:: slice:: Iter < ' a , openmetrics_data_model:: Metric > ;
383+
366384 fn encode (
367385 & self ,
368386 labels : Vec < openmetrics_data_model:: Label > ,
369- ) -> Vec < openmetrics_data_model :: Metric > {
387+ ) -> Self :: Iterator {
370388 let inner = self . inner ( ) ;
371389 let ( sum, count, buckets) = inner. histogram . get ( ) ;
372390 let mut metric =
373391 encode_histogram_with_maybe_exemplars ( sum, count, & buckets, Some ( & inner. exemplars ) ) ;
374392 metric. labels = labels;
375- vec ! [ metric]
393+ vec ! [ metric] . iter ( )
376394 }
377395
378396 fn metric_type ( & self ) -> MetricType {
@@ -423,14 +441,16 @@ fn encode_histogram_with_maybe_exemplars<S: EncodeLabel>(
423441/////////////////////////////////////////////////////////////////////////////////
424442// Info
425443
426- impl < S > EncodeMetric for Info < S >
444+ impl < ' a , S > EncodeMetric for Info < S >
427445where
428446 S : EncodeLabel ,
429447{
448+ type Iterator = std:: slice:: Iter < ' a , openmetrics_data_model:: Metric > ;
449+
430450 fn encode (
431451 & self ,
432452 labels : Vec < openmetrics_data_model:: Label > ,
433- ) -> Vec < openmetrics_data_model :: Metric > {
453+ ) -> Self :: Iterator {
434454 let mut metric = openmetrics_data_model:: Metric :: default ( ) ;
435455
436456 metric. metric_points = {
@@ -450,7 +470,7 @@ where
450470 vec ! [ metric_point]
451471 } ;
452472
453- vec ! [ metric]
473+ vec ! [ metric] . iter ( )
454474 }
455475
456476 fn metric_type ( & self ) -> MetricType {
0 commit comments