Filter dan telemetri pra-proses di SDK Application Insights
Anda dapat menulis kode untuk memfilter, memodifikasi, atau memperkaya telemetri Anda sebelum dikirim dari SDK. Pemrosesan mencakup data yang dikirim dari modul telemetri standar, seperti pengumpulan permintaan HTTP dan pengumpulan dependensi.
Pemfilteran dapat memodifikasi atau membuang telemetri sebelum dikirim dari SDK dengan mengimplementasikan
ITelemetryProcessor
. Misalnya, Anda dapat mengurangi volume telemetri dengan mengecualikan permintaan dari robot. Tidak seperti pengambilan sampel, Anda memiliki kontrol penuh atas apa yang dikirim atau dibuang, tetapi memengaruhi metrik apa pun berdasarkan log agregat. Bergantung pada cara Anda membuang item, Anda mungkin juga kehilangan kemampuan untuk menavigasi di antara item terkait.Tambahkan atau Ubah properti ke telemetri apa pun yang dikirim dari aplikasi Anda dengan menerapkan
ITelemetryInitializer
. Misalnya, Anda dapat menambahkan nilai terhitung atau nomor versi untuk memfilter data di portal.Pengambilan sampel mengurangi volume telemetri tanpa mempengaruhi statistik Anda. Proses ini membuat data titik terus berkaitan bersama-sama sehingga Anda dapat menavigasi di antara mereka ketika Anda mendiagnosis masalah. Di portal, jumlah total dikalikan untuk mengimbangi pengambilan sampel.
Catatan
API SDK digunakan untuk mengirim peristiwa dan metrik kustom.
Prasyarat
Instal SDK yang sesuai untuk aplikasi Anda: ASP.NET, ASP.NET Core, Non-HTTP/Worker untuk .NET/.NET Core, atau JavaScript.
Filter
Teknik ini memberi Anda kontrol langsung atas apa yang disertakan atau dikecualikan dari aliran telemetri. Pemfilteran dapat digunakan untuk menjatuhkan item telemetri agar tidak dikirim ke Application Insights. Anda dapat menggunakan pemfilteran dengan pengambilan sampel, atau secara terpisah.
Untuk memfilter telemetri, Anda tulis prosesor telemetri dan daftarkan itu dengan TelemetryConfiguration
. Semua telemetri melewati prosesor Anda. Anda dapat memilih untuk menghilangkannya dari streaming atau memberikannya ke prosesor berikutnya dalam rantai. Telemetri dari modul standar, seperti kolektor permintaan HTTP dan kolektor dependensi, dan telemetri yang Anda lacak sendiri disertakan. Misalnya, Anda dapat memfilter telemetri tentang permintaan dari robot atau panggilan dependensi yang berhasil.
Peringatan
Memfilter telemetri yang dikirim dari SDK dengan menggunakan prosesor dapat mengubah statistik yang Anda lihat di portal dan membuatnya sulit untuk mengikuti item terkait.
Sebagai gantinya, pertimbangkan untuk menggunakan sampling.
Aplikasi .NET
Mengimplementasikan
ITelemetryProcessor
.Prosesor telemetri membangun rantai pemrosesan. Saat Anda membuat contoh realisasi prosesor telemetri, Anda akan diberi referensi ke prosesor berikutnya dalam rantai. Ketika titik data telemetri diteruskan ke metode proses, proses melakukan pekerjaannya dan kemudian memanggil (atau tidak memanggil) prosesor telemetri berikutnya dalam rantai.
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; } }
Tambahkan prosesor Anda.
Masukkan cuplikan ini dalam ApplicationInsights.config:
<TelemetryProcessors> <Add Type="WebApplication9.SuccessfulDependencyFilter, WebApplication9"> <!-- Set public property --> <MyParamFromConfigFile>2-beta</MyParamFromConfigFile> </Add> </TelemetryProcessors>
Anda dapat meneruskan nilai untai (karakter) dari file .config dengan menyediakan properti bernama publik di kelas Anda.
Peringatan
Berhati-hatilah untuk mencocokkan nama tipe dan nama properti apa pun dalam file .config ke nama kelas dan properti dalam kode. Jika file .config mereferensikan tipe atau properti yang tidak ada, SDK mungkin diam-diam gagal mengirim telemetri apa pun.
Atau, Anda dapat menginisialisasi filter dalam kode. Di kelas inisialisasi yang sesuai, sebagai contoh, AppStart di
Global.asax.cs
, masukkan prosesor Anda ke dalam rantai: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();
Klien telemetri yang dibuat setelah titik ini menggunakan prosesor Anda.
Filter contoh
Permintaan sintetis
Memfilter tes bot dan web. Meskipun Metrics Explorer memberi Anda opsi untuk memfilter sumber sintetis, opsi ini mengurangi lalu lintas dan ukuran konsumsi dengan memfilternya di SDK itu sendiri.
public void Process(ITelemetry item)
{
if (!string.IsNullOrEmpty(item.Context.Operation.SyntheticSource)) {return;}
// Send everything else:
this.Next.Process(item);
}
Autentikasi gagal
Filter permintaan dengan respons "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);
}
Memfilter panggilan dependensi jarak jauh cepat
Jika Anda hanya ingin mendiagnosis panggilan yang lambat, saring panggilan yang cepat.
Catatan
Pemfilteran ini akan mengubah statistik yang Anda lihat di portal.
public void Process(ITelemetry item)
{
var request = item as DependencyTelemetry;
if (request != null && request.Duration.TotalMilliseconds < 100)
{
return;
}
this.Next.Process(item);
}
Mendiagnosis masalah ketergantungan
Blog ini menjelaskan proyek untuk mendiagnosis masalah ketergantungan dengan secara otomatis mengirim ping reguler ke dependensi.
Aplikasi Java
Untuk mempelajari selengkapnya tentang prosesor telemetri dan implementasinya di Java, lihat dokumentasi prosesor telemetri Java.
Aplikasi web JavaScript
Anda dapat memfilter telemetri dari aplikasi web JavaScript dengan menggunakan ITelemetryInitializer.
Buat fungsi callback inisializer telemetri. Fungsi callback mengambil
ITelemetryItem
sebagai parameter, yang mana merupakan peristiwa yang sedang diproses. Mengembalikanfalse
dari callback ini menghasilkan item telemetri yang akan difilter.var filteringFunction = (envelope) => { if (envelope.data.someField === 'tobefilteredout') { return false; } return true; };
Tambahkan callback penginisialan telemetri Anda:
appInsights.addTelemetryInitializer(filteringFunction);
Menambah/memodifikasi properti: ITelemetryInitializer
Gunakan penginisialan telemetri untuk memperkaya telemetri Anda dengan informasi tambahan atau mengesampingkan set properti telemetri dengan modul telemetri standar.
Misalnya, Application Insights untuk paket web mengumpulkan telemetri tentang permintaan HTTP. Secara default, ini menandai permintaan apa pun dengan kode >respons =400 sebagai gagal. Jika Anda ingin memperlakukan 400 sebagai keberhasilan, Anda dapat menyediakan inisialisasi telemetri yang menetapkan properti keberhasilan.
Jika Anda menyediakan inisialisasi telemetri, telemetri disebut setiap kali metode Track*() dipanggil. Inisialisasi ini mencakup metode Track()
yang disebut oleh modul telemetri standar. Berdasarkan konvensi, modul-mocul ini tidak menetapkan properti apa pun yang sudah ditetapkan oleh inisialisasi. Penginisialisasi telemetri dipanggil sebelum memanggil prosesor telemetri, sehingga pengayaan apa pun yang dilakukan oleh penginisialisasi terlihat oleh prosesor.
Aplikasi .NET
Tentukan inisialisasi Anda
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 } } }
Muat penginisialisasi Anda
Pada ApplicationInsights.config:
<ApplicationInsights> <TelemetryInitializers> <!-- Fully qualified type name, assembly name: --> <Add Type="MvcWebRole.Telemetry.MyTelemetryInitializer, MvcWebRole"/> ... </TelemetryInitializers> </ApplicationInsights>
Atau, Anda dapat membuat contoh realisasi penginisialan dalam kode, misalnya, di Global.aspx.cs:
protected void Application_Start() { // ... TelemetryConfiguration.Active.TelemetryInitializers.Add(new MyTelemetryInitializer()); }
Lihat lebih lanjut dari sampel ini.
Penginisialan telemetri JavaScript
Sisipkan penginisialisasi telemetri JavaScript, jika diperlukan. Untuk informasi selengkapnya tentang penginisialisasi telemetri untuk Application Insights JavaScript SDK, lihat Penginisialisasi telemetri.
Sisipkan penginisialisasi telemetri dengan menambahkan fungsi panggilan balik onInit di konfigurasi Skrip Pemuat SDK JavaScript (Web):
<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>
Untuk ringkasan properti non-kustom yang tersedia pada item telemetri, lihat Model Data Ekspor Application Insights.
Anda dapat menambahkan inisialisasi sebanyak yang Anda mau. Mereka dipanggil berdasarkan urutan mereka ditambahkan.
prosesor telemetri OpenCensus Python
Prosesor telemetri di OpenCensus Python hanyalah sebatas fungsi callback yang dipanggil untuk memproses telemetri sebelum diekspor. Fungsi callback harus menerima data tipe amplop sebagai parameternya. Untuk memfilter telemetri agar tidak diekspor, pastikan fungsi callback kembali False
. Anda dapat melihat skema untuk tipe data Azure Monitor dalam tipe amplop di GitHub.
Catatan
Anda dapat memodifikasi cloud_RoleName
dengan mengubah atribut ai.cloud.role
di bidang tags
.
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()
Anda dapat menambahkan prosesor sebanyak yang Anda suka. Mereka dipanggil berdasarkan urutan mereka ditambahkan. Jika satu prosesor melontarkan pengecualian, itu tidak berdampak pada prosesor berikutnya.
Contoh TelemetryInitializers
Menambahkan properti kustom
Contoh penginisialan berikut menambahkan properti kustom ke setiap telemetri yang terlacak.
public void Initialize(ITelemetry item)
{
var itemProperties = item as ISupportProperties;
if(itemProperties != null && !itemProperties.Properties.ContainsKey("customProp"))
{
itemProperties.Properties["customProp"] = "customValue";
}
}
Tambahkan nama peran cloud
Contoh penginisialan berikut ini menetapkan nama peran awan ke setiap telemetri yang dilacak.
public void Initialize(ITelemetry telemetry)
{
if (string.IsNullOrEmpty(telemetry.Context.Cloud.RoleName))
{
telemetry.Context.Cloud.RoleName = "MyCloudRoleName";
}
}
Mengontrol alamat IP klien yang digunakan untuk pemetaan geolokasi
Contoh penginisialisasi berikut mengatur IP klien, yang digunakan untuk pemetaan geolokasi, alih-alih alamat IP soket klien, selama penyerapan telemetri.
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;
}
ITelemetryProcessor dan ITelemetryInitializer
Apa perbedaan antara prosesor telemetri dan inisialisasi telemetri?
- Ada beberapa tumpang tindih dalam apa yang dapat Anda lakukan dengan mereka. Keduanya dapat digunakan untuk menambahkan atau memodifikasi properti telemetri, meskipun kami menyarankan Anda menggunakan penginisialan untuk tujuan tersebut.
- Penginisialan telemetri selalu berjalan sebelum prosesor telemetri.
- Penginisialan telemetri dapat dipanggil lebih dari sekali. Secara konvensi, mereka tidak menetapkan properti mana pun yang sudah ditetapkan.
- Prosesor telemetri memungkinkan Anda untuk sepenuhnya mengganti atau membuang item telemetri.
- Semua penginisialan telemetri yang terdaftar dipanggil untuk setiap item telemetri. Untuk prosesor telemetri, SDK menjamin untuk memanggil prosesor telemetri pertama. Apakah prosesor lainnya dipanggil atau tidak diputuskan oleh prosesor telemetri sebelumnya.
- Gunakan penginisialan telemetri untuk memperkaya telemetri dengan lebih banyak properti atau mengganti yang sudah ada. Gunakan prosesor telemetri untuk menyaring telemetri.
Catatan
JavaScript hanya memiliki inisial telemetri yang dapatmemfilter peristiwa dengan menggunakan ITelemetryInitializer
Memecahkan ApplicationInsights.config
- Konfirmasikan bahwa nama tipe dan nama perakitan yang sepenuhnya memenuhi syarat sudah benar.
- Pastikan bahwa applicationinsights.config Anda berada di direktori output Anda dan berisi setiap perubahan terbaru.