自定义追踪
概述
- 类型:异常事件驱动(tracing/autotracing)
- 功能:自动追踪系统异常状态,在异常发生时触发上下文信息捕获
- 特点:
- 当系统出现异常时,
autotracing自动触发并捕获相关上下文信息 - 事件数据实时存储到本地,同时发送到远程 ES,还可以生成 Prometheus 指标进行观测
- 适用于性能开销较大的场景,例如在检测到指标超过阈值或上升过快时触发捕获
- 当系统出现异常时,
- 已集成:CPU 空闲异常追踪(cpu idle)、D 状态追踪(dload)、容器内外部竞争(waitrate)、内存突发分配(memburst)、磁盘异常追踪(iotracer)
如何添加 Autotracing
AutoTracing 只需实现 ITracingEvent 接口并完成注册即可将事件添加到系统。
AutoTracing与Event在框架实现上没有区别,只是根据实际应用场景进行区分。
// ITracingEvent represents a autotracing or event
type ITracingEvent interface {
Start(ctx context.Context) error
}
1. 创建结构体
type exampleTracing struct{}
2. 注册回调函数
func init() {
tracing.RegisterEventTracing("example", newExample)
}
func newExample() (*tracing.EventTracingAttr, error) {
return &tracing.EventTracingAttr{
TracingData: &exampleTracing{},
Internal: 10, // 重新触发追踪的间隔(秒)
Flag: tracing.FlagTracing, // 标记为 tracing 类型;| tracing.FlagMetric(可选)
}, nil
}
3. 实现 ITracingEvent
func (t *exampleTracing) Start(ctx context.Context) error {
// 检测你关注的内容
...
// 将数据存储到 ES 和本地
storage.Save("example", ccontainerID, time.Now(), tracerData)
}
此外,可以选择实现 Collector 接口以 Prometheus 格式输出:
func (c *exampleTracing) Update() ([]*metric.Data, error) {
// 将 tracerData 转换为 prometheus.Metric
...
return data, nil
}
项目 core/autotracing 目录中已集成多种实用的 autotracing 示例,框架还提供了丰富的底层接口,包括 BPF 程序和 map 数据交互、容器信息等。更多详情请参考对应的代码实现。