![Build Status](https://travis-ci.com/asppj/lolita.svg?branch=master)
- Logging - 用于记录离散的事件。例如,应用程序的调试信息或错误信息。它是我们诊断问题的依据。
- Metrics - 用于记录可聚合的数据。例如,队列的当前深度可被定义为一个度量值,在元素入队或出队时被更新;HTTP 请求个数可被定义为一个计数器,新请求到来时进行累加。
- Tracing - 用于记录请求范围内的信息。例如,一次远程方法调用的执行过程和耗时。它是我们排查系统性能问题的利器。
Opentrace
- 埋点:gin-web,http 请求,grpc 请求封装并埋点;
- 收集:zipkin,AppDash,jaeger 选择其一(阿里云日志服务优先)
- 展示:
埋点
- Inject 请求方注入
- Extract 服务方提取
1. gin-web 服务方 埋点(完成,待测)
添加中间件的方式
2. requests 请求 埋点(完成,待测)
封装 GET、POST、DELET、PUT 等 http 请求方法
3. grpc 埋点(完成,待测)
grpc 使用 grpc 提供的钩子函数
4. DB 驱动埋点
- mongodb 埋点 (完成)
- redis 埋点 (未开始)
- es 埋点 (完成)
opentrance-go 介绍
1. Trace 调用链
2. Span 调用链节点
1. Span-Tag 调用链节点标签
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)
2. Span-Log 调用链节点日志
span.LogKV("Request:", ctx.Request)
span.LogFields("Request:", ctx.Request)
3. Baggage item 全局范围不属于 span
// set
span.SetBaggageItem("greeting", greeting)
// get
greeting := span.BaggageItem("greeting")
4. Sampling,采样[0,1]
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 传递 span
// 存储到 context 中
ctx := context.Background()
ctx = opentracing.ContextWithSpan(ctx, span)
//....
// 其他过程获取并开始子 span
span, ctx := opentracing.StartSpanFromContext(ctx, "newspan")
defer span.Finish()
// StartSpanFromContext 会将新span保存到ctx中更新
context 传递
网络方式传递
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 ]
- 另外添加中间件自定义每个接口的超时时间
jaeger 搭建(本地)
all_in_one 镜像 tools->jaeger->docker-compose.yml
prometheus metrics 统计
prometheus 收集数据
Grafana 展示数据
prometheus 指标类型
- Counter 单调增
- Guage 可增减
- Historygram 直方图
- Summary 聚合图(1-10 占比,10-20 占比。。。)
gin-ext web 中间件
- 启动时长-uptime
- 请求总数-http_request_count_total
- 请求延时-http_request_duration_seconds
- 请求字节-http_request_size_bytes
- 响应字节-http_response_size_bytes
kafka golang 驱动封装
消费者
- 消费延时-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
kafka exporter 监控
与版本有关参考
官方 sdk
- github.com/prometheus/client_golang
工具
dem 开发辅助工具 https://github.com/asppj/dem
opentrace 参考资料
- 几种分布式调用链监控组件的比较
- opentracing 翻译版
- grpc-opentracing 中间件
- openTracing 讲解
- 阿里云日志服务配置 aliyun-log-jaeger
prometheus 参考资料
- prometheus 介绍
- 【监控】Kafka - 详细指标
- Grafana 与数据可视化
- 其他参考
Thanks
![avatar](https://github.com/asppj/lolita/raw/47b6ad521118/jetbrains.png)