Filtern und Vorverarbeiten von Telemetriedaten im Application Insights-SDK

Sie können Code schreiben, um Ihre Telemetriedaten zu filtern, zu ändern oder anzureichern, bevor sie vom SDK gesendet werden. Die Verarbeitung umfasst Daten, die von den standardmäßigen Telemetriemodulen gesendet werden, z.B. die HTTP-Anforderungsauflistung und Abhängigkeitsauflistung.

  • Mittels Filterung können Sie Telemetriedaten ändern oder verwerfen, bevor sie vom SDK gesendet werden. Implementieren Sie hierzu ITelemetryProcessor. Sie können beispielsweise den Umfang der Telemetriedaten verringern, indem Sie Anforderungen von Robots ausschließen. Anders als beim Sampling haben Sie die volle Kontrolle darüber, was gesendet oder verworfen wird, aber es wirkt sich auf alle Metriken aus, die auf aggregierten Protokollen basieren. Je nach Vorgehensweise beim Verwerfen der Elemente kann es auch sein, dass Sie nicht mehr zwischen verwandten Elementen navigieren können.

  • Fügen Sie Eigenschaften zu allen Telemetriedaten hinzu, die von Ihrer App gesendet werden, oder ändern Sie sie, indem Sie eine ITelemetryInitializerimplementieren. Sie könnten z. B. berechnete Werte hinzufügen oder Versionsnummern, nach denen Sie die Daten im Portal filtern.

  • Erstellen von Stichproben verringert sich der Umfang der Telemetriedaten, ohne Statistiken zu verfälschen. Zusammengehörige Datenpunkte werden dabei zusammengehalten, sodass Sie bei der Diagnose von Problemen zwischen diesen navigieren können. Im Portal wird die Gesamtanzahl multipliziert, um eine Kompensation der Stichproben zu erreichen.

Hinweis

SDK-API wird zum Senden benutzerdefinierter Ereignisse und Metriken verwendet.

Vorbereitungen:

Filterung

Mit dieser Technik können Sie direkt kontrollieren, welche Daten in den Telemetriedatenstrom ein- oder daraus ausgeschlossen werden sollen. Filtern Sie Telemetrieelemente vor dem Senden an Application Insights heraus. Sie können die Filterung zusammen mit der Stichprobenerstellung oder einzeln verwenden.

Zum Filtern von Telemetriedaten schreiben Sie einen Telemetrieprozessor und registrieren ihn bei TelemetryConfiguration. Alle Telemetriedaten durchlaufen den Prozessor. Dabei können Sie auswählen, welche Daten aus dem Datenstrom gelöscht und welche an den nächsten Prozessor in der Kette weitergegeben werden sollen. Dies schließt Telemetriedaten aus den Standardmodulen wie etwa dem HTTP-Anforderungssammler und der Abhängigkeitserfassung ein sowie von Ihnen selbst überwachte Telemetriedaten. Sie können z. B. Telemetriedaten zu Anforderungen von Robots oder erfolgreiche Abhängigkeitsaufrufe herausfiltern.

Warnung

Die Filterung der vom SDK gesendeten Telemetriedaten mithilfe von Prozessoren kann die im Portal angezeigten Statistiken verfälschen und die Nachverfolgung verwandter Elemente erschweren.

Verwenden Sie stattdessen Sampling.

Erstellen eines Telemetrieprozessors

C#

  1. Implementieren Sie ITelemetryProcessor, um einen Filter zu erstellen:

    Telemetrieprozessoren erstellen eine Verarbeitungskette. Beim Instanziieren eines Telemetrieprozessors erhalten Sie einen Verweis auf den nächsten Prozessor in der Kette. Wenn ein Telemetriedatenpunkt an die Verarbeitungsmethode übergeben wird, führt er seine Aufgaben aus und ruft den nächsten Telemetrieprozessor in der Kette auf (oder nicht).

    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. Fügen Sie den Prozessor hinzu.

ASP.NET-Apps

Fügen Sie den folgenden Codeausschnitt in „ApplicationInsights.config“ ein:

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

Sie können durch die Bereitstellung von öffentlich benannten Eigenschaften in Ihrer Klasse Zeichenfolgenwerte aus der .config-Datei übergeben.

Warnung

Achten Sie darauf, dass die Typnamen und sonstige Eigenschaftennamen in der .config-Datei mit den Klassen- und Eigenschaftennamen im Code übereinstimmen. Wenn die .config-Datei auf einen nicht vorhandenen Typ oder eine nicht vorhandene Eigenschaft verweist, könnte das SDK möglicherweise automatisch keine Telemetriedaten mehr senden.

Alternativ können Sie den Filter im Code initialisieren. Fügen Sie in einer geeigneten Initialisierungsklasse, z. B. AppStart in Global.asax.cs, Ihren Prozessor in die Kette ein:

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

Nach diesem Punkt erstellte Telemetrieclients verwenden Ihre Prozessoren.

ASP.NET Core/Workerdienst-Apps

Hinweis

Das Hinzufügen eines Prozessors mithilfe von ApplicationInsights.config oder TelemetryConfiguration.Active ist für ASP.NET Core-Anwendungen sowie für das SDK „Microsoft.ApplicationInsights.WorkerService“ ungültig.

Bei Apps, die mit ASP.NET Core oder WorkerService geschrieben wurden, wird ein neuer Telemetrieprozessor, wie im Beispiel veranschaulicht, durch Anwenden der Erweiterungsmethode AddApplicationInsightsTelemetryProcessor auf IServiceCollection hinzugefügt. Diese Methode wird in der Methode ConfigureServices Ihrer Startup.cs-Klasse aufgerufen.

    public void ConfigureServices(IServiceCollection services)
    {
        // ...
        services.AddApplicationInsightsTelemetry();
        services.AddApplicationInsightsTelemetryProcessor<SuccessfulDependencyFilter>();

        // If you have more processors:
        services.AddApplicationInsightsTelemetryProcessor<AnotherProcessor>();
    }

Zum Registrieren von Telemetrieprozessoren, die Parameter in ASP.NET Core benötigen, erstellen Sie eine benutzerdefinierte Klasse, die ITelemetryProcessorFactory implementiert. Rufen Sie den Konstruktor mit den gewünschten Parametern in der Create-Methode auf, und verwenden Sie dann AddSingleton<ITelemetryProcessorFactory, MyTelemetryProcessorFactory>().

Beispielfilter

Synthetische Anforderungen

Filtern Sie Bots und Webtests heraus. Mit dem Metrik-Explorer haben Sie die Möglichkeit, synthetische Quellen herauszufiltern. Dabei werden jedoch der Datenverkehr und der Umfang der erfassten Daten verringert, da die Quellen im SDK selbst gefiltert werden.

public void Process(ITelemetry item)
{
  if (!string.IsNullOrEmpty(item.Context.Operation.SyntheticSource)) {return;}

  // Send everything else:
  this.Next.Process(item);
}

Fehler bei der Authentifizierung

Filtern Sie Abfragen mit der Antwort „401“ heraus.

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

Herausfiltern schneller Remoteabhängigkeitsaufrufe

Wenn Sie nur langsame Aufrufe diagnostizieren möchten, filtern Sie die schnellen Aufrufe heraus.

Hinweis

Durch diese Filterung wird die im Portal angezeigte Statistik verfälscht.

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

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

Diagnostizieren von Abhängigkeitsproblemen

diesem Blog wird ein Projekt zur Diagnose von Abhängigkeitsproblemen beim automatischen Senden regulärer Pings an Abhängigkeiten beschrieben.

Java

Weitere Informationen zu Telemetrieprozessoren und deren Implementierung in Java finden Sie in der Dokumentation zu Java-Telemetrieprozessoren.

JavaScript-Webanwendungen

Filtern mithilfe von „ITelemetryInitializer“

  1. Erstellen Sie eine Rückruffunktion für einen Telemetrieinitialisierer. Die Rückruffunktion akzeptiert ITelemetryItem als Parameter. Dies ist das Ereignis, das gerade verarbeitet wird. Wenn dieser Rückruf false zurückgibt, wird das Telemetrieelement herausgefiltert.

    var filteringFunction = (envelope) => {
      if (envelope.data.someField === 'tobefilteredout') {
          return false;
      }
    
      return true;
    };
    
  2. Fügen Sie den Rückruf für den Telemetrieinitialisierer hinzu:

    appInsights.addTelemetryInitializer(filteringFunction);
    

Hinzufügen/Ändern von Eigenschaften von: ITelemetryInitializer

Verwenden Sie Telemetrieinitialisierer, um Telemetriedaten mit zusätzlichen Informationen anzureichern oder die von Standardtelemetriemodulen festgelegten Telemetrieeigenschaften zu überschreiben.

Das Application Insights for Web-Paket erfasst beispielsweise Telemetriedaten über HTTP-Anforderungen. Standardmäßig kennzeichnet es jede Anforderung mit einem Antwortcode >=400 als fehlgeschlagen. Wenn 400 jedoch als erfolgreich behandelt werden soll, können Sie einen Telemetrieinitialisierer angeben, der die Success-Eigenschaft festlegt.

Wenn Sie einen Telemetrieinitialisierer angeben, wird dieser immer aufgerufen, wenn eine der Track*()-Methoden aufgerufen wird. Dieser Initialisierer beinhaltet auch Track()-Methoden, die von den Standardtelemetriemodulen aufgerufen werden. Nach Abmachung legen diese Module keine Eigenschaft fest, die bereits durch einen Initialisierer festgelegt wurde. Telemetrieinitialisierer werden vor Telemetrieprozessoren aufgerufen. Daher sind alle von Initialisierern durchgeführten Anreicherungen für Prozessoren sichtbar.

Definieren des Initialisierers

C#

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

ASP.NET-Apps: Laden des Initialisierers

In "ApplicationInsights.config":

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

Alternativ können Sie den Initialisierer im Code instanziieren, z. B. in „Global.aspx.cs“:

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

Weitere Informationen zu diesem Beispiel finden Sie hier.

ASP.NET Core/Workerdienst-Apps: Laden des Initialisierers

Hinweis

Das Hinzufügen eines Initialisierers mithilfe von ApplicationInsights.config oder TelemetryConfiguration.Active ist für ASP.NET Core-Anwendungen sowie für das SDK „Microsoft.ApplicationInsights.WorkerService“ ungültig.

Bei Apps, die mit ASP.NET Core oder WorkerService geschrieben wurden, wird ein neuer Telemetrieinitialisierer, wie im Beispiel veranschaulicht, durch Hinzufügen zum Container für die Abhängigkeitsinjektion hinzugefügt. Führen Sie diesen Schritt in der Startup.ConfigureServices-Methode aus.

 using Microsoft.ApplicationInsights.Extensibility;
 using CustomInitializer.Telemetry;
 public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<ITelemetryInitializer, MyTelemetryInitializer>();
}

JavaScript-Telemetrieinitialisierer

Fügen Sie bei Bedarf einen JavaScript-Telemetrieinitialisierer ein. Weitere Informationen zu den Telemetrieinitialisierern für das Application Insights JavaScript SDK finden Sie unter Telemetrieinitialisierer.

Fügen Sie einen Telemetrie-Initialisierer ein, indem Sie die onInit-Callback-Funktion in der Skriptkonfiguration des JavaScript (Web) SDK Loader hinzufügen:

<script type="text/javascript">
!(function (cfg){function e(){cfg.onInit&&cfg.onInit(i)}var S,u,D,t,n,i,C=window,x=document,w=C.location,I="script",b="ingestionendpoint",E="disableExceptionTracking",A="ai.device.";"instrumentationKey"[S="toLowerCase"](),u="crossOrigin",D="POST",t="appInsightsSDK",n=cfg.name||"appInsights",(cfg.name||C[t])&&(C[t]=n),i=C[n]||function(l){var d=!1,g=!1,f={initialize:!0,queue:[],sv:"7",version:2,config:l};function m(e,t){var n={},i="Browser";function a(e){e=""+e;return 1===e.length?"0"+e:e}return n[A+"id"]=i[S](),n[A+"type"]=i,n["ai.operation.name"]=w&&w.pathname||"_unknown_",n["ai.internal.sdkVersion"]="javascript:snippet_"+(f.sv||f.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:4,seq:"1",aiDataContract:undefined}}var h=-1,v=0,y=["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"],k=l.url||cfg.src;if(k){if((n=navigator)&&(~(n=(n.userAgent||"").toLowerCase()).indexOf("msie")||~n.indexOf("trident/"))&&~k.indexOf("ai.3")&&(k=k.replace(/(\/)(ai\.3\.)([^\d]*)$/,function(e,t,n){return t+"ai.2"+n})),!1!==cfg.cr)for(var e=0;e<y.length;e++)if(0<k.indexOf(y[e])){h=e;break}var i=function(e){var a,t,n,i,o,r,s,c,p,u;f.queue=[],g||(0<=h&&v+1<y.length?(a=(h+v+1)%y.length,T(k.replace(/^(.*\/\/)([\w\.]*)(\/.*)$/,function(e,t,n,i){return t+y[a]+i})),v+=1):(d=g=!0,o=k,c=(p=function(){var e,t={},n=l.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][S]()]=o[1])}return t[b]||(e=(n=t.endpointsuffix)?t.location:null,t[b]="https://"+(e?e+".":"")+"dc."+(n||"services.visualstudio.com")),t}()).instrumentationkey||l.instrumentationKey||"",p=(p=p[b])?p+"/v2/track":l.endpointUrl,(u=[]).push((t="SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)",n=o,r=p,(s=(i=m(c,"Exception")).data).baseType="ExceptionData",s.baseData.exceptions=[{typeName:"SDKLoadFailed",message:t.replace(/\./g,"-"),hasFullStack:!1,stack:t+"\nSnippet failed to load ["+n+"] -- Telemetry is disabled\nHelp Link: https://go.microsoft.com/fwlink/?linkid=2128109\nHost: "+(w&&w.pathname||"_unknown_")+"\nEndpoint: "+r,parsedStack:[]}],i)),u.push((s=o,t=p,(r=(n=m(c,"Message")).data).baseType="MessageData",(i=r.baseData).message='AI (Internal): 99 message:"'+("SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details) ("+s+")").replace(/\"/g,"")+'"',i.properties={endpoint:t},n)),o=u,c=p,JSON&&((r=C.fetch)&&!cfg.useXhr?r(c,{method:D,body:JSON.stringify(o),mode:"cors"}):XMLHttpRequest&&((s=new XMLHttpRequest).open(D,c),s.setRequestHeader("Content-type","application/json"),s.send(JSON.stringify(o))))))},a=function(e,t){g||setTimeout(function(){!t&&f.core||i()},500),d=!1},T=function(e){var n=x.createElement(I),e=(n.src=e,cfg[u]);return!e&&""!==e||"undefined"==n[u]||(n[u]=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?x.getElementsByTagName("head")[0].appendChild(n):setTimeout(function(){x.getElementsByTagName(I)[0].parentNode.appendChild(n)},cfg.ld||0),n};T(k)}try{f.cookie=x.cookie}catch(p){}function t(e){for(;e.length;)!function(t){f[t]=function(){var e=arguments;d||f.queue.push(function(){f[t].apply(f,e)})}}(e.pop())}var r,s,n="track",o="TrackPage",c="TrackEvent",n=(t([n+"Event",n+"PageView",n+"Exception",n+"Trace",n+"DependencyData",n+"Metric",n+"PageViewPerformance","start"+o,"stop"+o,"start"+c,"stop"+c,"addTelemetryInitializer","setAuthenticatedUserContext","clearAuthenticatedUserContext","flush"]),f.SeverityLevel={Verbose:0,Information:1,Warning:2,Error:3,Critical:4},(l.extensionConfig||{}).ApplicationInsightsAnalytics||{});return!0!==l[E]&&!0!==n[E]&&(t(["_"+(r="onerror")]),s=C[r],C[r]=function(e,t,n,i,a){var o=s&&s(e,t,n,i,a);return!0!==o&&f["_"+r]({message:e,url:t,lineNumber:n,columnNumber:i,error:a,evt:C.event}),o},l.autoExceptionInstrumented=!0),f}(cfg.cfg),(C[n]=i).queue&&0===i.queue.length?(i.queue.push(e),i.trackPageView({})):e();})({
src: "https://js.monitor.azure.com/scripts/b/ai.3.gbl.min.js",
crossOrigin: "anonymous",
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
cfg: { // Application Insights Configuration
    connectionString: "YOUR_CONNECTION_STRING"
}});
</script>

Eine Übersicht über die nicht benutzerdefinierten Eigenschaften, die für das Telemetrieelement verfügbar sind, finden Sie im Application Insights-Exportdatenmodell.

Sie können beliebig viele Initialisierer hinzufügen. Sie werden in der Reihenfolge aufgerufen, in der sie hinzugefügt werden.

OpenCensus Python-Telemetrieprozessoren

Bei Telemetrieprozessoren in OpenCensus Python handelt es sich lediglich um Rückruffunktionen, die aufgerufen werden, um Telemetriedaten zu verarbeiten, bevor sie exportiert werden. Die Rückruffunktion muss einen Umschlag-Datentyp als Parameter akzeptieren. Stellen Sie sicher, dass die Rückruffunktion False zurückgibt, um die Telemetriedaten aus dem Export herauszufiltern. Das Schema für die Azure Monitor-Datentypen in Umschlägen finden Sie auf GitHub.

Hinweis

Sie können cloud_RoleName ändern, indem Sie das ai.cloud.role-Attribut im Feld tags ändern.

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

Sie können beliebig viele Prozessoren hinzufügen. Sie werden in der Reihenfolge aufgerufen, in der sie hinzugefügt werden. Wenn ein Prozessor eine Ausnahme auslöst, wirkt sich dies nicht auf die folgenden Prozessoren aus.

Beispiel: Telemetrieinitialisierer

Hinzufügen einer benutzerdefinierten Eigenschaft

Mit dem folgenden Beispielinitialisierer wird allen überwachten Telemetriedaten eine benutzerdefinierte Eigenschaft hinzugefügt:

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

Hinzufügen eines Cloudrollennamens

Mit dem folgenden Beispielinitialisierer wird der Cloudrollenname für alle überwachten Telemetriedaten festgelegt.

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

Steuern der Client-IP-Adresse, die für Geolocation-Zuordnungen verwendet wird

Im folgenden Beispielinitialisierer wird die Client-IP-Adresse festgelegt, die für die Geolocation-Zuordnung anstelle der Clientsocket-IP-Adresse während der Telemetrieerfassung verwendet wird.

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

Was ist der Unterschied zwischen Telemetrieprozessoren und Telemetrieinitialisierern?

  • Die Einsatzmöglichkeiten überlappen sich teilweise. Beide können verwendet werden, um einer Telemetrie Eigenschaften hinzuzufügen oder diese zu ändern. Es wird jedoch empfohlen, für diesen Zweck Initialisierer zu verwenden.
  • Telemetrieinitialisierer werden immer vor Telemetrieprozessoren ausgeführt.
  • Telemetrieinitialisierer können mehrmals aufgerufen werden. Laut Konvention legen sie keine Eigenschaften fest, die bereits festgelegt wurden.
  • Mit Telemetrieprozessoren können Sie ein Telemetrieelement vollständig ersetzen oder verwerfen.
  • Alle registrierten Telemetrieinitialisierer werden für jedes Telemetrieelement aufgerufen. Bei Telemetrieprozessoren wird mit dem SDK der erste Telemetrieprozessor garantiert aufgerufen. Je nach vorangehenden Telemetrieprozessoren werden die restlichen Prozessoren anschließend aufgerufen oder nicht.
  • Mit Telemetrieinitialisierern können Sie Telemetriedaten mit mehr Eigenschaften anreichern oder die vorhandenen Daten überschreiben. Mit einem Telemetrieprozessor können Telemetriedaten herausgefiltert werden.

Hinweis

JavaScript hat nur Telemetrie-Initialisierer, die mit ITelemetryInitializer Ereignisse herausfiltern können

Behandeln von Problemen mit „ApplicationInsights.config“

  • Vergewissern Sie sich, dass der vollqualifizierte Typname und der Assemblyname korrekt sind.
  • Vergewissern Sie sich, dass sich die Datei „applicationinsights.config“ in Ihrem Ausgabeverzeichnis befindet und auf dem neuesten Stand ist.

Referenz zu Azure Monitor-Telemetriedatentypen

Referenz

SDK-Code

Nächste Schritte