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: