A kubectl plugin that allows you to profile production applications with low-overhead by generating FlameGraphs
Running kubectlf-flame
does not require any modification to existing pods.
- Supported languages: Go, Java (any JVM based language)
- Kubernetes cluster that use Docker as the container runtime (tested on GKE, EKS and AKS)
In order to profile a Java application in pod mypod
for 1 minute and save the flamegraph as /tmp/flamegraph.svg
run:
kubectl flame mypod -t 1m --lang java -f /tmp/flamegraph.svg
Profiling Java application in alpine based containers require using --alpine
flag:
kubectl flame mypod -t 1m -f /tmp/flamegraph.svg --lang java --alpine
NOTICE: this is only required for Java apps, the --alpine
flag is unnecessary for Go profiling.
Pods that contains more than one container require specifying the target container as an argument:
kubectl flame mypod -t 1m --lang go -f /tmp/flamegraph.svg mycontainer
Profiling Go application in pods that contains more than one process require specifying the target process name via --pgrep
flag:
kubectl flame mypod -t 1m --lang go -f /tmp/flamegraph.svg --pgrep go-app
Java profiling assumes that the process name is java
. Use --pgrep
flag if your process name is different.
You can install kubectl flame
using the Krew, the package manager for kubectl plugins.
Once you have Krew installed just run:
kubectl krew install flame
See the release page for the full list of pre-built assets.
kubectl-flame
launch a Kubernetes Job on the same node as the target pod.
Under the hood kubectl-flame
use async-profiler in order to generate flame graphs for Java applications.
Interaction with the target JVM is done via a shared /tmp
folder.
Golang support is based on ebpf profiling.
Please refer to the contributing.md file for information about how to get involved. We welcome issues, questions, and pull requests.
- Eden Federman: efederman@verizonmedia.com
This project is licensed under the terms of the Apache 2.0 open source license. Please refer to LICENSE for the full terms.