gobee — инструмент, который позволяет писать BPF-программы на Go, а не на C. Он транспилирует строгое подмножество Go в BPF C, генерирует типизированные Go-привязки для userspace и проверяет совместимость с работающим ядром при загрузке.
Экосистема Go давно имеет хороший инструментарий для userspace-части BPF, но код для ядра всё равно приходилось писать на C. Aya решила эту проблему для Rust, написав новый BPF-бэкенд в rustc. gobee идёт другим путём — транслирует Go в C и использует зрелый бэкенд clang.
Процесс выглядит так: вы пишете файл на Go, gobee превращает его в .bpf.c, генерирует sourcemap (чтобы ошибки верификатора указывали на строки Go-исходника) и файл типизированных привязок. В userspace работаете с objs.Events, objs.AttachOnExec() и декодируете данные из ringbuf напрямую в Go-структуру, без строковых поисков по coll.Programs["..."]. Сгенерированный C читаем — если gobee выдал что-то странное, это можно увидеть.
gobee не пытается заменить clang или cilium/ebpf. Он использует clang для CO-RE, BTF и оптимизаций бесплатно, а сгенерированные привязки работают поверх cilium/ebpf. Сборка, встраивание и загрузка остаются за пользователем — та же модель, что у bpf2go.
Прямая генерация BPF из Go невозможна, потому что компилятор gc не имеет LLVM-бэкенда. rustc стоит на LLVM, поэтому Aya работает. gobee же просто отдаёт clang C-код.
Проект поддерживает 8 типов программ (XDP, tracepoint, kprobe, uprobe, sock_ops, TC, cgroup_skb, LSM), 19 типов карт (включая ringbuf, bloom_filter, lpm_trie), около 200 типизированных Go-обёрток для helpers из libbpf v1.5.0, CO-RE (авто-детект с BPF_CORE_READ), BTF-ready вывод, пользовательские helper-функции (как static __always_inline), typed Go-биндинги, проверку версии ядра (bpfvet), привязку ошибок верификатора к строкам Go (авто-аннотация в Load<Stem>), sourcemap-файл и кроссплатформенность (Linux arm64 + amd64).
Примеры: example/helloworld/ — XDP-счётчик пакетов (~40 строк BPF, ~80 userspace), example/sysmon/ — XDP + два tracepoint + kprobe в одном бинарнике с общим ringbuf.
CI на каждый push включает go test, go vet, golden-тесты транспилятора, матрицу покрытия, clang-компиляцию примеров, bpfvet и тесты с реальным верификатором на Ubuntu 24.04 (ядро 6.x).
Бинарник gobee собирается везде (чистый Go, без CGO), но для компиляции .bpf.o нужен clang с BPF-таргетом. На Linux это пакет из дистрибутива, на macOS — brew install llvm. Запуск артефакта — только Linux.
Автор — Bora Tanrikulu (me@bora.sh), лицензия MIT. Проект вдохновлён Solod (Go-to-C транспилятор) и Aya (эргономика eBPF на Rust).