Linux: Prometheus-exporter
- TAGS: Linux
https://prometheus.io/docs/instrumenting/exporters/
指标导出器一些应用现实
grafana 模板
https://grafana.com/grafana/dashboards/
- k8s clustr: 13105
- prometheus:25537
- node: 8919(中文汉化版) 1860(首选) node
- docker:14282
- mysql:7362 mysql-exporter 14057
- redis: 763
- blackbox: 14928
- JVM:4701
- nodejs
- Node.js Exporter 14058
- https://stackabuse.com/nodejs-application-monitoring-with-prometheus-and-grafana/
- rabbitmq:
数据库
mysqld-exporter
数据库授权
CREATE USER 'mysqld_exporter'@'%' IDENTIFIED BY 'hIhO6h_j(azn=F17' WITH MAX_USER_CONNECTIONS 10; GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'mysqld_exporter'@'%'; flush privileges;
部署方法1-docker-compose
准备配置文件
cat <<\EOF> .my.cnf
[client]
user=xxx
password=xxxxx
[client.servers]
user=mysqld_exporter
password=hIhO6h_j(azn=F17
EOF
启动
cat <<\EOF> docker-compose.yml
volumes:
networks:
vm_net:
name: vm_net
driver: bridge
ipam:
config:
- subnet: 172.26.0.0/24
services:
mysqld_exporter:
image: prom/mysqld-exporter:v0.15.1
hostname: mysqld-exporter
container_name: mysqld_exporter
ports:
- 9104:9104
command:
- "--config.my-cnf=/opt/my.cnf"
volumes:
- .my.cnf:/opt/my.cnf
#restart: always
networks:
- vm_net
EOF
验证:
curl 'http://localhost:9104/probe?auth_module=client.servers&target=pc-txxx.mysql.polardb.singapore.rds.aliyuncs.com:3306' | grep mysql_version_info
pormetheus集成
- job_name: mysql
metrics_path: /probe
params:
auth_module: [client.servers]
static_configs:
- targets:
- xx:3306
labels:
project: mysql-test
- targets:
- 47.xxx:3306
labels:
project: mysql-test2
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
# The mysqld_exporter host:port
replacement: 172.xxx:9104
部署方法2-k8s
安装 mysqld-export
cat >exporter.yaml <<EOF
apiVersion: v1
data:
my.cnf: |-
[client.servers]
user=mysqld_exporter
password=hIhO6h_j(azn=F17
kind: ConfigMap
metadata:
name: mysqld-exporter-cm
namespace: monitoring
---
apiVersion: v1
kind: Service
metadata:
name: mysqld-exporter
namespace: monitoring
#annotations:
# prometheus.io/scrape: "true"
labels:
app: mysqld-exporter
spec:
selector:
app: mysqld-exporter
ports:
- name: metrics
protocol: TCP
port: 9104
targetPort: 9104
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysqld-exporter
namespace: monitoring
spec:
replicas: 1
selector:
matchLabels:
app: mysqld-exporter
template:
metadata:
#annotations:
# prometheus.io/path: "/metrics"
# prometheus.io/port: "9104"
# prometheus.io/scrape: "true"
labels:
app: mysqld-exporter
spec:
#nodeSelector:
# type: ops-prod-prometheus
#imagePullSecrets:
#- name: docker-secret
containers:
- name: mysqld-exporter
image: prom/mysqld-exporter:v0.20.0
imagePullPolicy: IfNotPresent
command:
- /bin/mysqld_exporter
- --config.my-cnf=/data/my.cnf
resources:
limits:
cpu: 300m
memory: 300Mi
requests:
cpu: 10m
memory: 10Mi
ports:
- containerPort: 9104
volumeMounts:
- mountPath: /data
name: conf
volumes:
- configMap:
defaultMode: 420
items:
- key: my.cnf
path: my.cnf
name: mysqld-exporter-cm
name: conf
---
#apiVersion: monitoring.coreos.com/v1
#kind: ServiceMonitor
#metadata:
# name: mysqld-exporter
# namespace: monitoring
# labels:
# app.kubernetes.io/name: mysqld-exporter
# app.kubernetes.io/instance: mysqld-exporter
# app.kubernetes.io/component: exporter
# release: kps
#spec:
# endpoints:
# - path: /metrics
# port: tcp-9104
# #interval: 15s
# namespaceSelector:
# matchNames:
# - monitoring
# selector:
# matchLabels:
# app: mysqld-exporter
EOF
kubectl apply -f exporter.yaml
方法1-增加 prometheus 静态配置
cat >prometheus-additional.yaml <<EOF - job_name: mysql metrics_path: /probe params: auth_module: [client.servers] static_configs: - targets: - 1xx.xx.rds.amazonaws.com:3306 labels: business: jp-test type: rds service: "my1" - targets: - xx.xx.rds.amazonaws.com:3306 labels: business: jp-test type: rds service: "my2" relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ # The mysqld_exporter host:port replacement: mysqld-exporter:9104 EOF # Update kubectl -n monitoring create secret generic additional-scrape-configs --from-file=prometheus-additional.yaml --dry-run=client -oyaml|kubectl replace -f-
方法2-ScrapeConfig
cat >mysql-scrapeconfig.yaml << EOF
# 备选方案:Prometheus Operator >= v0.65 的 ScrapeConfig CRD
# 和原来的 static_configs 几乎 1:1,实例多的时候比 ServiceMonitor 好维护
apiVersion: monitoring.coreos.com/v1alpha1
kind: ScrapeConfig
metadata:
name: mysql
namespace: monitoring
labels:
release: prometheus # 对应 Prometheus CR 的 scrapeConfigSelector
spec:
metricsPath: /probe
params:
auth_module:
- client.servers
staticConfigs:
- targets:
- 1xx.xx.rds.amazonaws.com:3306
labels:
business: jp-test
type: rds
service: "my1"
- targets:
- xx.xx.rds.amazonaws.com:3306
labels:
business: jp-test
type: rds
service: "my2"
relabelings:
- sourceLabels: [__address__]
targetLabel: __param_target
- sourceLabels: [__param_target]
targetLabel: instance
- targetLabel: __address__
# mysqld-exporter 的 host:port(跨 namespace 写全:mysqld-exporter.monitoring.svc:9104)
replacement: mysqld-exporter:9104
EOF
方法3-ServiceMonitor
cat >mysql-servicemonitor.yaml <<EOF
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: mysql
namespace: monitoring
labels:
release: kps # 让 Prometheus CR 的 serviceMonitorSelector 能选中(kube-prometheus-stack 默认)
spec:
namespaceSelector:
matchNames:
- monitoring # mysqld-exporter Service 所在的 namespace
selector:
matchLabels:
app: mysqld-exporter
endpoints:
# ---------- my1 ----------
- port: metrics
path: /probe
interval: 30s
params:
auth_module:
- client.servers
target:
- 1xx.xx.rds.amazonaws.com:3306
relabelings:
- targetLabel: job
replacement: mysql
- targetLabel: instance
replacement: 1xx.xx.rds.amazonaws.com:3306
- targetLabel: business
replacement: jp-test
- targetLabel: type
replacement: rds
- targetLabel: service
replacement: my1
# ---------- my2 ----------
- port: metrics
path: /probe
interval: 30s
params:
auth_module:
- client.servers
target:
- xx.xx.rds.amazonaws.com:3306
relabelings:
- targetLabel: job
replacement: mysql
- targetLabel: instance
replacement: xx.xx.rds.amazonaws.com:3306
- targetLabel: business
replacement: jp-test
- targetLabel: type
replacement: rds
- targetLabel: service
replacement: my2
EOF
Redis exporter
部署方法1-docker-compose
准备密码文件
cat <<\EOF> redis-pwd-file
{
"redis://redis6:6379": "",
"rediss://user1@replica.redixxxx.com:6379": "xxx"
}
EOF
启动redis-exporter
cat <<\EOF> docker-compose.yml
networks:
vm_net:
name: vm_net
driver: bridge
ipam:
config:
- subnet: 172.26.0.0/24
services:
redis_exporter:
image: oliver006/redis_exporter:v1.67.0
container_name: redis_exporter
ports:
- 9121:9121
command:
- "--redis.password-file=/opt/sample-pwd-file.json"
- '--debug'
volumes:
- ./redis-pwd-file:/opt/sample-pwd-file.json
networks:
- vm_net
EOF
验证:
curl http://127.0.0.1:9121/scrape?target=redis://xxxx:6379
部署方法2-k8s
cat >exporter.yaml <<EOF
apiVersion: v1
data:
sample-pwd-file.json: |-
{
"redis://redis6:6379": "",
"rediss://user@clustercfg.xxxx.cache.amazonaws.com:6379": "passwordxx"
}
kind: ConfigMap
metadata:
name: redis-pwd-config
namespace: monitoring
---
apiVersion: v1
kind: Service
metadata:
name: redis-exporter
namespace: monitoring
#annotations:
# prometheus.io/scrape: "true"
labels:
app: redis-exporter
spec:
selector:
app: redis-exporter
ports:
- name: tcp-9121
protocol: TCP
port: 9121
targetPort: 9121
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-exporter
namespace: monitoring
spec:
replicas: 1
selector:
matchLabels:
app: redis-exporter
template:
metadata:
#annotations:
# prometheus.io/path: "/metrics"
# prometheus.io/port: "9121"
# prometheus.io/scrape: "true"
labels:
app: redis-exporter
spec:
#nodeSelector:
# type: ops-prod-prometheus
#imagePullSecrets:
#- name: docker-secret
containers:
- name: redis-exporter
image: oliver006/redis_exporter:v1.91.1
imagePullPolicy: IfNotPresent
env:
- name: REDIS_PASSWORD_FILE
value: /data/sample-pwd-file.json
resources:
limits:
cpu: 300m
memory: 300Mi
requests:
cpu: 10m
memory: 10Mi
ports:
- containerPort: 9121
volumeMounts:
- mountPath: /data
name: redis-pwd-file
volumes:
- configMap:
defaultMode: 420
items:
- key: sample-pwd-file.json
path: sample-pwd-file.json
name: redis-pwd-config
name: redis-pwd-file
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: redis-exporter
namespace: monitoring
labels:
app.kubernetes.io/name: redis-exporter
app.kubernetes.io/instance: redis-exporter
app.kubernetes.io/version: "1.91.1"
app.kubernetes.io/component: exporter
release: kps
spec:
endpoints:
- path: /metrics
port: tcp-9121
#interval: 15s
namespaceSelector:
matchNames:
- monitoring
selector:
matchLabels:
app: redis-exporter
EOF
pormetheus集成
- job_name: redis-exporter
metrics_path: /scrape
static_configs:
- targets:
- redis://user1@replica.redixxxx.com:6379
labels:
dbtype: "redis"
project: test
- targets:
- redis://xxx:6379
labels:
dbtype: "redis"
project: test2
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 172.xxx:9121
部署方法1-docker-compose
启动mongodb-exporter
cat <<\EOF> docker-compose.yml
networks:
vm_net:
name: vm_net
driver: bridge
ipam:
config:
- subnet: 172.26.0.0/24
services:
mongodb-exporter:
image: percona/mongodb_exporter:0.43
container_name: mongodb-exporter
#environment:
# MONGODB_URI: "mongodb://user:pass@host1:27017,host2:27017/admin"
ports:
- 9216:9216
command:
- --mongodb.uri=mongodb://root:xxxs.com:3717,xxx.com:3717/admin?replicaSet=mgset-310035630,mongodb://root:xxx14@dxxcom:3717,ddsxxx:3717/admin?replicaSet=mgset-310037394
- '--collect-all'
- '--split-cluster=true'
networks:
- vm_net
EOF
验证:
curl 127.0.0.1:9216/scrape?target=mongodb://ddsxxx:3717|grep mongodb_up
pormetheus集成
- job_name: mongodb-exporter
metrics_path: /scrape
static_configs:
- targets:
- mongodb://dxxx:3717
labels:
dbtype: "mongodb"
project: "测试1"
- targets:
- mongodb://ddxxx:3717
labels:
dbtype: "mongodb"
project: "测试2"
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 172.xxx:9216
硬件相关
问题跟踪器和持续集成
消息系统
RocketMQ exporter
https://github.com/apache/rocketmq-exporter
启动redis-exporter
cat <<\EOF> docker-compose.yml
networks:
vm_net:
name: vm_net
driver: bridge
ipam:
config:
- subnet: 172.26.0.0/24
services:
rocketmq-exporter:
image: apache/rocketmq-exporter:0.0.2-SNAPSHOT
container_name: rocketmq-exporter
ports:
- 5557:5557
entrypoint:
- java
- -jar
- rocketmq-exporter.jar
- --server.port=5557
- --rocketmq.config.namesrvAddr=127.0.0.1:9876
- --rocketmq.config.enableACL=true
- --rocketmq.config.accessKey=C65GKxxxx
- --rocketmq.config.secretKey=oqHc0xxxx
deploy:
resources:
limits:
cpus: '2'
memory: 2048M
reservations:
cpus: '0.25'
memory: 256M
networks:
- vm_net
EOF
pormetheus集成
- job_name: rocketmq-exporter
static_configs:
- targets: ['172.xxx:5557']
RabbitMQ exporter
添加监控用户 在 Amazon MQ Web 控制台创建监控用户步骤
- 打开你的 Amazon MQ RabbitMQ Web 控制台(截图里那个 https 地址)
- 登录(用初始 admin 账号)
- 进入 Admin > Users > Add a user
- Username:rmq-monitor
- Password:设置强密码
- Tags:填 monitoring (不要写 administrator)
- 设置 vhost 权限(默认 vhost
/)- Read regex:
.* - Write regex: 留空
- Configure regex: 留空
- Read regex:
#验证账号是否可用 curl -u rmq-monitor:你的密码 https://b-16993496-8824-465b-8fb7-94f1c35b3f78.mq.ap-southeast-1.on.aws/api/overview
部署方法2-k8s
cat >exporter.yaml<<\EOF
apiVersion: v1
kind: Secret
metadata:
name: rabbitmq-exporter-secret
namespace: monitoring
type: Opaque
stringData:
RABBIT_PASSWORD: "xxxxx"
---
apiVersion: v1
kind: Service
metadata:
name: rabbitmq-exporter
namespace: monitoring
#annotations:
# prometheus.io/scrape: "true"
labels:
app: rabbitmq-exporter
spec:
selector:
app: rabbitmq-exporter
ports:
- name: tcp-9419
protocol: TCP
port: 9419
targetPort: 9419
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: rabbitmq-exporter
namespace: monitoring
spec:
replicas: 1
selector:
matchLabels:
app: rabbitmq-exporter
template:
metadata:
#annotations:
# prometheus.io/path: "/metrics"
# prometheus.io/port: "9419"
# prometheus.io/scrape: "true"
labels:
app: rabbitmq-exporter
spec:
#nodeSelector:
# type: ops-prod-prometheus
#imagePullSecrets:
#- name: docker-secret
containers:
- name: rabbitmq-exporter
image: kbudde/rabbitmq-exporter:1.0.0
imagePullPolicy: IfNotPresent
env:
- name: RABBIT_URL
value: "https://xx.mq.ap-southeast-1.on.aws"
- name: RABBIT_USER
value: "rmq-monitor"
- name: RABBIT_PASSWORD
valueFrom:
secretKeyRef:
name: rabbitmq-exporter-secret
key: RABBIT_PASSWORD
- name: PUBLISH_PORT
value: "9419"
- name: RABBIT_TIMEOUT
value: "30"
# Amazon MQ 不支持 bert,必须显式关掉,否则 overview 采集会失败
- name: RABBIT_CAPABILITIES
value: "no_sort"
# 不采集队列长列表,防止指标爆炸;生产队列数 >50 时按需调整
- name: RABBIT_EXPORTERS
value: "overview,queue,node,exchange"
#value: "overview,queue"
#不采集队列长列表,防止指标爆炸,按需开启
#生产,队列数量 >50
#排除所有 *_details 系列速率桶指标,保留核心指标:队列深度、unacked 数量、消费者数、内存占用。
- name: EXCLUDE_METRICS
value: "queue_totals.messages_ready_details,queue_totals.messages_unacknowledged_details,message_stats.deliver_details,message_stats.publish_details,message_stats.ack_details,message_stats.redeliver_details"
# 超过阈值就不再逐队列上报,避免指标爆炸
- name: MAX_QUEUES
value: "1000"
resources:
limits:
cpu: 300m
memory: 300Mi
requests:
cpu: 10m
memory: 10Mi
ports:
- containerPort: 9419
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: rabbitmq-exporter
namespace: monitoring
labels:
app.kubernetes.io/name: rabbitmq-exporter
app.kubernetes.io/instance: rabbitmq-exporter
app.kubernetes.io/component: exporter
release: kps
# Amazon MQ 的 management API 查询队列列表本身会消耗 broker CPU,采集间隔不要小于 30s,推荐 60s
spec:
endpoints:
- path: /metrics
port: tcp-9419
interval: 60s
namespaceSelector:
matchNames:
- monitoring
selector:
matchLabels:
app: rabbitmq-exporter
EOF