一、添加指标
注意:说明:
注意:Golang Client API 相关的文档请参见 GoDoc。
二、安装
通过 go get 命令来安装相关依赖,示例如下。
go get github.com/prometheus/client_golang/prometheusgo get github.com/prometheus/client_golang/prometheus/promautogo get github.com/prometheus/client_golang/prometheus/promhttp
三、开始(运行时指标)
1. 准备一个 HTTP 服务,路径通常使用 /metrics。可以直接使用 prometheus/promhttp 里提供的 Handler 函数。
如下是一个简单的示例应用,通过 http://localhost:2112/metrics 暴露 Golang 应用的一些默认指标数据(包括运行时指标、进程相关指标以及构建相关的指标)。
package mainimport ( "net/http" "github.com/prometheus/client_golang/prometheus/promhttp")func main() { http.Handle("/metrics", promhttp.Handler()) http.ListenAndServe(":2112", nil)}
2. 执行以下命令启动应用。
go run main.go
3. 执行以下命令,访问基础内置指标数据。
curl http://localhost:2112/metrics
四、应用层面指标
1. 上述示例仅暴露了一些基础的内置指标。应用层面的指标还需要额外添加(后续我们将提供一些 SDK 方便接入)。如下示例暴露了一个名为 myapp_processed_ops_total 的 计数类型 指标,用于对目前已经完成的操作进行计数。如下每两秒操作一次,同时计数器加1。
package mainimport ( "net/http" "time" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/client_golang/prometheus/promhttp")func recordMetrics() { go func() { for { opsProcessed.Inc() time.Sleep(2 * time.Second) } }()}var ( opsProcessed = promauto.NewCounter(prometheus.CounterOpts{ Name: "myapp_processed_ops_total", Help: "The total number of processed events", }))func main() { recordMetrics() http.Handle("/metrics", promhttp.Handler()) http.ListenAndServe(":2112", nil)}
2. 执行以下命令启动应用。
go run main.go
3. 执行以下命令,访问暴露的指标。
curl http://localhost:2112/metrics
从输出结果我们可以看到 myapp_processed_ops_total 计数器相关的信息,包括帮助文档、类型信息、指标名和当前值。
# HELP myapp_processed_ops_total The total number of processed events# TYPE myapp_processed_ops_total countermyapp_processed_ops_total 666
五、步骤1:打包并部署应用
1. Golang 应用一般可以使用如下形式的 Dockerfile(按需修改)。
FROM golang:alpine AS builderRUN apk add –no-cache ca-certificates \\ make \\ gitCOPY . /go-buildRUN cd /go-build && \\ export GO111MODULE=on && \\ export GOPROXY=https://goproxy.io && \\ go build -o 'golang-exe' path/to/main/FROM alpineRUN apk add –no-cache tzdataCOPY –from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certsCOPY –from=builder /go-build/golang-exe /usr/bin/golang-exeENV TZ Asia/ShanghaiCMD ["golang-exe"]
2. 镜像可以使用 腾讯云的镜像仓库,或者使用其它公有或者自有镜像仓库。
3. 需要根据应用类型定义一个 Kubernetes 的资源,这里我们使用 Deployment,示例如下。
apiVersion: apps/v1kind: Deploymentmetadata: name: golang-app-demo labels: app: golang-app-demospec: replicas: 3 selector: matchLabels: app: golang-app-demo template: metadata: labels: app: golang-app-demo spec: containers: – name: golang-exe-demo image: nginx:1.14.2 ports: – containerPort: 2112
4. 同时需要 Kubernetes Service 做服务发现和负载均衡。
apiVersion: v1kind: Servicemetadata: name: golang-app-demospec: selector: app: golang-app-demo ports: – name: metrics protocol: TCP port: 2112 targetPort: 2112
注意:必须添加一个 Label 来标明目前的应用,Label 名不一定为 app,但是必须有类似含义的 Label 存在,其它名字的 Label 我们可以在后面添加数据采集任务的时候做 relabel 来达成目的。
六、步骤2:添加数据采集任务
当服务运行起来之后,需要进行如下操作让腾讯云 Prometheus 监控服务发现并采集监控指标:
1. 登录 腾讯云可观测平台 Prometheus 控制台,单击新建的实例 ID/名称。
2. 在数据采集页面,选择集成容器服务,单击集群右侧的数据采集配置:
3. 进入数据采集配置页面后,单击新建自定义监控,在弹出的页面中选择 yaml 编辑:
4. 通过此方式添加 Service Monitor,目前支持基于 Labels 发现对应的目标实例地址,因此可以对一些服务添加特定的 K8S Labels,可以使 Labels 下的服务都会被 Prometheus 服务自动识别出来,不需要再为每个服务添加采集任务,以上面的例子配置信息如下:
注意:说明:
注意:port 的取值为 service yaml 配置文件里的 spec/ports/name 对应的值。
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: go-demo # 填写一个唯一名称 namespace: cm-prometheus # namespace固定,不要修改 spec: endpoints: – interval: 30s # 填写service yaml中Prometheus Exporter对应的Port的Name port: metrics # 填写Prometheus Exporter对应的Path的值,不填默认/metrics path: /metrics relabelings: # ** 必须要有一个 label 为 application,这里假设 k8s 有一个 label 为 app, # 我们通过 relabel 的 replace 动作把它替换成了 application – action: replace sourceLabels: [__meta_kubernetes_pod_label_app] targetLabel: application # 选择要监控service所在的namespace namespaceSelector: matchNames: – default # 填写要监控service的Label值,以定位目标service selector: matchLabels: app: golang-app-demo
注意:示例中名称为 application 的 Label 必须配置,否则无法使用我们提供的一些其它开箱即用的集成功能。更多高阶用法请参见 ServiceMonitor 或 PodMonitor。
七、前提条件
Prometheus 实例已绑定 Grafana 实例。
八、操作步骤
1. 在 Prometheus 实例 列表,找到对应的 Prometheus 实例,单击实例 ID 右侧 Grafana 图标,打开 Grafana,输入你的账号密码,即可进行 Grafana 可视化大屏操作区。
2. 选择数据采集 > 集成中心,在集成中心页面找到并单击 Golang 监控,选择 Dashboard > Dashboard 操作 > Dashboard 安装/升级,单击安装/升级,安装对应的 Grafana Dashboard。
3. 进入 Grafana,单击搜索图标,展开监控面板,单击对应的监控图表名称即可查看监控数据。
九、总结
这篇通过两个示例展示了如何将 Golang 相关的指标暴露给 Prometheus 监控服务,以及如何使用 Grafana 可视化的图表查看监控数据。文档只使用了计数类型 Counter 的指标,对于其它场景可能还需要 Gauge、Histogram 以及 Summary 类型的指标,请参见 指标类型。
对于其它应用场景,我们会集成更多框架提供更多开箱即用的指标监控、可视化面板以及告警模板。