Skip to content

Commit 40a1635

Browse files
authored
test(metrics): Trace-connected Metrics (Tests) (#4839)
1 parent 6f3a785 commit 40a1635

11 files changed

Lines changed: 1565 additions & 2 deletions

test/Sentry.Tests/Extensibility/DisabledHubTests.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,8 @@ public void CaptureEvent_EmptyGuid()
3939
[Fact]
4040
public void Logger_IsDisabled()
4141
=> Assert.IsType<DisabledSentryStructuredLogger>(DisabledHub.Instance.Logger);
42+
43+
[Fact]
44+
public void Metrics_IsDisabled()
45+
=> Assert.IsType<DisabledSentryTraceMetrics>(DisabledHub.Instance.Metrics);
4246
}

test/Sentry.Tests/Extensibility/HubAdapterTests.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,18 @@ public void Logger_MockInvoked()
8282
element => element.AssertEqual(SentryLogLevel.Warning, "Message"));
8383
}
8484

85+
[Fact]
86+
public void Metrics_MockInvoked()
87+
{
88+
var metrics = new InMemorySentryTraceMetrics();
89+
Hub.Metrics.Returns(metrics);
90+
91+
HubAdapter.Instance.Metrics.EmitCounter("sentry_tests.hub_adapter_tests.counter", 1);
92+
93+
Assert.Collection(metrics.Entries,
94+
element => element.AssertEqual(SentryMetricType.Counter, "sentry_tests.hub_adapter_tests.counter", 1));
95+
}
96+
8597
[Fact]
8698
public void EndSession_CrashedStatus_MockInvoked()
8799
{

test/Sentry.Tests/HubTests.cs

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1879,6 +1879,124 @@ public void Logger_Dispose_DoesCaptureLog()
18791879
hub.Logger.Should().BeOfType<DefaultSentryStructuredLogger>();
18801880
}
18811881

1882+
[Fact]
1883+
public void Metrics_IsDisabled_DoesNotCaptureMetric()
1884+
{
1885+
// Arrange
1886+
_fixture.Options.Experimental.EnableMetrics = false;
1887+
var hub = _fixture.GetSut();
1888+
1889+
// Act
1890+
hub.Metrics.EmitCounter("sentry_tests.hub_tests.counter", 1);
1891+
hub.Metrics.Flush();
1892+
1893+
// Assert
1894+
_fixture.Client.Received(0).CaptureEnvelope(
1895+
Arg.Is<Envelope>(envelope =>
1896+
envelope.Items.Single(item => item.Header["type"].Equals("trace_metric")).Payload.GetType().IsAssignableFrom(typeof(JsonSerializable))
1897+
)
1898+
);
1899+
hub.Metrics.Should().BeOfType<DisabledSentryTraceMetrics>();
1900+
}
1901+
1902+
[Fact]
1903+
public void Metrics_IsEnabled_DoesCaptureMetric()
1904+
{
1905+
// Arrange
1906+
Assert.True(_fixture.Options.Experimental.EnableMetrics);
1907+
var hub = _fixture.GetSut();
1908+
1909+
// Act
1910+
hub.Metrics.EmitCounter("sentry_tests.hub_tests.counter", 1);
1911+
hub.Metrics.Flush();
1912+
1913+
// Assert
1914+
_fixture.Client.Received(1).CaptureEnvelope(
1915+
Arg.Is<Envelope>(envelope =>
1916+
envelope.Items.Single(item => item.Header["type"].Equals("trace_metric")).Payload.GetType().IsAssignableFrom(typeof(JsonSerializable))
1917+
)
1918+
);
1919+
hub.Metrics.Should().BeOfType<DefaultSentryTraceMetrics>();
1920+
}
1921+
1922+
[Fact]
1923+
public void Metrics_EnableAfterCreate_HasNoEffect()
1924+
{
1925+
// Arrange
1926+
_fixture.Options.Experimental.EnableMetrics = false;
1927+
var hub = _fixture.GetSut();
1928+
1929+
// Act
1930+
_fixture.Options.Experimental.EnableMetrics = true;
1931+
1932+
// Assert
1933+
hub.Metrics.Should().BeOfType<DisabledSentryTraceMetrics>();
1934+
}
1935+
1936+
[Fact]
1937+
public void Metrics_DisableAfterCreate_HasNoEffect()
1938+
{
1939+
// Arrange
1940+
Assert.True(_fixture.Options.Experimental.EnableMetrics);
1941+
var hub = _fixture.GetSut();
1942+
1943+
// Act
1944+
_fixture.Options.Experimental.EnableMetrics = false;
1945+
1946+
// Assert
1947+
hub.Metrics.Should().BeOfType<DefaultSentryTraceMetrics>();
1948+
}
1949+
1950+
[Fact]
1951+
public async Task Metrics_FlushAsync_DoesCaptureMetric()
1952+
{
1953+
// Arrange
1954+
Assert.True(_fixture.Options.Experimental.EnableMetrics);
1955+
var hub = _fixture.GetSut();
1956+
1957+
// Act
1958+
hub.Metrics.EmitCounter("sentry_tests.hub_tests.counter", 1);
1959+
await hub.FlushAsync();
1960+
1961+
// Assert
1962+
_fixture.Client.Received(1).CaptureEnvelope(
1963+
Arg.Is<Envelope>(envelope =>
1964+
envelope.Items.Single(item => item.Header["type"].Equals("trace_metric")).Payload.GetType().IsAssignableFrom(typeof(JsonSerializable))
1965+
)
1966+
);
1967+
await _fixture.Client.Received(1).FlushAsync(
1968+
Arg.Is<TimeSpan>(timeout =>
1969+
timeout.Equals(_fixture.Options.FlushTimeout)
1970+
)
1971+
);
1972+
hub.Metrics.Should().BeOfType<DefaultSentryTraceMetrics>();
1973+
}
1974+
1975+
[Fact]
1976+
public void Metrics_Dispose_DoesCaptureMetric()
1977+
{
1978+
// Arrange
1979+
Assert.True(_fixture.Options.Experimental.EnableMetrics);
1980+
var hub = _fixture.GetSut();
1981+
1982+
// Act
1983+
hub.Metrics.EmitCounter("sentry_tests.hub_tests.counter", 1);
1984+
hub.Dispose();
1985+
1986+
// Assert
1987+
_fixture.Client.Received(1).CaptureEnvelope(
1988+
Arg.Is<Envelope>(envelope =>
1989+
envelope.Items.Single(item => item.Header["type"].Equals("trace_metric")).Payload.GetType().IsAssignableFrom(typeof(JsonSerializable))
1990+
)
1991+
);
1992+
_fixture.Client.Received(1).FlushAsync(
1993+
Arg.Is<TimeSpan>(timeout =>
1994+
timeout.Equals(_fixture.Options.ShutdownTimeout)
1995+
)
1996+
);
1997+
hub.Metrics.Should().BeOfType<DefaultSentryTraceMetrics>();
1998+
}
1999+
18822000
[Fact]
18832001
public void Dispose_IsEnabled_SetToFalse()
18842002
{
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
namespace Sentry.Tests.Protocol;
2+
3+
/// <summary>
4+
/// See <see href="https://develop.sentry.dev/sdk/telemetry/metrics/"/>.
5+
/// See also <see cref="Sentry.Tests.SentryMetricTests"/>.
6+
/// </summary>
7+
public class TraceMetricTests
8+
{
9+
private readonly TestOutputDiagnosticLogger _output;
10+
11+
public TraceMetricTests(ITestOutputHelper output)
12+
{
13+
_output = new TestOutputDiagnosticLogger(output);
14+
}
15+
16+
[Fact]
17+
public void Type_IsAssignableFrom_ISentryJsonSerializable()
18+
{
19+
var metric = new TraceMetric([]);
20+
21+
Assert.IsAssignableFrom<ISentryJsonSerializable>(metric);
22+
}
23+
24+
[Fact]
25+
public void Length_One_Single()
26+
{
27+
var metric = new TraceMetric([CreateMetric()]);
28+
29+
var length = metric.Length;
30+
31+
Assert.Equal(1, length);
32+
}
33+
34+
[Fact]
35+
public void Items_One_Single()
36+
{
37+
var metric = new TraceMetric([CreateMetric()]);
38+
39+
var items = metric.Items;
40+
41+
Assert.Equal(1, items.Length);
42+
}
43+
44+
[Fact]
45+
public void WriteTo_Empty_AsJson()
46+
{
47+
var metric = new TraceMetric([]);
48+
49+
var document = metric.ToJsonDocument(_output);
50+
51+
Assert.Equal("""{"items":[]}""", document.RootElement.ToString());
52+
}
53+
54+
private static SentryMetric<int> CreateMetric()
55+
{
56+
return new SentryMetric<int>(DateTimeOffset.MinValue, SentryId.Empty, SentryMetricType.Counter, "sentry_tests.trace_metric_tests.counter", 1);
57+
}
58+
}

test/Sentry.Tests/SentryLogTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public void Protocol_Default_VerifyAttributes()
3333
var sdk = new SdkVersion
3434
{
3535
Name = "Sentry.Test.SDK",
36-
Version = "1.2.3-test+Sentry"
36+
Version = "1.2.3-test+Sentry",
3737
};
3838

3939
var log = new SentryLog(Timestamp, TraceId, (SentryLogLevel)24, "message")

0 commit comments

Comments
 (0)