< Summary

Information
Class: OpenAiIntegration.LangfuseActivityPropagation
Assembly: OpenAiIntegration
File(s): /home/runner/work/KicktippAi/KicktippAi/src/OpenAiIntegration/LangfuseActivityPropagation.cs
Line coverage
92%
Covered lines: 35
Uncovered lines: 3
Coverable lines: 38
Total lines: 97
Line coverage: 92.1%
Branch coverage
89%
Covered branches: 25
Total branches: 28
Branch coverage: 89.2%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
SetEnvironment(...)100%11100%
SetSessionId(...)100%11100%
SetTraceTags(...)100%44100%
SetTraceMetadata(...)100%88100%
GetObservationMetadata(...)83.33%7675%
ClearTraceMetadata(...)50%2275%
RegisterTraceMetadata(...)75%4483.33%
SetTagAndBaggage(...)100%44100%

File(s)

/home/runner/work/KicktippAi/KicktippAi/src/OpenAiIntegration/LangfuseActivityPropagation.cs

#LineLine coverage
 1using System.Diagnostics;
 2using System.Collections.Concurrent;
 3using System.Text.Json;
 4
 5namespace OpenAiIntegration;
 6
 7/// <summary>
 8/// Utilities for propagating shared Langfuse trace context from a root activity to child observations.
 9/// </summary>
 10public static class LangfuseActivityPropagation
 11{
 112    private static readonly ConcurrentDictionary<string, ConcurrentDictionary<string, string>> TraceMetadataByTraceId = 
 13
 14    public static void SetEnvironment(Activity? activity, string? environment)
 15    {
 116        SetTagAndBaggage(activity, "langfuse.environment", environment);
 117    }
 18
 19    public static void SetSessionId(Activity? activity, string? sessionId)
 20    {
 121        SetTagAndBaggage(activity, "langfuse.session.id", sessionId);
 122    }
 23
 24    public static void SetTraceTags(Activity? activity, IReadOnlyCollection<string> tags)
 25    {
 126        if (activity is null || tags.Count == 0)
 27        {
 128            return;
 29        }
 30
 131        var serializedTags = JsonSerializer.Serialize(tags);
 132        SetTagAndBaggage(activity, "langfuse.trace.tags", serializedTags);
 133    }
 34
 35    public static void SetTraceMetadata(Activity? activity, string metadataKey, string? value, bool propagateToObservati
 36    {
 137        if (activity is null || string.IsNullOrWhiteSpace(metadataKey) || string.IsNullOrWhiteSpace(value))
 38        {
 139            return;
 40        }
 41
 142        activity.SetTag($"langfuse.trace.metadata.{metadataKey}", value);
 43
 144        if (propagateToObservations)
 45        {
 146            activity.AddBaggage($"langfuse.observation.metadata.{metadataKey}", value);
 147            RegisterTraceMetadata(activity, metadataKey, value);
 48        }
 149    }
 50
 51    public static IEnumerable<KeyValuePair<string, string>> GetObservationMetadata(Activity activity)
 52    {
 153        if (activity.TraceId == default)
 54        {
 055            return [];
 56        }
 57
 158        return TraceMetadataByTraceId.TryGetValue(activity.TraceId.ToString(), out var metadata)
 159            ? metadata.Select(pair => new KeyValuePair<string, string>($"langfuse.observation.metadata.{pair.Key}", pair
 160            : [];
 61    }
 62
 63    public static void ClearTraceMetadata(Activity activity)
 64    {
 165        if (activity.TraceId == default)
 66        {
 067            return;
 68        }
 69
 170        TraceMetadataByTraceId.TryRemove(activity.TraceId.ToString(), out _);
 171    }
 72
 73    private static void RegisterTraceMetadata(Activity activity, string metadataKey, string value)
 74    {
 175        if (activity.TraceId == default)
 76        {
 077            return;
 78        }
 79
 180        var traceMetadata = TraceMetadataByTraceId.GetOrAdd(
 181            activity.TraceId.ToString(),
 182            _ => new ConcurrentDictionary<string, string>(StringComparer.Ordinal));
 83
 184        traceMetadata[metadataKey] = value;
 185    }
 86
 87    private static void SetTagAndBaggage(Activity? activity, string attributeName, string? value)
 88    {
 189        if (activity is null || string.IsNullOrWhiteSpace(value))
 90        {
 191            return;
 92        }
 93
 194        activity.SetTag(attributeName, value);
 195        activity.AddBaggage(attributeName, value);
 196    }
 97}