Skip to content

Commit

Permalink
Merge pull request #78 from snakefoot/dev
Browse files Browse the repository at this point in the history
Skip TraceId when when default value
  • Loading branch information
nblumhardt authored May 11, 2024
2 parents c30c3c7 + 40768af commit bd5594d
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 55 deletions.
66 changes: 66 additions & 0 deletions src/NLog.Targets.Seq/ActivityExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
// Seq Target for NLog - Copyright 2014-2020 Datalust and contributors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

using System.Diagnostics;

namespace NLog.Targets.Seq
{
/// <summary>
/// Formats elements of <see cref="Activity.Current"/> for inclusion in log events. Non-W3C-format activities are
/// ignored (Seq does not support the older Microsoft-proprietary hierarchical activity id format).
/// </summary>
internal static class ActivityExtensions
{
private static readonly System.Diagnostics.ActivitySpanId EmptySpanId = default(System.Diagnostics.ActivitySpanId);
private static readonly System.Diagnostics.ActivityTraceId EmptyTraceId = default(System.Diagnostics.ActivityTraceId);

public static string GetSpanId(this Activity activity)
{
return activity.IdFormat == ActivityIdFormat.W3C ?
SpanIdToHexString(activity.SpanId) :
string.Empty;
}

public static string GetTraceId(this Activity activity)
{
return activity.IdFormat == ActivityIdFormat.W3C ?
TraceIdToHexString(activity.TraceId) :
string.Empty;
}

private static string SpanIdToHexString(ActivitySpanId spanId)
{
if (EmptySpanId.Equals(spanId))
return string.Empty;

var spanHexString = spanId.ToHexString();
if (ReferenceEquals(spanHexString, EmptySpanId.ToHexString()))
return string.Empty;

return spanHexString;
}

private static string TraceIdToHexString(ActivityTraceId traceId)
{
if (EmptyTraceId.Equals(traceId))
return string.Empty;

var traceHexString = traceId.ToHexString();
if (ReferenceEquals(traceHexString, EmptyTraceId.ToHexString()))
return string.Empty;

return traceHexString;
}
}
}
4 changes: 2 additions & 2 deletions src/NLog.Targets.Seq/Layouts/CompactJsonLayout.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ readonly JsonAttribute
_exceptionAttribute = new("@x", new SimpleLayout("${exception:format=toString}")),
_messageAttribute = new("@m", new FormattedMessageLayout()),
_messageTemplateAttribute = new("@mt", new SimpleLayout("${onhasproperties:${message:raw=true}}")),
_traceIdAttribute = new("@tr", new CurrentW3CActivityLayout(a => a.TraceId.ToHexString())),
_spanIdAttribute = new("@sp", new CurrentW3CActivityLayout(a => a.SpanId.ToHexString()));
_traceIdAttribute = new("@tr", Layout.FromMethod(evt => System.Diagnostics.Activity.Current?.GetTraceId())),
_spanIdAttribute = new("@sp", Layout.FromMethod(evt => System.Diagnostics.Activity.Current?.GetSpanId()));

public Layout LogLevel { get => _levelAttribute.Layout; set => _levelAttribute.Layout = value; }

Expand Down
45 changes: 0 additions & 45 deletions src/NLog.Targets.Seq/Layouts/CurrentW3CActivityLayout.cs

This file was deleted.

22 changes: 14 additions & 8 deletions test/NLog.Targets.Seq.Tests/SeqTargetTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -204,17 +204,23 @@ public void TraceAndSpanIdAreIgnoredWhenMissing()
Assert.False(evt.ContainsKey("@tr"));
Assert.False(evt.ContainsKey("@sp"));
}

[Fact]
public void TraceAndSpanIdAreCollectedWhenPresent()
public void TraceAndSpanIdAreIgnoredWhenEmpty()
{
using var listener = new ActivityListener();
listener.ShouldListenTo = _ => true;
listener.Sample = delegate { return ActivitySamplingResult.AllData; };
ActivitySource.AddActivityListener(listener);
using var activity = new Activity("child").SetParentId(default, default).Start(); // TraceId comes from the Parent-Activity
Assert.NotNull(Activity.Current);

var evt = AssertValidJson(log => log.Info("Hello"));
Assert.False(evt.ContainsKey("@tr"));
Assert.Equal(activity.SpanId.ToHexString(), (string)evt["@sp"]);
}

var source = new ActivitySource("Example");
using var activity = source.StartActivity()!;
[Fact]
public void TraceAndSpanIdAreCollectedWhenPresent()
{
using var activity = new Activity("Example").Start();
Assert.NotNull(Activity.Current);

dynamic evt = AssertValidJson(log => log.Info("Hello"));

Expand Down

0 comments on commit bd5594d

Please sign in to comment.