惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
U
Unit 42
Google DeepMind News
Google DeepMind News
B
Blog RSS Feed
S
SegmentFault 最新的问题
阮一峰的网络日志
阮一峰的网络日志
雷峰网
雷峰网
Microsoft Security Blog
Microsoft Security Blog
爱范儿
爱范儿
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园_首页
Apple Machine Learning Research
Apple Machine Learning Research
罗磊的独立博客
GbyAI
GbyAI
Stack Overflow Blog
Stack Overflow Blog
Martin Fowler
Martin Fowler
宝玉的分享
宝玉的分享
L
LangChain Blog
Engineering at Meta
Engineering at Meta
量子位
有赞技术团队
有赞技术团队
博客园 - 【当耐特】
A
About on SuperTechFans
Y
Y Combinator Blog

博客园 - 尹正杰

Categraf使用指南 window系统部署Claude Code实战 N9E集群部署 Ubuntu 24.04 LTS部署Codex实战 aiops运维平台从0到1部署实战 aiops平台环境部署 TKE集群LoadBalancer映射案例 k8s集群为每个节点分配不通的ippool实战 ansible剧本实现一键升级K8S集群的NVIDIA GPU驱动 vmagent采集etcd数据并写入victoriametrics集群 VictoriaMetrics集群部署实战 Squid正向代理实战 kubespray生产故障案例之kubelet启动参数案例 filebeat指定名称空间采集pod数据 Calico自定义Ipool实战 ansible剧本实现kibana的部署和卸载 ansible剧本应用案例集合2 ansible剧本实现磁盘格式化 Ansible急速入门实战篇 ansible快速入门篇 k8s集群管理 kubesray实战 kubespray实战案例 kubespray管理k8s的worker集群扩缩容 kubespray快速部署k8s集群实战 Kubeasz使用吐槽博客专题 Kubeasz基于ezctl实现etcd集群的管理实战 Kubeasz基于ezctl实现k8s集群一键升级 Calico启用纯BGP模式+RR实战案例 Calico 底层原理及IPIP(依赖BGP协议))和vxlan(不依赖BGP)工作模式切换
Prometheus监控自定义程序指标
尹正杰 · 2025-09-29 · via 博客园 - 尹正杰

                                              作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.定义自定义指标案例

1.定义自定义指标的初衷

我们使用Prometheus-adapter可以监控自定义指标,为了实现自定义指标的HPA,我们还需要一个Pod提供指标。

为了方便测试,我们可以使用Golang编写一个登录接口"/login",一旦访问该接口就进行计数统计。

2.编写代码

	1.安装Golang环境
[root@master241 ~]# go version
go version go1.25.0 linux/amd64
[root@master241 ~]# 
	
参考链接:
	https://www.cnblogs.com/yinzhengjie/p/18148540


	2.初始化项目
[root@master241 ~]# mkdir /yinzhengjie-devops
[root@master241 ~]# cd /yinzhengjie-devops
[root@master241 yinzhengjie-devops]# 
[root@master241 yinzhengjie-devops]# go mod init k8s-devops
go: creating new go.mod: module k8s-devops
[root@master241 yinzhengjie-devops]# 
[root@master241 yinzhengjie-devops]# ll
total 12
drwxr-xr-x  2 root root 4096 Sep 26 15:30 ./
drwxr-xr-x 22 root root 4096 Sep 26 15:30 ../
-rw-r--r--  1 root root   27 Sep 26 15:30 go.mod
[root@master241 yinzhengjie-devops]# 
[root@master241 yinzhengjie-devops]# cat go.mod 
module k8s-devops

go 1.18
[root@master241 yinzhengjie-devops]# 

	
	3.编写代码
[root@master241 yinzhengjie-devops]# cat main.go 
package main

import (
	"fmt"
	"github.com/prometheus/client_golang/prometheus"
	"github.com/prometheus/client_golang/prometheus/promhttp"
	"net/http"
)


var (
	// 定义一个myMetrics指标,其类型为"Counter"
	myMetrics = prometheus.NewCounter(prometheus.CounterOpts{
		Name: "yinzhengjie_application_login_api",
		Help: "Count the number of visits to the /login interface",
	})
)

func init() {
	// 注册我们自定义的metrics指标
	prometheus.DefaultRegisterer.MustRegister(myMetrics)
}

func BlogHandler(w http.ResponseWriter, r *http.Request) {
	// 每当访问我们的接口后,都会让Counter计数器加1.
	myMetrics.Inc()
	fmt.Fprintf(w, "https://www.cnblogs.com/yinzhengjie\n")
}

func main() {
	http.Handle("/metrics", promhttp.Handler())
    http.HandleFunc("/login", BlogHandler)
    fmt.Println("欢迎使用尹正杰测试的系统,可访问接口: /login和/metrics")
	http.ListenAndServe(":8080", nil)
}
[root@master241 yinzhengjie-devops]# 

3.运行测试

	1.导入依赖包
[root@master241 yinzhengjie-devops]# go mod tidy

	2.编译代码
[root@master241 yinzhengjie-devops]# go build -o yinzhengjie-app main.go 
[root@master241 yinzhengjie-devops]# 
[root@master241 yinzhengjie-devops]# ll 
total 12044
drwxr-xr-x  2 root root     4096 Sep 26 15:58 ./
drwxr-xr-x 22 root root     4096 Sep 26 15:30 ../
-rw-r--r--  1 root root      584 Sep 26 15:55 go.mod
-rw-r--r--  1 root root     4034 Sep 26 15:55 go.sum
-rw-r--r--  1 root root      856 Sep 26 15:58 main.go
-rwxr-xr-x  1 root root 12310014 Sep 26 15:58 yinzhengjie-app*
[root@master241 yinzhengjie-devops]# 
[root@master241 yinzhengjie-devops]# ./yinzhengjie-app 
欢迎使用尹正杰测试的系统,可访问接口: /login和/metrics

	
	3.运行测试
[root@master241 ~]# for i in `seq 10`; do curl 10.0.0.241:8080/login;done  # 客户端访问10次
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
[root@master241 ~]# 
[root@master241 ~]# curl -s 10.0.0.241:8080/metrics | grep yinzhengjie  # 查看我们的监控指标是否正确。
# HELP yinzhengjie_application_login_api Count the number of visits to the /login interface
# TYPE yinzhengjie_application_login_api counter
yinzhengjie_application_login_api 10
[root@master241 ~]# 
 

4.编写Dockerfile构建Golang程序

	1.编写Dockerfile
[root@docker101 yinzhengjie-devops]# ll
total 24
drwxr-xr-x 2 root root 4096 Sep 26 17:49 ./
drwx------ 7 root root 4096 Sep 26 17:49 ../
-rw-r--r-- 1 root root  756 Sep 26 17:49 Dockerfile
-rw-r--r-- 1 root root  584 Sep 26 16:53 go.mod
-rw-r--r-- 1 root root 4034 Sep 26 16:53 go.sum
-rw-r--r-- 1 root root  939 Sep 26 16:53 main.go
[root@docker101 yinzhengjie-devops]# 
[root@docker101 yinzhengjie-devops]# cat Dockerfile 
FROM golang:1.25-alpine AS base

WORKDIR /yinzhengjie

LABEL auther=YinZhengJie \
      wechat=JasonYin2020 \
      email=y1053419035@qq.com

ENV GOPROXY= https://goproxy.cn ,direct

ADD . .

RUN sed -i 's#https\?://dl-cdn.alpinelinux.org/alpine#https://mirrors.tuna.tsinghua.edu.cn/alpine#g' /etc/apk/repositories && \
    apk update && \
    apk add --no-cache upx ca-certificates tzdata && \
    CGO_ENABLE=0 go build -o yinzhengjie-app main.go 


FROM registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1

COPY --from=base /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
COPY --from=base /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs
COPY --from=base /yinzhengjie/yinzhengjie-app /yinzhengjie-app

EXPOSE 8080

ENTRYPOINT ["/yinzhengjie-app"]

[root@docker101 yinzhengjie-devops]# 


	2.编译镜像
[root@docker101 yinzhengjie-devops]# docker  build -t registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:login .
[root@docker101 yinzhengjie-devops]# 
[root@docker101 yinzhengjie-devops]# docker  image ls registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:login 
REPOSITORY                                               TAG       IMAGE ID       CREATED          SIZE
registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps   login     fd91204b5e30   15 seconds ago   35.4MB
[root@docker101 yinzhengjie-devops]# 


	3.将镜像推送到阿里云仓库
[root@docker101 yinzhengjie-devops]# docker login --username=yinzhengjie registry.cn-hangzhou.aliyuncs.com
Password: 

WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@docker101 yinzhengjie-devops]# 
[root@docker101 yinzhengjie-devops]# 
[root@docker101 yinzhengjie-devops]# docker  image push registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:login 
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps]
18cfcc1a97fc: Pushed 
6a8530530e94: Pushed 
662bc90503ca: Pushed 
8e2be8913e57: Layer already exists 
9d5b000ce7c7: Layer already exists 
b8dbe22b95f7: Layer already exists 
c39c1c35e3e8: Layer already exists 
5f66747c8a72: Layer already exists 
15d7cdc64789: Layer already exists 
7fcb75871b21: Layer already exists 
login: digest: sha256:f930057909b65971f4a4762a09b4f6f7fb2def21ec7062de793e1898ef13dd55 size: 2407
[root@docker101 yinzhengjie-devops]# 
[root@docker101 yinzhengjie-devops]# docker  logout registry.cn-hangzhou.aliyuncs.com
Removing login credentials for registry.cn-hangzhou.aliyuncs.com
[root@docker101 yinzhengjie-devops]# 

5.K8S部署服务

	1.编写资源清单
[root@master241 case-demo]# cat 03-deploy-login.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-login
spec:
  replicas: 1
  selector:
    matchLabels:
      apps: login
  template:
    metadata:
      labels:
        apps: login
      annotations:
        prometheus.io/scrape: 'true'
        prometheus.io/port: '8080'
        prometheus.io/path: 'metrics'
    spec:
      containers:
      - name: c1
        image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:login
        resources:
          requests:
            memory: 100Mi
            cpu: 100m
          limits:
            cpu: 200m
            memory: 200Mi
        ports:
        - containerPort: 8080
          name: login-api

---

apiVersion: v1
kind: Service
metadata:
  name: svc-login
  labels:
    apps: login
spec:
  ports:
  - port: 8080
    targetPort: login-api
    name: login
  selector:
    apps: login
  type: ClusterIP
[root@master241 case-demo]# 


	2.测试验证
[root@master241 case-demo]# kubectl apply -f 03-deploy-login.yaml 
deployment.apps/deploy-login created
service/svc-login created
[root@master241 case-demo]# 
[root@master241 case-demo]# kubectl get svc,po -o wide -l apps=login
NAME                TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE   SELECTOR
service/svc-login   ClusterIP   10.198.9.62   <none>        8080/TCP   5s    apps=login

NAME                               READY   STATUS    RESTARTS   AGE   IP              NODE        NOMINATED NODE   READINESS GATES
pod/deploy-login-69dddf6db-9vjsq   1/1     Running   0          5s    10.100.207.33   worker243   <none>           <none>
[root@master241 case-demo]# 
[root@master241 case-demo]# curl 10.198.9.62:8080/login
https://www.cnblogs.com/yinzhengjie
[root@master241 case-demo]# 
[root@master241 case-demo]# curl -s 10.198.9.62:8080/metrics | grep yinzhengjie
# HELP yinzhengjie_application_login_api Count the number of visits to the /login interface
# TYPE yinzhengjie_application_login_api counter
yinzhengjie_application_login_api 1
[root@master241 case-demo]# 

二.Prometheus-operator监控自定义程序

1.部署Prometheus-operator

参考链接:
	https://www.cnblogs.com/yinzhengjie

2.编写smon资源监控自定义程序

QQ_1758969453083

	1.编写资源清单
[root@master241 case-demo]# cat 04-smon-login-app.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: yinzhengjie-smon-login
spec:
  endpoints:
  - interval: 3s
    port: "login"
  namespaceSelector:
    matchNames:
    - default
  selector:
    matchLabels:
      apps: login

[root@master241 case-demo]# 


	2.创建资源
[root@master241 case-demo]# kubectl apply -f  04-smon-login-app.yaml
servicemonitor.monitoring.coreos.com/yinzhengjie-smon-login created
[root@master241 case-demo]# 


	3.访问Prometheus的WebUI查看taget是否监控
如上图所示,我们成功监控到咱们的目标程序啦~

3.Prometheus验证数据是否采集

QQ_1758969734025

	1.客户端访问测试
[root@master241 case-demo]# kubectl get svc,pods -l apps=login -o wide
NAME                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE    SELECTOR
service/svc-login   ClusterIP   10.205.204.241   <none>        8080/TCP   4m4s   apps=login

NAME                               READY   STATUS    RESTARTS   AGE    IP              NODE        NOMINATED NODE   READINESS GATES
pod/deploy-login-f5d5d7695-jc2dj   1/1     Running   0          4m4s   10.100.207.46   worker243   <none>           <none>
[root@master241 case-demo]# 
[root@master241 case-demo]# for i in `seq 10`; do curl 10.205.204.241:8080/login;done
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
https://www.cnblogs.com/yinzhengjie
[root@master241 case-demo]# 

	
	2.Prometheus的webui验证
如上图所示,我们可以在命令行直接搜索关键字"yinzhengjie_application_login_api"就能监控到程序啦。