Application Insights SDK에서 원격 분석 필터링 및 전처리
SDK에서 전송되기 전에 원격 분석을 필터링, 수정 또는 보강하는 코드를 작성할 수 있습니다. 처리는 HTTP 요청 컬렉션 및 종속성 컬렉션과 같은 표준 원격 분석 모듈에서 전송된 데이터를 포함합니다.
ITelemetryProcessor
를 구현하여 원격 분석이 SDK에서 전송되기 전에 필터링을 통해 원격 분석을 수정 또는 삭제할 수 있습니다. 예를 들어 로봇의 요청을 제외하여 원격 분석의 양을 줄일 수 있습니다. 샘플링과 달리 전송하거나 취소할 내용을 완벽하게 제어할 수 있지만, 이는 집계된 로그를 기반으로 하는 모든 메트릭에 영향을 미칩니다. 항목 삭제 방법에 따라 관련된 항목 사이를 이동하는 기능이 손실될 수도 있습니다.ITelemetryInitializer
를 구현하여 앱에서 전송된 원격 분석에 속성을 추가하거나 수정합니다. 예를 들어 계산된 값을 추가하거나 포털에서 데이터를 필터링하는 데 사용할 버전 번호를 추가할 수 있습니다.샘플링 통계를 왜곡하지 않고 원격 분석의 양을 줄입니다. 관련 데이터 요소를 함께 유지하여 문제를 진단할 때 데이터 요소 간을 탐색할 수 있습니다. 포털에서는 샘플링을 보완하기 위해 총 개수를 곱합니다.
참고
SDK API 사용자 지정 이벤트 및 메트릭을 보내는 데 사용됩니다.
ASP.NET, ASP.NET Core, 비 HTTP/.NET 및 .NET Core용 작업자, JavaScript 등 애플리케이션에 적합한 SDK를 설치합니다.
이 기술을 사용하면 원격 분석 스트림에 포함된 것과 제외된 것을 직접적으로 제어할 수 있습니다. 필터링을 사용하여 원격 분석 항목을 Application Insights에 전송되지 않도록 끊을 수 있습니다. 필터링을 샘플링과 함께 사용하거나 별도로 사용할 수 있습니다.
원격 분석을 필터링하려면 원격 분석 프로세서를 작성하고 TelemetryConfiguration
을 사용하여 등록합니다. 모든 원격 분석은 프로세서를 통과합니다. 이를 스트림에서 끊거나 체인의 다음 프로세서에 제공할 수 있습니다. HTTP 요청 수집기, 종속성 수집기와 같은 표준 모듈의 원격 분석뿐만 아니라 직접 추적한 원격 분석까지 포함됩니다. 예를 들어 로봇 또는 성공적인 종속성 호출의 요청에 대한 원격 분석을 필터링할 수 있습니다.
경고
SDK에서 보낸 원격 분석을 프로세서를 사용하여 필터링하는 작업은 포털에 표시되는 통계를 왜곡하고 관련 항목을 추적하기 어렵게 할 수 있습니다.
대신 샘플링사용을 고려하세요.
ITelemetryProcessor
를 구현해야 합니다.원격 분석 프로세서는 일련의 프로세싱을 구성합니다. 원격 분석 프로세서를 인스턴스화하면 체인의 다음 프로세서에 대한 참조가 제공됩니다. 원격 분석 데이터 요소가 전달되면 프로세스 메서드는 작업을 수행하고 체인의 다음 원격 분석 프로세서를 호출하거나 호출하지 않습니다.
using Microsoft.ApplicationInsights.Channel; using Microsoft.ApplicationInsights.Extensibility; using Microsoft.ApplicationInsights.DataContracts; public class SuccessfulDependencyFilter : ITelemetryProcessor { private ITelemetryProcessor Next { get; set; } // next will point to the next TelemetryProcessor in the chain. public SuccessfulDependencyFilter(ITelemetryProcessor next) { this.Next = next; } public void Process(ITelemetry item) { // To filter out an item, return without calling the next processor. if (!OKtoSend(item)) { return; } this.Next.Process(item); } // Example: replace with your own criteria. private bool OKtoSend (ITelemetry item) { var dependency = item as DependencyTelemetry; if (dependency == null) return true; return dependency.Success != true; } }
프로세서를 추가합니다.
ApplicationInsights.config에 다음 코드 조각을 삽입합니다.
<TelemetryProcessors> <Add Type="WebApplication9.SuccessfulDependencyFilter, WebApplication9"> <!-- Set public property --> <MyParamFromConfigFile>2-beta</MyParamFromConfigFile> </Add> </TelemetryProcessors>
클래스에서 명명된 공용 속성을 제공하여 .config 파일의 문자열 값을 전달할 수 있습니다.
경고
.config 파일의 형식 이름 및 모든 속성 이름이 코드의 클래스 및 속성 이름과 일치하는지 주의하여 확인해야 합니다. .config 파일에서 존재하지 않는 형식 또는 속성을 참조하는 경우 SDK가 자동으로 원격 분석을 전송하는 데 실패할 수 있습니다.
또는 코드에서 필터를 초기화할 수 있습니다.
Global.asax.cs
의 AppStart와 같은 적합한 초기화 클래스에서 체인에 프로세서를 삽입합니다.var builder = TelemetryConfiguration.Active.DefaultTelemetrySink.TelemetryProcessorChainBuilder; builder.Use((next) => new SuccessfulDependencyFilter(next)); // If you have more processors: builder.Use((next) => new AnotherProcessor(next)); builder.Build();
이 지점 이후에 만들어진 원격 분석 클라이언트는 사용자의 프로세서를 사용합니다.
보트 및 웹 테스트를 필터링합니다. 메트릭 탐색기가 가상 소스를 필터링하는 옵션을 제공하지만 이 옵션은 SDK 자체에서 필터링하여 트래픽과 수집 크기를 감소시킵니다.
public void Process(ITelemetry item)
{
if (!string.IsNullOrEmpty(item.Context.Operation.SyntheticSource)) {return;}
// Send everything else:
this.Next.Process(item);
}
"401" 응답을 사용하여 요청을 필터링합니다.
public void Process(ITelemetry item)
{
var request = item as RequestTelemetry;
if (request != null &&
request.ResponseCode.Equals("401", StringComparison.OrdinalIgnoreCase))
{
// To filter out an item, return without calling the next processor.
return;
}
// Send everything else
this.Next.Process(item);
}
느린 호출만 진단하려는 경우 빠른 호출을 필터링합니다.
참고
이 필터링은 여러분이 포털에서 참조하는 통계를 왜곡시킵니다.
public void Process(ITelemetry item)
{
var request = item as DependencyTelemetry;
if (request != null && request.Duration.TotalMilliseconds < 100)
{
return;
}
this.Next.Process(item);
}
이 블로그 에서는 종속성으로 정규 ping을 자동으로 전송하여 종속성 문제를 진단하는 프로젝트에 대해 설명합니다.
Java에서 원격 분석 프로세서 및 해당 구현에 대해 자세히 알아보려면 Java 원격 분석 프로세서 설명서를 참조하세요.
ITelemetryInitializer를 사용하여 JavaScript 웹 애플리케이션에서 원격 분석 데이터를 필터링할 수 있습니다.
원격 분석 이니셜라이저 콜백 함수를 만듭니다. 콜백 함수는 처리 중인 이벤트인
ITelemetryItem
을 매개 변수로 사용합니다. 이 콜백에서false
를 반환하면 원격 분석 항목이 필터링됩니다.var filteringFunction = (envelope) => { if (envelope.data.someField === 'tobefilteredout') { return false; } return true; };
원격 분석 이니셜라이저 콜백을 추가합니다.
appInsights.addTelemetryInitializer(filteringFunction);
원격 분석 이니셜라이저를 사용하여 추가 정보로 원격 분석을 보강하거나 표준 원격 분석 모듈에 의해 설정된 원격 분석 속성을 재정의할 수 있습니다.
예를 들어, 웹 패키지에 대한 Application Insights는 HTTP 요청에 대한 원격 분석을 수집합니다. 기본적으로 응답 코드 >=400이 있는 모든 요청을 실패로 표시합니다. 대신 400을 성공으로 처리하고 싶다면 성공 속성을 설정하는 원격 분석 이니셜라이저를 제공할 수 있습니다.
원격 분석 이니셜라이저를 제공하면 Track*() 메서드가 호출될 때마다 호출됩니다. 이 이니셜라이즈에는 표준 원격 분석 모듈에 의해 호출되는 Track()
메서드가 포함됩니다. 규칙에 따라 해당 모듈은 이니셜라이저가 이미 설정한 속성은 설정하지 않습니다. 원격 분석 이니셜라이저는 원격 분석 프로세서를 호출하기 전에 호출되므로 이니셜라이저에서 수행한 모든 보강 작업이 프로세서에서 표시됩니다.
이니셜라이저 정의
using System; using Microsoft.ApplicationInsights.Channel; using Microsoft.ApplicationInsights.DataContracts; using Microsoft.ApplicationInsights.Extensibility; namespace MvcWebRole.Telemetry { /* * Custom TelemetryInitializer that overrides the default SDK * behavior of treating response codes >= 400 as failed requests * */ public class MyTelemetryInitializer : ITelemetryInitializer { public void Initialize(ITelemetry telemetry) { var requestTelemetry = telemetry as RequestTelemetry; // Is this a TrackRequest() ? if (requestTelemetry == null) return; int code; bool parsed = Int32.TryParse(requestTelemetry.ResponseCode, out code); if (!parsed) return; if (code >= 400 && code < 500) { // If we set the Success property, the SDK won't change it: requestTelemetry.Success = true; // Allow us to filter these requests in the portal: requestTelemetry.Properties["Overridden400s"] = "true"; } // else leave the SDK to set the Success property } } }
이니셜라이저 로드
ApplicationInsights.config에서:
<ApplicationInsights> <TelemetryInitializers> <!-- Fully qualified type name, assembly name: --> <Add Type="MvcWebRole.Telemetry.MyTelemetryInitializer, MvcWebRole"/> ... </TelemetryInitializers> </ApplicationInsights>
또는, 코드에서 이니셜라이저를 인스턴스화할 수 있습니다(예: Global.aspx.cs).
protected void Application_Start() { // ... TelemetryConfiguration.Active.TelemetryInitializers.Add(new MyTelemetryInitializer()); }
이 샘플에 대해 자세히 알아봅니다.
필요한 경우 JavaScript 원격 분석 초기화 프로그램을 삽입합니다. Application Insights JavaScript SDK의 원격 분석 초기화 프로그램에 대한 자세한 내용은 원격 분석 초기화 프로그램을 참조하세요.
JavaScript(웹) SDK 로더 스크립트 구성에 onInit 콜백 함수를 추가하여 원격 분석 초기화를 삽입합니다.
<script type="text/javascript">
!(function (cfg){function e(){cfg.onInit&&cfg.onInit(n)}var x,w,D,t,E,n,C=window,O=document,b=C.location,q="script",I="ingestionendpoint",L="disableExceptionTracking",j="ai.device.";"instrumentationKey"[x="toLowerCase"](),w="crossOrigin",D="POST",t="appInsightsSDK",E=cfg.name||"appInsights",(cfg.name||C[t])&&(C[t]=E),n=C[E]||function(g){var f=!1,m=!1,h={initialize:!0,queue:[],sv:"8",version:2,config:g};function v(e,t){var n={},i="Browser";function a(e){e=""+e;return 1===e.length?"0"+e:e}return n[j+"id"]=i[x](),n[j+"type"]=i,n["ai.operation.name"]=b&&b.pathname||"_unknown_",n["ai.internal.sdkVersion"]="javascript:snippet_"+(h.sv||h.version),{time:(i=new Date).getUTCFullYear()+"-"+a(1+i.getUTCMonth())+"-"+a(i.getUTCDate())+"T"+a(i.getUTCHours())+":"+a(i.getUTCMinutes())+":"+a(i.getUTCSeconds())+"."+(i.getUTCMilliseconds()/1e3).toFixed(3).slice(2,5)+"Z",iKey:e,name:"Microsoft.ApplicationInsights."+e.replace(/-/g,"")+"."+t,sampleRate:100,tags:n,data:{baseData:{ver:2}},ver:undefined,seq:"1",aiDataContract:undefined}}var n,i,t,a,y=-1,T=0,S=["js.monitor.azure.com","js.cdn.applicationinsights.io","js.cdn.monitor.azure.com","js0.cdn.applicationinsights.io","js0.cdn.monitor.azure.com","js2.cdn.applicationinsights.io","js2.cdn.monitor.azure.com","az416426.vo.msecnd.net"],o=g.url||cfg.src,r=function(){return s(o,null)};function s(d,t){if((n=navigator)&&(~(n=(n.userAgent||"").toLowerCase()).indexOf("msie")||~n.indexOf("trident/"))&&~d.indexOf("ai.3")&&(d=d.replace(/(\/)(ai\.3\.)([^\d]*)$/,function(e,t,n){return t+"ai.2"+n})),!1!==cfg.cr)for(var e=0;e<S.length;e++)if(0<d.indexOf(S[e])){y=e;break}var n,i=function(e){var a,t,n,i,o,r,s,c,u,l;h.queue=[],m||(0<=y&&T+1<S.length?(a=(y+T+1)%S.length,p(d.replace(/^(.*\/\/)([\w\.]*)(\/.*)$/,function(e,t,n,i){return t+S[a]+i})),T+=1):(f=m=!0,s=d,!0!==cfg.dle&&(c=(t=function(){var e,t={},n=g.connectionString;if(n)for(var i=n.split(";"),a=0;a<i.length;a++){var o=i[a].split("=");2===o.length&&(t[o[0][x]()]=o[1])}return t[I]||(e=(n=t.endpointsuffix)?t.location:null,t[I]="https://"+(e?e+".":"")+"dc."+(n||"services.visualstudio.com")),t}()).instrumentationkey||g.instrumentationKey||"",t=(t=(t=t[I])&&"/"===t.slice(-1)?t.slice(0,-1):t)?t+"/v2/track":g.endpointUrl,t=g.userOverrideEndpointUrl||t,(n=[]).push((i="SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)",o=s,u=t,(l=(r=v(c,"Exception")).data).baseType="ExceptionData",l.baseData.exceptions=[{typeName:"SDKLoadFailed",message:i.replace(/\./g,"-"),hasFullStack:!1,stack:i+"\nSnippet failed to load ["+o+"] -- Telemetry is disabled\nHelp Link: https://go.microsoft.com/fwlink/?linkid=2128109\nHost: "+(b&&b.pathname||"_unknown_")+"\nEndpoint: "+u,parsedStack:[]}],r)),n.push((l=s,i=t,(u=(o=v(c,"Message")).data).baseType="MessageData",(r=u.baseData).message='AI (Internal): 99 message:"'+("SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details) ("+l+")").replace(/\"/g,"")+'"',r.properties={endpoint:i},o)),s=n,c=t,JSON&&((u=C.fetch)&&!cfg.useXhr?u(c,{method:D,body:JSON.stringify(s),mode:"cors"}):XMLHttpRequest&&((l=new XMLHttpRequest).open(D,c),l.setRequestHeader("Content-type","application/json"),l.send(JSON.stringify(s)))))))},a=function(e,t){m||setTimeout(function(){!t&&h.core||i()},500),f=!1},p=function(e){var n=O.createElement(q),e=(n.src=e,t&&(n.integrity=t),n.setAttribute("data-ai-name",E),cfg[w]);return!e&&""!==e||"undefined"==n[w]||(n[w]=e),n.onload=a,n.onerror=i,n.onreadystatechange=function(e,t){"loaded"!==n.readyState&&"complete"!==n.readyState||a(0,t)},cfg.ld&&cfg.ld<0?O.getElementsByTagName("head")[0].appendChild(n):setTimeout(function(){O.getElementsByTagName(q)[0].parentNode.appendChild(n)},cfg.ld||0),n};p(d)}cfg.sri&&(n=o.match(/^((http[s]?:\/\/.*\/)\w+(\.\d+){1,5})\.(([\w]+\.){0,2}js)$/))&&6===n.length?(d="".concat(n[1],".integrity.json"),i="@".concat(n[4]),l=window.fetch,t=function(e){if(!e.ext||!e.ext[i]||!e.ext[i].file)throw Error("Error Loading JSON response");var t=e.ext[i].integrity||null;s(o=n[2]+e.ext[i].file,t)},l&&!cfg.useXhr?l(d,{method:"GET",mode:"cors"}).then(function(e){return e.json()["catch"](function(){return{}})}).then(t)["catch"](r):XMLHttpRequest&&((a=new XMLHttpRequest).open("GET",d),a.onreadystatechange=function(){if(a.readyState===XMLHttpRequest.DONE)if(200===a.status)try{t(JSON.parse(a.responseText))}catch(e){r()}else r()},a.send())):o&&r();try{h.cookie=O.cookie}catch(k){}function e(e){for(;e.length;)!function(t){h[t]=function(){var e=arguments;f||h.queue.push(function(){h[t].apply(h,e)})}}(e.pop())}var c,u,l="track",d="TrackPage",p="TrackEvent",l=(e([l+"Event",l+"PageView",l+"Exception",l+"Trace",l+"DependencyData",l+"Metric",l+"PageViewPerformance","start"+d,"stop"+d,"start"+p,"stop"+p,"addTelemetryInitializer","setAuthenticatedUserContext","clearAuthenticatedUserContext","flush"]),h.SeverityLevel={Verbose:0,Information:1,Warning:2,Error:3,Critical:4},(g.extensionConfig||{}).ApplicationInsightsAnalytics||{});return!0!==g[L]&&!0!==l[L]&&(e(["_"+(c="onerror")]),u=C[c],C[c]=function(e,t,n,i,a){var o=u&&u(e,t,n,i,a);return!0!==o&&h["_"+c]({message:e,url:t,lineNumber:n,columnNumber:i,error:a,evt:C.event}),o},g.autoExceptionInstrumented=!0),h}(cfg.cfg),(C[E]=n).queue&&0===n.queue.length?(n.queue.push(e),n.trackPageView({})):e();})({
src: "https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js",
crossOrigin: "anonymous", // When supplied this will add the provided value as the cross origin attribute on the script tag
onInit: function (sdk) {
sdk.addTelemetryInitializer(function (envelope) {
envelope.data = envelope.data || {};
envelope.data.someField = 'This item passed through my telemetry initializer';
});
}, // Once the application insights instance has loaded and initialized this method will be called
// sri: false, // Custom optional value to specify whether fetching the snippet from integrity file and do integrity check
cfg: { // Application Insights Configuration
connectionString: "YOUR_CONNECTION_STRING"
}});
</script>
원격 분석 항목에서 사용할 수 있는 사용자 지정이 아닌 속성의 요약은 Application Insights 데이터 모델 내보내기를 참조하세요.
이니셜라이저를 원하는 수만큼 추가할 수 있습니다. 추가된 순서대로 호출됩니다.
OpenCensus Python의 원격 분석 프로세서는 내보내기 전에 단순히 원격 분석을 처리하기 위해 호출되는 콜백 함수입니다. 콜백 함수는 봉투 데이터 형식을 매개 변수로 허용해야 합니다. 원격 분석을 내보내지 않도록 필터링하려면 콜백 함수가 False
를 반환하는지 확인합니다. GitHub의 봉투에서 Azure Monitor 데이터 형식에 대한 스키마를 볼 수 있습니다.
참고
tags
필드의 ai.cloud.role
특성을 변경하여 cloud_RoleName
을 수정할 수 있습니다.
def callback_function(envelope):
envelope.tags['ai.cloud.role'] = 'new_role_name'
# Example for log exporter
import logging
from opencensus.ext.azure.log_exporter import AzureLogHandler
logger = logging.getLogger(__name__)
# Callback function to append '_hello' to each log message telemetry
def callback_function(envelope):
envelope.data.baseData.message += '_hello'
return True
handler = AzureLogHandler(connection_string='InstrumentationKey=<your-instrumentation_key-here>')
handler.add_telemetry_processor(callback_function)
logger.addHandler(handler)
logger.warning('Hello, World!')
# Example for trace exporter
import requests
from opencensus.ext.azure.trace_exporter import AzureExporter
from opencensus.trace import config_integration
from opencensus.trace.samplers import ProbabilitySampler
from opencensus.trace.tracer import Tracer
config_integration.trace_integrations(['requests'])
# Callback function to add os_type: linux to span properties
def callback_function(envelope):
envelope.data.baseData.properties['os_type'] = 'linux'
return True
exporter = AzureExporter(
connection_string='InstrumentationKey=<your-instrumentation-key-here>'
)
exporter.add_telemetry_processor(callback_function)
tracer = Tracer(exporter=exporter, sampler=ProbabilitySampler(1.0))
with tracer.span(name='parent'):
response = requests.get(url='https://www.wikipedia.org/wiki/Rabbit')
# Example for metrics exporter
import time
from opencensus.ext.azure import metrics_exporter
from opencensus.stats import aggregation as aggregation_module
from opencensus.stats import measure as measure_module
from opencensus.stats import stats as stats_module
from opencensus.stats import view as view_module
from opencensus.tags import tag_map as tag_map_module
stats = stats_module.stats
view_manager = stats.view_manager
stats_recorder = stats.stats_recorder
CARROTS_MEASURE = measure_module.MeasureInt("carrots",
"number of carrots",
"carrots")
CARROTS_VIEW = view_module.View("carrots_view",
"number of carrots",
[],
CARROTS_MEASURE,
aggregation_module.CountAggregation())
# Callback function to only export the metric if value is greater than 0
def callback_function(envelope):
return envelope.data.baseData.metrics[0].value > 0
def main():
# Enable metrics
# Set the interval in seconds in which you want to send metrics
exporter = metrics_exporter.new_metrics_exporter(connection_string='InstrumentationKey=<your-instrumentation-key-here>')
exporter.add_telemetry_processor(callback_function)
view_manager.register_exporter(exporter)
view_manager.register_view(CARROTS_VIEW)
mmap = stats_recorder.new_measurement_map()
tmap = tag_map_module.TagMap()
mmap.measure_int_put(CARROTS_MEASURE, 1000)
mmap.record(tmap)
# Default export interval is every 15.0s
# Your application should run for at least this amount
# of time so the exporter will meet this interval
# Sleep can fulfill this
time.sleep(60)
print("Done recording metrics")
if __name__ == "__main__":
main()
원하는 만큼 프로세서를 추가할 수 있습니다. 추가된 순서대로 호출됩니다. 한 프로세서가 예외를 throw해도 다음 프로세서에 영향을 주지 않습니다.
다음 샘플 이니셜라이저는 추적된 모든 원격 분석에 사용자 지정 속성을 추가합니다.
public void Initialize(ITelemetry item)
{
var itemProperties = item as ISupportProperties;
if(itemProperties != null && !itemProperties.Properties.ContainsKey("customProp"))
{
itemProperties.Properties["customProp"] = "customValue";
}
}
다음 샘플 이니셜라이저는 추적된 모든 원격 분석에 클라우드 역할 이름을 설정합니다.
public void Initialize(ITelemetry telemetry)
{
if (string.IsNullOrEmpty(telemetry.Context.Cloud.RoleName))
{
telemetry.Context.Cloud.RoleName = "MyCloudRoleName";
}
}
다음 샘플 이니셜라이저는 원격 분석 수집 중에 클라이언트 소켓 IP 주소 대신 지리적 위치 매핑에 사용할 클라이언트 IP를 설정합니다.
public void Initialize(ITelemetry telemetry)
{
var request = telemetry as RequestTelemetry;
if (request == null) return true;
request.Context.Location.Ip = "{client ip address}"; // Could utilize System.Web.HttpContext.Current.Request.UserHostAddress;
return true;
}
원격 분석 프로세서 및 원격 분석 이니셜라이저 간의 차이는 무엇인가요?
- 두 가지로 수행할 수 있는 작업에는 약간의 중복이 있습니다. 두 가지 모두 원격 분석의 속성을 추가하거나 수정하는 데 사용할 수 있지만, 해당 목적이라면 이니셜라이저 사용을 권장합니다.
- 원격 분석 이니셜라이저는 원격 분석 프로세서보다 항상 먼저 실행됩니다.
- 원격 분석 이니셜라이저는 두 번 이상 호출될 수 있습니다. 규칙에 따라 이미 설정된 속성은 설정하지 않습니다.
- 원격 분석 프로세서를 사용하면 원격 분석 항목을 완전히 바꾸거나 버릴 수 있습니다.
- 등록된 모든 원격 분석 이니셜라이저는 모든 원격 분석 항목에 대해 호출됩니다. 원격 분석 프로세서의 경우 SDK가 첫 번째 원격 분석 프로세서 호출을 보장합니다. 나머지 프로세서가 호출되는지 여부는 이전 원격 분석 프로세서에 의해 결정됩니다.
- 추가 속성으로 원격 분석을 보강하거나 기존 속성을 재정의하려면 원격 분석 이니셜라이저를 사용합니다. 원격 분석을 필터링하려면 원격 분석 프로세서를 사용합니다.
참고
JavaScript에는 ITelemetryInitializer를 사용하여 이벤트를 필터링할 수 있는 원격 분석 이니셜라이저만 있습니다.
- 정규화된 형식 이름 및 어셈블리 이름이 올바른지 확인합니다.
- applicationinsights.config 파일이 출력 디렉터리에 있고 최근 변경 내용을 포함하는지 확인합니다.