Traccia distribuita con Application Insights con Java che parla con Funzioni di Azure

Sto scrivendo un campione dell’esempio di traccia distribuita con Application Insights. NOTA: questo blog è in fase di sperimentazione. Potrei cambiare i contenuti nel prossimo futuro.

Obbiettivo

Il mio cliente desidera tracciare distribuite in questo modo.

Http -> HttpTrigger (Funzioni di Azure) -> Coda di archiviazione-> Trigger della coda di archiviazione (Funzioni di Azure) -> Http -> Spring boot -> Coda del bus di servizio

Sono un principiante della programmazione Java in questi giorni. Non so come implementare la parte Java.

In questo articolo, mi concentro sull’implementazione del protocollo di correlazione Java e Http .

necessario

Se non si ha familiarità con il concetto di tracciamento della traccia distribuito con Application Insights, fare riferimento a questo post del blog.

Panoramica di correlazione con attività con Application Insights (1)
Ora sto giocando con Activity, che ci consente la traccia distribuita con Application Insights. Tuttavia, ci sono voluti alcuni … medium.com

Invio telemetria richieste

La telemetria delle richieste di invio è molto semplice. Segui il documento ufficiale.
In breve, tutto ciò che devi fare è

  • Ottenere la chiave dello strumento da Application Insights in Azure
  • Aggiungendo dipendenza al tuo Gradle o Maven
  • Aggiungi ApplicationInsights.xml
  • Aggiungi un filtro Http

La telemetria della richiesta viene inviata automaticamente a Application Insights.

Analisi delle app Web Java con Azure Application Insights
Monitoraggio delle prestazioni delle applicazioni per le app Web Java con Application Insights. docs.microsoft.com

Dove risiede l’ID di correlazione?

In cura della richiesta HTTP, viene inviato dall’intestazione HTTP “ID richiesta”. Puoi fare riferimento a quale ID richiesta sta arrivando.

  String parentRequestId = requestEntity.getHeaders (). GetFirst ("ID richiesta"); 

Il filtro riceve “ID richiesta” e genera il nuovo ID per la correlazione. Puoi vedere il codice sorgente qui.

Microsoft / ApplicationInsights-Java
Application Insights SDK per Java. Contribuisci allo sviluppo di Microsoft / ApplicationInsights-Java creando un account … github.com

Dov’è la classe Activity in Java SDK

In C #, la classe Activity svolge un ruolo chiave nella correlazione. Gioca

  • Genera un nuovo ID dall’ID principale
  • Ha proprietà di correlazione (Id, RootId, ParentId)
  • Condividi l’oggetto Activity usando AsyncLocal con Activity.Current

Nel caso di Java SDK, hanno invece la classe helper.

Per il protocollo di correlazione Http, puoi fare riferimento a TelemetryCorrelationUtils,

Microsoft / ApplicationInsights-Java
Application Insights SDK per Java. Contribuisci allo sviluppo di Microsoft / ApplicationInsights-Java creando un account … github.com

Cordiali saluti, Per il contesto di traccia W3C, è possibile utilizzare TraceContextCorrelation

Microsoft / ApplicationInsights-Java
Application Insights SDK per Java. Contribuisci allo sviluppo di Microsoft / ApplicationInsights-Java creando un account … github.com

Cosa fa il filtro?

Il filtro farà

  • Genera nuovo ID dall’ID principale ottenuto da “ID richiesta”
  • Creare l’oggetto RequestTelemetryContext e RequestTelemetry
  • Memorizzare RequestTelemetryContext sulla classe ThreadContext
  • Invia RequestTelemetry utilizzando TelemetryClient

Microsoft / ApplicationInsights-Java
Application Insights SDK per Java. Contribuisci allo sviluppo di Microsoft / ApplicationInsights-Java creando un account … github.com

Come posso ottenere il nuovo RequestTelemetryId?

Il filtro crea automaticamente un nuovo ID e invia una telemetria. Va bene. Tuttavia, se si desidera inviare i dati di telemetria delle dipendenze, è necessario l’id parent che significa RequestTelemetry.getId ().

È possibile ottenere il RequestTelemetryId corrente utilizzando la classe ThreadContext.

  RequestTelemetryContext context = ThreadContext.getRequestTelemetryContext (); 
  RequestTelemetry requestTelemetry = context.getHttpRequestTelemetry (); 
  System.out.println ( 
  String.Format (currentTemplate, 
  requestTelemetry.getId (), 
  requestTelemetry.getContext (). getOperation (). getId (), // RootId 
  requestTelemetry.getContext (). getOperation (). getParentId () 
  ) 
  ); 

Come puoi ottenere RequestTelemetryContext dalla classe ThreadContext. All’interno della classe, usano ThreadLocal per condividere l’oggetto di contesto. Quindi è possibile ottenere l’oggetto RequestTelemetry dal contesto.

La telemetria di correalation è già stata impostata.

  • RequestTelemetry.Id: requestTelemetry.getId ()
  • RootId: requestTelemetry.getContext (). GetOperation (). GetId ()
  • ParentId: requestTelemetry.getContext (). GetOperation (). GetParentId ()

Se si desidera inviare manualmente i dati di telemetria, è possibile impostare lo stesso parametro su quella proprietà.

Invio telemetria di dipendenza

Ora sei pronto per inviare i dati di telemetria delle dipendenze.

Genera ID dipendenza

La classe TelemetryCorrelationUtils ti aiuta.

  String dependencyId = TelemetryCorrelationUtils.generateChildDependencyId (); 

All’interno di generateChildDepndencyId , fa riferimento al RequestTelemetry corrente dalla classe ThreadContext, quindi crea un nuovo ID dall’ID padre che è l’id requst.

Crea telemetria di dipendenza

Abbiamo RemoteDependencyTelemetry per questo scopo. Basta creare l’istanza, passare il nome della telemetria e passare l’id di correlazione dall’ID richiesta.

  RemoteDependencyTelemetry dependencyTelemetry = new RemoteDependencyTelemetry ("Invia coda bus di servizio"); 
  dependencyTelemetry.setId (dependencyId); 
  dependencyTelemetry.getContext (). getOperation (). setId ( 
  requestTelemetry.getContext (). getOperation (). getId () 
  ); 
  dependencyTelemetry.getContext (). getOperation (). setParentId ( 
  requestTelemetry.getId () 
  ); 

Per la durata di DependencyTelemetry, è possibile utilizzare la classe com.microsoft.applicationinsights.telemetry.Duration.

  Durata della durata = nuova durata (0,0,0,0,10);  // imposta la durata di 10 millisec come esempio. 
  dependencyTelemetry.setDuration (durata); 

Invia telemetria di dipendenza

Ora pronto per inviare la telemetria di dipendenza.

  TelemetryConfiguration configuration = TelemetryConfiguration.getActive (); 
  TelemetryClient telemetryClient = new TelemetryClient (configurazione); 
  telemetryClient.trackDependency (dependencyTelemetry); 

Se si invia un messaggio a questo controller, è possibile trovare i dati di telemetria richiesta / dipendenza inviati a Application Insights.

Application Insights supporta la telemetria di dipendenza HTTP. Tuttavia, in questo caso, devo inviare la coda del bus di servizio. Tutto quello che devo fare è inviare dependencyTelemetry.getId () come ParentId con i metadati della coda.

Il codice intero controller è qui.

Puoi trovare l’intero esempio di Funzioni di Azure e Spring Boot qui.

Azure campioni / funzioni distribuito-tracing-campione
Esempio di traccia distribuita per Funzioni di Azure e Java con Application Insights … github.com

Conclusione

Ho inviato correttamente la telemetria richiesta / dipendenza dall’applicazione Spring Boot Java. Il prossimo passo sarà

  • Invia le informazioni di correlazione al ServiceBus
  • Esempio W3C TraceContext
  • Creare un esempio seguente di Funzioni di Azure

Spero che questo articolo sia utile per qualcuno.