diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs index e6942286e22..7cb7f9155d3 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/OtlpLogRecordTransformer.cs @@ -17,6 +17,7 @@ namespace OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation; internal sealed class OtlpLogRecordTransformer { internal static readonly ConcurrentBag LogListPool = new(); + private Dictionary? logsByCategory; private readonly SdkLimitOptions sdkLimitOptions; private readonly ExperimentalOptions experimentalOptions; @@ -31,35 +32,42 @@ internal OtlpCollector.ExportLogsServiceRequest BuildExportRequest( OtlpResource.Resource processResource, in Batch logRecordBatch) { - // TODO: https://github.com/open-telemetry/opentelemetry-dotnet/issues/4943 - Dictionary logsByCategory = new Dictionary(); + var logsByCategory = Interlocked.Exchange(ref this.logsByCategory, null) ?? new Dictionary(); - var request = new OtlpCollector.ExportLogsServiceRequest(); - - var resourceLogs = new OtlpLogs.ResourceLogs + try { - Resource = processResource, - }; - request.ResourceLogs.Add(resourceLogs); + var request = new OtlpCollector.ExportLogsServiceRequest(); - foreach (var logRecord in logRecordBatch) - { - var otlpLogRecord = this.ToOtlpLog(logRecord); - if (otlpLogRecord != null) + var resourceLogs = new OtlpLogs.ResourceLogs { - var scopeName = logRecord.Logger.Name; - if (!logsByCategory.TryGetValue(scopeName, out var scopeLogs)) + Resource = processResource, + }; + request.ResourceLogs.Add(resourceLogs); + + foreach (var logRecord in logRecordBatch) + { + var otlpLogRecord = this.ToOtlpLog(logRecord); + if (otlpLogRecord != null) { - scopeLogs = this.GetLogListFromPool(scopeName); - logsByCategory.Add(scopeName, scopeLogs); - resourceLogs.ScopeLogs.Add(scopeLogs); - } + var scopeName = logRecord.Logger.Name; + if (!logsByCategory.TryGetValue(scopeName, out var scopeLogs)) + { + scopeLogs = this.GetLogListFromPool(scopeName); + logsByCategory.Add(scopeName, scopeLogs); + resourceLogs.ScopeLogs.Add(scopeLogs); + } - scopeLogs.LogRecords.Add(otlpLogRecord); + scopeLogs.LogRecords.Add(otlpLogRecord); + } } - } - return request; + return request; + } + finally + { + logsByCategory.Clear(); + Interlocked.Exchange(ref this.logsByCategory, logsByCategory); + } } [MethodImpl(MethodImplOptions.AggressiveInlining)]