Skip to content

Commit af3c389

Browse files
authored
[sdk-metrics] Expose Exemplars stable (#5607)
1 parent 9d12b36 commit af3c389

File tree

15 files changed

+53
-157
lines changed

15 files changed

+53
-157
lines changed

OpenTelemetry.sln

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "experimental-apis", "experi
309309
ProjectSection(SolutionItems) = preProject
310310
docs\diagnostics\experimental-apis\OTEL1000.md = docs\diagnostics\experimental-apis\OTEL1000.md
311311
docs\diagnostics\experimental-apis\OTEL1001.md = docs\diagnostics\experimental-apis\OTEL1001.md
312-
docs\diagnostics\experimental-apis\OTEL1002.md = docs\diagnostics\experimental-apis\OTEL1002.md
313312
docs\diagnostics\experimental-apis\OTEL1003.md = docs\diagnostics\experimental-apis\OTEL1003.md
314313
docs\diagnostics\experimental-apis\OTEL1004.md = docs\diagnostics\experimental-apis\OTEL1004.md
315314
docs\diagnostics\experimental-apis\README.md = docs\diagnostics\experimental-apis\README.md

docs/diagnostics/experimental-apis/OTEL1002.md

Lines changed: 0 additions & 30 deletions
This file was deleted.

docs/diagnostics/experimental-apis/README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,6 @@ Description: Logs Bridge API
2727

2828
Details: [OTEL1001](./OTEL1001.md)
2929

30-
### OTEL1002
31-
32-
Description: Metrics Exemplar Support
33-
34-
Details: [OTEL1002](./OTEL1002.md)
35-
3630
### OTEL1003
3731

3832
Description: MetricStreamConfiguration CardinalityLimit Support
@@ -57,4 +51,10 @@ Experimental APIs which have been released stable or removed:
5751
removed add details for alternative solution or reasoning.
5852
-->
5953

60-
None
54+
### OTEL1002
55+
56+
Description: Metrics Exemplar Support
57+
58+
Details: [OTEL1002](https://github.com/open-telemetry/opentelemetry-dotnet/blob/b8ea807bae1a5d9b0f3d6d23b1e1e10f5e096a25/docs/diagnostics/experimental-apis/OTEL1002.md)
59+
60+
Released stable: `1.9.0`

src/OpenTelemetry/.publicApi/Experimental/PublicAPI.Unshipped.txt

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,6 @@ OpenTelemetry.Logs.LogRecord.Severity.get -> OpenTelemetry.Logs.LogRecordSeverit
88
OpenTelemetry.Logs.LogRecord.Severity.set -> void
99
OpenTelemetry.Logs.LogRecord.SeverityText.get -> string?
1010
OpenTelemetry.Logs.LogRecord.SeverityText.set -> void
11-
OpenTelemetry.Metrics.Exemplar
12-
OpenTelemetry.Metrics.Exemplar.DoubleValue.get -> double
13-
OpenTelemetry.Metrics.Exemplar.Exemplar() -> void
14-
OpenTelemetry.Metrics.Exemplar.FilteredTags.get -> OpenTelemetry.ReadOnlyFilteredTagCollection
15-
OpenTelemetry.Metrics.Exemplar.LongValue.get -> long
16-
OpenTelemetry.Metrics.Exemplar.SpanId.get -> System.Diagnostics.ActivitySpanId
17-
OpenTelemetry.Metrics.Exemplar.Timestamp.get -> System.DateTimeOffset
18-
OpenTelemetry.Metrics.Exemplar.TraceId.get -> System.Diagnostics.ActivityTraceId
19-
OpenTelemetry.Metrics.ExemplarFilterType
20-
OpenTelemetry.Metrics.ExemplarFilterType.AlwaysOff = 0 -> OpenTelemetry.Metrics.ExemplarFilterType
21-
OpenTelemetry.Metrics.ExemplarFilterType.AlwaysOn = 1 -> OpenTelemetry.Metrics.ExemplarFilterType
22-
OpenTelemetry.Metrics.ExemplarFilterType.TraceBased = 2 -> OpenTelemetry.Metrics.ExemplarFilterType
2311
OpenTelemetry.Metrics.ExemplarMeasurement<T>
2412
OpenTelemetry.Metrics.ExemplarMeasurement<T>.ExemplarMeasurement() -> void
2513
OpenTelemetry.Metrics.ExemplarMeasurement<T>.Tags.get -> System.ReadOnlySpan<System.Collections.Generic.KeyValuePair<string!, object?>>
@@ -31,25 +19,10 @@ OpenTelemetry.Metrics.FixedSizeExemplarReservoir.Capacity.get -> int
3119
OpenTelemetry.Metrics.FixedSizeExemplarReservoir.FixedSizeExemplarReservoir(int capacity) -> void
3220
OpenTelemetry.Metrics.FixedSizeExemplarReservoir.UpdateExemplar(int exemplarIndex, in OpenTelemetry.Metrics.ExemplarMeasurement<double> measurement) -> void
3321
OpenTelemetry.Metrics.FixedSizeExemplarReservoir.UpdateExemplar(int exemplarIndex, in OpenTelemetry.Metrics.ExemplarMeasurement<long> measurement) -> void
34-
OpenTelemetry.Metrics.MetricPoint.TryGetExemplars(out OpenTelemetry.Metrics.ReadOnlyExemplarCollection exemplars) -> bool
3522
OpenTelemetry.Metrics.MetricStreamConfiguration.CardinalityLimit.get -> int?
3623
OpenTelemetry.Metrics.MetricStreamConfiguration.CardinalityLimit.set -> void
3724
OpenTelemetry.Metrics.MetricStreamConfiguration.ExemplarReservoirFactory.get -> System.Func<OpenTelemetry.Metrics.ExemplarReservoir?>?
3825
OpenTelemetry.Metrics.MetricStreamConfiguration.ExemplarReservoirFactory.set -> void
39-
OpenTelemetry.Metrics.ReadOnlyExemplarCollection
40-
OpenTelemetry.Metrics.ReadOnlyExemplarCollection.Enumerator
41-
OpenTelemetry.Metrics.ReadOnlyExemplarCollection.Enumerator.Current.get -> OpenTelemetry.Metrics.Exemplar
42-
OpenTelemetry.Metrics.ReadOnlyExemplarCollection.Enumerator.Enumerator() -> void
43-
OpenTelemetry.Metrics.ReadOnlyExemplarCollection.Enumerator.MoveNext() -> bool
44-
OpenTelemetry.Metrics.ReadOnlyExemplarCollection.GetEnumerator() -> OpenTelemetry.Metrics.ReadOnlyExemplarCollection.Enumerator
45-
OpenTelemetry.Metrics.ReadOnlyExemplarCollection.ReadOnlyExemplarCollection() -> void
46-
OpenTelemetry.ReadOnlyFilteredTagCollection
47-
OpenTelemetry.ReadOnlyFilteredTagCollection.Enumerator
48-
OpenTelemetry.ReadOnlyFilteredTagCollection.Enumerator.Current.get -> System.Collections.Generic.KeyValuePair<string!, object?>
49-
OpenTelemetry.ReadOnlyFilteredTagCollection.Enumerator.Enumerator() -> void
50-
OpenTelemetry.ReadOnlyFilteredTagCollection.Enumerator.MoveNext() -> bool
51-
OpenTelemetry.ReadOnlyFilteredTagCollection.GetEnumerator() -> OpenTelemetry.ReadOnlyFilteredTagCollection.Enumerator
52-
OpenTelemetry.ReadOnlyFilteredTagCollection.ReadOnlyFilteredTagCollection() -> void
5326
override sealed OpenTelemetry.Metrics.FixedSizeExemplarReservoir.Collect() -> OpenTelemetry.Metrics.ReadOnlyExemplarCollection
5427
static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, OpenTelemetry.BaseProcessor<OpenTelemetry.Logs.LogRecord!>! processor) -> OpenTelemetry.Logs.LoggerProviderBuilder!
5528
static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, System.Func<System.IServiceProvider!, OpenTelemetry.BaseProcessor<OpenTelemetry.Logs.LogRecord!>!>! implementationFactory) -> OpenTelemetry.Logs.LoggerProviderBuilder!
@@ -60,7 +33,6 @@ static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.SetResourceBuilder(thi
6033
static OpenTelemetry.Logs.LoggerProviderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProvider! provider, OpenTelemetry.BaseProcessor<OpenTelemetry.Logs.LogRecord!>! processor) -> OpenTelemetry.Logs.LoggerProvider!
6134
static OpenTelemetry.Logs.LoggerProviderExtensions.ForceFlush(this OpenTelemetry.Logs.LoggerProvider! provider, int timeoutMilliseconds = -1) -> bool
6235
static OpenTelemetry.Logs.LoggerProviderExtensions.Shutdown(this OpenTelemetry.Logs.LoggerProvider! provider, int timeoutMilliseconds = -1) -> bool
63-
static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.SetExemplarFilter(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, OpenTelemetry.Metrics.ExemplarFilterType exemplarFilter) -> OpenTelemetry.Metrics.MeterProviderBuilder!
6436
static OpenTelemetry.OpenTelemetryBuilderSdkExtensions.WithLogging(this OpenTelemetry.IOpenTelemetryBuilder! builder) -> OpenTelemetry.IOpenTelemetryBuilder!
6537
static OpenTelemetry.OpenTelemetryBuilderSdkExtensions.WithLogging(this OpenTelemetry.IOpenTelemetryBuilder! builder, System.Action<OpenTelemetry.Logs.LoggerProviderBuilder!>! configure) -> OpenTelemetry.IOpenTelemetryBuilder!
6638
static OpenTelemetry.OpenTelemetryBuilderSdkExtensions.WithLogging(this OpenTelemetry.IOpenTelemetryBuilder! builder, System.Action<OpenTelemetry.Logs.LoggerProviderBuilder!>? configureBuilder, System.Action<OpenTelemetry.Logs.OpenTelemetryLoggerOptions!>? configureOptions) -> OpenTelemetry.IOpenTelemetryBuilder!
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
OpenTelemetry.Metrics.Exemplar
2+
OpenTelemetry.Metrics.Exemplar.DoubleValue.get -> double
3+
OpenTelemetry.Metrics.Exemplar.Exemplar() -> void
4+
OpenTelemetry.Metrics.Exemplar.FilteredTags.get -> OpenTelemetry.ReadOnlyFilteredTagCollection
5+
OpenTelemetry.Metrics.Exemplar.LongValue.get -> long
6+
OpenTelemetry.Metrics.Exemplar.SpanId.get -> System.Diagnostics.ActivitySpanId
7+
OpenTelemetry.Metrics.Exemplar.Timestamp.get -> System.DateTimeOffset
8+
OpenTelemetry.Metrics.Exemplar.TraceId.get -> System.Diagnostics.ActivityTraceId
9+
OpenTelemetry.Metrics.ExemplarFilterType
10+
OpenTelemetry.Metrics.ExemplarFilterType.AlwaysOff = 0 -> OpenTelemetry.Metrics.ExemplarFilterType
11+
OpenTelemetry.Metrics.ExemplarFilterType.AlwaysOn = 1 -> OpenTelemetry.Metrics.ExemplarFilterType
12+
OpenTelemetry.Metrics.ExemplarFilterType.TraceBased = 2 -> OpenTelemetry.Metrics.ExemplarFilterType
13+
OpenTelemetry.Metrics.MetricPoint.TryGetExemplars(out OpenTelemetry.Metrics.ReadOnlyExemplarCollection exemplars) -> bool
14+
OpenTelemetry.Metrics.ReadOnlyExemplarCollection
15+
OpenTelemetry.Metrics.ReadOnlyExemplarCollection.Enumerator
16+
OpenTelemetry.Metrics.ReadOnlyExemplarCollection.Enumerator.Current.get -> OpenTelemetry.Metrics.Exemplar
17+
OpenTelemetry.Metrics.ReadOnlyExemplarCollection.Enumerator.Enumerator() -> void
18+
OpenTelemetry.Metrics.ReadOnlyExemplarCollection.Enumerator.MoveNext() -> bool
19+
OpenTelemetry.Metrics.ReadOnlyExemplarCollection.GetEnumerator() -> OpenTelemetry.Metrics.ReadOnlyExemplarCollection.Enumerator
20+
OpenTelemetry.Metrics.ReadOnlyExemplarCollection.ReadOnlyExemplarCollection() -> void
21+
OpenTelemetry.ReadOnlyFilteredTagCollection
22+
OpenTelemetry.ReadOnlyFilteredTagCollection.Enumerator
23+
OpenTelemetry.ReadOnlyFilteredTagCollection.Enumerator.Current.get -> System.Collections.Generic.KeyValuePair<string!, object?>
24+
OpenTelemetry.ReadOnlyFilteredTagCollection.Enumerator.Enumerator() -> void
25+
OpenTelemetry.ReadOnlyFilteredTagCollection.Enumerator.MoveNext() -> bool
26+
OpenTelemetry.ReadOnlyFilteredTagCollection.GetEnumerator() -> OpenTelemetry.ReadOnlyFilteredTagCollection.Enumerator
27+
OpenTelemetry.ReadOnlyFilteredTagCollection.ReadOnlyFilteredTagCollection() -> void
28+
static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.SetExemplarFilter(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, OpenTelemetry.Metrics.ExemplarFilterType exemplarFilter) -> OpenTelemetry.Metrics.MeterProviderBuilder!

src/OpenTelemetry/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@
1818
`ExemplarReservoirFactory` property on the View API.
1919
([#5558](https://github.com/open-telemetry/opentelemetry-dotnet/pull/5558))
2020

21+
* The experimental APIs previously covered by `OTEL1002` (`Exemplar`,
22+
`ExemplarFilterType`, `MeterProviderBuilder.SetExemplarFilter`,
23+
`ReadOnlyExemplarCollection`, `ReadOnlyFilteredTagCollection`, &
24+
`MetricPoint.TryGetExemplars`) will now be part of the public API and
25+
supported in stable builds.
26+
([#5607](https://github.com/open-telemetry/opentelemetry-dotnet/pull/5607))
27+
2128
## 1.8.1
2229

2330
Released 2024-Apr-17

src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderExtensions.cs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -317,13 +317,10 @@ public static MeterProvider Build(this MeterProviderBuilder meterProviderBuilder
317317
throw new NotSupportedException($"Build is not supported on '{meterProviderBuilder?.GetType().FullName ?? "null"}' instances.");
318318
}
319319

320-
#if EXPOSE_EXPERIMENTAL_FEATURES
321320
/// <summary>
322321
/// Sets the default <see cref="ExemplarFilterType"/> for the provider.
323322
/// </summary>
324323
/// <remarks>
325-
/// <inheritdoc cref="Exemplar"
326-
/// path="/remarks/para[@experimental-warning='true']"/>
327324
/// <para>Notes:
328325
/// <list type="bullet">
329326
/// <item>The configured <see cref="ExemplarFilterType"/> controls how
@@ -353,14 +350,7 @@ public static MeterProvider Build(this MeterProviderBuilder meterProviderBuilder
353350
/// use.</param>
354351
/// <returns>The supplied <see cref="MeterProviderBuilder"/> for
355352
/// chaining.</returns>
356-
#if NET8_0_OR_GREATER
357-
[Experimental(DiagnosticDefinitions.ExemplarExperimentalApi, UrlFormat = DiagnosticDefinitions.ExperimentalApiUrlFormat)]
358-
#endif
359-
public
360-
#else
361-
internal
362-
#endif
363-
static MeterProviderBuilder SetExemplarFilter(
353+
public static MeterProviderBuilder SetExemplarFilter(
364354
this MeterProviderBuilder meterProviderBuilder,
365355
ExemplarFilterType exemplarFilter)
366356
{

src/OpenTelemetry/Metrics/Exemplar/Exemplar.cs

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,17 @@
55
using System.Collections.Frozen;
66
#endif
77
using System.Diagnostics;
8-
#if EXPOSE_EXPERIMENTAL_FEATURES && NET8_0_OR_GREATER
9-
using System.Diagnostics.CodeAnalysis;
10-
using OpenTelemetry.Internal;
11-
#endif
128

139
namespace OpenTelemetry.Metrics;
1410

15-
#if EXPOSE_EXPERIMENTAL_FEATURES
1611
/// <summary>
1712
/// Exemplar implementation.
1813
/// </summary>
1914
/// <remarks>
20-
/// <para experimental-warning="true"><b>WARNING</b>: This is an experimental API which might change or be removed in the future. Use at your own risk.</para>
2115
/// Specification: <see
2216
/// href="https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/sdk.md#exemplar"/>.
2317
/// </remarks>
24-
#if NET8_0_OR_GREATER
25-
[Experimental(DiagnosticDefinitions.ExemplarExperimentalApi, UrlFormat = DiagnosticDefinitions.ExperimentalApiUrlFormat)]
26-
#endif
27-
public
28-
#else
29-
internal
30-
#endif
31-
struct Exemplar
18+
public struct Exemplar
3219
{
3320
#if NET8_0_OR_GREATER
3421
internal FrozenSet<string>? ViewDefinedTagKeys;

src/OpenTelemetry/Metrics/Exemplar/ExemplarFilterType.cs

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,17 @@
22
// SPDX-License-Identifier: Apache-2.0
33

44
using System.Diagnostics;
5-
#if EXPOSE_EXPERIMENTAL_FEATURES && NET8_0_OR_GREATER
6-
using System.Diagnostics.CodeAnalysis;
7-
using OpenTelemetry.Internal;
8-
#endif
95

106
namespace OpenTelemetry.Metrics;
117

12-
#if EXPOSE_EXPERIMENTAL_FEATURES
138
/// <summary>
149
/// Defines the supported exemplar filters.
1510
/// </summary>
1611
/// <remarks>
17-
/// <inheritdoc cref="Exemplar" path="/remarks/para[@experimental-warning='true']"/>
1812
/// Specification: <see
1913
/// href="https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/sdk.md#exemplarfilter"/>.
2014
/// </remarks>
21-
#if NET8_0_OR_GREATER
22-
[Experimental(DiagnosticDefinitions.ExemplarExperimentalApi, UrlFormat = DiagnosticDefinitions.ExperimentalApiUrlFormat)]
23-
#endif
24-
public
25-
#else
26-
internal
27-
#endif
28-
enum ExemplarFilterType
15+
public enum ExemplarFilterType
2916
{
3017
/// <summary>
3118
/// An exemplar filter which makes no measurements eligible for becoming an

src/OpenTelemetry/Metrics/Exemplar/ReadOnlyExemplarCollection.cs

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,13 @@
22
// SPDX-License-Identifier: Apache-2.0
33

44
using System.Diagnostics;
5-
#if EXPOSE_EXPERIMENTAL_FEATURES && NET8_0_OR_GREATER
6-
using System.Diagnostics.CodeAnalysis;
7-
using OpenTelemetry.Internal;
8-
#endif
95

106
namespace OpenTelemetry.Metrics;
117

12-
#if EXPOSE_EXPERIMENTAL_FEATURES
138
/// <summary>
149
/// A read-only collection of <see cref="Exemplar" />s.
1510
/// </summary>
16-
/// <remarks><inheritdoc cref="Exemplar" path="/remarks/para[@experimental-warning='true']"/></remarks>
17-
#if NET8_0_OR_GREATER
18-
[Experimental(DiagnosticDefinitions.ExemplarExperimentalApi, UrlFormat = DiagnosticDefinitions.ExperimentalApiUrlFormat)]
19-
#endif
20-
public
21-
#else
22-
internal
23-
#endif
24-
readonly struct ReadOnlyExemplarCollection
11+
public readonly struct ReadOnlyExemplarCollection
2512
{
2613
internal static readonly ReadOnlyExemplarCollection Empty = new(Array.Empty<Exemplar>());
2714
private readonly Exemplar[] exemplars;

0 commit comments

Comments
 (0)