Condividi tramite


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

Nota

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

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

  • Impostare la percentuale di campionamento su 0 (o su un valore ridotto) per i controlli di integrità eccessivi.
  • Impostare la percentuale di campionamento su 0 (o su un valore ridotto) per le chiamate di dipendenza eccessive.
  • 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 il termine span. Uno span è un termine generale per:

  • Una 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 uno tra 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 in 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:

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 chiamate redis GET my-noisy-key.

{
  "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 di 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 dell’espressione regolare.

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 dei messaggi di avviso.