Skip to content

Commit 2fe54ee

Browse files
authored
[zipkin] Switch to TagWriter for handling of tags/attributes (#5590)
1 parent ac0d1d1 commit 2fe54ee

File tree

4 files changed

+75
-48
lines changed

4 files changed

+75
-48
lines changed

src/OpenTelemetry.Exporter.Zipkin/Implementation/ZipkinSpan.cs

+5-9
Original file line numberDiff line numberDiff line change
@@ -153,26 +153,22 @@ public void Write(Utf8JsonWriter writer)
153153
writer.WritePropertyName(ZipkinSpanJsonHelper.TagsPropertyName);
154154
writer.WriteStartObject();
155155

156-
// this will be used when we convert int, double, int[], double[] to string
156+
// Note: The spec says "Primitive types MUST be converted to string using en-US culture settings"
157+
// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/sdk_exporters/zipkin.md#attribute
158+
157159
var originalUICulture = Thread.CurrentThread.CurrentUICulture;
158160
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
159161

160162
try
161163
{
162164
foreach (var tag in this.LocalEndpoint.Tags ?? Enumerable.Empty<KeyValuePair<string, object>>())
163165
{
164-
if (ZipkinTagTransformer.Instance.TryTransformTag(tag, out var result))
165-
{
166-
writer.WriteString(tag.Key, result);
167-
}
166+
ZipkinTagWriter.Instance.TryWriteTag(ref writer, tag);
168167
}
169168

170169
foreach (var tag in this.Tags)
171170
{
172-
if (ZipkinTagTransformer.Instance.TryTransformTag(tag, out var result))
173-
{
174-
writer.WriteString(tag.Key, result);
175-
}
171+
ZipkinTagWriter.Instance.TryWriteTag(ref writer, tag);
176172
}
177173
}
178174
finally

src/OpenTelemetry.Exporter.Zipkin/Implementation/ZipkinTagTransformer.cs

-37
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#nullable enable
5+
6+
using System.Buffers.Text;
7+
using System.Globalization;
8+
using System.Text.Json;
9+
using OpenTelemetry.Internal;
10+
11+
namespace OpenTelemetry.Exporter.Zipkin.Implementation;
12+
13+
internal sealed class ZipkinTagWriter : JsonStringArrayTagWriter<Utf8JsonWriter>
14+
{
15+
public const int StackallocByteThreshold = 256;
16+
17+
private ZipkinTagWriter()
18+
{
19+
}
20+
21+
public static ZipkinTagWriter Instance { get; } = new();
22+
23+
protected override void WriteIntegralTag(ref Utf8JsonWriter writer, string key, long value)
24+
{
25+
Span<byte> destination = stackalloc byte[StackallocByteThreshold];
26+
if (Utf8Formatter.TryFormat(value, destination, out int bytesWritten))
27+
{
28+
writer.WriteString(key, destination.Slice(0, bytesWritten));
29+
}
30+
else
31+
{
32+
writer.WriteString(key, value.ToString(CultureInfo.InvariantCulture));
33+
}
34+
}
35+
36+
protected override void WriteFloatingPointTag(ref Utf8JsonWriter writer, string key, double value)
37+
{
38+
Span<byte> destination = stackalloc byte[StackallocByteThreshold];
39+
if (Utf8Formatter.TryFormat(value, destination, out int bytesWritten))
40+
{
41+
writer.WriteString(key, destination.Slice(0, bytesWritten));
42+
}
43+
else
44+
{
45+
writer.WriteString(key, value.ToString(CultureInfo.InvariantCulture));
46+
}
47+
}
48+
49+
protected override void WriteBooleanTag(ref Utf8JsonWriter writer, string key, bool value)
50+
=> writer.WriteString(key, value ? "true" : "false");
51+
52+
protected override void WriteStringTag(ref Utf8JsonWriter writer, string key, string value)
53+
=> writer.WriteString(key, value);
54+
55+
protected override void WriteArrayTag(ref Utf8JsonWriter writer, string key, ArraySegment<byte> arrayUtf8JsonBytes)
56+
{
57+
writer.WritePropertyName(key);
58+
writer.WriteStringValue(arrayUtf8JsonBytes);
59+
}
60+
61+
protected override void OnUnsupportedTagDropped(
62+
string tagKey,
63+
string tagValueTypeFullName)
64+
{
65+
ZipkinExporterEventSource.Log.UnsupportedAttributeType(
66+
tagValueTypeFullName,
67+
tagKey);
68+
}
69+
}

src/OpenTelemetry.Exporter.Zipkin/OpenTelemetry.Exporter.Zipkin.csproj

+1-2
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@
2323
<Compile Include="$(RepoRoot)\src\Shared\Shims\NullableAttributes.cs" Link="Includes\Shims\NullableAttributes.cs" />
2424
<Compile Include="$(RepoRoot)\src\Shared\SpanAttributeConstants.cs" Link="Includes\SpanAttributeConstants.cs" />
2525
<Compile Include="$(RepoRoot)\src\Shared\StatusHelper.cs" Link="Includes\StatusHelper.cs" />
26-
<Compile Include="$(RepoRoot)\src\Shared\TagTransformer.cs" Link="Includes\TagTransformer.cs" />
27-
<Compile Include="$(RepoRoot)\src\Shared\TagTransformerJsonHelper.cs" Link="Includes\TagTransformerJsonHelper.cs" />
26+
<Compile Include="$(RepoRoot)\src\Shared\TagWriter\*.cs" Link="Includes\TagWriter\%(Filename).cs" />
2827
</ItemGroup>
2928

3029
<ItemGroup>

0 commit comments

Comments
 (0)