Override del campionamento - Application Insights per Monitoraggio di Azure per Java

Nota

La funzionalità di override del campionamento è disponibile a livello generale, a partire dalla versione 3.5.0.

Le sostituzioni di campionamento consentono di eseguire l'override della percentuale di campionamento predefinita, ad esempio:

  • Impostare la percentuale di campionamento su 0 (o un valore ridotto) per i controlli di integrità rumorosi.
  • Impostare la percentuale di campionamento su 0 (o un valore ridotto) per le chiamate di dipendenza rumorose.
  • Impostare la percentuale di campionamento su 100 per un tipo di richiesta importante ,ad esempio /login, anche se il campionamento predefinito è configurato su un valore inferiore.

Terminologia

Prima di conoscere le sostituzioni di campionamento, è necessario comprendere l'intervallo di termini. Un intervallo è un termine generale per:

  • Richiesta in ingresso.
  • Dipendenza in uscita, ad esempio una chiamata remota a un altro servizio.
  • Dipendenza in-process (ad esempio, il lavoro svolto dai sottocomponenti del servizio).

Per gli override del campionamento, questi componenti span sono importanti:

  • Attributi

Gli attributi span rappresentano proprietà standard e personalizzate di una determinata richiesta o dipendenza.

Introduzione

Per iniziare, creare un file di configurazione denominato applicationinsights.json. Salvarlo nella stessa directory di applicationinsights-agent-*.jar. Usare il modello seguente.

{
  "connectionString": "...",
  "sampling": {
    "percentage": 10
    "overrides": [
      {
        "telemetryType": "request",
        "attributes": [
          ...
        ],
        "percentage": 0
      },
      {
        "telemetryType": "request",
        "attributes": [
          ...
        ],
        "percentage": 100
      }
    ]
  }
}

Funzionamento

telemetryType (telemetryKind in Application Insights 3.4.0) deve essere request, dependency( trace log) o exception.

Quando viene avviato un intervallo, il tipo di intervallo e gli attributi presenti in tale intervallo vengono usati per verificare se una delle sostituzioni di campionamento corrisponde.

Le corrispondenze possono essere strict o regexp. Le corrispondenze dell'espressione regolare vengono eseguite sull'intero valore dell'attributo, quindi se si vuole trovare una corrispondenza con un valore che contiene abc un punto qualsiasi, è necessario usare .*abc.*. Un override di campionamento può specificare più criteri di attributo, nel qual caso tutti devono corrispondere per la corrispondenza dell'override di campionamento.

Se una delle sostituzioni di campionamento corrisponde, viene usata la percentuale di campionamento per decidere se campionare o meno l'intervallo.

Viene usato solo il primo override di campionamento corrispondente.

Se nessuna sostituzione di campionamento corrisponde:

  • Se si tratta del primo intervallo nella traccia, viene usata la configurazione di campionamento di primo livello.
  • Se non è il primo intervallo nella traccia, viene usata la decisione di campionamento padre.

Esempio: Eliminare la raccolta dei dati di telemetria per i controlli di integrità

In questo esempio viene eliminata la raccolta dei dati di telemetria per tutte le richieste a /health-checks.

In questo esempio viene inoltre eliminata la raccolta di intervalli downstream (dipendenze) normalmente raccolti in /health-checks.

{
  "connectionString": "...",
  "sampling": {
    "overrides": [
      {
        "telemetryType": "request",
        "attributes": [
          {
            "key": "url.path",
            "value": "/health-check",
            "matchType": "strict"
          }
        ],
        "percentage": 0
      }
    ]
  }
}

Esempio: Eliminare la raccolta dei dati di telemetria per una chiamata di dipendenza rumorosa

In questo esempio viene eliminata la raccolta dei dati di telemetria per tutte le GET my-noisy-key chiamate redis.

{
  "connectionString": "...",
  "sampling": {
    "overrides": [
      {
        "telemetryType": "dependency",
        "attributes": [
          {
            "key": "db.system",
            "value": "redis",
            "matchType": "strict"
          },
          {
            "key": "db.statement",
            "value": "GET my-noisy-key",
            "matchType": "strict"
          }
        ],
        "percentage": 0
      }
    ]
  }
}

Esempio: Raccogliere il 100% dei dati di telemetria per un tipo di richiesta importante

Questo esempio raccoglie il 100% dei dati di telemetria per /login.

Poiché gli intervalli downstream (dipendenze) rispettano la decisione di campionamento dell'elemento padre (assente qualsiasi override di campionamento per tale intervallo downstream), vengono raccolti anche per tutte le richieste '/login'.

{
  "connectionString": "...",
  "sampling": {
    "percentage": 10
  },
  "sampling": {
    "overrides": [
      {
        "telemetryType": "request",
        "attributes": [
          {
            "key": "url.path",
            "value": "/login",
            "matchType": "strict"
          }
        ],
        "percentage": 100
      }
    ]
  }
}

Attributi span disponibili per il campionamento

I nomi degli attributi span si basano sulle convenzioni semantiche OpenTelemetry. (HTTP, Messaging, Database, RPC)

https://github.com/open-telemetry/semantic-conventions/blob/main/docs/README.md

Nota

Per visualizzare il set esatto di attributi acquisiti da Application Insights Java per l'applicazione, impostare il livello di auto-diagnostica su debug e cercare i messaggi di debug a partire dal testo "Intervallo di esportazione".

Nota

Solo gli attributi impostati all'inizio dell'intervallo sono disponibili per il campionamento, quindi gli attributi come http.response.status_code o la durata della richiesta acquisiti in un secondo momento possono essere filtrati tramite le estensioni Java OpenTelemetry. Ecco un'estensione di esempio che filtra in base alla durata della richiesta.

Risoluzione dei problemi

Se si usa regexp e l'override del campionamento non funziona, provare con l'espressione .* regolare. Se il campionamento funziona ora, significa che si è verificato un problema con la prima espressione regolare e leggere questa documentazione regex.

Se non funziona con .*, è possibile che si verifichi un problema di sintassi in application-insights.json file. Esaminare i log di Application Insights e verificare se si notano messaggi di avviso.