protected async override Task <HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { if (!PublishCounters && !PublishEvent) { return(await base.SendAsync(request, cancellationToken)); } var instanceName = InstanceName ?? InstanceNameProvider(request); var instrumenter = _instrumenters.GetOrAdd(instanceName, (insName) => { var inst = new SimpleInstrumentor(new InstrumentationInfo() { Counters = Counters, Description = "Counter for " + insName, InstanceName = insName, CategoryName = CategoryName, SamplingRate = SamplingRate, PublishCounters = PublishCounters, PublishEvent = PublishEvent, RaisePublishErrors = RaisePublishErrors, CorrelationIdKey = CorrelationIdKey }); foreach (var tracer in _tracers) { inst.Tracers.Add(tracer.GetType().FullName, tracer); } return(inst); } ); HttpResponseMessage response = null; Func <Task> t = async() => response = await base.SendAsync(request, cancellationToken); await instrumenter.InstrumentAsync(t, request.RequestUri.AbsoluteUri, SamplingRate); return(response); }
private ITwoStageInstrumentor InitInstrumentor(MethodInfo methodInfo) { string instrumentationContext = ""; var instrumentationInfo = GetInstrumentationInfo(methodInfo); if (instrumentationInfo != null) { var instanceName = instrumentationInfo.InstanceName; if (string.IsNullOrEmpty(instanceName) && _instanceNameProvider != null) instanceName = _instanceNameProvider.GetInstanceName(methodInfo); if (string.IsNullOrEmpty(instanceName)) { throw new InvalidOperationException("Either InstanceName or InstanceNameProviderType must be supplied."); } if (_instrumentationContextProvider != null) { instrumentationContext = _instrumentationContextProvider.GetContext(methodInfo); } else { throw new InvalidOperationException("The Instrumentation Context Cannot be Null. Define a InstrumentationContextProvider implementation."); } var instrumentor = new SimpleInstrumentor(new InstrumentationInfo() { Description = instrumentationInfo.Description, Counters = instrumentationInfo.Counters, InstanceName = instanceName, CategoryName = string.IsNullOrEmpty(this.CategoryName) ? instrumentationInfo.CategoryName : this.CategoryName }, PublishCounters, PublishEvent, RaisePublishErrors); _instrumentors.AddOrUpdate(instrumentationContext, instrumentor, (key, inst) => instrumentor); return instrumentor; } else return null; }