|
| 1 | +# Kyanos AGENTS.md |
| 2 | + |
| 3 | +> 本文件为 AI Agent 提供项目背景、结构、编码规范和工作流程信息。 |
| 4 | +
|
| 5 | +## 项目概述 |
| 6 | + |
| 7 | +**Kyanos** 是一个基于 eBPF 的网络问题分析工具,用于捕获和分析网络请求(HTTP、Redis、MySQL 等),帮助快速诊断网络相关问题,如慢查询、高流量和异常。 |
| 8 | + |
| 9 | +### 核心特性 |
| 10 | + |
| 11 | +1. **流量过滤**:支持按进程/容器、L7 协议、请求/响应大小、延迟等多维度过滤 |
| 12 | +2. **流量分析**:聚合指标,快速定位问题(如带宽占满时找出最大响应) |
| 13 | +3. **内核级延迟详情**:可视化展示数据包从网卡到 socket 缓冲区的各阶段耗时 |
| 14 | +4. **SSL 自动解密**:自动解密 HTTPS 流量为明文 |
| 15 | +5. **零依赖**:单二进制文件,命令行交互 |
| 16 | + |
| 17 | +### 技术栈 |
| 18 | + |
| 19 | +- **语言**: Go 1.23+ |
| 20 | +- **内核技术**: eBPF (使用 cilium/ebpf 库) |
| 21 | +- **UI**: Charmbracelet 生态 (Bubble Tea, Bubbles, Lipgloss) |
| 22 | +- **CLI**: Cobra + Viper |
| 23 | +- **支持协议**: HTTP, Redis, MySQL, Kafka, MongoDB, RocketMQ, DNS |
| 24 | + |
| 25 | +--- |
| 26 | + |
| 27 | +## 项目结构 |
| 28 | + |
| 29 | +``` |
| 30 | +kyanos/ |
| 31 | +├── main.go # 入口文件,调用 cmd.Execute() |
| 32 | +├── go.mod # Go 依赖管理 |
| 33 | +├── Makefile # 构建脚本 |
| 34 | +├── bpf/ # eBPF C 程序和头文件 |
| 35 | +│ ├── pktlatency.bpf.c # 主 eBPF 程序 |
| 36 | +│ ├── openssl_*.bpf.c # 各版本 OpenSSL uprobe |
| 37 | +│ ├── gotls.bpf.c # Go TLS uprobe |
| 38 | +│ ├── *.h # BPF 头文件 |
| 39 | +│ └── loader/ # BPF 加载器 (Go) |
| 40 | +├── cmd/ # CLI 命令定义 |
| 41 | +│ ├── root.go # 根命令和全局 flags |
| 42 | +│ ├── watch.go # watch 子命令 |
| 43 | +│ ├── stat.go # stat 子命令 |
| 44 | +│ └── *.go # 其他协议命令 |
| 45 | +├── agent/ # 核心 Agent 逻辑 |
| 46 | +│ ├── agent.go # Agent 启动和主循环 |
| 47 | +│ ├── conn/ # 连接管理、事件处理 |
| 48 | +│ ├── protocol/ # 协议解析器 |
| 49 | +│ ├── analysis/ # 流量分析 |
| 50 | +│ ├── render/ # UI 渲染 |
| 51 | +│ └── metadata/ # 容器/K8s 元数据 |
| 52 | +├── common/ # 公共工具和类型 |
| 53 | +│ ├── log.go # 日志系统 |
| 54 | +│ ├── utils.go # 通用工具 |
| 55 | +│ └── *.go |
| 56 | +├── version/ # 版本信息 |
| 57 | +├── vmlinux/ # 各架构的 vmlinux.h |
| 58 | +├── libbpf/ # libbpf 子模块 |
| 59 | +└── docs/ # 文档 |
| 60 | +``` |
| 61 | + |
| 62 | +--- |
| 63 | + |
| 64 | +## 构建系统 |
| 65 | + |
| 66 | +### 依赖要求 |
| 67 | + |
| 68 | +- **Go**: 1.23+ |
| 69 | +- **Clang**: 10.0+ |
| 70 | +- **LLVM**: 10.0+ |
| 71 | +- **Linux 头文件**: linux-tools-common, linux-tools-generic |
| 72 | +- **其他**: pkgconf, libelf-dev |
| 73 | + |
| 74 | +### 常用构建命令 |
| 75 | + |
| 76 | +```bash |
| 77 | +# 开发构建(本地测试) |
| 78 | +make build-bpf && make |
| 79 | + |
| 80 | +# 生成带 BTF 的完整构建(用于低版本内核) |
| 81 | +make build-bpf && make btfgen BUILD_ARCH=x86_64 ARCH_BPF_NAME=x86 && make |
| 82 | + |
| 83 | +# 调试构建 |
| 84 | +make kyanos-debug |
| 85 | + |
| 86 | +# 测试 |
| 87 | +make test |
| 88 | + |
| 89 | +# 格式化代码 |
| 90 | +make format |
| 91 | +``` |
| 92 | + |
| 93 | +### BPF 代码生成 |
| 94 | + |
| 95 | +项目使用 `go generate` 生成 BPF 骨架代码: |
| 96 | + |
| 97 | +```bash |
| 98 | +# 在 bpf/loader/loader.go 中定义 |
| 99 | +//go:generate go run github.com/cilium/ebpf/cmd/bpf2go ... |
| 100 | + |
| 101 | +TARGET=amd64 go generate ./bpf/ # x86_64 |
| 102 | +TARGET=arm64 go generate ./bpf/ # arm64 |
| 103 | +``` |
| 104 | + |
| 105 | +--- |
| 106 | + |
| 107 | +## 代码规范 |
| 108 | + |
| 109 | +### Go 编码风格 |
| 110 | + |
| 111 | +1. **包命名**: 全小写,简短有意义,避免下划线 |
| 112 | +2. **文件命名**: 全小写,使用下划线分隔,如 `kern_event_handler.go` |
| 113 | +3. **接口命名**: 动词+名词,如 `ProtocolStreamParser` |
| 114 | +4. **错误处理**: 显式处理,使用 `common.DefaultLog` 记录 |
| 115 | +5. **日志**: 使用 `common.AgentLog`, `common.BPFLog` 等专用 logger |
| 116 | + |
| 117 | +### 关键模式 |
| 118 | + |
| 119 | +#### Agent 启动流程 |
| 120 | + |
| 121 | +```go |
| 122 | +// agent/agent.go: SetupAgent() |
| 123 | +1. 检查 BPF 权限 (CAP_BPF) |
| 124 | +2. 初始化 ConnManager |
| 125 | +3. 初始化 ProcessorManager |
| 126 | +4. 加载 BPF 程序 (loader.LoadBPF) |
| 127 | +5. 启动事件拉取 goroutines |
| 128 | +6. 启动渲染 UI |
| 129 | +``` |
| 130 | + |
| 131 | +#### 协议解析器 |
| 132 | + |
| 133 | +```go |
| 134 | +// agent/protocol/protocol.go |
| 135 | + |
| 136 | +// 实现 ProtocolStreamParser 接口 |
| 137 | +type ProtocolStreamParser interface { |
| 138 | + Match(reqStreams, respStreams) []Record |
| 139 | + FindBoundary(streamBuffer, messageType, startPos) int |
| 140 | + ParseRequest(streamBuffer, messageType) *ParsedMessage |
| 141 | + // ... |
| 142 | +} |
| 143 | + |
| 144 | +// 注册解析器 |
| 145 | +func init() { |
| 146 | + ParsersMap[bpf.AgentTrafficProtocolTKProtocolXXX] = func() ProtocolStreamParser { |
| 147 | + return &XXXStreamParser{} |
| 148 | + } |
| 149 | +} |
| 150 | +``` |
| 151 | + |
| 152 | +#### eBPF Map 定义 |
| 153 | + |
| 154 | +```c |
| 155 | +// bpf/pktlatency.bpf.c |
| 156 | +struct { |
| 157 | + __uint(type, BPF_MAP_TYPE_HASH); |
| 158 | + __uint(key_size, sizeof(struct sock_key)); |
| 159 | + __uint(value_size, sizeof(struct conn_id_s_t)); |
| 160 | + __uint(max_entries, 65535); |
| 161 | +} sock_key_conn_id_map SEC(".maps"); |
| 162 | +``` |
| 163 | +
|
| 164 | +--- |
| 165 | +
|
| 166 | +## 测试 |
| 167 | +
|
| 168 | +### 测试结构 |
| 169 | +
|
| 170 | +``` |
| 171 | +agent/ |
| 172 | +├── agent_test.go # Agent 测试 |
| 173 | +├── agent_utils_test.go # 工具测试 |
| 174 | +└── protocol/ |
| 175 | + └── http_test.go # 协议解析测试 |
| 176 | +``` |
| 177 | +
|
| 178 | +### 运行测试 |
| 179 | +
|
| 180 | +```bash |
| 181 | +# 所有测试 |
| 182 | +go test -v ./... |
| 183 | +
|
| 184 | +# 特定包测试 |
| 185 | +go test -v ./agent/... |
| 186 | +
|
| 187 | +# 性能测试 |
| 188 | +go test -bench=. ./... |
| 189 | +``` |
| 190 | + |
| 191 | +--- |
| 192 | + |
| 193 | +## 常见问题 |
| 194 | + |
| 195 | +### 1. BPF 加载失败 |
| 196 | + |
| 197 | +- 检查内核版本(要求 3.10.0-957+ 或 4.14+) |
| 198 | +- 检查 BTF 是否启用: `zgrep CONFIG_DEBUG_INFO_BTF /proc/config.gz` |
| 199 | +- 使用 `--btf` 指定外部 BTF 文件 |
| 200 | + |
| 201 | +### 2. 容器相关功能不工作 |
| 202 | + |
| 203 | +- 确保有访问 Docker/Containerd/CRI 的权限 |
| 204 | +- 使用 `--docker-address`, `--containerd-address` 指定端点 |
| 205 | + |
| 206 | +### 3. SSL 解密失败 |
| 207 | + |
| 208 | +- 检查 OpenSSL 版本是否支持 |
| 209 | +- 确保进程有 ptrace 权限 |
| 210 | + |
| 211 | +--- |
| 212 | + |
| 213 | +## 贡献指南 |
| 214 | + |
| 215 | +### 添加新协议支持 |
| 216 | + |
| 217 | +1. 在 `bpf/protocol_inference.h` 添加协议检测逻辑 |
| 218 | +2. 在 `agent/protocol/` 创建解析器,实现 `ProtocolStreamParser` |
| 219 | +3. 在 `cmd/` 添加对应的子命令 |
| 220 | +4. 添加测试用例 |
| 221 | + |
| 222 | +### 修改 BPF 代码 |
| 223 | + |
| 224 | +1. 修改 `.c` 或 `.h` 文件 |
| 225 | +2. 运行 `make build-bpf` 重新生成骨架代码 |
| 226 | +3. 测试验证 |
| 227 | + |
| 228 | +--- |
| 229 | + |
| 230 | +## 参考资源 |
| 231 | + |
| 232 | +- **文档**: https://kyanos.io/ |
| 233 | +- **GitHub**: https://github.com/hengyoush/kyanos |
| 234 | +- **FAQ**: https://kyanos.io/faq.html |
| 235 | +- **eBPF 参考**: https://ebpf.io/ |
| 236 | +- **Cilium eBPF**: https://github.com/cilium/ebpf |
| 237 | + |
| 238 | +--- |
| 239 | + |
| 240 | +## 相关项目 |
| 241 | + |
| 242 | +Kyanos 开发过程中参考了以下项目: |
| 243 | + |
| 244 | +- [eCapture](https://ecapture.cc/zh/) - SSL 捕获 |
| 245 | +- [pixie](https://github.com/pixie-io/pixie) - K8s 可观测性 |
| 246 | +- [ptcpdump](https://github.com/mozillazg/ptcpdump) - 进程级 tcpdump |
0 commit comments