public void MergeScopedStats_TwoStatsSeparateEngines() { var metric1 = MetricWireModel.BuildMetric(_metricNameService, "name", "scope", MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(2))); var engine = new MetricStatsCollection(); MetricStatsDictionary <string, MetricDataWireModel> txStats1 = new MetricStatsDictionary <string, MetricDataWireModel>(); txStats1.Merge(metric1.MetricName.Name, metric1.Data, MetricDataWireModel.BuildAggregateData); MetricStatsDictionary <string, MetricDataWireModel> txStats2 = new MetricStatsDictionary <string, MetricDataWireModel>(); txStats2.Merge(metric1.MetricName.Name, metric1.Data, MetricDataWireModel.BuildAggregateData); engine.MergeScopedStats(metric1.MetricName.Scope, txStats1); engine.MergeScopedStats(metric1.MetricName.Scope, txStats2); IEnumerable <MetricWireModel> stats = engine.ConvertToJsonForSending(_metricNameService); var count = 0; foreach (MetricWireModel current in stats) { count++; Assert.AreEqual("name", current.MetricName.Name); Assert.AreEqual("scope", current.MetricName.Scope); Assert.AreEqual(2, current.Data.Value0); Assert.AreEqual(6, current.Data.Value1); Assert.AreEqual(4, current.Data.Value2); } Assert.AreEqual(1, count); }
public void MergeUnscopeNotCreated_TwoDifferentSame() { var metric1 = MetricWireModel.BuildMetric(_metricNameService, "DotNet/name", null, MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(4))); var metric2 = MetricWireModel.BuildMetric(_metricNameService, "DotNet/another", null, MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(2))); var engine = new MetricStatsCollection(); engine.MergeUnscopedStats(metric1.MetricName.Name, metric1.Data); engine.MergeUnscopedStats(metric2.MetricName.Name, metric2.Data); IEnumerable <MetricWireModel> stats = engine.ConvertToJsonForSending(_metricNameService); var count = 0; foreach (MetricWireModel current in stats) { count++; if (current.MetricName.Name.Equals("DotNet/name")) { Assert.AreEqual(1, current.Data.Value0); Assert.AreEqual(5, current.Data.Value1); Assert.AreEqual(4, current.Data.Value2); } else if (current.MetricName.Name.Equals("DotNet/another")) { Assert.AreEqual(1, current.Data.Value0); Assert.AreEqual(3, current.Data.Value1); Assert.AreEqual(2, current.Data.Value2); } else { Assert.Fail("Unexpected Metric: " + current.MetricName.Name); } Assert.AreEqual(null, current.MetricName.Scope); } Assert.AreEqual(2, count); }
public void MergeScopedStats_VerifyRenaming() { IMetricNameService mNameService = Mock.Create <IMetricNameService>(); Mock.Arrange(() => mNameService.RenameMetric(Arg.IsAny <string>())).Returns <string>(name => "IAmRenamed"); var metric1 = MetricWireModel.BuildMetric(_metricNameService, "name", "myscope", MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(2))); var engine = new MetricStatsCollection(); var scopedStats = new MetricStatsDictionary <string, MetricDataWireModel>(); scopedStats[metric1.MetricName.Name] = metric1.Data; engine.MergeScopedStats(metric1.MetricName.Scope, scopedStats); IEnumerable <MetricWireModel> stats = engine.ConvertToJsonForSending(mNameService); var count = 0; foreach (MetricWireModel current in stats) { count++; Assert.AreEqual("IAmRenamed", current.MetricName.Name); Assert.AreEqual("myscope", current.MetricName.Scope); Assert.AreEqual(1, current.Data.Value0); Assert.AreEqual(3, current.Data.Value1); Assert.AreEqual(2, current.Data.Value2); } Assert.AreEqual(1, count); }
public void MergeStatsEngine_Mix() { var metric5 = MetricWireModel.BuildMetric(_metricNameService, "DotNet/name", null, MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(4), TimeSpan.FromSeconds(4))); var metric6 = MetricWireModel.BuildMetric(_metricNameService, "DotNet/another", null, MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(8), TimeSpan.FromSeconds(6))); var engine1 = new MetricStatsCollection(); MetricStatsDictionary <string, MetricDataWireModel> scoped1 = new MetricStatsDictionary <string, MetricDataWireModel>(); scoped1.Merge("DotNet/name1", MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(1)), MetricDataWireModel.BuildAggregateData); scoped1.Merge("DotNet/name2", MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(2)), MetricDataWireModel.BuildAggregateData); engine1.MergeUnscopedStats(metric5); engine1.MergeScopedStats("engine1scope", scoped1); var engine2 = new MetricStatsCollection(); MetricStatsDictionary <string, MetricDataWireModel> scoped2 = new MetricStatsDictionary <string, MetricDataWireModel>(); scoped2.Merge("DotNet/name3", MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(4), TimeSpan.FromSeconds(1)), MetricDataWireModel.BuildAggregateData); scoped2.Merge("DotNet/name4", MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(2)), MetricDataWireModel.BuildAggregateData); engine1.MergeUnscopedStats(metric6); engine1.MergeScopedStats("engine2scope", scoped1); var engine3 = new MetricStatsCollection(); engine3.Merge(engine1); engine3.Merge(engine2); IEnumerable <MetricWireModel> stats = engine3.ConvertToJsonForSending(_metricNameService); var count = 0; foreach (MetricWireModel current in stats) { count++; } Assert.AreEqual(6, count); }
public void AddMetricsToEngine_OneUnscopedMetricNull() { var metric1 = MetricWireModel.BuildMetric(_metricNameService, "DotNet/name", null, MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(2))); Assert.That(metric1, Is.Not.Null); var data = metric1.Data; Assert.NotNull(data); Assert.AreEqual(1, data.Value0); Assert.AreEqual(3, data.Value1); Assert.AreEqual(2, data.Value2); var engine = new MetricStatsCollection(); metric1.AddMetricsToEngine(engine); var stats = engine.ConvertToJsonForSending(_metricNameService); foreach (var current in stats) { Assert.AreEqual("DotNet/name", current.MetricName.Name); Assert.AreEqual(null, current.MetricName.Scope); var myData = current.Data; Assert.AreEqual(1, myData.Value0); Assert.AreEqual(3, myData.Value1); Assert.AreEqual(2, myData.Value2); } }
public IEnumerable <MetricWireModel> ConvertToJsonForSending(IMetricNameService nameService) { foreach (KeyValuePair <string, MetricDataWireModel> current in _unscopedStats) { var metric = MetricWireModel.BuildMetric(nameService, current.Key, null, current.Value); if (metric != null) { yield return(metric); } } foreach (MetricWireModel model in _preCreatedUnscopedStats.Values) { //These already when through the rename service in the MetricWireModel //At some point this needs to be cleaned up. This is ugly. yield return(model); } foreach (KeyValuePair <string, MetricStatsDictionary <string, MetricDataWireModel> > currentScope in _scopedStats) { foreach (KeyValuePair <string, MetricDataWireModel> currentMetric in currentScope.Value) { var metric = MetricWireModel.BuildMetric(nameService, currentMetric.Key, currentScope.Key, currentMetric.Value); if (metric != null) { yield return(metric); } } } }
private void RecordMetric(MetricWireModel metric) { if (metric == null) { return; } _metricAggregator.Collect(metric); }
public void MetricWireModel_SerializesCorrectlyUnscoped() { const string expectedJson = @"[{""name"":""DotNet/name""},[1,3.0,1.0,3.0,3.0,9.0]]"; var metric1 = MetricWireModel.BuildMetric(_metricNameService, "DotNet/name", null, MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(1))); var serializedMetric = JsonConvert.SerializeObject(metric1); Assert.AreEqual(expectedJson, serializedMetric); }
public void Merge_Throws_IfGivenMetricsWithDifferentNames() { var metric1 = MetricWireModel.BuildMetric(_metricNameService, "DotNet/name", "scope", MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(1))); var metric2 = MetricWireModel.BuildMetric(_metricNameService, "DotNet/name1", "scope", MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(7), TimeSpan.FromSeconds(5))); var metric3 = MetricWireModel.BuildMetric(_metricNameService, "DotNet/name2", "scope", MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(13), TimeSpan.FromSeconds(11))); NrAssert.Throws <Exception>(() => MetricWireModel.Merge(new[] { metric1, metric2, metric3 })); }
public void AddMetricsToEngine_OneScopedMetric() { var metric1 = MetricWireModel.BuildMetric(_metricNameService, "DotNet/name", "scope", MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(2))); Assert.That(metric1, Is.Not.Null); var data = metric1.Data; Assert.NotNull(data); Assert.AreEqual(1, data.Value0); Assert.AreEqual(3, data.Value1); Assert.AreEqual(2, data.Value2); var engine = new MetricStatsCollection(); metric1.AddMetricsToEngine(engine); var actual = engine.ConvertToJsonForSending(_metricNameService); var unscopedCount = 0; var scopedCount = 0; var theScope = string.Empty; var metricName = string.Empty; MetricDataWireModel scopedData = null; foreach (var current in actual) { if (current.MetricName.Scope == null) { unscopedCount++; } else { scopedCount++; theScope = current.MetricName.Scope; metricName = current.MetricName.Name; scopedData = current.Data; } } Assert.AreEqual(1, scopedCount); Assert.AreEqual(0, unscopedCount); Assert.AreEqual("scope", theScope); Assert.AreEqual("DotNet/name", metricName); Assert.IsNotNull(scopedData); Assert.AreEqual(1, scopedData.Value0); Assert.AreEqual(3, scopedData.Value1); Assert.AreEqual(2, scopedData.Value2); }
public void Merge_MergesOneMetricCorrectly() { var metric1 = MetricWireModel.BuildMetric(_metricNameService, "DotNet/name", "scope", MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(1))); var mergedMetric = MetricWireModel.Merge(new[] { metric1 }); NrAssert.Multiple( () => Assert.AreEqual("DotNet/name", mergedMetric.MetricName.Name), () => Assert.AreEqual(1, mergedMetric.Data.Value0), () => Assert.AreEqual(3, mergedMetric.Data.Value1), () => Assert.AreEqual(1, mergedMetric.Data.Value2), () => Assert.AreEqual(3, mergedMetric.Data.Value3), () => Assert.AreEqual(3, mergedMetric.Data.Value4), () => Assert.AreEqual(9, mergedMetric.Data.Value5) ); }
public void Setup() { Mock.Arrange(() => _metricNameService.RenameMetric(Arg.IsAny <string>())).Returns <string>(name => name); _connectionHandler = new ConnectionHandler(new JsonSerializer(), Mock.Create <ICollectorWireFactory>(), Mock.Create <IProcessStatic>(), Mock.Create <IDnsStatic>(), Mock.Create <ILabelsService>(), Mock.Create <Environment>(), Mock.Create <ISystemInfo>(), Mock.Create <IAgentHealthReporter>(), Mock.Create <IEnvironment>()); var validScopedMetric = MetricWireModel.BuildMetric(_metricNameService, "DotNet/name", "WebTransaction/DotNet/name", MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(3.0), TimeSpan.FromSeconds(2.0))); var validUnscopedMetric = MetricWireModel.BuildMetric(_metricNameService, "Custom/name", string.Empty, MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(4.0), TimeSpan.FromSeconds(3.0))); var validMetricWireModels = new List <MetricWireModel> { validScopedMetric, validUnscopedMetric }; _wellformedMetricData = new MetricWireModelCollection("440491846668652", 1450462672.0, 1450462710.0, validMetricWireModels); }
public void MergeScopedStats_OneStat_StringData() { var metric1 = MetricWireModel.BuildMetric(_metricNameService, "DotNet/name", "myScope", MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(2))); var engine = new MetricStatsCollection(); engine.MergeScopedStats(metric1.MetricName.Scope, metric1.MetricName.Name, metric1.Data); IEnumerable <MetricWireModel> stats = engine.ConvertToJsonForSending(_metricNameService); var count = 0; foreach (MetricWireModel current in stats) { count++; Assert.AreEqual("DotNet/name", current.MetricName.Name); Assert.AreEqual("myScope", current.MetricName.Scope); Assert.AreEqual(1, current.Data.Value0); Assert.AreEqual(3, current.Data.Value1); Assert.AreEqual(2, current.Data.Value2); } Assert.AreEqual(1, count); }
public void MergeScopedStats_TwoDifferentSame() { var metric1 = MetricWireModel.BuildMetric(_metricNameService, "DotNet/name", "scope", MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(1))); var metric2 = MetricWireModel.BuildMetric(_metricNameService, "DotNet/another", "scope", MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(2))); var engine = new MetricStatsCollection(); MetricStatsDictionary <string, MetricDataWireModel> txStats1 = new MetricStatsDictionary <string, MetricDataWireModel>(); txStats1.Merge(metric1.MetricName.Name, metric1.Data, MetricDataWireModel.BuildAggregateData); MetricStatsDictionary <string, MetricDataWireModel> txStats2 = new MetricStatsDictionary <string, MetricDataWireModel>(); txStats2.Merge(metric2.MetricName.Name, metric2.Data, MetricDataWireModel.BuildAggregateData); engine.MergeScopedStats(metric2.MetricName.Scope, txStats1); engine.MergeScopedStats(metric2.MetricName.Scope, txStats2); IEnumerable <MetricWireModel> stats = engine.ConvertToJsonForSending(_metricNameService); var count = 0; foreach (MetricWireModel current in stats) { count++; if (current.MetricName.Name.Equals("DotNet/name")) { Assert.AreEqual(1, current.Data.Value0); Assert.AreEqual(2, current.Data.Value1); Assert.AreEqual(1, current.Data.Value2); } else if (current.MetricName.Name.Equals("DotNet/another")) { Assert.AreEqual(1, current.Data.Value0); Assert.AreEqual(3, current.Data.Value1); Assert.AreEqual(2, current.Data.Value2); } else { Assert.Fail("Unexpected metric: " + current.MetricName.Name); } Assert.AreEqual("scope", current.MetricName.Scope); } Assert.AreEqual(2, count); }
public void MergeUnscopedNotCreated_TwoStatsSame() { var metric1 = MetricWireModel.BuildMetric(_metricNameService, "name", null, MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(2))); var engine = new MetricStatsCollection(); engine.MergeUnscopedStats(metric1.MetricName.Name, metric1.Data); engine.MergeUnscopedStats(metric1.MetricName.Name, metric1.Data); IEnumerable <MetricWireModel> stats = engine.ConvertToJsonForSending(_metricNameService); var count = 0; foreach (MetricWireModel current in stats) { count++; Assert.AreEqual("name", current.MetricName.Name); Assert.AreEqual(null, current.MetricName.Scope); Assert.AreEqual(2, current.Data.Value0); Assert.AreEqual(6, current.Data.Value1); Assert.AreEqual(4, current.Data.Value2); } Assert.AreEqual(1, count); var metric2 = MetricWireModel.BuildMetric(_metricNameService, "name", null, MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(4))); engine.MergeUnscopedStats(metric2.MetricName.Name, metric2.Data); engine.MergeUnscopedStats(metric2.MetricName.Name, metric2.Data); stats = engine.ConvertToJsonForSending(_metricNameService); count = 0; foreach (MetricWireModel current in stats) { count++; Assert.AreEqual("name", current.MetricName.Name); Assert.AreEqual(null, current.MetricName.Scope); Assert.AreEqual(4, current.Data.Value0); Assert.AreEqual(16, current.Data.Value1); Assert.AreEqual(12, current.Data.Value2); } Assert.AreEqual(1, count); }
private void TrySend(MetricWireModel metric) { if (metric == null) { return; } if (_publishMetricDelegate == null) { Log.WarnFormat("No PublishMetricDelegate to flush metric '{0}' through.", metric.MetricName.Name); return; } try { _publishMetricDelegate(metric); } catch (Exception ex) { Log.Error(ex); } }
public void Merge_MergesThreeMetricsCorrectly_WhenMergedProgressively() { var metric1 = MetricWireModel.BuildMetric(_metricNameService, "DotNet/name", "scope", MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(1))); var metric2 = MetricWireModel.BuildMetric(_metricNameService, "DotNet/name", "scope", MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(7), TimeSpan.FromSeconds(5))); var metric3 = MetricWireModel.BuildMetric(_metricNameService, "DotNet/name", "scope", MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(13), TimeSpan.FromSeconds(11))); var mergedMetric = MetricWireModel.Merge(new[] { metric1, metric2 }); mergedMetric = MetricWireModel.Merge(new[] { mergedMetric, metric3 }); NrAssert.Multiple( () => Assert.AreEqual("DotNet/name", mergedMetric.MetricName.Name), () => Assert.AreEqual(3, mergedMetric.Data.Value0), () => Assert.AreEqual(23, mergedMetric.Data.Value1), () => Assert.AreEqual(17, mergedMetric.Data.Value2), () => Assert.AreEqual(3, mergedMetric.Data.Value3), () => Assert.AreEqual(13, mergedMetric.Data.Value4), () => Assert.AreEqual(227, mergedMetric.Data.Value5) ); }
public void Harvest_AggregatesMetricsBeforeSending() { var sentMetrics = Enumerable.Empty <MetricWireModel>(); Mock.Arrange(() => _dataTransportService.Send(Arg.IsAny <IEnumerable <MetricWireModel> >())) .DoInstead <IEnumerable <MetricWireModel> >(metrics => sentMetrics = metrics); _metricAggregator.Collect(MetricWireModel.BuildMetric(_metricNameService, "DotNet/metric1", null, MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(3), TimeSpan.FromSeconds(1)))); _metricAggregator.Collect(MetricWireModel.BuildMetric(_metricNameService, "DotNet/metric1", null, MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(7), TimeSpan.FromSeconds(5)))); _metricAggregator.Collect(MetricWireModel.BuildMetric(_metricNameService, "DotNet/metric2", "scope2", MetricDataWireModel.BuildTimingData(TimeSpan.FromSeconds(7), TimeSpan.FromSeconds(5)))); _harvestAction(); Assert.NotNull(sentMetrics); Assert.AreEqual(3, sentMetrics.Count()); MetricWireModel sentMetric1 = null; MetricWireModel sentMetric2 = null; MetricWireModel sentMetric3 = null; foreach (MetricWireModel metric in sentMetrics) { if ("DotNet/metric1".Equals(metric.MetricName.Name)) { sentMetric1 = metric; } else if ("DotNet/metric2".Equals(metric.MetricName.Name)) { sentMetric2 = metric; } else if ("Supportability/MetricHarvest/transmit".Equals(metric.MetricName.Name)) { sentMetric3 = metric; } else { Assert.Fail("Unexpected metric name " + metric.MetricName.Name); } } NrAssert.Multiple( () => Assert.AreEqual("DotNet/metric1", sentMetric1.MetricName.Name), () => Assert.AreEqual(null, sentMetric1.MetricName.Scope), () => Assert.AreEqual(2, sentMetric1.Data.Value0), () => Assert.AreEqual(10, sentMetric1.Data.Value1), () => Assert.AreEqual(6, sentMetric1.Data.Value2), () => Assert.AreEqual(3, sentMetric1.Data.Value3), () => Assert.AreEqual(7, sentMetric1.Data.Value4), () => Assert.AreEqual(58, sentMetric1.Data.Value5), () => Assert.AreEqual("DotNet/metric2", sentMetric2.MetricName.Name), () => Assert.AreEqual("scope2", sentMetric2.MetricName.Scope), () => Assert.AreEqual(1, sentMetric2.Data.Value0), () => Assert.AreEqual(7, sentMetric2.Data.Value1), () => Assert.AreEqual(5, sentMetric2.Data.Value2), () => Assert.AreEqual(7, sentMetric2.Data.Value3), () => Assert.AreEqual(7, sentMetric2.Data.Value4), () => Assert.AreEqual(49, sentMetric2.Data.Value5), () => Assert.AreEqual(MetricNames.SupportabilityMetricHarvestTransmit, sentMetric3.MetricName.Name), () => Assert.AreEqual(null, sentMetric3.MetricName.Scope), () => Assert.AreEqual(1, sentMetric3.Data.Value0), () => Assert.AreEqual(0, sentMetric3.Data.Value1), () => Assert.AreEqual(0, sentMetric3.Data.Value2), () => Assert.AreEqual(0, sentMetric3.Data.Value3), () => Assert.AreEqual(0, sentMetric3.Data.Value4), () => Assert.AreEqual(0, sentMetric3.Data.Value5) ); }
// These should have already gone through the prenaming process public void MergeUnscopedStats(MetricWireModel metric) { _preCreatedUnscopedStats.Merge(metric.MetricName.Name, metric, _mergeUnscopedFunction); }
public void Merge_ThrowsIfAllNullsGiven() { NrAssert.Throws <Exception>(() => MetricWireModel.Merge(new MetricWireModel[] { null, null })); }
public void Merge_ThrowsIfEmptyListGiven() { NrAssert.Throws <Exception>(() => MetricWireModel.Merge(new MetricWireModel[] { })); }