Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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á:
- Pokud je to první záznam v trasování, použije se konfigurace vzorkování nejvyšší úrovně.
- Pokud to není první rozsah ve stopě, použije se rozhodnutí o vzorkování nadřazeného prvku.
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.
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
- Nejčastější dotazy najdete v tématu Nejčastější dotazy k přepsání vzorkování.