通过在应用中埋点来暴露应用数据,使用阿里云Prometheus监控抓取数据,借助Prometheus Grafana大盘来展示数据,并创建报警,即可实现利用Prometheus监控Go应用的目的。本文以阿里云容器服务K8s集群和阿里云容器镜像服务为例,介绍如何通过Prometheus监控Go应用。
前提条件
在开始本教程前,确保您已经完成了以下操作:
Demo
如需快速体验如何通过Prometheus监控Go应用,您可以使用已埋点的Demo工程。
操作流程
通过阿里云Prometheus监控Go应用的操作流程如下图所示。
步骤一:为应用埋点
为应用埋点以暴露Go应用数据的操作步骤如下:
- 将监控包导入Go应用。
import (
"fmt"
"github.com/prometheus/client_golang/prometheus/promhttp"
"net/http"
"strconv"
)
- 将监控接口绑定至promhttp.Handler()。
http.Handle(path, promhttp.Handler()) //初始化一个HTTP Handler。
步骤二:上传应用
将完成埋点的应用制作成镜像并上传至阿里云容器镜像服务的镜像仓库的操作步骤如下:
- 执行以下命令重新编译模块。
- 执行以下命令构建镜像。
docker build -t <本地临时Docker镜像名称>:<本地临时Docker镜像版本号> . --no-cache
示例命令:
docker build -t prometheus-go-demo:v0 . --no-cache
- 执行以下命令为镜像打标。
sudo docker tag <本地临时Docker镜像名称>:<本地临时Docker镜像版本号> <Registry域名>/<命名空间>/<镜像名称>:<镜像版本号>
示例命令:
sudo docker tag prometheus-go-demo:v0 registry.cn-hangzhou.aliyuncs.com/testnamespace/prometheus-go-demo:v0
- 执行以下命令将镜像推送至镜像仓库。
sudo docker push <Registry域名>/<命名空间>/<镜像名称>:<镜像版本号>
示例命令:
sudo docker push registry.cn-hangzhou.aliyuncs.com/testnamespace/prometheus-go-demo:v0
步骤三:部署应用
将应用部署至容器服务K8s集群的操作步骤如下:
- 登录容器服务管理控制台。
- 在左侧导航栏,选择集群。
- 在集群列表页面,找到目标集群,在其右侧操作列单击应用管理。
- 创建容器组。
- 在左侧导航栏,选择。
- 在无状态页面,单击使用YAML创建资源。
- 在创建页面的模板代码框输入以下内容,然后单击创建。
apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1
kind: Deployment
metadata:
name: prometheus-go-demo
labels:
app: go-exporter
spec:
replicas: 2
selector:
matchLabels:
app: go-exporter
template:
metadata:
labels:
app: go-exporter
spec:
containers:
- name: prometheus-go-demo
imagePullPolicy: Always
image: <Registry域名>/<命名空间>/<镜像名称>:<镜像版本号>
ports:
- containerPort: 8077
name: arms-go-demo
示例代码:
apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1
kind: Deployment
metadata:
name: prometheus-go-demo
labels:
app: go-exporter
spec:
replicas: 2
selector:
matchLabels:
app: go-exporter
template:
metadata:
labels:
app: go-exporter
spec:
containers:
- name: prometheus-go-demo
imagePullPolicy: Always
image: registry.cn-hangzhou.aliyuncs.com/fuling/prometheus-go-demo:v0
ports:
- containerPort: 8077
name: arms-go-demo
无状态页面显示创建的容器组。

- 创建服务。
- 在左侧导航栏,选择。
- 在服务页面,单击使用YAML创建资源。
- 在创建页面的模板代码框输入以下内容,然后单击创建。
apiVersion: v1
kind: Service
metadata:
labels:
app: prometheus-go-demo
name: prometheus-go-demo
spec:
ports:
- name: arms-go-demo
port: 8077
protocol: TCP
targetPort: 8077
type: NodePort
selector:
app: prometheus-go-demo
服务页面显示创建的服务。

步骤四:配置服务发现
配置阿里云Prometheus监控的服务发现以抓取Go应用数据的操作步骤如下:
- 登录ARMS控制台。
- 在左侧导航栏选择。
- 在Prometheus监控页面的顶部菜单栏,选择K8s集群所在的地域,单击目标实例名称。
- 在左侧导航树单击服务发现,然后单击配置页签。
- 在配置页面单击ServiceMonitor页签,然后单击添加ServiceMonitor。
- 在添加ServiceMonitor对话框中输入以下内容,然后单击确定。
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
# 填写一个唯一名称
name: prometheus-go-demo
# 填写目标命名空间
namespace: default
spec:
endpoints:
- interval: 30s
# 填写Prometheus Exporter对应的Port的Name字段的值
port: arms-go-demo
# 填写Prometheus Exporter对应的Path的值
path: /metrics
namespaceSelector:
any: true
# Demo的命名空间
selector:
matchLabels:
app: prometheus-go-demo
ServiceMonitor页签下显示配置的服务发现。

步骤五:配置大盘
配置Grafana大盘以展示数据的操作步骤如下:
- 打开Grafana大盘概览页。
- 在左侧导航栏选择。
- 在Import页面的Import via grafna.com文本框,输入Prometheus提供的Go应用大盘模板ID6671,然后在其右侧,单击Load。
- 在Import页面输入以下信息,然后单击Import。
- 在Name文本框中输入自定义的大盘名称。
- 从Folder列表中,选择您的阿里云容器服务K8s集群。
- 在prometheus-apl下拉框中选择您的阿里云容器服务K8s集群。
配置完毕后的Grafana大盘如图所示。

步骤六:创建Prometheus监控报警
- 登录ARMS控制台。
- 在左侧导航栏选择。
- 在Prometheus监控页面的顶部菜单栏,选择K8s集群所在的地域,单击目标K8s集群的名称。
- 在左侧导航栏,选择报警配置。
- 在报警配置页面右上角,单击创建报警。
- 在创建报警面板,执行以下操作:
- 可选:从告警模板下拉列表,选择模板。
- 在规则名称文本框,输入规则名称,例如:网络接收压力报警。
- 在告警表达式文本框,输入告警表达式。例如:
(sum(rate(kube_state_metrics_list_total{job="kube-state-metrics",result="error"}[5m]))
/ sum(rate(kube_state_metrics_list_total{job="kube-state-metrics"}[5m]))) > 0.01
。
注意 PromQL语句中包含的$
符号会导致报错,您需要删除包含$符号的语句中=
左右两边的参数及=
。例如:将sum (rate (container_network_receive_bytes_total{instance=~"^$HostIp.*"}[1m]))
修改为sum (rate (container_network_receive_bytes_total[1m]))
。
- 在持续时间文本框,输入持续时间N,当连续N分钟满足告警条件的时候才触发告警。例如:1分钟,当告警条件连续1分钟都满足时才会发送告警。
说明 持续N分钟满足告警条件是指在连续N分钟内,您上面设置的PromQL语句条件都能满足。Prometheus默认数据采集周期为15s,如果没有连续N×60/15=4N个数据点满足告警条件(PromQL语句),就不会发送告警。如Prometheus告警规则默认持续时间为1分钟,既只有连续4个数据点都满足告警条件(PromQL语句)才会触发告警。如果您想在任何一个数据点满足告警条件(PromQL语句)就发送告警,请修改持续时间为0分钟。
- 在告警消息文本框,输入告警消息。
- 可选:在高级配置的标签区域,单击创建标签可以设置报警标签,设置的标签可用作分派规则的选项。
- 可选:在高级配置的注释区域,单击创建注释,设置键为message,设置值为 {{变量名}}告警信息。设置完成后的格式为:
message:{{变量名}}告警信息
,例如:message:{{$labels.pod_name}}重启
。
您可以自定义变量名,也可以选择已有的标签作为变量名。已有的标签包括:
- 从通知策略下拉列表,选择通知策略。
- 单击确定。
报警配置页面显示创建的报警。
