public void MetricDataReadSuccessfully() { EventData eventData = new EventData(); eventData.Payload.Add("metricValue", 17.4); EventMetadata metricMetadata = new EventMetadata(MetricData.MetricMetadataKind); metricMetadata.Properties.Add(MetricData.MetricNameMoniker, "SomeMetric"); metricMetadata.Properties.Add(MetricData.MetricValueMoniker, "33.5"); // Fixed-value metric var result = MetricData.TryGetData(eventData, metricMetadata, out MetricData md); Assert.Equal(DataRetrievalStatus.Success, result.Status); Assert.Equal(33.5, md.Value, DoublePrecisionTolerance); Assert.Equal("SomeMetric", md.MetricName); // Value read from event properties metricMetadata.Properties.Remove(MetricData.MetricValueMoniker); metricMetadata.Properties.Add(MetricData.MetricValuePropertyMoniker, "metricValue"); result = MetricData.TryGetData(eventData, metricMetadata, out md); Assert.Equal(DataRetrievalStatus.Success, result.Status); Assert.Equal(17.4, md.Value, DoublePrecisionTolerance); // Able to convert event property value to a double as needed eventData.Payload["metricValue"] = "3.14"; result = MetricData.TryGetData(eventData, metricMetadata, out md); Assert.Equal(DataRetrievalStatus.Success, result.Status); Assert.Equal(3.14, md.Value, DoublePrecisionTolerance); }
public void AddsMetadataToMetricTelemetry() { UnitTestOutput unitTestOutput = null; DateTimeOffset now = DateTimeOffset.Now; using (var pipeline = DiagnosticPipelineFactory.CreatePipeline(diagnosticPipelineConfiguration_.Value)) { unitTestOutput = pipeline.Sinks.First().Output as UnitTestOutput; TelemetryConfiguration telemetryConfiguration = GetAppInsightsTestTelemetryConfiguration(); EventFlowTelemetryProcessor efTelemetryProcessor = telemetryConfiguration.DefaultTelemetrySink.TelemetryProcessors.OfType <EventFlowTelemetryProcessor>().First(); efTelemetryProcessor.Pipeline = pipeline; TelemetryClient client = new TelemetryClient(telemetryConfiguration); MetricTelemetry metric = new MetricTelemetry("rps", 223.7d); metric.Timestamp = now; client.TrackMetric(metric); } Assert.Equal(1, unitTestOutput.EventCount); Assert.True(unitTestOutput.CapturedEvents.TryDequeue(out EventData eventData)); Assert.Equal(now, eventData.Timestamp); Assert.True(eventData.TryGetMetadata(MetricData.MetricMetadataKind, out IReadOnlyCollection <EventMetadata> eventMetadata)); Assert.Equal(1, eventMetadata.Count); EventMetadata metricMetadata = eventMetadata.ElementAt(0); Assert.Equal(DataRetrievalResult.Success, MetricData.TryGetData(eventData, metricMetadata, out MetricData metricData)); Assert.Equal("rps", metricData.MetricName); Assert.Equal(223.7d, metricData.Value); }
private EventDataParsed ParseMetricEvent(EventData eventData, EventMetadata metricMetadata) { var result = MetricData.TryGetData(eventData, metricMetadata, out MetricData metricData); if (result.Status != DataRetrievalStatus.Success) { _healthReporter.ReportProblem($"{nameof(SqlTableOutput)}: {result.Message}", EventFlowContextIdentifiers.Output); return(null); } var metricEventData = eventData.DeepClone(); metricEventData.Payload[nameof(MetricData.MetricName)] = metricData.MetricName; metricEventData.Payload[nameof(MetricData.Value)] = metricData.Value; return(new MetricDataParsed(metricEventData, ParseEventCustomProperties(eventData))); }
public void MetricDataExpectedReadFailures() { EventData eventData = new EventData(); // Invalid metadata type EventMetadata metricMetadata = new EventMetadata("someOtherType"); var result = MetricData.TryGetData(eventData, metricMetadata, out MetricData md); Assert.Equal(DataRetrievalStatus.InvalidMetadataType, result.Status); // No metricName or metricNameProperty on the metadata metricMetadata = new EventMetadata(MetricData.MetricMetadataKind); result = MetricData.TryGetData(eventData, metricMetadata, out md); Assert.Equal(DataRetrievalStatus.MetadataPropertyMissing, result.Status); Assert.Contains("Expected property 'metricName'", result.Message); // metricNameProperty points to a property that does not exist metricMetadata.Properties.Add(MetricData.MetricNamePropertyMoniker, "customMetricName"); result = MetricData.TryGetData(eventData, metricMetadata, out md); Assert.Equal(DataRetrievalStatus.DataMissingOrInvalid, result.Status); // No metricValue or metricValueProperty on the metadata metricMetadata.Properties.Remove(MetricData.MetricNamePropertyMoniker); metricMetadata.Properties.Add(MetricData.MetricNameMoniker, "SomeMetric"); result = MetricData.TryGetData(eventData, metricMetadata, out md); Assert.Equal(DataRetrievalStatus.MetadataPropertyMissing, result.Status); Assert.Contains("Expected property 'metricValue'", result.Message); // metricValue cannot be parsed metricMetadata.Properties.Add("metricValue", "not_a_number"); result = MetricData.TryGetData(eventData, metricMetadata, out md); Assert.Equal(DataRetrievalStatus.InvalidMetadataValue, result.Status); // metricValueProperty points to a property that does not exist metricMetadata.Properties.Remove("metricValue"); metricMetadata.Properties.Add("metricValueProperty", "value"); result = MetricData.TryGetData(eventData, metricMetadata, out md); Assert.Equal(DataRetrievalStatus.DataMissingOrInvalid, result.Status); // metricValueProperty points to a property that does not containa a value that can be parsed as double eventData.Payload.Add("value", "not-a-number"); result = MetricData.TryGetData(eventData, metricMetadata, out md); Assert.Equal(DataRetrievalStatus.DataMissingOrInvalid, result.Status); }
private BulkIndexOperation <EventData> CreateMetricOperation(EventData eventData, EventMetadata metricMetadata, string currentIndexName) { var result = MetricData.TryGetData(eventData, metricMetadata, out MetricData metricData); if (result.Status != DataRetrievalStatus.Success) { this.healthReporter.ReportProblem("ElasticSearchOutput: " + result.Message, EventFlowContextIdentifiers.Output); return(null); } var metricEventData = eventData.DeepClone(); metricEventData.Payload[nameof(MetricData.MetricName)] = metricData.MetricName; metricEventData.Payload[nameof(MetricData.Value)] = metricData.Value; var operation = CreateOperation(metricEventData, currentIndexName); return(operation); }
private void TrackMetric(EventData e, IReadOnlyCollection <EventMetadata> metadata) { Debug.Assert(metadata != null); foreach (EventMetadata metricMetadata in metadata) { MetricData metricData; var result = MetricData.TryGetData(e, metricMetadata, out metricData); if (result.Status != DataRetrievalStatus.Success) { this.healthReporter.ReportWarning("ApplicationInsightsOutput: " + result.Message, EventFlowContextIdentifiers.Output); continue; } MetricTelemetry mt = new MetricTelemetry(); mt.Name = metricData.MetricName; mt.Value = metricData.Value; AddProperties(mt, e); telemetryClient.TrackMetric(mt); } }
private IEnumerable <IBulkOperation> GetCreateOperationsForEvent(EventData eventData, string currentIndexName, string documentTypeName) { bool reportedAsMetricOrRequest = false; BulkCreateOperation <EventData> operation; // Synthesize a separate record for each metric and request metadata associated with the event IReadOnlyCollection <EventMetadata> metadataSet; if (eventData.TryGetMetadata(MetricData.MetricMetadataKind, out metadataSet)) { foreach (var metricMetadata in metadataSet) { MetricData metricData; var result = MetricData.TryGetData(eventData, metricMetadata, out metricData); if (result.Status != DataRetrievalStatus.Success) { this.healthReporter.ReportProblem("ElasticSearchOutput: " + result.Message, EventFlowContextIdentifiers.Output); continue; } var metricEventData = eventData.DeepClone(); metricEventData.Payload[nameof(MetricData.MetricName)] = metricData.MetricName; metricEventData.Payload[nameof(MetricData.Value)] = metricData.Value; operation = new BulkCreateOperation <EventData>(metricEventData); operation.Index = currentIndexName; operation.Type = documentTypeName; reportedAsMetricOrRequest = true; yield return(operation); } } if (eventData.TryGetMetadata(RequestData.RequestMetadataKind, out metadataSet)) { foreach (var requestMetadata in metadataSet) { RequestData requestData; var result = RequestData.TryGetData(eventData, requestMetadata, out requestData); if (result.Status != DataRetrievalStatus.Success) { this.healthReporter.ReportProblem("ElasticSearchOutput: " + result.Message, EventFlowContextIdentifiers.Output); continue; } var requestEventData = eventData.DeepClone(); requestEventData.Payload[nameof(RequestData.RequestName)] = requestData.RequestName; if (requestData.Duration != null) { requestEventData.Payload[nameof(RequestData.Duration)] = requestData.Duration; } if (requestData.IsSuccess != null) { requestEventData.Payload[nameof(RequestData.IsSuccess)] = requestData.IsSuccess; } if (requestData.ResponseCode != null) { requestEventData.Payload[nameof(RequestData.ResponseCode)] = requestData.ResponseCode; } operation = new BulkCreateOperation <EventData>(requestEventData); operation.Index = currentIndexName; operation.Type = documentTypeName; reportedAsMetricOrRequest = true; yield return(operation); } } if (!reportedAsMetricOrRequest) { operation = new BulkCreateOperation <EventData>(eventData); operation.Index = currentIndexName; operation.Type = documentTypeName; yield return(operation); } }