Operations | Monitoring | ITSM | DevOps | Cloud

Profiling Java apps: breaking things to prove it works

Coroot already does eBPF-based CPU profiling for Java. It catches CPU hotspots well, but that's all it can do. Every time we looked at a GC pressure issue or a latency spike caused by lock contention, we could see something was wrong but not what. We wanted memory allocation and lock contention profiling. So we decided to add async-profiler support to coroot-node-agent. The goal: memory allocation and lock contention profiles for any HotSpot JVM, with zero code changes. Here's how we got there.

Making encrypted Java traffic observable with eBPF

Coroot's node agent uses eBPF to capture network traffic at the kernel level. It hooks into syscalls like read and write, reads the first bytes of each payload, and detects the protocol: HTTP, MySQL, PostgreSQL, Redis, Kafka, and others. This works for any language and any framework without touching application code. For encrypted traffic, we attach eBPF uprobes to TLS library functions like SSL_write and SSL_read in OpenSSL, crypto/tls in Go, and rustls in Rust.

Instrumenting Rust TLS with eBPF

Coroot is an open source observability tool that uses eBPF to collect telemetry directly from applications and infrastructure. One of the things it does is capture L7 traffic from TLS connections without any code changes, by hooking into TLS libraries and syscalls. Works great for OpenSSL. Works for Go. Then rustls enters the picture and everything stops being obvious. With OpenSSL, everything is nicely wrapped: From eBPF’s point of view this is perfect: Everything happens inside one call.

EP #3: Cloud, Kubernetes, and the Evolution of DevOps - The Open Source Observability Podcast

Kris Buytaert is the Co-founder of Inuits, O11y, and ‘DevOps Days,’ an internationally-attended series of DevOps events. He is a passionate advocate of Free and Open Source Software, and is accredited by the community as being a founding instigator of the DevOps movement. In this episode we trace the history of the DevOps movement from its intersection with open source and Agile, through the evolution of Cloud technologies and tools such Docker and Kubernetes, to present day best practices for CI/CD, monitoring, and observability.