
अपने BPF प्रोग्राम Go में लिखें, C में नहीं। gobee Go के एक उपसमुच्चय को BPF C में ट्रांसपाइल करता है और टाइप्ड cilium/ebpf बाइंडिंग उत्पन्न करता है।
अपने BPF प्रोग्राम C में नहीं, Go में लिखें। gobee Go के एक सख्त उपसमुच्चय को BPF C में ट्रांसपाइल करता है, userspace पक्ष के लिए टाइप की गई Go बाइंडिंग उत्पन्न करता है, और चल रहे कर्नेल के विरुद्ध लोड को गेट करता है।
Go इकोसिस्टम के पास BPF के लिए ठोस userspace टूलिंग है। कर्नेल पक्ष हमेशा "अब अपना प्रोग्राम C में लिखें" पर समाप्त होता है। Aya ने rustc में एक नया BPF बैकएंड लिखकर eBPF को Rust तक पहुँचाया। gobee वहाँ एक अलग रास्ते से पहुँचता है: C में ट्रांसपाइल करके और clang के परिपक्व बैकएंड का पुन: उपयोग करके।
एक ट्रेसपॉइंट जो हर execve को ringbuf के माध्यम से userspace तक स्ट्रीम करता है:
| आपका इनपुट (Go) | gobee जो उत्सर्जित करता है (BPF C) |
|---|---|
|
|
gobee translate --bindings-dir ./bpf ./bpf/src दोनों फ़ाइलें उत्पन्न करता है, साथ ही एक sourcemap (events.bpf.c.map) ताकि verifier त्रुटियाँ Go पंक्तियों में वापस मैप हों, और एक टाइप की गई bindings फ़ाइल (bpf/events_bindings.go) ताकि userspace ड्राइवर objs.Events, objs.AttachOnExec() लिखे और ringbuf पेलोड को सीधे bpf.Event में डीकोड करे (वही struct जो आप ऊपर देखते हैं, Go में पुनः प्रकाशित), बजाय स्ट्रिंग-टाइप coll.Programs["..."] लुकअप के।
C जानबूझकर पठनीय है। यदि gobee कुछ अजीब उत्सर्जित करता है, तो आप उसे देख सकते हैं। ट्रेसपॉइंट + kprobes + XDP को एक बाइनरी में संयुक्त करने के लिए, example/sysmon/ देखें।
| gobee | C + clang + bpf2go | Aya (Rust) | bpftrace | BCC | |
|---|---|---|---|---|---|
| कर्नेल-पक्ष भाषा | Go उपसमुच्चय | C | Rust | DSL | C |
| Userspace एकीकरण | टाइप की गई Go बाइंडिंग + cilium/ebpf | bpf2go | aya-runtime | कोई नहीं | python |
| CO-RE | ✅ clang के माध्यम से | ✅ | ✅ LLVM के माध्यम से | ✅ | ✅ |
| हेल्पर कवरेज | 200 टाइप की गई Go रैपर | पूर्ण (C लिखें) | पूर्ण | सीमित | पूर्ण (C लिखें) |
| Verifier त्रुटि → स्रोत | ✅ Go file:line:col | ❌ कच्चा C | ✅ Rust file:line | ❌ | आंशिक |
| लोड पर कर्नेल-संस्करण गेट | ✅ bpfvet के माध्यम से | मैन्युअल | मैन्युअल | n/a | रनटाइम |
| टूलचेन निर्भरताएँ | Go + clang | clang + bpf2go | rustc + LLVM | bpftrace | python + bcc |
| उत्पन्न आर्टिफैक्ट | .bpf.o + Go binary | .bpf.o + Go binary | .bpf.o + Rust binary | JIT | JIT |
यदि आप पहले से ही C / libbpf वर्कफ़्लो में हैं, तो gobee इसे पूरी तरह से बदलने की कोशिश नहीं कर रहा है। यह उन मामलों के लिए है जहाँ आप कर्नेल पक्ष, userspace पक्ष और बिल्ड पाइपलाइन सब कुछ एक ही Go मॉड्यूल में चाहते हैं।
पूर्ण मैट्रिक्स के लिए docs/status.md देखें (Go उपसमुच्चय, कथन, व्यंजक, हर हेल्पर, हर मैप प्रकार, हर निर्देश)। त्वरित दृश्य:
| क्षेत्र | कवरेज |
|---|---|
| प्रोग्राम प्रकार (8) | XDP, tracepoint, kprobe / kretprobe, uprobe / uretprobe, sock_ops, TC, cgroup_skb, LSM |
| मैप प्रकार (19) | array, hash, lru_hash, per-CPU वेरिएंट, bloom_filter, lpm_trie, ringbuf, perf_event_array, prog_array, queue, stack, sk/task/inode storage, devmap/cpumap/xskmap |
| BPF हेल्पर | libbpf v1.5.0 हेडर से स्वतः-उत्पन्न ~200 टाइप की गई Go स्टब्स। example/helloworld/ और example/sysmon/ द्वारा उपयोग की गई स्टब्स वास्तविक-कर्नेल CI में परीक्षित हैं; बाकी असत्यापित हैं। यदि कोई स्टब कर्नेल सिग्नेचर से मेल नहीं खाती तो issue दर्ज करें |
| CO-RE | ✅ स्वतः-पता लगाया गया। कर्नेल-आंतरिक struct फ़ील्ड के लिए BPF_CORE_READ (task_struct, sock, inode); UAPI BPF संदर्भ struct के लिए सीधा ctx->field (xdp_md, __sk_buff, bpf_sock_ops)। Linux 6.x (Ubuntu 24.04 CI) पर परीक्षित; पुराने कर्नेल अभी CI मैट्रिक्स में नहीं हैं |
| BTF-तैयार आउटपुट | ✅ उत्सर्जित C में vmlinux.h शामिल है और कर्नेल-आंतरिक फ़ील्ड रीड के लिए BPF_CORE_READ का उपयोग करता है, ताकि clang clang -g से उत्पन्न BTF सही रिलोकेशन ले जाए। clang स्वयं आपकी ज़िम्मेदारी है (उदाहरण Makefiles विहित इनवोकेशन दिखाती हैं) |
| उपयोगकर्ता-परिभाषित हेल्पर | ✅ //bpf:section के बिना टॉप-लेवल Go फ़ंक्शन static __always_inline C फ़ंक्शन के रूप में उत्सर्जित होते हैं |
| टाइप की गई Go बाइंडिंग | ✅ Load<Stem>, Close, प्रति-प्रोग्राम Attach<Name>, AttachAll, साथ ही आपके कर्नेल-पक्ष struct प्रकार और स्थिरांक Go में पुनः प्रकाशित |
| कर्नेल-संस्करण गेट | ✅ bpfvet लोड समय पर चलता है। अपारदर्शी EINVAL के बजाय bpf program needs kernel >= 5.8, host is 5.4 के साथ तेज़ी से विफल होता है |
| Verifier त्रुटि → Go स्रोत | ✅ Load<Stem> के अंदर स्वतः-एनोटेटेड। gobee diagnose के लिए कोई मैन्युअल पाइप नहीं; *ebpf.VerifierError → counter.go:18:5 मार्करों के साथ वापस आता है |
| Sourcemap साइडकार | ✅ ऑफ़लाइन gobee diagnose उपयोग के लिए भी हर .bpf.c के बगल में <stem>.bpf.c.map लिखा जाता है |
| क्रॉस-आर्क | ✅ Linux arm64 + amd64 |
go/types चलाता है, ताकि दुरुपयोग file:line:col पर उजागर हों)।.bpf.c के बगल में एक टाइप की गई <Stem>_bindings.go उत्पन्न करता है: bpf.LoadCounter(spec), objs.PerIface.Lookup(...), objs.AttachAll(ifindex), साथ ही आपके कर्नेल-पक्ष struct प्रकार और स्थिरांक Go में पुनः प्रकाशित।LoadAndAssign से *ebpf.VerifierError को Go स्रोत स्थितियों के साथ स्वतः एनोटेट करता है, किसी मैन्युअल gobee diagnose पाइप की आवश्यकता नहीं।Load<Stem> के अंदर bpfvet चलाता है ताकि पुराने कर्नेल bpf program needs kernel >= 5.8, host is 5.4 के साथ तेज़ी से विफल हों।static __always_inline के रूप में उत्सर्जित होते हैं।cilium/ebpf को प्रतिस्थापित करना। उत्पन्न बाइंडिंग इसके ऊपर बैठती हैं।gc, Go कंपाइलर, के पास कोई LLVM-आधारित BPF बैकएंड नहीं है। एक जोड़ना एक बहु-वर्षीय कंपाइलर परियोजना है। rustc LLVM पर बना है और इसीलिए Aya काम करता है। इसलिए gobee C उत्सर्जित करता है और clang के BPF बैकएंड का पुन: उपयोग करता है, जो हमें मुफ्त में परिपक्व कोडजन, BTF और CO-RE रिलोकेशन देता है।
go install github.com/boratanrikulu/gobee/cmd/gobee@latest