Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #6
0
        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);
            }
        }
Exemple #7
0
        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);
            }
        }