Sdílet prostřednictvím


Předefinování vzorkování – Azure Monitor Application Insights pro Java

Poznámka:

Funkce přednostního vzorkování je v obecné dostupnosti (GA) od verze 3.5.0.

Přepsání vzorkování umožňuje přepsat výchozí procento vzorkování, například:

  • Nastavte procento vzorkování na 0 (nebo nějakou malou hodnotu) pro hlučné kontroly stavu.
  • Pro volání závislosti s ruchem nastavte procento vzorkování na 0 (nebo na určitou malou hodnotu).
  • Nastavte procento vzorkování na 100 pro důležitý typ požadavku (například /login) i když máte výchozí vzorkování nakonfigurované na něco nižšího.

Terminologie

Než se dozvíte o přepisování vzorkování, měli byste porozumět termínu span. Rozsah je obecný termín pro:

  • Příchozí požadavek.
  • Odchozí závislost (například vzdálené volání do jiné služby).
  • Závislost v procesu (například práce provedená dílčími součástmi služby)

Pro přepsání vzorkování jsou tyto součásti rozsahu důležité:

  • Atributy

Atributy span představují standardní i vlastní vlastnosti daného požadavku nebo závislosti.

Začínáme

Začněte vytvořením konfiguračního souboru s názvem applicationinsights.json. Uložte ho do stejného adresáře jako applicationinsights-agent-*.jar. Použijte následující šablonu.

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

Jak to funguje

telemetryType (telemetryKind v Application Insights 3.4.0) musí být jedním z request, dependency, trace (protokol) nebo exception.

Při zahájení rozsahu se typ rozsahu a atributy, které jsou na něm přítomné, použijí ke kontrole, zda některé z přepsání vzorkování odpovídají.

Shody mohou být buď strict nebo regexp. Porovnávání regulárních výrazů se provádí s celou hodnotou atributu, takže pokud chcete shodovat s hodnotou, která obsahuje abc kdekoli v ní, je potřeba použít .*abc.*. Přepis vzorkování může určit více kritérií atributů, v takovém případě se musí všechny shodovat, aby odpovídaly přepisu vzorkování.

Pokud se některá z úprav vzorkování shoduje, použije se její procento vzorkování k rozhodnutí, zda vzorkovat úsek nebo ne.

Použije se pouze první nastavení přepsání vzorkování, které odpovídá.

Pokud žádné nastavení vzorkování neodpovídá:

Atributy spanu dostupné pro vzorkování

Atributy rozpětí OpenTelemetry jsou automaticky sbírané a založené na sémantických konvencích OpenTelemetry.

Můžete také přidat atributy span prostřednictvím kódu programu a použít je k vzorkování.

Poznámka:

Pokud chcete zobrazit přesnou sadu atributů zachycených v Application Insights pro Javu vaší aplikace, nastavte úroveň vlastní diagnostiky na ladění a vyhledejte ladicí zprávy začínající textem "exporting span".

Poznámka:

Pro vzorkování jsou k dispozici pouze atributy nastavené na začátku rozsahu, takže atributy, jako http.response.status_code nebo doba trvání požadavku, které jsou zachyceny později, je možné filtrovat prostřednictvím rozšíření OpenTelemetry Java. Tady je ukázkové rozšíření, které filtruje rozsah na základě doby trvání požadavku.

Poznámka:

Atributy přidané s procesorem telemetrie nejsou k dispozici pro vzorkování.

Případy použití

Potlačení shromažďování telemetrie pro kontroly stavu

Tento příklad potlačí shromažďování telemetrie pro všechny požadavky na /health-checks.

Tento příklad také potlačí shromažďování všech podřízených úseků (závislostí), které by se normálně shromáždily v rámci /health-checks.

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

Potlačení shromažďování telemetrie pro hlučné volání závislostí

Tento příklad potlačí shromažďování telemetrie u všech volání 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
      }
    ]
  }
}

Shromažďování 100 % telemetrie pro důležitý typ požadavku

Tento příklad shromažďuje 100 % telemetrie pro /login.

Vzhledem k tomu, že podřízené rozsahy (závislosti) respektují rozhodnutí nadřazeného vzorkování (pokud není pro podřízený rozsah přepnuté vzorkování), shromažďují se také pro všechny požadavky typu '/login'.

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

Zpřístupnění atributů rozpětí pro potlačení požadavků závislostí SQL

Tento příklad vás provede hledáním dostupných atributů, které potlačí hlučná volání SQL. Následující dotaz znázorňuje různá volání SQL a související počty záznamů za posledních 30 dnů:

dependencies
| where timestamp > ago(30d)
| where name == 'SQL: DB Query'
| summarize count() by name, operation_Name, data
| sort by count_ desc
SQL: DB Query    POST /Order             DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;    36712549    
SQL: DB Query    POST /Receipt           DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;    2220248    
SQL: DB Query    POST /CheckOutForm      DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;    554074    
SQL: DB Query    GET /ClientInfo         DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;    37064

Z výsledků lze pozorovat, že všechny operace sdílejí stejnou hodnotu v data poli: DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;. Společné prvky mezi všemi těmito záznamy z nich dělají vhodného kandidáta pro výjimku ze vzorkování.

Nastavením samodiagnostiky do režimu ladění se ve výstupu zobrazí následující záznamy:

2023-10-26 15:48:25.407-04:00 DEBUG c.m.a.a.i.exporter.AgentSpanExporter - exporting span: SpanData{spanContext=ImmutableSpanContext...

Oblast zájmu z těchto protokolů je oddíl "atributy":

{
  "attributes": {
    "data": {
      "thread.name": "DefaultDatabaseBroadcastTransport: MessageReader thread",
      "thread.id": 96,
      "db.connection_string": "apache:",
      "db.statement": "DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;",
      "db.system": "other_sql",
      "applicationinsights.internal.item_count": 1
    }
  }
}

Pomocí tohoto výstupu můžete nakonfigurovat výjimku ze vzorkování, podobně jako následující příklad postupu, který filtruje rušivá volání SQL.

{
  "connectionString": "...",
  "preview": {
    "sampling": {
      "overrides": [
        {
          "telemetryType": "dependency",
          "attributes": [
            {
              "key": "db.statement",
              "value": "DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;",
              "matchType": "strict"
            }
          ],
          "percentage": 0
        }
      ]
    }
  }
}

Po použití změn nám následující dotaz umožňuje určit čas posledního ingestování těchto závislostí do Application Insights:

dependencies
| where timestamp > ago(30d)
| where data contains 'DECLARE @MyVar'
| summarize max(timestamp) by data
| sort by max_timestamp desc
DECLARE @MyVar varbinary(20); SET @MyVar = CONVERT(VARBINARY(20), 'Hello World');SET CONTEXT_INFO @MyVar;    11/13/2023 8:52:41 PM 

Omezení shromažďování telemetrie pro systémový protokol

Pomocí SL4J můžete přidat atributy protokolu:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;

public class MdcClass {

  private static final Logger logger = LoggerFactory.getLogger(MdcClass.class);

  void method {
	
    MDC.put("key", "value");
    try {
       logger.info(...); // Application log to remove
    finally {
       MDC.remove("key"); // In a finally block in case an exception happens with logger.info
    }
	
  }
  
}

Potom můžete odebrat protokol s přidaným atributem:

{
  "sampling": {
    "overrides": [
      {
        "telemetryType": "trace",
        "percentage": 0,
        "attributes": [
          {
            "key": "key",
            "value": "value",
            "matchType": "strict"
          }
        ]
      }
    ]
  }
}

Zabránit shromažďování telemetrie pro Java metody

Do metody Java přidáme úsek a odstraníme ho pomocí přepsání vzorkování.

Nejprve přidáme opentelemetry-instrumentation-annotations závislost:

    <dependency>
      <groupId>io.opentelemetry.instrumentation</groupId>
      <artifactId>opentelemetry-instrumentation-annotations</artifactId>
    </dependency>

Teď můžeme přidat poznámku WithSpan do metody Java, která spouští požadavky SQL:

package org.springframework.samples.petclinic.vet;

@Controller
class VetController {

	private final VetRepository vetRepository;

	public VetController(VetRepository vetRepository) {
		this.vetRepository = vetRepository;
	}

	@GetMapping("/vets.html")
	public String showVetList(@RequestParam(defaultValue = "1") int page, Model model) {
		Vets vets = new Vets();
		Page<Vet> paginated = findPaginated(page);
		vets.getVetList().addAll(paginated.toList());
		return addPaginationModel(page, paginated, model);
	}

	@WithSpan
	private Page<Vet> findPaginated(int page) {
		int pageSize = 5;
		Pageable pageable = PageRequest.of(page - 1, pageSize);
		return vetRepository.findAll(pageable);  // Execution of SQL requests
	}

Následující konfigurace překrytí vzorkování umožňuje odebrat span přidaný poznámkou WithSpan.

  "sampling": {
    "overrides": [
      {
        "telemetryType": "dependency",
        "attributes": [
          {
            "key": "code.function",
            "value": "findPaginated",
            "matchType": "strict"
          }
        ],
        "percentage": 0
      }
    ]
  }

Hodnota atributu je název metody Java.

Tato konfigurace odebere všechna telemetrická data vytvořená z findPaginated metody. Závislosti SQL se nevytvořily pro spouštění SQL pocházející z findPaginated metody.

Následující konfigurace odebere všechna telemetrická data vygenerovaná z metod VetController třídy, které mají WithSpan anotaci:

 "sampling": {
    "overrides": [
      {
        "telemetryType": "dependency",
        "attributes": [
          {
            "key": "code.namespace",
            "value": "org.springframework.samples.petclinic.vet.VetController",
            "matchType": "strict"
          }
        ],
        "percentage": 0
      }
    ]
  }

Řešení problému

Projděte si vyhrazený článek o řešení potíží.

Další kroky