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); }
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))); }
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); }
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; }