Skip to content

Commit a4e5cf5

Browse files
authored
[shared] Add TagWriter implementation (#5476)
1 parent b78a369 commit a4e5cf5

File tree

4 files changed

+429
-0
lines changed

4 files changed

+429
-0
lines changed

Diff for: OpenTelemetry.sln

+8
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,13 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Configuration", "Configurat
348348
src\Shared\Configuration\OpenTelemetryConfigurationExtensions.cs = src\Shared\Configuration\OpenTelemetryConfigurationExtensions.cs
349349
EndProjectSection
350350
EndProject
351+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TagWriter", "TagWriter", "{993E65E5-E71B-40FD-871C-60A9EBD59724}"
352+
ProjectSection(SolutionItems) = preProject
353+
src\Shared\TagWriter\ArrayTagWriter.cs = src\Shared\TagWriter\ArrayTagWriter.cs
354+
src\Shared\TagWriter\JsonStringArrayTagWriter.cs = src\Shared\TagWriter\JsonStringArrayTagWriter.cs
355+
src\Shared\TagWriter\TagWriter.cs = src\Shared\TagWriter\TagWriter.cs
356+
EndProjectSection
357+
EndProject
351358
Global
352359
GlobalSection(SolutionConfigurationPlatforms) = preSolution
353360
Debug|Any CPU = Debug|Any CPU
@@ -694,6 +701,7 @@ Global
694701
{7BE494FC-4B0D-4340-A62A-9C9F3E7389FE} = {A115CE4C-71A8-4B95-96A5-C1DF46FD94C2}
695702
{19545B37-8518-4BDD-AD49-00C031FB3C2A} = {3862190B-E2C5-418E-AFDC-DB281FB5C705}
696703
{87A20A76-D524-4AAC-AF92-8725BFED0415} = {A49299FB-C5CD-4E0E-B7E1-B7867BBD67CC}
704+
{993E65E5-E71B-40FD-871C-60A9EBD59724} = {A49299FB-C5CD-4E0E-B7E1-B7867BBD67CC}
697705
EndGlobalSection
698706
GlobalSection(ExtensibilityGlobals) = postSolution
699707
SolutionGuid = {55639B5C-0770-4A22-AB56-859604650521}

Diff for: src/Shared/TagWriter/ArrayTagWriter.cs

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#nullable enable
5+
6+
namespace OpenTelemetry.Internal;
7+
8+
internal abstract class ArrayTagWriter<TArrayState>
9+
where TArrayState : notnull
10+
{
11+
public abstract TArrayState BeginWriteArray();
12+
13+
public abstract void WriteNullValue(ref TArrayState state);
14+
15+
public abstract void WriteIntegralValue(ref TArrayState state, long value);
16+
17+
public abstract void WriteFloatingPointValue(ref TArrayState state, double value);
18+
19+
public abstract void WriteBooleanValue(ref TArrayState state, bool value);
20+
21+
public abstract void WriteStringValue(ref TArrayState state, string value);
22+
23+
public abstract void EndWriteArray(ref TArrayState state);
24+
}

Diff for: src/Shared/TagWriter/JsonStringArrayTagWriter.cs

+99
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#nullable enable
5+
6+
using System.Diagnostics;
7+
using System.Text.Json;
8+
9+
namespace OpenTelemetry.Internal;
10+
11+
internal abstract class JsonStringArrayTagWriter<TTagState> : TagWriter<TTagState, JsonStringArrayTagWriter<TTagState>.JsonArrayTagWriterState>
12+
where TTagState : notnull
13+
{
14+
protected JsonStringArrayTagWriter()
15+
: base(new JsonArrayTagWriter())
16+
{
17+
}
18+
19+
protected sealed override void WriteArrayTag(ref TTagState writer, string key, ref JsonArrayTagWriterState array)
20+
{
21+
var result = array.Stream.TryGetBuffer(out var buffer);
22+
23+
Debug.Assert(result, "result was false");
24+
25+
this.WriteArrayTag(ref writer, key, buffer);
26+
}
27+
28+
protected abstract void WriteArrayTag(ref TTagState writer, string key, ArraySegment<byte> arrayUtf8JsonBytes);
29+
30+
internal readonly struct JsonArrayTagWriterState(MemoryStream stream, Utf8JsonWriter writer)
31+
{
32+
public MemoryStream Stream { get; } = stream;
33+
34+
public Utf8JsonWriter Writer { get; } = writer;
35+
}
36+
37+
internal sealed class JsonArrayTagWriter : ArrayTagWriter<JsonArrayTagWriterState>
38+
{
39+
[ThreadStatic]
40+
private static MemoryStream? threadStream;
41+
42+
[ThreadStatic]
43+
private static Utf8JsonWriter? threadWriter;
44+
45+
public override JsonArrayTagWriterState BeginWriteArray()
46+
{
47+
var state = EnsureWriter();
48+
state.Writer.WriteStartArray();
49+
return state;
50+
}
51+
52+
public override void EndWriteArray(ref JsonArrayTagWriterState state)
53+
{
54+
state.Writer.WriteEndArray();
55+
state.Writer.Flush();
56+
}
57+
58+
public override void WriteBooleanValue(ref JsonArrayTagWriterState state, bool value)
59+
{
60+
state.Writer.WriteBooleanValue(value);
61+
}
62+
63+
public override void WriteFloatingPointValue(ref JsonArrayTagWriterState state, double value)
64+
{
65+
state.Writer.WriteNumberValue(value);
66+
}
67+
68+
public override void WriteIntegralValue(ref JsonArrayTagWriterState state, long value)
69+
{
70+
state.Writer.WriteNumberValue(value);
71+
}
72+
73+
public override void WriteNullValue(ref JsonArrayTagWriterState state)
74+
{
75+
state.Writer.WriteNullValue();
76+
}
77+
78+
public override void WriteStringValue(ref JsonArrayTagWriterState state, string value)
79+
{
80+
state.Writer.WriteStringValue(value);
81+
}
82+
83+
private static JsonArrayTagWriterState EnsureWriter()
84+
{
85+
if (threadStream == null)
86+
{
87+
threadStream = new MemoryStream();
88+
threadWriter = new Utf8JsonWriter(threadStream);
89+
return new(threadStream, threadWriter);
90+
}
91+
else
92+
{
93+
threadStream.SetLength(0);
94+
threadWriter!.Reset(threadStream);
95+
return new(threadStream, threadWriter);
96+
}
97+
}
98+
}
99+
}

0 commit comments

Comments
 (0)