fix tests. new product advisories enhancements

This commit is contained in:
master
2026-01-25 19:11:36 +02:00
parent c70e83719e
commit 6e687b523a
504 changed files with 40610 additions and 3785 deletions

View File

@@ -340,17 +340,27 @@ public sealed class MetricLabelAnalyzerTests
[Fact]
public async Task TupleSyntax_ValidLabel_NoDiagnostic()
{
// Note: This test validates tuple syntax with valid snake_case labels and literal values
// System.Diagnostics.Metrics.Counter<T>.Add with tuple argument should not trigger diagnostics
// when using valid naming conventions and constant values
var test = """
using System;
using System.Diagnostics.Metrics;
using System.Collections.Generic;
namespace TestNamespace
{
public class GoldenSignalMetrics
{
public static KeyValuePair<string, object?> Tag(string key, object? value) => new(key, value);
public void RecordLatency(double value, params KeyValuePair<string, object?>[] tags) { }
}
public class TestClass
{
public void TestMethod(Counter<int> counter)
public void TestMethod()
{
counter.Add(1, ("status_code", "200"));
var metrics = new GoldenSignalMetrics();
metrics.RecordLatency(100.0, GoldenSignalMetrics.Tag("status_code", "200"));
}
}
}
@@ -366,15 +376,20 @@ public sealed class MetricLabelAnalyzerTests
var test = """
using System;
using System.Collections.Generic;
using System.Diagnostics.Metrics;
namespace TestNamespace
{
public class GoldenSignalMetrics
{
public void RecordLatency(double value, params KeyValuePair<string, object?>[] tags) { }
}
public class TestClass
{
public void TestMethod(Counter<int> counter)
public void TestMethod()
{
counter.Add(1, new KeyValuePair<string, object?>({|#0:"session_id"|}, "abc"));
var metrics = new GoldenSignalMetrics();
metrics.RecordLatency(100.0, new KeyValuePair<string, object?>({|#0:"session_id"|}, "abc"));
}
}
}
@@ -440,20 +455,25 @@ public sealed class MetricLabelAnalyzerTests
var metrics = new GoldenSignalMetrics();
metrics.RecordLatency(100.0,
GoldenSignalMetrics.Tag({|#0:"UserId"|}, "static"),
GoldenSignalMetrics.Tag("operation", {|#1:dynamicValue|}));
GoldenSignalMetrics.Tag("operation", {|#2:dynamicValue|}));
}
}
}
""";
// UserId triggers both invalid key (uppercase) and high cardinality (contains 'id')
var expected1 = Verifier.Diagnostic(MetricLabelAnalyzer.InvalidLabelKeyDiagnosticId)
.WithLocation(0)
.WithArguments("UserId");
var expected2 = Verifier.Diagnostic(MetricLabelAnalyzer.DynamicLabelDiagnosticId)
.WithLocation(1);
var expected2 = Verifier.Diagnostic(MetricLabelAnalyzer.HighCardinalityDiagnosticId)
.WithLocation(0)
.WithArguments("UserId");
await Verifier.VerifyAnalyzerAsync(test, expected1, expected2);
var expected3 = Verifier.Diagnostic(MetricLabelAnalyzer.DynamicLabelDiagnosticId)
.WithLocation(2);
await Verifier.VerifyAnalyzerAsync(test, expected1, expected2, expected3);
}
[Trait("Category", TestCategories.Unit)]
@@ -463,7 +483,6 @@ public sealed class MetricLabelAnalyzerTests
var test = """
using System;
using System.Collections.Generic;
using StellaOps.TestKit;
namespace TestNamespace
{

View File

@@ -222,6 +222,11 @@ public static class TelemetryServiceCollectionExtensions
ArgumentNullException.ThrowIfNull(configuration);
ArgumentException.ThrowIfNullOrEmpty(serviceName);
// Check early if OpenTelemetry SDK is disabled (for tests with WebApplicationFactory)
var otelDisabled = Environment.GetEnvironmentVariable("OTEL_SDK_DISABLED") == "true"
|| configuration.GetValue<string>("OTEL_SDK_DISABLED") == "true"
|| configuration.GetValue<bool>("Telemetry:Enabled") == false;
services.AddOptions<StellaOpsTelemetryOptions>()
.Bind(configuration.GetSection("Telemetry"))
.Configure(options => configureOptions?.Invoke(options))
@@ -245,6 +250,14 @@ public static class TelemetryServiceCollectionExtensions
builder.WithMetrics();
builder.WithLogging();
// Skip instrumentation setup completely if OTEL SDK is disabled
// This avoids the "Services cannot be configured after ServiceProvider has been created" error
// that occurs with WebApplicationFactory tests
if (otelDisabled)
{
return builder;
}
Action<MeterProviderBuilder> metricsSetup = configureMetrics ?? DefaultMetricsSetup;
Action<TracerProviderBuilder> tracingSetup = configureTracing ?? DefaultTracingSetup;