public void AddMetrics_TestEqualsGetsEscaped() { var context = new DefaultMetricsContext(); var sender = new FakeSignalFxReporter(); var report = new SignalFxReport( sender, "", "FakeApiKey", new Dictionary <string, string> { { "System", "UnitTests" } }, 10000, new HashSet <MetricDetails> { MetricDetails.count }); var tags = new MetricTags("test\\=string=test\\value"); var timer = context.Timer("TestTimer", Unit.Calls, SamplingType.ExponentiallyDecaying, TimeUnit.Microseconds, TimeUnit.Microseconds, tags); timer.Record(10053, TimeUnit.Microseconds); var source = new CancellationTokenSource(); report.RunReport(context.DataProvider.CurrentMetricsData, () => new HealthStatus(), source.Token); Assert.Equal(1, sender.Count); var message = sender[0]; var dp = message.datapoints.FirstOrDefault(datapoint => datapoint.dimensions.Any(dimension => dimension.key == "test=string")); Assert.NotNull(dp); var dm = dp.dimensions.FirstOrDefault(dimension => dimension.key == "test=string"); Assert.Equal("testvalue", dm.value); }
public void CounterSetItemsDisabledTest() { var context = new DefaultMetricsContext(); var config = new PrometheusReportConfig { OutputSetItems = false }; var counter = context.Counter("Counter", Unit.None, MetricTags.None); counter.Increment(1); var counterSubItems = context.Counter("CounterSubItems", Unit.None, MetricTags.None); counterSubItems.Increment("Item1", 2); counterSubItems.Increment("Item2", 3); string renderedMetrics = RenderTestMetrics(context, config); string expectedMetrics = FormatPrometheusText(@"# TYPE Counter gauge counter 1 0 # TYPE CounterSubItems gauge countersubitems 5 0 "); Assert.AreEqual(expectedMetrics, renderedMetrics); }
public void MeterSetItemsDisabledTest() { var context = new DefaultMetricsContext(); var config = new PrometheusReportConfig { OutputSetItems = false }; var meter = context.Meter("Meter", Unit.None, TimeUnit.Seconds, MetricTags.None); meter.Mark(1); var meterSubItems = context.Meter("MeterSubItems", Unit.None, TimeUnit.Seconds, MetricTags.None); meterSubItems.Mark("Item1", 2); meterSubItems.Mark("Item2", 3); string renderedMetrics = RenderTestMetrics(context, config); string expectedMetrics = FormatPrometheusText(@"# TYPE Meter gauge meter 1 0 # TYPE MeterSubItems gauge metersubitems 5 0 "); Assert.Equal(expectedMetrics, renderedMetrics); }
public void HistorgramTest() { var context = new DefaultMetricsContext(); var config = new PrometheusReportConfig { OutputSetItems = true }; var histogram = context.Histogram("Historgram", Unit.None, SamplingType.Default, MetricTags.None); histogram.Update(1); var histogramUserValue = context.Histogram("HistorgramSubItems", Unit.None, SamplingType.Default, MetricTags.None); histogramUserValue.Update(2, "UserValue1"); histogramUserValue.Update(3, "UserValue2"); string renderedMetrics = RenderTestMetrics(context, config); string expectedMetrics = FormatPrometheusText(@"# TYPE Historgram gauge historgram 1 0 # TYPE HistorgramSubItems gauge historgramsubitems 2 0 "); Assert.AreEqual(expectedMetrics, renderedMetrics); }
public void InfluxReport_CanAddRecords_ForHealthCheck() { var config = new InfluxConfig("localhost", "testdb"); var writer = new InfluxdbTestWriter(config); config.Writer = writer; var report = new InfluxdbHttpReport(config); var context = new DefaultMetricsContext("TestContext"); var precision = config.Precision ?? InfluxConfig.Default.Precision; var metricsData = context.DataProvider.CurrentMetricsData; HealthChecks.UnregisterAllHealthChecks(); HealthChecks.RegisterHealthCheck("Health Check 1", () => HealthCheckResult.Healthy($"Healthy check!")); HealthChecks.RegisterHealthCheck("Health Check 2", () => HealthCheckResult.Unhealthy($"Unhealthy check!")); HealthChecks.RegisterHealthCheck("Health Check 3,tag3=key3", () => HealthCheckResult.Healthy($"Healthy check!")); HealthChecks.RegisterHealthCheck("Health Check 4,tag 4=key 4", () => HealthCheckResult.Healthy($"Healthy check!")); HealthChecks.RegisterHealthCheck("Name=Health Check 5,tag5=key5", () => HealthCheckResult.Healthy($"Healthy check!")); metricsData = context.DataProvider.CurrentMetricsData; report.RunReport(metricsData, () => HealthChecks.GetStatus(), CancellationToken.None); HealthChecks.UnregisterAllHealthChecks(); // unreg first in case something below throws writer.LastBatch.Should().HaveCount(5); var expTime = InfluxLineProtocol.FormatTimestamp(metricsData.Timestamp, precision); writer.LastBatch[0].ToLineProtocol(precision).Should().Be($@"health_checks,name=health_check_1 ishealthy=True,message=""Healthy check!"" {expTime}"); writer.LastBatch[1].ToLineProtocol(precision).Should().Be($@"health_checks,name=health_check_2 ishealthy=False,message=""Unhealthy check!"" {expTime}"); writer.LastBatch[2].ToLineProtocol(precision).Should().Be($@"health_checks,name=health_check_3,tag3=key3 ishealthy=True,message=""Healthy check!"" {expTime}"); writer.LastBatch[3].ToLineProtocol(precision).Should().Be($@"health_checks,name=health_check_4,tag_4=key\ 4 ishealthy=True,message=""Healthy check!"" {expTime}"); writer.LastBatch[4].ToLineProtocol(precision).Should().Be($@"health_checks,name=health\ check\ 5,tag5=key5 ishealthy=True,message=""Healthy check!"" {expTime}"); }
public void InfluxReport_CanAddRecords_ForHistogram() { var config = new InfluxConfig("localhost", "testdb"); var writer = new InfluxdbTestWriter(config); config.Writer = writer; var report = new InfluxdbHttpReport(config); var context = new DefaultMetricsContext("TestContext"); var precision = config.Precision ?? InfluxConfig.Default.Precision; var metricsData = context.DataProvider.CurrentMetricsData; var hist = context.Histogram("test_hist", Unit.Bytes, SamplingType.Default, new MetricTags("key1=value1,tag2,tag3,key4=value4")); // add normally hist.Update(300); metricsData = context.DataProvider.CurrentMetricsData; report.RunReport(metricsData, hsFunc, CancellationToken.None); writer.LastBatch.Should().HaveCount(1); var expTime = InfluxLineProtocol.FormatTimestamp(metricsData.Timestamp, precision); writer.LastBatch[0].ToLineProtocol(precision).Should().Be($@"testcontext.test_hist,key1=value1,key4=value4 count=1i,last=300,min=300,mean=300,max=300,stddev=0,median=300,sample_size=1i,percentile_75%=300,percentile_95%=300,percentile_98%=300,percentile_99%=300,percentile_99.9%=300 {expTime}"); // add with set item hist.Update(100, "item1,item2=ival2,item3=ival3"); metricsData = context.DataProvider.CurrentMetricsData; report.RunReport(metricsData, hsFunc, CancellationToken.None); writer.LastBatch.Should().HaveCount(1); expTime = InfluxLineProtocol.FormatTimestamp(metricsData.Timestamp, precision); writer.LastBatch[0].ToLineProtocol(precision).Should().Be($@"testcontext.test_hist,key1=value1,key4=value4 count=2i,last=100,min=100,mean=200,max=300,stddev=100,median=300,sample_size=2i,percentile_75%=300,percentile_95%=300,percentile_98%=300,percentile_99%=300,percentile_99.9%=300 {expTime}"); }
public void InfluxReport_CanAddRecords_ForTimer() { var config = new InfluxConfig("localhost", "testdb"); var writer = new InfluxdbTestWriter(config); config.Writer = writer; var report = new InfluxdbHttpReport(config); var context = new DefaultMetricsContext("TestContext"); var precision = config.Precision ?? InfluxConfig.Default.Precision; var metricsData = context.DataProvider.CurrentMetricsData; var timer = context.Timer("test_timer", Unit.Bytes, SamplingType.Default, TimeUnit.Seconds, TimeUnit.Seconds, new MetricTags("key1=value1,tag2,tag3,key4=value4")); // add normally timer.Record(100, TimeUnit.Seconds); metricsData = context.DataProvider.CurrentMetricsData; report.RunReport(metricsData, hsFunc, CancellationToken.None); writer.LastBatch.Should().HaveCount(1); var expTime = InfluxLineProtocol.FormatTimestamp(metricsData.Timestamp, precision); writer.LastBatch[0].ToLineProtocol(precision).Should().StartWith($@"testcontext.test_timer,key1=value1,key4=value4 active_sessions=0i,total_time=100i,count=1i,").And.EndWith($@",1_min_rate=0,5_min_rate=0,15_min_rate=0,last=100,min=100,mean=100,max=100,stddev=0,median=100,sample_size=1i,percentile_75%=100,percentile_95%=100,percentile_98%=100,percentile_99%=100,percentile_99.9%=100 {expTime}"); // add with set item timer.Record(50, TimeUnit.Seconds, "item1,item2=ival2,item3=ival3"); metricsData = context.DataProvider.CurrentMetricsData; report.RunReport(metricsData, hsFunc, CancellationToken.None); writer.LastBatch.Should().HaveCount(1); expTime = InfluxLineProtocol.FormatTimestamp(metricsData.Timestamp, precision); writer.LastBatch[0].ToLineProtocol(precision).Should().StartWith($@"testcontext.test_timer,key1=value1,key4=value4 active_sessions=0i,total_time=150i,count=2i,").And.EndWith($@",1_min_rate=0,5_min_rate=0,15_min_rate=0,last=50,min=50,mean=75,max=100,stddev=25,median=100,sample_size=2i,percentile_75%=100,percentile_95%=100,percentile_98%=100,percentile_99%=100,percentile_99.9%=100 {expTime}"); }
public void InfluxReport_CanAddRecords_ForMeter() { var config = new InfluxConfig("localhost", "testdb"); var writer = new InfluxdbTestWriter(config); config.Writer = writer; var report = new InfluxdbHttpReport(config); var context = new DefaultMetricsContext("TestContext"); var precision = config.Precision ?? InfluxConfig.Default.Precision; var metricsData = context.DataProvider.CurrentMetricsData; var meter = context.Meter("test_meter", Unit.Bytes, TimeUnit.Seconds, new MetricTags("key1=value1,tag2,tag3,key4=value4")); // add normally meter.Mark(300); metricsData = context.DataProvider.CurrentMetricsData; report.RunReport(metricsData, hsFunc, CancellationToken.None); writer.LastBatch.Should().HaveCount(1); var expTime = InfluxLineProtocol.FormatTimestamp(metricsData.Timestamp, precision); writer.LastBatch[0].ToLineProtocol(precision).Should().StartWith($@"testcontext.test_meter,key1=value1,key4=value4 count=300i,mean_rate=").And.EndWith($@",1_min_rate=0,5_min_rate=0,15_min_rate=0 {expTime}");; // add with set item meter.Mark("item1,item2=ival2,item3=ival3", 100); metricsData = context.DataProvider.CurrentMetricsData; report.RunReport(metricsData, hsFunc, CancellationToken.None); writer.LastBatch.Should().HaveCount(2); expTime = InfluxLineProtocol.FormatTimestamp(metricsData.Timestamp, precision); writer.LastBatch[0].ToLineProtocol(precision).Should().StartWith($@"testcontext.test_meter,key1=value1,key4=value4 count=400i,mean_rate=").And.EndWith($@",1_min_rate=0,5_min_rate=0,15_min_rate=0 {expTime}"); writer.LastBatch[1].ToLineProtocol(precision).Should().StartWith($@"testcontext.test_meter,item2=ival2,item3=ival3,key1=value1,key4=value4 count=100i,percent=25,mean_rate=").And.EndWith($@",1_min_rate=0,5_min_rate=0,15_min_rate=0 {expTime}"); }
public void Send_EnsureWebExceptionTriggersErrorHandler() { var context = new DefaultMetricsContext(); var requestor = new GenericFakeRequestorFactory <FakeWebExceptionRequestor>(); var sender = new SignalFxReporter("http://fake.signalfuse.com", "ABC123", requestor); var report = new SignalFxReport( sender, "", "FakeApiKey", new Dictionary <string, string> { { "System", "UnitTests" } }, 10000, new HashSet <MetricDetails> { MetricDetails.count }); int errorCount = 0; new MetricsConfig(context).WithErrorHandler((exc, msg) => errorCount++, true); var tags = new MetricTags("test\\=string=test\\value"); var timer = context.Timer("TestTimer", Unit.Calls, SamplingType.ExponentiallyDecaying, TimeUnit.Microseconds, TimeUnit.Microseconds, tags); timer.Record(10053, TimeUnit.Microseconds); var source = new CancellationTokenSource(); report.RunReport(context.DataProvider.CurrentMetricsData, () => new HealthStatus(), source.Token); Assert.True(errorCount >= 1); }
public void MeterWithTagsTest() { var context = new DefaultMetricsContext(); var config = new PrometheusReportConfig { OutputSetItems = true }; var meter = context.Meter("Meter", Unit.None, TimeUnit.Seconds, new[] { "tag0", "tag1" }); meter.Mark(1); var meterSubItems = context.Meter("MeterSubItems", Unit.None, TimeUnit.Seconds, new[] { "tag0", "tag1" }); meterSubItems.Mark("Item1", 2); meterSubItems.Mark("Item2", 3); string renderedMetrics = RenderTestMetrics(context, config); string expectedMetrics = FormatPrometheusText(@"# TYPE Meter gauge meter{tag0=""tag0"",tag1=""tag1""} 1 0 # TYPE MeterSubItems gauge metersubitems{item=""Item1"",tag0=""tag0"",tag1=""tag1""} 2 0 metersubitems{item=""Item2"",tag0=""tag0"",tag1=""tag1""} 3 0 "); Assert.AreEqual(expectedMetrics, renderedMetrics); }
static async Task <IRawEndpointInstance> StartMonitor() { var queueMonitorContext = new DefaultMetricsContext("QueueLengthMonitor"); new MetricsConfig(queueMonitorContext) .WithHttpEndpoint("http://localhost:7777/QueueLengthMonitor/") .WithReporting(r => { r.WithReport( new PerformanceCounterReporter(x => new CounterInstanceName("Queue Length", x.MetricName)), TimeSpan.FromSeconds(5), Filter.New.WhereContext(c => c == "QueueLengthMonitor" || c == "QueueState")); }); var monitor = new Monitor(queueMonitorContext, new QueueLength()); var config = RawEndpointConfiguration.Create("QueueLengthMonitor", monitor.OnMessage); config.LimitMessageProcessingConcurrencyTo(1); config.UseTransport <MsmqTransport>(); //config.UseTransport<RabbitMQTransport>().ConnectionString("host=localhost"); config.SendFailedMessagesTo("error"); var endpoint = await RawEndpoint.Start(config); return(endpoint); }
public void WithPrometheusEndpointReportPathEncodingTest() { var context = new DefaultMetricsContext(); var endpointReports = new MetricsEndpointReports(context.DataProvider, () => new HealthStatus()); var reports = endpointReports.WithPrometheusEndpointReport("test/prometheus", new UTF8Encoding(false)); Assert.AreEqual(endpointReports, reports); }
public void WithPrometheusEndpointReportTest() { var context = new DefaultMetricsContext(); var endpointReports = new MetricsEndpointReports(context.DataProvider, () => new HealthStatus()); var reports = endpointReports.WithPrometheusEndpointReport(); Assert.AreEqual(endpointReports, reports); }
public void WithPrometheusEndpointReportPathConfigTest() { var context = new DefaultMetricsContext(); var endpointReports = new MetricsEndpointReports(context.DataProvider, () => new HealthStatus()); var config = new PrometheusReportConfig { OutputSetItems = true }; var reports = endpointReports.WithPrometheusEndpointReport(path: "test/prometheus", reportConfig: config); Assert.AreEqual(endpointReports, reports); }
private static string RenderTestMetrics(DefaultMetricsContext ctx, PrometheusReportConfig config) { var originalData = ctx.DataProvider.CurrentMetricsData; var testData = new MetricsData( originalData.Context, Epoch, originalData.Environment, originalData.Gauges, originalData.Counters, originalData.Meters, originalData.Histograms, originalData.Timers, originalData.ChildMetrics); return(PrometheusReport.RenderMetrics(testData, () => new HealthStatus(), config)); }
public void GaugeTest() { var context = new DefaultMetricsContext(); var config = new PrometheusReportConfig { OutputSetItems = true }; context.Gauge("Gauge", () => 1, Unit.None, MetricTags.None); string renderedMetrics = RenderTestMetrics(context, config); string expectedMetrics = FormatPrometheusText(@"# TYPE Gauge gauge gauge 1 0 "); Assert.AreEqual(expectedMetrics, renderedMetrics); }
public void TimerTest() { var context = new DefaultMetricsContext(); var config = new PrometheusReportConfig { OutputSetItems = true }; var timer = context.Timer("Timer", Unit.None, SamplingType.Default, TimeUnit.Seconds, TimeUnit.Seconds, MetricTags.None); timer.Record(1, TimeUnit.Seconds); var timerUserValue = context.Timer("TimerSubItems", Unit.None, SamplingType.Default, TimeUnit.Seconds, TimeUnit.Seconds, MetricTags.None); timerUserValue.Record(2, TimeUnit.Seconds, "UserValue1"); timerUserValue.Record(3, TimeUnit.Seconds, "UserValue2"); string renderedMetrics = RenderTestMetrics(context, config); string expectedMetrics = FormatPrometheusText(@"# HELP timer A summary of the timer duration in millisecond # TYPE timer summary timer{quantile=""0.75"",} 1 timer{quantile=""0.95"",} 1 timer{quantile=""0.98"",} 1 timer{quantile=""0.99"",} 1 timer{quantile=""0.999"",} 1 timer_median 1 timer_sum 1 timer_count 1 # HELP timersubitems A summary of the timersubitems duration in millisecond # TYPE timersubitems summary timersubitems{quantile=""0.75"",} 3 timersubitems{quantile=""0.95"",} 3 timersubitems{quantile=""0.98"",} 3 timersubitems{quantile=""0.99"",} 3 timersubitems{quantile=""0.999"",} 3 timersubitems_median 3 timersubitems_sum 5 timersubitems_count 2 "); Assert.AreEqual(expectedMetrics, renderedMetrics); }
public void AddMetrics_EnsureLimitIsRespected() { var context = new DefaultMetricsContext(); var sender = new FakeSignalFxReporter(); var report = new SignalFxReport( sender, "", "FakeApiKey", new Dictionary <string, string> { { "System", "UnitTests" } }, 50, new HashSet <MetricDetails> { MetricDetails.count }); var accountNoRandom = new Random(); // var accountId = new byte[16]; var generatedHases = new HashSet <string>(); while (generatedHases.Count < 51) { accountNoRandom.NextBytes(accountId); var accountIdString = accountId.Aggregate(new StringBuilder(), (builder, b) => builder.AppendFormat("{0:x2}", b)).ToString(); if (generatedHases.Contains(accountIdString)) { continue; } generatedHases.Add(accountIdString); var counter = context.Counter("TestCounter", Unit.Calls, new MetricTags()); counter.Increment(accountIdString, accountNoRandom.Next()); } var source = new CancellationTokenSource(); report.RunReport(context.DataProvider.CurrentMetricsData, () => new HealthStatus(), source.Token); Assert.True(sender.Count >= 1); var message = sender[0]; Assert.Equal(50, message.datapoints.Count); }
public void InfluxReport_CanAddRecords_ForGauge() { var config = new InfluxConfig("localhost", "testdb"); var writer = new InfluxdbTestWriter(config); config.Writer = writer; var report = new InfluxdbHttpReport(config); var context = new DefaultMetricsContext("TestContext"); var precision = config.Precision ?? InfluxConfig.Default.Precision; var metricsData = context.DataProvider.CurrentMetricsData; report.RunReport(metricsData, hsFunc, CancellationToken.None); writer.LastBatch.Should().BeEmpty("Because running a report with no metrics should not result in any records."); context.Gauge("test_gauge", () => 123.456, Unit.Bytes, new MetricTags("key1=value1,tag2,tag3,key4=value4")); metricsData = context.DataProvider.CurrentMetricsData; report.RunReport(metricsData, hsFunc, CancellationToken.None); writer.LastBatch.Should().HaveCount(1); var expTime = InfluxLineProtocol.FormatTimestamp(metricsData.Timestamp, precision); writer.LastBatch[0].ToLineProtocol(precision).Should().Be($@"testcontext.test_gauge,key1=value1,key4=value4 value=123.456 {expTime}"); }
protected override void Setup(FeatureConfigurationContext context) { var metricsContext = new DefaultMetricsContext(); var metricsConfig = new MetricsConfig(metricsContext); metricsConfig.WithReporting(r => { r.WithCSVReports(".", TimeSpan.FromSeconds(5)); }); var processedMeter = metricsContext.Meter("Processed", Unit.Custom("audits"), TimeUnit.Seconds, default); var settings = context.Settings.Get <Settings>("ServiceControl.Settings"); var loadGenetorQueue = SettingsReader <string> .Read("LoadGeneratorQueue"); var auditQueueAddress = context.Settings.ToTransportAddress(settings.AuditQueue); var statistics = new Statistics(); context.Container.ConfigureComponent(b => new StatisticsEnricher(statistics, processedMeter), DependencyLifecycle.SingleInstance); context.RegisterStartupTask(new ReportProcessingStatistics(statistics, auditQueueAddress, loadGenetorQueue)); }
public void Send_EnsureMetricsGetReported() { var context = new DefaultMetricsContext(); var requestor = new FakeRequestorFactory(); var sender = new SignalFxReporter("http://fake.signalfuse.com", "ABC123", requestor); var report = new SignalFxReport( sender, "", "FakeApiKey", new Dictionary <string, string> { { "System", "UnitTests" } }, 10000, new HashSet <MetricDetails> { MetricDetails.mean }); var tags = new MetricTags("test\\=string=test\\value"); var timer = context.Timer("TestTimer", Unit.Calls, SamplingType.ExponentiallyDecaying, TimeUnit.Microseconds, TimeUnit.Microseconds, tags); timer.Record(10053, TimeUnit.Microseconds); var source = new CancellationTokenSource(); report.RunReport(context.DataProvider.CurrentMetricsData, () => new HealthStatus(), source.Token); var reportedBytes = requestor.WrittenData; Assert.True(reportedBytes.Length > 0); var message = Serializer.Deserialize <DataPointUploadMessage>(new MemoryStream(reportedBytes)); var dp = message.datapoints.FirstOrDefault(datapoint => datapoint.dimensions.Any(dimension => dimension.key == "test=string")); Assert.NotNull(dp); var dm = dp.dimensions.FirstOrDefault(dimension => dimension.key == "test=string"); Assert.Equal("testvalue", dm.value); }
private static MetricsConfig CreateConfig() { var context = new DefaultMetricsContext("http-listener-tests"); return(new MetricsConfig(context)); }
public void AddMetrics_AllMetricsGetReported() { var context = new DefaultMetricsContext(); var sender = new FakeSignalFxReporter(); var report = new SignalFxReport( sender, "", "FakeApiKey", new Dictionary <string, string> { { "System", "UnitTests" } }, 10000, null); var tags = new MetricTags("test=value"); var totalExpectedMetrics = 0; var timer = context.Timer("TestTimer", Unit.Calls, SamplingType.ExponentiallyDecaying, TimeUnit.Microseconds, TimeUnit.Microseconds, tags); timer.Record(10053, TimeUnit.Microseconds); // A single Timer produces 17 metrics // Count // Active_Sessions // Rate-Mean-Calls-per-us // Rate-1-min-Calls-per-us // Rate-5-min-Calls-per-us // Rate-15-min-Calls-per-us // Duration-Last-us // Duration-Min-us // Duration-Mean-us // Duration-Max-us // Duration-StdDev-us // Duration-p75-us // Duration-p95-us // Duration-p95-us // Duration-p98-us // Duration-p99-us // Duration-p999-us totalExpectedMetrics += 17; context.Gauge("TestGuage", () => 3.3, Unit.KiloBytes, tags); // A gauge is a single metric totalExpectedMetrics += 1; var counter = context.Counter("TestCounter", Unit.KiloBytes, tags); counter.Increment("SetA", 2); counter.Increment("SetB", 5); // We're setting two sub counters within counter // plus there is a "Total" counter // and for each of the two, there is a total and a percentage totalExpectedMetrics += 5; var histogram = context.Histogram("TestHistogram", Unit.Events, SamplingType.ExponentiallyDecaying, tags); histogram.Update(23, "ABC"); histogram.Update(14, "DEF"); // Histogram of events produces 12 metrics: // Count-Events // Last-Events // Min-Events // Mean-Events // Max-Events // StdDev-Events // p75-Events // p95-Events // p95-Events // p98-Events // p99-Events // p999-Events totalExpectedMetrics += 12; var meter = context.Meter("TestMeter", Unit.MegaBytes, TimeUnit.Seconds, tags); meter.Mark("A", 12); meter.Mark("B", 190); // Meters result in the following 5 metrics for MB // Total-Mb // Rate-Mean-Mb // Rate-1-min-Mb // Rate-5-min-Mb // Rate-15-min-Mb // // And then for each item that is marked, there's a set of these 6 // Percent-Mb // Count-Mb // Rate-Mean-Mb-per-s // Rate-1-min-Mb-per-s // Rate-5-min-Mb-per-s // Rate-15-min-Mb-per-s totalExpectedMetrics += 17; // so our total metrics now is 52 var source = new CancellationTokenSource(); report.RunReport(context.DataProvider.CurrentMetricsData, () => new HealthStatus(), source.Token); Assert.Equal(1, sender.Count); var message = sender[0]; Assert.Equal(totalExpectedMetrics, message.datapoints.Count); }