Korelace telemetrie v Přehledy
Ve světě mikroslužeb vyžaduje každá logická operace práci v různých komponentách služby. Každou z těchto komponent můžete monitorovat samostatně pomocí nástroje Application Přehledy. Aplikační Přehledy podporuje distribuovanou korelaci telemetrie, pomocí které můžete zjistit, která komponenta je zodpovědná za selhání nebo snížení výkonu.
Tento článek vysvětluje datový model používaný aplikací Přehledy ke korelaci telemetrie odesílané více komponentami. Zabývá se technikami a protokoly šíření kontextu. Zabývá se také implementací taktik korelace v různých jazycích a platformách.
Datový model pro korelaci telemetrie
Aplikační Přehledy definuje datový model pro distribuovanou korelaci telemetrie. Pokud chcete přidružit telemetrii k logické operaci, má každá položka telemetrie kontextové pole s názvem operation_Id . Tento identifikátor sdílí každá položka telemetrie v distribuovaném trasování. Takže i když ztratíte telemetrii z jedné vrstvy, můžete k telemetrii hlášené jinými komponentami stále přidružit.
Distribuovaná logická operace se obvykle skládá ze sady menších operací, které jsou požadavky zpracovávané jednou z komponent. Tyto operace jsou definovány telemetrií požadavků. Každá položka telemetrie požadavku má svou id vlastní, která ji jedinečně a globálně identifikuje. A všechny položky telemetrie (například trasování a výjimky), které jsou přidružené k požadavku, by měly nastavit na operation_parentId hodnotu požadavku id .
Každá odchozí operace, například volání HTTP do jiné komponenty, je reprezentována telemetrií závislostí. Telemetrie závislostí také definuje svou vlastní, id která je globálně jedinečná. Telemetrie požadavků iniciovaná tímto voláním závislosti používá tuto id funkci jako operation_parentId svou .
Zobrazení distribuované logické operace můžete vytvořit pomocí , a operation_Id operation_parentId s request.id dependency.id . Tato pole také definují kauzální pořadí volání telemetrie.
V prostředí mikroslužeb může trasování z komponent přejít na různé položky úložiště. Každá komponenta může mít svůj vlastní instrumentační klíč v nástroji Application Přehledy. Pokud chcete získat telemetrii pro logickou operaci, nástroj Application Přehledy dotazuje data z každé položky úložiště. Pokud je počet položek úložiště velký, budete potřebovat nápovědu k tomu, kde hledat dál. Datový model Přehledy definuje dvě pole, která tento problém vyřeší: a request.source dependency.target . První pole identifikuje komponentu, která iniciovala požadavek na závislost. Druhé pole určuje, která komponenta vrátila odpověď volání závislosti.
Příklad
Podívejme se na příklad. Aplikace s názvem Stock Prices (Ceny akcií) zobrazuje aktuální tržní cenu akcie pomocí externího rozhraní API s názvem Stock (Skladové zásoby). Aplikace Stock Prices (Ceny akcií) má stránku s názvem Stock page (Skladová stránka), kterou klientský webový prohlížeč otevře pomocí GET /Home/Stock . Aplikace se dotazuje rozhraní Stock API pomocí volání HTTP GET /api/stock/value .
Výslednou telemetrii můžete analyzovat spuštěním dotazu:
(requests | union dependencies | union pageViews)
| where operation_Id == "STYz"
| project timestamp, itemType, name, id, operation_ParentId, operation_Id
Ve výsledcích si všimněte, že všechny položky telemetrie sdílejí kořen operation_Id . Při volání Ajax ze stránky se telemetrii závislostí přiřadí nové jedinečné ID ( ) a qJSXU ID objektu pageView se použije jako operation_ParentId . Požadavek na server pak použije AJAX ID jako operation_ParentId .
| Itemtype | name | ID | operation_ParentId | operation_Id |
|---|---|---|---|---|
| zobrazení stránky | Stránka Stock | STYz | STYz | |
| Závislost | GET /Home/Stock | qJSXU | STYz | STYz |
| Požadavek | GET Home/Stock | KqKwlrSt9PA= | qJSXU | STYz |
| Závislost | GET /api/stock/value | bBrf2L7mm2g= | KqKwlrSt9PA= | STYz |
Při volání externí služby potřebujete znát identitu tohoto serveru, abyste mohli pole nastavit GET /api/stock/value dependency.target odpovídajícím způsobem. Pokud externí služba monitorování nepodporuje, nastaví se na název hostitele služby target (například stock-prices-api.com ). Pokud se ale služba identifikuje vrácením předdefinované hlavičky PROTOKOLU HTTP, obsahuje identitu služby, která službě Application Přehledy umožňuje sestavit distribuované trasování dotazem target na telemetrii z této služby.
Korelační hlavičky používající W3C TraceContext
Příkaz Přehledy přechází na kontext trasování W3C,který definuje:
traceparent: Přenáší globálně jedinečné ID operace a jedinečný identifikátor volání.tracestate: Přenáší kontext trasování specifický pro systém.
Nejnovější verze sady Application Přehledy SDK podporuje protokol Trace-Context, ale možná se k tomu budete muset přihlásit. (Bude zachována zpětná kompatibilita s předchozím korelačním protokolem podporovaným sadou Application Přehledy SDK.)
Korelační protokol HTTP, také nazývaný Request-Id,je zastaralý. Tento protokol definuje dvě hlavičky:
Request-Id: Přenáší globálně jedinečné ID volání.Correlation-Context: Přenáší kolekci dvojic název-hodnota vlastností distribuovaného trasování.
Aplikační Přehledy také definuje rozšíření pro korelační protokol HTTP. Používá páry Request-Context název-hodnota k rozšíření kolekce vlastností používaných bezprostředním volajícím nebo volanou. Sada Application Přehledy SDK používá tuto hlavičku k nastavení dependency.target request.source polí a .
Kontext trasování W3C a Přehledy mapování datových modelů následujícím způsobem:
| Application Insights | W3C TraceContext |
|---|---|
Id z Request a Dependency |
id nadřazeného objektu |
Operation_Id |
id trasování |
Operation_ParentId |
parent-id nadřazeného rozsahu tohoto rozsahu. Pokud se jedná o kořenový rozsah, musí být toto pole prázdné. |
Další informace najdete v tématu Datový model Přehledy telemetrie aplikací.
Povolení podpory distribuovaného trasování W3C pro aplikace .NET
Distribuované trasování založené na W3C TraceContext je ve výchozím nastavení povolené ve všech nedávných edicích .NET Framework/.NET Core SDK spolu se zpětnou kompatibilitou se staršími Request-Id protokolem.
Povolení podpory distribuovaného trasování W3C pro aplikace v Javě
Agent Java 3.0
Agent Java 3.0 podporuje W3C a není potřeba žádná další konfigurace.
Java SDK
Příchozí konfigurace
V případě EE java přidejte do značky v souboru
<TelemetryModules>následující ApplicationInsights.xml:<Add type="com.microsoft.applicationinsights.web.extensibility.modules.WebRequestTrackingTelemetryModule> <Param name = "W3CEnabled" value ="true"/> <Param name ="enableW3CBackCompat" value = "true" /> </Add>Pro Spring Boot přidejte tyto vlastnosti:
azure.application-insights.web.enable-W3C=trueazure.application-insights.web.enable-W3C-backcompat-mode=true
Odchozí konfigurace
Do souboru přidejte AI-Agent.xml:
<Instrumentation> <BuiltIn enabled="true"> <HTTP enabled="true" W3C="true" enableW3CBackCompat="true"/> </BuiltIn> </Instrumentation>Poznámka
Režim zpětné kompatibility je ve výchozím nastavení povolený a
enableW3CBackCompatparametr je volitelný. Používejte ji pouze v případě, že chcete vypnout zpětnou kompatibilitu.V ideálním případě byste tuto funkci vypnuli, až budou všechny vaše služby aktualizované na novější verze sad SDK, které podporují protokol W3C. Důrazně doporučujeme co nejdříve přesunout na tyto novější sady SDK.
Důležité
Ujistěte se, že jsou příchozí a odchozí konfigurace přesně stejné.
Povolit podporu distribuovaného trasování W3C pro webové aplikace
Tato funkce je v systému Microsoft.ApplicationInsights.JavaScript . Ve výchozím nastavení je zakázaný. Pokud ho chcete povolit, použijte distributedTracingMode config. AI_AND_W3C je k dispozici kvůli zpětné kompatibilitě se staršími službami, které instrumentují Application Insights.
Přidejte následující konfiguraci:
distributedTracingMode: DistributedTracingModes.W3C
Přidejte následující konfiguraci:
distributedTracingMode: 2 // DistributedTracingModes.W3C
Důležité
Pokud chcete zobrazit všechny konfigurace potřebné k povolení korelace, přečtěte si dokumentaci k korelaci JavaScriptu.
Korelace telemetrie v OpenCensus Pythonu
OpenCensus Python podporuje kontext trasování W3C bez nutnosti další konfigurace.
Jako referenci se dá datový model OpenCensus najít tady.
Korelace příchozích požadavků
OpenCensus Python koreluje hlavičky W3C Trace-Context z příchozích požadavků do rozsahů, které jsou generovány z požadavků samotných. OpenCensus to provede automaticky s integrací pro tyto oblíbené webové aplikace: baňky, Django a jehlany. Stačí, když naplníte hlavičky Trace-Context W3C správným formátem a odešlete je do žádosti. Tady je ukázková aplikace, která demonstruje toto:
from flask import Flask
from opencensus.ext.azure.trace_exporter import AzureExporter
from opencensus.ext.flask.flask_middleware import FlaskMiddleware
from opencensus.trace.samplers import ProbabilitySampler
app = Flask(__name__)
middleware = FlaskMiddleware(
app,
exporter=AzureExporter(),
sampler=ProbabilitySampler(rate=1.0),
)
@app.route('/')
def hello():
return 'Hello World!'
if __name__ == '__main__':
app.run(host='localhost', port=8080, threaded=True)
Tento kód spustí ukázkovou aplikaci na vašem místním počítači, která naslouchá na portu 8080 . Pro korelaci kontextu trasování odešlete požadavek na koncový bod. V tomto příkladu můžete použít curl příkaz:
curl --header "traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01" localhost:8080
Když se podíváte na Formát záhlaví kontextu trasování, můžete odvodit následující informace:
version: 00
trace-id: 4bf92f3577b34da6a3ce929d0e0e4736
parent-id/span-id: 00f067aa0ba902b7
trace-flags: 01
Pokud se podíváte na položku žádosti, která byla odeslána do Azure Monitor, uvidíte pole naplněná pomocí informací v hlavičce trasování. tato data najdete v části protokoly (Analytics) v prostředku Azure Monitor Application Insights.

idPole je ve formátu <trace-id>.<span-id> , kde trace-id je získán z hlavičky trasování, která byla předána v požadavku a span-id je vygenerováno pole s osmi bajty pro tento rozsah.
operation_ParentIdPole je ve formátu <trace-id>.<parent-id> , kde trace-id a, parent-id z hlavičky trasování, která byla předána v žádosti.
Korelace protokolů
OpenCensus Python umožňuje korelovat protokoly přidáním ID trasování, identifikátoru ID a příznaku vzorkování pro zaznamenávání záznamů. Tyto atributy přidáte tak, že nainstalujete integraci protokolováníOpenCensus. Následující atributy budou přidány do LogRecord objektů Python: traceId , spanId a traceSampled . Všimněte si, že se to projeví jenom u protokolovacích nástrojů, které se vytvoří po integraci.
Zde je ukázková aplikace, která demonstruje tuto:
import logging
from opencensus.trace import config_integration
from opencensus.trace.samplers import AlwaysOnSampler
from opencensus.trace.tracer import Tracer
config_integration.trace_integrations(['logging'])
logging.basicConfig(format='%(asctime)s traceId=%(traceId)s spanId=%(spanId)s %(message)s')
tracer = Tracer(sampler=AlwaysOnSampler())
logger = logging.getLogger(__name__)
logger.warning('Before the span')
with tracer.span(name='hello'):
logger.warning('In the span')
logger.warning('After the span')
Po spuštění tohoto kódu se v konzole nástroje zobrazí následující:
2019-10-17 11:25:59,382 traceId=c54cb1d4bbbec5864bf0917c64aeacdc spanId=0000000000000000 Before the span
2019-10-17 11:25:59,384 traceId=c54cb1d4bbbec5864bf0917c64aeacdc spanId=70da28f5a4831014 In the span
2019-10-17 11:25:59,385 traceId=c54cb1d4bbbec5864bf0917c64aeacdc spanId=0000000000000000 After the span
Všimněte si, že je k spanId dispozici pro zprávu protokolu v rámci rozsahu. To je totéž spanId , co patří do rozpětí s názvem hello .
Data protokolu můžete exportovat pomocí AzureLogHandler . Další informace najdete v tomto článku.
Pro správnou korelaci můžeme také předat informace o trasování z jedné součásti do jiné. Představte si například scénář, ve kterém jsou dvě komponenty module1 a module2 . Module1 volá funkce v Module2 a získá protokoly z module1 a module2 v jediném trasování můžeme použít následující postup:
# module1.py
import logging
from opencensus.trace import config_integration
from opencensus.trace.samplers import AlwaysOnSampler
from opencensus.trace.tracer import Tracer
from module2 import function_1
config_integration.trace_integrations(['logging'])
logging.basicConfig(format='%(asctime)s traceId=%(traceId)s spanId=%(spanId)s %(message)s')
tracer = Tracer(sampler=AlwaysOnSampler())
logger = logging.getLogger(__name__)
logger.warning('Before the span')
with tracer.span(name='hello'):
logger.warning('In the span')
function_1(tracer)
logger.warning('After the span')
# module2.py
import logging
from opencensus.trace import config_integration
from opencensus.trace.samplers import AlwaysOnSampler
from opencensus.trace.tracer import Tracer
config_integration.trace_integrations(['logging'])
logging.basicConfig(format='%(asctime)s traceId=%(traceId)s spanId=%(spanId)s %(message)s')
tracer = Tracer(sampler=AlwaysOnSampler())
def function_1(parent_tracer=None):
if parent_tracer is not None:
tracer = Tracer(
span_context=parent_tracer.span_context,
sampler=AlwaysOnSampler(),
)
else:
tracer = Tracer(sampler=AlwaysOnSampler())
with tracer.span("function_1"):
logger.info("In function_1")
Korelace telemetrie v .NET
.NET runtime podporuje distribuované s podporou aktivity a DiagnosticSource
sada Application Insights .net SDK používá DiagnosticSource a Activity ke shromažďování a korelaci telemetrie.
Korelace telemetrie v jazyce Java
Agent Java podporuje automatickou korelaci telemetrie. Automaticky se naplní operation_id pro veškerou telemetrii (jako jsou trasování, výjimky a vlastní události) vydaná v rámci požadavku. Také šíří hlavičky korelace (popsané dříve) pro volání služby-služba prostřednictvím protokolu HTTP, pokud je nakonfigurován Agent Java SDK .
Poznámka
agent Application Insights Java automaticky shromažďuje požadavky a závislosti pro JMS, Kafka, síťovinu/webtoků a další. V případě sady Java SDK jsou pro funkci korelace podporovány pouze volání prostřednictvím Apache HttpClient. automatické šíření kontextu napříč technologiemi zasílání zpráv (například Kafka, RabbitMQ a Azure Service Bus) není v sadě SDK podporováno.
Poznámka
Pro shromáždění vlastní telemetrie, kterou potřebujete k instrumentaci aplikace pomocí sady Java 2,6 SDK.
Názvy rolí
Možná budete chtít přizpůsobit způsob, jakým se názvy komponent zobrazují v mapě aplikace. K tomu můžete ručně nastavit cloud_RoleName pomocí jedné z následujících akcí:
v případě Application Insightsho agenta Java 3,0 nastavte název cloudové role následujícím způsobem:
{ "role": { "name": "my cloud role name" } }Název cloudové role můžete také nastavit pomocí proměnné prostředí
APPLICATIONINSIGHTS_ROLE_NAME.s Application Insights Java SDK 2.5.0 a novější můžete zadat
cloud_RoleNamepřidáním<RoleName>do ApplicationInsights.xml souboru:<?xml version="1.0" encoding="utf-8"?> <ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings" schemaVersion="2014-05-30"> <InstrumentationKey>** Your instrumentation key **</InstrumentationKey> <RoleName>** Your role name **</RoleName> ... </ApplicationInsights>pokud používáte jarní spouštění s Application Insightsm starter boot starter, stačí nastavit vlastní název aplikace v souboru Application. properties:
spring.application.name=<name-of-app>Jaře Boot Starter automaticky přiřadí
cloudRoleNamehodnotu, kterou zadáte prospring.application.namevlastnost.
Další kroky
- Zápis vlastní telemetrie.
- pokročilé scénáře korelace v ASP.NET Core a ASP.NET najdete v tématu sledování vlastních operací.
- Přečtěte si další informace o nastavení cloud_RoleName pro jiné sady SDK.
- připojte všechny komponenty mikroslužby na Application Insights. Podívejte se na podporované platformy.
- seznamte se s datovým modelem pro Application Insights typy.
- Naučte se, jak můžete zvětšit a filtrovat telemetrii.
- přečtěte si referenční informace o konfiguraci Application Insights.