2017-06-22 2 views
4

Notre application ASP.NET MVC comprend certains paramètres de chemin URI, comme:d'arrêt Insights application, y compris les paramètres de chemin dans le Nom de l'opération

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

Dans Insights application, cette URI ci-dessus devient opération nom

GET /api/query/14hes1017ceimgS2ESsIec 

Nous ne voulons pas des millions d'opération unique s aime ça; c'est juste une méthode de code les servant tous (voir ci-dessous). Nous voulons les rouler sous Nom de l'opération comme

GET /api/query/{path} 

Voici la méthode de code - Je pense App Insights peut détecter que l'URI contient un paramètre de requête ... mais il ne fonctionne pas.

[Route("api/query/{hash}")] 
    public HttpResponseMessage Get(string hash) 
    { 
     ... 
+1

Cela pourrait aider: https://stackoverflow.com/questions/34482869/wcf-service-operation-name –

+0

Bien sûr fait @PavelChuchuva :) spécifiquement la HttpContextExtension.GetRequestTelemetry ... je voulais qu'avant... – Iain

Répondre

4

Insights Application raison ne détecte pas que le suffixe de votre Nom de l'opération est un paramètre est parce que le SDK ne regarde pas votre code, et à toutes fins pratiques qui est un URI valide.
Deux options pour obtenir ce que vous voulez:

  1. Changer votre API pour passer le paramètre dans la chaîne de requête (qui est extirpé du Nom de l'opération)
  2. Mettre en oeuvre votre propre ITelemetryProcessor (explication détaillée peut être trouvée here) et supprimer le hachage suffixe du Nom de l'opération vous
0

Je piraté avec cette hardcoded OperationNameMunger (en utilisant these docs d'inspiration). Je l'ai câblé dans le ApplicationInsights.config, tout de suite après le 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}"; 
      } 
     } 
    } 
}