
(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.

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:
- 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.
- 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.
- 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.
- 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:
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:
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:
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.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!