字数 665,阅读大约需 4 分钟
在traefik里使用插件捕获request和response
插件开发
上篇文章已经介绍了如何在treaifk使用插件,并记录trace_id。今天这边主要介绍如何开发插件并捕获API里的request和response!
可以在traefik labs里面找到该插件,然后我们到对应的GitHub里去查看插件源码:joy2fun/traefik-plugin-log-request: Traefik middleware for logging requests[1]
最好的方式就是让AI帮助我们读代码仓库,然后告诉我们代码主要实现了什么功能,然后在自己开发的时候,可以快速修改插件代码;
现在,我们使用AI解读插件的main.go,看看主要想实现什么功能;
AI解读
这是一个用于 Traefik 反向代理的 Go 语言插件,主要作用是记录 HTTP 请求和响应的详细信息。让我详细解释一下:
这个插件会拦截经过 Traefik 的 HTTP 请求,收集请求信息并以 JSON 格式输出到标准输出(stdout)。
1. 配置结构 (Config)
type Config struct {
ResponseBody bool // 是否记录响应体
MaxLineSize int // 最大行大小限制
RequestIDHeaderName string // 请求ID的header名称
}
2. 记录的数据 (RequestData)
插件会收集以下信息:
• URL: 请求的完整URL
• Host: 请求的主机名
• Body: 请求体内容
• Headers: 所有请求头(JSON格式)
• ResponseBody: 响应体内容(可选)
• RequestID: 唯一的请求标识符
3. 请求ID管理
• 如果请求中已存在指定的请求ID header,就使用现有的
• 否则生成一个16字节的随机ID
• 默认使用
X-Request-Id
作为header名称
工作流程
1. 拦截请求: 插件作为中间件拦截HTTP请求
2. 读取请求体: 保存请求体内容,然后重新包装给下游使用
3. 包装响应写入器: 使用自定义的
responseWriter
来捕获响应内容4. 转发请求: 将请求传递给下一个处理器
5. 收集数据: 组合请求和响应信息
6. 输出日志: 将收集的数据以JSON格式输出到stdout
特殊处理
• 响应体大小限制: 只有当响应体小于
maxLineSize
时才记录• Header处理: 将多值header简化为单值(取第一个值)
• 错误容忍: 各种错误情况都有基本的处理(虽然代码中很多地方忽略了错误)
traefik新增详情解析配置
在实际的traefik日志里,会新增request和response的信息,其中同一个request和response使用相同的“X-Request-Id”作为trace追踪;示例响应如下:
引用链接
[1]
joy2fun/traefik-plugin-log-request: Traefik middleware for logging requests: https://github.com/joy2fun/traefik-plugin-log-request
评论区