示例#1
0
        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);
        }
示例#2
0
        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;
        }