[sdk-metrics] Expose Exemplars stable (#5607)
This commit is contained in:
parent
9d12b36fd5
commit
af3c389c0c
|
|
@ -309,7 +309,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "experimental-apis", "experi
|
||||||
ProjectSection(SolutionItems) = preProject
|
ProjectSection(SolutionItems) = preProject
|
||||||
docs\diagnostics\experimental-apis\OTEL1000.md = docs\diagnostics\experimental-apis\OTEL1000.md
|
docs\diagnostics\experimental-apis\OTEL1000.md = docs\diagnostics\experimental-apis\OTEL1000.md
|
||||||
docs\diagnostics\experimental-apis\OTEL1001.md = docs\diagnostics\experimental-apis\OTEL1001.md
|
docs\diagnostics\experimental-apis\OTEL1001.md = docs\diagnostics\experimental-apis\OTEL1001.md
|
||||||
docs\diagnostics\experimental-apis\OTEL1002.md = docs\diagnostics\experimental-apis\OTEL1002.md
|
|
||||||
docs\diagnostics\experimental-apis\OTEL1003.md = docs\diagnostics\experimental-apis\OTEL1003.md
|
docs\diagnostics\experimental-apis\OTEL1003.md = docs\diagnostics\experimental-apis\OTEL1003.md
|
||||||
docs\diagnostics\experimental-apis\OTEL1004.md = docs\diagnostics\experimental-apis\OTEL1004.md
|
docs\diagnostics\experimental-apis\OTEL1004.md = docs\diagnostics\experimental-apis\OTEL1004.md
|
||||||
docs\diagnostics\experimental-apis\README.md = docs\diagnostics\experimental-apis\README.md
|
docs\diagnostics\experimental-apis\README.md = docs\diagnostics\experimental-apis\README.md
|
||||||
|
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
||||||
# OpenTelemetry .NET Diagnostic: OTEL1002
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
|
|
||||||
This is an Experimental API diagnostic covering the following APIs:
|
|
||||||
|
|
||||||
* `Exemplar`
|
|
||||||
* `ExemplarFilterType`
|
|
||||||
* `MeterProviderBuilder.SetExemplarFilter` extension method
|
|
||||||
* `ReadOnlyExemplarCollection`
|
|
||||||
* `ReadOnlyFilteredTagCollection`
|
|
||||||
* `MetricPoint.TryGetExemplars`
|
|
||||||
|
|
||||||
Experimental APIs may be changed or removed in the future.
|
|
||||||
|
|
||||||
## Details
|
|
||||||
|
|
||||||
The OpenTelemetry Specification defines an [Exemplar
|
|
||||||
API](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/sdk.md#exemplar)
|
|
||||||
in the Metrics SDK.
|
|
||||||
|
|
||||||
From the specification:
|
|
||||||
|
|
||||||
> Exemplars are example data points for aggregated data. They provide specific
|
|
||||||
> context to otherwise general aggregations. Exemplars allow correlation between
|
|
||||||
> aggregated metric data and the original API calls where measurements are
|
|
||||||
> recorded.
|
|
||||||
|
|
||||||
We are exposing these APIs experimentally until the specification declares them
|
|
||||||
stable.
|
|
||||||
|
|
@ -27,12 +27,6 @@ Description: Logs Bridge API
|
||||||
|
|
||||||
Details: [OTEL1001](./OTEL1001.md)
|
Details: [OTEL1001](./OTEL1001.md)
|
||||||
|
|
||||||
### OTEL1002
|
|
||||||
|
|
||||||
Description: Metrics Exemplar Support
|
|
||||||
|
|
||||||
Details: [OTEL1002](./OTEL1002.md)
|
|
||||||
|
|
||||||
### OTEL1003
|
### OTEL1003
|
||||||
|
|
||||||
Description: MetricStreamConfiguration CardinalityLimit Support
|
Description: MetricStreamConfiguration CardinalityLimit Support
|
||||||
|
|
@ -57,4 +51,10 @@ Experimental APIs which have been released stable or removed:
|
||||||
removed add details for alternative solution or reasoning.
|
removed add details for alternative solution or reasoning.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
None
|
### OTEL1002
|
||||||
|
|
||||||
|
Description: Metrics Exemplar Support
|
||||||
|
|
||||||
|
Details: [OTEL1002](https://github.com/open-telemetry/opentelemetry-dotnet/blob/b8ea807bae1a5d9b0f3d6d23b1e1e10f5e096a25/docs/diagnostics/experimental-apis/OTEL1002.md)
|
||||||
|
|
||||||
|
Released stable: `1.9.0`
|
||||||
|
|
|
||||||
|
|
@ -8,18 +8,6 @@ OpenTelemetry.Logs.LogRecord.Severity.get -> OpenTelemetry.Logs.LogRecordSeverit
|
||||||
OpenTelemetry.Logs.LogRecord.Severity.set -> void
|
OpenTelemetry.Logs.LogRecord.Severity.set -> void
|
||||||
OpenTelemetry.Logs.LogRecord.SeverityText.get -> string?
|
OpenTelemetry.Logs.LogRecord.SeverityText.get -> string?
|
||||||
OpenTelemetry.Logs.LogRecord.SeverityText.set -> void
|
OpenTelemetry.Logs.LogRecord.SeverityText.set -> void
|
||||||
OpenTelemetry.Metrics.Exemplar
|
|
||||||
OpenTelemetry.Metrics.Exemplar.DoubleValue.get -> double
|
|
||||||
OpenTelemetry.Metrics.Exemplar.Exemplar() -> void
|
|
||||||
OpenTelemetry.Metrics.Exemplar.FilteredTags.get -> OpenTelemetry.ReadOnlyFilteredTagCollection
|
|
||||||
OpenTelemetry.Metrics.Exemplar.LongValue.get -> long
|
|
||||||
OpenTelemetry.Metrics.Exemplar.SpanId.get -> System.Diagnostics.ActivitySpanId
|
|
||||||
OpenTelemetry.Metrics.Exemplar.Timestamp.get -> System.DateTimeOffset
|
|
||||||
OpenTelemetry.Metrics.Exemplar.TraceId.get -> System.Diagnostics.ActivityTraceId
|
|
||||||
OpenTelemetry.Metrics.ExemplarFilterType
|
|
||||||
OpenTelemetry.Metrics.ExemplarFilterType.AlwaysOff = 0 -> OpenTelemetry.Metrics.ExemplarFilterType
|
|
||||||
OpenTelemetry.Metrics.ExemplarFilterType.AlwaysOn = 1 -> OpenTelemetry.Metrics.ExemplarFilterType
|
|
||||||
OpenTelemetry.Metrics.ExemplarFilterType.TraceBased = 2 -> OpenTelemetry.Metrics.ExemplarFilterType
|
|
||||||
OpenTelemetry.Metrics.ExemplarMeasurement<T>
|
OpenTelemetry.Metrics.ExemplarMeasurement<T>
|
||||||
OpenTelemetry.Metrics.ExemplarMeasurement<T>.ExemplarMeasurement() -> void
|
OpenTelemetry.Metrics.ExemplarMeasurement<T>.ExemplarMeasurement() -> void
|
||||||
OpenTelemetry.Metrics.ExemplarMeasurement<T>.Tags.get -> System.ReadOnlySpan<System.Collections.Generic.KeyValuePair<string!, object?>>
|
OpenTelemetry.Metrics.ExemplarMeasurement<T>.Tags.get -> System.ReadOnlySpan<System.Collections.Generic.KeyValuePair<string!, object?>>
|
||||||
|
|
@ -31,25 +19,10 @@ OpenTelemetry.Metrics.FixedSizeExemplarReservoir.Capacity.get -> int
|
||||||
OpenTelemetry.Metrics.FixedSizeExemplarReservoir.FixedSizeExemplarReservoir(int capacity) -> void
|
OpenTelemetry.Metrics.FixedSizeExemplarReservoir.FixedSizeExemplarReservoir(int capacity) -> void
|
||||||
OpenTelemetry.Metrics.FixedSizeExemplarReservoir.UpdateExemplar(int exemplarIndex, in OpenTelemetry.Metrics.ExemplarMeasurement<double> measurement) -> void
|
OpenTelemetry.Metrics.FixedSizeExemplarReservoir.UpdateExemplar(int exemplarIndex, in OpenTelemetry.Metrics.ExemplarMeasurement<double> measurement) -> void
|
||||||
OpenTelemetry.Metrics.FixedSizeExemplarReservoir.UpdateExemplar(int exemplarIndex, in OpenTelemetry.Metrics.ExemplarMeasurement<long> measurement) -> void
|
OpenTelemetry.Metrics.FixedSizeExemplarReservoir.UpdateExemplar(int exemplarIndex, in OpenTelemetry.Metrics.ExemplarMeasurement<long> measurement) -> void
|
||||||
OpenTelemetry.Metrics.MetricPoint.TryGetExemplars(out OpenTelemetry.Metrics.ReadOnlyExemplarCollection exemplars) -> bool
|
|
||||||
OpenTelemetry.Metrics.MetricStreamConfiguration.CardinalityLimit.get -> int?
|
OpenTelemetry.Metrics.MetricStreamConfiguration.CardinalityLimit.get -> int?
|
||||||
OpenTelemetry.Metrics.MetricStreamConfiguration.CardinalityLimit.set -> void
|
OpenTelemetry.Metrics.MetricStreamConfiguration.CardinalityLimit.set -> void
|
||||||
OpenTelemetry.Metrics.MetricStreamConfiguration.ExemplarReservoirFactory.get -> System.Func<OpenTelemetry.Metrics.ExemplarReservoir?>?
|
OpenTelemetry.Metrics.MetricStreamConfiguration.ExemplarReservoirFactory.get -> System.Func<OpenTelemetry.Metrics.ExemplarReservoir?>?
|
||||||
OpenTelemetry.Metrics.MetricStreamConfiguration.ExemplarReservoirFactory.set -> void
|
OpenTelemetry.Metrics.MetricStreamConfiguration.ExemplarReservoirFactory.set -> void
|
||||||
OpenTelemetry.Metrics.ReadOnlyExemplarCollection
|
|
||||||
OpenTelemetry.Metrics.ReadOnlyExemplarCollection.Enumerator
|
|
||||||
OpenTelemetry.Metrics.ReadOnlyExemplarCollection.Enumerator.Current.get -> OpenTelemetry.Metrics.Exemplar
|
|
||||||
OpenTelemetry.Metrics.ReadOnlyExemplarCollection.Enumerator.Enumerator() -> void
|
|
||||||
OpenTelemetry.Metrics.ReadOnlyExemplarCollection.Enumerator.MoveNext() -> bool
|
|
||||||
OpenTelemetry.Metrics.ReadOnlyExemplarCollection.GetEnumerator() -> OpenTelemetry.Metrics.ReadOnlyExemplarCollection.Enumerator
|
|
||||||
OpenTelemetry.Metrics.ReadOnlyExemplarCollection.ReadOnlyExemplarCollection() -> void
|
|
||||||
OpenTelemetry.ReadOnlyFilteredTagCollection
|
|
||||||
OpenTelemetry.ReadOnlyFilteredTagCollection.Enumerator
|
|
||||||
OpenTelemetry.ReadOnlyFilteredTagCollection.Enumerator.Current.get -> System.Collections.Generic.KeyValuePair<string!, object?>
|
|
||||||
OpenTelemetry.ReadOnlyFilteredTagCollection.Enumerator.Enumerator() -> void
|
|
||||||
OpenTelemetry.ReadOnlyFilteredTagCollection.Enumerator.MoveNext() -> bool
|
|
||||||
OpenTelemetry.ReadOnlyFilteredTagCollection.GetEnumerator() -> OpenTelemetry.ReadOnlyFilteredTagCollection.Enumerator
|
|
||||||
OpenTelemetry.ReadOnlyFilteredTagCollection.ReadOnlyFilteredTagCollection() -> void
|
|
||||||
override sealed OpenTelemetry.Metrics.FixedSizeExemplarReservoir.Collect() -> OpenTelemetry.Metrics.ReadOnlyExemplarCollection
|
override sealed OpenTelemetry.Metrics.FixedSizeExemplarReservoir.Collect() -> OpenTelemetry.Metrics.ReadOnlyExemplarCollection
|
||||||
static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, OpenTelemetry.BaseProcessor<OpenTelemetry.Logs.LogRecord!>! processor) -> OpenTelemetry.Logs.LoggerProviderBuilder!
|
static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, OpenTelemetry.BaseProcessor<OpenTelemetry.Logs.LogRecord!>! processor) -> OpenTelemetry.Logs.LoggerProviderBuilder!
|
||||||
static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, System.Func<System.IServiceProvider!, OpenTelemetry.BaseProcessor<OpenTelemetry.Logs.LogRecord!>!>! implementationFactory) -> OpenTelemetry.Logs.LoggerProviderBuilder!
|
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
|
||||||
static OpenTelemetry.Logs.LoggerProviderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProvider! provider, OpenTelemetry.BaseProcessor<OpenTelemetry.Logs.LogRecord!>! processor) -> OpenTelemetry.Logs.LoggerProvider!
|
static OpenTelemetry.Logs.LoggerProviderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProvider! provider, OpenTelemetry.BaseProcessor<OpenTelemetry.Logs.LogRecord!>! processor) -> OpenTelemetry.Logs.LoggerProvider!
|
||||||
static OpenTelemetry.Logs.LoggerProviderExtensions.ForceFlush(this OpenTelemetry.Logs.LoggerProvider! provider, int timeoutMilliseconds = -1) -> bool
|
static OpenTelemetry.Logs.LoggerProviderExtensions.ForceFlush(this OpenTelemetry.Logs.LoggerProvider! provider, int timeoutMilliseconds = -1) -> bool
|
||||||
static OpenTelemetry.Logs.LoggerProviderExtensions.Shutdown(this OpenTelemetry.Logs.LoggerProvider! provider, int timeoutMilliseconds = -1) -> bool
|
static OpenTelemetry.Logs.LoggerProviderExtensions.Shutdown(this OpenTelemetry.Logs.LoggerProvider! provider, int timeoutMilliseconds = -1) -> bool
|
||||||
static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.SetExemplarFilter(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, OpenTelemetry.Metrics.ExemplarFilterType exemplarFilter) -> OpenTelemetry.Metrics.MeterProviderBuilder!
|
|
||||||
static OpenTelemetry.OpenTelemetryBuilderSdkExtensions.WithLogging(this OpenTelemetry.IOpenTelemetryBuilder! builder) -> OpenTelemetry.IOpenTelemetryBuilder!
|
static OpenTelemetry.OpenTelemetryBuilderSdkExtensions.WithLogging(this OpenTelemetry.IOpenTelemetryBuilder! builder) -> OpenTelemetry.IOpenTelemetryBuilder!
|
||||||
static OpenTelemetry.OpenTelemetryBuilderSdkExtensions.WithLogging(this OpenTelemetry.IOpenTelemetryBuilder! builder, System.Action<OpenTelemetry.Logs.LoggerProviderBuilder!>! configure) -> OpenTelemetry.IOpenTelemetryBuilder!
|
static OpenTelemetry.OpenTelemetryBuilderSdkExtensions.WithLogging(this OpenTelemetry.IOpenTelemetryBuilder! builder, System.Action<OpenTelemetry.Logs.LoggerProviderBuilder!>! configure) -> OpenTelemetry.IOpenTelemetryBuilder!
|
||||||
static OpenTelemetry.OpenTelemetryBuilderSdkExtensions.WithLogging(this OpenTelemetry.IOpenTelemetryBuilder! builder, System.Action<OpenTelemetry.Logs.LoggerProviderBuilder!>? configureBuilder, System.Action<OpenTelemetry.Logs.OpenTelemetryLoggerOptions!>? configureOptions) -> OpenTelemetry.IOpenTelemetryBuilder!
|
static OpenTelemetry.OpenTelemetryBuilderSdkExtensions.WithLogging(this OpenTelemetry.IOpenTelemetryBuilder! builder, System.Action<OpenTelemetry.Logs.LoggerProviderBuilder!>? configureBuilder, System.Action<OpenTelemetry.Logs.OpenTelemetryLoggerOptions!>? configureOptions) -> OpenTelemetry.IOpenTelemetryBuilder!
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
OpenTelemetry.Metrics.Exemplar
|
||||||
|
OpenTelemetry.Metrics.Exemplar.DoubleValue.get -> double
|
||||||
|
OpenTelemetry.Metrics.Exemplar.Exemplar() -> void
|
||||||
|
OpenTelemetry.Metrics.Exemplar.FilteredTags.get -> OpenTelemetry.ReadOnlyFilteredTagCollection
|
||||||
|
OpenTelemetry.Metrics.Exemplar.LongValue.get -> long
|
||||||
|
OpenTelemetry.Metrics.Exemplar.SpanId.get -> System.Diagnostics.ActivitySpanId
|
||||||
|
OpenTelemetry.Metrics.Exemplar.Timestamp.get -> System.DateTimeOffset
|
||||||
|
OpenTelemetry.Metrics.Exemplar.TraceId.get -> System.Diagnostics.ActivityTraceId
|
||||||
|
OpenTelemetry.Metrics.ExemplarFilterType
|
||||||
|
OpenTelemetry.Metrics.ExemplarFilterType.AlwaysOff = 0 -> OpenTelemetry.Metrics.ExemplarFilterType
|
||||||
|
OpenTelemetry.Metrics.ExemplarFilterType.AlwaysOn = 1 -> OpenTelemetry.Metrics.ExemplarFilterType
|
||||||
|
OpenTelemetry.Metrics.ExemplarFilterType.TraceBased = 2 -> OpenTelemetry.Metrics.ExemplarFilterType
|
||||||
|
OpenTelemetry.Metrics.MetricPoint.TryGetExemplars(out OpenTelemetry.Metrics.ReadOnlyExemplarCollection exemplars) -> bool
|
||||||
|
OpenTelemetry.Metrics.ReadOnlyExemplarCollection
|
||||||
|
OpenTelemetry.Metrics.ReadOnlyExemplarCollection.Enumerator
|
||||||
|
OpenTelemetry.Metrics.ReadOnlyExemplarCollection.Enumerator.Current.get -> OpenTelemetry.Metrics.Exemplar
|
||||||
|
OpenTelemetry.Metrics.ReadOnlyExemplarCollection.Enumerator.Enumerator() -> void
|
||||||
|
OpenTelemetry.Metrics.ReadOnlyExemplarCollection.Enumerator.MoveNext() -> bool
|
||||||
|
OpenTelemetry.Metrics.ReadOnlyExemplarCollection.GetEnumerator() -> OpenTelemetry.Metrics.ReadOnlyExemplarCollection.Enumerator
|
||||||
|
OpenTelemetry.Metrics.ReadOnlyExemplarCollection.ReadOnlyExemplarCollection() -> void
|
||||||
|
OpenTelemetry.ReadOnlyFilteredTagCollection
|
||||||
|
OpenTelemetry.ReadOnlyFilteredTagCollection.Enumerator
|
||||||
|
OpenTelemetry.ReadOnlyFilteredTagCollection.Enumerator.Current.get -> System.Collections.Generic.KeyValuePair<string!, object?>
|
||||||
|
OpenTelemetry.ReadOnlyFilteredTagCollection.Enumerator.Enumerator() -> void
|
||||||
|
OpenTelemetry.ReadOnlyFilteredTagCollection.Enumerator.MoveNext() -> bool
|
||||||
|
OpenTelemetry.ReadOnlyFilteredTagCollection.GetEnumerator() -> OpenTelemetry.ReadOnlyFilteredTagCollection.Enumerator
|
||||||
|
OpenTelemetry.ReadOnlyFilteredTagCollection.ReadOnlyFilteredTagCollection() -> void
|
||||||
|
static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.SetExemplarFilter(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, OpenTelemetry.Metrics.ExemplarFilterType exemplarFilter) -> OpenTelemetry.Metrics.MeterProviderBuilder!
|
||||||
|
|
@ -18,6 +18,13 @@
|
||||||
`ExemplarReservoirFactory` property on the View API.
|
`ExemplarReservoirFactory` property on the View API.
|
||||||
([#5558](https://github.com/open-telemetry/opentelemetry-dotnet/pull/5558))
|
([#5558](https://github.com/open-telemetry/opentelemetry-dotnet/pull/5558))
|
||||||
|
|
||||||
|
* The experimental APIs previously covered by `OTEL1002` (`Exemplar`,
|
||||||
|
`ExemplarFilterType`, `MeterProviderBuilder.SetExemplarFilter`,
|
||||||
|
`ReadOnlyExemplarCollection`, `ReadOnlyFilteredTagCollection`, &
|
||||||
|
`MetricPoint.TryGetExemplars`) will now be part of the public API and
|
||||||
|
supported in stable builds.
|
||||||
|
([#5607](https://github.com/open-telemetry/opentelemetry-dotnet/pull/5607))
|
||||||
|
|
||||||
## 1.8.1
|
## 1.8.1
|
||||||
|
|
||||||
Released 2024-Apr-17
|
Released 2024-Apr-17
|
||||||
|
|
|
||||||
|
|
@ -317,13 +317,10 @@ public static class MeterProviderBuilderExtensions
|
||||||
throw new NotSupportedException($"Build is not supported on '{meterProviderBuilder?.GetType().FullName ?? "null"}' instances.");
|
throw new NotSupportedException($"Build is not supported on '{meterProviderBuilder?.GetType().FullName ?? "null"}' instances.");
|
||||||
}
|
}
|
||||||
|
|
||||||
#if EXPOSE_EXPERIMENTAL_FEATURES
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets the default <see cref="ExemplarFilterType"/> for the provider.
|
/// Sets the default <see cref="ExemplarFilterType"/> for the provider.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// <inheritdoc cref="Exemplar"
|
|
||||||
/// path="/remarks/para[@experimental-warning='true']"/>
|
|
||||||
/// <para>Notes:
|
/// <para>Notes:
|
||||||
/// <list type="bullet">
|
/// <list type="bullet">
|
||||||
/// <item>The configured <see cref="ExemplarFilterType"/> controls how
|
/// <item>The configured <see cref="ExemplarFilterType"/> controls how
|
||||||
|
|
@ -353,14 +350,7 @@ public static class MeterProviderBuilderExtensions
|
||||||
/// use.</param>
|
/// use.</param>
|
||||||
/// <returns>The supplied <see cref="MeterProviderBuilder"/> for
|
/// <returns>The supplied <see cref="MeterProviderBuilder"/> for
|
||||||
/// chaining.</returns>
|
/// chaining.</returns>
|
||||||
#if NET8_0_OR_GREATER
|
public static MeterProviderBuilder SetExemplarFilter(
|
||||||
[Experimental(DiagnosticDefinitions.ExemplarExperimentalApi, UrlFormat = DiagnosticDefinitions.ExperimentalApiUrlFormat)]
|
|
||||||
#endif
|
|
||||||
public
|
|
||||||
#else
|
|
||||||
internal
|
|
||||||
#endif
|
|
||||||
static MeterProviderBuilder SetExemplarFilter(
|
|
||||||
this MeterProviderBuilder meterProviderBuilder,
|
this MeterProviderBuilder meterProviderBuilder,
|
||||||
ExemplarFilterType exemplarFilter)
|
ExemplarFilterType exemplarFilter)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -5,30 +5,17 @@
|
||||||
using System.Collections.Frozen;
|
using System.Collections.Frozen;
|
||||||
#endif
|
#endif
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
#if EXPOSE_EXPERIMENTAL_FEATURES && NET8_0_OR_GREATER
|
|
||||||
using System.Diagnostics.CodeAnalysis;
|
|
||||||
using OpenTelemetry.Internal;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace OpenTelemetry.Metrics;
|
namespace OpenTelemetry.Metrics;
|
||||||
|
|
||||||
#if EXPOSE_EXPERIMENTAL_FEATURES
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Exemplar implementation.
|
/// Exemplar implementation.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// <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>
|
|
||||||
/// Specification: <see
|
/// Specification: <see
|
||||||
/// href="https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/sdk.md#exemplar"/>.
|
/// href="https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/sdk.md#exemplar"/>.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
#if NET8_0_OR_GREATER
|
public struct Exemplar
|
||||||
[Experimental(DiagnosticDefinitions.ExemplarExperimentalApi, UrlFormat = DiagnosticDefinitions.ExperimentalApiUrlFormat)]
|
|
||||||
#endif
|
|
||||||
public
|
|
||||||
#else
|
|
||||||
internal
|
|
||||||
#endif
|
|
||||||
struct Exemplar
|
|
||||||
{
|
{
|
||||||
#if NET8_0_OR_GREATER
|
#if NET8_0_OR_GREATER
|
||||||
internal FrozenSet<string>? ViewDefinedTagKeys;
|
internal FrozenSet<string>? ViewDefinedTagKeys;
|
||||||
|
|
|
||||||
|
|
@ -2,30 +2,17 @@
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
#if EXPOSE_EXPERIMENTAL_FEATURES && NET8_0_OR_GREATER
|
|
||||||
using System.Diagnostics.CodeAnalysis;
|
|
||||||
using OpenTelemetry.Internal;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace OpenTelemetry.Metrics;
|
namespace OpenTelemetry.Metrics;
|
||||||
|
|
||||||
#if EXPOSE_EXPERIMENTAL_FEATURES
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Defines the supported exemplar filters.
|
/// Defines the supported exemplar filters.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// <inheritdoc cref="Exemplar" path="/remarks/para[@experimental-warning='true']"/>
|
|
||||||
/// Specification: <see
|
/// Specification: <see
|
||||||
/// href="https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/sdk.md#exemplarfilter"/>.
|
/// href="https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/sdk.md#exemplarfilter"/>.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
#if NET8_0_OR_GREATER
|
public enum ExemplarFilterType
|
||||||
[Experimental(DiagnosticDefinitions.ExemplarExperimentalApi, UrlFormat = DiagnosticDefinitions.ExperimentalApiUrlFormat)]
|
|
||||||
#endif
|
|
||||||
public
|
|
||||||
#else
|
|
||||||
internal
|
|
||||||
#endif
|
|
||||||
enum ExemplarFilterType
|
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// An exemplar filter which makes no measurements eligible for becoming an
|
/// An exemplar filter which makes no measurements eligible for becoming an
|
||||||
|
|
|
||||||
|
|
@ -2,26 +2,13 @@
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
#if EXPOSE_EXPERIMENTAL_FEATURES && NET8_0_OR_GREATER
|
|
||||||
using System.Diagnostics.CodeAnalysis;
|
|
||||||
using OpenTelemetry.Internal;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace OpenTelemetry.Metrics;
|
namespace OpenTelemetry.Metrics;
|
||||||
|
|
||||||
#if EXPOSE_EXPERIMENTAL_FEATURES
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A read-only collection of <see cref="Exemplar" />s.
|
/// A read-only collection of <see cref="Exemplar" />s.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks><inheritdoc cref="Exemplar" path="/remarks/para[@experimental-warning='true']"/></remarks>
|
public readonly struct ReadOnlyExemplarCollection
|
||||||
#if NET8_0_OR_GREATER
|
|
||||||
[Experimental(DiagnosticDefinitions.ExemplarExperimentalApi, UrlFormat = DiagnosticDefinitions.ExperimentalApiUrlFormat)]
|
|
||||||
#endif
|
|
||||||
public
|
|
||||||
#else
|
|
||||||
internal
|
|
||||||
#endif
|
|
||||||
readonly struct ReadOnlyExemplarCollection
|
|
||||||
{
|
{
|
||||||
internal static readonly ReadOnlyExemplarCollection Empty = new(Array.Empty<Exemplar>());
|
internal static readonly ReadOnlyExemplarCollection Empty = new(Array.Empty<Exemplar>());
|
||||||
private readonly Exemplar[] exemplars;
|
private readonly Exemplar[] exemplars;
|
||||||
|
|
|
||||||
|
|
@ -490,7 +490,6 @@ internal sealed class MeterProviderSdk : MeterProvider
|
||||||
OpenTelemetrySdkEventSource.Log.MeterProviderSdkEvent("Reclaim unused metric point feature enabled via configuration.");
|
OpenTelemetrySdkEventSource.Log.MeterProviderSdkEvent("Reclaim unused metric point feature enabled via configuration.");
|
||||||
}
|
}
|
||||||
|
|
||||||
#if EXPOSE_EXPERIMENTAL_FEATURES
|
|
||||||
if (configuration.TryGetStringValue(ExemplarFilterConfigKey, out var configValue))
|
if (configuration.TryGetStringValue(ExemplarFilterConfigKey, out var configValue))
|
||||||
{
|
{
|
||||||
if (this.ExemplarFilter.HasValue)
|
if (this.ExemplarFilter.HasValue)
|
||||||
|
|
@ -523,12 +522,5 @@ internal sealed class MeterProviderSdk : MeterProvider
|
||||||
|
|
||||||
OpenTelemetrySdkEventSource.Log.MeterProviderSdkEvent($"Exemplar filter set to '{exemplarFilter}' from configuration.");
|
OpenTelemetrySdkEventSource.Log.MeterProviderSdkEvent($"Exemplar filter set to '{exemplarFilter}' from configuration.");
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
if (configuration.TryGetStringValue(ExemplarFilterConfigKey, out var configValue))
|
|
||||||
{
|
|
||||||
OpenTelemetrySdkEventSource.Log.MeterProviderSdkEvent(
|
|
||||||
$"Exemplar filter configuration value '{configValue}' has been ignored because exemplars are an experimental feature not available in stable builds.");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,6 @@
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
#if EXPOSE_EXPERIMENTAL_FEATURES && NET8_0_OR_GREATER
|
|
||||||
using System.Diagnostics.CodeAnalysis;
|
|
||||||
#endif
|
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
using OpenTelemetry.Internal;
|
using OpenTelemetry.Internal;
|
||||||
|
|
||||||
|
|
@ -365,23 +362,13 @@ public struct MetricPoint
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if EXPOSE_EXPERIMENTAL_FEATURES
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the exemplars associated with the metric point.
|
/// Gets the exemplars associated with the metric point.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks><inheritdoc cref="Exemplar" path="/remarks/para[@experimental-warning='true']"/></remarks>
|
|
||||||
/// <param name="exemplars"><see cref="ReadOnlyExemplarCollection"/>.</param>
|
/// <param name="exemplars"><see cref="ReadOnlyExemplarCollection"/>.</param>
|
||||||
/// <returns><see langword="true" /> if exemplars exist; <see langword="false" /> otherwise.</returns>
|
/// <returns><see langword="true" /> if exemplars exist; <see langword="false" /> otherwise.</returns>
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
#if NET8_0_OR_GREATER
|
public readonly bool TryGetExemplars(out ReadOnlyExemplarCollection exemplars)
|
||||||
[Experimental(DiagnosticDefinitions.ExemplarExperimentalApi, UrlFormat = DiagnosticDefinitions.ExperimentalApiUrlFormat)]
|
|
||||||
#endif
|
|
||||||
public
|
|
||||||
#else
|
|
||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
||||||
internal
|
|
||||||
#endif
|
|
||||||
readonly bool TryGetExemplars(out ReadOnlyExemplarCollection exemplars)
|
|
||||||
{
|
{
|
||||||
exemplars = this.mpComponents?.Exemplars ?? ReadOnlyExemplarCollection.Empty;
|
exemplars = this.mpComponents?.Exemplars ?? ReadOnlyExemplarCollection.Empty;
|
||||||
return exemplars.MaximumCount > 0;
|
return exemplars.MaximumCount > 0;
|
||||||
|
|
|
||||||
|
|
@ -5,28 +5,16 @@
|
||||||
using System.Collections.Frozen;
|
using System.Collections.Frozen;
|
||||||
#endif
|
#endif
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
#if EXPOSE_EXPERIMENTAL_FEATURES && NET8_0_OR_GREATER
|
|
||||||
using System.Diagnostics.CodeAnalysis;
|
|
||||||
using OpenTelemetry.Internal;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace OpenTelemetry;
|
namespace OpenTelemetry;
|
||||||
|
|
||||||
#if EXPOSE_EXPERIMENTAL_FEATURES
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A read-only collection of tag key/value pairs which returns a filtered
|
/// A read-only collection of tag key/value pairs which returns a filtered
|
||||||
/// subset of tags when enumerated.
|
/// subset of tags when enumerated.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
// Note: Does not implement IReadOnlyCollection<> or IEnumerable<> to
|
// Note: Does not implement IReadOnlyCollection<> or IEnumerable<> to
|
||||||
// prevent accidental boxing.
|
// prevent accidental boxing.
|
||||||
#if NET8_0_OR_GREATER
|
public readonly struct ReadOnlyFilteredTagCollection
|
||||||
[Experimental(DiagnosticDefinitions.ExemplarExperimentalApi, UrlFormat = DiagnosticDefinitions.ExperimentalApiUrlFormat)]
|
|
||||||
#endif
|
|
||||||
public
|
|
||||||
#else
|
|
||||||
internal
|
|
||||||
#endif
|
|
||||||
readonly struct ReadOnlyFilteredTagCollection
|
|
||||||
{
|
{
|
||||||
#if NET8_0_OR_GREATER
|
#if NET8_0_OR_GREATER
|
||||||
private readonly FrozenSet<string>? excludedKeys;
|
private readonly FrozenSet<string>? excludedKeys;
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,10 @@ internal static class DiagnosticDefinitions
|
||||||
|
|
||||||
public const string LoggerProviderExperimentalApi = "OTEL1000";
|
public const string LoggerProviderExperimentalApi = "OTEL1000";
|
||||||
public const string LogsBridgeExperimentalApi = "OTEL1001";
|
public const string LogsBridgeExperimentalApi = "OTEL1001";
|
||||||
public const string ExemplarExperimentalApi = "OTEL1002";
|
|
||||||
public const string CardinalityLimitExperimentalApi = "OTEL1003";
|
public const string CardinalityLimitExperimentalApi = "OTEL1003";
|
||||||
public const string ExemplarReservoirExperimentalApi = "OTEL1004";
|
public const string ExemplarReservoirExperimentalApi = "OTEL1004";
|
||||||
|
|
||||||
|
/* Definitions which have been released stable:
|
||||||
|
public const string ExemplarExperimentalApi = "OTEL1002";
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,9 +15,8 @@ namespace OpenTelemetry.Metrics.Tests;
|
||||||
public class MetricExemplarTests : MetricTestsBase
|
public class MetricExemplarTests : MetricTestsBase
|
||||||
{
|
{
|
||||||
private const int MaxTimeToAllowForFlush = 10000;
|
private const int MaxTimeToAllowForFlush = 10000;
|
||||||
private static readonly Func<bool> IsExemplarApiExposed = () => typeof(ExemplarFilterType).IsVisible;
|
|
||||||
|
|
||||||
[SkipUnlessTrueTheory(typeof(MetricExemplarTests), nameof(IsExemplarApiExposed), "ExemplarFilter config tests skipped for stable builds")]
|
[Theory]
|
||||||
[InlineData(null, null, null)]
|
[InlineData(null, null, null)]
|
||||||
[InlineData(null, "always_off", (int)ExemplarFilterType.AlwaysOff)]
|
[InlineData(null, "always_off", (int)ExemplarFilterType.AlwaysOff)]
|
||||||
[InlineData(null, "ALWays_ON", (int)ExemplarFilterType.AlwaysOn)]
|
[InlineData(null, "ALWays_ON", (int)ExemplarFilterType.AlwaysOn)]
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue