public void Should_AllMetricsHaveValidValues() { var metricsRoot = new App.Metrics.MetricsBuilder().Build(); try { var cluster = GetNewCluster(b => b.WithMetrics( metricsRoot.CreateDriverMetricsProvider(), new DriverMetricsOptions() .SetEnabledNodeMetrics(NodeMetric.AllNodeMetrics) .SetEnabledSessionMetrics(SessionMetric.AllSessionMetrics))); var session = cluster.Connect(); Assert.AreEqual(25, NodeMetric.AllNodeMetrics.Count()); Assert.AreEqual(25, MetricsTests.Counters.Concat(MetricsTests.Gauges.Concat(MetricsTests.Timers.Concat(MetricsTests.Meters))) .Union(NodeMetric.DefaultNodeMetrics).Count()); Assert.AreEqual(1, MetricsTests.Timers.Length); Assert.IsTrue(NodeMetric.AllNodeMetrics.SequenceEqual(NodeMetric.AllNodeMetrics.Distinct())); Assert.AreEqual(5, SessionMetric.AllSessionMetrics.Count()); foreach (var i in Enumerable.Range(0, 1000)) { session.Execute("SELECT * FROM system.local"); } var metrics = session.GetMetrics(); foreach (var h in cluster.AllHosts()) { foreach (var c in MetricsTests.Counters) { Assert.AreEqual(0, metrics.GetNodeCounter(h, c).GetValue()); } Assert.AreEqual(2, MetricsTests.Gauges.Length); Assert.AreEqual(0, metrics.GetNodeGauge(h, NodeMetric.Gauges.InFlight).GetValue()); Assert.Greater(metrics.GetNodeGauge(h, NodeMetric.Gauges.OpenConnections).GetValue(), 0); Assert.Greater(metrics.GetNodeTimer(h, NodeMetric.Timers.CqlMessages).GetValue().Histogram.Max, 0); Assert.Greater(metrics.GetNodeMeter(h, NodeMetric.Meters.BytesSent).GetValue().Count, 0); Assert.Greater(metrics.GetNodeMeter(h, NodeMetric.Meters.BytesReceived).GetValue().Count, 0); } Assert.AreEqual(0, metrics.GetSessionCounter(SessionMetric.Counters.CqlClientTimeouts).GetValue()); Assert.Greater(metrics.GetSessionTimer(SessionMetric.Timers.CqlRequests).GetValue().Histogram.Max, 0); Assert.Greater(metrics.GetSessionMeter(SessionMetric.Meters.BytesSent).GetValue().Count, 0); Assert.Greater(metrics.GetSessionMeter(SessionMetric.Meters.BytesReceived).GetValue().Count, 0); Assert.AreEqual(3, metrics.GetSessionGauge(SessionMetric.Gauges.ConnectedNodes).GetValue()); } finally { metricsRoot.Manage.Disable(); } }
public void Should_RemoveNodeMetricsAndDisposeMetricsContext_When_HostIsRemoved() { var metricsRoot = new App.Metrics.MetricsBuilder().Build(); try { var cluster = GetNewCluster(b => b.WithMetrics(metricsRoot.CreateDriverMetricsProvider())); var session = cluster.Connect(); var metrics = session.GetMetrics(); Assert.AreEqual(3, cluster.Metadata.Hosts.Count); Assert.AreEqual(3, metrics.NodeMetrics.Count); // get address for host that will be removed from the cluster in this test var address = TestCluster.ClusterIpPrefix + "2"; var hostToBeRemoved = cluster.Metadata.Hosts.First(h => h.Address.Address.Equals(IPAddress.Parse(address))); // check node metrics are valid var gauge = metrics.GetNodeGauge(hostToBeRemoved, NodeMetric.Gauges.OpenConnections); var appMetricsGaugeValue = metricsRoot.Snapshot.GetGaugeValue(gauge.Context, gauge.Name); Assert.Greater(gauge.GetValue().Value, 0); Assert.AreEqual(gauge.GetValue().Value, appMetricsGaugeValue); // check node metrics context in app metrics is valid var context = metricsRoot.Snapshot.GetForContext(gauge.Context); Assert.True(context.IsNotEmpty()); Assert.AreEqual(2, context.Gauges.Count()); // remove host from cluster TestCluster.DecommissionNode(2); TestCluster.Stop(2); try { TestHelper.RetryAssert(() => { Assert.AreEqual(2, cluster.Metadata.Hosts.Count, "metadata hosts count failed"); }, 200, 50); TestHelper.RetryAssert(() => { Assert.AreEqual(2, metrics.NodeMetrics.Count, "Node metrics count failed"); }, 10, 500); } catch { TestCluster.Start(2, "--jvm_arg=\"-Dcassandra.override_decommission=true\""); throw; } // Check node's metrics were removed from app metrics registry context = metricsRoot.Snapshot.GetForContext(gauge.Context); Assert.False(context.IsNotEmpty()); Assert.AreEqual(0, context.Gauges.Count()); TestCluster.Start(2, "--jvm_arg=\"-Dcassandra.override_decommission=true\""); TestHelper.RetryAssert(() => { Assert.AreEqual(3, cluster.Metadata.Hosts.Count, "metadata hosts count after bootstrap failed"); }, 200, 50); // when new host is chosen by LBP, connection pool is created foreach (var _ in Enumerable.Range(0, 5)) { session.Execute("SELECT * FROM system.local"); } TestHelper.RetryAssert(() => { Assert.AreEqual(3, metrics.NodeMetrics.Count, "Node metrics count after bootstrap failed"); }, 10, 500); // Check node's metrics were added again context = metricsRoot.Snapshot.GetForContext(gauge.Context); Assert.True(context.IsNotEmpty()); Assert.AreEqual(2, context.Gauges.Count()); } finally { metricsRoot.Manage.Disable(); } }