Skip to content

Commit ef977c1

Browse files
AB027PSCodeBlanch
andauthored
[otlp] Use LogRecord.Logger.Name for instrumentation scope if LogRecord.CategoryName is null (#5300)
Co-authored-by: Mikel Blanchard <[email protected]>
1 parent ef942a1 commit ef977c1

File tree

3 files changed

+49
-3
lines changed

3 files changed

+49
-3
lines changed

src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@
2121
experimental Logs Bridge API.
2222
([#5268](https://github.com/open-telemetry/opentelemetry-dotnet/pull/5268))
2323

24+
* Updated `OtlpLogExporter` to set instrumentation scope name on the data model
25+
from `LogRecord.Logger.Name` if `LogRecord.CategoryName` is `null`. This is
26+
typically the case when using the experimental Logs Bridge API.
27+
([#5300](https://github.com/open-telemetry/opentelemetry-dotnet/pull/5300))
28+
2429
## 1.7.0
2530

2631
Released 2023-Dec-08

src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ internal sealed class OtlpLogRecordTransformer
1818
{
1919
internal static readonly ConcurrentBag<OtlpLogs.ScopeLogs> LogListPool = new();
2020

21+
private const string DefaultScopeName = "";
22+
2123
private readonly SdkLimitOptions sdkLimitOptions;
2224
private readonly ExperimentalOptions experimentalOptions;
2325

@@ -47,10 +49,11 @@ internal OtlpCollector.ExportLogsServiceRequest BuildExportRequest(
4749
var otlpLogRecord = this.ToOtlpLog(logRecord);
4850
if (otlpLogRecord != null)
4951
{
50-
if (!logsByCategory.TryGetValue(logRecord.CategoryName, out var scopeLogs))
52+
var scopeName = logRecord.CategoryName ?? logRecord.Logger?.Name ?? DefaultScopeName;
53+
if (!logsByCategory.TryGetValue(scopeName, out var scopeLogs))
5154
{
52-
scopeLogs = this.GetLogListFromPool(logRecord.CategoryName);
53-
logsByCategory.Add(logRecord.CategoryName, scopeLogs);
55+
scopeLogs = this.GetLogListFromPool(scopeName);
56+
logsByCategory.Add(scopeName, scopeLogs);
5457
resourceLogs.ScopeLogs.Add(scopeLogs);
5558
}
5659

test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1469,6 +1469,44 @@ public void VerifyEnvironmentVariablesTakenFromIConfigurationWhenUsingLoggingBui
14691469
});
14701470
}
14711471

1472+
[Theory]
1473+
[InlineData("my_instrumentation_scope_name", "my_instrumentation_scope_name")]
1474+
[InlineData(null, "")]
1475+
public void LogRecordLoggerNameIsExportedWhenUsingBridgeApi(string loggerName, string expectedScopeName)
1476+
{
1477+
LogRecordAttributeList attributes = default;
1478+
attributes.Add("name", "tomato");
1479+
attributes.Add("price", 2.99);
1480+
attributes.Add("{OriginalFormat}", "Hello from {name} {price}.");
1481+
1482+
var logRecords = new List<LogRecord>();
1483+
1484+
using (var loggerProvider = Sdk.CreateLoggerProviderBuilder()
1485+
.AddInMemoryExporter(logRecords)
1486+
.Build())
1487+
{
1488+
var logger = loggerProvider.GetLogger(loggerName);
1489+
1490+
logger.EmitLog(new LogRecordData());
1491+
}
1492+
1493+
Assert.Single(logRecords);
1494+
1495+
var otlpLogRecordTransformer = new OtlpLogRecordTransformer(DefaultSdkLimitOptions, new());
1496+
1497+
var batch = new Batch<LogRecord>(new[] { logRecords[0] }, 1);
1498+
1499+
var request = otlpLogRecordTransformer.BuildExportRequest(
1500+
new Proto.Resource.V1.Resource(),
1501+
batch);
1502+
1503+
Assert.NotNull(request);
1504+
Assert.Single(request.ResourceLogs);
1505+
Assert.Single(request.ResourceLogs[0].ScopeLogs);
1506+
1507+
Assert.Equal(expectedScopeName, request.ResourceLogs[0].ScopeLogs[0].Scope?.Name);
1508+
}
1509+
14721510
private static void RunVerifyEnvironmentVariablesTakenFromIConfigurationTest(
14731511
string optionsName,
14741512
Func<Action<IServiceCollection>, (IDisposable Container, ILoggerFactory LoggerFactory)> createLoggerFactoryFunc)

0 commit comments

Comments
 (0)