랭킹으로 돌아가기

dropbox/goebpf

Go

Library to work with eBPF programs from Go

ebpfgolangxdpbpfperfeventsgogolang-libraryxdpdumpcatscats-effect
스타 성장
스타
1.2k
포크
82
주간 성장
이슈
13
5001k
2019년 4월2021년 9월2024년 2월2026년 7월
아티팩트Go Modulesgo get github.com/dropbox/goebpf
README

Go eBPF

Build Status Go Report Card Documentation

A nice and convenient way to work with eBPF programs / perf events from Go.

Requirements

  • Go 1.11+
  • Linux Kernel 4.15+

Supported eBPF features

  • eBPF programs
    • SocketFilter
    • XDP
    • Kprobe / Kretprobe
    • tc-cls (tc-act is partially implemented, currently)
  • Perf Events

Support for other program types / features can be added in future. Meanwhile your contributions are warmly welcomed.. :)

Installation

# Main library
go get github.com/dropbox/goebpf

# Mock version (if needed)
go get github.com/dropbox/goebpf/goebpf_mock

Quick start

Consider very simple example of Read / Load / Attach

    // In order to be simple this examples does not handle errors
    bpf := goebpf.NewDefaultEbpfSystem()
    // Read clang compiled binary
    bpf.LoadElf("test.elf")
    // Load XDP program into kernel (name matches function name in C)
    xdp := bpf.GetProgramByName("xdp_test")
    xdp.Load()
    // Attach to interface
    xdp.Attach("eth0")
    defer xdp.Detach()
    // Work with maps
    test := bpf.GetMapByName("test")
    value, _ := test.LookupInt(0)
    fmt.Printf("Value at index 0 of map 'test': %d\n", value)

Like it? Check our examples

Perf Events

Currently library has support for one, most popular use case of perf_events: where eBPF map key maps to cpu_id. So eBPF and go parts actually bind cpu_id to map index. It maybe as simple as:

    // Define special, perf_events map where key maps to CPU_ID
    BPF_MAP_DEF(perfmap) = {
        .map_type = BPF_MAP_TYPE_PERF_EVENT_ARRAY,
        .max_entries = 128,     // Max supported CPUs
    };
    BPF_MAP_ADD(perfmap);

    // ...

    // Emit perf event with "data" to map "perfmap" where index is current CPU_ID
    bpf_perf_event_output(ctx, &perfmap, BPF_F_CURRENT_CPU, &data, sizeof(data));

And the go part:

    perf, err := goebpf.NewPerfEvents("perfmap")
    // 4096 is ring buffer size
    perfEvents, err := perf.StartForAllProcessesAndCPUs(4096)
    defer perf.Stop()

    for {
        select {
            case data := <-perfEvents:
                fmt.Println(data)
        }
    }

Looks simple? Check our full XDP dump example

Kprobes

Library currently has support for kprobes and kretprobes. It can be as simple as:

    // kprobe handler function
    SEC("kprobe/guess_execve")
    int execve_entry(struct pt_regs *ctx) {
      // ...
      buf_perf_output(ctx);
      return 0;
    }

And the go part:

	// Cleanup old probes
	err := goebpf.CleanupProbes()

	// Attach all probe programs
	for _, prog := range bpf.GetPrograms() {
		err := prog.Attach(nil)
	}

	// Create perf events
	eventsMap := p.bpf.GetMapByName("events")
	p.pe, err = goebpf.NewPerfEvents(eventsMap)
	events, err := p.pe.StartForAllProcessesAndCPUs(4096)
	defer events.Stop()

	for {
		select {
		case data := <-events:
			fmt.Println(data) // kProbe event
		}
	}

Simple? Check exec dump example

Good readings

관련 저장소
apache/skywalking

APM, Application Performance Monitoring System

JavaMavenApache License 2.0skywalkingobservability
skywalking.apache.org
24.9k6.6k
cilium/cilium

eBPF-based Networking, Security, and Observability

GoGo ModulesApache License 2.0containersbpf
cilium.io
24.8k3.9k
kubesphere/kubesphere

The container platform tailored for Kubernetes multi-cloud, datacenter, and edge management ⎈ 🖥 ☁️

GoGo ModulesOtherdevopscncf
kubesphere.io
17k2.7k
gojue/ecapture

Capturing SSL/TLS plaintext without a CA certificate using eBPF. Supported on Linux/Android kernels for amd64/arm64.

CApache License 2.0golangebpf
ecapture.cc
15.4k1.6k
kubeshark/kubeshark

eBPF-powered network observability for Kubernetes. Indexes L4/L7 traffic with full K8s context, decrypts TLS without keys. Queryable by AI agents via MCP and humans via dashboard.

GoGo ModulesApache License 2.0kubernetesgolang
kubeshark.com
12k542
bpftrace/bpftrace

High-level tracing language for Linux

C++Apache License 2.0bpfebpf
bpftrace.org
10.2k1.5k
falcosecurity/falco

Cloud Native Runtime Security

C++Apache License 2.0cncfcontainers
falco.org
9.2k1.1k
ntop/ntopng

Web-based Traffic and Cybersecurity Network Traffic Monitoring

LuaGNU General Public License v3.0ntopngrealtime
ntop.org
8k751
cilium/ebpf

ebpf-go is a pure-Go library to read, modify and load eBPF programs and attach them to various hooks in the Linux kernel.

GoGo ModulesMIT Licenseebpflinux
ebpf-go.dev
7.9k879
coroot/coroot

Coroot is an open-source observability and APM tool with AI-powered Root Cause Analysis. It combines metrics, logs, traces, continuous profiling, and SLO-based alerting with predefined dashboards and inspections.

GoGo ModulesApache License 2.0dashboarddatabase-monitoring
coroot.com
7.8k385
projectcalico/calico

Cloud native networking and network security

GoGo ModulesApache License 2.0cnicni-plugin
docs.tigera.io/calico/latest/about/
7.3k1.6k
pixie-io/pixie

Instant Kubernetes-Native Application Observability

C++Apache License 2.0golangkubernetes
px.dev
6.5k499