cs-codex-dist-tests/CodexDistTestCore/MetricsAccess.cs

64 lines
2.1 KiB
C#
Raw Permalink Normal View History

using NUnit.Framework;
2023-03-29 08:07:16 +00:00
using NUnit.Framework.Constraints;
namespace CodexDistTestCore
2023-03-27 12:49:34 +00:00
{
public interface IMetricsAccess
{
2023-03-31 08:00:44 +00:00
void AssertThat(string metricName, IResolveConstraint constraint, string message = "");
}
public class MetricsUnavailable : IMetricsAccess
{
public void AssertThat(string metricName, IResolveConstraint constraint, string message = "")
{
Assert.Fail("Incorrect test setup: Metrics were not enabled for this group of Codex nodes. Add 'EnableMetrics()' after 'SetupCodexNodes()' to enable it.");
throw new InvalidOperationException();
}
2023-03-27 12:49:34 +00:00
}
public class MetricsAccess : IMetricsAccess
{
private readonly MetricsQuery query;
2023-03-31 08:00:44 +00:00
private readonly OnlineCodexNode node;
2023-03-31 08:00:44 +00:00
public MetricsAccess(MetricsQuery query, OnlineCodexNode node)
{
this.query = query;
2023-03-31 08:00:44 +00:00
this.node = node;
}
2023-03-31 08:00:44 +00:00
public void AssertThat(string metricName, IResolveConstraint constraint, string message = "")
2023-03-29 08:07:16 +00:00
{
2023-03-31 08:00:44 +00:00
var metricSet = GetMetricWithTimeout(metricName, node);
var metricValue = metricSet.Values[0].Value;
2023-03-29 08:07:16 +00:00
Assert.That(metricValue, constraint, message);
}
private MetricsSet GetMetricWithTimeout(string metricName, OnlineCodexNode node)
2023-03-29 08:07:16 +00:00
{
var start = DateTime.UtcNow;
while (true)
{
var mostRecent = GetMostRecent(metricName, node);
if (mostRecent != null) return mostRecent;
2023-03-29 08:07:16 +00:00
if (DateTime.UtcNow - start > Timing.WaitForMetricTimeout())
{
Assert.Fail($"Timeout: Unable to get metric '{metricName}'.");
throw new TimeoutException();
}
Utils.Sleep(TimeSpan.FromSeconds(2));
}
}
private MetricsSet? GetMostRecent(string metricName, OnlineCodexNode node)
2023-03-27 12:49:34 +00:00
{
var result = query.GetMostRecent(metricName, node);
if (result == null) return null;
return result.Sets.LastOrDefault();
2023-03-27 12:49:34 +00:00
}
}
}