什么是可观测
相信大家日常经常使用kibana
、grafana
、jaeger
等平台观察系统状态和定位问题,这些就是可观测体系的一部分。可观测主要包括:
日志,实现有
ELK(es/logstash/kibana)
等指标,实现有
grafana
+promthues
等追踪,基于
opentracing
协议的实现有jaeger
、skywalking
等
我们排查问题过程,一般都会把三者日志、指标、追踪结合来看,比如通过接口异常增量指标发现问题--->链路追踪定位异常服务--->排查异常服务日志,所以关于可观测我们经常可以看见这个经典的图片:
什么是OpenTelemetry
关于可观测除了上述的各种实现外,还有另一套实现OpenCensus
,于是诞生统一标准OpenTelemetry
且兼容OpenTracing
,OpenCensus
。不过关于go语言OpenTelemetry
的统一sdk实现还不完善,比如目前还不支持日志,具体可以查看https://github.com/open-telemetry/opentelemetry-go
。
接下来,我们基于Go来看看,原sdk(也就是未使用OpenTelemetry
)接入指标和追踪的方式和基于OpenTelemetry
新体系的指标和追踪接入方式区别。
可观测之指标
基于原生promethues
sdk的指标采集演示
Go版本 这里用的1.14
主要依赖的包:
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
就依赖了两个包,使用比较简单:
单独创建一个server使用
github.com/prometheus/client_golang/prometheus/promhttp
暴露指标使用
github.com/prometheus/client_golang/prometheus
创建自定义指标,比如NewCounterVec
创建计数器、HistogramVec
创建直方图等等。WithLabelValues
给自定义指标打标签
代码示例如下:
docker示例:https://github.com/TIGERB/easy-tips/tree/master/docker/grafana-promethues/go-demo/main.go.promethues
package main
import (
"net/http"
// 引入prometheus sdk
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
var (
// 自定义接口请求次数自定义指标
GlobalApiCounter *prometheus.CounterVec
)
func init() {
// 初始化接口请求次数自定义指标
GlobalApiCounter = prometheus.NewCounterVec(prometheus.CounterOpts{
Name: "demo_api_request_counter",
Help: "接口请求次数自定义指标",
},
[]string{"domain", "uri"}, // 域名和接口
)
prometheus.MustRegister(GlobalApiCounter)
}
func main() {
go (func() {
// 创建一个独立的server export暴露Go指标 避免通过业务服务暴露到外网
metricServer := http.NewServeMux()
metricServer.Handle("/metrics", promhttp.Handler())
http.ListenAndServe(":2112", metricServer)
})()
// 使用默认server
http.HandleFunc("/v1/demo", func(w http.ResponseWriter, r *http.Request) {
// 自定义计数
GlobalApiCounter.WithLabelValues(r.Host, r.RequestURI).Inc()
w.Write([]byte("test"))
})
// 启动一个http服务并监听6060端口 这里第二个参数可以指定handler
http.ListenAndServe(":6060", nil)
}
<