Prometheus监控自定义程序指标
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
目录
一.定义自定义指标案例
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资源监控自定义程序
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验证数据是否采集
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"就能监控到程序啦。
本文来自博客园,作者:尹正杰,转载请注明原文链接:https://www.cnblogs.com/yinzhengjie/p/19119701,个人微信: "JasonYin2020"(添加时请备注来源及意图备注,有偿付费)
当你的才华还撑不起你的野心的时候,你就应该静下心来学习。当你的能力还驾驭不了你的目标的时候,你就应该沉下心来历练。问问自己,想要怎样的人生。