public void MetricSet_Serializes_And_Deserializes() { var samples = new List <MetricSample> { new MetricSample("sample_1", 1), new MetricSample("sample*\"2", 2), new MetricSample("sample_1", 3) }; var metricSet = new Elastic.Apm.Metrics.MetricSet(1603343944891, samples); var json = _payloadItemSerializer.Serialize(metricSet); json.Should().Be("{\"samples\":{\"sample_1\":{\"value\":1.0},\"sample__2\":{\"value\":2.0}},\"timestamp\":1603343944891}"); var deserialized = _payloadItemSerializer.Deserialize <Elastic.Apm.Metrics.MetricSet>(json); deserialized.Timestamp.Should().Be(metricSet.Timestamp); deserialized.Samples.Count().Should().Be(2); var count = 0; foreach (var sample in deserialized.Samples) { sample.KeyValue.Key.Should().Be(samples[count].KeyValue.Key.Replace("*", "_").Replace("\"", "_")); sample.KeyValue.Value.Should().Be(samples[count].KeyValue.Value); ++count; } }
internal void CollectAllMetricsImpl() { _logger.Trace()?.Log("CollectAllMetrics started"); var samplesFromAllProviders = CollectMetricsFromProviders(); if (samplesFromAllProviders.IsEmpty()) { _logger.Debug()?.Log("No metrics collected (no provider returned valid samples) - nothing to send to APM Server"); return; } var metricSet = new MetricSet(TimeUtils.TimestampNow(), samplesFromAllProviders); try { _payloadSender.QueueMetrics(metricSet); _logger.Debug() ?.Log("Metrics collected: {data}", samplesFromAllProviders.Any() ? samplesFromAllProviders.Select(n => n.ToString()).Aggregate((i, j) => i + ", " + j) : "no metrics collected"); } catch (Exception e) { _logger.Error() ?.LogException(e, "Failed sending metrics through PayloadSender - metrics collection stops"); _timer.Stop(); _timer.Dispose(); } }
internal void CollectAllMetricsImpl() { _logger.Trace()?.Log("CollectAllMetrics started"); var samplesFromAllProviders = new List <MetricSample>(); // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator foreach (var metricsProvider in MetricsProviders) { if (metricsProvider.ConsecutiveNumberOfFailedReads == MaxTryWithoutSuccess) { continue; } try { _logger.Trace()?.Log("Start collecting {MetricsProviderName}", metricsProvider.DbgName); var samplesFromCurrentProvider = metricsProvider.GetSamples(); if (samplesFromCurrentProvider != null) { var sampleArray = samplesFromCurrentProvider as MetricSample[] ?? samplesFromCurrentProvider.ToArray(); if (sampleArray.Any()) { _logger.Trace()?.Log("Collected {MetricsProviderName} - adding it to MetricSet", metricsProvider.DbgName); samplesFromAllProviders.AddRange(sampleArray); } metricsProvider.ConsecutiveNumberOfFailedReads = 0; } else { metricsProvider.ConsecutiveNumberOfFailedReads++; } } catch (Exception e) { metricsProvider.ConsecutiveNumberOfFailedReads++; _logger.Error() ?.LogException(e, "Failed reading {ProviderName} {NumberOfFail} times", metricsProvider.DbgName, metricsProvider.ConsecutiveNumberOfFailedReads); } if (metricsProvider.ConsecutiveNumberOfFailedReads != MaxTryWithoutSuccess) { continue; } _logger.Info() ?.Log("Failed reading {operationName} {numberOfTimes} consecutively - the agent won't try reading {operationName} anymore", metricsProvider.DbgName, metricsProvider.ConsecutiveNumberOfFailedReads, metricsProvider.DbgName); } var metricSet = new MetricSet(TimeUtils.TimestampNow(), samplesFromAllProviders); try { _payloadSender.QueueMetrics(metricSet); _logger.Debug() ?.Log("Metrics collected: {data}", samplesFromAllProviders.Any() ? samplesFromAllProviders.Select(n => n.ToString()).Aggregate((i, j) => i + ", " + j) : "no metrics collected"); } catch (Exception e) { _logger.Error() ?.LogException(e, "Failed sending metrics through PayloadSender - metrics collection stops"); _timer.Stop(); _timer.Dispose(); } }
internal void CollectAllMetrics() { var sync = Interlocked.CompareExchange(ref _syncPoint, 1, 0); if (sync != 0) { return; } try { var samplesFromAllProviders = new List <MetricSample>(); foreach (var metricsProvider in MetricsProviders) { if (metricsProvider.ConsecutiveNumberOfFailedReads == MaxTryWithoutSuccess) { continue; } try { var samplesFromCurrentProvider = metricsProvider.GetSamples(); if (samplesFromCurrentProvider != null) { var sampleArray = samplesFromCurrentProvider as MetricSample[] ?? samplesFromCurrentProvider.ToArray(); if (sampleArray.Any()) { samplesFromAllProviders.AddRange(sampleArray); } metricsProvider.ConsecutiveNumberOfFailedReads = 0; } else { metricsProvider.ConsecutiveNumberOfFailedReads++; } } catch (Exception e) { metricsProvider.ConsecutiveNumberOfFailedReads++; _logger.Error() ?.LogException(e, "Failed reading {ProviderName} {NumberOfFail} times", metricsProvider.DbgName, metricsProvider.ConsecutiveNumberOfFailedReads); } if (metricsProvider.ConsecutiveNumberOfFailedReads != MaxTryWithoutSuccess) { continue; } _logger.Info() ?.Log("Failed reading {operationName} {numberOfTimes} consecutively - the agent won't try reading {operationName} anymore", metricsProvider.DbgName, metricsProvider.ConsecutiveNumberOfFailedReads, metricsProvider.DbgName); } var metricSet = new MetricSet(TimeUtils.TimestampNow(), samplesFromAllProviders); try { _payloadSender.QueueMetrics(metricSet); _logger.Debug() ?.Log("Metrics collected: {data}", samplesFromAllProviders.Any() ? samplesFromAllProviders.Select(n => n.ToString()).Aggregate((i, j) => i + ", " + j) : "no metrics collected"); } catch (Exception e) { _logger.Error() ?.LogException(e, "Failed sending metrics through PayloadSender - metrics collection stops"); _timer.Stop(); _timer.Dispose(); } } catch (Exception e) { _logger.Error() ?.LogExceptionWithCaller(e); } finally { _syncPoint = 0; } }