Posted in

Go + eBPF + Rust协同时代来临:下一代可观测性基础设施的3大底层变革

第一章:Go + eBPF + Rust协同时代来临:下一代可观测性基础设施的3大底层变革

可观测性正从“采样+埋点”的被动模式,跃迁至“零侵入、全路径、实时语义”的主动感知范式。这一跃迁并非由单一技术驱动,而是 Go、eBPF 与 Rust 在各自优势域深度协同的结果:Go 提供高生产力的控制平面与生态粘合能力;eBPF 实现内核态安全、高效、可编程的数据采集;Rust 则承担高性能数据处理管道与可信扩展模块的构建重任。

运行时语义捕获能力质变

传统探针依赖函数符号或日志注入,而 eBPF + Rust 可联合提取高级语言运行时上下文。例如,使用 libbpf-rs 编写 Rust eBPF 程序,通过 uprobe 捕获 Go runtime 的 runtime.gopark 调用,并解析其 g(goroutine)结构体中的 goidgstatus 字段:

// 示例:Rust eBPF 程序中解析 goroutine ID(需配合 BTF 和 Go 1.21+ 支持)
#[uprobe(name = "gopark")]
pub fn gopark(ctx: ProbeContext) -> i32 {
    let g_ptr = unsafe { *(ctx.rdx() as *const u64) }; // 假设 g 指针在 rdx
    let goid = unsafe { *(g_ptr.add(152) as *const u64) }; // offset to goid (arch-dependent)
    trace_event!(ctx, "goroutine_park", goid);
    0
}

该能力使分布式追踪首次具备跨 goroutine 生命周期的精确调度归因。

内核-用户态协同流水线重构

可观测性数据流不再经由 perf ring buffer → userspace daemon → exporter 的串行链路,而是形成分层处理闭环:

层级 技术载体 职责
内核态 eBPF Map + RingBuf 高频事件聚合、过滤、采样
边缘处理 Rust WASM 模块 实时字段解析、标签注入、轻量脱敏
控制平面 Go 服务 动态策略下发、eBPF 程序热加载、指标聚合

安全边界与可信执行模型升级

eBPF verifier 保障内核安全,Rust 的所有权模型杜绝内存越界,Go 的 module checksum 机制确保分发链可信。三者组合下,可观测性组件可部署于金融、政企等强合规场景——无需 root 权限即可启用 TLS 握手解密、HTTP/2 流级追踪等敏感能力。

第二章:Go语言在eBPF可观测性生态中的范式跃迁

2.1 Go作为eBPF用户态控制平面的工程优势与实践演进

Go凭借其静态链接、GC可控性与原生并发模型,天然适配eBPF控制平面对轻量、可靠、热更新敏感的诉求。

零依赖二进制分发

// main.go:构建完全静态的eBPF管理器
func main() {
    spec, _ := LoadBpfObjects() // 加载编译好的ELF
    m := NewManager(spec)
    _ = m.Init()                // 初始化maps、progs
    _ = m.Start()               // 启动所有attach点
}

go build -ldflags="-s -w -buildmode=exe"生成单文件二进制,规避glibc兼容问题,满足容器/边缘场景秒级部署需求。

运行时能力对比(典型控制平面场景)

能力维度 C (libbpf) Rust (libbpf-rs) Go (cilium/ebpf)
开发效率
Map热更新支持 手动管理 借助BTF需额外工具 Map.Update() + WithPinPath()
并发安全Map访问 需显式锁 Arc<Mutex<>> 内置sync.Map封装

生命周期协同设计

graph TD
    A[Go主协程] --> B[Manager.Start]
    B --> C{Attach eBPF Prog}
    C --> D[PerfEventArray ReadLoop]
    C --> E[Map Polling Goroutine]
    D & E --> F[Channel Notify User Logic]

Go的goroutine+channel范式将eBPF事件流自然映射为结构化数据管道,大幅降低状态同步复杂度。

2.2 libbpf-go与cilium/ebpf双栈选型对比及生产级封装实践

核心差异维度

维度 libbpf-go cilium/ebpf
内核兼容性 严格绑定 libbpf v1.0+,需手动同步头文件 自动降级适配旧内核(如 4.19+)
BTF 支持 依赖外部 bpftool 提取 BTF 内置 btf.LoadSpecFromKernel()
错误传播 返回 error + errno 整数 统一封装为 ebpf.Error 类型

生产级封装关键逻辑

// 封装后的安全加载器(自动处理 BTF fallback)
func LoadTracingProgram(spec *ebpf.ProgramSpec) (*ebpf.Program, error) {
    // 优先尝试内核原生 BTF
    if prog, err := ebpf.NewProgram(spec); err == nil {
        return prog, nil
    }
    // 降级:注入用户态 BTF(来自 /sys/kernel/btf/vmlinux)
    spec.ByteOrder = binary.LittleEndian
    return ebpf.NewProgramWithOptions(spec, ebpf.ProgramOptions{
        VerifierOptions: ebpf.VerifierOptions{Strict: true},
    })
}

该封装屏蔽了 cilium/ebpfLoadCollectionSpec 的冗余校验路径,将 BTF 加载失败时的 panic 转为可重试错误;Strict: true 强制启用 verifier 日志,便于线上问题定位。

数据同步机制

  • 使用 ringbuf 替代 perf event——降低 CPU 上下文切换开销
  • 所有事件结构体通过 binary.Write 序列化,避免 CGO 内存拷贝
graph TD
    A[eBPF 程序] -->|ringbuf.write| B[userspace ringbuf.Reader]
    B --> C[goroutine 池解析]
    C --> D[结构化 metric channel]

2.3 Go协程模型与eBPF事件流的异步对齐:从perf event到ring buffer的零拷贝调度

数据同步机制

Go runtime 的 runtime_pollWait 与 eBPF perf ring buffer 的 mmap() 映射区协同实现无锁轮询。关键在于 perf_event_open() 返回的 fd 与 epoll 可读事件联动,触发 goroutine 唤醒。

零拷贝路径

// mmap ring buffer head/tail 环形指针(用户态只读)
rb := (*[2]uint64)(unsafe.Pointer(unsafe.Add(unsafe.Pointer(rbMmap), 0)))
head, tail := atomic.LoadUint64(&rb[0]), atomic.LoadUint64(&rb[1])
// 注意:eBPF 内核更新 head,用户态更新 tail;需 memory barrier 保证可见性

该代码直接访问内核映射的 ring buffer 元数据页,避免 read() 系统调用拷贝。rb[0] 为内核写入位置(head),rb[1] 为用户消费位置(tail);二者差值即待处理事件数。

事件分发策略

阶段 同步方式 Goroutine 绑定
Ring buffer 轮询 epoll + GPM 调度 动态复用
事件解析 channel select worker pool
上游转发 non-blocking send bounded queue
graph TD
    A[eBPF tracepoint] --> B[perf_event_buffer]
    B --> C{mmap ring buffer}
    C --> D[Go epoll wait]
    D --> E[Goroutine 唤醒]
    E --> F[原子 tail 更新 & 批量消费]

2.4 Go泛型在eBPF Map抽象层的类型安全建模与实时Schema演化实践

为解耦eBPF程序与用户态数据结构,我们基于Go泛型构建参数化Map封装:

type Map[K comparable, V any] struct {
    fd     int
    keyT   reflect.Type
    valueT reflect.Type
}

func NewMap[K comparable, V any](name string) (*Map[K, V], error) {
    // 初始化逻辑:自动推导BTF类型并校验内核兼容性
}

该设计使Map[string, *ProcessEvent]Map[uint32, uint64]共享同一套生命周期管理,避免重复unsafe转换。

类型安全保障机制

  • 编译期强制键值类型匹配BPF Map定义(如BPF_MAP_TYPE_HASH要求Kcomparable
  • 运行时通过reflect.TypeOf比对BTF签名,拒绝schema不一致加载

Schema演化支持能力

演化操作 支持状态 说明
字段新增(末尾) 兼容旧版eBPF程序读取
字段重命名 ⚠️ 需同步更新BTF注解与Go标签
字段删除 触发类型校验失败
graph TD
    A[Go结构体变更] --> B{BTF类型校验}
    B -->|通过| C[动态生成map_ops]
    B -->|失败| D[panic with schema diff]

2.5 Go模块化eBPF程序生命周期管理:从加载、验证、热更新到可观测性注入

eBPF程序在Go生态中已突破“一次性加载”范式,演进为可版本化、可观测、可热替换的模块化组件。

模块化加载与验证

使用libbpf-go封装的LoadAndAssign完成安全校验与映射绑定:

obj := &ebpf.ProgramSpec{Type: ebpf.SchedCLS, License: "MIT"}
prog, err := ebpf.NewProgram(obj)
// 参数说明:Type决定内核校验器路径约束;License影响GPL-only辅助函数调用权限

校验失败时返回具体不合规指令位置,而非模糊错误。

热更新原子切换

通过Program.Replace()实现零丢包替换,依赖内核5.14+的BPF_PROG_REPLACE能力。

可观测性注入机制

阶段 注入方式 数据目标
加载前 eBPF Map预填充元标签 Prometheus exporter
运行中 bpf_perf_event_output eBPF ringbuf → userspace trace
graph TD
    A[Go Module Init] --> B[Verify via libbpf verifier]
    B --> C{Pass?}
    C -->|Yes| D[Load to kernel]
    C -->|No| E[Log violation details]
    D --> F[Inject metrics hooks]

第三章:Rust与Go协同的系统边界重构

3.1 Rust编写高性能eBPF后端(如tracepoint处理器)与Go控制面的FFI安全桥接实践

Rust eBPF 后端通过 aya crate 加载 tracepoint 程序,暴露线程安全的 C ABI 函数供 Go 调用:

// lib.rs —— FFI 入口点
use std::ffi::CStr;
use std::os::raw::c_char;

#[no_mangle]
pub extern "C" fn tracepoint_init(probe_name: *const c_char) -> i32 {
    let name = unsafe { CStr::from_ptr(probe_name) }
        .to_str().unwrap_or("unknown");
    // 初始化对应 tracepoint 并注册 perf event ring buffer
    0 // 成功返回 0
}

该函数接收 C 字符串 probe 名称(如 "syscalls/sys_enter_openat"),完成 eBPF 程序加载与事件订阅。no_mangle 确保符号不被 Rust 名字修饰,extern "C" 保证调用约定兼容 Go 的 C 包。

数据同步机制

  • 使用 std::sync::mpsc::channel 将 perf buffer 解析结果推送至 Go 控制面
  • Rust 端负责内存生命周期管理,Go 仅持有只读数据拷贝

安全边界设计

组件 职责 内存所有权归属
Rust 后端 eBPF 加载、事件解析、零拷贝读取 Rust
Go 控制面 配置下发、指标聚合、HTTP 暴露 Go
graph TD
    A[Go 控制面] -->|C.call tracepoint_init| B[Rust FFI 接口]
    B --> C[eBPF tracepoint 加载]
    C --> D[Perf Buffer Ring]
    D -->|mmap + poll| B
    B -->|send via channel| E[Go 事件处理协程]

3.2 基于WASM-Edge Runtime的Rust+Go混合插件沙箱:实现eBPF可观测性策略的动态加载

传统eBPF程序需编译后加载内核,缺乏运行时策略热更新能力。本方案利用 WASM-Edge Runtime 构建轻量级沙箱,支持 Rust(编写高性能 eBPF 辅助逻辑)与 Go(提供策略管理 API)双语言插件协同执行。

沙箱架构概览

// plugin/src/lib.rs —— Rust 插件入口,导出 eBPF 策略解析函数
#[no_mangle]
pub extern "C" fn parse_policy(policy_json: *const u8, len: usize) -> i32 {
    let json = unsafe { std::slice::from_raw_parts(policy_json, len) };
    match serde_json::from_slice::<Policy>(json) {
        Ok(p) => { /* 验证并序列化为 BPF map key/value */ 0 },
        Err(_) => -1,
    }
}

该函数接收 JSON 格式可观测性策略(如 {"trace_syscall": ["openat", "connect"]}),经反序列化与安全校验后,生成可注入 eBPF map 的结构化指令。policy_json 为线性内存指针,len 防越界读取,返回值遵循 POSIX 风格错误码约定。

策略加载流程

graph TD
    A[Go 主控进程] -->|HTTP POST /policy| B(WASM-Edge Runtime)
    B --> C[Rust 插件 parse_policy]
    C --> D[eBPF Map 更新]
    D --> E[内核侧 tracepoint 自动生效]

支持的策略类型

类型 示例值 安全约束
syscall_trace ["read", "write"] 白名单限定,禁止 execve
duration_ms 5000 ≥100ms,防高频采样风暴
sample_ratio 0.1 (0,1] 浮点,限流采样

3.3 跨语言可观测性元数据协议设计:OpenTelemetry Schema在Go/Rust边界的一致性落地

为保障 Go(服务端)与 Rust(WASM 边缘代理)间 trace context 语义零歧义,需对 OpenTelemetry Schema 进行跨语言约束建模。

元数据字段对齐策略

  • trace_id:统一采用 16 字节十六进制字符串(非 base64),避免 Go encoding/hex 与 Rust hex::encode 行为差异
  • span_id:强制 8 字节定长,Rust 使用 u64::to_be_bytes(),Go 使用 binary.BigEndian.PutUint64()
  • trace_flags:仅保留 bit0(sampled),禁用 vendor 扩展位

序列化契约表

字段 Go 类型 Rust 类型 序列化格式
trace_id [16]byte [u8; 16] hex-lower
span_id uint64 u64 big-endian
trace_state string String key=val;…
// Rust: 严格校验 trace_id 长度与编码
fn parse_trace_id(s: &str) -> Result<[u8; 16], ParseError> {
    if s.len() != 32 { return Err(ParseError::InvalidLength); }
    hex::decode(s).map(|b| b.try_into().unwrap_or_else(|_| panic!("not 16 bytes")))
}

该函数确保输入必为 32 字符小写十六进制,解码后强制转为 [u8; 16]——规避 Rust Vec<u8> 与 Go []byte 在内存布局与生命周期上的隐式差异。

// Go: 生成符合契约的 trace_id
func NewTraceID() string {
    var b [16]byte
    rand.Read(b[:])
    return hex.EncodeToString(b[:]) // 小写、无前缀、32字符
}

hex.EncodeToString 输出严格小写十六进制,与 Rust hex::encode 默认行为一致;[16]byte 栈分配保证二进制兼容性,避免 GC 堆指针干扰跨语言 FFI 边界。

数据同步机制

graph TD
    A[Go HTTP Handler] -->|inject| B[OTel Propagator]
    B --> C[HTTP Header: traceparent]
    C --> D[Rust WASM Proxy]
    D -->|extract & validate| E[Schema-Compliant Context]
    E --> F[Span Linking]

第四章:eBPF驱动的Go运行时深度可观测性革命

4.1 Go runtime tracepoints探针开发:GC周期、Goroutine调度、网络阻塞点的eBPF原生捕获

Go 1.21+ 原生暴露 tracepoint 事件(如 go:gc:start, go:sched:goroutine:run, go:net:block),可被 eBPF 程序直接挂载。

核心探针映射表

Tracepoint 触发时机 典型用途
go:gc:start STW 开始前 GC 延迟归因
go:sched:goroutine:run G 被 M 抢占或唤醒时 调度延迟与就绪队列分析
go:net:block read/write 进入阻塞前 TCP/Unix socket 阻塞定位

eBPF 捕获示例(带注释)

// attach to go:gc:start tracepoint
SEC("tracepoint/go:gc:start")
int trace_gc_start(struct trace_event_raw_go_gc_start *ctx) {
    u64 ts = bpf_ktime_get_ns(); // 纳秒级时间戳,用于延迟计算
    bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &ts, sizeof(ts));
    return 0;
}

ctx 是内核自动生成的结构体,字段由 trace_event_raw_go_gc_start 定义;bpf_perf_event_output 将数据零拷贝推送至用户态 ring buffer;BPF_F_CURRENT_CPU 保证本地 CPU 缓存一致性。

graph TD A[Go runtime emit tracepoint] –> B[eBPF probe attach] B –> C[Kernel tracepoint subsystem] C –> D[Perf buffer ring] D –> E[userspace parser]

4.2 基于eBPF的Go pprof增强:火焰图叠加内核栈+用户态Go符号的端到端采样实践

传统 go tool pprof 仅捕获用户态 Go 调用栈,缺失系统调用、锁竞争、页故障等内核上下文。eBPF 提供零侵入、高精度的内核事件钩子能力,结合 Go 运行时暴露的 /proc/<pid>/mapsruntime/pprof 符号表,可实现跨边界栈融合。

栈采集双通道协同机制

  • 用户态:通过 perf_event_open(PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_CLOCK) 触发 Go runtime 的 runtime_stack() 快照
  • 内核态:eBPF 程序挂载在 kprobe/sys_enter_read + tracepoint:sched:sched_switch,捕获内核栈并关联 bpf_get_current_pid_tgid()

符号解析关键流程

// bpf_prog.c —— 内核侧栈帧标记
SEC("tracepoint/sched/sched_switch")
int trace_sched_switch(struct trace_event_raw_sched_switch *ctx) {
    u64 pid = bpf_get_current_pid_tgid() >> 32;
    // 关联用户态符号映射:需提前注入 /proc/pid/maps 中的 [anon:Go] 段基址
    bpf_map_update_elem(&pid_to_ustack_base, &pid, &base_addr, BPF_ANY);
    return 0;
}

此代码在进程调度切换时记录其用户态栈基址,为后续 bpf_get_stack() 返回的地址提供符号偏移锚点;&base_addr 来自 userspace daemon 对 /proc/<pid>/maps 的实时解析,确保 Go 动态链接段(如 anon:Go)地址可解。

端到端数据流

graph TD
    A[eBPF kprobe/tracepoint] --> B[内核栈 + PID/TID]
    C[Go runtime.SetCPUProfileRate] --> D[goroutine 栈快照]
    B & D --> E[userspace 合并器]
    E --> F[pprof 格式:含 kernel:do_syscall_64 + go:net/http.(*conn).serve]
维度 传统 pprof eBPF 增强方案
栈深度覆盖 用户态 Go 用户态 Go + 内核态全路径
采样开销 ~5% CPU
符号准确性 依赖 binary debug info 实时 maps 解析 + DWARF fallback

4.3 Go内存分配热点追踪:从mcache/mcentral到page allocator的eBPF内存路径可视化

Go运行时的内存分配路径存在多级缓存:mcache(线程本地)→ mcentral(中心化span管理)→ mheap.pageAlloc(页级物理映射)。传统pprof仅暴露堆栈顶层,难以定位跨组件延迟。

eBPF追踪点部署

// trace_alloc.c —— 在runtime.mallocgc关键跳转处插桩
SEC("uprobe/runtime.mallocgc")
int trace_malloc(struct pt_regs *ctx) {
    u64 size = PT_REGS_PARM1(ctx); // 第一个参数:申请字节数
    u64 pc = BPF_GET_FUNC_IP(ctx); // 获取调用点指令地址
    bpf_map_update_elem(&alloc_events, &pc, &size, BPF_ANY);
    return 0;
}

该eBPF程序捕获每次mallocgc调用的原始尺寸与调用上下文,为后续路径聚合提供原子事件源。

内存路径阶段耗时分布(微秒级)

阶段 平均延迟 主要开销来源
mcache 分配 23 ns 无锁指针偏移
mcentral 锁竞争 186 ns spinlock + span复用查找
pageAlloc 映射 412 ns bitmap扫描 + TLB刷新

路径关联逻辑

graph TD
    A[mcache.alloc] -->|span空| B[mcentral.pickspans]
    B -->|span不足| C[pageAlloc.alloc]
    C -->|新页| D[mheap.grow]

4.4 eBPF辅助的Go微服务依赖拓扑自发现:基于socket connect/accept与HTTP/GRPC协议解析的自动服务图谱构建

传统服务发现依赖配置或中心化注册中心,而eBPF可在内核态无侵入捕获网络事件。本方案通过 tracepoint:syscalls/sys_enter_connectkprobe:inet_csk_accept 捕获连接建立行为,并结合 uprobe 注入 Go runtime 的 net/http.(*conn).readRequestgoogle.golang.org/grpc.(*Server).handleRawConn 实现协议语义识别。

协议特征提取关键点

  • HTTP:解析 :method, :authority, user-agent 提取服务名与端点
  • gRPC:读取前5字节Frame Header + :path(如 /helloworld.Greeter/SayHello)推导服务接口

eBPF Map 数据结构设计

Map 类型 键(Key) 值(Value) 用途
hash struct { pid, fd } struct { ts, ip, port, proto } 连接上下文快照
lru_hash struct { src_svc, dst_svc } u32 count 服务对调用频次统计
// bpf_prog.c:在connect()入口提取目标地址
SEC("tracepoint/syscalls/sys_enter_connect")
int trace_connect(struct trace_event_raw_sys_enter *ctx) {
    struct sockaddr_in *addr = (struct sockaddr_in *)ctx->args[1];
    __u16 dport = ntohs(addr->sin_port);
    __u32 dip = addr->sin_addr.s_addr;
    // 存入per-connection map,供后续uprobe关联
    bpf_map_update_elem(&conn_start, &key, &val, BPF_ANY);
    return 0;
}

该eBPF程序捕获连接发起时刻的目标IP与端口,并以PID+FD为键写入哈希表;后续在HTTP/gRPC uprobe中通过相同PID+FD查表,完成“连接→协议→服务名”的三元关联,支撑实时服务图谱生成。

第五章:总结与展望

核心成果回顾

在本项目实践中,我们完成了基于 Kubernetes 的微服务可观测性平台搭建,覆盖日志(Loki+Promtail)、指标(Prometheus+Grafana)和链路追踪(Jaeger)三大支柱。生产环境已稳定运行 147 天,平均单日采集日志量达 2.3 TB,API 请求 P95 延迟从 840ms 降至 210ms。关键指标全部纳入 SLO 看板,错误率阈值设定为 ≤0.5%,连续 30 天达标率为 99.98%。

实战问题解决清单

  • 日志爆炸式增长:通过动态采样策略(对 /health/metrics 接口日志采样率设为 0.01),日志存储成本下降 63%;
  • 跨集群指标聚合失效:采用 Prometheus federation 模式 + Thanos Sidecar 双冗余架构,实现 5 个集群指标毫秒级同步;
  • 分布式事务链路断裂:在 Spring Cloud Gateway 中注入 TraceId 透传逻辑,并统一 OpenTelemetry SDK 版本至 v1.32.0,链路完整率从 71% 提升至 99.4%。

技术债与优化优先级

问题描述 当前影响 解决方案 预估工期
Grafana 告警规则硬编码在 ConfigMap 中 运维修改需重启 Pod,平均修复延迟 12 分钟 迁移至 Alertmanager Config CRD + GitOps 自动同步 3人日
Jaeger UI 查询 >1000 条 Span 时内存溢出 关键业务链路诊断失败率 18% 启用 Badger 存储后端 + 分片索引优化 5人日

下一代架构演进路径

graph LR
A[当前架构] --> B[服务网格集成]
A --> C[边缘可观测性增强]
B --> D[通过 Istio EnvoyFilter 注入 eBPF 指标采集器]
C --> E[在 CDN 边缘节点部署轻量级 OpenTelemetry Collector]
D --> F[实现 L4-L7 全栈网络性能画像]
E --> F

社区协作落地案例

2024 年 Q2,团队向 CNCF OpenTelemetry 社区提交 PR #10827,修复了 Java Agent 在 Quarkus 3.x 环境下 Context 丢失的 Bug,该补丁已被 v1.34.0 正式版本合并。同时,将内部开发的 k8s-resource-labeler 工具开源至 GitHub(star 数已达 217),支持自动为 Pod 注入命名空间、服务名、GitCommit 等 12 类元标签,已在 3 家金融客户生产环境验证。

成本效益量化对比

自平台上线以来,MTTR(平均故障恢复时间)从 42 分钟缩短至 6.8 分钟;告警准确率提升至 92.3%(误报率由 37% 降至 8.1%);运维工程师每日人工巡检耗时减少 11.5 小时。按团队 8 人规模测算,年化节省运维工时约 22,800 小时。

生产环境灰度发布策略

采用 Argo Rollouts 的 AnalysisTemplate 进行渐进式验证:每批次扩容 5% 流量后,自动比对新旧版本的 error_rate、http_latency_p95、jvm_memory_used_bytes 三项核心指标,任一指标波动超阈值即触发自动回滚。该机制已在支付网关服务中成功拦截 3 次潜在故障。

开源工具链兼容性矩阵

组件 支持版本 生产验证集群数 备注
Prometheus v2.47.0+ 5 需启用 --enable-feature=agent 模式
Grafana v10.2.3 3 插件需禁用 grafana-worldmap-panel(存在内存泄漏)
OpenTelemetry Collector v0.94.0 7 必须启用 hostmetrics receiver 以采集容器 CPU throttling

未来 12 个月技术攻坚重点

聚焦 eBPF 原生可观测性能力构建,包括内核级 TCP 重传分析、TLS 握手延迟归因、以及基于 BTF 的无侵入函数级性能剖析。已联合 eBPF Summit 2024 举办闭门工作坊,完成对 4 个核心模块的原型验证。

以代码为修行,在 Go 的世界里静心沉淀。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注