From 285970a7b149af00eda0986114abae6a63e298d5 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 8 Jun 2023 10:17:52 -0700 Subject: [PATCH 1/3] Expose logging SDK implementation as public. --- .../ConsoleLogRecordExporter.cs | 10 +++- .../OpenTelemetry.Exporter.Console.csproj | 2 - .../Implementation/LogRecordExtensions.cs | 49 ++++++------------- .../.publicApi/net462/PublicAPI.Unshipped.txt | 19 +++++++ .../.publicApi/net6.0/PublicAPI.Unshipped.txt | 19 +++++++ .../netstandard2.0/PublicAPI.Unshipped.txt | 19 +++++++ .../netstandard2.1/PublicAPI.Unshipped.txt | 19 +++++++ src/OpenTelemetry/AssemblyInfo.cs | 1 - src/OpenTelemetry/CHANGELOG.md | 16 ++++++ .../BatchExportLogRecordProcessorOptions.cs | 2 +- .../LoggerProviderBuilderExtensions.cs | 2 +- .../Logs/ILogger/OpenTelemetryLogger.cs | 4 +- src/OpenTelemetry/Logs/LogRecord.cs | 41 +++++++++++----- .../Logs/LoggerProviderExtensions.cs | 2 +- src/OpenTelemetry/Sdk.cs | 28 +++++------ .../OtlpLogExporterTests.cs | 3 ++ 16 files changed, 167 insertions(+), 69 deletions(-) diff --git a/src/OpenTelemetry.Exporter.Console/ConsoleLogRecordExporter.cs b/src/OpenTelemetry.Exporter.Console/ConsoleLogRecordExporter.cs index 8628f5b2dd2..0cac9f0ecd8 100644 --- a/src/OpenTelemetry.Exporter.Console/ConsoleLogRecordExporter.cs +++ b/src/OpenTelemetry.Exporter.Console/ConsoleLogRecordExporter.cs @@ -74,7 +74,15 @@ public override ExportResult Export(in Batch batch) 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 821a6cf6557..ada0b71d9ac 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/Implementation/LogRecordExtensions.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/LogRecordExtensions.cs index 31e28adca19..c827a2cd0e9 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 @@ internal static OtlpLogs.LogRecord ToOtlpLog(this LogRecord logRecord, SdkLimitO { 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 @@ private static void AddIntAttribute(this OtlpLogs.LogRecord logRecord, string ke } [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 1ee917c2502..2846b0ff9ea 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 1ee917c2502..2846b0ff9ea 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 1ee917c2502..2846b0ff9ea 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 1ee917c2502..2846b0ff9ea 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 6214d72ad48..6b94f59eb69 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 dd86456d036..e5a13217842 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 0f854e52046..74441551f98 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 749979eb286..d73d63336d2 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 e814b16eeec..732795729eb 100644 --- a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs +++ b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLogger.cs @@ -157,7 +157,6 @@ internal static void SetLogRecordSeverityFields(ref LogRecordData logRecordData, { 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 static void SetLogRecordSeverityFields(ref LogRecordData logRecordData, 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 4ff15d58494..5f3a7840f94 100644 --- a/src/OpenTelemetry/Logs/LogRecord.cs +++ b/src/OpenTelemetry/Logs/LogRecord.cs @@ -148,6 +148,9 @@ public string? TraceState /// /// 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 string? CategoryName /// /// 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 LogLevel LogLevel /// /// 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 EventId EventId /// 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 string? Body /// 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 @@ -259,6 +275,9 @@ public object? State /// /// 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 Exception? Exception /// 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 @@ internal string? SeverityText /// /// 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 9bd310b8938..da788c1e735 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 d52ac7b9f5d..92d0b0a0bd4 100644 --- a/src/OpenTelemetry/Sdk.cs +++ b/src/OpenTelemetry/Sdk.cs @@ -59,6 +59,20 @@ public static void SetDefaultTextMapPropagator(TextMapPropagator textMapPropagat 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 @@ public static TracerProviderBuilder CreateTracerProviderBuilder() { 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 404b41e3533..d71303c845a 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs @@ -382,7 +382,10 @@ public void CheckToOtlpLogRecordSeverityLevelAndText(LogLevel logLevel) 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: From fb5b65d73f4500aa797e744baed647b8e892a7fa Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 9 Jun 2023 10:54:09 -0700 Subject: [PATCH 2/3] Code review. --- src/OpenTelemetry.Exporter.Console/CHANGELOG.md | 4 ++++ .../CHANGELOG.md | 3 +++ src/OpenTelemetry/Logs/LogRecord.cs | 4 ++-- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/OpenTelemetry.Exporter.Console/CHANGELOG.md b/src/OpenTelemetry.Exporter.Console/CHANGELOG.md index 38203539c7a..8afc85c7557 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.OpenTelemetryProtocol.Logs/CHANGELOG.md b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol.Logs/CHANGELOG.md index 224fbb7f489..c20e9d8687b 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol.Logs/CHANGELOG.md +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol.Logs/CHANGELOG.md @@ -2,6 +2,9 @@ ## Unreleased +* Updated to support `Severity` and `SeverityText` when exporting `LogRecord`s. + ([#4568](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4568)) + ## 1.5.0-rc.1 Released 2023-May-25 diff --git a/src/OpenTelemetry/Logs/LogRecord.cs b/src/OpenTelemetry/Logs/LogRecord.cs index 5f3a7840f94..cbc5e11ff32 100644 --- a/src/OpenTelemetry/Logs/LogRecord.cs +++ b/src/OpenTelemetry/Logs/LogRecord.cs @@ -160,7 +160,7 @@ public string? CategoryName /// /// Gets or sets the log . /// - [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 @@ -251,7 +251,7 @@ public object? State /// 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; From 52f83a381cd0f4d4ae6d48a325c6afb4820ee23a Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 9 Jun 2023 10:57:31 -0700 Subject: [PATCH 3/3] Updates for changes to main. --- .../CHANGELOG.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CHANGELOG.md b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CHANGELOG.md index 1e100c94433..ce193fde282 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