Korelacja telemetrii w u Szczegółowe informacje

W świecie mikrousług każda operacja logiczna wymaga pracy w różnych składnikach usługi. Każdy z tych składników można monitorować oddzielnie przy użyciu usługi Application Szczegółowe informacje. Funkcje Szczegółowe informacje obsługują korelację rozproszonych danych telemetrycznych, która umożliwia wykrywanie, który składnik jest odpowiedzialny za awarie lub obniżenie wydajności.

W tym artykule wyjaśniono model danych używany przez program Application Szczegółowe informacje do korelowania danych telemetrycznych wysyłanych przez wiele składników. Obejmuje on techniki i protokoły propagacji kontekstu. Obejmuje on również implementację taktyki korelacji w różnych językach i na różnych platformach.

Model danych dla korelacji telemetrii

Application Szczegółowe informacje definiuje model danych dla korelacji rozproszonej telemetrii. Aby skojarzyć telemetrię z operacją logiczną, każdy element telemetrii ma pole kontekstu o nazwie operation_Id . Ten identyfikator jest współużytkowany przez każdy element telemetrii w śladach rozproszonych. Nawet jeśli utracisz dane telemetryczne z jednej warstwy, nadal możesz skojarzyć telemetrię zgłoszoną przez inne składniki.

Rozproszona operacja logiczna zazwyczaj składa się z zestawu mniejszych operacji, które są żądaniami przetwarzanych przez jeden ze składników. Te operacje są definiowane przez telemetrię żądania. Każdy element telemetrii żądania ma swój własny id element, który identyfikuje go unikatowo i globalnie. Wszystkie elementy telemetrii (takie jak ślady i wyjątki), które są skojarzone z żądaniem, powinny ustawić na operation_parentId wartość żądania id .

Każda operacja wychodząca, taka jak wywołanie HTTP do innego składnika, jest reprezentowana przez telemetrię zależności. Telemetria zależności definiuje również własną, id globalnie unikatową. Dane telemetryczne żądań zainicjowane przez to wywołanie zależności są używane id jako . operation_parentId

Widok rozproszonej operacji logicznej można utworzyć przy użyciu operatorów operation_Idoperation_parentId , i request.iddependency.id . Te pola definiują również kolejność przyczynowości wywołań telemetrii.

W środowisku mikrousług ślady ze składników mogą trafiać do różnych elementów magazynu. Każdy składnik może mieć własny klucz instrumentacji w programie Application Szczegółowe informacje. Aby uzyskać dane telemetryczne dla operacji logicznej, Szczegółowe informacje wysyła zapytania o dane z każdego elementu magazynu. Gdy liczba elementów magazynu jest duża, potrzebujesz wskazówki dotyczącej tego, gdzie szukać dalej. Model danych Szczegółowe informacje Application definiuje dwa pola, aby rozwiązać ten problem: request.source i dependency.target . Pierwsze pole identyfikuje składnik, który zainicjował żądanie zależności. Drugie pole określa, który składnik zwrócił odpowiedź wywołania zależności.

Przykład

Spójrzmy na przykład. Aplikacja o nazwie Ceny akcji pokazuje bieżącą cenę rynkowe akcji przy użyciu zewnętrznego interfejsu API o nazwie Stock. Aplikacja Ceny akcji zawiera stronę o nazwie Strona akcji, która jest otwierana w przeglądarce internetowej klienta przy użyciu narzędzia GET /Home/Stock . Aplikacja wysyła zapytanie do interfejsu STOCK API przy użyciu wywołania HTTP GET /api/stock/value .

Wynikowe dane telemetryczne można analizować, uruchamiając zapytanie:

(requests | union dependencies | union pageViews)
| where operation_Id == "STYz"
| project timestamp, itemType, name, id, operation_ParentId, operation_Id

W wynikach zwróć uwagę, że wszystkie elementy telemetrii współdzielą katalog główny operation_Id . Po wywołaniu Ajax ze strony nowy unikatowy identyfikator ( ) jest przypisywany do telemetrii zależności, a identyfikator widoku pageView jest qJSXU używany jako operation_ParentId . Żądanie serwera używa następnie identyfikatora AJAX jako operation_ParentId .

Itemtype name ID (Identyfikator) operation_ParentId operation_Id
widok strony Strona akcji StYz StYz
Zależności GET /Home/Stock qJSXU StYz StYz
Żądanie GET Home/Stock KqKwlrSt9PA= qJSXU StYz
Zależności GET /api/stock/value bBrf2L7mm2g= KqKwlrSt9PA= StYz

Po wywołaniu do usługi zewnętrznej musisz znać tożsamość tego serwera, aby można było odpowiednio GET /api/stock/valuedependency.target ustawić pole. Jeśli usługa zewnętrzna nie obsługuje monitorowania, jest ustawiana na nazwę hosta usługi target (na przykład stock-prices-api.com ). Jeśli jednak usługa identyfikuje się, zwracając wstępnie zdefiniowany nagłówek HTTP, zawiera tożsamość usługi, która umożliwia usłudze Application Szczegółowe informacje tworzenie rozproszonego śledzenia przez wykonywanie zapytań telemetrycznych z tej target usługi.

Nagłówki korelacji przy użyciu funkcji TraceContext W3C

Proces Szczegółowe informacje przechodzi do kontekstu śledzenia W3C,który definiuje:

  • traceparent: zawiera unikatowy w skali globalnej identyfikator operacji i unikatowy identyfikator wywołania.
  • tracestate: zawiera kontekst śledzenia specyficzny dla systemu.

Najnowsza wersja zestawu SDK usługi Application Szczegółowe informacje obsługuje protokół Trace-Context, ale może być konieczne jego zastosowanie. (Zostanie zachowana zgodność z poprzednim protokołem korelacji obsługiwanym przez zestaw SDK Szczegółowe informacje Application).

Protokół HTTP korelacji, nazywany również identyfikatorem żądania,jest przestarzały. Ten protokół definiuje dwa nagłówki:

  • Request-Id: zawiera globalnie unikatowy identyfikator wywołania.
  • Correlation-Context: zawiera kolekcję par nazwa-wartość właściwości rozproszonego śledzenia.

Rozszerzenie Szczegółowe informacje definiuje również rozszerzenie dla protokołu HTTP korelacji. Używa par nazwa-wartość do propagowania kolekcji właściwości używanych przez bezpośredniego obiektu Request-Context wywołującego lub wywołującego. Zestaw SDK Szczegółowe informacje używa tego nagłówka do ustawienia pól dependency.targetrequest.source i .

Modele danych śledzenia i Szczegółowe informacje W3C są mapowe w następujący sposób:

Application Insights W3C TraceContext
Id z Request i Dependency identyfikator-nadrzędny
Operation_Id identyfikator śledzenia
Operation_ParentId parent-id zakresu nadrzędnego tego zakresu. Jeśli jest to zakres główny, to pole musi być puste.

Aby uzyskać więcej informacji, zobacz Application Szczegółowe informacje telemetry data model (Model danych telemetrycznych usługi Application).

Włączanie obsługi śledzenia rozproszonego W3C dla aplikacji .NET

Śledzenie rozproszone oparte na funkcji TraceContext W3C jest domyślnie włączone we wszystkich najnowszych zestawach SDK programu .NET Framework/.NET Core wraz ze zgodnością z poprzednimi wersjami Request-Id protokołu.

Włączanie obsługi śledzenia rozproszonego W3C dla aplikacji Java

Agent java 3.0

Agent java 3.0 obsługuje usługę W3C od teraz i nie jest potrzebna żadna dodatkowa konfiguracja.

Zestaw SDK Java

  • Konfiguracja przychodząca

    • W przypadku EE Java dodaj następujący kod do tagu w <TelemetryModules> ApplicationInsights.xml:

      <Add type="com.microsoft.applicationinsights.web.extensibility.modules.WebRequestTrackingTelemetryModule>
         <Param name = "W3CEnabled" value ="true"/>
         <Param name ="enableW3CBackCompat" value = "true" />
      </Add>
      
    • W Spring Boot dodaj następujące właściwości:

      • azure.application-insights.web.enable-W3C=true
      • azure.application-insights.web.enable-W3C-backcompat-mode=true
  • Konfiguracja wychodząca

    Dodaj następujące elementy do AI-Agent.xml:

    <Instrumentation>
      <BuiltIn enabled="true">
        <HTTP enabled="true" W3C="true" enableW3CBackCompat="true"/>
      </BuiltIn>
    </Instrumentation>
    

    Uwaga

    Tryb zgodności z poprzednimi wersjami jest domyślnie włączony, a enableW3CBackCompat parametr jest opcjonalny. Użyj go tylko wtedy, gdy chcesz wyłączyć zgodność z poprzednimi wersjami.

    Najlepiej, gdy wszystkie usługi zostały zaktualizowane do nowszej wersji zestawów SDK, które obsługują protokół W3C. Zdecydowanie zalecamy jak najszybciej przejść do tych nowszego zestawu SDK.

Ważne

Upewnij się, że konfiguracje przychodzące i wychodzące są dokładnie takie same.

Włączanie obsługi śledzenia rozproszonego W3C dla aplikacji internetowych

Ta funkcja znajduje się w programie Microsoft.ApplicationInsights.JavaScript . Jest ona domyślnie wyłączona. Aby ją włączyć, użyj distributedTracingMode konfiguracji . AI_AND_W3C zapewnia zgodność z poprzednimi wersjami wszystkich starszych usług instrumentowanych przez usługę Application Szczegółowe informacje.

Dodaj następującą konfigurację:

  distributedTracingMode: DistributedTracingModes.W3C

Dodaj następującą konfigurację:

    distributedTracingMode: 2 // DistributedTracingModes.W3C

Ważne

Aby wyświetlić wszystkie konfiguracje wymagane do włączenia korelacji, zobacz dokumentację korelacji języka JavaScript.

Korelacja telemetrii w języku OpenCensus Python

Język OpenCensus Python obsługuje kontekst śledzenia W3C bez konieczności dodatkowej konfiguracji.

Model danych OpenCensus można znaleźć tutaj.

Korelacja żądań przychodzących

OpenCensus Python koreluje nagłówki W3C Trace-Context z żądań przychodzących do zakresów generowanych na podstawie samych żądań. OpenCensus zrobi to automatycznie dzięki integracjom dla tych popularnych platform aplikacji internetowych: Flask, Django i Pyramid. Wystarczy wypełnić nagłówki W3C Trace-Context prawidłowym formatem i wysłać je z żądaniem. Oto przykładowa aplikacja Flask, która pokazuje to:

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)

Ten kod uruchamia przykładową aplikację Flask na komputerze lokalnym, nasłuchując na porcie 8080 . Aby skorelować kontekst śledzenia, należy wysłać żądanie do punktu końcowego. W tym przykładzie można użyć curl polecenia:

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

Patrząc na format nagłówka Trace-Context,można uzyskać następujące informacje:

version: 00

trace-id: 4bf92f3577b34da6a3ce929d0e0e4736

parent-id/span-id: 00f067aa0ba902b7

trace-flags: 01

Jeśli przyjrzysz się wpisowi żądania, który został wysłany do Azure Monitor, możesz zobaczyć pola wypełnione informacjami nagłówka śledzenia. Te dane można znaleźć w obszarze Dzienniki (analiza) w Azure Monitor Application Szczegółowe informacje zasobów.

Żądanie telemetrii w dziennikach (analiza)

Pole ma format , gdzie jest generowana tablica id<trace-id>.<span-id>trace-id 8-bajtowa dla tego zakresu z nagłówka śledzenia przekazanego w span-id żądaniu.

Pole ma format , w którym zarówno wartości , jak i są brane z nagłówka śledzenia przekazanego operation_ParentId<trace-id>.<parent-id> w trace-idparent-id żądaniu.

Korelacja dzienników

OpenCensus Python umożliwia korelowanie dzienników przez dodanie identyfikatora śledzenia, identyfikatora zakresu i flagi próbkowania do rekordów dziennika. Te atrybuty można dodać, instalując integrację rejestrowania OpenCensus. Do obiektów języka Python zostaną dodane następujące LogRecord atrybuty: traceId , i spanIdtraceSampled . Należy pamiętać, że ta tworzona jest tylko w przypadku rejestratorów utworzonych po integracji.

Oto przykładowa aplikacja, która pokazuje to:

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')

Gdy ten kod zostanie uruchomiony, w konsoli programu zostanie wydrukowany następujący kod:

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

Zwróć uwagę, że komunikat dziennika znajduje się w spanId zakresie. Jest to ten sam, spanId który należy do zakresu o nazwie hello .

Dane dziennika można wyeksportować przy użyciu narzędzia AzureLogHandler . Więcej informacji znajduje się w tym artykule.

Możemy również przekazać informacje śledzenia z jednego składnika do innego w celu zapewnienia prawidłowej korelacji. Rozważmy na przykład scenariusz, w którym istnieją dwa składniki module1 i module2 . Moduł Module1 wywołuje funkcje w module Module2 i aby pobrać dzienniki zarówno z modułu , jak i z pojedynczego module1module2 śladu, możemy użyć następującego podejścia:

# 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")

Korelacja telemetrii na .NET

Środowisko uruchomieniowe .NET obsługuje rozproszone za pomocą narzędzi Activity i DiagnosticSource

Zestaw SDK platformy .NET Szczegółowe informacje i do DiagnosticSourceActivity zbierania i korelowania danych telemetrycznych.

Korelacja telemetrii w języku Java

Agent języka Java obsługuje automatyczną korelację danych telemetrycznych. Jest on automatycznie wypełniany dla wszystkich danych telemetrycznych (takich jak ślady, wyjątki i zdarzenia niestandardowe) wystawionych w operation_id zakresie żądania. Propaguje również nagłówki korelacji (opisane wcześniej) dla wywołań między usługami za pośrednictwem protokołu HTTP, jeśli agent zestawu Java SDK jest skonfigurowany.

Uwaga

Agent Szczegółowe informacje Java automatycznie zbiera żądania i zależności dla rozwiązań JMS, Kafka, Netty/Webflux i nie tylko. W przypadku zestawu Java SDK funkcja korelacji obsługuje tylko wywołania wykonane za pośrednictwem obiektu Apache HttpClient. Automatyczna propagacja kontekstu w technologiach obsługi komunikatów (takich jak Kafka, RabbitMQ i Azure Service Bus) nie jest obsługiwana w zestawie SDK.

Uwaga

Aby zbierać niestandardowe dane telemetryczne, należy instrumentować aplikację przy użyciu zestawu JAVA 2.6 SDK.

Nazwy ról

Możesz dostosować sposób wyświetlania nazw składników na mapie aplikacji. Aby to zrobić, możesz ręcznie ustawić obiekt cloud_RoleName , wykonaj jedną z następujących czynności:

  • W przypadku Szczegółowe informacje Java agent 3.0 ustaw nazwę roli w chmurze w następujący sposób:

    {
      "role": {
        "name": "my cloud role name"
      }
    }
    

    Możesz również ustawić nazwę roli w chmurze przy użyciu zmiennej środowiskowej APPLICATIONINSIGHTS_ROLE_NAME .

  • Za pomocą Szczegółowe informacje Sdk 2.5.0 i nowszych języka Java można określić wartość , dodając ApplicationInsights.xml cloud_RoleName<RoleName> pliku:

    <?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>
    
  • Jeśli używasz Spring Boot z programem Application Szczegółowe informacje Spring Boot Starter, wystarczy ustawić niestandardową nazwę aplikacji w pliku application.properties:

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

    Wartość Spring Boot Starter jest automatycznie cloudRoleName przypisywana do wartości wejdącej dla spring.application.name właściwości.

Następne kroki