diff --git a/src/OpenTelemetry.Exporter.Console/CHANGELOG.md b/src/OpenTelemetry.Exporter.Console/CHANGELOG.md index 38203539c..8afc85c75 100644 --- a/src/OpenTelemetry.Exporter.Console/CHANGELOG.md +++ b/src/OpenTelemetry.Exporter.Console/CHANGELOG.md @@ -6,6 +6,10 @@ for instructions to enable exemplars. ([#4553](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4553)) +* Updated to display `Severity` and `SeverityText` text instead of + `ILogger.LogLevel` when exporting `LogRecord` instances. + ([#4568](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4568)) + ## 1.5.0 Released 2023-Jun-05 diff --git a/src/OpenTelemetry.Exporter.Console/ConsoleLogRecordExporter.cs b/src/OpenTelemetry.Exporter.Console/ConsoleLogRecordExporter.cs index 8628f5b2d..0cac9f0ec 100644 --- a/src/OpenTelemetry.Exporter.Console/ConsoleLogRecordExporter.cs +++ b/src/OpenTelemetry.Exporter.Console/ConsoleLogRecordExporter.cs @@ -74,7 +74,15 @@ namespace OpenTelemetry.Exporter this.WriteLine($"{"LogRecord.CategoryName:",-RightPaddingLength}{logRecord.CategoryName}"); } - this.WriteLine($"{"LogRecord.LogLevel:",-RightPaddingLength}{logRecord.LogLevel}"); + if (logRecord.Severity.HasValue) + { + this.WriteLine($"{"LogRecord.Severity:",-RightPaddingLength}{logRecord.Severity}"); + } + + if (logRecord.SeverityText != null) + { + this.WriteLine($"{"LogRecord.SeverityText:",-RightPaddingLength}{logRecord.SeverityText}"); + } if (logRecord.FormattedMessage != null) { diff --git a/src/OpenTelemetry.Exporter.Console/OpenTelemetry.Exporter.Console.csproj b/src/OpenTelemetry.Exporter.Console/OpenTelemetry.Exporter.Console.csproj index 821a6cf65..ada0b71d9 100644 --- a/src/OpenTelemetry.Exporter.Console/OpenTelemetry.Exporter.Console.csproj +++ b/src/OpenTelemetry.Exporter.Console/OpenTelemetry.Exporter.Console.csproj @@ -28,13 +28,11 @@ - diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CHANGELOG.md b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CHANGELOG.md index 1e100c944..ce193fde2 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CHANGELOG.md +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CHANGELOG.md @@ -2,18 +2,21 @@ ## Unreleased -* Merged `OpenTelemetry.Exporter.OpenTelemetryProtocol.Logs` package in to -`OpenTelemetry.Exporter.OpenTelemetryProtocol`. Going Forward, -`OpenTelemetry.Exporter.OpenTelemetryProtocol` will be the only package needed -for all 3 signals (Logs, Metrics and Traces). All the changes made in -[`OpenTelemetry.Exporter.OpenTelemetryProtocol.Logs`](https://github.com/open-telemetry/opentelemetry-dotnet/blob/core-1.5.0/src/OpenTelemetry.Exporter.OpenTelemetryProtocol.Logs/CHANGELOG.md#changelog) -are now included in this package. -([#4556](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4556)) +* Merged `OpenTelemetry.Exporter.OpenTelemetryProtocol.Logs` package into + `OpenTelemetry.Exporter.OpenTelemetryProtocol`. Going Forward, + `OpenTelemetry.Exporter.OpenTelemetryProtocol` will be the only package needed + for all 3 signals (Logs, Metrics, and Traces). All the changes made in + [`OpenTelemetry.Exporter.OpenTelemetryProtocol.Logs`](https://github.com/open-telemetry/opentelemetry-dotnet/blob/core-1.5.0/src/OpenTelemetry.Exporter.OpenTelemetryProtocol.Logs/CHANGELOG.md#changelog) + are now included in this package. + ([#4556](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4556)) * Add back support for Exemplars. See [exemplars](../../docs/metrics/customizing-the-sdk/README.md#exemplars) for instructions to enable exemplars. ([#4553](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4553)) +* Updated to support `Severity` and `SeverityText` when exporting `LogRecord`s. + ([#4568](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4568)) + ## 1.5.0 Released 2023-Jun-05 diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/LogRecordExtensions.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/LogRecordExtensions.cs index 31e28adca..c827a2cd0 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/LogRecordExtensions.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/LogRecordExtensions.cs @@ -16,7 +16,6 @@ using System.Runtime.CompilerServices; using Google.Protobuf; -using Microsoft.Extensions.Logging; using OpenTelemetry.Internal; using OpenTelemetry.Logs; using OpenTelemetry.Trace; @@ -29,11 +28,6 @@ namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation { internal static class LogRecordExtensions { - private static readonly string[] LogLevels = new string[7] - { - "Trace", "Debug", "Information", "Warning", "Error", "Critical", "None", - }; - internal static void AddBatch( this OtlpCollector.ExportLogsServiceRequest request, SdkLimitOptions sdkLimitOptions, @@ -71,10 +65,18 @@ namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation { TimeUnixNano = timestamp, ObservedTimeUnixNano = timestamp, - SeverityNumber = GetSeverityNumber(logRecord.LogLevel), - SeverityText = LogLevels[(int)logRecord.LogLevel], + SeverityNumber = GetSeverityNumber(logRecord.Severity), }; + if (!string.IsNullOrWhiteSpace(logRecord.SeverityText)) + { + otlpLogRecord.SeverityText = logRecord.SeverityText; + } + else if (logRecord.Severity.HasValue) + { + otlpLogRecord.SeverityText = logRecord.Severity.Value.ToShortName(); + } + var attributeValueLengthLimit = sdkLimitOptions.AttributeValueLengthLimit; var attributeCountLimit = sdkLimitOptions.AttributeCountLimit ?? int.MaxValue; @@ -226,35 +228,14 @@ namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation } [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static OtlpLogs.SeverityNumber GetSeverityNumber(LogLevel logLevel) + private static OtlpLogs.SeverityNumber GetSeverityNumber(LogRecordSeverity? severity) { - // Maps the ILogger LogLevel to OpenTelemetry logging level. - // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/data-model.md#appendix-b-severitynumber-example-mappings - // TODO: for improving perf simply do ((int)loglevel * 4) + 1 - // or ((int)logLevel << 2) + 1 - // Current code is just for ease of reading. - switch (logLevel) + if (!severity.HasValue) { - case LogLevel.Trace: - return OtlpLogs.SeverityNumber.Trace; - case LogLevel.Debug: - return OtlpLogs.SeverityNumber.Debug; - case LogLevel.Information: - return OtlpLogs.SeverityNumber.Info; - case LogLevel.Warning: - return OtlpLogs.SeverityNumber.Warn; - case LogLevel.Error: - return OtlpLogs.SeverityNumber.Error; - case LogLevel.Critical: - return OtlpLogs.SeverityNumber.Fatal; - - // TODO: - // we reach default only for LogLevel.None - // but that is filtered out anyway. - // should we throw here then? - default: - return OtlpLogs.SeverityNumber.Debug; + return OtlpLogs.SeverityNumber.Unspecified; } + + return (OtlpLogs.SeverityNumber)(int)severity.Value; } } } diff --git a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt index 1ee917c25..2846b0ff9 100644 --- a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt @@ -1,3 +1,12 @@ +OpenTelemetry.Logs.BatchExportLogRecordProcessorOptions +OpenTelemetry.Logs.BatchExportLogRecordProcessorOptions.BatchExportLogRecordProcessorOptions() -> void +OpenTelemetry.Logs.LoggerProviderBuilderExtensions +OpenTelemetry.Logs.LoggerProviderExtensions +OpenTelemetry.Logs.LogRecord.Logger.get -> OpenTelemetry.Logs.Logger? +OpenTelemetry.Logs.LogRecord.Severity.get -> OpenTelemetry.Logs.LogRecordSeverity? +OpenTelemetry.Logs.LogRecord.Severity.set -> void +OpenTelemetry.Logs.LogRecord.SeverityText.get -> string? +OpenTelemetry.Logs.LogRecord.SeverityText.set -> void OpenTelemetry.Metrics.AlwaysOffExemplarFilter OpenTelemetry.Metrics.AlwaysOffExemplarFilter.AlwaysOffExemplarFilter() -> void OpenTelemetry.Metrics.AlwaysOnExemplarFilter @@ -13,7 +22,17 @@ OpenTelemetry.Metrics.ExemplarFilter.ExemplarFilter() -> void OpenTelemetry.Metrics.MetricPoint.GetExemplars() -> OpenTelemetry.Metrics.Exemplar[]! OpenTelemetry.Metrics.TraceBasedExemplarFilter OpenTelemetry.Metrics.TraceBasedExemplarFilter.TraceBasedExemplarFilter() -> void +static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, OpenTelemetry.BaseProcessor! processor) -> OpenTelemetry.Logs.LoggerProviderBuilder! +static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, System.Func!>! implementationFactory) -> OpenTelemetry.Logs.LoggerProviderBuilder! +static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder) -> OpenTelemetry.Logs.LoggerProviderBuilder! +static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.Build(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder) -> OpenTelemetry.Logs.LoggerProvider! +static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, System.Action! configure) -> OpenTelemetry.Logs.LoggerProviderBuilder! +static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.SetResourceBuilder(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, OpenTelemetry.Resources.ResourceBuilder! resourceBuilder) -> OpenTelemetry.Logs.LoggerProviderBuilder! +static OpenTelemetry.Logs.LoggerProviderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProvider! provider, OpenTelemetry.BaseProcessor! processor) -> OpenTelemetry.Logs.LoggerProvider! +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.Metrics.MeterProviderBuilderExtensions.SetExemplarFilter(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, OpenTelemetry.Metrics.ExemplarFilter! exemplarFilter) -> OpenTelemetry.Metrics.MeterProviderBuilder! +static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.LoggerProviderBuilder! ~abstract OpenTelemetry.Metrics.ExemplarFilter.ShouldSample(double value, System.ReadOnlySpan> tags) -> bool ~abstract OpenTelemetry.Metrics.ExemplarFilter.ShouldSample(long value, System.ReadOnlySpan> tags) -> bool ~OpenTelemetry.Metrics.Exemplar.FilteredTags.get -> System.Collections.Generic.List> diff --git a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt index 1ee917c25..2846b0ff9 100644 --- a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt @@ -1,3 +1,12 @@ +OpenTelemetry.Logs.BatchExportLogRecordProcessorOptions +OpenTelemetry.Logs.BatchExportLogRecordProcessorOptions.BatchExportLogRecordProcessorOptions() -> void +OpenTelemetry.Logs.LoggerProviderBuilderExtensions +OpenTelemetry.Logs.LoggerProviderExtensions +OpenTelemetry.Logs.LogRecord.Logger.get -> OpenTelemetry.Logs.Logger? +OpenTelemetry.Logs.LogRecord.Severity.get -> OpenTelemetry.Logs.LogRecordSeverity? +OpenTelemetry.Logs.LogRecord.Severity.set -> void +OpenTelemetry.Logs.LogRecord.SeverityText.get -> string? +OpenTelemetry.Logs.LogRecord.SeverityText.set -> void OpenTelemetry.Metrics.AlwaysOffExemplarFilter OpenTelemetry.Metrics.AlwaysOffExemplarFilter.AlwaysOffExemplarFilter() -> void OpenTelemetry.Metrics.AlwaysOnExemplarFilter @@ -13,7 +22,17 @@ OpenTelemetry.Metrics.ExemplarFilter.ExemplarFilter() -> void OpenTelemetry.Metrics.MetricPoint.GetExemplars() -> OpenTelemetry.Metrics.Exemplar[]! OpenTelemetry.Metrics.TraceBasedExemplarFilter OpenTelemetry.Metrics.TraceBasedExemplarFilter.TraceBasedExemplarFilter() -> void +static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, OpenTelemetry.BaseProcessor! processor) -> OpenTelemetry.Logs.LoggerProviderBuilder! +static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, System.Func!>! implementationFactory) -> OpenTelemetry.Logs.LoggerProviderBuilder! +static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder) -> OpenTelemetry.Logs.LoggerProviderBuilder! +static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.Build(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder) -> OpenTelemetry.Logs.LoggerProvider! +static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, System.Action! configure) -> OpenTelemetry.Logs.LoggerProviderBuilder! +static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.SetResourceBuilder(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, OpenTelemetry.Resources.ResourceBuilder! resourceBuilder) -> OpenTelemetry.Logs.LoggerProviderBuilder! +static OpenTelemetry.Logs.LoggerProviderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProvider! provider, OpenTelemetry.BaseProcessor! processor) -> OpenTelemetry.Logs.LoggerProvider! +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.Metrics.MeterProviderBuilderExtensions.SetExemplarFilter(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, OpenTelemetry.Metrics.ExemplarFilter! exemplarFilter) -> OpenTelemetry.Metrics.MeterProviderBuilder! +static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.LoggerProviderBuilder! ~abstract OpenTelemetry.Metrics.ExemplarFilter.ShouldSample(double value, System.ReadOnlySpan> tags) -> bool ~abstract OpenTelemetry.Metrics.ExemplarFilter.ShouldSample(long value, System.ReadOnlySpan> tags) -> bool ~OpenTelemetry.Metrics.Exemplar.FilteredTags.get -> System.Collections.Generic.List> diff --git a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index 1ee917c25..2846b0ff9 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -1,3 +1,12 @@ +OpenTelemetry.Logs.BatchExportLogRecordProcessorOptions +OpenTelemetry.Logs.BatchExportLogRecordProcessorOptions.BatchExportLogRecordProcessorOptions() -> void +OpenTelemetry.Logs.LoggerProviderBuilderExtensions +OpenTelemetry.Logs.LoggerProviderExtensions +OpenTelemetry.Logs.LogRecord.Logger.get -> OpenTelemetry.Logs.Logger? +OpenTelemetry.Logs.LogRecord.Severity.get -> OpenTelemetry.Logs.LogRecordSeverity? +OpenTelemetry.Logs.LogRecord.Severity.set -> void +OpenTelemetry.Logs.LogRecord.SeverityText.get -> string? +OpenTelemetry.Logs.LogRecord.SeverityText.set -> void OpenTelemetry.Metrics.AlwaysOffExemplarFilter OpenTelemetry.Metrics.AlwaysOffExemplarFilter.AlwaysOffExemplarFilter() -> void OpenTelemetry.Metrics.AlwaysOnExemplarFilter @@ -13,7 +22,17 @@ OpenTelemetry.Metrics.ExemplarFilter.ExemplarFilter() -> void OpenTelemetry.Metrics.MetricPoint.GetExemplars() -> OpenTelemetry.Metrics.Exemplar[]! OpenTelemetry.Metrics.TraceBasedExemplarFilter OpenTelemetry.Metrics.TraceBasedExemplarFilter.TraceBasedExemplarFilter() -> void +static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, OpenTelemetry.BaseProcessor! processor) -> OpenTelemetry.Logs.LoggerProviderBuilder! +static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, System.Func!>! implementationFactory) -> OpenTelemetry.Logs.LoggerProviderBuilder! +static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder) -> OpenTelemetry.Logs.LoggerProviderBuilder! +static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.Build(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder) -> OpenTelemetry.Logs.LoggerProvider! +static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, System.Action! configure) -> OpenTelemetry.Logs.LoggerProviderBuilder! +static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.SetResourceBuilder(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, OpenTelemetry.Resources.ResourceBuilder! resourceBuilder) -> OpenTelemetry.Logs.LoggerProviderBuilder! +static OpenTelemetry.Logs.LoggerProviderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProvider! provider, OpenTelemetry.BaseProcessor! processor) -> OpenTelemetry.Logs.LoggerProvider! +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.Metrics.MeterProviderBuilderExtensions.SetExemplarFilter(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, OpenTelemetry.Metrics.ExemplarFilter! exemplarFilter) -> OpenTelemetry.Metrics.MeterProviderBuilder! +static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.LoggerProviderBuilder! ~abstract OpenTelemetry.Metrics.ExemplarFilter.ShouldSample(double value, System.ReadOnlySpan> tags) -> bool ~abstract OpenTelemetry.Metrics.ExemplarFilter.ShouldSample(long value, System.ReadOnlySpan> tags) -> bool ~OpenTelemetry.Metrics.Exemplar.FilteredTags.get -> System.Collections.Generic.List> diff --git a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt index 1ee917c25..2846b0ff9 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt @@ -1,3 +1,12 @@ +OpenTelemetry.Logs.BatchExportLogRecordProcessorOptions +OpenTelemetry.Logs.BatchExportLogRecordProcessorOptions.BatchExportLogRecordProcessorOptions() -> void +OpenTelemetry.Logs.LoggerProviderBuilderExtensions +OpenTelemetry.Logs.LoggerProviderExtensions +OpenTelemetry.Logs.LogRecord.Logger.get -> OpenTelemetry.Logs.Logger? +OpenTelemetry.Logs.LogRecord.Severity.get -> OpenTelemetry.Logs.LogRecordSeverity? +OpenTelemetry.Logs.LogRecord.Severity.set -> void +OpenTelemetry.Logs.LogRecord.SeverityText.get -> string? +OpenTelemetry.Logs.LogRecord.SeverityText.set -> void OpenTelemetry.Metrics.AlwaysOffExemplarFilter OpenTelemetry.Metrics.AlwaysOffExemplarFilter.AlwaysOffExemplarFilter() -> void OpenTelemetry.Metrics.AlwaysOnExemplarFilter @@ -13,7 +22,17 @@ OpenTelemetry.Metrics.ExemplarFilter.ExemplarFilter() -> void OpenTelemetry.Metrics.MetricPoint.GetExemplars() -> OpenTelemetry.Metrics.Exemplar[]! OpenTelemetry.Metrics.TraceBasedExemplarFilter OpenTelemetry.Metrics.TraceBasedExemplarFilter.TraceBasedExemplarFilter() -> void +static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, OpenTelemetry.BaseProcessor! processor) -> OpenTelemetry.Logs.LoggerProviderBuilder! +static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, System.Func!>! implementationFactory) -> OpenTelemetry.Logs.LoggerProviderBuilder! +static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder) -> OpenTelemetry.Logs.LoggerProviderBuilder! +static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.Build(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder) -> OpenTelemetry.Logs.LoggerProvider! +static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, System.Action! configure) -> OpenTelemetry.Logs.LoggerProviderBuilder! +static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.SetResourceBuilder(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, OpenTelemetry.Resources.ResourceBuilder! resourceBuilder) -> OpenTelemetry.Logs.LoggerProviderBuilder! +static OpenTelemetry.Logs.LoggerProviderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProvider! provider, OpenTelemetry.BaseProcessor! processor) -> OpenTelemetry.Logs.LoggerProvider! +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.Metrics.MeterProviderBuilderExtensions.SetExemplarFilter(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, OpenTelemetry.Metrics.ExemplarFilter! exemplarFilter) -> OpenTelemetry.Metrics.MeterProviderBuilder! +static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.LoggerProviderBuilder! ~abstract OpenTelemetry.Metrics.ExemplarFilter.ShouldSample(double value, System.ReadOnlySpan> tags) -> bool ~abstract OpenTelemetry.Metrics.ExemplarFilter.ShouldSample(long value, System.ReadOnlySpan> tags) -> bool ~OpenTelemetry.Metrics.Exemplar.FilteredTags.get -> System.Collections.Generic.List> diff --git a/src/OpenTelemetry/AssemblyInfo.cs b/src/OpenTelemetry/AssemblyInfo.cs index 6214d72ad..6b94f59eb 100644 --- a/src/OpenTelemetry/AssemblyInfo.cs +++ b/src/OpenTelemetry/AssemblyInfo.cs @@ -17,7 +17,6 @@ using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("OpenTelemetry.Tests" + AssemblyInfo.PublicKey)] -[assembly: InternalsVisibleTo("OpenTelemetry.Exporter.Console" + AssemblyInfo.PublicKey)] [assembly: InternalsVisibleTo("OpenTelemetry.Exporter.InMemory" + AssemblyInfo.PublicKey)] [assembly: InternalsVisibleTo("OpenTelemetry.Exporter.Prometheus.AspNetCore" + AssemblyInfo.PublicKey)] [assembly: InternalsVisibleTo("OpenTelemetry.Exporter.Prometheus.AspNetCore.Tests" + AssemblyInfo.PublicKey)] diff --git a/src/OpenTelemetry/CHANGELOG.md b/src/OpenTelemetry/CHANGELOG.md index dd86456d0..e5a132178 100644 --- a/src/OpenTelemetry/CHANGELOG.md +++ b/src/OpenTelemetry/CHANGELOG.md @@ -6,6 +6,22 @@ for instructions to enable exemplars. ([#4553](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4553)) +* Added [Logs Bridge + API](https://github.com/open-telemetry/opentelemetry-specification/blob/976432b74c565e8a84af3570e9b82cb95e1d844c/specification/logs/bridge-api.md) + implementation (`Sdk.CreateLoggerProviderBuilder`, etc.). + ([#4433](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4433)) + +* Obsoleted `LogRecord.LogLevel` in favor of the `LogRecord.Severity` property + which matches the [OpenTelemetry Specification > Logs DataModel > Severity + definition](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/data-model.md#field-severitynumber). + ([#4433](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4433)) + +* Added `LogRecord.Logger` property to access the [OpenTelemetry Specification > + Instrumentation + Scope](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/glossary.md#instrumentation-scope) + provided during Logger creation. + ([#4433](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4433)) + ## 1.5.0 Released 2023-Jun-05 diff --git a/src/OpenTelemetry/Logs/BatchExportLogRecordProcessorOptions.cs b/src/OpenTelemetry/Logs/BatchExportLogRecordProcessorOptions.cs index 0f854e520..74441551f 100644 --- a/src/OpenTelemetry/Logs/BatchExportLogRecordProcessorOptions.cs +++ b/src/OpenTelemetry/Logs/BatchExportLogRecordProcessorOptions.cs @@ -27,7 +27,7 @@ namespace OpenTelemetry.Logs; /// OTEL_BLRP_SCHEDULE_DELAY environment variables are parsed during object /// construction. /// -internal class BatchExportLogRecordProcessorOptions : BatchExportProcessorOptions +public class BatchExportLogRecordProcessorOptions : BatchExportProcessorOptions { internal const string MaxQueueSizeEnvVarKey = "OTEL_BLRP_MAX_QUEUE_SIZE"; diff --git a/src/OpenTelemetry/Logs/Builder/LoggerProviderBuilderExtensions.cs b/src/OpenTelemetry/Logs/Builder/LoggerProviderBuilderExtensions.cs index 749979eb2..d73d63336 100644 --- a/src/OpenTelemetry/Logs/Builder/LoggerProviderBuilderExtensions.cs +++ b/src/OpenTelemetry/Logs/Builder/LoggerProviderBuilderExtensions.cs @@ -26,7 +26,7 @@ namespace OpenTelemetry.Logs; /// /// Contains extension methods for the class. /// -internal static class LoggerProviderBuilderExtensions +public static class LoggerProviderBuilderExtensions { /// /// Sets the from which the Resource associated with diff --git a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs index e814b16ee..732795729 100644 --- a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs +++ b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs @@ -157,7 +157,6 @@ internal sealed class OpenTelemetryLogger : ILogger { iLoggerData.State = null; - /* TODO: Enable this if/when LogRecordAttributeList becomes public. if (typeof(TState) == typeof(LogRecordAttributeList)) { // Note: This block is written to be elided by the JIT when @@ -169,8 +168,7 @@ internal sealed class OpenTelemetryLogger : ILogger return logRecordAttributes.Export(ref logRecord.AttributeStorage); } - else */ - if (state is IReadOnlyList> stateList) + else if (state is IReadOnlyList> stateList) { return stateList; } diff --git a/src/OpenTelemetry/Logs/LogRecord.cs b/src/OpenTelemetry/Logs/LogRecord.cs index 4ff15d584..cbc5e11ff 100644 --- a/src/OpenTelemetry/Logs/LogRecord.cs +++ b/src/OpenTelemetry/Logs/LogRecord.cs @@ -148,6 +148,9 @@ public sealed class LogRecord /// /// Gets or sets the log category name. /// + /// + /// Note: is only set when emitting logs through . + /// public string? CategoryName { get => this.ILoggerData.CategoryName; @@ -157,7 +160,7 @@ public sealed class LogRecord /// /// Gets or sets the log . /// - // todo: [Obsolete("Use Severity instead LogLevel will be removed in a future version.")] + [Obsolete("Use Severity instead. LogLevel will be removed in a future version.")] public LogLevel LogLevel { get @@ -183,6 +186,9 @@ public sealed class LogRecord /// /// Gets or sets the log . /// + /// + /// Note: is only set when emitting logs through . + /// public EventId EventId { get => this.ILoggerData.EventId; @@ -193,10 +199,15 @@ public sealed class LogRecord /// Gets or sets the log formatted message. /// /// - /// Note: Set if is - /// enabled or {OriginalFormat} attribute (message template) is - /// not found. + /// Notes: + /// + /// is only set when emitting logs + /// through . + /// Set if is enabled + /// or {OriginalFormat} attribute (message template) is not + /// found. + /// /// public string? FormattedMessage { @@ -221,8 +232,13 @@ public sealed class LogRecord /// Gets or sets the raw state attached to the log. /// /// - /// Note: Set to when is enabled. + /// Notes: + /// + /// is only set when emitting logs + /// through . + /// Set to when is enabled. + /// /// [Obsolete("State cannot be accessed safely outside of an ILogger.Log call stack. Use Attributes instead to safely access the data attached to a LogRecord. State will be removed in a future version.")] public object? State @@ -235,7 +251,7 @@ public sealed class LogRecord /// Gets or sets the state values attached to the log. /// /// - [Obsolete("Use Attributes instead StateValues will be removed in a future version.")] + [Obsolete("Use Attributes instead. StateValues will be removed in a future version.")] public IReadOnlyList>? StateValues { get => this.Attributes; @@ -259,6 +275,9 @@ public sealed class LogRecord /// /// Gets or sets the log . /// + /// + /// Note: is only set when emitting logs through . + /// public Exception? Exception { get => this.ILoggerData.Exception; @@ -269,7 +288,7 @@ public sealed class LogRecord /// Gets or sets the original string representation of the severity as it is /// known at the source. /// - internal string? SeverityText + public string? SeverityText { get => this.Data.SeverityText; set => this.Data.SeverityText = value; @@ -278,16 +297,16 @@ public sealed class LogRecord /// /// Gets or sets the log . /// - internal LogRecordSeverity? Severity + public LogRecordSeverity? Severity { get => this.Data.Severity; set => this.Data.Severity = value; } /// - /// Gets or sets the which emitted the . + /// Gets the which emitted the . /// - internal Logger? Logger { get; /*todo: internal*/ set; } + public Logger? Logger { get; internal set; } /// /// Executes callback for each currently active scope objects in order diff --git a/src/OpenTelemetry/Logs/LoggerProviderExtensions.cs b/src/OpenTelemetry/Logs/LoggerProviderExtensions.cs index 9bd310b89..da788c1e7 100644 --- a/src/OpenTelemetry/Logs/LoggerProviderExtensions.cs +++ b/src/OpenTelemetry/Logs/LoggerProviderExtensions.cs @@ -23,7 +23,7 @@ namespace OpenTelemetry.Logs; /// /// Contains extension methods for the class. /// -internal static class LoggerProviderExtensions +public static class LoggerProviderExtensions { /// /// Add a processor to the . diff --git a/src/OpenTelemetry/Sdk.cs b/src/OpenTelemetry/Sdk.cs index d52ac7b9f..92d0b0a0b 100644 --- a/src/OpenTelemetry/Sdk.cs +++ b/src/OpenTelemetry/Sdk.cs @@ -59,6 +59,20 @@ namespace OpenTelemetry Propagators.DefaultTextMapPropagator = textMapPropagator; } + /// + /// Creates a which is used to build + /// a . In a typical application, a single + /// is created at application startup and + /// disposed at application shutdown. It is important to ensure that the + /// provider is not disposed too early. + /// + /// instance, which is used + /// to build a . + public static LoggerProviderBuilder CreateLoggerProviderBuilder() + { + return new LoggerProviderBuilderBase(); + } + /// /// Creates a which is used to build /// a . In a typical application, a single @@ -84,19 +98,5 @@ namespace OpenTelemetry { return new TracerProviderBuilderBase(); } - - /// - /// Creates a which is used to build - /// a . In a typical application, a single - /// is created at application startup and - /// disposed at application shutdown. It is important to ensure that the - /// provider is not disposed too early. - /// - /// instance, which is used - /// to build a . - internal static LoggerProviderBuilder CreateLoggerProviderBuilder() - { - return new LoggerProviderBuilderBase(); - } } } diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs index 404b41e35..d71303c84 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs @@ -382,7 +382,10 @@ namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests var otlpLogRecord = logRecord.ToOtlpLog(DefaultSdkLimitOptions); Assert.NotNull(otlpLogRecord); +#pragma warning disable CS0618 // Type or member is obsolete Assert.Equal(logRecord.LogLevel.ToString(), otlpLogRecord.SeverityText); +#pragma warning restore CS0618 // Type or member is obsolete + Assert.Equal((int)logRecord.Severity, (int)otlpLogRecord.SeverityNumber); switch (logLevel) { case LogLevel.Trace: