Filtro y preprocesamiento de la telemetría en el SDK de Application Insights

Puedes escribir código para filtrar, modificar o enriquecer tu telemetría antes de que se envíe desde el SDK. El procesamiento incluye los datos enviados desde los módulos de telemetría estándar, como la recopilación de solicitudes HTTP y de dependencias.

  • El filtrado puede modificar o descartar la telemetría antes de que se envíe desde el SDK, mediante la implementación de ITelemetryProcessor. Por ejemplo, para reducir el volumen de la telemetría puede excluir las solicitudes de robots. A diferencia del muestreo, tienes el control total de lo que se envía o descarta, pero afectará cualquier métrica basada en registros agregados. Dependiendo de cómo descartes elementos, también podrías perder la capacidad de navegar entre elementos relacionados.

  • Agrega o modifica propiedades a cualquier telemetría enviada desde tu aplicación mediante la implementación de un archivo ITelemetryInitializer. Por ejemplo, puede agregar valores calculados o números de versión para filtrar los datos en el portal.

  • muestreo reduce el volumen de la telemetría sin que ello influya en las estadísticas. Mantiene juntos los puntos de datos relacionados para que pueda navegar entre ellos a la hora de diagnosticar un problema. En el portal, se multiplican los recuentos totales para compensar el muestreo.

Nota:

API del SDK se usa para enviar métricas y eventos personalizados.

Antes de comenzar:

Filtros

Esta técnica le ofrece un control directo sobre lo que se incluirá en la transmisión de telemetría o lo que se excluirá de ella. El filtrado se puede usar para impedir el envío de elementos de telemetría a Application Insights. Puede utilizar el filtrado junto con el muestreo o por separado.

Para filtrar la telemetría, escriba un procesador de telemetría y regístrelo con TelemetryConfiguration. Toda la telemetría pasa por el procesador. Puede optar por no incluirla en la transmisión o por proporcionársela al procesador siguiente en la cadena. Esto incluye la telemetría de los módulos estándar, como el recopilador de solicitudes HTTP y el recopilador de dependencia, así como la telemetría de la que haya realizado un seguimiento. Por ejemplo, puede filtrar para dejar fuera la telemetría acerca de las solicitudes de robots o las llamadas de dependencia correctas.

Advertencia

El filtrado de la telemetría enviada desde el SDK usando procesadores puede sesgar las estadísticas que se ven en el portal y dificultar el seguimiento de elementos relacionados.

En su lugar, puede efectuar un muestreo.

Crear un procesador de telemetría

C#

  1. Para crear un filtro, implemente ITelemetryProcessor.

    Los procesadores de telemetría forman una cadena de procesamiento. Al crear instancias de un procesador de telemetría, se le proporciona una referencia al procesador siguiente en la cadena. Cuando un punto de datos de telemetría se pasa al método de proceso, realiza su trabajo y, a continuación, llama (o no) al procesador de telemetría siguiente en la cadena.

    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. Agregue el procesador.

Aplicaciones ASP.NET

Inserte este fragmento en ApplicationInsights.config:

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

Puede pasar valores de cadena desde el archivo .config proporcionando propiedades con nombre públicas en la clase.

Advertencia

Tenga cuidado para que el nombre de tipo y los nombres de propiedad del archivo .config coincidan con los nombres de clase y propiedad del código. Si el archivo .config hace referencia a un tipo o propiedad que no existe, el SDK puede producir un error de forma silenciosa al enviar cualquier telemetría.

Alternativamente, se puede inicializar el filtro en el código. En una clase de inicialización adecuada (por ejemplo, AppStart de Global.asax.cs), inserte el procesador en la cadena:

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

Los clientes de telemetría creados a partir de este punto usarán sus procesadores.

Aplicaciones Core/ Servicio de trabajo de ASP.NET

Nota

La adición de un procesador mediante ApplicationInsights.config o TelemetryConfiguration.Active no es válida para las aplicaciones de ASP.NET Core o si usa el SDK de Microsoft.ApplicationInsights.WorkerService.

Para las aplicaciones escritas mediante ASP.NET Core o WorkerService, la adición de un nuevo procesador de telemetría se realiza mediante el método de extensión AddApplicationInsightsTelemetryProcessor en IServiceCollection, como se muestra. Se llama a este método en el método ConfigureServices de su clase Startup.cs.

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

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

Para registrar procesadores de telemetría que necesitan parámetros en ASP.NET Core, cree una clase personalizada que implemente ITelemetryProcessorFactory. Llame al constructor con los parámetros deseados en el método Crear y, a continuación, use AddSingleton<ITelemetryProcessorFactory, MyTelemetryProcessorFactory>().

Filtros de ejemplo

Solicitudes sintéticas

Filtrar las pruebas web y robots. Aunque el Explorador de métricas proporciona la opción para filtrar y dejar fuera los orígenes sintéticos, esta opción reduce el tráfico y el tamaño de ingesta filtrándolos en el SDK.

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

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

Error de autenticación

Filtrar solicitudes con una respuesta "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);
}

Filtrar las llamadas de dependencia rápida y remota

Si quiere diagnosticar solo las llamadas que son lentas, descarte las rápidas.

Nota

Este filtrado sesgará las estadísticas que se ven en el portal.

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

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

Diagnóstico de problemas de dependencia

este blog se describe un proyecto para diagnosticar problemas de dependencia enviando automáticamente pings regulares a las dependencias.

Java

Para más información sobre los procesadores de telemetría y su implementación en Java, consulte la documentación de los procesadores de telemetría de Java.

Aplicaciones web de JavaScript

Filtro con ITelemetryInitializer

  1. Cree una función de devolución de llamada del inicializador de telemetría. La función de devolución de llamada toma ITelemetryItem como parámetro, que es el evento que se está procesando. La devolución de false desde esta devolución de llamada da lugar a que se filtre el elemento de telemetría.

    var filteringFunction = (envelope) => {
      if (envelope.data.someField === 'tobefilteredout') {
          return false;
      }
    
      return true;
    };
    
  2. Agregue la devolución de llamada del inicializador de telemetría:

    appInsights.addTelemetryInitializer(filteringFunction);
    

Agregar o modificar propiedades: ITelemetryInitializer

Use los inicializadores de telemetría para enriquecer la telemetría con información adicional o para invalidar las propiedades de telemetría establecidas por los módulos de telemetría estándar.

Por ejemplo, Application Insights para un paquete web recopila telemetría acerca de las solicitudes HTTP. De manera predeterminada, marca como errónea cualquier solicitud con un código de respuesta >=400. Pero si quiere tratar 400 como correcto, puede proporcionar un inicializador de telemetría que establezca la propiedad de éxito.

Si se proporciona un inicializador de telemetría, se llama cada vez que se llama a cualquiera de los métodos Track*(). Este inicializador incluye los métodos Track() que llaman los módulos de telemetría estándar. Por convención, estos módulos no establecen ninguna propiedad que ya haya sido establecida por un inicializador. Se llama a los inicializadores de telemetría antes de llamar a los procesadores de telemetría. Por tanto, cualquier enriquecimiento realizado por los inicializadores es visible para los procesadores.

Defina su inicializador

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

Aplicaciones ASP.NET: Carga del inicializador

En ApplicationInsights.config:

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

Alternativamente, se pueden crear instancias del inicializador en el código, por ejemplo en Global.aspx.cs:

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

Obtenga más información de este ejemplo.

Aplicaciones Core/ Servicio de trabajo de ASP.NET: Carga del inicializador

Nota

La adición de un inicializador mediante ApplicationInsights.config o TelemetryConfiguration.Active no es válida para las aplicaciones de ASP.NET Core o si usa el SDK de Microsoft.ApplicationInsights.WorkerService.

En el caso de las aplicaciones escritas mediante ASP.NET Core o WorkerService, la adición de un nuevo inicializador de telemetría se realiza agregándolo al contenedor de inserción de dependencias, tal y como se muestra a continuación. Realice este paso en el método Startup.ConfigureServices.

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

Inicializadores de telemetría de JavaScript

Inserte un inicializador de telemetría de JavaScript, si es necesario. Para más información sobre los inicializadores de telemetría para el SDK de JavaScript de Application Insights, consulte Inicializadores de telemetría.

Inserte un inicializador de telemetría agregando la función de devolución de llamada onInit en la configuración del script del cargador del SDK de 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>

Para obtener un resumen de las propiedades no personalizadas disponibles en el elemento de telemetría, consulte Modelo de exportación de datos de Application Insights.

Puede agregar tantos inicializadores como desee. Se llaman en el orden en que se agregan.

Procesadores de telemetría de Python para OpenCensus

Los procesadores de telemetría de Python para OpenCensus son simplemente funciones de devolución de llamada utilizadas para procesar la telemetría antes de que se exporten. La función de devolución de llamada debe aceptar un tipo de datos de sobre como parámetro. Para filtrar la telemetría para que no se exporte, asegúrese de que la función de devolución de llamada devuelva False. Puede ver el esquema de los tipos de datos de Azure Monitor en los sobres en GitHub.

Nota

cloud_RoleName se puede modificar cambiando el atributo ai.cloud.role del campo 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()

Puede agregar tantos procesadores como quiera. Se llaman en el orden en que se agregan. En el caso de que un procesador produzca una excepción, esta no afectará a los procesadores siguientes.

TelemetryInitializers de ejemplo

Adición de una propiedad personalizada

El siguiente inicializador de ejemplo agrega una propiedad personalizada a cada una de las telemetrías de las que se ha realizado un seguimiento.

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

Adición de un nombre de rol en la nube

El siguiente inicializador de ejemplo establece el nombre de rol en la nube a cada una de las telemetrías de las que se ha realizado un seguimiento.

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

Control de la dirección IP del cliente usada para las asignaciones de geolocalización

El inicializador de ejemplo siguiente establece la dirección IP del cliente que se usará para la asignación de geolocalización, en lugar de la dirección IP del socket de cliente, durante la ingesta de telemetría.

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

¿Cuál es la diferencia entre los procesadores de telemetría y los inicializadores de telemetría?

  • Hay algunas superposiciones en lo que puede hacer con ellos. Ambos se pueden usar para agregar o modificar las propiedades de la telemetría, aunque se recomienda usar inicializadores con esa finalidad.
  • Los inicializadores de telemetría siempre se ejecutan antes que los procesadores de telemetría.
  • Se puede llamar a los inicializadores de telemetría más de una vez. Por convención, no establecen ninguna propiedad que ya se haya establecido.
  • Los procesadores de telemetría permiten reemplazar o descartar por completo un elemento de telemetría.
  • Todos los inicializadores de telemetría registrados reciben llamadas para cada elemento de telemetría. En el caso de los procesadores de telemetría, el SDK garantiza la llamada al primer procesador de telemetría. Los procesadores de telemetría anteriores deciden si se llama o no al resto de los procesadores.
  • Use los inicializadores de la telemetría para enriquecerla con más propiedades o invalidar una existente. Use un procesador de telemetría para filtrar la telemetría.

Nota

JavaScript solo tiene inicializadores de telemetría que pueden filtrar eventos mediante ITelemetryInitializer.

Solución de problemas de ApplicationInsights.config

  • Compruebe que el nombre del tipo completo y el nombre del ensamblado sean correctos.
  • Compruebe que el archivo applicationinsights.config esté en el directorio de salida y que contenga todos los cambios recientes.

Referencia de tipos de datos de telemetría de Azure Monitor

Documentos de referencia

Código del SDK

Pasos siguientes