@@ -120,99 +120,147 @@ internal static OtlpMetrics.Metric ToOtlpMetric(this IMetric metric)
120120 var otlpMetric = new OtlpMetrics . Metric
121121 {
122122 Name = metric . Name ,
123- Description = metric . Description ,
124- Unit = metric . Unit ,
125123 } ;
126124
127- if ( metric is ISumMetric sumMetric )
125+ if ( metric . Description != null )
128126 {
129- var sum = new OtlpMetrics . Sum
130- {
131- IsMonotonic = sumMetric . IsMonotonic ,
132- AggregationTemporality = sumMetric . IsDeltaTemporality
133- ? OtlpMetrics . AggregationTemporality . Delta
134- : OtlpMetrics . AggregationTemporality . Cumulative ,
135- } ;
136- var dataPoint = metric . ToNumberDataPoint ( sumMetric . Sum , sumMetric . Exemplars ) ;
137- sum . DataPoints . Add ( dataPoint ) ;
138- otlpMetric . Sum = sum ;
127+ otlpMetric . Description = metric . Description ;
139128 }
140- else if ( metric is IGaugeMetric gaugeMetric )
129+
130+ if ( metric . Unit != null )
141131 {
142- var gauge = new OtlpMetrics . Gauge ( ) ;
143- var dataPoint = metric . ToNumberDataPoint ( gaugeMetric . LastValue . Value , gaugeMetric . Exemplars ) ;
144- gauge . DataPoints . Add ( dataPoint ) ;
145- otlpMetric . Gauge = gauge ;
132+ otlpMetric . Unit = metric . Unit ;
146133 }
147- else if ( metric is ISummaryMetric summaryMetric )
148- {
149- var summary = new OtlpMetrics . Summary ( ) ;
150-
151- var dataPoint = new OtlpMetrics . SummaryDataPoint
152- {
153- StartTimeUnixNano = ( ulong ) metric . StartTimeExclusive . ToUnixTimeNanoseconds ( ) ,
154- TimeUnixNano = ( ulong ) metric . EndTimeInclusive . ToUnixTimeNanoseconds ( ) ,
155- Count = ( ulong ) summaryMetric . PopulationCount ,
156- Sum = summaryMetric . PopulationSum ,
157- } ;
158-
159- // TODO: Do TagEnumerationState thing.
160- foreach ( var attribute in metric . Attributes )
161- {
162- dataPoint . Attributes . Add ( attribute . ToOtlpAttribute ( ) ) ;
163- }
164134
165- foreach ( var quantile in summaryMetric . Quantiles )
166- {
167- var quantileValue = new OtlpMetrics . SummaryDataPoint . Types . ValueAtQuantile
168- {
169- Quantile = quantile . Quantile ,
170- Value = quantile . Value ,
171- } ;
172- dataPoint . QuantileValues . Add ( quantileValue ) ;
173- }
174-
175- otlpMetric . Summary = summary ;
176- }
177- else if ( metric is IHistogramMetric histogramMetric )
135+ switch ( metric . MetricType )
178136 {
179- var histogram = new OtlpMetrics . Histogram
180- {
181- AggregationTemporality = histogramMetric . 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
182144 ? OtlpMetrics . AggregationTemporality . Delta
183145 : OtlpMetrics . AggregationTemporality . Cumulative ,
184- } ;
185-
186- var dataPoint = new OtlpMetrics . HistogramDataPoint
187- {
188- StartTimeUnixNano = ( ulong ) metric . StartTimeExclusive . ToUnixTimeNanoseconds ( ) ,
189- TimeUnixNano = ( ulong ) metric . EndTimeInclusive . ToUnixTimeNanoseconds ( ) ,
190- Count = ( ulong ) histogramMetric . PopulationCount ,
191- Sum = histogramMetric . PopulationSum ,
192- } ;
146+ } ;
147+ var dataPoint = metric . ToNumberDataPoint ( sumMetric . LongSum , sumMetric . Exemplars ) ;
148+ sum . DataPoints . Add ( dataPoint ) ;
149+ otlpMetric . Sum = sum ;
150+ break ;
151+ }
193152
194- foreach ( var bucket in histogramMetric . Buckets )
195- {
196- dataPoint . BucketCounts . Add ( ( ulong ) bucket . Count ) ;
153+ case MetricType . DoubleSum :
154+ {
155+ var sumMetric = metric as ISumMetricDouble ;
156+ var sum = new OtlpMetrics . Sum
157+ {
158+ IsMonotonic = sumMetric . IsMonotonic ,
159+ AggregationTemporality = sumMetric . IsDeltaTemporality
160+ ? OtlpMetrics . AggregationTemporality . Delta
161+ : OtlpMetrics . AggregationTemporality . Cumulative ,
162+ } ;
163+ var dataPoint = metric . ToNumberDataPoint ( sumMetric . DoubleSum , sumMetric . Exemplars ) ;
164+ sum . DataPoints . Add ( dataPoint ) ;
165+ otlpMetric . Sum = sum ;
166+ break ;
167+ }
197168
198- // TODO: Verify how to handle the bounds. We've modeled things with
199- // a LowBoundary and HighBoundary. OTLP data model has modeled this
200- // differently: https://github.com/open-telemetry/opentelemetry-proto/blob/bacfe08d84e21fb2a779e302d12e8dfeb67e7b86/opentelemetry/proto/metrics/v1/metrics.proto#L554-L568
201- dataPoint . ExplicitBounds . Add ( bucket . HighBoundary ) ;
202- }
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+ }
203178
204- // TODO: Do TagEnumerationState thing.
205- foreach ( var attribute in metric . Attributes )
206- {
207- dataPoint . Attributes . Add ( attribute . ToOtlpAttribute ( ) ) ;
208- }
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+ }
209188
210- foreach ( var exemplar in histogramMetric . Exemplars )
211- {
212- dataPoint . Exemplars . Add ( exemplar . ToOtlpExemplar ( ) ) ;
213- }
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+ }
214231
215- 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+ }
216264 }
217265
218266 return otlpMetric ;
@@ -238,7 +286,7 @@ private static OtlpMetrics.NumberDataPoint ToNumberDataPoint(this IMetric metric
238286 {
239287 // TODO: Determine how we want to handle exceptions here.
240288 // Do we want to just skip this metric and move on?
241- throw new ArgumentException ( ) ;
289+ throw new ArgumentException ( $ "Value must be a long or a double." , nameof ( value ) ) ;
242290 }
243291
244292 // TODO: Do TagEnumerationState thing.
0 commit comments