[ kalizi.dev ]

Combinare debugging in produzione e remoto nelle applicazioni Java

Al giorno d'oggi i sistemi diventano sempre più complessi. Una grande applicazione può essere composta da microservizi, dipendere da diverse API, essere un monolite difficile da controllare perché contiene vecchio codice legacy, oppure avere tanti sviluppatori che lavorano insieme.

Mentre le applicazioni web crescono, il tuo software architect (se ne hai uno) può introdurre pratiche standard come l'IOC (inversion of control) e il TDD (test-driven development) per ridurre al minimo i bug o i crash in produzione. In alternativa, potresti usare un framework che implementa già queste tecniche, come Spring. Tuttavia, anche con questi strumenti, i bug e i crash continuano a verificarsi e devi affrontarli!

Quindi cosa puoi fare? Devi essere in grado di vedere e gestire i bug man mano che si presentano e, per questo, ho trovato Lightrun Cloud la soluzione più efficace.

Homepage di Lightrun

Lightrun Cloud: cos'è e perché

Lightrun Cloud è una piattaforma di observability gratuita che ti offre gli strumenti necessari per eseguire debugging e logging in tempo reale su un ambiente di staging o di produzione, usando la CLI o il tuo IDE preferito (nel mio caso, IntelliJ IDEA).

L'installazione è rapida con IntelliJ IDEA: lo apri, vai nella pagina delle impostazioni, cerchi il plugin "Lightrun" e premi "Install".

Processo di setup

Una volta installato, riavvia IntelliJ IDEA, clicca su "Login" e si aprirà il browser sincronizzando il tuo IDE con il tuo account.

Intellij IDEA dopo l'installazione di Lightrun

Una volta che il tuo IDE è pronto, la piattaforma lo saprà automaticamente. Ciò che manca è l'ambiente che vuoi debuggare. È il secondo passo della procedura guidata di installazione.

Istruzioni per l'installazione dell'agent

L'agent va installato sull'ambiente che vuoi debuggare o testare. Consiste in una libreria che verrà installata sul tuo sistema e caricata insieme al java runtime environment, agendo da middleware tra Java e la tua applicazione. In questo modo puoi, di fatto, farne il debug.

Nota che l'installazione fa riferimento all'uso dell'agent con Java e un file JAR. Ma se leggi la documentazione con attenzione, noterai che Lightrun Cloud offre supporto per la maggior parte dei principali framework e server come Tomcat, Glassfish, Wildfly, Jetty e Weblogic. Questo significa che se la tua applicazione non è un file JAR e non stai testando il servizio ma vuoi passare direttamente all'uso del servizio, puoi semplicemente usare un'applicazione "Hello World" per saltare questo passaggio e configurare correttamente l'agent con il tuo ambiente.

Command to start an application using Lighrun Agent as Middleware

Windows e WSL sono un ottimo modo per emulare un ambiente di sviluppo e di staging, perché molti sviluppatori di solito eseguono i loro IDE su Windows e fanno il deploy su una macchina Linux che può essere rappresentata da WSL.

Costruire una web app di test

Ora che abbiamo configurato Lightrun, è il momento di sporcarci le mani con una finta web application difettosa. Per questo tutorial ho scelto una finta Spring Boot Application impacchettata in un file JAR da testare su Lightrun. L'ho scelta per dimostrare l'uso di Lightrun Cloud con una web app che dipende da qualche API difettosa che consideriamo incredibilmente stabile, così stabile che non abbiamo una strategia di error handling di fallback.

Prepariamo lo scenario. Abbiamo una buona web application con feature e unit test che fanno il mock dell'API a cui ci stiamo connettendo e un sistema di continuous delivery che avvierà una build e ne farà il deploy direttamente sul nostro ambiente.

Per generare dati casuali che faranno da mock alla nostra finta API, possiamo usare Java Faker, una semplice libreria per generare dati finti. Puoi aggiungerla alla tua applicazione tramite Maven o Gradle.

Fake TestUser model code

Il TestUser sarà ciò che restituirà la nostra finta API. Supponiamo che la finta API abbia un tasso di fallimento del 30%. Questo significa che possiamo estrarre un numero tra 0 e 100 e, se questo numero è maggiore di 70, possiamo considerare fallita la chiamata all'API. Se succede, useremo una RuntimeException quando il nostro sistema solleva un'eccezione non gestita.

Fake controller that will throw Exception randomly

Per fare la build della nostra API come JAR, possiamo facilmente modificare il nostro pom.xml per usare lo spring-boot-maven-plugin.

Lightrun Cloud in azione

Dopo aver avviato la tua applicazione con Lightrun Cloud connesso, comparirà nel tuo IDE, facendo apparire l'ambiente connesso.

Pannello su IntelliJ IDEA

Questo significa che è attualmente connesso ai tuoi processi e in attesa che tu imposti il logging o il remote debugging. Tutto ciò che devi fare è cliccare col tasto destro sulla riga che vuoi loggare, aprire il sottomenu "Lightrun" e cliccare su "Log".

Abilitazione del log

Questo farà comparire un popup dove puoi impostare cosa vuoi vedere nei tuoi log:

Condizioni e formato del logging

A scopo di test non imposterò alcuna condizione particolare, mi limiterò a loggare il messaggio. Dopo aver aggiunto queste condizioni di logging, comparirà la console e il log si popolerà velocemente.

Log

Questa è solo la punta dell'iceberg. Immagina di usare Lightrun Cloud in un vero ambiente di produzione dove puoi loggare tutto ciò che proviene da API, DB, condizioni if o chiamate AJAX per ogni utente e per ogni istanza della tua applicazione. Avere più server o istanze di un'applicazione o più microservizi non sarà mai un problema con un logger come questo. Puoi usare Virtual Snapshot per loggare tutte le variabili e le espressioni locali, come impostare un breakpoint sul tuo ambiente locale. E puoi fare ancora di più misurando metriche sull'esecuzione della tua applicazione.

Basta condizioni limite

Lightrun Cloud è un sistema potente che può migliorare le tue web application e tutte le tue applicazioni Java in generale. Potresti chiederti: se sto sviluppando una web app da zero, rispettando tutti i pattern ben noti e le comuni tecniche di auditing per arginare tutti i bug, avrò comunque bisogno di Lightrun Cloud?

Non c'è una risposta giusta a questa domanda, ma avere uno strumento potente come questo migliorerà notevolmente la tua esperienza di testing, soprattutto per casi speciali come le condizioni limite o gli stati sconosciuti, catturando e correggendo tutti i possibili bug in produzione!