public static object GetRequestStream(object webRequest, int opCode, int mdToken, long moduleVersionPtr) { const string methodName = nameof(GetRequestStream); Func <object, Stream> callGetRequestStream; try { var instrumentedType = webRequest.GetInstrumentedType(WebRequestTypeName); callGetRequestStream = MethodBuilder <Func <object, Stream> > .Start(moduleVersionPtr, mdToken, opCode, methodName) .WithConcreteType(instrumentedType) .WithNamespaceAndNameFilters("System.IO.Stream") .Build(); } catch (Exception ex) { Log.ErrorRetrievingMethod( exception: ex, moduleVersionPointer: moduleVersionPtr, mdToken: mdToken, opCode: opCode, instrumentedType: WebRequestTypeName, methodName: methodName, instanceType: webRequest.GetType().AssemblyQualifiedName); throw; } var request = (WebRequest)webRequest; if (!(request is HttpWebRequest) || !IsTracingEnabled(request)) { return(callGetRequestStream(webRequest)); } var tracer = Tracer.Instance; if (tracer.Settings.IsIntegrationEnabled(IntegrationId)) { var spanContext = ScopeFactory.CreateHttpSpanContext(tracer, IntegrationId); if (spanContext != 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(spanContext, request.Headers.Wrap()); } } return(callGetRequestStream(webRequest)); }
public static object GetRequestStream(object webRequest, int opCode, int mdToken, long moduleVersionPtr) { if (webRequest == null) { throw new ArgumentNullException(nameof(webRequest)); } const string methodName = nameof(GetRequestStream); Func <object, Stream> callGetRequestStream; try { var instrumentedType = webRequest.GetInstrumentedType("System.Net.WebRequest"); callGetRequestStream = MethodBuilder <Func <object, Stream> > .Start(moduleVersionPtr, mdToken, opCode, methodName) .WithConcreteType(instrumentedType) .WithNamespaceAndNameFilters("System.IO.Stream") .Build(); } catch (Exception ex) { Log.ErrorRetrievingMethod( exception: ex, moduleVersionPointer: moduleVersionPtr, mdToken: mdToken, opCode: opCode, instrumentedType: WebRequestTypeName, methodName: methodName, instanceType: webRequest.GetType().AssemblyQualifiedName); throw; } var request = (WebRequest)webRequest; if (!(request is HttpWebRequest) || !IsTracingEnabled(request)) { return(callGetRequestStream(webRequest)); } var spanContext = ScopeFactory.CreateHttpSpanContext(Tracer.Instance, request.Method, request.RequestUri, IntegrationName); if (spanContext != null) { // Add distributed tracing headers to the HTTP request. The actual span is going to be created // when GetResponse is called. Tracer.Instance.Propagator.Inject(spanContext, request.Headers.Wrap()); } return(callGetRequestStream(webRequest)); }
/// <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) { if (instance is HttpWebRequest request && WebRequestCommon.IsTracingEnabled(request)) { var tracer = Tracer.Instance; if (tracer.Settings.IsIntegrationEnabled(WebRequestCommon.IntegrationId)) { var spanContext = ScopeFactory.CreateHttpSpanContext(tracer, WebRequestCommon.IntegrationId); if (spanContext != 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(spanContext, request.Headers.Wrap()); } } } return(CallTargetState.GetDefault()); }