- Logging - 用于记录离散的事件。例如,应用程序的调试信息或错误信息。它是我们诊断问题的依据。
- Metrics - 用于记录可聚合的数据。例如,队列的当前深度可被定义为一个度量值,在元素入队或出队时被更新;HTTP 请求个数可被定义为一个计数器,新请求到来时进行累加。
- Tracing - 用于记录请求范围内的信息。例如,一次远程方法调用的执行过程和耗时。它是我们排查系统性能问题的利器。
- 埋点:gin-web,http 请求,grpc 请求封装并埋点;
- 收集:zipkin,AppDash,jaeger 选择其一(阿里云日志服务优先)
- 展示:
- Inject 请求方注入
- http header
- grpc with 接口
- Extract 服务方提取
- http header
- grpc with 接口
添加中间件的方式
封装 GET、POST、DELET、PUT 等 http 请求方法
grpc 使用 grpc 提供的钩子函数
- mongodb 埋点 (完成)
- redis 埋点 (未开始)
- es 埋点 (完成)
ext.PeerHostname.Set(sp, c.Request.Host)
ext.PeerAddress.Set(sp, c.Request.RemoteAddr)
ext.PeerService.Set(sp, c.ClientIP())
ext.HTTPStatusCode.Set(sp, uint16(statusCode))
ext.HTTPMethod.Set(sp, c.Request.Method)
ext.HTTPUrl.Set(sp, c.Request.URL.Path)
span.LogKV("Request:", ctx.Request)
span.LogFields("Request:", ctx.Request)
// set
span.SetBaggageItem("greeting", greeting)
// get
greeting := span.BaggageItem("greeting")
sampling.priority - integer
1. const,全量采集,采样率设置0,1 分别对应打开和关闭
2. probabilistic ,概率采集,默认万份之一,0~1之间取值,
3. rateLimiting ,限速采集,每秒只能采集一定量的数据
4. remote ,一种动态采集策略,根据当前系统的访问量调节采集策略
childOf、followOf
1. opentracing.GlobalTracer().Extract 方法提取HTTP头中的spanContexts
2. opentracing.ChildOf 方法基于提取出来的spanContexts生成新的child spanContexts
3. opentracing.GlobalTracer().StartSpan 方法生成一个新的span
4. github.com/opentracing/opentracing-go/ext 通过ext可以为追踪添加一些tag来展示更多信息,比如URL,请求类型(GET,POST...), 返回码
5. sp.Finish() 结束这一个span
// 存储到 context 中
ctx := context.Background()
ctx = opentracing.ContextWithSpan(ctx, span)
//....
// 其他过程获取并开始子 span
span, ctx := opentracing.StartSpanFromContext(ctx, "newspan")
defer span.Finish()
// StartSpanFromContext 会将新span保存到ctx中更新
Extrect 从 Header 中获取
Extrect 从 grpc Ctx 中提取
inject 注入 Header
Inject 注入 grpc Ctx
# 进程中
opentracing.SpanFromContext(ctx)
# 或
span, ctx := opentracing.StartSpanFromContext(ctx, "newspan")
gin.Context:ctx.Request.Context()
gin.Context!=context.Context!=opentracing.SpanContext
mongodb/redis/es:
- context 不再使用 DefaultContext()
- 统一使用 gin.request.Context()[因为携带了 span ]
- 另外添加中间件自定义每个接口的超时时间
all_in_one 镜像 tools->jaeger->docker-compose.yml
- Counter 单调增
- Guage 可增减
- Historygram 直方图
- Summary 聚合图(1-10 占比,10-20 占比。。。)
- 启动时长-uptime
- 请求总数-http_request_count_total
- 请求延时-http_request_duration_seconds
- 请求字节-http_request_size_bytes
- 响应字节-http_response_size_bytes
- 消费延时-kafka_consumer_duration_seconds
- 消费成功数-kafka_consumer_success_total
- 消费失败数-kafka_consumer_failed_total
- Payload 字节数-kafka_consumer_payload_byte_size
- 生产延时-kafka_product_duration_seconds
- 生产成功数-kafka_product_success_total
- 生产失败数-kafka_product_failed_total
- Payload 字节数-kafka_product_payload_byte_size
与版本有关参考
- github.com/prometheus/client_golang