Într-o arhitectură distribuită de microservicii, identificarea cauzei pentru care o cerere a durat 1.2 secunde în loc de 50 de milisecunde necesită corelarea automată a celor trei piloni ai observabilității: Metrici (Metrics), Urme Distribuite (Distributed Traces) și Jurnale (Logs).
În ecosistemul modern Java, Micrometer Observation API a unificat această instrumentare: o singură bucată de cod declarativ generează concomitent metrici pentru Prometheus și span-uri de tracing pentru standardul OpenTelemetry / Jaeger / Grafana Tempo.
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationRegistry;
import org.springframework.stereotype.Service;
@Service
public class ProcesatorPlatiService {
private final ObservationRegistry registry;
public ProcesatorPlatiService(ObservationRegistry registry) {
this.registry = registry;
}
public void executaTranzactie(String tranzactieId, double suma) {
// Observation.createNotStarted definește o operațiune monitorizată:
Observation.createNotStarted("procesare.plata", registry)
.lowCardinalityKeyValue("moneda", "RON") // Etichetă pentru metrici Prometheus
.highCardinalityKeyValue("tranzactie.id", tranzactieId) // Atribut pentru OpenTelemetry Tracing
.observe(() -> {
// Orice log scris aici include automat traceId-ul și spanId-ul curent!
System.out.println("Procesare plată pentru suma de: " + suma);
apeleazaGatewayBancar(tranzactieId, suma);
});
}
private void apeleazaGatewayBancar(String id, double suma) {
// Logica de procesare
}
}
Propagarea Contextului Distribuit prin W3C TraceContext
Când serviciul A apelează serviciul B prin HTTP, clientul injectează automat antetele standard traceparent în cerere:
traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
# 00: versiunea specificației W3C
# 4bf92f35...: Trace ID-ul unic comun pentru întregul flux de microservicii
# 00f067aa...: Parent Span ID-ul operațiunii curente
# 01: flag de eșantionare (sampled)
Profilare de Performanță Continuă la Cost Zero: JDK Flight Recorder (JFR)
În producție, rularea profiler-elor tradiționale introduce penalizări mari de performanță. Mașina virtuală HotSpot include instrumentul nativ JDK Flight Recorder (JFR), direct în nucleul C++ al JVM, cu un impact de CPU sub 1%:
# Pornirea înregistrării de profiling continuu direct la lansarea aplicației:
java -XX:StartFlightRecording=disk=true,dumponexit=true,filename=profil_productie.jfr,settings=profile \
-jar app.jar
# Fisierele .jfr conțin istoricul complet al alocărilor pe memorie, blocajele de lacăte (lock contention)
# și activitatea firelor, putând fi analizate vizual în JDK Mission Control (JMC).