Azure Application Insights로 ASP.NET Framework RawUrl 캡처
많은 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 요청을 가져와
RawUrl
및 RawUrlFqdn
를 캡처합니다. 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
가 모두 캡처되어 요청에 대한 보다 완전한 그림을 제공하는 방법에 주목하세요.요약
Application Insights의
ITelemetryInitializer
확장성 지점을 사용하여 추가 데이터를 캡처할 수 있습니다. RawUrl
에서 HttpContext.Request
를 사용하면 기본적으로 캡처되는 재작성된 URL 외에 원본 URL을 캡처할 수 있습니다.
Reference
이 문제에 관하여(Azure Application Insights로 ASP.NET Framework RawUrl 캡처), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/swimburger/capturing-asp-net-framework-rawurl-with-azure-application-insights-le5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)