{"id":51975731,"url":"https://github.com/nudgebee/application-profiler","last_synced_at":"2026-07-30T05:01:11.167Z","repository":{"id":370541545,"uuid":"775451208","full_name":"nudgebee/application-profiler","owner":"nudgebee","description":"Low-overhead Kubernetes profiling agent — generates flamegraphs, JFR, heap/thread dumps, and pprof for Java, Python, Go, Node.js, Ruby, Rust, and C/C++ workloads without restarting pods.","archived":false,"fork":false,"pushed_at":"2026-07-17T04:41:53.000Z","size":739,"stargazers_count":0,"open_issues_count":9,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-07-17T05:25:16.227Z","etag":null,"topics":["async-profiler","bpf","flamegraph","jfr","kubernetes","observability","performance","pprof","profiling","py-spy"],"latest_commit_sha":null,"homepage":"https://nudgebee.com","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nudgebee.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-03-21T12:17:02.000Z","updated_at":"2026-07-17T04:39:46.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/nudgebee/application-profiler","commit_stats":null,"previous_names":["nudgebee/application-profiler"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/nudgebee/application-profiler","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nudgebee%2Fapplication-profiler","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nudgebee%2Fapplication-profiler/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nudgebee%2Fapplication-profiler/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nudgebee%2Fapplication-profiler/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nudgebee","download_url":"https://codeload.github.com/nudgebee/application-profiler/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nudgebee%2Fapplication-profiler/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36060987,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-30T02:00:05.956Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["async-profiler","bpf","flamegraph","jfr","kubernetes","observability","performance","pprof","profiling","py-spy"],"created_at":"2026-07-30T05:01:10.035Z","updated_at":"2026-07-30T05:01:11.135Z","avatar_url":"https://github.com/nudgebee.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# application-profiler\n\n[![Build](https://github.com/nudgebee/application-profiler/actions/workflows/code-verify.yml/badge.svg?branch=main)](https://github.com/nudgebee/application-profiler/actions/workflows/code-verify.yml)\n[![License](https://img.shields.io/github/license/nudgebee/application-profiler)](LICENSE)\n[![Release](https://img.shields.io/github/v/release/nudgebee/application-profiler)](https://github.com/nudgebee/application-profiler/releases)\n\nLow-overhead, on-demand profiling agent for Kubernetes workloads. Generates\nflamegraphs, JFR recordings, heap dumps, thread dumps, and other profiling\noutput for Java, Python, Go, Node.js, Ruby, Rust, C/C++ applications — without\nrequiring restarts or modifications to the target pods.\n\nThis repository ships the **agent** binary and the per-language container\nimages that run alongside a workload to collect profiling data. The agent is\ninvoked by an orchestrator (e.g. [Nudgebee](https://github.com/nudgebee/nudgebee))\nthat handles pod placement, log streaming, and result delivery.\n\nThis project is an open-source fork of\n[josepdcs/kubectl-prof](https://github.com/josepdcs/kubectl-prof), which itself\nis a fork of [yahoo/kubectl-flame](https://github.com/yahoo/kubectl-flame). The\nkubectl CLI plugin has been removed from this fork — only the agent and images\nare maintained here.\n\n## Table of Contents\n\n- [Architecture](#architecture)\n- [Supported languages and tools](#supported-languages-and-tools)\n- [Container images](#container-images)\n- [Agent usage](#agent-usage)\n- [Building from source](#building-from-source)\n- [Contributing](#contributing)\n- [License](#license)\n\n## Architecture\n\nThe agent runs as a privileged pod scheduled on the same node as the target\nworkload. It enters the target container's namespaces, runs the configured\nprofiling tool (`async-profiler`, `jcmd`, `py-spy`, `bpf`, `perf`, `rbspy`,\n`pprof`, or `austin`), and emits structured JSON log lines that the\norchestrator consumes:\n\n```\n{\"type\": \"progress\", \"data\": {\"stage\": \"started\"}}\n{\"type\": \"result\",   \"data\": {\"result-type\": \"flamegraph\", \"file\": \"...\", ...}}\n{\"type\": \"progress\", \"data\": {\"stage\": \"ended\"}}\n```\n\nThe orchestrator (Nudgebee, or your own controller) is responsible for:\n\n- Discovering the target pod's container runtime and ID\n- Creating the agent pod with the right image, volumes, and `SYS_ADMIN`\n  capability\n- Streaming agent logs and parsing the result envelope\n- Copying the result file out of the agent pod\n\n## Supported languages and tools\n\n| Language          | Default tool   | Outputs                                                |\n| ----------------- | -------------- | ------------------------------------------------------ |\n| Java / JVM        | async-profiler | flamegraph, jfr, threaddump, heapdump, heaphistogram   |\n| Python            | py-spy         | flamegraph, raw, threaddump, speedscope                |\n| Go                | pprof          | pprof, heapdump, raw                                   |\n| Ruby              | rbspy          | flamegraph                                             |\n| Node.js           | perf           | flamegraph, heapdump                                   |\n| Rust / C / C++    | bpf, perf      | flamegraph                                             |\n\nSupported container runtimes: containerd, CRI-O.\n\n## Container images\n\nFive production images are published to GitHub Container Registry on every\npush to `main` and on every `v*` tag:\n\n| Image                                                      | Used for                |\n| ---------------------------------------------------------- | ----------------------- |\n| `ghcr.io/nudgebee/application-profiler-jvm:\u003ctag\u003e`          | Java workloads          |\n| `ghcr.io/nudgebee/application-profiler-bpf:\u003ctag\u003e`          | BPF-based profiling     |\n| `ghcr.io/nudgebee/application-profiler-perf:\u003ctag\u003e`         | Node.js, Rust, C/C++    |\n| `ghcr.io/nudgebee/application-profiler-python:\u003ctag\u003e`       | Python workloads        |\n| `ghcr.io/nudgebee/application-profiler-ruby:\u003ctag\u003e`         | Ruby workloads          |\n\nAvailable tags:\n\n- `latest` — most recent `main` build\n- `vX.Y.Z`, `vX.Y` — release tags\n- `\u003cshort-sha\u003e` — every commit on `main`\n\n## Agent usage\n\nThe agent is intended to be invoked by an orchestrator, but its CLI flags are\nstable and can be used directly for testing. The container's entrypoint is\n`/app/agent`:\n\n```\n/app/agent \\\n  --target-container-runtime containerd \\\n  --target-container-runtime-path /run/containerd \\\n  --target-pod-uid \u003cpod-uid\u003e \\\n  --target-container-id \u003ccontainer-id\u003e \\\n  --lang java \\\n  --profiling-tool async-profiler \\\n  --output-type flamegraph \\\n  --duration 30s \\\n  --grace-period-ending 600s \\\n  --compressor-type gzip\n```\n\nRun `/app/agent --help` for the full flag list.\n\n## Building from source\n\nRequires Go 1.26+, Docker with Buildx.\n\n```bash\nmake build-agent           # builds bin/agent for the host platform\nmake test                  # runs unit tests (GOARCH=amd64 GOOS=linux)\nmake build-docker-agents   # builds all language images locally\n```\n\nImage registry and tag can be overridden:\n\n```bash\nREGISTRY=ghcr.io VERSION=v0.1.0 make push-docker-all\n```\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md). Bug reports, feature requests, and PRs\nare welcome. For security issues, please use\n[GitHub Security Advisories](../../security/advisories/new).\n\n## License\n\nApache License 2.0 — see [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnudgebee%2Fapplication-profiler","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnudgebee%2Fapplication-profiler","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnudgebee%2Fapplication-profiler/lists"}