1

這個question與我想知道的非常相似。我已經在配置了Application Insights的Azure雲服務上獲得了Web API服務。在請求信息門戶網站上,這是自動生成的,我想添加一個自定義的http頭部,這是請求的一部分到每個請求記錄的信息中。問題是我該如何做到這一點?應用程序見解 - 如何爲您的請求信息添加自定義指標?

我使用遙測初始化象下面這樣嘗試過,但失敗(在我沒有看到在門戶網站上的信息)。我在Global.asax TelemetryConfiguration.Active.TelemetryInitializers.Add(propertyTelemetryInitializer);

public class PropertyTelemetryInitializer : ITelemetryInitializer 
{ 
    private readonly HttpContext httpContext; 

    public PropertyTelemetryInitializer(HttpContext httpContext) 
    { 
     this.httpContext = httpContext; 
    } 

    public void Initialize(ITelemetry telemetry) 
    { 
     this.AddTelemetryContextPropertFromContextHeader(telemetry, "xyz"); 
     this.AddTelemetryContextPropertFromContextHeader(telemetry, "abc"); 
     this.AddTelemetryContextPropertFromContextHeader(telemetry, "123"); 
    } 

    private void AddTelemetryContextPropertFromContextHeader(ITelemetry telemetry, string headerKey) 
    { 
     var requestTelemetry = telemetry as RequestTelemetry; 

     telemetry.Context.Properties[headerKey] = this.httpContext.Request.Headers[headerKey] ?? string.Empty; 
     telemetry.Context.Properties[headerKey] = this.httpContext.Request.Headers[headerKey] ?? string.Empty; 
    } 
} 

也就是有沒有辦法從控制器方法本身做到這一點還增加了呢?類似於下面的東西(注意:下面的不起作用)?

[Route("api/Something")] 
    [HttpGet] 
    [ResponseType(typeof(Something))] 
    public async Task<Something> GetSomething() 
    { 
     var requestTelemetry = new RequestTelemetry(); 
     this.AddCustomHeadersToRequestTelemetry(requestTelemetry); 
     var result = await this.Service.GetSomethingAsync(); 
     requestTelemetry.Properties["result"] = result.ToString(); 
     return TypeMapper.Map<Model.Something, Something>(result); 
    } 


    /// <summary> 
    /// Adds the custom headers to request telemetry. 
    /// </summary> 
    /// <param name="controller">The controller.</param> 
    /// <param name="requestTelemetry">The request telemetry.</param> 
    public static void AddCustomHeadersToRequestTelemetry(this ApiController controller, RequestTelemetry requestTelemetry) 
    { 
     if (controller == null) 
     { 
      throw new ArgumentNullException("controller"); 
     } 

     if (requestTelemetry == null) 
     { 
      throw new ArgumentNullException("requestTelemetry"); 
     } 

     requestTelemetry.Context.Properties["abc"] = controller.Request.GetABCFromHeader(); 
     requestTelemetry.Context.Properties["xyz"] = controller.Request.GetXYZFromHeader(); 
     requestTelemetry.Context.Properties["123"] = controller.Request.Get123FromHeader(); 
    } 

回答

4

使用TelemetryInitializers是正確的解決方案。一些意見:

  • var requestTelemetry = telemetry as RequestTelemetry;:你不使用requestTelemetry之後。我想你想檢查null。
  • 在Active配置中添加遙測初始值設定項應該沒問題。您也可以考慮將其移至applicationinsights.config
  • 自定義屬性不會立即顯示在門戶中。您是否嘗試過在一段時間後重新打開IE並再次檢查您的請求?
  • 你能調試嗎?你看到你進入了你的遠見初始化器嗎?你有沒有在搜索中看到任何AI特定的痕跡?

關於你提到的第二個問題。現在,遙測初始值設定程序是唯一(官方)到達自動生成的RequestTelemetry(實際上是在HttpContext中)的方法。有計劃使Web中的大部分類都公開並最終開放它。但目前還沒有ETA。如果您自己創建並跟蹤請求,則可以像上面提到的那樣添加自定義屬性。

UPDATE:從2.0.0-β3自動生成的請求遙測開始是雖然HttpContext的擴展方法訪問:System.Web.HttpContextExtension.GetRequestTelemetry

相關問題