Skip to content

Commit 64eb7cf

Browse files
authored
Merge pull request #329 from hengyoush/docs/add-agents-md
docs: add AGENTS.md for AI agent guidance
2 parents 02f8076 + 138ae8b commit 64eb7cf

File tree

1 file changed

+246
-0
lines changed

1 file changed

+246
-0
lines changed

AGENTS.md

Lines changed: 246 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,246 @@
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

Comments
 (0)