Nuestra aplicación ASP.NET MVC incluye algunos parámetros de ruta URI, como:

https://example.com/api/query/14hes1017ceimgS2ESsIec

En Application Insights, este URI anterior se convierte en Nombre de operación

GET /api/query/14hes1017ceimgS2ESsIec

No queremos millones de operaciones únicas como esta; Es solo un método de código que les sirve a todos (ver más abajo). Queremos enrollarlos bajo un Nombre de operación como

GET /api/query/{path}

Aquí está el método de código: creo que App Insights podría detectar que el URI contiene un parámetro de consulta ... pero no lo hace.

    [Route("api/query/{hash}")]
    public HttpResponseMessage Get(string hash)
    {
        ...
10
Iain 22 jun. 2017 a las 09:24

3 respuestas

La mejor respuesta

La razón por la cual Application Insights no detecta que el sufijo de su Nombre de operación es un parámetro es porque el SDK no mira su código, y para todos los propósitos prácticos es un URI válido.
Dos opciones para obtener lo que quieres:

  1. Cambie su API para pasar el parámetro en la cadena de consulta (que se elimina del Nombre de la operación)
  2. Implemente su propia ITelemetryProcessor (se puede encontrar una explicación detallada aquí), y elimine el hash sufijo del Nombre de la operación usted mismo
5
EranG 22 jun. 2017 a las 06:44

Lo pirateé con este OperationNameMunger codificado (usando estos documentos como inspiración).

Lo conecté al ApplicationInsights.config, justo después del OperationNameTelemetryInitializer.


using System.Text.RegularExpressions;
using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.Extensibility;

namespace My.Namespace
{
    public class OperationNameMunger : ITelemetryInitializer
    {
        public void Initialize(ITelemetry telemetry)
        {
            var existingOpName = telemetry.Context?.Operation?.Name;
            if (existingOpName == null)
                return;

            const string matchesInterestingOps = "^([A-Z]+ /api/query/)[^ ]+$";
            var match = Regex.Match(existingOpName, matchesInterestingOps);
            if (match.Success)
            {
                telemetry.Context.Operation.Name = match.Groups[1].Value + "{hash}";
            }
        }
    }
}
2
Iain 22 jun. 2017 a las 07:49

MS está trabajando en esta función con https://github.com/Microsoft/ApplicationInsights -dotnet-server / issues / 176

1
Iain 21 abr. 2018 a las 00:33