Azure Application Insights로 ASP.NET Framework RawUrl 캡처

Azure Application Insights는 애플리케이션 상태에 대한 통찰력을 제공하는 APM(애플리케이션 성능 관리) 도구입니다. 기본적으로 Application Insights는 웹 사이트에 대한 HTTP 요청을 포함하여 ASP.NET 응용 프로그램에 대한 많은 데이터를 캡처합니다. 불행히도 Application Insights에서 캡처한 URL은 클라이언트가 원래 요청한 URL과 항상 일치하지 않습니다.

많은 ASP.NET 응용 프로그램, 특히 DNN과 같은 CMS에서 HTTP 요청 경로는 Application Insights가 데이터를 기록할 때 내부적으로 다시 작성됩니다. 그 결과 원본 URL이 아닌 재작성된 URL이 캡처됩니다. Context.RewritePath 파일의 Application_BeginRequest 메서드 내부에 있는 간단한 global.asax.cs로 이 시나리오를 시뮬레이션할 수 있습니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace AddRawUrlToApplicationInsights
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_BeginRequest(object sender, EventArgs e)
        {
            // This code snippet is for demo purposes only!
            // these types of rewrites can be performed by IIS Rewrite module 
            // or you can update the routing table to resolve '/' to the HomeController

            string fullOrigionalpath = Request.Url.ToString();
            if (fullOrigionalpath.Contains("/about"))
            {
                Context.RewritePath("/home/about");
            }
            else if(fullOrigionalpath.Contains("/contact"))
            {
                Context.RewritePath("/home/contact");
            }
        }
    }
}


Source at GitHub

이 샘플에서 /about가 요청되면 경로가 /home/about로 다시 작성되어 HomeController.About 작업으로 확인됩니다. /about로 이동하여 Application Insights 내부에 기록된 HTTP 요청을 보면 URL은 https://domain.tld/home/about 대신 https://domain.tld/about가 됩니다. 재작성된 URL은 유용한 정보이지만 적절한 디버깅/분석을 위해 원래 URL이 필요할 수도 있습니다.

운 좋게도 쿼리 문자열을 포함하는 원래 경로가 항상 있는 요청에 RawUrl라는 속성이 있습니다. Application Insights는 ITelemetryInitializer 인터페이스를 사용하여 추가 데이터를 캡처할 수 있는 확장성 지점을 제공합니다. ITelemetryInitializer를 구현하고 원격 분석 속성에 RawUrl 데이터를 추가하여 원본 URL을 캡처할 수 있습니다.

using System;
using System.Web;
using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.DataContracts;
using Microsoft.ApplicationInsights.Extensibility;

namespace AddRawUrlToApplicationInsights
{
    public class RawUrlTelemetryInitializer : ITelemetryInitializer
    {
        public void Initialize(ITelemetry telemetry)
        {
            if (telemetry is RequestTelemetry requestTelemetry)
            {
                var httpContext = HttpContext.Current;
                if (httpContext?.Request == null)
                {
                    return;
                }

                var request = httpContext.Request;
                requestTelemetry.Properties["RawUrl"] = request.RawUrl;
                requestTelemetry.Properties["RawUrlFqdn"] = new Uri(request.Url, request.RawUrl).ToString();
            }
        }
    }
}


Source at GitHub

HTTP 요청 원격 분석이 초기화될 때마다 이 초기화 프로그램은 현재 HTTP 요청을 가져와 RawUrlRawUrlFqdn 를 캡처합니다. RawUrlFqdn에는 프로토콜, 전체 도메인, 포트, 경로 및 쿼리 문자열이 포함됩니다.
Application Insights에서 RawUrlTelemetryInitializer 를 사용하려면 ApplicationInsights.config 에서 클래스에 대한 참조를 추가해야 합니다.

<?xml version="1.0" encoding="utf-8"?>
<ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings">
    <TelemetryInitializers>
        <Add Type="AddRawUrlToApplicationInsights.RawUrlTelemetryInitializer, AddRawUrlToApplicationInsights"/>
        ...
    </TelemetryInitializers>
    ...
</ApplicationInsights>


Full source at GitHub

Application Insights로 보낼 때 결과 데이터는 다음과 같습니다.

{
  "name": "AppRequests",
  "time": "2020-09-11T16:47:04.4346673Z",
  "tags": {
    "ai.cloud.roleInstance": "YOURHOSTNAME",
    "ai.operation.id": "26d253e8979c0f4fb602fc7df4a31039",
    "ai.operation.name": "GET home/about",
    "ai.location.ip": "::1",
    "ai.internal.sdkVersion": "web:2.14.0-17971"
  },
  "data": {
    "baseType": "RequestData",
    "baseData": {
      "ver": 2,
      "id": "59b220044848c141",
      "name": "GET home/about",
      "duration": "00:00:01.6182094",
      "success": true,
      "responseCode": "200",
      "url": "https://localhost:44308/home/about",
      "properties": {
        "RawUrlFqdn": "https://localhost:44308/about",
        "RawUrl": "/about",
        "DeveloperMode": "true",
        "_MS.ProcessedByMetricExtractors": "(Name:'Requests', Ver:'1.1')"
      }
    }
  }
}

url , properties.Rawurl , properties.RawUrlFqdn 가 모두 캡처되어 요청에 대한 보다 완전한 그림을 제공하는 방법에 주목하세요.
  • URL: https://localhost:44308/home/about
  • 속성.RawUrlFqdn: https://localhost:44308/about
  • 속성.RawUrl:/about

  • 요약



    Application Insights의 ITelemetryInitializer 확장성 지점을 사용하여 추가 데이터를 캡처할 수 있습니다. RawUrl 에서 HttpContext.Request를 사용하면 기본적으로 캡처되는 재작성된 URL 외에 원본 URL을 캡처할 수 있습니다.

    좋은 웹페이지 즐겨찾기