Java, 原创, 服务器, , , , , ,

Prometheus + Grafana 搭建流程Docker版

一、创建独立的网络

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

  1. 用户名密码都是admin, 登陆后不重置密码点Skip。
  2. 具体流程可 参考 : Grafana | Prometheus, 里面含设置数据来源和导入模板。
  3. 使用 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

其他监控还在研究中。。

(28)

Related Post