Scroll Top
Via Antonio Amato, 20/22 84131 Salerno (SA)

OpenTelemetry: una soluzione immediata al problema del tracing nei sistemi a microservizi

Opentelemetry

(articolo redatto da Maurizio Migliore)

Il tracing, o tracciamento, nei sistemi a microservizi è una sfida complessa da affrontare a causa della natura distribuita e scalabile di tali architetture IT.

In questo approfondimento ti racconto come il progetto open source OpenTelemetry può fornire strumenti e standard per il tracciamento, il monitoraggio e la gestione delle prestazioni delle applicazioni distribuite.

Il problema del tracing nei sistemi a microservizi

Il tracing, o tracciamento, nei sistemi a microservizi è una sfida complessa da affrontare, a causa della natura distribuita e scalabile di tali architetture.

Il tracciamento è un meccanismo essenziale per comprendere il flusso di una richiesta attraverso i vari servizi e individuare eventuali problemi o ritardi.

Una possibile soluzione è l’implementazione del tracing distribuito, che consente di generare un unico identificatore di tracciamento per ogni richiesta iniziale e di propagarlo attraverso i vari servizi coinvolti.

Ogni servizio che elabora la richiesta può registrare informazioni sul proprio contributo al tracciamento, inclusi i tempi di esecuzione e le eventuali chiamate a servizi esterni.

Struttura del tracing

Il concetto di trace e span è fondamentale nel contesto del tracciamento distribuito per la comprensione delle operazioni eseguite all’interno di un sistema a microservizi. Un trace rappresenta la sequenza di operazioni in un sistema distribuito, mentre uno span rappresenta una singola operazione all’interno di un trace. I trace forniscono una panoramica delle attività, mentre gli span offrono dettagli sulle operazioni. Questi concetti sono essenziali per comprendere le prestazioni e l’esecuzione delle operazioni in un sistema a microservizi.

esempio tracing end-to-end

Che cosa è OpenTelemetry

OpenTelemetry è un progetto open-source nato con l’obiettivo di fornire strumenti e standard per il tracciamento, il monitoraggio e la gestione delle prestazioni delle applicazioni distribuite.

È stato avviato dalla fusione dei progetti OpenTracing e OpenCensus, unificando le loro funzionalità e comunità.

È progettato per supportare diversi linguaggi di programmazione e framework, nonché una varietà di sistemi distribuiti, tra cui architetture a microservizi e servizi cloud.

Le principali funzionalità di OpenTelemetry includono:

  1. Tracciamento distribuito: OpenTelemetry consente di generare e propagare un contesto di tracciamento attraverso le richieste in una distribuzione di servizi. Ciò permette di correlare e tracciare le richieste lungo l’intera catena di servizi, fornendo una visione completa delle prestazioni dell’applicazione.
  2. Monitoraggio delle metriche: OpenTelemetry raccoglie e registra una vasta gamma di metriche sulle prestazioni dell’applicazione, come tempi di risposta, conteggio delle richieste, utilizzo delle risorse e altro ancora. Queste metriche possono essere utilizzate per monitorare lo stato dell’applicazione e identificare eventuali problemi o anomalie.
  3. Log: OpenTelemetry può essere utilizzato per la raccolta e la gestione dei log di applicazione. È in grado di catturare i log generati dai vari componenti di un’applicazione distribuita e aggregarli in un unico sistema di log centralizzato per una facile ricerca e analisi.
  4. Strumentazione automatica: OpenTelemetry fornisce strumenti per l’instrumentazione automatica delle applicazioni, riducendo al minimo l’efforto richiesto per l’aggiunta del codice di telemetria all’interno dell’applicazione. Supporta numerosi linguaggi di programmazione e framework, semplificando l’integrazione con applicazioni esistenti.

OpenTelemetry supporta gli standard di tracciamento distribuito come OpenTracing, W3C Trace Context, Jaeger e Zipkin. In questo modo, sa come recuperare le informazioni relative al tracing nei “messaggi” scambiati all’interno del sistema a microservizi.

Ad esempio, di seguito, c’è una GET HTTP con il formato di tracciamento W3C Trace Context:

GET /api/resource HTTP/1.1
Host: example.com
Traceparent: 00-0123456789abcdef0123456789abcdef-0123456789abcdef-01
Tracestate: vendor=example, version=1.0

In questa chiamata, stiamo richiedendo la risorsa “/api/resource” all’host “example.com”. Gli header Traceparent e Tracestate sono inclusi per gestire il tracing distribuito.

L’header Traceparent indica l’ID della traccia principale, l’ID del padre e il flag di campionamento. Nel nostro esempio, l’ID della traccia principale è “0123456789abcdef0123456789abcdef”, l’ID del padre è “0123456789abcdef” e il flag di campionamento è impostato su “01”.

L’header Tracestate specifica le informazioni aggiuntive sullo stato della traccia. Nel nostro esempio, viene comunicato che il vendor è “example” e la versione è “1.0”.

Questi valori permettono di collegare la richiesta al contesto di tracing, consentendo di tracciare la catena di chiamate e di includere informazioni aggiuntive sullo stato della traccia durante la comunicazione tra i servizi.

Soluzione per OPS: abilitare l’agente OpenTelemetry

Per gli operatori di sistema (OPS), OpenTelemetry offre una soluzione semplice ed efficace per abilitare il tracing nei sistemi a microservizi. Ad esempio, se si dispone di un microservizio Java senza alcun sistema di tracing integrato, è sufficiente aggiungere l’agente OpenTelemetry per ottenere “magicamente” e a costo quasi zero il tracing.

Senza la necessità di alcuna customizzazione, OpenTelemetry abilita automaticamente il tracing per tutti i flussi di richieste nel sistema a microservizi, indipendentemente dai protocolli utilizzati per lo scambio di messaggi. Questo significa che tutte le chiamate tra i microservizi verranno tracciate e registrate.

Per abilitare l’agente OpenTelemetry su un microservizio Java, è possibile utilizzare il seguente comando dalla riga di comando:

java -javaagent:path/to/opentelemetry-agent.jar -jar your-application.jar

L’agente OpenTelemetry si occuperà automaticamente di rilevare le librerie OpenTelemetry presenti nell’applicazione e di iniettare il codice necessario per il tracing.

Inoltre, OpenTelemetry consente di configurare facilmente i componenti desiderati tramite un file di configurazione. Ad esempio, è possibile abilitare o disabilitare specifici receivers, processors o exporters per adattarsi alle esigenze del sistema. Ecco un esempio di configurazione yaml:

receivers:
jaeger:
endpoint: http://jaeger-collector:14268/api/traces
processors:
batch:
timeout: 1s
exporters:
jaeger:
endpoint: http://jaeger-collector:14268/api/traces

Soluzione per i DEV: l’instrumentation e i linguaggi supportati

Per i team di sviluppo (DEV), OpenTelemetry offre un’ampia gamma di librerie e strumenti per l’instrumentation delle applicazioni e la generazione dei dati di tracing.

L’instrumentation consiste nell’inserire codice specifico all’interno dell’applicazione per raccogliere e inviare i dati di tracing. OpenTelemetry supporta numerosi linguaggi di programmazione, tra cui Java, Python, Go e molti altri.

Ad esempio, per strumentare un’applicazione Java con OpenTelemetry, è possibile utilizzare la libreria OpenTelemetry Java e seguire le istruzioni di installazione e configurazione fornite nella documentazione ufficiale.

import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.context.Scope;

public class Microservizio {
private static final Tracer tracer = OpenTelemetry.getGlobalTracerProvider().get("microservizio");

public void eseguiOperazione() {
Span span = tracer.spanBuilder("operazione").startSpan();
try (Scope ignored = span.makeCurrent()) {
span.setAttribute("tipo", "operazione");
// Esegui l'operazione del microservizio
logicaDiBusinessDelMicroservizio();
} finally {
span.end();
}
}
}

Una volta che l’applicazione è stata strumentata correttamente, OpenTelemetry raccoglierà automaticamente i dati di tracing e li invierà ai receivers e agli exporters configurati.

Strumenti di visualizzazione del tracing

OpenTelemetry offre integrazioni con diversi strumenti di visualizzazione del tracing, tra cui Zipkin, Jaeger e Prometheus. Questi strumenti forniscono un’interfaccia intuitiva per visualizzare i dati di tracing raccolti dai sistemi a microservizi.

L’integrazione di OpenTelemetry con questi strumenti consente di trasferire i dati di tracing raccolti verso le rispettive piattaforme, rendendoli facilmente accessibili per l’analisi e la diagnostica. Ciò permette agli sviluppatori e agli operatori di sistema di visualizzare e comprendere meglio il flusso delle operazioni all’interno dei microservizi, facilitando la risoluzione dei problemi di prestazioni e l’ottimizzazione del sistema.

Conclusioni

L’adozione di OpenTelemetry come standard de facto per il tracing nei sistemi a microservizi offre numerosi vantaggi, inclusa l’interoperabilità tra diverse tecnologie e l’accesso a un ecosistema di strumenti di monitoraggio compatibili. Inoltre, la comunità di sviluppatori attiva e impegnata che circonda OpenTelemetry garantisce il continuo sviluppo e miglioramento del framework.

In definitiva, OpenTelemetry è una soluzione chiave per affrontare il problema del tracing nei sistemi a microservizi, offrendo una piattaforma affidabile e standardizzata per il monitoraggio e l’analisi delle operazioni distribuite. Con la sua adozione, le organizzazioni possono beneficiare di una maggiore osservabilità, una risoluzione più rapida dei problemi e un miglioramento generale delle prestazioni del sistema.


Se anche tu vuoi occuparti di importanti progetti di sviluppo software
dai un’occhiata alle nostre opportunità di lavoro e conosciamoci subito!

Questo sito utilizza cookies propri e si riserva di utilizzare anche cookie di terze parti per garantire la funzionalità del sito e per tenere conto delle scelte di navigazione.
Per maggiori dettagli e sapere come negare il consenso a tutti o ad alcuni cookie è possibile consultare la Cookie Policy.

USO DEI COOKIE

Se abiliti i cookie nella tabella sottostante, ci autorizzi a memorizzare i tuoi comportamenti di utilizzo sul nostro sito web. Questo ci consente di migliorare il nostro sito web e di personalizzare le pubblicità. Se non abiliti i cookie, noi utilizzeremo solo cookies di sessione per migliorare la facilità di utilizzo.

Cookie tecnicinon richiedono il consenso, perciò vengono installati automaticamente a seguito dell’accesso al Sito.

Cookie di statisticaVengono utilizzati da terze parti, anche in forma disaggregata, per la gestione di statistiche

Cookie di social networkVengono utilizzati per la condivisione di contenuti sui social network.

Cookie di profilazione pubblicitariaVengono utilizzati per erogare pubblicità basata sugli interessi manifestati attraverso la navigazione in internet.

AltriCookie di terze parti da altri servizi di terze parti che non sono cookie di statistica, social media o pubblicitari.