Skip to content

Commit 5e2c8aa

Browse files
authored
Merge branch 'main' into redis-keys
2 parents e534a75 + bd69bd6 commit 5e2c8aa

58 files changed

Lines changed: 1627 additions & 500 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/markdownlint.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ name: markdownlint
33
on:
44
push:
55
branches: [ main, metrics ]
6-
paths-ignore:
6+
paths:
77
- '**.md'
88
pull_request:
99
branches: [ main, metrics ]

docs/metrics/getting-started/Program.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
// limitations under the License.
1515
// </copyright>
1616

17-
using System;
1817
using System.Collections.Generic;
1918
using System.Diagnostics.Metrics;
2019
using System.Threading;

examples/Console/TestPrometheusExporter.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@
1414
// limitations under the License.
1515
// </copyright>
1616

17-
using System;
1817
using System.Collections.Generic;
19-
using System.Diagnostics;
2018
using System.Diagnostics.Metrics;
2119
using System.Threading;
2220
using System.Threading.Tasks;

src/OpenTelemetry.Exporter.Console/ConsoleMetricExporter.cs

Lines changed: 41 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -56,44 +56,53 @@ public override ExportResult Export(in Batch<MetricItem> batch)
5656
var tags = metric.Attributes.ToArray().Select(k => $"{k.Key}={k.Value?.ToString()}");
5757

5858
string valueDisplay = string.Empty;
59-
if (metric is ISumMetric sumMetric)
60-
{
61-
if (sumMetric.Sum.Value is double doubleSum)
62-
{
63-
valueDisplay = ((double)doubleSum).ToString(CultureInfo.InvariantCulture);
64-
}
65-
else if (sumMetric.Sum.Value is long longSum)
66-
{
67-
valueDisplay = ((long)longSum).ToString();
68-
}
69-
}
70-
else if (metric is IGaugeMetric gaugeMetric)
71-
{
72-
if (gaugeMetric.LastValue.Value is double doubleValue)
73-
{
74-
valueDisplay = ((double)doubleValue).ToString();
75-
}
76-
else if (gaugeMetric.LastValue.Value is long longValue)
77-
{
78-
valueDisplay = ((long)longValue).ToString();
79-
}
8059

81-
// Qn: tags again ? gaugeMetric.LastValue.Tags
82-
}
83-
else if (metric is ISummaryMetric summaryMetric)
60+
// Switch would be faster than the if.else ladder
61+
// of try and cast.
62+
switch (metric.MetricType)
8463
{
85-
valueDisplay = string.Format("Sum: {0} Count: {1}", summaryMetric.PopulationSum, summaryMetric.PopulationCount);
64+
case MetricType.LongSum:
65+
{
66+
valueDisplay = (metric as ISumMetricLong).LongSum.ToString(CultureInfo.InvariantCulture);
67+
break;
68+
}
69+
70+
case MetricType.DoubleSum:
71+
{
72+
valueDisplay = (metric as ISumMetricDouble).DoubleSum.ToString(CultureInfo.InvariantCulture);
73+
break;
74+
}
75+
76+
case MetricType.LongGauge:
77+
{
78+
// TODOs
79+
break;
80+
}
81+
82+
case MetricType.DoubleGauge:
83+
{
84+
// TODOs
85+
break;
86+
}
87+
88+
case MetricType.Histogram:
89+
{
90+
var histogramMetric = metric as IHistogramMetric;
91+
valueDisplay = string.Format("Sum: {0} Count: {1}", histogramMetric.PopulationSum, histogramMetric.PopulationCount);
92+
break;
93+
}
94+
95+
case MetricType.Summary:
96+
{
97+
var summaryMetric = metric as ISummaryMetric;
98+
valueDisplay = string.Format("Sum: {0} Count: {1}", summaryMetric.PopulationSum, summaryMetric.PopulationCount);
99+
break;
100+
}
86101
}
87-
else if (metric is IHistogramMetric histogramMetric)
88-
{
89-
valueDisplay = string.Format("Sum: {0} Count: {1}", histogramMetric.PopulationSum, histogramMetric.PopulationCount);
90-
}
91-
92-
var kind = metric.GetType().Name;
93102

94103
string time = $"{metric.StartTimeExclusive.ToLocalTime().ToString("HH:mm:ss.fff")} {metric.EndTimeInclusive.ToLocalTime().ToString("HH:mm:ss.fff")}";
95104

96-
var msg = new StringBuilder($"Export {time} {metric.Name} [{string.Join(";", tags)}] {kind} Value: {valueDisplay}");
105+
var msg = new StringBuilder($"Export {time} {metric.Name} [{string.Join(";", tags)}] {metric.MetricType} Value: {valueDisplay}");
97106

98107
if (!string.IsNullOrEmpty(metric.Description))
99108
{

src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/MetricItemExtensions.cs

Lines changed: 127 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// <copyright file="MetricsService.cs" company="OpenTelemetry Authors">
2+
// Copyright The OpenTelemetry Authors
3+
//
4+
// Licensed under the Apache License, Version 2.0 (the "License");
5+
// you may not use this file except in compliance with the License.
6+
// You may obtain a copy of the License at
7+
//
8+
// http://www.apache.org/licenses/LICENSE-2.0
9+
//
10+
// Unless required by applicable law or agreed to in writing, software
11+
// distributed under the License is distributed on an "AS IS" BASIS,
12+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
// See the License for the specific language governing permissions and
14+
// limitations under the License.
15+
// </copyright>
16+
17+
using System;
18+
using System.Threading;
19+
using Grpc.Core;
20+
21+
namespace Opentelemetry.Proto.Collector.Metrics.V1
22+
{
23+
/// <summary>
24+
/// MetricsService extensions.
25+
/// </summary>
26+
internal static partial class MetricsService
27+
{
28+
/// <summary>Interface for MetricService.</summary>
29+
public interface IMetricsServiceClient
30+
{
31+
/// <summary>
32+
/// For performance reasons, it is recommended to keep this RPC
33+
/// alive for the entire life of the application.
34+
/// </summary>
35+
/// <param name="request">The request to send to the server.</param>
36+
/// <param name="headers">The initial metadata to send with the call. This parameter is optional.</param>
37+
/// <param name="deadline">An optional deadline for the call. The call will be cancelled if deadline is hit.</param>
38+
/// <param name="cancellationToken">An optional token for canceling the call.</param>
39+
/// <returns>The response received from the server.</returns>
40+
ExportMetricsServiceResponse Export(ExportMetricsServiceRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default);
41+
}
42+
43+
/// <summary>
44+
/// MetricServiceClient extensions.
45+
/// </summary>
46+
public partial class MetricsServiceClient : IMetricsServiceClient
47+
{
48+
}
49+
}
50+
}

0 commit comments

Comments
 (0)