public override void OnStartActivity(Activity activity, object payload) { if (!(this.startRequestFetcher.Fetch(payload) is HttpRequestMessage request)) { HttpInstrumentationEventSource.Log.NullPayload(nameof(HttpHandlerDiagnosticListener), nameof(this.OnStartActivity)); return; } if (this.options.TextFormat.IsInjected(request, HttpRequestMessageHeaderValuesGetter)) { // this request is already instrumented, we should back off activity.IsAllDataRequested = false; return; } activity.SetKind(ActivityKind.Client); activity.DisplayName = HttpTagHelper.GetOperationNameForHttpMethod(request.Method); this.activitySource.Start(activity); if (activity.IsAllDataRequested) { activity.AddTag(SemanticConventions.AttributeHttpMethod, HttpTagHelper.GetNameForHttpMethod(request.Method)); activity.AddTag(SemanticConventions.AttributeHttpHost, HttpTagHelper.GetHostTagValueFromRequestUri(request.RequestUri)); activity.AddTag(SemanticConventions.AttributeHttpUrl, request.RequestUri.OriginalString); if (this.options.SetHttpFlavor) { activity.AddTag(SemanticConventions.AttributeHttpFlavor, HttpTagHelper.GetFlavorTagValueFromProtocolVersion(request.Version)); } } if (!(this.httpClientSupportsW3C && this.options.TextFormat is TraceContextFormat)) { this.options.TextFormat.Inject(activity.Context, request, HttpRequestMessageHeaderValueSetter); } }
public override void OnStopActivity(Activity activity, object payload) { if (Sdk.SuppressInstrumentation) { return; } if (this.stopResponseFetcher.TryFetch(payload, out HttpResponseMessage response) && response != null) { var request = response.RequestMessage; // TODO: This is just a minimal set of attributes. See the spec for additional attributes: // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/semantic_conventions/http-metrics.md#http-client var tags = new KeyValuePair <string, object>[] { new KeyValuePair <string, object>(SemanticConventions.AttributeHttpMethod, HttpTagHelper.GetNameForHttpMethod(request.Method)), new KeyValuePair <string, object>(SemanticConventions.AttributeHttpScheme, request.RequestUri.Scheme), new KeyValuePair <string, object>(SemanticConventions.AttributeHttpStatusCode, (int)response.StatusCode), new KeyValuePair <string, object>(SemanticConventions.AttributeHttpFlavor, HttpTagHelper.GetFlavorTagValueFromProtocolVersion(request.Version)), }; this.httpClientDuration.Record(activity.Duration.TotalMilliseconds, tags); } }