Co je distribuovaná korelace trasování a telemetrie?

Poznámka:

Následující dokumentace spoléhá na klasické rozhraní API Application Insights. Dlouhodobým plánem application Insights je shromažďovat data pomocí OpenTelemetry. Další informace najdete v tématu Povolení OpenTelemetry služby Azure Monitor pro aplikace .NET, Node.js, Python a Java a náš plán OpenTelemetry. Pokyny k migraci jsou k dispozici pro .NET, Node.js a Python.

Moderní architektury cloudových a mikroslužeb umožňují jednoduché a nezávisle nasaditelné služby, které snižují náklady a zvyšují dostupnost a propustnost. Celkový systém ale ztěžuje zdůvodnění a ladění. Distribuované trasování tento problém řeší tím, že poskytuje profiler výkonu, který funguje jako zásobníky volání pro architektury cloudových a mikroslužeb.

Azure Monitor poskytuje dvě prostředí pro využívání distribuovaných dat trasování: zobrazení diagnostiky transakcí pro jednu transakci nebo požadavek a zobrazení mapy aplikace, které ukazuje, jak systémy komunikují.

Application Insights může monitorovat jednotlivé komponenty samostatně a zjišťovat, která komponenta zodpovídá za selhání nebo snížení výkonu pomocí distribuované korelace telemetrie. Tento článek vysvětluje datový model, techniky šíření kontextu, protokoly a implementaci taktik korelace na různých jazycích a platformách používaných application Insights.

Povolení distribuovaného trasování

Pokud chcete povolit distribuované trasování pro aplikaci, přidejte do každé služby správnou agenta, sadu SDK nebo knihovnu na základě jejího programovacího jazyka.

Povolení prostřednictvím Application Insights prostřednictvím automatického vygenerování nebo sad SDK

Agenti Application Insights a sady SDK pro .NET, .NET Core, Java, Node.js a JavaScript podporují distribuované trasování nativně. Pokyny pro instalaci a konfiguraci jednotlivých sad Application Insights SDK jsou k dispozici pro:

Se správnou nainstalovanou a nakonfigurovanou sadou Application Insights SDK se informace o trasování automaticky shromažďují pro oblíbené architektury, knihovny a technologie automatickými kolektory závislostí sady SDK. Úplný seznam podporovaných technologií je k dispozici v dokumentaci k autocollection závislostí.

Libovolnou technologii lze také sledovat ručně pomocí volání TrackDependency v TelemetryClient.

Povolení prostřednictvím OpenTelemetry

Application Insights teď podporuje distribuované trasování prostřednictvím OpenTelemetry. OpenTelemetry poskytuje instrumentaci neutrální dodavatele pro odesílání trasování, metrik a protokolů do Application Insights. Na začátku se komunita OpenTelemetry vzala na distribuované trasování. Metriky a protokoly stále probíhají.

Kompletní pozorovatelnost zahrnuje všechny tři pilíře. Podívejte se na stav nabídek založených na OpenTelemetry služby Azure Monitor a podívejte se na nejnovější stav zahrnutých nabídek, které nabídky jsou obecně dostupné, a možnosti podpory.

Následující stránky se skládají z jazykových pokynů pro povolení a konfiguraci nabídek založených na OpenTelemetry od Microsoftu. Důležité je, že sdílíme dostupné funkce a omezení jednotlivých nabídek, abyste mohli určit, jestli je OpenTelemetry pro váš projekt správný.

Povolení prostřednictvím OpenCensus

Kromě sad Application Insights SDK podporuje Application Insights také distribuované trasování prostřednictvím OpenCensus. OpenCensus je opensourcová, nezávislá na dodavateli, která poskytuje shromažďování metrik a distribuované trasování služeb. Umožňuje také opensourcové komunitě povolit distribuované trasování s oblíbenými technologiemi, jako jsou Redis, Memcached nebo MongoDB. Microsoft spolupracuje na OpenCensus s několika dalšími monitorovacími a cloudovými partnery.

Další informace o OpenCensus pro Python najdete v tématu Nastavení služby Azure Monitor pro vaši aplikaci v Pythonu.

Web OpenCensus udržuje referenční dokumentaci k rozhraní API pro Python, Go a různé příručky pro použití OpenCensus.

Datový model pro korelaci telemetrie

Application Insights definuje datový model pro distribuovanou korelaci telemetrie. Chcete-li přidružit telemetrii k logické operaci, má každá položka telemetrie kontextové pole s názvem operation_Id. Každý telemetrický údaj v distribuovaném trasování sdílí tento identifikátor. I když tedy ztratíte telemetrii z jedné vrstvy, můžete i nadále přidružit telemetrii hlášenou jinými komponentami.

Distribuovaná logická operace se obvykle skládá ze sady menších operací, které jsou požadavky zpracovávané jednou z komponent. Žádost o telemetrii definuje tyto operace. Každá položka telemetrie požadavku má vlastní id , která ji jednoznač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 operation_parentId na hodnotu požadavku id.

Telemetrie závislostí představuje každou odchozí operaci, například volání HTTP do jiné komponenty. Definuje také vlastní, id která je globálně jedinečná. Žádost o telemetrii, iniciovaná tímto voláním závislosti, používá tuto id funkci jako její operation_parentId.

Můžete vytvořit zobrazení distribuované logické operace pomocí , operation_Idoperation_parentIda request.id s dependency.id. Tato pole také definují pořadí kauzality volání telemetrie.

V prostředí mikroslužeb můžou trasování ze součástí přecházet do různých položek úložiště. Každá komponenta může mít v Application Insights vlastní připojovací řetězec. Pokud chcete získat telemetrii pro logickou operaci, Application Insights dotazuje data z každé položky úložiště.

Pokud je počet položek úložiště velký, potřebujete nápovědu, kde se má další vzhled. Datový model Application Insights definuje dvě pole pro vyřešení tohoto problému: request.source a 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.

Informace o dotazování z několika různorodých instancí pomocí výrazu app dotazu najdete v dotazu azure Monitoru ve výrazu app().

Příklad

Podívejme se na příklad. Aplikace s názvem Stock Prices (Ceny akcií) zobrazuje aktuální tržní cenu akcií pomocí externího rozhraní API s názvem Akcie. Aplikace Stock Prices má stránku s názvem Stock page, kterou klient webový prohlížeč otevře pomocí GET /Home/Stock. Aplikace se dotazuje na burzovní rozhraní API pomocí volání GET /api/stock/valueHTTP .

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 všechny položky telemetrie sdílejí kořen operation_Id. Při volání Ajax ze stránky se k telemetrii závislostí přiřadí nové jedinečné ID (qJSXU) a ID objektu pageView se použije jako operation_ParentId. Požadavek serveru pak použije ID Ajax jako operation_ParentId.

itemType name ID operation_ParentId operation_Id
pageView Stock page STYz STYz
závislost GET /Home/Stock qJSXU STYz STYz
request GET Home/Stock KqKwlrSt9PA= qJSXU STYz
závislost GET /api/stock/value bBrf2L7mm2g= KqKwlrSt9PA= STYz

Při volání GET /api/stock/value do externí služby potřebujete znát identitu tohoto serveru, abyste mohli pole správně nastavit dependency.target . Pokud externí služba nepodporuje monitorování, target nastaví se na název hostitele služby. Příklad: stock-prices-api.com. Pokud se ale služba identifikuje vrácením předdefinované hlavičky HTTP, obsahuje identitu služby, target která službě Application Insights umožňuje sestavit distribuované trasování dotazováním telemetrie z této služby.

Hlavičky korelace pomocí W3C TraceContext

Application Insights přechází na kontext trasování W3C, který definuje:

  • traceparent: Nese 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 Insights SDK podporuje protokol Trace-Context, ale možná se k němu budete muset přihlásit. (Zpětnou kompatibilitu s předchozím korelačním protokolem podporovaným sadou Application Insights SDK se udržuje.)

Protokol HTTP korelace, označovaný také jako ID požadavku, je zastaralý. Tento protokol definuje dvě hlavičky:

  • Request-Id: Přenáší globálně jedinečné ID volání.
  • Correlation-Context: Nese kolekci párů name-value distribuovaných vlastností trasování.

Application Insights také definuje rozšíření pro protokol HTTP korelace. Pomocí Request-Context párů name-value rozšíří kolekci vlastností používaných bezprostředním volajícím nebo volanou. Sada Application Insights SDK používá tuto hlavičku dependency.target k nastavení a request.source polí.

Datové modely W3C Trace-Context a Application Insights se mapují následujícím způsobem:

Application Insights W3C TraceContext
Ida RequestDependency parent-id
Operation_Id trace-id
Operation_ParentId parent-id nadřazeného rozsahu tohoto rozsahu. Toto pole musí být prázdné, pokud se jedná o kořenové rozpětí.

Další informace najdete v datovém modelu telemetrie Application Insights.

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 sadách .NET Framework/.NET Core SDK spolu s zpětnou kompatibilitou se starší verzí protokolu REQUEST-ID.

Povolení podpory distribuovaného trasování W3C pro aplikace v Javě

Agent Java 3.0

Agent Java 3.0 podporuje technologii W3C a nevyžaduje se žádná další konfigurace.

Java SDK

  • Příchozí konfigurace

    Pro aplikace Java EE přidejte do <TelemetryModules> značky v ApplicationInsights.xml následující kód:

    <Add type="com.microsoft.applicationinsights.web.extensibility.modules.WebRequestTrackingTelemetryModule>
       <Param name = "W3CEnabled" value ="true"/>
       <Param name ="enableW3CBackCompat" value = "true" />
    </Add>
    

    Pro aplikace Spring Boot přidejte tyto vlastnosti:

    • azure.application-insights.web.enable-W3C=true
    • azure.application-insights.web.enable-W3C-backcompat-mode=true
  • Odchozí konfigurace

    Do AI-Agent.xml přidejte následující kód:

    <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 enableW3CBackCompat parametr je volitelný. Používejte ho jenom v případech, kdy chcete zpětnou kompatibilitu vypnout.

    V ideálním případě tento režim vypnete, když se všechny vaše služby aktualizují na novější verze sad SDK, které podporují protokol W3C. Důrazně doporučujeme co nejdříve přejít na tyto novější sady SDK.

Je důležité zajistit, aby příchozí a odchozí konfigurace byly úplně stejné.

Povolení podpory distribuovaného trasování W3C pro webové aplikace

Tato funkce je ve výchozím nastavení povolená pro JavaScript a hlavičky se automaticky zahrnou, když je doména hostitelské stránky stejná jako doména, na kterou se požadavky odesílají (například hostující stránka je example.com a požadavky Ajax se odesílají).example.com Pokud chcete změnit režim distribuovaného trasování, použijte distributedTracingMode konfigurační pole. AI_AND_W3C poskytuje ve výchozím nastavení zpětnou kompatibilitu se staršími službami instrumentovanými application Insights.

Pokud se požadavky XMLHttpRequest nebo Fetch Ajax posílají jinému hostiteli domény, včetně subdomén, hlavičky korelace se ve výchozím nastavení nezahrnou. Chcete-li tuto funkci povolit, nastavte enableCorsCorrelation konfigurační pole na truehodnotu . Pokud nastavíte hodnotu enableCorsCorrelation true, všechny požadavky XMLHttpRequest a Fetch Ajax zahrnují hlavičky korelace. V důsledku toho se může stát, že pokud aplikace na volaném serveru nepodporuje hlavičku traceparent , požadavek může selhat v závislosti na tom, jestli prohlížeč nebo verze může požadavek ověřit na základě toho, které hlavičky server přijímá. Konfigurační pole můžete použít correlationHeaderExcludedDomains k vyloučení domény serveru z injektáže hlaviček korelace mezi komponentou. Můžete například použít correlationHeaderExcludedDomains: ['*.auth0.com'] k vyloučení hlaviček korelace z požadavků odeslaných zprostředkovateli identity Auth0.

Důležité

Pokud chcete zobrazit všechny konfigurace potřebné k povolení korelace, prohlédněte si dokumentaci k korelaci JavaScriptu.

Korelace telemetrie v Pythonu OpenCensus

OpenCensus Python podporuje kontext trasování W3C bez nutnosti další konfigurace.

Pro referenci najdete datový model OpenCensus na této stránce GitHubu.

Korelace příchozích požadavků

OpenCensus Python koreluje hlavičky trasování W3C z příchozích požadavků na rozsahy vygenerované z samotných požadavků. OpenCensus koreluje automaticky s integracemi těchto oblíbených architektur webových aplikací: Flask, Django a Pyramid. Stačí naplnit hlavičky trasování W3C správným formátem a odeslat je požadavkem.

Prozkoumejte tuto ukázkovou aplikaci Flask. Nainstalujte Flask, OpenCensus a rozšíření pro Flask a Azure.


pip install flask opencensus opencensus-ext-flask opencensus-ext-azure

Do proměnné prostředí je potřeba přidat připojovací řetězec Application Insights.

APPLICATIONINSIGHTS_CONNECTION_STRING=<appinsights-connection-string>

Ukázková aplikace Flask

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(
        connection_string='<appinsights-connection-string>', # or set environment variable APPLICATION_INSIGHTS_CONNECTION_STRING
    ), 
    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 Flask na místním počítači a naslouchá portu 8080. Pokud chcete korelovat kontext trasování, odešlete do koncového bodu požadavek. V tomto příkladu curl můžete použít příkaz:

curl --header "traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01" localhost:8080

Když se podíváte na formát záhlaví Trace-Context, 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 požadavku, která byla odeslána do služby Azure Monitor, zobrazí se pole naplněná informacemi hlavičky trasování. Data najdete v části Protokoly (Analytics) v prostředku Azure Monitor Application Insights.

Snímek obrazovky znázorňující telemetrii požadavku v protokolech (Analytics).

Pole id je ve formátu <trace-id>.<span-id>, kde trace-id je převzato z hlavičky trasování, které bylo předáno v požadavku a span-id je vygenerované pole 8 bajtů pro toto rozpětí.

Pole operation_ParentId je ve formátu <trace-id>.<parent-id>, kde obě trace-id a parent-id jsou převzaty z hlavičky trasování, která byla předána v požadavku.

Korelace protokolů

OpenCensus Python umožňuje korelovat protokoly přidáním ID trasování, ID rozsahu a příznaku vzorkování pro protokolování záznamů. Tyto atributy přidáte instalací integrace protokolování OpenCensus. Do objektů Pythonu LogRecord se přidají následující atributy: traceId, spanIda traceSampled (platí pouze pro protokolovací nástroje vytvořené po integraci).

Nainstalujte integraci protokolování OpenCensus:

python -m pip install opencensus-ext-logging

Ukázková aplikace

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 vytiskne následující kód:

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 spanId k dispozici zpráva protokolu, která je v rozsahu. Je spanId stejný jako ten, který patří do rozsahu s názvem hello.

Data protokolu můžete exportovat pomocí .AzureLogHandler Další informace najdete v tématu Nastavení služby Azure Monitor pro vaši aplikaci v Pythonu.

Pro správnou korelaci můžeme také předat informace o trasování z jedné komponenty do druhé. Představte si například scénář, ve kterém jsou dvě komponenty a module1 module2. Modul 1 volá funkce v modulu 2. K získání protokolů z jednoho module1 trasování a module2 z jednoho trasování můžeme použít následující přístup:

# module1.py
import logging

from opencensus.trace import config_integration
from opencensus.trace.samplers import AlwaysOnSampler
from opencensus.trace.tracer import Tracer
from module_2 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(logger, tracer)
logger.warning("After the span")
# module_2.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"
)
logger = logging.getLogger(__name__)
tracer = Tracer(sampler=AlwaysOnSampler())


def function_1(logger=logger, 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

Korelace se ve výchozím nastavení zpracovává při onboardingu aplikace. Nejsou vyžadovány žádné zvláštní akce.

Modul runtime .NET podporuje distribuovaný pomocí aktivity a diagnostického zdroje.

Sada Application Insights .NET SDK používá DiagnosticSource a Activity shromažďuje a koreluje telemetrii.

Korelace telemetrie v Javě

Agent Java podporuje automatickou korelaci telemetrie. Automaticky vyplní operation_id veškerou telemetrii (například trasování, výjimky a vlastní události) vystavené v rámci požadavku. Šíří také hlavičky korelace popsané dříve pro volání mezi službami prostřednictvím protokolu HTTP, pokud je nakonfigurovaný agent sady Java SDK.

Poznámka:

Agent Application Insights v Javě automaticky zachytí požadavky a závislosti pro JMS, Kafka, Netty/Webflux a další. Pro sadu Java SDK jsou pro funkci korelace podporována pouze volání přes Apache HttpClient. Automatické šíření kontextu mezi technologiemi zasílání zpráv, jako jsou Kafka, RabbitMQ a Azure Service Bus, se v sadě SDK nepodporuje.

Pokud chcete shromažďovat vlastní telemetrii, musíte aplikaci instrumentovat pomocí sady Java SDK 2.6.

Názvy rolí

Možná budete chtít přizpůsobit způsob zobrazení názvů komponent v mapě aplikace. Uděláte to ručně cloud_RoleName tak, že provedete jednu z následujících akcí:

  • Pro Application Insights v Javě 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é APPLICATIONINSIGHTS_ROLE_NAMEprostředí .

  • Pomocí sady Application Insights Java SDK 2.5.0 a novější můžete zadat cloud_RoleName přidáním <RoleName> do souboru ApplicationInsights.xml :

    Snímek obrazovky znázorňující přehled a připojovací řetězec Application Insights

    <?xml version="1.0" encoding="utf-8"?>
    <ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings" schemaVersion="2014-05-30">
       <ConnectionString>InstrumentationKey=00000000-0000-0000-0000-000000000000</ConnectionString>
       <RoleName>** Your role name **</RoleName>
       ...
    </ApplicationInsights>
    
  • Pokud používáte Spring Boot s úvodní aplikací Application Insights Spring Boot, nastavte vlastní název aplikace v souboru application.properties :

    spring.application.name=<name-of-app>

Název cloudové role můžete také nastavit prostřednictvím proměnné prostředí nebo systémové vlastnosti. Podrobnosti najdete v tématu Konfigurace názvu cloudové role.

Další kroky