< Summary

Information
Class: Intentum.Observability.ObservableIntentModel
Assembly: Intentum.Observability
File(s): /home/runner/work/Intentum/Intentum/src/Intentum.Observability/ObservableIntentModel.cs
Line coverage
97%
Covered lines: 37
Uncovered lines: 1
Coverable lines: 38
Total lines: 66
Line coverage: 97.3%
Branch coverage
83%
Covered branches: 10
Total branches: 12
Branch coverage: 83.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor(...)100%22100%
Infer(...)100%66100%
GetBehaviorSignalSummary(...)50%4488.88%

File(s)

/home/runner/work/Intentum/Intentum/src/Intentum.Observability/ObservableIntentModel.cs

#LineLine coverage
 1using System.Diagnostics;
 2using Intentum.Core.Behavior;
 3using Intentum.Core.Contracts;
 4using Intentum.Core.Intents;
 5
 6namespace Intentum.Observability;
 7
 8/// <summary>
 9/// Wrapper around IIntentModel that adds observability metrics and OpenTelemetry spans.
 10/// </summary>
 11public sealed class ObservableIntentModel : IIntentModel
 12{
 13    private readonly IIntentModel _innerModel;
 14
 1015    public ObservableIntentModel(IIntentModel innerModel)
 1016    {
 1017        _innerModel = innerModel ?? throw new ArgumentNullException(nameof(innerModel));
 918    }
 19
 20    public Intent Infer(BehaviorSpace behaviorSpace, BehaviorVector? precomputedVector = null)
 921    {
 922        var stopwatch = Stopwatch.StartNew();
 923        using var activity = IntentumActivitySource.Source.StartActivity();
 24
 25        try
 926        {
 927            var intent = _innerModel.Infer(behaviorSpace, precomputedVector);
 28
 729            if (activity != null)
 430            {
 431                activity.DisplayName = IntentumActivitySource.InferSpanName;
 432                activity.SetTag("intentum.intent.name", intent.Name);
 433                activity.SetTag("intentum.intent.confidence.level", intent.Confidence.Level);
 434                activity.SetTag("intentum.intent.confidence.score", intent.Confidence.Score);
 435                activity.SetTag("intentum.intent.signal.count", intent.Signals.Count);
 436                activity.SetTag("intentum.behavior.event.count", behaviorSpace.Events.Count);
 437                var signalSummary = GetBehaviorSignalSummary(behaviorSpace);
 438                if (signalSummary != null)
 439                    activity.SetTag("intentum.behavior.signal_summary", signalSummary);
 440            }
 41
 742            IntentumMetrics.RecordIntentInference(intent, stopwatch.Elapsed);
 743            IntentumMetrics.RecordBehaviorSpaceSize(behaviorSpace);
 44
 745            return intent;
 46        }
 247        catch (Exception ex)
 248        {
 249            activity?.SetStatus(ActivityStatusCode.Error, ex.Message);
 250            throw;
 51        }
 752    }
 53
 54    /// <summary>Builds a short summary of behavior signals for trace correlation (signal → intent).</summary>
 55    private static string? GetBehaviorSignalSummary(BehaviorSpace behaviorSpace)
 456    {
 457        if (behaviorSpace.Events.Count == 0)
 058            return null;
 59        const int maxLen = 200;
 460        var parts = behaviorSpace.Events
 661            .Select(e => $"{e.Actor}:{e.Action}")
 462            .ToList();
 463        var s = string.Join(";", parts);
 464        return s.Length <= maxLen ? s : s[..maxLen] + "...";
 465    }
 66}