This is an automated email from the ASF dual-hosted git repository.
ptupitsyn pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push:
new 9ba717a670 IGNITE-20266 .NET: Fix MetricsTests flakiness (#2516)
9ba717a670 is described below
commit 9ba717a670927c785c12a640e899367e2bc8103f
Author: Pavel Tupitsyn <[email protected]>
AuthorDate: Wed Aug 30 16:19:27 2023 +0300
IGNITE-20266 .NET: Fix MetricsTests flakiness (#2516)
Add `AssertMetric` for reliable and succinct checks.
---
.../dotnet/Apache.Ignite.Tests/MetricsTests.cs | 167 ++++++++++-----------
1 file changed, 79 insertions(+), 88 deletions(-)
diff --git a/modules/platforms/dotnet/Apache.Ignite.Tests/MetricsTests.cs
b/modules/platforms/dotnet/Apache.Ignite.Tests/MetricsTests.cs
index 501fb2e362..95d6fba8f1 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Tests/MetricsTests.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Tests/MetricsTests.cs
@@ -20,7 +20,6 @@ namespace Apache.Ignite.Tests;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
-using System.Diagnostics.CodeAnalysis;
using System.Diagnostics.Metrics;
using System.Linq;
using System.Runtime.CompilerServices;
@@ -42,18 +41,9 @@ public class MetricsTests
[TearDown]
public void TearDown()
{
- // ReSharper disable AccessToDisposedClosure
- TestUtils.WaitForCondition(
- () => _listener.GetMetric("requests-active") == 0,
- 3000,
- () => "requests-active: " +
_listener.GetMetric("requests-active"));
-
- TestUtils.WaitForCondition(
- () => _listener.GetMetric("connections-active") == 0,
- 3000,
- () => "connections-active: " +
_listener.GetMetric("connections-active"));
+ AssertMetric("requests-active", 0);
+ AssertMetric("connections-active", 0);
- // ReSharper restore AccessToDisposedClosure
_listener.Dispose();
}
@@ -65,20 +55,20 @@ public class MetricsTests
{
using var server = new FakeServer();
- Assert.AreEqual(0, _listener.GetMetric("connections-established"));
- Assert.AreEqual(0, _listener.GetMetric("connections-active"));
+ AssertMetric("connections-established", 0);
+ AssertMetric("connections-active", 0);
using (await server.ConnectClientAsync())
{
- Assert.AreEqual(1, _listener.GetMetric("connections-established"));
- Assert.AreEqual(1, _listener.GetMetric("connections-active"));
+ AssertMetric("connections-established", 1);
+ AssertMetric("connections-active", 1);
}
- Assert.AreEqual(0, _listener.GetMetric("connections-active"));
+ AssertMetric("connections-active", 0);
(await server.ConnectClientAsync()).Dispose();
- Assert.AreEqual(2, _listener.GetMetric("connections-established"));
- Assert.AreEqual(0, _listener.GetMetric("connections-active"));
+ AssertMetric("connections-established", 2);
+ AssertMetric("connections-active", 0);
}
[Test]
@@ -86,53 +76,43 @@ public class MetricsTests
{
using var server = new FakeServer();
- Assert.AreEqual(0, _listener.GetMetric("bytes-sent"));
- Assert.AreEqual(0, _listener.GetMetric("bytes-received"));
+ AssertMetric("bytes-sent", 0);
+ AssertMetric("bytes-received", 0);
using var client = await server.ConnectClientAsync();
- Assert.AreEqual(11, _listener.GetMetric("bytes-sent"));
- Assert.AreEqual(63, _listener.GetMetric("bytes-received"));
+ AssertMetric("bytes-sent", 11);
+ AssertMetric("bytes-received", 63);
await client.Tables.GetTablesAsync();
- Assert.AreEqual(17, _listener.GetMetric("bytes-sent"));
- Assert.AreEqual(73, _listener.GetMetric("bytes-received"));
+ AssertMetric("bytes-sent", 17);
+ AssertMetric("bytes-received", 73);
}
[Test]
- [SuppressMessage("ReSharper", "AccessToDisposedClosure", Justification =
"Reviewed.")]
public async Task TestConnectionsLost()
{
using var server = new FakeServer();
using var client = await server.ConnectClientAsync(GetConfig());
- Assert.AreEqual(0, _listener.GetMetric("connections-lost"));
- Assert.AreEqual(0, _listener.GetMetric("connections-lost-timeout"));
+ AssertMetric("connections-lost", 0);
+ AssertMetric("connections-lost-timeout", 0);
server.Dispose();
- TestUtils.WaitForCondition(
- () => _listener.GetMetric("connections-lost") == 1,
- 1000,
- () => "connections-lost: " +
_listener.GetMetric("connections-lost"));
-
- Assert.AreEqual(0, _listener.GetMetric("connections-lost-timeout"));
+ AssertMetric("connections-lost", 1);
+ AssertMetric("connections-lost-timeout", 0);
}
[Test]
- [SuppressMessage("ReSharper", "AccessToDisposedClosure", Justification =
"Reviewed.")]
public async Task TestConnectionsLostTimeout()
{
using var server = new FakeServer { HeartbeatDelay =
TimeSpan.FromSeconds(3) };
using var client = await
server.ConnectClientAsync(GetConfigWithDelay());
- Assert.AreEqual(0, _listener.GetMetric("connections-lost-timeout"));
-
- TestUtils.WaitForCondition(
- () => _listener.GetMetric("connections-lost-timeout") == 1,
- 10000,
- () => "connections-lost-timeout: " +
_listener.GetMetric("connections-lost-timeout"));
+ AssertMetric("connections-lost-timeout", 0);
+ AssertMetric("connections-lost-timeout", 1, timeoutMs: 10_000);
}
[Test]
@@ -141,8 +121,8 @@ public class MetricsTests
using var server = new FakeServer { SendInvalidMagic = true };
Assert.ThrowsAsync<IgniteClientConnectionException>(async () => await
server.ConnectClientAsync(GetConfig()));
- Assert.AreEqual(1, _listener.GetMetric("handshakes-failed"));
- Assert.AreEqual(0, _listener.GetMetric("handshakes-failed-timeout"));
+ AssertMetric("handshakes-failed", 1);
+ AssertMetric("handshakes-failed-timeout", 0);
}
[Test]
@@ -151,8 +131,8 @@ public class MetricsTests
using var server = new FakeServer { HandshakeDelay =
TimeSpan.FromSeconds(1) };
Assert.ThrowsAsync<IgniteClientConnectionException>(async () => await
server.ConnectClientAsync(GetConfigWithDelay()));
- Assert.AreEqual(0, _listener.GetMetric("handshakes-failed"));
- Assert.AreEqual(1, _listener.GetMetric("handshakes-failed-timeout"));
+ AssertMetric("handshakes-failed", 0);
+ AssertMetric("handshakes-failed-timeout", 1);
}
[Test]
@@ -161,21 +141,21 @@ public class MetricsTests
using var server = new FakeServer();
using var client = await server.ConnectClientAsync();
- Assert.AreEqual(0, _listener.GetMetric("requests-sent"));
- Assert.AreEqual(0, _listener.GetMetric("requests-failed"));
- Assert.AreEqual(0, _listener.GetMetric("requests-completed"));
+ AssertMetric("requests-sent", 0);
+ AssertMetric("requests-failed", 0);
+ AssertMetric("requests-completed", 0);
await client.Tables.GetTablesAsync();
- Assert.AreEqual(1, _listener.GetMetric("requests-sent"));
- Assert.AreEqual(0, _listener.GetMetric("requests-failed"));
- Assert.AreEqual(1, _listener.GetMetric("requests-completed"));
+ AssertMetric("requests-sent", 1);
+ AssertMetric("requests-failed", 0);
+ AssertMetric("requests-completed", 1);
Assert.ThrowsAsync<IgniteException>(async () => await
client.Tables.GetTableAsync("bad-table"));
- Assert.AreEqual(2, _listener.GetMetric("requests-sent"));
- Assert.AreEqual(1, _listener.GetMetric("requests-failed"));
- Assert.AreEqual(1, _listener.GetMetric("requests-completed"));
+ AssertMetric("requests-sent", 2);
+ AssertMetric("requests-failed", 1);
+ AssertMetric("requests-completed", 1);
}
[Test]
@@ -184,14 +164,14 @@ public class MetricsTests
using var server = new FakeServer { OperationDelay =
TimeSpan.FromSeconds(1) };
using var client = await server.ConnectClientAsync();
- Assert.AreEqual(0, _listener.GetMetric("requests-active"));
+ AssertMetric("requests-active", 0);
_ = client.Tables.GetTablesAsync();
- Assert.AreEqual(1, _listener.GetMetric("requests-active"));
- Assert.AreEqual(1, _listener.GetMetric("requests-sent"));
- Assert.AreEqual(0, _listener.GetMetric("requests-completed"));
- Assert.AreEqual(0, _listener.GetMetric("requests-failed"));
+ AssertMetric("requests-active", 1);
+ AssertMetric("requests-sent", 1);
+ AssertMetric("requests-completed", 0);
+ AssertMetric("requests-failed", 0);
}
[Test]
@@ -201,10 +181,10 @@ public class MetricsTests
using var client = await server.ConnectClientAsync();
await client.Tables.GetTablesAsync();
- Assert.AreEqual(0, _listener.GetMetric("requests-retried"));
+ AssertMetric("requests-retried", 0);
await client.Tables.GetTablesAsync();
- Assert.AreEqual(3, _listener.GetMetric("requests-retried"));
+ AssertMetric("requests-retried", 3);
}
[Test]
@@ -213,41 +193,40 @@ public class MetricsTests
using var server = new FakeServer();
using var client = await server.ConnectClientAsync();
- Assert.AreEqual(0, _listener.GetMetric("streamer-batches-sent"),
"streamer-batches-sent");
- Assert.AreEqual(0, _listener.GetMetric("streamer-items-sent"),
"streamer-items-sent");
- Assert.AreEqual(0, _listener.GetMetric("streamer-batches-active"),
"streamer-batches-active");
- Assert.AreEqual(0, _listener.GetMetric("streamer-items-queued"),
"streamer-items-queued");
+ AssertMetric("streamer-batches-sent", 0);
+ AssertMetric("streamer-items-sent", 0);
+ AssertMetric("streamer-batches-active", 0);
+ AssertMetric("streamer-items-queued", 0);
var table = await
client.Tables.GetTableAsync(FakeServer.ExistingTableName);
var view = table!.RecordBinaryView;
await view.StreamDataAsync(GetTuples().ToAsyncEnumerable(),
DataStreamerOptions.Default with { BatchSize = 2 });
- Assert.AreEqual(1, _listener.GetMetric("streamer-batches-sent"),
"streamer-batches-sent");
- Assert.AreEqual(2, _listener.GetMetric("streamer-items-sent"),
"streamer-items-sent");
- Assert.AreEqual(0, _listener.GetMetric("streamer-batches-active"),
"streamer-batches-active");
- Assert.AreEqual(0, _listener.GetMetric("streamer-items-queued"),
"streamer-items-queued");
+ AssertMetric("streamer-batches-sent", 1);
+ AssertMetric("streamer-items-sent", 2);
+ AssertMetric("streamer-batches-active", 0);
+ AssertMetric("streamer-items-queued", 0);
IEnumerable<IIgniteTuple> GetTuples()
{
- Assert.AreEqual(0, _listener.GetMetric("streamer-batches-active"),
"streamer-batches-active");
- Assert.AreEqual(0, _listener.GetMetric("streamer-items-queued"),
"streamer-items-queued");
+ AssertMetric("streamer-batches-active", 0);
+ AssertMetric("streamer-items-queued", 0);
yield return new IgniteTuple { ["ID"] = 1 };
- Assert.AreEqual(1, _listener.GetMetric("streamer-batches-active"),
"streamer-batches-active");
- Assert.AreEqual(1, _listener.GetMetric("streamer-items-queued"),
"streamer-items-queued");
+ AssertMetric("streamer-batches-active", 1);
+ AssertMetric("streamer-items-queued", 1);
yield return new IgniteTuple { ["ID"] = 2 };
- Assert.AreEqual(2, _listener.GetMetric("streamer-batches-active"),
"streamer-batches-active");
- Assert.AreEqual(2, _listener.GetMetric("streamer-items-queued"),
"streamer-items-queued");
-
- TestUtils.WaitForCondition(() =>
_listener.GetMetric("streamer-batches-sent") == 1);
+ AssertMetric("streamer-batches-active", 2);
+ AssertMetric("streamer-items-queued", 2);
- Assert.AreEqual(1, _listener.GetMetric("streamer-batches-active"),
"streamer-batches-active");
- Assert.AreEqual(0, _listener.GetMetric("streamer-items-queued"),
"streamer-items-queued");
- Assert.AreEqual(2, _listener.GetMetric("streamer-items-sent"),
"streamer-items-sent");
+ AssertMetric("streamer-batches-sent", 1);
+ AssertMetric("streamer-batches-active", 1);
+ AssertMetric("streamer-items-queued", 0);
+ AssertMetric("streamer-items-sent", 2);
}
}
@@ -257,10 +236,10 @@ public class MetricsTests
using var server = new FakeServer();
using var client = await server.ConnectClientAsync();
- Assert.AreEqual(0, _listener.GetMetric("streamer-batches-sent"),
"streamer-batches-sent");
- Assert.AreEqual(0, _listener.GetMetric("streamer-items-sent"),
"streamer-items-sent");
- Assert.AreEqual(0, _listener.GetMetric("streamer-batches-active"),
"streamer-batches-active");
- Assert.AreEqual(0, _listener.GetMetric("streamer-items-queued"),
"streamer-items-queued");
+ AssertMetric("streamer-batches-sent", 0);
+ AssertMetric("streamer-items-sent", 0);
+ AssertMetric("streamer-batches-active", 0);
+ AssertMetric("streamer-items-queued", 0);
var table = await
client.Tables.GetTableAsync(FakeServer.ExistingTableName);
var view = table!.RecordBinaryView;
@@ -268,13 +247,13 @@ public class MetricsTests
var task = view.StreamDataAsync(GetTuples(),
DataStreamerOptions.Default with { BatchSize = 10 }, cts.Token);
- TestUtils.WaitForCondition(() =>
_listener.GetMetric("streamer-batches-sent") > 0);
+ AssertMetricGreaterOrEqual("streamer-batches-sent", 1);
cts.Cancel();
Assert.CatchAsync<OperationCanceledException>(async () => await task);
- Assert.GreaterOrEqual(_listener.GetMetric("streamer-batches-sent"), 1,
"streamer-batches-sent");
- Assert.AreEqual(0, _listener.GetMetric("streamer-batches-active"),
"streamer-batches-active");
- Assert.AreEqual(0, _listener.GetMetric("streamer-items-queued"),
"streamer-items-queued");
+ AssertMetricGreaterOrEqual("streamer-batches-sent", 2);
+ AssertMetric("streamer-batches-active", 0);
+ AssertMetric("streamer-items-queued", 0);
static async IAsyncEnumerable<IIgniteTuple>
GetTuples([EnumeratorCancellation] CancellationToken ct = default)
{
@@ -305,6 +284,18 @@ public class MetricsTests
RetryPolicy = new RetryNonePolicy()
};
+ private void AssertMetric(string name, int value, int timeoutMs = 1000) =>
+ TestUtils.WaitForCondition(
+ condition: () => _listener.GetMetric(name) == value,
+ timeoutMs: timeoutMs,
+ messageFactory: () => $"{name}: expected '{value}', but was
'{_listener.GetMetric(name)}'");
+
+ private void AssertMetricGreaterOrEqual(string name, int value, int
timeoutMs = 1000) =>
+ TestUtils.WaitForCondition(
+ condition: () => _listener.GetMetric(name) >= value,
+ timeoutMs: timeoutMs,
+ messageFactory: () => $"{name}: expected '>= {value}', but was
'{_listener.GetMetric(name)}'");
+
private sealed class Listener : IDisposable
{
private readonly MeterListener _listener = new();