private void OnAfterAction(object arg) { var httpContext = (HttpContext)_afterAction_httpContextFetcher.Fetch(arg); var actionDescriptor = (ActionDescriptor)_afterAction_ActionDescriptorFetcher.Fetch(arg); if (httpContext == null || actionDescriptor == null) { return; } var request = httpContext.Request; var response = httpContext.Response; string routeTemplate = actionDescriptor.AttributeRouteInfo.Template; var controllerActionDescriptor = actionDescriptor as ControllerActionDescriptor; string controllerName = controllerActionDescriptor?.ControllerTypeInfo.FullName; string actionName = controllerActionDescriptor?.ActionName; Interlocked.Decrement(ref _gauges[_totalInflightRequestGauge].Value); if (controllerActionDescriptor == null) { return; } string requestMetricPrefix = MetricNameUtils.MetricName(request, routeTemplate); if (requestMetricPrefix != null) { var completeTags = GetTags(true, true, true, controllerName, actionName, null); /* * Gauges * 1) AspNetCore.request.api.v2.alert.summary.GET.inflight.value * 2) AspNetCore.total_requests.inflight.value */ var inflightRequestGauge = new WavefrontGaugeOptions { Context = AspNetCoreContext, Name = requestMetricPrefix + ".inflight", Tags = completeTags, MeasurementUnit = Unit.Requests }; Interlocked.Decrement(ref _gauges[inflightRequestGauge].Value); } string responseMetricPrefix = MetricNameUtils.MetricName(request, routeTemplate, response); if (responseMetricPrefix != null) { httpContext.Items[ControllerNameKey] = controllerName; httpContext.Items[ActionNameKey] = actionName; httpContext.Items[ResponseMetricPrefixKey] = responseMetricPrefix; } }
private void OnBeforeAction(object arg) { // NOTE: This event is the start of the action pipeline. The action has been selected, the route // has been selected but no filters have run and model binding hasn't occured. var httpContext = (HttpContext)_beforeAction_httpContextFetcher.Fetch(arg); var actionDescriptor = (ActionDescriptor)_beforeAction_ActionDescriptorFetcher.Fetch(arg); if (httpContext == null || actionDescriptor == null) { return; } var request = httpContext.Request; string routeTemplate = actionDescriptor.AttributeRouteInfo.Template; var controllerActionDescriptor = actionDescriptor as ControllerActionDescriptor; string controllerName = controllerActionDescriptor?.ControllerTypeInfo.FullName; string actionName = controllerActionDescriptor?.ActionName; httpContext.Response.Headers.Add(WavefrontSpanHeader, routeTemplate); // Update the active tracing span with MVC info ISpan span = Tracer.ActiveSpan; if (span != null) { if (controllerActionDescriptor == null) { span.SetOperationName(actionDescriptor.DisplayName); } else { span.SetOperationName($"{controllerActionDescriptor.ControllerTypeInfo.Name}.{actionName}"); span.SetTag(ControllerTagKey, controllerName); } span.SetTag(PathTagKey, routeTemplate); } Interlocked.Increment(ref GetGaugeValue(_totalInflightRequestGauge).Value); if (controllerActionDescriptor == null) { return; } string requestMetricPrefix = MetricNameUtils.MetricName(request, routeTemplate); if (requestMetricPrefix != null) { var completeTags = GetTags(true, true, true, controllerName, actionName, null); /* Gauges * 1) AspNetCore.request.api.v2.alert.summary.GET.inflight.value * 2) AspNetCore.total_requests.inflight.value */ var inflightRequestGauge = new WavefrontGaugeOptions { Context = AspNetCoreContext, Name = requestMetricPrefix + ".inflight", Tags = completeTags, MeasurementUnit = Unit.Requests }; Interlocked.Increment(ref GetGaugeValue(inflightRequestGauge).Value); } }