零侵入采集原理
Diting 不修改应用代码,也不往应用进程里注入探针。信号来自三个地方:内核、网络协议、运行时本身。
两条采集通道
tc_ebpf:在网络层抓包,适合吞吐大的场景socket_syscall:在系统调用层抓取,能拿到进程与 socket 的对应关系
两条通道同时开启时,agent 会按 socket claim 去重,避免同一份 L7 数据被记两次。任意一条不可用时,会自动回退到另一条。
协议解析
L7 解析在 agent 本地完成,支持 18 个协议族:
- HTTP/1、HTTP/2、gRPC
- MySQL、PostgreSQL、Oracle、ClickHouse、MongoDB
- Redis、Kafka、RocketMQ、AMQP、MQTT、ZooKeeper
- Dubbo、S3、DNS、TLS
解析结果只带结构化字段,原始 payload 不必离开主机。
TLS 明文
Go 与 OpenSSL 的 TLS 明文通过 uprobe 读取,默认按需开启,带资源上限。老内核上只支持经典的 SSL_read / SSL_write,_ex 钩子会标记为跳过。
容器身份
通过 cgroup 识别容器:
- cgroup v2
- cgroup v1
- 混合模式
- Docker 与 kubepods 的目录布局
容器 ID、Pod、命名空间会写进每条数据,用于后续关联。
前端会话
会话回放不需要前端改代码。agent 在 nginx 或容器层注入 RUM 脚本,覆盖率可以在控制台按应用查看。
边界
- 强隔离容器运行时(gVisor、Kata)不在支持范围
- 没有 root 权限的主机只能拿到部分能力
- 应用内部的业务事件,如果只能通过改代码产生,Diting 不会替你造
降级
任何一项能力失败,agent 会继续运行,并在心跳和 /kernel-capabilities 里说明原因。这条规则适用于所有采集通道。