Skip to content

Commit 80287c0

Browse files
[otlp] Enable OTLP exporter for multiple registrations (open-telemetry#6020)
1 parent 1f39623 commit 80287c0

File tree

3 files changed

+46
-31
lines changed

3 files changed

+46
-31
lines changed

src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpLogSerializer.cs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,26 @@ internal static class ProtobufOtlpLogSerializer
1414
private const int TraceIdSize = 16;
1515
private const int SpanIdSize = 8;
1616

17-
private static readonly Stack<List<LogRecord>> LogsListPool = [];
18-
private static readonly Dictionary<string, List<LogRecord>> ScopeLogsList = [];
17+
[ThreadStatic]
18+
private static Stack<List<LogRecord>>? logsListPool;
19+
[ThreadStatic]
20+
private static Dictionary<string, List<LogRecord>>? scopeLogsList;
1921

2022
[ThreadStatic]
2123
private static SerializationState? threadSerializationState;
2224

2325
internal static int WriteLogsData(ref byte[] buffer, int writePosition, SdkLimitOptions sdkLimitOptions, ExperimentalOptions experimentalOptions, Resources.Resource? resource, in Batch<LogRecord> logRecordBatch)
2426
{
27+
logsListPool ??= [];
28+
scopeLogsList ??= [];
29+
2530
foreach (var logRecord in logRecordBatch)
2631
{
2732
var scopeName = logRecord.Logger.Name;
28-
if (!ScopeLogsList.TryGetValue(scopeName, out var logRecords))
33+
if (!scopeLogsList.TryGetValue(scopeName, out var logRecords))
2934
{
30-
logRecords = LogsListPool.Count > 0 ? LogsListPool.Pop() : [];
31-
ScopeLogsList[scopeName] = logRecords;
35+
logRecords = logsListPool.Count > 0 ? logsListPool.Pop() : [];
36+
scopeLogsList[scopeName] = logRecords;
3237
}
3338

3439
if (logRecord.Source == LogRecord.LogRecordSource.FromSharedPool)
@@ -43,7 +48,7 @@ internal static int WriteLogsData(ref byte[] buffer, int writePosition, SdkLimit
4348
logRecords.Add(logRecord);
4449
}
4550

46-
writePosition = TryWriteResourceLogs(ref buffer, writePosition, sdkLimitOptions, experimentalOptions, resource, ScopeLogsList);
51+
writePosition = TryWriteResourceLogs(ref buffer, writePosition, sdkLimitOptions, experimentalOptions, resource, scopeLogsList);
4752
ReturnLogRecordListToPool();
4853

4954
return writePosition;
@@ -79,9 +84,9 @@ internal static int TryWriteResourceLogs(ref byte[] buffer, int writePosition, S
7984

8085
internal static void ReturnLogRecordListToPool()
8186
{
82-
if (ScopeLogsList.Count != 0)
87+
if (scopeLogsList?.Count != 0)
8388
{
84-
foreach (var entry in ScopeLogsList)
89+
foreach (var entry in scopeLogsList!)
8590
{
8691
foreach (var logRecord in entry.Value)
8792
{
@@ -96,10 +101,10 @@ internal static void ReturnLogRecordListToPool()
96101
}
97102

98103
entry.Value.Clear();
99-
LogsListPool.Push(entry.Value);
104+
logsListPool?.Push(entry.Value);
100105
}
101106

102-
ScopeLogsList.Clear();
107+
scopeLogsList.Clear();
103108
}
104109
}
105110

src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpMetricSerializer.cs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,26 +12,31 @@ internal static class ProtobufOtlpMetricSerializer
1212
private const int TraceIdSize = 16;
1313
private const int SpanIdSize = 8;
1414

15-
private static readonly Stack<List<Metric>> MetricListPool = [];
16-
private static readonly Dictionary<string, List<Metric>> ScopeMetricsList = [];
15+
[ThreadStatic]
16+
private static Stack<List<Metric>>? metricListPool;
17+
[ThreadStatic]
18+
private static Dictionary<string, List<Metric>>? scopeMetricsList;
1719

1820
private delegate int WriteExemplarFunc(byte[] buffer, int writePosition, in Exemplar exemplar);
1921

2022
internal static int WriteMetricsData(ref byte[] buffer, int writePosition, Resources.Resource? resource, in Batch<Metric> batch)
2123
{
24+
metricListPool ??= [];
25+
scopeMetricsList ??= [];
26+
2227
foreach (var metric in batch)
2328
{
2429
var metricName = metric.MeterName;
25-
if (!ScopeMetricsList.TryGetValue(metricName, out var metrics))
30+
if (!scopeMetricsList.TryGetValue(metricName, out var metrics))
2631
{
27-
metrics = MetricListPool.Count > 0 ? MetricListPool.Pop() : new List<Metric>();
28-
ScopeMetricsList[metricName] = metrics;
32+
metrics = metricListPool.Count > 0 ? metricListPool.Pop() : new List<Metric>();
33+
scopeMetricsList[metricName] = metrics;
2934
}
3035

3136
metrics.Add(metric);
3237
}
3338

34-
writePosition = TryWriteResourceMetrics(ref buffer, writePosition, resource, ScopeMetricsList);
39+
writePosition = TryWriteResourceMetrics(ref buffer, writePosition, resource, scopeMetricsList);
3540
ReturnMetricListToPool();
3641

3742
return writePosition;
@@ -67,15 +72,15 @@ internal static int TryWriteResourceMetrics(ref byte[] buffer, int writePosition
6772

6873
private static void ReturnMetricListToPool()
6974
{
70-
if (ScopeMetricsList.Count != 0)
75+
if (scopeMetricsList?.Count != 0)
7176
{
72-
foreach (var entry in ScopeMetricsList)
77+
foreach (var entry in scopeMetricsList!)
7378
{
7479
entry.Value.Clear();
75-
MetricListPool.Push(entry.Value);
80+
metricListPool?.Push(entry.Value);
7681
}
7782

78-
ScopeMetricsList.Clear();
83+
scopeMetricsList.Clear();
7984
}
8085
}
8186

src/OpenTelemetry.Exporter.OpenTelemetryProtocol/Implementation/Serializer/ProtobufOtlpTraceSerializer.cs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,23 @@ internal static class ProtobufOtlpTraceSerializer
1515
private const int TraceIdSize = 16;
1616
private const int SpanIdSize = 8;
1717

18-
private static readonly Stack<List<Activity>> ActivityListPool = [];
19-
private static readonly Dictionary<string, List<Activity>> ScopeTracesList = [];
18+
[ThreadStatic]
19+
private static Stack<List<Activity>>? activityListPool;
20+
[ThreadStatic]
21+
private static Dictionary<string, List<Activity>>? scopeTracesList;
2022

2123
internal static int WriteTraceData(ref byte[] buffer, int writePosition, SdkLimitOptions sdkLimitOptions, Resources.Resource? resource, in Batch<Activity> batch)
2224
{
25+
activityListPool ??= [];
26+
scopeTracesList ??= [];
27+
2328
foreach (var activity in batch)
2429
{
2530
var sourceName = activity.Source.Name;
26-
if (!ScopeTracesList.TryGetValue(sourceName, out var activities))
31+
if (!scopeTracesList.TryGetValue(sourceName, out var activities))
2732
{
28-
activities = ActivityListPool.Count > 0 ? ActivityListPool.Pop() : [];
29-
ScopeTracesList[sourceName] = activities;
33+
activities = activityListPool.Count > 0 ? activityListPool.Pop() : [];
34+
scopeTracesList[sourceName] = activities;
3035
}
3136

3237
activities.Add(activity);
@@ -74,15 +79,15 @@ internal static int TryWriteResourceSpans(ref byte[] buffer, int writePosition,
7479

7580
internal static void ReturnActivityListToPool()
7681
{
77-
if (ScopeTracesList.Count != 0)
82+
if (scopeTracesList?.Count != 0)
7883
{
79-
foreach (var entry in ScopeTracesList)
84+
foreach (var entry in scopeTracesList!)
8085
{
8186
entry.Value.Clear();
82-
ActivityListPool.Push(entry.Value);
87+
activityListPool?.Push(entry.Value);
8388
}
8489

85-
ScopeTracesList.Clear();
90+
scopeTracesList.Clear();
8691
}
8792
}
8893

@@ -96,9 +101,9 @@ internal static int WriteResourceSpans(byte[] buffer, int writePosition, SdkLimi
96101

97102
internal static int WriteScopeSpans(byte[] buffer, int writePosition, SdkLimitOptions sdkLimitOptions)
98103
{
99-
if (ScopeTracesList != null)
104+
if (scopeTracesList != null)
100105
{
101-
foreach (KeyValuePair<string, List<Activity>> entry in ScopeTracesList)
106+
foreach (KeyValuePair<string, List<Activity>> entry in scopeTracesList)
102107
{
103108
writePosition = ProtobufSerializer.WriteTag(buffer, writePosition, ProtobufOtlpTraceFieldNumberConstants.ResourceSpans_Scope_Spans, ProtobufWireType.LEN);
104109
int resourceSpansScopeSpansLengthPosition = writePosition;

0 commit comments

Comments
 (0)