Java, 原创, 服务器Docker, Exporter, Grafana, JAVA, Kafka, Prometheus, Redis
Prometheus + Grafana 搭建流程Docker版
- by chenxue4076
- 2 years ago
一、创建独立的网络
docker network create -d bridge --gateway 172.22.0.1 --subnet 172.22.0.0/16 mynet
二、文档说明
以下需要配置文件的,都可以先用docker安装一个默认的,在将配置文件拷贝出来,重新使用配置文件安装。
三、创建并启动prometheus服务
- 因配置默认就监控了自己,所以不需要额外配置监控,Prometheus 配置文件列表如下
# data/dockers/monitor/prometheus
prometheus.yml
rules
---- node_alerts.yml
configs
---- node-exporter.yml
---- mysql.yml
---- ...
- 创建prometheus服务
docker run --name prometheus --network mynet \
-p 9090:9090 \
-v /data/dockers/monitor/prometheus:/etc/prometheus \
-v /etc/localtime:/etc/localtime:ro \
-d prom/prometheus
四、创建并启动Grafana服务,并设置监控
docker run --name grafana --network mynet \
-p 3000:3000 \
-v /data/dockers/monitor/grafana/grafana.ini:/etc/grafana/grafana.ini \
-v /data/logs/grafana:/var/log/grafana \
-d grafana/grafana-enterprise
如果不是使用子路径 比如 http://xxxx/grafana/
访问可以不需要grafana.ini
的配置文件。
五、登录grafana
- 用户名密码都是admin, 登陆后不重置密码点Skip。
- 具体流程可 参考 : Grafana | Prometheus, 里面含设置数据来源和导入模板。
- 使用 Prometheus 2.0 Stats 模板。
六、添加服务器监控 node-exporter
- 主要监控 CPU,内存,磁盘等信息。
- 在需要监控的服务器上安装 node-exporter,所以服务器上需要开通9100的访问端口。
docker run --name node-exporter \
-p 9100:9100 \
-v /etc/localtime:/etc/localtime:ro \
-d prom/node-exporter
- 在prometheus 配置文件
prometheus.yml
中监听此服务器地址 xxxx:9100, 可以有三种配置方式,请看下面安装Mysql的配置
- job_name: "node-exporter"
static_configs:
- targets: ["node-exporter:9100"]
- 首次在Grafana上看需要先导入模板,去官网Grafana-Dashboards搜索 “Node Exporter” 可以可以找到相关模板,如我们使用
1 Node Exporter Dashboard 22/04/13 ConsulManager自动同步版
2种方法导入,1:使用ID 8919,在grafana后台输入此ID,在导入,2:下载json,在grafana中导入。
七、监控MySql服务
- 安装mysqld_exporter准备工作,设置配置文件
.my.cnf
或自定义配置文件名
# data/dockers/monitor/mysqld-exporter
# mysql-prod.cnf
[client]
host=mysql
port=3306
user=promethues
password=Promethues@123
# .my.cnf
[client]
host=rs-xxxxx.aliyun.com
port=3306
user=promethues
password=Promethues@666
- 给MySql服务器添加Mysqld_exporter服务器的IP和账号访问权限。
create user 'promethues'@'Prometheus服务器IP' IDENTIFIED BY 'Promethues@666';
grant select,replication client,process on *.* to 'promethues'@'Prometheus服务器IP';
flush privileges;
- 安装
Mysqld_exporter
docker run --name=mysqld-exporter-test --network mynet \
-v /data/dockers/monitor/mysqld-exporter:/home \
-d prom/mysqld-exporter --config.my-cnf="/home/.my.cnf"
docker run --name=mysqld-exporter-prod--network mynet \
-v /data/dockers/monitor/mysqld-exporter:/home \
-d prom/mysqld-exporter --config.my-cnf="/home/my-prod.cnf"
- 在prometheus 配置文件中监听Mysqld服务地址 xxxx:9104
简单的配置
# 简单配置
- job_name: "mysqld"
static_configs:
- targets: ["mysqld-exporter-test:9104", "mysqld-exporter-prod:9104"]
带labels说明的配置
# 或 带tag的配置
- job_name: "mysqld"
static_configs:
- targets: ["mysqld-exporter-test:9104"]
labels:
service: MySql测试环境
group: Test
- targets: ["mysqld-exporter-prod:9104"]
labels:
service: MySql正式
group: Prod
基于文件的配置
# 或 基于文件的配置
- job_name: "mysqld"
file_sd_configs:
- files:
- configs/mysql.yml
refresh_interval: 15s
relabel_configs:
- source_labels: [ '__address__' ]
regex: (.*)
target_label: instance
replacement: $1
# configs/mysql.yml
- targets:
- mysqld-exporter-test:9104
labels:
service: MySql测试环境
group: Test
- targets:
- mysqld-exporter-prod:9104
labels:
service: MySql正式
group: Prod
八、添加报警模块
- 配置报警模板。
# alertmanager/alert.tpl
{{ define "email.from" }}a@a.com{{ end }}
{{ define "email.to" }}a@a.com, b@b.com{{ end }}
{{ define "email.to.html" }}
{{- if gt (len .Alerts.Firing) 0 -}}{{ range .Alerts }}
<h2>@告警通知</h2>
告警程序: prometheus_alert <br>
告警级别: {{ .Labels.severity }} 级 <br>
告警类型: {{ .Labels.alertname }} <br>
故障主机: {{ .Labels.instance }} <br>
告警主题: {{ .Annotations.summary }} <br>
告警详情: {{ .Annotations.description }} <br>
触发时间: {{ .StartsAt.Local.Format "2006-01-02 15:04:05" }} <br>
{{ end }}{{ end -}}
{{- if gt (len .Alerts.Resolved) 0 -}}{{ range .Alerts }}
<h2>@告警恢复</h2>
告警程序: prometheus_alert <br>
故障主机: {{ .Labels.instance }}<br>
故障主题: {{ .Annotations.summary }}<br>
告警详情: {{ .Annotations.description }}<br>
告警时间: {{ .StartsAt.Local.Format "2006-01-02 15:04:05" }}<br>
恢复时间: {{ .EndsAt.Local.Format "2006-01-02 15:04:05" }}<br>
{{ end }}{{ end -}}
{{- end }}
- 配置报警规则
# alertmanager/alertmanager.yml
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.163.com:465'
smtp_from: 'a@a.com'
smtp_auth_username: 'a@a.com'
smtp_auth_password: 'xxxx'
smtp_require_tls: false
templates:
- './alert.tpl'
route:
group_by: ['alertname']
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receiver: 'email'
routes:
- receiver: 'web.hook'
match:
severity: Disaster
receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://127.0.0.1:5001/'
- name: 'email'
email_configs:
- to: '{{ template "email.to"}}'
html: '{{ template "email.to.html" .}}'
send_resolved: true # 故障恢复后通知
- name: 'wechat'
wechat_configs:
- corp_id: xxxxx # 企业信息("我的企业"--->"CorpID"[在底部])
to_user: '@all' # 发送给企业微信用户的ID,这里是所有人
# to_party: '' 接收部门ID
agent_id: 0000000 # 企业微信("企业应用"-->"自定应用"[Prometheus]--> "AgentId")
api_secret: xxxxx # 企业微信("企业应用"-->"自定应用"[Prometheus]--> "Secret")
message: '{{ template "email.to.html" .}}' # 发送内容(调用模板)
send_resolved: true # 故障恢复后通知
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
- 启动报警模块
alertmanager
docker run --name alertmanager --network mynet \
-v /data/dockers/monitor/alertmanager:/etc/alertmanager \
-d prom/alertmanager
# 9093 暴漏端口
九、监控Java应用JVM。
因为我创建的应用还整合了 skywalking, 可以通过另外一篇文件看接入skywalking流程。
这里简单举个例子, jar包 /data/apps/xxl-job-admin/xxl-job-admin-1.0.0.jar
docker run --name xxl-job-admin --network mynet \
-e SW_AGENT_NAME=prod::xxl-job-admin \
-e SW_AGENT_NAMESPACE=core \
-e SW_AGENT_COLLECTOR_BACKEND_SERVICES=skywaling-oap:11800 \
-e SW_GRPC_LOG_SERVER_HOST=skywaling-oap \
-e ACTIVE_ENV=prod \
-e APP_NAME=xxl-job-admin-1.0.0 \
-v /data/apps/xxl-job-admin:/apps \
-v /data/logs/xxl-job-admin:/skywalking/logs \
-v /etc/localtime:/etc/localtime:ro \
-p 8080:8080 \
-d jdk17-skywalking:v1.0.0
Grafana JVM模板ID是4701,直接导入该模板。
prometheus/prometheus.yml
文件配置
- job_name: "xxl-job-admin"
metrics_path: "/xxl-job-admin/actuator/prometheus"
static_configs:
- targets: ["xxl-job-admin:8080"]
labels:
service: 任务调度-测试
group: Test
- targets: ["another-java-app:8088"]
labels:
service: 任务调度-正式
group: Prod
十、监控Redis
安装redis_exporter
docker run --name redis-exporter --network mynet \
-e REDIS_ADDR=redis://xxxxx:6379 \
-e REDIS_PASSWORD=aaaaa\
-d oliver006/redis_exporter
配置 prometheus/prometheus.yml
## config for the multiple Redis targets that the exporter will scrape
- job_name: redis_exporter_targets
static_configs:
- targets:
- redis://first-redis-host:6379
- redis://second-redis-host:6379
metrics_path: /scrape
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: redis-exporter:9121
## config for scraping the exporter itself
- job_name: redis-exporter
static_configs:
- targets:
- redis-exporter:9121
labels:
service: Redis监控
十一、监控Kafka
安装Kafka_exporter
docker run --name kafka-exporter --network mynet \
-d danielqsj/kafka-exporter \
--kafka.server=xxxx:9092 \
--sasl.enabled \
--sasl.mechanism=plain \
--sasl.username=xxx\
--sasl.password=xxxx
配置 prometheus/prometheus.yml
- job_name: "kafka-exporter"
static_configs:
- targets:
- kafka-exporter:9308
labels:
service: Kafka监控
group: Prod
其他监控还在研究中。。
(459)