Filtrowanie i wstępne przetwarzanie danych telemetrycznych w zestawie Application Insights SDK

Możesz napisać kod, aby filtrować, modyfikować lub wzbogacać dane telemetryczne przed wysłaniem ich z zestawu SDK. Przetwarzanie obejmuje dane wysyłane ze standardowych modułów telemetrycznych, takich jak zbieranie żądań HTTP i zbieranie zależności.

  • Filtrowanie może modyfikować lub odrzucać dane telemetryczne przed ich wysłaniem z zestawu SDK przez zaimplementowanie elementu ITelemetryProcessor. Można na przykład zmniejszyć ilość danych telemetrycznych, wykluczając żądania z robotów. W przeciwieństwie do próbkowania masz pełną kontrolę nad tym, co jest wysyłane lub odrzucane, ale będzie miało wpływ na wszystkie metryki na podstawie zagregowanych dzienników. W zależności od sposobu odrzucania elementów możesz również utracić możliwość nawigowania między powiązanymi elementami.

  • Dodaj lub zmodyfikuj właściwości do dowolnej telemetrii wysłanej z aplikacji, implementując element ITelemetryInitializer. Można na przykład dodać wartości obliczeniowe lub numery wersji, za pomocą których można filtrować dane w portalu.

  • Próbkowanie zmniejsza ilość danych telemetrycznych bez wpływu na statystyki. Przechowuje on powiązane punkty danych, dzięki czemu można nawigować między nimi podczas diagnozowania problemu. W portalu pomnożona jest łączna liczba, aby zrekompensować próbkowanie.

Uwaga

Interfejs API zestawu SDK służy do wysyłania niestandardowych zdarzeń i metryk.

Przed rozpoczęciem:

Filtrowanie

Ta technika zapewnia bezpośrednią kontrolę nad elementami dołączonymi lub wykluczonymi ze strumienia telemetrii. Filtrowanie może służyć do porzucania elementów telemetrii z wysyłania do Szczegółowe informacje aplikacji. Filtrowanie można używać z próbkowaniem lub oddzielnie.

Aby filtrować dane telemetryczne, należy napisać procesor telemetrii i zarejestrować go w pliku TelemetryConfiguration. Wszystkie dane telemetryczne przechodzą przez procesor. Możesz usunąć go ze strumienia lub przekazać go do następnego procesora w łańcuchu. Dane telemetryczne ze standardowych modułów, takich jak moduł zbierający żądania HTTP i moduł zbierający zależności, a śledzone dane telemetryczne są uwzględniane samodzielnie. Można na przykład odfiltrować dane telemetryczne dotyczące żądań z robotów lub pomyślnych wywołań zależności.

Ostrzeżenie

Filtrowanie danych telemetrycznych wysyłanych z zestawu SDK przy użyciu procesorów może wypaczyć statystyki widoczne w portalu i utrudniać obserwowanie powiązanych elementów.

Zamiast tego rozważ użycie próbkowania.

Tworzenie procesora telemetrii

C#

  1. Aby utworzyć filtr, zaimplementuj element ITelemetryProcessor.

    Procesory telemetryczne konstruuje łańcuch przetwarzania. Podczas tworzenia wystąpienia procesora telemetrii otrzymujesz odwołanie do następnego procesora w łańcuchu. Gdy punkt danych telemetrycznych jest przekazywany do metody procesu, wykonuje swoją pracę, a następnie wywołuje (lub nie wywołuje) następnego procesora telemetrii w łańcuchu.

    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. Dodaj procesor.

aplikacje ASP.NET

Wstaw ten fragment kodu w pliku Application Szczegółowe informacje.config:

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

Wartości ciągów można przekazać z pliku config, podając publiczne nazwane właściwości w klasie.

Ostrzeżenie

Należy zachować ostrożność, aby dopasować nazwę typu i wszystkie nazwy właściwości w pliku config do nazw klas i właściwości w kodzie. Jeśli plik config odwołuje się do nieistniejących typów lub właściwości, zestaw SDK może dyskretnie nie wysyłać żadnych danych telemetrycznych.

Alternatywnie można zainicjować filtr w kodzie. W odpowiedniej klasie inicjowania, na przykład AppStart w Global.asax.cspliku , wstaw procesor do łańcucha:

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

Klienci telemetrii utworzone po tym punkcie będą używać procesorów.

aplikacje usługi ASP.NET Core/Worker

Uwaga

Dodawanie procesora przy użyciu lub ApplicationInsights.configTelemetryConfiguration.Active nie jest prawidłowe w przypadku aplikacji ASP.NET Core lub jeśli używasz aplikacji Microsoft.Application Szczegółowe informacje. Zestaw SDK usługi WorkerService.

W przypadku aplikacji napisanych przy użyciu ASP.NET Core lub WorkerService dodanie nowego procesora telemetrii odbywa się przy użyciu AddApplicationInsightsTelemetryProcessor metody rozszerzenia w IServiceCollectionprogramie , jak pokazano poniżej. Ta metoda jest wywoływana ConfigureServices w metodzie Startup.cs klasy .

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

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

Aby zarejestrować procesory telemetryczne, które wymagają parametrów w ASP.NET Core, utwórz niestandardową klasę implementjącą ITelemetryProcessorFactory. Wywołaj konstruktor z żądanymi parametrami w metodzie Create , a następnie użyj polecenia AddSingleton<ITelemetryProcessorFactory, MyTelemetryProcessorFactory>().

Przykładowe filtry

Żądania syntetyczne

Odfiltruj boty i testy internetowe. Mimo że Eksplorator metryk udostępnia opcję filtrowania źródeł syntetycznych, ta opcja zmniejsza rozmiar ruchu i pozyskiwania przez filtrowanie ich w samym zestawie SDK.

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

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

Uwierzytelnianie nie powiodło się

Odfiltruj żądania za pomocą odpowiedzi "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);
}

Filtrowanie szybkich wywołań zależności zdalnych

Jeśli chcesz zdiagnozować tylko wolne wywołania, odfiltruj te szybkie.

Uwaga

To filtrowanie spowoduje wypaczenie statystyk widocznych w portalu.

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

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

Diagnozowanie problemów z zależnością

W tym blogu opisano projekt do diagnozowania problemów z zależnościami przez automatyczne wysyłanie regularnych poleceń ping do zależności.

Java

Aby dowiedzieć się więcej na temat procesorów telemetrii i ich implementacji w języku Java, zapoznaj się z dokumentacją procesorów telemetrycznych Java.

Aplikacje internetowe JavaScript

Filtrowanie przy użyciu interfejsu ITelemetryInitializer

  1. Utwórz funkcję wywołania zwrotnego inicjatora telemetrii. Funkcja wywołania zwrotnego przyjmuje ITelemetryItem jako parametr, czyli zdarzenie, które jest przetwarzane. Zwracanie false z tego wywołania zwrotnego powoduje odfiltrowanie elementu telemetrii.

    var filteringFunction = (envelope) => {
      if (envelope.data.someField === 'tobefilteredout') {
          return false;
      }
    
      return true;
    };
    
  2. Dodaj wywołanie zwrotne inicjatora telemetrii:

    appInsights.addTelemetryInitializer(filteringFunction);
    

Dodawanie/modyfikowanie właściwości: ITelemetryInitializer

Inicjatory telemetrii umożliwiają wzbogacanie telemetrii dodatkowymi informacjami lub zastępowanie właściwości telemetrii ustawionych przez standardowe moduły telemetryczne.

Na przykład aplikacja Szczegółowe informacje dla pakietu internetowego zbiera dane telemetryczne dotyczące żądań HTTP. Domyślnie flaguje ono jako nieudane każde żądanie z kodem >odpowiedzi =400. Jeśli jednak chcesz traktować 400 jako sukces, możesz podać inicjator telemetrii, który ustawia właściwość powodzenia.

Jeśli podasz inicjator telemetrii, będzie on wywoływany za każdym razem, gdy zostanie wywołana dowolna z metod Track*(). Ten inicjator zawiera Track() metody wywoływane przez standardowe moduły telemetrii. Zgodnie z konwencją te moduły nie ustawiają żadnej właściwości, która została już ustawiona przez inicjator. Inicjatory telemetrii są wywoływane przed wywołaniem procesorów telemetrii. Dlatego wszelkie wzbogacania wykonywane przez inicjatory są widoczne dla procesorów.

Definiowanie inicjatora

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

aplikacje ASP.NET: ładowanie inicjatora

W pliku Application Szczegółowe informacje.config:

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

Alternatywnie można utworzyć wystąpienie inicjatora w kodzie, na przykład w pliku Global.aspx.cs:

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

Zobacz więcej z tego przykładu.

aplikacje usługi ASP.NET Core/Worker: ładowanie inicjatora

Uwaga

Dodawanie inicjatora przy użyciu polecenia ApplicationInsights.config lub TelemetryConfiguration.Active nie jest prawidłowe w przypadku aplikacji ASP.NET Core lub jeśli używasz aplikacji Microsoft.Application Szczegółowe informacje. Zestaw SDK usługi WorkerService.

W przypadku aplikacji napisanych przy użyciu ASP.NET Core lub WorkerService dodanie nowego inicjatora telemetrii odbywa się przez dodanie go do kontenera wstrzykiwania zależności, jak pokazano poniżej. Ten krok należy wykonać w metodzie Startup.ConfigureServices .

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

Inicjatory telemetrii języka JavaScript

W razie potrzeby wstaw inicjator telemetrii języka JavaScript. Aby uzyskać więcej informacji na temat inicjatorów telemetrii dla zestawu SDK języka JavaScript usługi Application Szczegółowe informacje, zobacz Inicjatory telemetrii.

Wstaw inicjator telemetrii przez dodanie funkcji wywołania zwrotnego onInit w konfiguracji skryptu modułu ładującego zestawu SDK języka JavaScript (Web):

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

Podsumowanie właściwości niedokumentowych dostępnych w elemencie telemetrii znajduje się w temacie Application Szczegółowe informacje Export Data Model (Eksportowanie modelu danych w usłudze Application Szczegółowe informacje Export Data Model).

Możesz dodać dowolną liczbę inicjatorów. Są one wywoływane w kolejności, w której są dodawane.

Procesory telemetryczne OpenCensus języka Python

Procesory telemetryczne w języku OpenCensus Python to po prostu funkcje wywołania zwrotnego wywoływane w celu przetwarzania telemetrii przed ich wyeksportowaniem. Funkcja wywołania zwrotnego musi akceptować typ danych koperty jako parametr. Aby odfiltrować dane telemetryczne z eksportowanych, upewnij się, że funkcja wywołania zwrotnego zwraca wartość False. Schemat typów danych usługi Azure Monitor można zobaczyć w kopertach w witrynie GitHub.

Uwaga

Możesz zmodyfikować cloud_RoleName , zmieniając ai.cloud.role atrybut w tags polu.

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

Możesz dodać dowolną liczbę procesorów. Są one wywoływane w kolejności, w której są dodawane. Jeśli jeden procesor zgłasza wyjątek, nie ma to wpływu na następujące procesory.

Przykład telemetriiInitializers

Dodawanie właściwości niestandardowej

Poniższy przykładowy inicjator dodaje właściwość niestandardową do każdej śledzonej telemetrii.

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

Dodawanie nazwy roli w chmurze

Poniższy przykładowy inicjator ustawia nazwę roli w chmurze na wszystkie śledzone dane telemetryczne.

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

Kontrolowanie adresu IP klienta używanego do mapowania geolokalizacji

Poniższy przykładowy inicjator ustawia adres IP klienta, który będzie używany do mapowania geolokalizacji zamiast adresu IP gniazda klienta podczas pozyskiwania danych telemetrycznych.

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

Jaka jest różnica między procesorami telemetrii a inicjatorami telemetrii?

  • Istnieją pewne nakładające się na siebie czynności, które można z nimi zrobić. Oba te elementy mogą służyć do dodawania lub modyfikowania właściwości telemetrii, chociaż zalecamy używanie inicjatorów do tego celu.
  • Inicjatory telemetrii są zawsze uruchamiane przed procesorami telemetrii.
  • Inicjatory telemetrii mogą być wywoływane więcej niż raz. Zgodnie z konwencją nie ustawiają żadnej właściwości, która została już ustawiona.
  • Procesory telemetryczne umożliwiają całkowite zastąpienie lub odrzucenie elementu telemetrii.
  • Wszystkie zarejestrowane inicjatory telemetrii są wywoływane dla każdego elementu telemetrii. W przypadku procesorów telemetrycznych zestaw SDK gwarantuje wywołanie pierwszego procesora telemetrii. Niezależnie od tego, czy pozostałe procesory są wywoływane, czy nie, zależy od powyższych procesorów telemetrycznych.
  • Użyj inicjatorów telemetrii, aby wzbogacić dane telemetryczne o więcej właściwości lub zastąpić istniejącą. Użyj procesora telemetrii, aby odfiltrować dane telemetryczne.

Uwaga

Język JavaScript zawiera tylko inicjatory telemetrii, które mogą filtrować zdarzenia przy użyciu interfejsu ITelemetryInitializer

Rozwiązywanie problemów z aplikacją Szczegółowe informacje.config

  • Upewnij się, że w pełni kwalifikowana nazwa typu i nazwa zestawu są poprawne.
  • Upewnij się, że plik applicationinsights.config znajduje się w katalogu wyjściowym i zawiera wszelkie ostatnie zmiany.

Dokumentacja typów danych telemetrycznych usługi Azure Monitor

Dokumenty referencyjne

Kod zestawu SDK

Następne kroki