public void SendANonEmptyMetricBatch() { var metricBatch = new NewRelicMetricBatch( metrics: new[] { NewRelicMetric.CreateGaugeMetric( name: "TestMetric", timestamp: null, attributes: null, value: 0), }); var dataSender = new MetricDataSender(new TelemetryConfiguration() { ApiKey = "123456" }); dataSender.WithHttpHandlerImpl((serializedJson) => { var response = new HttpResponseMessage(System.Net.HttpStatusCode.OK); return(Task.FromResult(response)); }); var response = dataSender.SendDataAsync(metricBatch).Result; Assert.Equal(NewRelicResponseStatus.Success, response.ResponseStatus); }
public void MetricBatchWithNoCommonElement() { var timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); var timestampL = timestamp; var interval = 125L; var gaugeValue = 213d; var metricBatch = new NewRelicMetricBatch( metrics: new[] { NewRelicMetric.CreateSummaryMetric( name: "SummaryMetric", timestamp: timestampL, attributes: null, interval: interval, summaryValue: new NewRelicMetricSummaryValue( count: 10d, sum: 64, min: 3, max: 15)), NewRelicMetric.CreateGaugeMetric( name: "GaugeMetric", timestamp: timestampL, attributes: null, value: gaugeValue), }); var actualMetrics = metricBatch.Metrics.ToArray(); Assert.Equal(2, actualMetrics.Length); Assert.Empty(metricBatch.CommonProperties.Attributes); Assert.Null(metricBatch.CommonProperties.IntervalMs); Assert.Null(metricBatch.CommonProperties.Timestamp); }
public void MetricBatchWithCommonPropertiesAndMetrics() { var timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); var interval = 125L; var commonAttrs = new Dictionary <string, object>() { { "attr1Key", "attr1Value" } }; var countValue = 88d; var gaugeValue = 213d; var metricBatch = new NewRelicMetricBatch( commonProperties: new NewRelicMetricBatchCommonProperties( timestamp: timestamp, intervalMs: interval, attributes: new Dictionary <string, object>() { { "attr1Key", "attr1Value" }, }), metrics: new[] { NewRelicMetric.CreateCountMetric( name: "CountMetric", timestamp: null, attributes: null, value: countValue, intervalMs: interval), NewRelicMetric.CreateGaugeMetric( name: "GaugeMetric", timestamp: null, attributes: null, value: gaugeValue), }); var actualMetrics = metricBatch.Metrics.ToArray(); Assert.Equal(timestamp, metricBatch.CommonProperties.Timestamp); Assert.Equal(interval, metricBatch.CommonProperties.IntervalMs); Assert.Equal(2, actualMetrics.Length); Assert.Equal("count", actualMetrics[0].Type); Assert.Equal("gauge", actualMetrics[1].Type); }
public void BuildGaugeMetric() { var timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); var value = 87; var metric = NewRelicMetric.CreateGaugeMetric( name: "metricName", timestamp: timestamp, attributes: new Dictionary <string, object> { { "attrKey", "attrValue" }, { "adsfasdf", 12 }, }, value: value); Assert.Equal("metricName", metric.Name); Assert.Equal("gauge", metric.Type); Assert.Equal(value, metric.Value); Assert.Equal(timestamp, metric.Timestamp); Assert.Equal(12, metric.Attributes?["adsfasdf"]); Assert.Equal("attrValue", metric.Attributes?["attrKey"]); }
private void CollectAndPostMetrics() { var attributes = new Dictionary <string, object> { { "service.instance.id", ServiceInstanceId.ToString() }, { "service.name", ServiceName } }; // First get overall metrics var client = MainWindow.AudioManagers.First().Client; var playersOnSrs = NewRelicMetric.CreateGaugeMetric("PlayersOnSrs", null, new Dictionary <string, object> { { "callsign", "HasCallsign" } }, client.GetBotCallsignCompatibleClients().Count); var players = client.GetHumanSrsClientNames(); foreach (var sl2 in client.GetBotCallsignCompatibleClients()) { players.Remove(sl2); } var botCompatiblePlayersOnSrs = NewRelicMetric.CreateGaugeMetric("PlayersOnSrs", null, new Dictionary <string, object> { { "callsign", "NoCallsign" } }, players.Count); // Get Thread metrics var warningCheckers = NewRelicMetric.CreateGaugeMetric("CheckerThreads", null, new Dictionary <string, object> { { "type", "WarningRadius" } }, WarningRadiusChecker.WarningChecks.Count); var atcCheckers = NewRelicMetric.CreateGaugeMetric("CheckerThreads", null, new Dictionary <string, object> { { "type", "Atc" } }, AtcProgressChecker.AtcChecks.Count); var metrics = new List <NewRelicMetric> { playersOnSrs, botCompatiblePlayersOnSrs, warningCheckers, atcCheckers }; var frequencyCount = new Dictionary <double, int>(); List <double> botFreqs = new List <double>(); // Get per-client metrics var totalPlayerCount = client.GetHumanSrsClientNames().Count; var playerOnBotFreqCount = 0; // Get stats for the frequencies the bot is listening on foreach (var audioManager in MainWindow.AudioManagers) { var radioInfo = audioManager.PlayerRadioInfo.radios.First(); var playersOnFreqCount = audioManager.Client.GetHumansOnFreq(audioManager.PlayerRadioInfo.radios.First()).Count; playerOnBotFreqCount += playersOnFreqCount; botFreqs.Add(radioInfo.freq); metrics.Add(NewRelicMetric.CreateGaugeMetric("PlayersOnFrequency", DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), new Dictionary <string, object> { { "frequency", $"{radioInfo.freq / 1000000} - Bot {radioInfo.botType}" } }, playersOnFreqCount)); metrics.Add(NewRelicMetric.CreateGaugeMetric("PlayersOnBotFrequency", DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), new Dictionary <string, object> { { "frequency", $"{radioInfo.freq / 1000000} - Bot {radioInfo.botType}" } }, playersOnFreqCount)); } if (totalPlayerCount == 0 || playerOnBotFreqCount == 0) { metrics.Add(NewRelicMetric.CreateGaugeMetric("PlayersOnBotFrequencyPercentage", DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), null, 0)); } else { var percentage = (double)playerOnBotFreqCount / totalPlayerCount * 100; metrics.Add(NewRelicMetric.CreateGaugeMetric("PlayersOnBotFrequencyPercentage", DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), null, (int)percentage)); } // Get stats for the frequencies the players are on that the bot may not be on foreach (var playerClient in MainWindow.AudioManagers.First().Client.GetHumanSrsClients()) { // We just want people in aircraft if (playerClient.Coalition == 0 || playerClient.RadioInfo.unit.Equals("External AWACS") || playerClient.RadioInfo.unit.Equals("CA")) { continue; } foreach (var radio in playerClient.RadioInfo.radios) { if (botFreqs.Contains(radio.freq) || (int)radio.freq == 1 || radio.modulation == RadioInformation.Modulation.INTERCOM) { continue; } var freq = radio.freq; if (frequencyCount.ContainsKey(freq)) { frequencyCount[freq] += 1; } else { frequencyCount.Add(freq, 1); } } } foreach (var data in frequencyCount) { metrics.Add(NewRelicMetric.CreateGaugeMetric("PlayersOnFrequency", DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), new Dictionary <string, object> { { "frequency", $"{data.Key / 1000000}" } }, data.Value)); } // Radio Call counts var counts = new Dictionary <string, Dictionary <string, int> >(); while (RadioCallIntents.Count > 0) { RadioCallIntents.TryDequeue(out var call); if (call.Key == null) { break; } if (!counts.ContainsKey(call.Key)) { counts.Add(call.Key, new Dictionary <string, int> { { call.Value, 1 } }); } else if (!counts[call.Key].ContainsKey(call.Value)) { counts[call.Key].Add(call.Value, 1); } else { counts[call.Key][call.Value] += 1; } } foreach (var count in counts) { var intent = count.Key; foreach (var frequencyCounts in count.Value) { var frequency = frequencyCounts.Key; var callCount = frequencyCounts.Value; metrics.Add(NewRelicMetric.CreateGaugeMetric("RadioCalls", DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), new Dictionary <string, object> { { "intent", intent }, { "frequency", frequency } }, callCount)); } } var batchProperties = new NewRelicMetricBatchCommonProperties(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), null, attributes); var batch = new NewRelicMetricBatch(metrics, batchProperties); _dataSender.SendDataAsync(batch); }