public void DependencyDataReadSuccessfully()
        {
            // The handling of isSuccess, duration and response code is tested fairly thoroughly by Request tests,
            // so here wie will just focus on Dependency-specific properties: target and dependency type.
            EventData eventData = new EventData();

            eventData.Payload.Add("isSuccess", true);
            eventData.Payload.Add("responseCode", "200 OK");
            eventData.Payload.Add("duration", 212);
            eventData.Payload.Add("targetServiceUrl", "http://customerdata");

            EventMetadata dependencyMetadata = new EventMetadata("dependency");

            dependencyMetadata.Properties.Add("isSuccessProperty", "isSuccess");
            dependencyMetadata.Properties.Add("responseCodeProperty", "responseCode");
            dependencyMetadata.Properties.Add("durationProperty", "duration");
            dependencyMetadata.Properties.Add("targetProperty", "targetServiceUrl");
            dependencyMetadata.Properties.Add("dependencyType", "CustomerDataService");

            var result = DependencyData.TryGetData(eventData, dependencyMetadata, out DependencyData dd);

            Assert.Equal(DataRetrievalStatus.Success, result.Status);
            Assert.True(dd.IsSuccess);
            Assert.Equal("200 OK", dd.ResponseCode);
            Assert.Equal(212, dd.Duration.Value.TotalMilliseconds, DoublePrecisionTolerance);
            Assert.Equal("http://customerdata", dd.Target);
            Assert.Equal("CustomerDataService", dd.DependencyType);
        }
Esempio n. 2
0
        private EventDataParsed ParseDependencyEvent(EventData eventData, EventMetadata dependencyMetadata)
        {
            var result = DependencyData.TryGetData(eventData, dependencyMetadata, out DependencyData dependencyData);

            if (result.Status != DataRetrievalStatus.Success)
            {
                _healthReporter.ReportProblem($"{nameof(SqlTableOutput)}: {result.Message}", EventFlowContextIdentifiers.Output);
                return(null);
            }

            var dependencyEventData = eventData.DeepClone();

            if (dependencyData.Duration != null)
            {
                dependencyEventData.Payload[nameof(DependencyData.Duration)] = dependencyData.Duration;
            }
            if (dependencyData.IsSuccess != null)
            {
                dependencyEventData.Payload[nameof(DependencyData.IsSuccess)] = dependencyData.IsSuccess;
            }
            if (dependencyData.ResponseCode != null)
            {
                dependencyEventData.Payload[nameof(DependencyData.ResponseCode)] = dependencyData.ResponseCode;
            }
            if (dependencyData.Target != null)
            {
                dependencyEventData.Payload[nameof(DependencyData.Target)] = dependencyData.Target;
            }
            if (dependencyData.DependencyType != null)
            {
                dependencyEventData.Payload[nameof(DependencyData.DependencyType)] = dependencyData.DependencyType;
            }
            return(new DependencyDataParsed(dependencyEventData, ParseEventCustomProperties(eventData)));
        }
Esempio n. 3
0
        public void AddsMetadataDependencyTelemetry()
        {
            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);
                client.TrackDependency("FlawlessDependency", "https://flawless.microsoft.com", "dpName", "payload",
                                       now, TimeSpan.FromMilliseconds(178), "201 Created", success: true);
            }

            Assert.Equal(1, unitTestOutput.EventCount);
            Assert.True(unitTestOutput.CapturedEvents.TryDequeue(out EventData eventData));
            Assert.Equal(now, eventData.Timestamp);

            Assert.True(eventData.TryGetMetadata(DependencyData.DependencyMetadataKind, out IReadOnlyCollection <EventMetadata> eventMetadata));
            Assert.Equal(1, eventMetadata.Count);

            EventMetadata dependencyMetadata = eventMetadata.ElementAt(0);

            Assert.Equal(DataRetrievalResult.Success, DependencyData.TryGetData(eventData, dependencyMetadata, out DependencyData dependencyData));

            Assert.True(dependencyData.IsSuccess);
            Assert.Equal(TimeSpan.FromMilliseconds(178), dependencyData.Duration);
            Assert.Equal("201 Created", dependencyData.ResponseCode);
            Assert.Equal("https://flawless.microsoft.com", dependencyData.Target);
            Assert.Equal("FlawlessDependency", dependencyData.DependencyType);
        }
        private BulkIndexOperation <EventData> CreateDependencyOperation(
            EventData eventData,
            EventMetadata dependencyMetadata,
            string currentIndexName,
            string documentTypeName)
        {
            var result = DependencyData.TryGetData(eventData, dependencyMetadata, out DependencyData dependencyData);

            if (result.Status != DataRetrievalStatus.Success)
            {
                this.healthReporter.ReportProblem("ElasticSearchOutput: " + result.Message, EventFlowContextIdentifiers.Output);
                return(null);
            }

            var dependencyEventData = eventData.DeepClone();

            if (dependencyData.Duration != null)
            {
                dependencyEventData.Payload[nameof(DependencyData.Duration)] = dependencyData.Duration;
            }
            if (dependencyData.IsSuccess != null)
            {
                dependencyEventData.Payload[nameof(DependencyData.IsSuccess)] = dependencyData.IsSuccess;
            }
            if (dependencyData.ResponseCode != null)
            {
                dependencyEventData.Payload[nameof(DependencyData.ResponseCode)] = dependencyData.ResponseCode;
            }
            if (dependencyData.Target != null)
            {
                dependencyEventData.Payload[nameof(DependencyData.Target)] = dependencyData.Target;
            }
            if (dependencyData.DependencyType != null)
            {
                dependencyEventData.Payload[nameof(DependencyData.DependencyType)] = dependencyData.DependencyType;
            }
            var operation = CreateOperation(dependencyEventData, currentIndexName, documentTypeName);

            return(operation);
        }
        public void DependencyDataExpectedReadFailure()
        {
            // The handling of isSuccess, duration and response code is tested fairly thoroughly by Request tests,
            // so here wie will just focus on Dependency-specific properties: target and dependency type.

            // Target property points to non-existent property
            EventData eventData = new EventData();

            EventMetadata dependencyMetadata = new EventMetadata("dependency");

            dependencyMetadata.Properties.Add("targetProperty", "targetServiceUrl");

            var result = DependencyData.TryGetData(eventData, dependencyMetadata, out DependencyData dd);

            Assert.Equal(DataRetrievalStatus.DataMissingOrInvalid, result.Status);
            Assert.Contains("The expected event property 'targetServiceUrl'", result.Message);

            // Just make sure that after addressing all the issues you can read all the data successfully
            eventData.Payload.Add("targetServiceUrl", "http://customerdata");
            result = DependencyData.TryGetData(eventData, dependencyMetadata, out dd);
            Assert.Equal(DataRetrievalStatus.Success, result.Status);
        }
Esempio n. 6
0
        private bool TrackDependency(EventData e, IReadOnlyCollection<EventMetadata> metadata)
        {
            Debug.Assert(metadata != null);
            bool tracked = false;

            foreach (EventMetadata dependencyMetadata in metadata)
            {
                var result = DependencyData.TryGetData(e, dependencyMetadata, out DependencyData dependencyData);
                if (result.Status != DataRetrievalStatus.Success)
                {
                    this.healthReporter.ReportWarning("ApplicationInsightsOutput: " + result.Message, EventFlowContextIdentifiers.Output);
                    continue;
                }

                var dt = new DependencyTelemetry();

                if (dependencyData.Duration != null)
                {
                    dt.Duration = dependencyData.Duration.Value;
                    // TODO: add an option to extract request start time from event data
                    DateTimeOffset startTime = e.Timestamp.Subtract(dependencyData.Duration.Value);
                    dt.Timestamp = startTime.ToUniversalTime();
                }

                dt.Success = dependencyData.IsSuccess;
                dt.ResultCode = dependencyData.ResponseCode;
                dt.Target = dependencyData.Target;
                dt.Type = dependencyData.DependencyType;

                AddProperties(dt, e, setTimestampFromEventData: false);

                telemetryClient.TrackDependency(dt);
                tracked = true;
            }

            return tracked;
        }