Correlazione di dati di telemetria in Application InsightsTelemetry correlation in Application Insights

Nel mondo dei microservizi, ogni operazione logica richiede un lavoro sui vari componenti del servizio.In the world of micro services, every logical operation requires work done in various components of the service. Ognuno di questi componenti può essere monitorato separatamente tramite Application Insights.Each of these components can be separately monitored by Application Insights. Il componente app Web comunica con il componente provider di autenticazione per convalidare le credenziali dell'utente e con il componente API per ottenere dati per la visualizzazione.The web app component communicates with authentication provider component to validate user credentials, and with the API component to get data for visualization. Il componente API può a sua volta eseguire query sui dati di altri servizi, usare componenti del provider di cache e notificare questa richiesta al componente fatturazione.The API component in its turn can query data from other services and use cache-provider components and notify the billing component about this call. Application Insights supporta la correlazione di dati di telemetria distribuita.Application Insights supports distributed telemetry correlation. Consente di individuare quale componente è responsabile di errori o della riduzione delle prestazioni.It allows you to detect which component is responsible for failures or performance degradation.

Questo articolo illustra il modello di dati usato da Application Insights per correlare i dati di telemetria inviati da più componenti.This article explains the data model used by Application Insights to correlate telemetry sent by multiple components. Illustra le tecniche di propagazione del contesto e i protocolli.It covers the context propagation techniques and protocols. Descrive inoltre l'implementazione dei concetti di correlazione in linguaggi e piattaforme diversi.It also covers the implementation of the correlation concepts on different languages and platforms.

Modello di dati per la correlazione di dati di telemetriaTelemetry correlation data model

Application Insights definisce un modello di dati per la correlazione di dati di telemetria distribuita.Application Insights defines a data model for distributed telemetry correlation. Per associare i dati di telemetria all'operazione logica, ogni elemento di telemetria dispone di un campo di contesto denominato operation_Id.To associate telemetry with the logical operation, every telemetry item has a context field called operation_Id. Questo identificatore viene condiviso da ogni elemento di telemetria nella traccia distribuita.This identifier is shared by every telemetry item in the distributed trace. Se quindi si verifica una perdita di dati di telemetria da un singolo livello, è comunque possibile associare i dati di telemetria segnalati da altri componenti.So even with loss of telemetry from a single layer you still can associate telemetry reported by other components.

Un'operazione logica distribuita consiste in genere in un set di operazioni più piccole, vale a dire richieste elaborate da uno dei componenti.Distributed logical operation typically consists of a set of smaller operations - requests processed by one of the components. Tali operazioni sono definite dalla telemetria delle richieste.Those operations are defined by request telemetry. Ogni telemetria delle richieste è dotata di un proprio id che la identifica in modo univoco a livello globale.Every request telemetry has its own id that uniquely globally identifies it. Tutti i dati di telemetria, ad esempio tracce, eccezioni e così via, associati alla richiesta devono impostare operation_parentId sul valore di id della richiesta.And all telemetry - traces, exceptions, etc. associated with this request should set the operation_parentId to the value of the request id.

Ogni operazione in uscita come richiesta HTTP a un altro componente è rappresentata dalla telemetria delle dipendenze.Every outgoing operation like http call to another component represented by dependency telemetry. Anche la telemetria delle dipendenze dispone di un proprio id globalmente univoco.Dependency telemetry also defines its own id that is globally unique. La telemetria delle richieste, avviata dalla chiamata di dipendenza, lo usa come operation_parentId.Request telemetry, initiated by this dependency call, uses it as operation_parentId.

È possibile creare la visualizzazione dell'operazione logica distribuita usando operation_Id, operation_parentId e request.id con dependency.id.You can build the view of distributed logical operation using operation_Id, operation_parentId, and request.id with dependency.id. Tali campi definiscono anche l'ordine della causalità delle chiamate di telemetria.Those fields also define the causality order of telemetry calls.

in un ambiente di microservizi, le tracce dai componenti possono finire in risorse di archiviazione diverse.In micro services environment, traces from components may go to the different storages. Ogni componente può avere la propria chiave di strumentazione in Application Insights.Every component may have its own instrumentation key in Application Insights. Per ottenere i dati di telemetria per l'operazione logica, è necessario eseguire query sui dati da ogni risorsa di archiviazione.To get telemetry for the logical operation, you need to query data from every storage. Quando il numero di risorse di archiviazione è enorme, è necessario avere un suggerimento sulla successiva posizione in cui cercare.When number of storages is huge, you need to have a hint on where to look next.

Per risolvere questo problema, nel modello di dati di Application Insights sono definiti due campi: request.source e dependency.target.Application Insights data model defines two fields to solve this problem: request.source and dependency.target. Il primo campo definisce il componente che ha avviato la richiesta di dipendenza, mentre il secondo identifica quale componente ha restituito la risposta alla chiamata di dipendenza.The first field identifies the component that initiated the dependency request, and the second identifies which component returned the response of the dependency call.

EsempioExample

Un'applicazione STOCK PRICES mostra il prezzo di mercato di un'azione usando l'API esterna denominata STOCKS API.Let's take an example of an application STOCK PRICES showing the current market price of a stock using the external API called STOCKS API. L'applicazione STOCK PRICE dispone di una pagina Stock page aperta dal Web browser client tramite GET /Home/Stock.The STOCK PRICES application has a page Stock page opened by the client web browser using GET /Home/Stock. L'applicazione esegue una query a STOCK API mediante una chiamata HTTP GET /api/stock/value.The application queries the STOCK API by using an HTTP call GET /api/stock/value.

È possibile analizzare i dati di telemetria risultanti eseguendo una query:You can analyze resulting telemetry running a query:

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

Nella visualizzazione dei risultati, tutti gli elementi di telemetria condividono l'elemento operation_Id radice.In the result view note that all telemetry items share the root operation_Id. Quando la chiamata ajax viene eseguita dalla pagina, viene assegnato un nuovo ID univoco qJSXU alla telemetria delle dipendenze e l'ID di pageView viene usato come operation_ParentId.When ajax call made from the page - new unique id qJSXU is assigned to the dependency telemetry and pageView's id is used as operation_ParentId. La richiesta del server usa a sua volta l'ID ajax come operation_ParentId e così via.In turn server request uses ajax's id as operation_ParentId, etc.

itemTypeitemType namename idid operation_ParentIdoperation_ParentId operation_Idoperation_Id
pageViewpageView Pagina StockStock page STYzSTYz STYzSTYz
dipendenzadependency GET /Home/StockGET /Home/Stock qJSXUqJSXU STYzSTYz STYzSTYz
richiestarequest GET /Home/StockGET Home/Stock KqKwlrSt9PA =KqKwlrSt9PA= qJSXUqJSXU STYzSTYz
dipendenzadependency GET /api/stock/valueGET /api/stock/value bBrf2L7mm2g =bBrf2L7mm2g= KqKwlrSt9PA =KqKwlrSt9PA= STYzSTYz

Quando la chiamata GET /api/stock/value viene effettuata a un servizio esterno, si vuole conoscere l'identità del relativo server.Now when the call GET /api/stock/value made to an external service you want to know the identity of that server. È pertanto possibile impostare il campo dependency.target in modo appropriato.So you can set dependency.target field appropriately. Quando il servizio esterno non supporta il monitoraggio, target è impostato sul nome host del servizio, ad esempio stock-prices-api.com.When the external service does not support monitoring - target is set to the host name of the service like stock-prices-api.com. Se tuttavia il servizio identifica se stesso restituendo un'intestazione HTTP predefinita, target contiene l'identità del servizio che consente ad Application Insights di creare la traccia distribuita eseguendo query sui dati di telemetria di quel servizio.However if that service identifies itself by returning a predefined HTTP header - target contains the service identity that allows Application Insights to build distributed trace by querying telemetry from that service.

Intestazioni di correlazioneCorrelation headers

Microsoft sta lavorando alla proposta RFC per il protocollo HTTP per la correlazione.We are working on RFC proposal for the correlation HTTP protocol. Questa proposta definisce due intestazioni:This proposal defines two headers:

  • Request-Id porta l'ID globalmente univoco della chiamataRequest-Id carry the globally unique id of the call
  • Correlation-Context porta la raccolta di coppie nome-valore delle proprietà della traccia distribuitaCorrelation-Context - carry the name value pairs collection of the distributed trace properties

Lo standard definisce inoltre due schemi di generazione di Request-Id: semplice e gerarchico.The standard also defines two schemas of Request-Id generation - flat and hierarchical. Con lo schema semplice è presente una chiave di Id ben nota definita per la raccolta Correlation-Context.With the flat schema, there is a well-known Id key defined for the Correlation-Context collection.

Application Insights definisce l'estensione per il protocollo HTTP per la correlazione.Application Insights defines the extension for the correlation HTTP protocol. Usa le coppie nome-valore Request-Context per propagare la raccolta di proprietà usate dal chiamante o dal destinatario della chiamata.It uses Request-Context name value pairs to propagate the collection of properties used by the immediate caller or callee. Application Insights SDK usa questa intestazione per impostare i campi dependency.target e request.source.Application Insights SDK uses this header to set dependency.target and request.source fields.

OpenTracing e Application InsightsOpen tracing and Application Insights

Ecco come si presentano i modelli di dati di OpenTracing e Application Insights:Open Tracing and Application Insights data models looks

  • request, pageView esegue il mapping a Span con span.kind = serverrequest, pageView maps to Span with span.kind = server
  • dependency esegue il mapping a Span con span.kind = clientdependency maps to Span with span.kind = client
  • id di una request e dependency esegue il mapping a Span.Idid of a request and dependency maps to Span.Id
  • operation_Id esegue il mapping a TraceIdoperation_Id maps to TraceId
  • operation_ParentId esegue il mapping a Reference di tipo ChildOfoperation_ParentId maps to Reference of type ChildOf

Per informazioni sul modello di dati e sui tipi di Application Insights, vedere il modello di dati.See data model for Application Insights types and data model.

Per le definizioni di OpenTracing, vedere a specifica e le convenzioni semantiche.See specification and semantic_conventions for definitions of Open Tracing concepts.

Correlazione di dati di telemetria in .NETTelemetry correlation in .NET

Il linguaggio .NET ha definito nel corso del tempo numerosi modi per correlare i log di diagnostica e di telemetria.Over time .NET defined number of ways to correlate telemetry and diagnostics logs. System.Diagnostics.CorrelationManager consente di tenere traccia di LogicalOperationStack e ActivityId.There is System.Diagnostics.CorrelationManager allowing to track LogicalOperationStack and ActivityId. System.Diagnostics.Tracing.EventSource ed Event Tracing for Windows definiscono il metodo SetCurrentThreadActivityId.System.Diagnostics.Tracing.EventSource and Windows ETW define the method SetCurrentThreadActivityId. ILogger usa gli ambiti dei log.ILogger uses Log Scopes. WCF e Http collegano la propagazione del contesto "corrente".WCF and Http wire up "current" context propagation.

Queste soluzioni non consentono tuttavia il supporto automatico della traccia distribuita.However those methods didn't enable automatic distributed tracing support. DiagnosticsSource rappresenta un modo per supportare la correlazione automatica tra computer.DiagnosticsSource is a way to support automatic cross machine correlation. Le librerie .NET supportano DiagnosticsSource e consentono la propagazione automatica tra computer del contesto di correlazione tramite il protocollo di trasporto, ad esempio http..NET libraries support Diagnostics Source and allow automatic cross machine propagation of the correlation context via the transport like http.

La guida alle attività di DiagnosticsSource fornisce le nozioni fondamentali delle attività di monitoraggio.The guide to Activities in Diagnostics Source explains the basics of tracking Activities.

ASP.NET Core 2.0 supporta l'estrazione di intestazioni HTTP e l'avvio della nuova attività.ASP.NET Core 2.0 supports extraction of Http Headers and starting the new Activity.

System.Net.HttpClient a partire dalla versione <fill in> supporta l'inserimento automatico delle intestazioni Http di correlazione e il monitoraggio della chiamata http come attività.System.Net.HttpClient starting version <fill in> supports automatic injection of the correlation Http Headers and tracking the http call as an Activity.

È disponibile un nuovo modulo HTTP Microsoft.AspNet.TelemetryCorrelation per la versione classica di ASP.NET.There is a new Http Module Microsoft.AspNet.TelemetryCorrelation for the ASP.NET Classic. Questo modulo implementa correlazione di dati di telemetria usando DiagnosticsSource.This module implements telemetry correlation using DiagnosticsSource. Avvia l'attività in base alle intestazioni di richiesta in ingresso.It starts activity based on incoming request headers. Correla inoltre i dati di telemetria delle diverse fasi di elaborazione della richiesta,It also correlates telemetry from the different stages of request processing. anche per i casi in cui ogni fase dell'elaborazione di IIS viene eseguita in un thread di gestione diverso.Even for the cases when every stage of IIS processing runs on a different manage threads.

La versione iniziale di Application Insights SDK 2.4.0-beta1 usa DiagnosticsSource e la classe Activity per raccogliere i dati di telemetria e associarli all'attività corrente.Application Insights SDK starting version 2.4.0-beta1 uses DiagnosticsSource and Activity to collect telemetry and associate it with the current activity.

Passaggi successiviNext steps