有奖捉虫:办公协同&微信生态&物联网文档专题 HOT
Prometheus 提供了 官方版 Golang 库 用于采集并暴露监控数据,本文为您介绍如何使用官方版 Golang 库来暴露 Golang runtime 相关的数据,以及其它一些基本简单的示例,并使用 Prometheus监控服务来采集指标展示数据等。
说明:
Golang Client API 相关的文档详见 GoDoc

安装

通过 go get 命令来安装相关依赖,示例如下:
go get github.com/prometheus/client_golang/prometheus
go get github.com/prometheus/client_golang/prometheus/promauto
go get github.com/prometheus/client_golang/prometheus/promhttp

开始(运行时指标)

1. 准备一个 HTTP 服务,路径通常使用 /metrics。可以直接使用 prometheus/promhttp 里提供的 Handler 函数。 如下是一个简单的示例应用,通过 http://localhost:2112/metrics 暴露 Golang 应用的一些默认指标数据(包括运行时指标、进程相关指标以及构建相关的指标):
package main

import (
"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 main

import (
"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 counter
myapp_processed_ops_total 666

使用 Prometheus 监控服务

上述我们提供了两个示例展示如何使用 Prometheus Golang 库来暴露应用的指标数据,但暴露的监控指标数据为文本类型,需要搭建维护额外的 Prometheus 服务来抓取指标,可能还需要额外的 Grafana 来对数据进行可视化展示。
通过使用 Prometheus 监控服务可以直接省去如上步骤,只需简单的单击操作即可使用。详情请参见 快速使用指南

打包部署应用

1. Golang 应用一般可以使用如下形式的 Dockerfile(按需修改):
FROM golang:alpine AS builder
RUN apk add --no-cache ca-certificates \\
make \\
git
COPY . /go-build
RUN cd /go-build && \\
export GO111MODULE=on && \\
export GOPROXY=https://goproxy.io && \\
go build -o 'golang-exe' path/to/main/

FROM alpine
RUN apk add --no-cache tzdata
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs
COPY --from=builder /go-build/golang-exe /usr/bin/golang-exe
ENV TZ Asia/Shanghai
CMD ["golang-exe"]
2. 镜像可以使用 腾讯云的镜像仓库,或者使用其它公有或者自有镜像仓库。
3. 需要根据应用类型定义一个 Kubernetes 的资源,这里我们使用 Deployment,示例如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: golang-app-demo
labels:
app: golang-app-demo
spec:
replicas: 3
selector:
matchLabels:
app: golang-app-demo
template:
metadata:
labels:
app: golang-app-demo
spec:
containers:
- name: golang-exe-demo:v1
image: nginx:1.14.2
ports:
- containerPort: 80
4. 同时需要 Kubernetes Service 做服务发现和负载均衡。
apiVersion: v1
kind: Service
metadata:
name: golang-app-demo
spec:
selector:
app: golang-app-demo
ports:
- protocol: TCP
port: 80
targetPort: 80
注意:
必须添加一个 Label 来标明目前的应用,Label 名不一定为 app,但是必须有类似含义的 Label 存在,其它名字的 Label 我们可以在后面添加数据采集任务的时候做 relabel 来达成目的。

添加数据采集任务

当服务运行起来之后,需要进行如下操作让腾讯云 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: 2112
# 填写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:
- golang-demo
# 填写要监控service的Label值,以定位目标service
selector:
matchLabels:
app: golang-app-demo

注意:
示例中名称为 application 的 Label 必须配置,否则无法使用我们提供一些其它的开箱即用的集成功能。更多高阶用法请参见 ServiceMonitorPodMonitor

查看监控

1. Prometheus 实例 列表,找到对应的 Prometheus 实例,单击实例ID 右侧

图标,打开您的专属 Grafana,输入您的账号密码,即可进行 Grafana 可视化大屏操作区。
2. 选择数据采集 > 集成中心,在集成中心页面找到 Golang 监控,选择 Dashboard 操作 > Dashboard 安装/升级来安装对应的 Grafana Dashboard。
3. 进入 Grafana,单击

图表,展开监控面板,单击对应的监控图表名称即可查看监控数据。





总结

本文通过两个示例展示了如何将 Golang 相关的指标暴露给 Prometheus 监控服务,以及如何使用内置的可视化的图表查看监控数据。文档只使用了计数类型 Counter 的指标,对于其它场景可能还需要 Gauge、Histogram 以及 Summary 类型的指标,可参见 指标类型
对于其它应用场景,我们会集成更多框架提供更多开箱即用的指标监控、可视化面板以及告警模板。