@@ -132,95 +132,135 @@ internal static OtlpMetrics.Metric ToOtlpMetric(this IMetric metric)
132132 otlpMetric . Unit = metric . Unit ;
133133 }
134134
135- if ( metric is ISumMetric sumMetric )
135+ switch ( metric . MetricType )
136136 {
137- var sum = new OtlpMetrics . Sum
138- {
139- IsMonotonic = sumMetric . IsMonotonic ,
140- AggregationTemporality = sumMetric . IsDeltaTemporality
137+ case MetricType . LongSum :
138+ {
139+ var sumMetric = metric as ISumMetricLong ;
140+ var sum = new OtlpMetrics . Sum
141+ {
142+ IsMonotonic = sumMetric . IsMonotonic ,
143+ AggregationTemporality = sumMetric . IsDeltaTemporality
141144 ? OtlpMetrics . AggregationTemporality . Delta
142145 : OtlpMetrics . AggregationTemporality . Cumulative ,
143- } ;
144- var dataPoint = metric . ToNumberDataPoint ( sumMetric . Sum . Value , sumMetric . Exemplars ) ;
145- sum . DataPoints . Add ( dataPoint ) ;
146- otlpMetric . Sum = sum ;
147- }
148- else if ( metric is IGaugeMetric gaugeMetric )
149- {
150- var gauge = new OtlpMetrics . Gauge ( ) ;
151- var dataPoint = metric . ToNumberDataPoint ( gaugeMetric . LastValue . Value , gaugeMetric . Exemplars ) ;
152- gauge . DataPoints . Add ( dataPoint ) ;
153- otlpMetric . Gauge = gauge ;
154- }
155- else if ( metric is ISummaryMetric summaryMetric )
156- {
157- var summary = new OtlpMetrics . Summary ( ) ;
158-
159- var dataPoint = new OtlpMetrics . SummaryDataPoint
160- {
161- StartTimeUnixNano = ( ulong ) metric . StartTimeExclusive . ToUnixTimeNanoseconds ( ) ,
162- TimeUnixNano = ( ulong ) metric . EndTimeInclusive . ToUnixTimeNanoseconds ( ) ,
163- Count = ( ulong ) summaryMetric . PopulationCount ,
164- Sum = summaryMetric . PopulationSum ,
165- } ;
166-
167- // TODO: Do TagEnumerationState thing.
168- foreach ( var attribute in metric . Attributes )
169- {
170- dataPoint . Attributes . Add ( attribute . ToOtlpAttribute ( ) ) ;
171- }
146+ } ;
147+ var dataPoint = metric . ToNumberDataPoint ( sumMetric . LongSum , sumMetric . Exemplars ) ;
148+ sum . DataPoints . Add ( dataPoint ) ;
149+ otlpMetric . Sum = sum ;
150+ break ;
151+ }
172152
173- foreach ( var quantile in summaryMetric . Quantiles )
174- {
175- var quantileValue = new OtlpMetrics . SummaryDataPoint . Types . ValueAtQuantile
153+ case MetricType . DoubleSum :
176154 {
177- Quantile = quantile . Quantile ,
178- Value = quantile . Value ,
179- } ;
180- dataPoint . QuantileValues . Add ( quantileValue ) ;
181- }
182-
183- otlpMetric . Summary = summary ;
184- }
185- else if ( metric is IHistogramMetric histogramMetric )
186- {
187- var histogram = new OtlpMetrics . Histogram
188- {
189- AggregationTemporality = histogramMetric . IsDeltaTemporality
155+ var sumMetric = metric as ISumMetricDouble ;
156+ var sum = new OtlpMetrics . Sum
157+ {
158+ IsMonotonic = sumMetric . IsMonotonic ,
159+ AggregationTemporality = sumMetric . IsDeltaTemporality
190160 ? OtlpMetrics . AggregationTemporality . Delta
191161 : OtlpMetrics . AggregationTemporality . Cumulative ,
192- } ;
193-
194- var dataPoint = new OtlpMetrics . HistogramDataPoint
195- {
196- StartTimeUnixNano = ( ulong ) metric . StartTimeExclusive . ToUnixTimeNanoseconds ( ) ,
197- TimeUnixNano = ( ulong ) metric . EndTimeInclusive . ToUnixTimeNanoseconds ( ) ,
198- Count = ( ulong ) histogramMetric . PopulationCount ,
199- Sum = histogramMetric . PopulationSum ,
200- } ;
201-
202- foreach ( var bucket in histogramMetric . Buckets )
203- {
204- dataPoint . BucketCounts . Add ( ( ulong ) bucket . Count ) ;
162+ } ;
163+ var dataPoint = metric . ToNumberDataPoint ( sumMetric . DoubleSum , sumMetric . Exemplars ) ;
164+ sum . DataPoints . Add ( dataPoint ) ;
165+ otlpMetric . Sum = sum ;
166+ break ;
167+ }
205168
206- // TODO: Verify how to handle the bounds. We've modeled things with
207- // a LowBoundary and HighBoundary. OTLP data model has modeled this
208- // differently: https://github.com/open-telemetry/opentelemetry-proto/blob/bacfe08d84e21fb2a779e302d12e8dfeb67e7b86/opentelemetry/proto/metrics/v1/metrics.proto#L554-L568
209- dataPoint . ExplicitBounds . Add ( bucket . HighBoundary ) ;
210- }
169+ case MetricType . LongGauge :
170+ {
171+ var gaugeMetric = metric as IGaugeMetric ;
172+ var gauge = new OtlpMetrics . Gauge ( ) ;
173+ var dataPoint = metric . ToNumberDataPoint ( gaugeMetric . LastValue . Value , gaugeMetric . Exemplars ) ;
174+ gauge . DataPoints . Add ( dataPoint ) ;
175+ otlpMetric . Gauge = gauge ;
176+ break ;
177+ }
211178
212- // TODO: Do TagEnumerationState thing.
213- foreach ( var attribute in metric . Attributes )
214- {
215- dataPoint . Attributes . Add ( attribute . ToOtlpAttribute ( ) ) ;
216- }
179+ case MetricType . DoubleGauge :
180+ {
181+ var gaugeMetric = metric as IGaugeMetric ;
182+ var gauge = new OtlpMetrics . Gauge ( ) ;
183+ var dataPoint = metric . ToNumberDataPoint ( gaugeMetric . LastValue . Value , gaugeMetric . Exemplars ) ;
184+ gauge . DataPoints . Add ( dataPoint ) ;
185+ otlpMetric . Gauge = gauge ;
186+ break ;
187+ }
217188
218- foreach ( var exemplar in histogramMetric . Exemplars )
219- {
220- dataPoint . Exemplars . Add ( exemplar . ToOtlpExemplar ( ) ) ;
221- }
189+ case MetricType . Histogram :
190+ {
191+ var histogramMetric = metric as IHistogramMetric ;
192+ var histogram = new OtlpMetrics . Histogram
193+ {
194+ AggregationTemporality = histogramMetric . IsDeltaTemporality
195+ ? OtlpMetrics . AggregationTemporality . Delta
196+ : OtlpMetrics . AggregationTemporality . Cumulative ,
197+ } ;
198+
199+ var dataPoint = new OtlpMetrics . HistogramDataPoint
200+ {
201+ StartTimeUnixNano = ( ulong ) metric . StartTimeExclusive . ToUnixTimeNanoseconds ( ) ,
202+ TimeUnixNano = ( ulong ) metric . EndTimeInclusive . ToUnixTimeNanoseconds ( ) ,
203+ Count = ( ulong ) histogramMetric . PopulationCount ,
204+ Sum = histogramMetric . PopulationSum ,
205+ } ;
206+
207+ foreach ( var bucket in histogramMetric . Buckets )
208+ {
209+ dataPoint . BucketCounts . Add ( ( ulong ) bucket . Count ) ;
210+
211+ // TODO: Verify how to handle the bounds. We've modeled things with
212+ // a LowBoundary and HighBoundary. OTLP data model has modeled this
213+ // differently: https://github.com/open-telemetry/opentelemetry-proto/blob/bacfe08d84e21fb2a779e302d12e8dfeb67e7b86/opentelemetry/proto/metrics/v1/metrics.proto#L554-L568
214+ dataPoint . ExplicitBounds . Add ( bucket . HighBoundary ) ;
215+ }
216+
217+ // TODO: Do TagEnumerationState thing.
218+ foreach ( var attribute in metric . Attributes )
219+ {
220+ dataPoint . Attributes . Add ( attribute . ToOtlpAttribute ( ) ) ;
221+ }
222+
223+ foreach ( var exemplar in histogramMetric . Exemplars )
224+ {
225+ dataPoint . Exemplars . Add ( exemplar . ToOtlpExemplar ( ) ) ;
226+ }
227+
228+ otlpMetric . Histogram = histogram ;
229+ break ;
230+ }
222231
223- otlpMetric . Histogram = histogram ;
232+ case MetricType . Summary :
233+ {
234+ var summaryMetric = metric as ISummaryMetric ;
235+ var summary = new OtlpMetrics . Summary ( ) ;
236+
237+ var dataPoint = new OtlpMetrics . SummaryDataPoint
238+ {
239+ StartTimeUnixNano = ( ulong ) metric . StartTimeExclusive . ToUnixTimeNanoseconds ( ) ,
240+ TimeUnixNano = ( ulong ) metric . EndTimeInclusive . ToUnixTimeNanoseconds ( ) ,
241+ Count = ( ulong ) summaryMetric . PopulationCount ,
242+ Sum = summaryMetric . PopulationSum ,
243+ } ;
244+
245+ // TODO: Do TagEnumerationState thing.
246+ foreach ( var attribute in metric . Attributes )
247+ {
248+ dataPoint . Attributes . Add ( attribute . ToOtlpAttribute ( ) ) ;
249+ }
250+
251+ foreach ( var quantile in summaryMetric . Quantiles )
252+ {
253+ var quantileValue = new OtlpMetrics . SummaryDataPoint . Types . ValueAtQuantile
254+ {
255+ Quantile = quantile . Quantile ,
256+ Value = quantile . Value ,
257+ } ;
258+ dataPoint . QuantileValues . Add ( quantileValue ) ;
259+ }
260+
261+ otlpMetric . Summary = summary ;
262+ break ;
263+ }
224264 }
225265
226266 return otlpMetric ;
0 commit comments