Allows starting of multiple metrics-collecting services
This commit is contained in:
parent
99e5b4c89a
commit
8cbba00407
|
@ -17,8 +17,8 @@ namespace CodexDistTestCore.Config
|
||||||
public KubernetesClientConfiguration GetK8sClientConfig()
|
public KubernetesClientConfiguration GetK8sClientConfig()
|
||||||
{
|
{
|
||||||
if (config != null) return config;
|
if (config != null) return config;
|
||||||
config = KubernetesClientConfiguration.BuildConfigFromConfigFile(KubeConfigFile);
|
//config = KubernetesClientConfiguration.BuildConfigFromConfigFile(KubeConfigFile);
|
||||||
//config = KubernetesClientConfiguration.BuildDefaultConfig();
|
config = KubernetesClientConfiguration.BuildDefaultConfig();
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,9 +58,9 @@
|
||||||
K8s(k => k.FetchPodLog(node, logHandler));
|
K8s(k => k.FetchPodLog(node, logHandler));
|
||||||
}
|
}
|
||||||
|
|
||||||
public PrometheusInfo BringOnlinePrometheus(string config)
|
public PrometheusInfo BringOnlinePrometheus(string config, int prometheusNumber)
|
||||||
{
|
{
|
||||||
var spec = new K8sPrometheusSpecs(codexGroupNumberSource.GetNextServicePort(), config);
|
var spec = new K8sPrometheusSpecs(codexGroupNumberSource.GetNextServicePort(), prometheusNumber, config);
|
||||||
|
|
||||||
PrometheusInfo? info = null;
|
PrometheusInfo? info = null;
|
||||||
K8s(k => info = k.BringOnlinePrometheus(spec));
|
K8s(k => info = k.BringOnlinePrometheus(spec));
|
||||||
|
|
|
@ -11,17 +11,19 @@ namespace CodexDistTestCore
|
||||||
private const string portName = "prom-1";
|
private const string portName = "prom-1";
|
||||||
private readonly string config;
|
private readonly string config;
|
||||||
|
|
||||||
public K8sPrometheusSpecs(int servicePort, string config)
|
public K8sPrometheusSpecs(int servicePort, int prometheusNumber, string config)
|
||||||
{
|
{
|
||||||
ServicePort = servicePort;
|
ServicePort = servicePort;
|
||||||
|
PrometheusNumber = prometheusNumber;
|
||||||
this.config = config;
|
this.config = config;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int ServicePort { get; }
|
public int ServicePort { get; }
|
||||||
|
public int PrometheusNumber { get; }
|
||||||
|
|
||||||
public string GetDeploymentName()
|
public string GetDeploymentName()
|
||||||
{
|
{
|
||||||
return "test-prom";
|
return "test-prom" + PrometheusNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
public V1Deployment CreatePrometheusDeployment()
|
public V1Deployment CreatePrometheusDeployment()
|
||||||
|
@ -88,7 +90,7 @@ namespace CodexDistTestCore
|
||||||
ApiVersion = "v1",
|
ApiVersion = "v1",
|
||||||
Metadata = new V1ObjectMeta
|
Metadata = new V1ObjectMeta
|
||||||
{
|
{
|
||||||
Name = "codex-prom-service",
|
Name = "codex-prom-service" + PrometheusNumber,
|
||||||
NamespaceProperty = K8sCluster.K8sNamespace
|
NamespaceProperty = K8sCluster.K8sNamespace
|
||||||
},
|
},
|
||||||
Spec = new V1ServiceSpec
|
Spec = new V1ServiceSpec
|
||||||
|
@ -99,7 +101,7 @@ namespace CodexDistTestCore
|
||||||
{
|
{
|
||||||
new V1ServicePort
|
new V1ServicePort
|
||||||
{
|
{
|
||||||
Name = "prom-service",
|
Name = "prom-service" + PrometheusNumber,
|
||||||
Protocol = "TCP",
|
Protocol = "TCP",
|
||||||
Port = 9090,
|
Port = 9090,
|
||||||
TargetPort = portName,
|
TargetPort = portName,
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using CodexDistTestCore.Config;
|
using CodexDistTestCore.Config;
|
||||||
|
using NUnit.Framework;
|
||||||
|
|
||||||
namespace CodexDistTestCore
|
namespace CodexDistTestCore
|
||||||
{
|
{
|
||||||
|
@ -11,18 +12,23 @@ namespace CodexDistTestCore
|
||||||
{
|
{
|
||||||
private readonly K8sCluster k8sCluster = new K8sCluster();
|
private readonly K8sCluster k8sCluster = new K8sCluster();
|
||||||
private readonly Http http;
|
private readonly Http http;
|
||||||
|
private readonly OnlineCodexNode[] nodes;
|
||||||
|
|
||||||
public MetricsAccess(PrometheusInfo prometheusInfo)
|
public MetricsAccess(PrometheusInfo prometheusInfo, OnlineCodexNode[] nodes)
|
||||||
{
|
{
|
||||||
http = new Http(
|
http = new Http(
|
||||||
k8sCluster.GetIp(),
|
k8sCluster.GetIp(),
|
||||||
prometheusInfo.ServicePort,
|
prometheusInfo.ServicePort,
|
||||||
"api/v1");
|
"api/v1");
|
||||||
|
this.nodes = nodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int? GetMostRecentInt(string metricName, IOnlineCodexNode node)
|
public int? GetMostRecentInt(string metricName, IOnlineCodexNode node)
|
||||||
{
|
{
|
||||||
var n = (OnlineCodexNode)node;
|
var n = (OnlineCodexNode)node;
|
||||||
|
CollectionAssert.Contains(nodes, n, "Incorrect test setup: Attempt to get metrics for OnlineCodexNode from the wrong MetricsAccess object. " +
|
||||||
|
"(This CodexNode is tracked by a different instance.)");
|
||||||
|
|
||||||
var pod = n.Group.PodInfo!;
|
var pod = n.Group.PodInfo!;
|
||||||
|
|
||||||
var response = http.HttpGetJson<PrometheusQueryResponse>($"query?query=last_over_time({metricName}[12h])");
|
var response = http.HttpGetJson<PrometheusQueryResponse>($"query?query=last_over_time({metricName}[12h])");
|
||||||
|
|
|
@ -5,9 +5,10 @@ namespace CodexDistTestCore
|
||||||
{
|
{
|
||||||
public class MetricsAggregator
|
public class MetricsAggregator
|
||||||
{
|
{
|
||||||
|
private readonly NumberSource prometheusNumberSource = new NumberSource(0);
|
||||||
private readonly TestLog log;
|
private readonly TestLog log;
|
||||||
private readonly K8sManager k8sManager;
|
private readonly K8sManager k8sManager;
|
||||||
private PrometheusInfo? activePrometheus;
|
private readonly Dictionary<PrometheusInfo, OnlineCodexNode[]> activePrometheuses = new Dictionary<PrometheusInfo, OnlineCodexNode[]>();
|
||||||
|
|
||||||
public MetricsAggregator(TestLog log, K8sManager k8sManager)
|
public MetricsAggregator(TestLog log, K8sManager k8sManager)
|
||||||
{
|
{
|
||||||
|
@ -17,31 +18,27 @@ namespace CodexDistTestCore
|
||||||
|
|
||||||
public MetricsAccess BeginCollectingMetricsFor(OnlineCodexNode[] nodes)
|
public MetricsAccess BeginCollectingMetricsFor(OnlineCodexNode[] nodes)
|
||||||
{
|
{
|
||||||
if (activePrometheus != null)
|
var alreadyStartedNodes = nodes.Where(n => activePrometheuses.Values.Any(v => v.Contains(n)));
|
||||||
|
if (alreadyStartedNodes.Any())
|
||||||
{
|
{
|
||||||
Assert.Fail("Incorrect test setup: 'GatherMetrics' may be called only once during a test run. Metrics service targets cannot be changed once started. :(");
|
Assert.Fail("Incorrect test setup: 'GatherMetrics' was already called on one or more of these OnlineCodexNodes.");
|
||||||
throw new InvalidOperationException();
|
throw new InvalidOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Log($"Starting metrics collecting for {nodes.Length} nodes...");
|
log.Log($"Starting metrics collecting for {nodes.Length} nodes...");
|
||||||
|
|
||||||
var config = GeneratePrometheusConfig(nodes);
|
var config = GeneratePrometheusConfig(nodes);
|
||||||
StartPrometheusPod(config);
|
var prometheus = k8sManager.BringOnlinePrometheus(config, prometheusNumberSource.GetNextNumber());
|
||||||
|
activePrometheuses.Add(prometheus, nodes);
|
||||||
|
|
||||||
log.Log("Metrics service started.");
|
log.Log("Metrics service started.");
|
||||||
return new MetricsAccess(activePrometheus!);
|
return new MetricsAccess(prometheus, nodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DownloadAllMetrics()
|
public void DownloadAllMetrics()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
private void StartPrometheusPod(string config)
|
|
||||||
{
|
|
||||||
if (activePrometheus != null) return;
|
|
||||||
activePrometheus = k8sManager.BringOnlinePrometheus(config);
|
|
||||||
}
|
|
||||||
|
|
||||||
private string GeneratePrometheusConfig(OnlineCodexNode[] nodes)
|
private string GeneratePrometheusConfig(OnlineCodexNode[] nodes)
|
||||||
{
|
{
|
||||||
var config = "";
|
var config = "";
|
||||||
|
|
|
@ -39,14 +39,29 @@ namespace Tests.BasicTests
|
||||||
|
|
||||||
var metrics = GatherMetrics(group);
|
var metrics = GatherMetrics(group);
|
||||||
|
|
||||||
|
var group2 = SetupCodexNodes(2)
|
||||||
|
.EnableMetrics()
|
||||||
|
.BringOnline();
|
||||||
|
|
||||||
|
var metrics2 = GatherMetrics(group2);
|
||||||
|
|
||||||
var primary = group[0];
|
var primary = group[0];
|
||||||
var secondary = group[1];
|
var secondary = group[1];
|
||||||
|
var primary2 = group2[0];
|
||||||
|
var secondary2 = group2[1];
|
||||||
|
|
||||||
primary.ConnectToPeer(secondary);
|
primary.ConnectToPeer(secondary);
|
||||||
|
primary2.ConnectToPeer(secondary2);
|
||||||
|
|
||||||
AssertWithTimeout(
|
AssertWithTimeout(
|
||||||
() => metrics.GetMostRecentInt("libp2p_peers", primary),
|
() => metrics.GetMostRecentInt("libp2p_peers", primary),
|
||||||
isEqualTo: 1,
|
isEqualTo: 1,
|
||||||
"Number of peers metric was incorrect.");
|
"Number of peers metric was incorrect.");
|
||||||
|
|
||||||
|
AssertWithTimeout(
|
||||||
|
() => metrics2.GetMostRecentInt("libp2p_peers", primary2),
|
||||||
|
isEqualTo: 1,
|
||||||
|
"Aaa");
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -84,19 +99,19 @@ namespace Tests.BasicTests
|
||||||
PerformTwoClientTest(primary, secondary);
|
PerformTwoClientTest(primary, secondary);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
//[Test]
|
||||||
public void TwoClientsTwoLocationsTest()
|
//public void TwoClientsTwoLocationsTest()
|
||||||
{
|
//{
|
||||||
var primary = SetupCodexNodes(1)
|
// var primary = SetupCodexNodes(1)
|
||||||
.At(Location.BensLaptop)
|
// .At(Location.BensLaptop)
|
||||||
.BringOnline()[0];
|
// .BringOnline()[0];
|
||||||
|
|
||||||
var secondary = SetupCodexNodes(1)
|
// var secondary = SetupCodexNodes(1)
|
||||||
.At(Location.BensOldGamingMachine)
|
// .At(Location.BensOldGamingMachine)
|
||||||
.BringOnline()[0];
|
// .BringOnline()[0];
|
||||||
|
|
||||||
PerformTwoClientTest(primary, secondary);
|
// PerformTwoClientTest(primary, secondary);
|
||||||
}
|
//}
|
||||||
|
|
||||||
private void PerformTwoClientTest(IOnlineCodexNode primary, IOnlineCodexNode secondary)
|
private void PerformTwoClientTest(IOnlineCodexNode primary, IOnlineCodexNode secondary)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue