Delen via


Telemetrie filteren en voorverwerken in de Application Insights-SDK

U kunt code schrijven om uw telemetrie te filteren, te wijzigen of te verrijken voordat deze wordt verzonden vanuit de SDK. De verwerking omvat gegevens die worden verzonden vanuit de standaardtelemetriemodules, zoals het verzamelen van HTTP-aanvragen en het verzamelen van afhankelijkheden.

  • Filteren kan telemetrie wijzigen of verwijderen voordat deze wordt verzonden vanuit de SDK door deze te implementeren ITelemetryProcessor. U kunt bijvoorbeeld het volume van telemetrie verminderen door aanvragen van robots uit te sluiten. In tegenstelling tot steekproeven hebt u volledige controle over wat er wordt verzonden of verwijderd, maar dit is van invloed op metrische gegevens op basis van geaggregeerde logboeken. Afhankelijk van hoe u items negeert, verliest u mogelijk ook de mogelijkheid om tussen gerelateerde items te navigeren.

  • Voeg eigenschappen toe aan of wijzig deze voor alle telemetrie die vanuit uw app wordt verzonden door een ITelemetryInitializer. U kunt bijvoorbeeld berekende waarden of versienummers toevoegen waarmee de gegevens in de portal moeten worden gefilterd.

  • Steekproeven verminderen het volume van telemetrie zonder dat dit van invloed is op uw statistieken. Hiermee worden gerelateerde gegevenspunten bijeengehouden, zodat u ertussen kunt navigeren wanneer u een probleem diagnosticeren. In de portal worden de totale aantallen vermenigvuldigd om de steekproef te compenseren.

Notitie

De SDK-API wordt gebruikt om aangepaste gebeurtenissen en metrische gegevens te verzenden.

Vereisten

Installeer de juiste SDK voor uw toepassing: ASP.NET, ASP.NET Core, Niet-HTTP/Worker voor .NET/.NET Core of JavaScript.

Filteren

Deze techniek geeft u directe controle over wat er is opgenomen of uitgesloten van de telemetriestroom. Filteren kan worden gebruikt om telemetrie-items te verwijderen van verzonden naar Application Insights. U kunt filteren met steekproeven of afzonderlijk gebruiken.

Als u telemetrie wilt filteren, schrijft u een telemetrieprocessor en registreert u deze bij TelemetryConfiguration. Alle telemetrie gaat via uw processor. U kunt ervoor kiezen om deze uit de stream te verwijderen of deze aan de volgende processor in de keten te geven. Telemetrie van de standaardmodules, zoals de HTTP-aanvraagverzamelaar en de afhankelijkheidsverzamelaar, en telemetrie die u zelf hebt bijgehouden, wordt opgenomen. U kunt bijvoorbeeld telemetrie filteren over aanvragen van robots of geslaagde afhankelijkheidsaanroepen.

Waarschuwing

Het filteren van de telemetrie die vanuit de SDK wordt verzonden met behulp van processors, kan de statistieken die u in de portal ziet, scheeftrekken en het lastig maken om gerelateerde items te volgen.

Overweeg in plaats daarvan steekproeven te gebruiken.

.NET-toepassingen

  1. Implementeren ITelemetryProcessor.

    Telemetrieprocessors bouwen een keten van verwerking. Wanneer u een telemetrieprocessor instantiëren, krijgt u een verwijzing naar de volgende processor in de keten. Wanneer een telemetriegegevenspunt wordt doorgegeven aan de procesmethode, wordt het werk uitgevoerd en wordt vervolgens de volgende telemetrieprocessor in de keten aangeroepen (of wordt deze niet aangeroepen).

    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;
        }
    }
    
  2. Voeg uw processor toe.

    Voeg dit fragment in ApplicationInsights.config in:

    <TelemetryProcessors>
      <Add Type="WebApplication9.SuccessfulDependencyFilter, WebApplication9">
        <!-- Set public property -->
        <MyParamFromConfigFile>2-beta</MyParamFromConfigFile>
      </Add>
    </TelemetryProcessors>
    

    U kunt tekenreekswaarden uit het .config-bestand doorgeven door openbare benoemde eigenschappen in uw klasse op te geven.

    Waarschuwing

    Zorg ervoor dat u de naam van het type en eventuele eigenschapsnamen in het .config-bestand koppelt aan de klasse- en eigenschapsnamen in de code. Als het .config-bestand verwijst naar een niet-bestaand type of een niet-bestaande eigenschap, kan de SDK op de achtergrond geen telemetrie verzenden.

    U kunt het filter ook initialiseren in code. Voeg in een geschikte initialisatieklasse, bijvoorbeeld AppStart in Global.asax.cs, uw processor in de keten in:

    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();
    

    Telemetrieclients die na dit punt zijn gemaakt, gebruiken uw processors.

Voorbeeldfilters

Synthetische aanvragen

Filter bots en webtests uit. Hoewel Metrics Explorer u de mogelijkheid biedt om synthetische bronnen te filteren, vermindert deze optie het verkeer en de opnamegrootte door ze te filteren op de SDK zelf.

public void Process(ITelemetry item)
{
    if (!string.IsNullOrEmpty(item.Context.Operation.SyntheticSource)) {return;}
    
    // Send everything else:
    this.Next.Process(item);
}

Mislukte verificatie

Filter aanvragen met een 401-antwoord.

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);
}

Snelle externe afhankelijkheidsaanroepen filteren

Als u alleen gesprekken wilt diagnosticeren die traag zijn, filtert u de snelle oproepen.

Notitie

Met dit filter worden de statistieken die u in de portal ziet, scheefgetrokken.

public void Process(ITelemetry item)
{
    var request = item as DependencyTelemetry;

    if (request != null && request.Duration.TotalMilliseconds < 100)
    {
        return;
    }
    this.Next.Process(item);
}

Problemen als gevolg van diagnoseafhankelijkheid

In dit blog wordt een project beschreven voor het diagnosticeren van afhankelijkheidsproblemen door automatisch regelmatige pings naar afhankelijkheden te verzenden.

Java-toepassingen

Raadpleeg de documentatie over Java-telemetrieprocessors voor meer informatie over telemetrieprocessors en hun implementatie in Java.

JavaScript-webtoepassingen

U kunt telemetrie filteren vanuit JavaScript-webtoepassingen met behulp van ITelemetryInitializer.

  1. Een callbackfunctie voor telemetrie-initialisatiefunctie maken. De callback-functie wordt ITelemetryItem gebruikt als een parameter. Dit is de gebeurtenis die wordt verwerkt. Als false u deze callback retourneert, wordt het telemetrie-item uitgefilterd.

    var filteringFunction = (envelope) => {
      if (envelope.data.someField === 'tobefilteredout') {
        return false;
      }
      return true;
    };
    
  2. Voeg de callback van uw telemetrie-initialisatiefunctie toe:

    appInsights.addTelemetryInitializer(filteringFunction);
    

Eigenschappen toevoegen/wijzigen: ITelemetryInitializer

Gebruik telemetrie-initialisatiefuncties om telemetrie te verrijken met aanvullende informatie of om telemetrie-eigenschappen te overschrijven die zijn ingesteld door de standaardtelemetriemodules.

Application Insights voor een webpakket verzamelt bijvoorbeeld telemetrie over HTTP-aanvragen. Standaard wordt elke aanvraag met een antwoordcode >=400 als mislukt gevlagd. Als u in plaats daarvan 400 als een succes wilt behandelen, kunt u een initialisatiefunctie voor telemetrie opgeven waarmee de eigenschap succes wordt ingesteld.

Als u een initialisatiefunctie voor telemetrie opgeeft, wordt deze aangeroepen wanneer een van de methoden Track*() wordt aangeroepen. Deze initialisatiefunctie bevat Track() methoden die worden aangeroepen door de standaardtelemetriemodules. Deze modules stellen standaard geen eigenschappen in die al door een initialisatiefunctie zijn ingesteld. Initialisatiefuncties voor telemetrie worden aangeroepen voordat telemetrieprocessors worden aangeroepen, dus alle verrijkingen die door initialisatiefuncties worden uitgevoerd, zijn zichtbaar voor processors.

.NET-toepassingen

  1. Uw initialisatiefunctie definiëren

    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
            }
        }
    }
    
  2. Uw initialisatiefunctie laden

    In ApplicationInsights.config:

    <ApplicationInsights>
      <TelemetryInitializers>
        <!-- Fully qualified type name, assembly name: -->
        <Add Type="MvcWebRole.Telemetry.MyTelemetryInitializer, MvcWebRole"/>
        ...
      </TelemetryInitializers>
    </ApplicationInsights>
    

    U kunt ook de initialisatiefunctie instantiëren in code, bijvoorbeeld in Global.aspx.cs:

    protected void Application_Start()
    {
        // ...
        TelemetryConfiguration.Active.TelemetryInitializers.Add(new MyTelemetryInitializer());
    }
    

    Bekijk meer van dit voorbeeld.

Initialisatiefuncties voor JavaScript-telemetrie

Voeg indien nodig een Initialisatiefunctie voor JavaScript-telemetrie in. Zie Initializers voor telemetrie voor de JavaScript SDK voor Application Insights voor meer informatie over de initialisatiefuncties voor telemetrie.

Voeg een telemetrie-initialisatiefunctie in door de callback-functie onInit toe te voegen in de JavaScript-SDK-configuratie (Web) SDK Loader Script:

<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>

Zie Application Insights Export Data Model voor een samenvatting van de niet-aangepaste eigenschappen die beschikbaar zijn voor het telemetrie-item.

U kunt zoveel initialisaties toevoegen als u wilt. Ze worden aangeroepen in de volgorde waarin ze worden toegevoegd.

OpenCensus Python-telemetrieprocessors

Telemetrieprocessors in OpenCensus Python zijn gewoon callbackfuncties die worden aangeroepen om telemetrie te verwerken voordat ze worden geëxporteerd. De callback-functie moet een gegevenstype envelop accepteren als parameter. Als u wilt filteren dat telemetrie wordt geëxporteerd, moet u ervoor zorgen dat de callback-functie retourneert False. U kunt het schema voor Azure Monitor-gegevenstypen zien in de enveloppen op GitHub.

Notitie

U kunt dit wijzigen cloud_RoleName door het ai.cloud.role kenmerk in het tags veld te wijzigen.

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()

U kunt zoveel processors toevoegen als u wilt. Ze worden aangeroepen in de volgorde waarin ze worden toegevoegd. Als één processor een uitzondering genereert, heeft dit geen invloed op de volgende processors.

Voorbeeld van TelemetryInitializers

Een aangepaste eigenschap toevoegen

Met de volgende voorbeeld-initialisatiefunctie wordt een aangepaste eigenschap toegevoegd aan elke bijgehouden telemetrie.

public void Initialize(ITelemetry item)
{
    var itemProperties = item as ISupportProperties;
    if(itemProperties != null && !itemProperties.Properties.ContainsKey("customProp"))
    {
        itemProperties.Properties["customProp"] = "customValue";
    }
}

Een cloudrolnaam toevoegen

Met de volgende voorbeeld-initialisatiefunctie wordt de naam van de cloudrol ingesteld op elke bijgehouden telemetrie.

public void Initialize(ITelemetry telemetry)
{
    if (string.IsNullOrEmpty(telemetry.Context.Cloud.RoleName))
    {
        telemetry.Context.Cloud.RoleName = "MyCloudRoleName";
    }
}

Het IP-adres van de client beheren dat wordt gebruikt voor geolocatietoewijzingen

Met de volgende voorbeeld-initialisatiefunctie wordt het IP-adres van de client ingesteld, dat wordt gebruikt voor geolocatietoewijzing, in plaats van het IP-adres van de clientsocket, tijdens telemetrieopname.

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 en ITelemetryInitializer

Wat is het verschil tussen telemetrieprocessors en initialisatiefuncties voor telemetrie?

  • Er zijn enkele overlappingen in wat u ermee kunt doen. Beide kunnen worden gebruikt om eigenschappen van telemetrie toe te voegen of te wijzigen, hoewel we u aanraden initialisatiefuncties voor dat doel te gebruiken.
  • Telemetrie-initialisatiefuncties worden altijd uitgevoerd vóór telemetrieprocessors.
  • Telemetrie-initialisatiefuncties kunnen meerdere keren worden aangeroepen. Standaard stellen ze geen eigenschap in die al is ingesteld.
  • Met telemetrieprocessors kunt u een telemetrie-item volledig vervangen of verwijderen.
  • Alle geregistreerde telemetrie-initialisatiefuncties worden aangeroepen voor elk telemetrie-item. Voor telemetrieprocessors garandeert SDK dat de eerste telemetrieprocessor wordt aangeroepen. Of de rest van de processors wel of niet worden aangeroepen door de voorgaande telemetrieprocessors.
  • Gebruik telemetrie-initialisatiefuncties om telemetrie te verrijken met meer eigenschappen of om een bestaande te overschrijven. Gebruik een telemetrieprocessor om telemetrie uit te filteren.

Notitie

JavaScript heeft alleen telemetrie-initialisatiefuncties die gebeurtenissen kunnen filteren met behulp van ITelemetryInitializer

Problemen met ApplicationInsights.config oplossen

  • Controleer of de volledig gekwalificeerde typenaam en assemblynaam juist zijn.
  • Controleer of het bestand applicationinsights.config zich in de uitvoermap bevindt en recente wijzigingen bevat.

Naslaginformatie over azure Monitor-telemetriegegevenstypen

Naslagdocumentatie

SDK-code

Volgende stappen