/// <summary> /// OnMethodBegin callback /// </summary> /// <typeparam name="TTarget">Type of the target</typeparam> /// <param name="instance">Instance value, aka `this` of the instrumented method.</param> /// <returns>Calltarget state value</returns> internal static CallTargetState OnMethodBegin <TTarget>(TTarget instance) { if (instance is HttpWebRequest request && WebRequestCommon.IsTracingEnabled(request)) { var tracer = Tracer.Instance; if (tracer.Settings.IsIntegrationEnabled(WebRequestCommon.IntegrationId)) { var span = ScopeFactory.CreateInactiveOutboundHttpSpan(tracer, request.Method, request.RequestUri, WebRequestCommon.IntegrationId, out _, traceId: null, spanId: null, startTime: null, addToTraceContext: false); if (span?.Context != null) { // Add distributed tracing headers to the HTTP request. // The expected sequence of calls is GetRequestStream -> GetResponse. Headers can't be modified after calling GetRequestStream. // At the same time, we don't want to set an active scope now, because it's possible that GetResponse will never be called. // Instead, we generate a spancontext and inject it in the headers. GetResponse will fetch them and create an active scope with the right id. SpanContextPropagator.Instance.Inject(span.Context, request.Headers.Wrap()); } } } return(CallTargetState.GetDefault()); }
/// <summary> /// OnMethodBegin callback /// </summary> /// <typeparam name="TTarget">Type of the target</typeparam> /// <param name="instance">Instance value, aka `this` of the instrumented method.</param> /// <param name="callback">The AsyncCallback delegate</param> /// <param name="state">An object containing state information for this asynchronous request</param> /// <returns>Calltarget state value</returns> internal static CallTargetState OnMethodBegin <TTarget>(TTarget instance, AsyncCallback callback, object state) { if (instance is HttpWebRequest request && WebRequestCommon.IsTracingEnabled(request)) { var tracer = Tracer.Instance; // We may have already set headers if (request.Headers.Get(HttpHeaderNames.TraceId) is null) { var span = ScopeFactory.CreateInactiveOutboundHttpSpan(tracer, request.Method, request.RequestUri, WebRequestCommon.IntegrationId, out _, traceId: null, spanId: null, startTime: null, addToTraceContext: false); if (span?.Context != null) { // Add distributed tracing headers to the HTTP request. // We don't want to set an active scope now, because it's possible that EndGetResponse will never be called. // Instead, we generate a spancontext and inject it in the headers. EndGetResponse will fetch them and create an active scope with the right id. SpanContextPropagator.Instance.Inject(span.Context, request.Headers.Wrap()); } } } return(CallTargetState.GetDefault()); }
/// <summary> /// OnMethodBegin callback /// </summary> /// <typeparam name="TTarget">Type of the target</typeparam> /// <param name="instance">Instance value, aka `this` of the instrumented method.</param> /// <returns>Calltarget state value</returns> public static CallTargetState OnMethodBegin <TTarget>(TTarget instance) { return(WebRequestCommon.GetResponse_OnMethodBegin(instance)); }