From 9db7130b6e371f1a058cb7a13edb12be82b39495 Mon Sep 17 00:00:00 2001 From: Vishwesh Bankwar Date: Tue, 10 Oct 2023 13:55:46 -0700 Subject: [PATCH 1/9] draft --- .../OtlpLogRecordTransformer.cs | 59 ++++++++++++++++++- .../OtlpLogExporter.cs | 8 ++- .../OtlpLogExporterTests.cs | 40 +++++++++++++ 3 files changed, 102 insertions(+), 5 deletions(-) diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs index 3a7be7f04c8..9ec3fb74dcc 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs @@ -14,6 +14,7 @@ // limitations under the License. // +using System.Collections.Concurrent; using System.Runtime.CompilerServices; using Google.Protobuf; using OpenTelemetry.Internal; @@ -28,13 +29,33 @@ namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation; internal sealed class OtlpLogRecordTransformer { + private static readonly ConcurrentBag LogListPool = new(); + private readonly SdkLimitOptions sdkLimitOptions; private readonly ExperimentalOptions experimentalOptions; + private readonly Dictionary logsByCategory; public OtlpLogRecordTransformer(SdkLimitOptions sdkLimitOptions, ExperimentalOptions experimentalOptions) { this.sdkLimitOptions = sdkLimitOptions; this.experimentalOptions = experimentalOptions; + this.logsByCategory = new Dictionary(); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal void Return(OtlpCollector.ExportLogsServiceRequest request) + { + var resourceLogs = request.ResourceLogs.FirstOrDefault(); + if (resourceLogs == null) + { + return; + } + + foreach (var scope in resourceLogs.ScopeLogs) + { + scope.LogRecords.Clear(); + LogListPool.Add(scope); + } } internal OtlpCollector.ExportLogsServiceRequest BuildExportRequest( @@ -49,21 +70,53 @@ internal OtlpCollector.ExportLogsServiceRequest BuildExportRequest( }; request.ResourceLogs.Add(resourceLogs); - var scopeLogs = new OtlpLogs.ScopeLogs(); - resourceLogs.ScopeLogs.Add(scopeLogs); + this.logsByCategory.Clear(); foreach (var logRecord in logRecordBatch) { var otlpLogRecord = this.ToOtlpLog(logRecord); if (otlpLogRecord != null) { - scopeLogs.LogRecords.Add(otlpLogRecord); + if (!this.logsByCategory.TryGetValue(logRecord.CategoryName, out var scopeLogs)) + { + scopeLogs = this.GetLogListFromPool(logRecord.CategoryName); + scopeLogs.LogRecords.Add(otlpLogRecord); + this.logsByCategory.Add(logRecord.CategoryName, scopeLogs); + resourceLogs.ScopeLogs.Add(scopeLogs); + } + else + { + scopeLogs.LogRecords.Add(otlpLogRecord); + } } } return request; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal OtlpLogs.ScopeLogs GetLogListFromPool(string name) + { + if (!LogListPool.TryTake(out var logs)) + { + logs = new OtlpLogs.ScopeLogs + { + Scope = new OtlpCommon.InstrumentationScope + { + Name = name, // Name is enforced to not be null, but it can be empty. + Version = string.Empty, // NRE throw by proto + }, + }; + } + else + { + logs.Scope.Name = name; + logs.Scope.Version = string.Empty; + } + + return logs; + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] internal OtlpLogs.LogRecord ToOtlpLog(LogRecord logRecord) { diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpLogExporter.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpLogExporter.cs index 715ec0de263..f7d727d1ae7 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpLogExporter.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpLogExporter.cs @@ -90,10 +90,10 @@ public override ExportResult Export(in Batch logRecordBatch) // Prevents the exporter's gRPC and HTTP operations from being instrumented. using var scope = SuppressInstrumentationScope.Begin(); + var request = this.otlpLogRecordTransformer.BuildExportRequest(this.ProcessResource, logRecordBatch); + try { - var request = this.otlpLogRecordTransformer.BuildExportRequest(this.ProcessResource, logRecordBatch); - if (!this.exportClient.SendExportRequest(request)) { return ExportResult.Failure; @@ -104,6 +104,10 @@ public override ExportResult Export(in Batch logRecordBatch) OpenTelemetryProtocolExporterEventSource.Log.ExportMethodException(ex); return ExportResult.Failure; } + finally + { + this.otlpLogRecordTransformer.Return(request); + } return ExportResult.Success; } diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs index 0c2e6c06f9b..4c8a4f09719 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs @@ -26,6 +26,7 @@ using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation.ExportClient; using OpenTelemetry.Internal; using OpenTelemetry.Logs; +using OpenTelemetry.Resources; using OpenTelemetry.Tests; using OpenTelemetry.Trace; using Xunit; @@ -1242,6 +1243,45 @@ public void AddOtlpLogExporterLogRecordProcessorOptionsTest(ExportProcessorType } } + [Fact] + public void ValidateInstrumentationScope() + { + var logRecords = new List(); + using var loggerFactory = LoggerFactory.Create(builder => + { + builder + .AddOpenTelemetry(options => options + .AddInMemoryExporter(logRecords)); + }); + + var logger1 = loggerFactory.CreateLogger("OtlpLogExporterTests-A"); + logger1.LogInformation("Hello from {name} {price}.", "red-tomato", 2.99); + + var logger2 = loggerFactory.CreateLogger("OtlpLogExporterTests-B"); + logger2.LogInformation("Hello from {name} {price}.", "green-tomato", 2.99); + + Assert.Equal(2, logRecords.Count); + + var batch = new Batch(logRecords.ToArray(), logRecords.Count); + var logRecordTransformer = new OtlpLogRecordTransformer(new(), new()); + + var resourceBuilder = ResourceBuilder.CreateEmpty(); + var processResource = resourceBuilder.Build().ToOtlpResource(); + + var request = logRecordTransformer.BuildExportRequest(processResource, batch); + + Assert.Single(request.ResourceLogs); + + Assert.Equal("OtlpLogExporterTests-A", request.ResourceLogs[0].ScopeLogs.First().Scope.Name); + Assert.Equal("OtlpLogExporterTests-B", request.ResourceLogs[0].ScopeLogs.Last().Scope.Name); + + //Assert.Single(resourceMetric.ScopeMetrics); + //var instrumentationLibraryMetrics = resourceMetric.ScopeMetrics.First(); + //Assert.Equal(string.Empty, instrumentationLibraryMetrics.SchemaUrl); + //Assert.Equal(meter.Name, instrumentationLibraryMetrics.Scope.Name); + //Assert.Equal("0.0.1", instrumentationLibraryMetrics.Scope.Version); + } + private static OtlpCommon.KeyValue TryGetAttribute(OtlpLogs.LogRecord record, string key) { return record.Attributes.FirstOrDefault(att => att.Key == key); From 7fdeecbb8a9162704f90565791586f50a0d4ff33 Mon Sep 17 00:00:00 2001 From: Vishwesh Bankwar Date: Wed, 11 Oct 2023 11:17:14 -0700 Subject: [PATCH 2/9] update test --- .../OtlpLogRecordTransformer.cs | 34 +++++++++---------- .../OtlpLogExporterTests.cs | 16 ++++++--- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs index 9ec3fb74dcc..cba788f99d3 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs @@ -29,7 +29,7 @@ namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation; internal sealed class OtlpLogRecordTransformer { - private static readonly ConcurrentBag LogListPool = new(); + internal static readonly ConcurrentBag LogListPool = new(); private readonly SdkLimitOptions sdkLimitOptions; private readonly ExperimentalOptions experimentalOptions; @@ -42,22 +42,6 @@ public OtlpLogRecordTransformer(SdkLimitOptions sdkLimitOptions, ExperimentalOpt this.logsByCategory = new Dictionary(); } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal void Return(OtlpCollector.ExportLogsServiceRequest request) - { - var resourceLogs = request.ResourceLogs.FirstOrDefault(); - if (resourceLogs == null) - { - return; - } - - foreach (var scope in resourceLogs.ScopeLogs) - { - scope.LogRecords.Clear(); - LogListPool.Add(scope); - } - } - internal OtlpCollector.ExportLogsServiceRequest BuildExportRequest( OtlpResource.Resource processResource, in Batch logRecordBatch) @@ -94,6 +78,22 @@ internal OtlpCollector.ExportLogsServiceRequest BuildExportRequest( return request; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal void Return(OtlpCollector.ExportLogsServiceRequest request) + { + var resourceLogs = request.ResourceLogs.FirstOrDefault(); + if (resourceLogs == null) + { + return; + } + + foreach (var scope in resourceLogs.ScopeLogs) + { + scope.LogRecords.Clear(); + LogListPool.Add(scope); + } + } + [MethodImpl(MethodImplOptions.AggressiveInlining)] internal OtlpLogs.ScopeLogs GetLogListFromPool(string name) { diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs index 4c8a4f09719..1b597de7e04 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs @@ -1275,11 +1275,17 @@ public void ValidateInstrumentationScope() Assert.Equal("OtlpLogExporterTests-A", request.ResourceLogs[0].ScopeLogs.First().Scope.Name); Assert.Equal("OtlpLogExporterTests-B", request.ResourceLogs[0].ScopeLogs.Last().Scope.Name); - //Assert.Single(resourceMetric.ScopeMetrics); - //var instrumentationLibraryMetrics = resourceMetric.ScopeMetrics.First(); - //Assert.Equal(string.Empty, instrumentationLibraryMetrics.SchemaUrl); - //Assert.Equal(meter.Name, instrumentationLibraryMetrics.Scope.Name); - //Assert.Equal("0.0.1", instrumentationLibraryMetrics.Scope.Version); + // Validate LogListPool + Assert.Empty(OtlpLogRecordTransformer.LogListPool); + logRecordTransformer.Return(request); + Assert.Equal(2, OtlpLogRecordTransformer.LogListPool.Count); + + request = logRecordTransformer.BuildExportRequest(processResource, batch); + + Assert.Single(request.ResourceLogs); + + // ScopeLogs will be reused. + Assert.Empty(OtlpLogRecordTransformer.LogListPool); } private static OtlpCommon.KeyValue TryGetAttribute(OtlpLogs.LogRecord record, string key) From 221d29cdd4995de57ab5e31f70940d93e4ee972b Mon Sep 17 00:00:00 2001 From: Vishwesh Bankwar Date: Wed, 11 Oct 2023 12:48:19 -0700 Subject: [PATCH 3/9] changelog --- .../CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CHANGELOG.md b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CHANGELOG.md index 90f64dd9c0a..09690b7182d 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CHANGELOG.md +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CHANGELOG.md @@ -19,6 +19,12 @@ attributes will be exported when variable will be set to `true`. ([#4892](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4892)) +* `LogRecord.CategoryName` will now be exported as +[InstrumentationScope](https://github.com/open-telemetry/opentelemetry-dotnet/blob/3c2bb7c93dd2e697636479a1882f49bb0c4a362e/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/opentelemetry/proto/common/v1/common.proto#L71-L81) +`name` field under +[ScopeLogs](https://github.com/open-telemetry/opentelemetry-dotnet/blob/3c2bb7c93dd2e697636479a1882f49bb0c4a362e/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/opentelemetry/proto/logs/v1/logs.proto#L64-L75). +([#4941](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4941)) + ## 1.6.0 Released 2023-Sep-05 From a233ea785d2c8931bda56b65edb54c75398cee99 Mon Sep 17 00:00:00 2001 From: Vishwesh Bankwar Date: Wed, 11 Oct 2023 18:10:29 -0700 Subject: [PATCH 4/9] refactor --- .../Implementation/OtlpLogRecordTransformer.cs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs index cba788f99d3..2337f970ba8 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs @@ -33,19 +33,21 @@ internal sealed class OtlpLogRecordTransformer private readonly SdkLimitOptions sdkLimitOptions; private readonly ExperimentalOptions experimentalOptions; - private readonly Dictionary logsByCategory; public OtlpLogRecordTransformer(SdkLimitOptions sdkLimitOptions, ExperimentalOptions experimentalOptions) { this.sdkLimitOptions = sdkLimitOptions; this.experimentalOptions = experimentalOptions; - this.logsByCategory = new Dictionary(); } internal OtlpCollector.ExportLogsServiceRequest BuildExportRequest( OtlpResource.Resource processResource, in Batch logRecordBatch) { + // TODO: Update this to threadlocal + // Update span and metrics as well. + Dictionary logsByCategory = new Dictionary(); + var request = new OtlpCollector.ExportLogsServiceRequest(); var resourceLogs = new OtlpLogs.ResourceLogs @@ -54,18 +56,18 @@ internal OtlpCollector.ExportLogsServiceRequest BuildExportRequest( }; request.ResourceLogs.Add(resourceLogs); - this.logsByCategory.Clear(); + logsByCategory.Clear(); foreach (var logRecord in logRecordBatch) { var otlpLogRecord = this.ToOtlpLog(logRecord); if (otlpLogRecord != null) { - if (!this.logsByCategory.TryGetValue(logRecord.CategoryName, out var scopeLogs)) + if (!logsByCategory.TryGetValue(logRecord.CategoryName, out var scopeLogs)) { scopeLogs = this.GetLogListFromPool(logRecord.CategoryName); scopeLogs.LogRecords.Add(otlpLogRecord); - this.logsByCategory.Add(logRecord.CategoryName, scopeLogs); + logsByCategory.Add(logRecord.CategoryName, scopeLogs); resourceLogs.ScopeLogs.Add(scopeLogs); } else @@ -104,7 +106,7 @@ internal OtlpLogs.ScopeLogs GetLogListFromPool(string name) Scope = new OtlpCommon.InstrumentationScope { Name = name, // Name is enforced to not be null, but it can be empty. - Version = string.Empty, // NRE throw by proto + Version = string.Empty, // proto requires this to be non-null. }, }; } From 688b1cf45c7b57f03e7cc18fe6fb32f154ed33f3 Mon Sep 17 00:00:00 2001 From: Vishwesh Bankwar Date: Wed, 11 Oct 2023 18:12:51 -0700 Subject: [PATCH 5/9] refactor --- .../Implementation/OtlpLogRecordTransformer.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs index 2337f970ba8..866440cc984 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs @@ -66,14 +66,11 @@ internal OtlpCollector.ExportLogsServiceRequest BuildExportRequest( if (!logsByCategory.TryGetValue(logRecord.CategoryName, out var scopeLogs)) { scopeLogs = this.GetLogListFromPool(logRecord.CategoryName); - scopeLogs.LogRecords.Add(otlpLogRecord); logsByCategory.Add(logRecord.CategoryName, scopeLogs); resourceLogs.ScopeLogs.Add(scopeLogs); } - else - { - scopeLogs.LogRecords.Add(otlpLogRecord); - } + + scopeLogs.LogRecords.Add(otlpLogRecord); } } From 5630f11bba66696c9f7650344242e3890e490b4a Mon Sep 17 00:00:00 2001 From: Vishwesh Bankwar Date: Wed, 11 Oct 2023 18:31:45 -0700 Subject: [PATCH 6/9] update comment --- .../Implementation/OtlpLogRecordTransformer.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs index 866440cc984..adce350b07a 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs @@ -44,8 +44,7 @@ internal OtlpCollector.ExportLogsServiceRequest BuildExportRequest( OtlpResource.Resource processResource, in Batch logRecordBatch) { - // TODO: Update this to threadlocal - // Update span and metrics as well. + // https://github.com/open-telemetry/opentelemetry-dotnet/issues/4943 Dictionary logsByCategory = new Dictionary(); var request = new OtlpCollector.ExportLogsServiceRequest(); From b35f720ae4389baf94de0ce1e6a3cd6483f5c2b5 Mon Sep 17 00:00:00 2001 From: Vishwesh Bankwar Date: Thu, 12 Oct 2023 08:46:48 -0700 Subject: [PATCH 7/9] address comments --- .../Implementation/OtlpLogRecordTransformer.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs index adce350b07a..73101b2f4e5 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs @@ -44,7 +44,7 @@ internal OtlpCollector.ExportLogsServiceRequest BuildExportRequest( OtlpResource.Resource processResource, in Batch logRecordBatch) { - // https://github.com/open-telemetry/opentelemetry-dotnet/issues/4943 + // TODO: https://github.com/open-telemetry/opentelemetry-dotnet/issues/4943 Dictionary logsByCategory = new Dictionary(); var request = new OtlpCollector.ExportLogsServiceRequest(); @@ -55,8 +55,6 @@ internal OtlpCollector.ExportLogsServiceRequest BuildExportRequest( }; request.ResourceLogs.Add(resourceLogs); - logsByCategory.Clear(); - foreach (var logRecord in logRecordBatch) { var otlpLogRecord = this.ToOtlpLog(logRecord); From d7a8a379c1402544fa08b3e0514f7e59ccc93fb7 Mon Sep 17 00:00:00 2001 From: Vishwesh Bankwar Date: Thu, 12 Oct 2023 15:47:37 -0700 Subject: [PATCH 8/9] refactor --- .../OtlpLogExporter.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpLogExporter.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpLogExporter.cs index f7d727d1ae7..757691d1702 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpLogExporter.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpLogExporter.cs @@ -90,10 +90,12 @@ public override ExportResult Export(in Batch logRecordBatch) // Prevents the exporter's gRPC and HTTP operations from being instrumented. using var scope = SuppressInstrumentationScope.Begin(); - var request = this.otlpLogRecordTransformer.BuildExportRequest(this.ProcessResource, logRecordBatch); + OtlpCollector.ExportLogsServiceRequest request = null; try { + request = this.otlpLogRecordTransformer.BuildExportRequest(this.ProcessResource, logRecordBatch); + if (!this.exportClient.SendExportRequest(request)) { return ExportResult.Failure; @@ -106,7 +108,10 @@ public override ExportResult Export(in Batch logRecordBatch) } finally { - this.otlpLogRecordTransformer.Return(request); + if (request != null) + { + this.otlpLogRecordTransformer.Return(request); + } } return ExportResult.Success; From e0ea045877eb2cc4ba49de3239b67f7b1c6c52f5 Mon Sep 17 00:00:00 2001 From: Vishwesh Bankwar Date: Thu, 12 Oct 2023 16:04:37 -0700 Subject: [PATCH 9/9] update test --- .../OtlpLogExporterTests.cs | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs index 1b597de7e04..00ba07d96a7 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs @@ -1255,10 +1255,10 @@ public void ValidateInstrumentationScope() }); var logger1 = loggerFactory.CreateLogger("OtlpLogExporterTests-A"); - logger1.LogInformation("Hello from {name} {price}.", "red-tomato", 2.99); + logger1.LogInformation("Hello from red-tomato"); var logger2 = loggerFactory.CreateLogger("OtlpLogExporterTests-B"); - logger2.LogInformation("Hello from {name} {price}.", "green-tomato", 2.99); + logger2.LogInformation("Hello from green-tomato"); Assert.Equal(2, logRecords.Count); @@ -1272,8 +1272,21 @@ public void ValidateInstrumentationScope() Assert.Single(request.ResourceLogs); - Assert.Equal("OtlpLogExporterTests-A", request.ResourceLogs[0].ScopeLogs.First().Scope.Name); - Assert.Equal("OtlpLogExporterTests-B", request.ResourceLogs[0].ScopeLogs.Last().Scope.Name); + var scope1 = request.ResourceLogs[0].ScopeLogs.First(); + var scope2 = request.ResourceLogs[0].ScopeLogs.Last(); + + Assert.Equal("OtlpLogExporterTests-A", scope1.Scope.Name); + Assert.Equal("OtlpLogExporterTests-B", scope2.Scope.Name); + + Assert.Single(scope1.LogRecords); + Assert.Single(scope2.LogRecords); + + var logrecord1 = scope1.LogRecords[0]; + var logrecord2 = scope2.LogRecords[0]; + + Assert.Equal("Hello from red-tomato", logrecord1.Body.StringValue); + + Assert.Equal("Hello from green-tomato", logrecord2.Body.StringValue); // Validate LogListPool Assert.Empty(OtlpLogRecordTransformer.LogListPool);