Files
aryx/sidecar/tests/Aryx.AgentHost.Tests/OpenTelemetrySetupTests.cs
David KayaandCopilot 3a3e1d5eab fix: correct OTEL instrumentation wiring for agent traces
- Fix ActivitySource name from 'Microsoft.Agents.AI' to
  'Experimental.Microsoft.Agents.AI' matching the Agent Framework default
- Wrap agents with UseOpenTelemetry() via AIAgentBuilder so agent
  invocation spans are emitted to the configured OTLP collector
- Add proper disposal of OpenTelemetryAgent wrappers via
  SyncDisposableAdapter bridging IDisposable to IAsyncDisposable
- Enable workflow-level telemetry on WorkflowRunner custom graph builds
  via WithOpenTelemetry() (HandoffWorkflowBuilder and
  GroupChatWorkflowBuilder do not expose this API — framework limitation)
- Fix settings panel help text to be user-facing instead of dev jargon
- Update test assertion for corrected ActivitySource name

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-16 11:52:13 +02:00

88 lines
3.3 KiB
C#

using Aryx.AgentHost.Services;
using OpenTelemetry.Exporter;
using OpenTelemetry.Trace;
namespace Aryx.AgentHost.Tests;
public sealed class OpenTelemetrySetupTests
{
[Fact]
public void ResolveTracingConfiguration_ReturnsNullWhenEndpointMissing()
{
OpenTelemetryTracingConfiguration? configuration = OpenTelemetrySetup.ResolveTracingConfiguration([]);
Assert.Null(configuration);
}
[Fact]
public void ResolveTracingConfiguration_UsesGrpcByDefault()
{
OpenTelemetryTracingConfiguration? configuration = OpenTelemetrySetup.ResolveTracingConfiguration(
[
new KeyValuePair<string, string?>("OTEL_EXPORTER_OTLP_ENDPOINT", "http://localhost:4317"),
]);
Assert.NotNull(configuration);
Assert.Equal(new Uri("http://localhost:4317"), configuration.Endpoint);
Assert.Equal(OtlpExportProtocol.Grpc, configuration.Protocol);
Assert.Collection(
configuration.ActivitySourceNames,
source => Assert.Equal("Experimental.Microsoft.Agents.AI", source),
source => Assert.Equal("Microsoft.Agents.AI.Workflows", source));
}
[Fact]
public void ResolveTracingConfiguration_UsesHttpProtobufWhenRequested()
{
OpenTelemetryTracingConfiguration? configuration = OpenTelemetrySetup.ResolveTracingConfiguration(
[
new KeyValuePair<string, string?>("OTEL_EXPORTER_OTLP_ENDPOINT", "http://localhost:4318"),
new KeyValuePair<string, string?>("OTEL_EXPORTER_OTLP_PROTOCOL", "http/protobuf"),
]);
Assert.NotNull(configuration);
Assert.Equal(new Uri("http://localhost:4318"), configuration.Endpoint);
Assert.Equal(OtlpExportProtocol.HttpProtobuf, configuration.Protocol);
}
[Fact]
public void ResolveTracingConfiguration_ThrowsWhenEndpointInvalid()
{
InvalidOperationException error = Assert.Throws<InvalidOperationException>(() =>
OpenTelemetrySetup.ResolveTracingConfiguration(
[
new KeyValuePair<string, string?>("OTEL_EXPORTER_OTLP_ENDPOINT", "localhost:4317"),
]));
Assert.Contains("OTEL_EXPORTER_OTLP_ENDPOINT", error.Message, StringComparison.Ordinal);
}
[Fact]
public void ResolveTracingConfiguration_ThrowsWhenProtocolUnsupported()
{
InvalidOperationException error = Assert.Throws<InvalidOperationException>(() =>
OpenTelemetrySetup.ResolveTracingConfiguration(
[
new KeyValuePair<string, string?>("OTEL_EXPORTER_OTLP_ENDPOINT", "http://localhost:4317"),
new KeyValuePair<string, string?>("OTEL_EXPORTER_OTLP_PROTOCOL", "http/json"),
]));
Assert.Contains("OTEL_EXPORTER_OTLP_PROTOCOL", error.Message, StringComparison.Ordinal);
}
[Fact]
public void CreateTracerProvider_CreatesProviderAndWritesDiagnosticsWhenConfigured()
{
StringWriter diagnosticsWriter = new();
using TracerProvider? tracerProvider = OpenTelemetrySetup.CreateTracerProvider(
[
new KeyValuePair<string, string?>("OTEL_EXPORTER_OTLP_ENDPOINT", "http://localhost:4317"),
],
diagnosticsWriter);
Assert.NotNull(tracerProvider);
Assert.Contains("Aryx.AgentHost OpenTelemetry tracing enabled", diagnosticsWriter.ToString(), StringComparison.Ordinal);
}
}