Skip to content

Commit e5eeac9

Browse files
committed
Add traceId and spanId properties
1 parent 2857e18 commit e5eeac9

File tree

5 files changed

+55
-4
lines changed

5 files changed

+55
-4
lines changed

Serilog.Sinks.Network.Test/JsonFormatter.cs

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Diagnostics;
23
using System.Net;
34
using System.Net.Sockets;
45
using System.Threading.Tasks;
@@ -11,7 +12,7 @@ namespace Serilog.Sinks.Network.Test
1112
{
1213
public class JsonFormatter
1314
{
14-
private static LoggerAndSocket ConfigureTestLogger(ITextFormatter formatter = null)
15+
private static LoggerAndSocket ConfigureTestLogger(ITextFormatter? formatter = null)
1516
{
1617
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
1718
socket.Bind(new IPEndPoint(IPAddress.Loopback, 0));
@@ -51,5 +52,42 @@ public async Task CanStillLogMessagesWithExceptions()
5152

5253
receivedData.Should().Contain("\"exception\":\"System.Exception: exploding\"}");
5354
}
55+
56+
[Fact]
57+
public async Task IncludesCurrentActivityTraceAndSpanIds()
58+
{
59+
// Create an ActivitySource and start an activity.
60+
// StartActivity() would return null if there were no listeners.
61+
using var activityListener = new ActivityListener
62+
{
63+
ShouldListenTo = _ => true,
64+
Sample = (ref ActivityCreationOptions<ActivityContext> _) => ActivitySamplingResult.AllData,
65+
};
66+
ActivitySource.AddActivityListener(activityListener);
67+
using var activitySource = new ActivitySource("TestSource");
68+
using Activity? activity = activitySource.StartActivity();
69+
70+
using var fixture = ConfigureTestLogger(new LogstashJsonFormatter());
71+
72+
fixture.Logger.Information("arbitraryMessage");
73+
74+
var receivedData = await ServerPoller.PollForReceivedData(fixture.Socket);
75+
76+
receivedData.Should().Contain($"\"traceId\":\"{activity!.TraceId}\"");
77+
receivedData.Should().Contain($"\"spanId\":\"{activity.SpanId}\"");
78+
}
79+
80+
[Fact]
81+
public async Task OmitsTraceAndSpanIdsWhenThereIsNoActivity()
82+
{
83+
using var fixture = ConfigureTestLogger(new LogstashJsonFormatter());
84+
85+
fixture.Logger.Information("arbitraryMessage");
86+
87+
var receivedData = await ServerPoller.PollForReceivedData(fixture.Socket);
88+
89+
receivedData.Should().NotContain("\"traceId\"");
90+
receivedData.Should().NotContain("\"spanId\"");
91+
}
5492
}
5593
}

Serilog.Sinks.Network.Test/Serilog.Sinks.Network.Test.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<PropertyGroup>
44
<TargetFramework>net6.0</TargetFramework>
55
<LangVersion>Preview</LangVersion>
6+
<Nullable>enable</Nullable>
67
</PropertyGroup>
78
<ItemGroup>
89
<PackageReference Include="Serilog.Formatting.Compact" Version="3.0.0" />

Serilog.Sinks.Network.Test/WhenLoggingViaTcp.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace Serilog.Sinks.Network.Test
1515
{
1616
public class WhenLoggingViaTcp
1717
{
18-
private static LoggerAndSocket ConfigureTestLogger(ITextFormatter formatter = null)
18+
private static LoggerAndSocket ConfigureTestLogger(ITextFormatter? formatter = null)
1919
{
2020
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
2121
socket.Bind(new IPEndPoint(IPAddress.Loopback, 0));
@@ -66,7 +66,7 @@ public async Task CanLogWithProperties()
6666
using var fixture = ConfigureTestLogger();
6767
fixture.Logger.Information("TCP Hello {location}", "world");
6868
var receivedData = await ServerPoller.PollForReceivedData(fixture.Socket);
69-
dynamic payload = JsonConvert.DeserializeObject<ExpandoObject>(receivedData);
69+
dynamic? payload = JsonConvert.DeserializeObject<ExpandoObject>(receivedData);
7070
if (payload == null)
7171
{
7272
throw new AssertionFailedException("expected payload not null");

Serilog.Sinks.Network.Test/WhenLoggingViaUdp.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace Serilog.Sinks.Network.Test
1515
{
1616
public class WhenLoggingViaUdp
1717
{
18-
private static LoggerAndSocket ConfigureTestLogger(ITextFormatter formatter = null)
18+
private static LoggerAndSocket ConfigureTestLogger(ITextFormatter? formatter = null)
1919
{
2020
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
2121
socket.Bind(new IPEndPoint(IPAddress.Loopback, 0));

Serilog.Sinks.Network/Formatters/LogstashJsonFormatter.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,18 @@ private static void FormatContent(LogEvent logEvent, TextWriter output)
4747

4848
WritePropertyAndValue(output, "message", logEvent.MessageTemplate.Render(logEvent.Properties));
4949

50+
if (logEvent.TraceId != null)
51+
{
52+
output.Write(",");
53+
WritePropertyAndValue(output, "traceId", logEvent.TraceId.Value.ToString());
54+
}
55+
56+
if (logEvent.SpanId != null)
57+
{
58+
output.Write(",");
59+
WritePropertyAndValue(output, "spanId", logEvent.SpanId.Value.ToString());
60+
}
61+
5062
if (logEvent.Exception != null)
5163
{
5264
output.Write(",");

0 commit comments

Comments
 (0)