先简单了解一下 prometheus
普罗米修斯的主要特点是:
- 多维数据模型,通过公制名称和密钥/值对识别时间系列数据
- PromQL,一种灵活的查询语言,利用这种维度
- 不依赖分布式存储;单个服务器节点是自主的
- 时间系列集合通过 Http 的拉动模型发生
- 推时间系列通过中间网关支持
- 通过服务发现或静态配置发现目标
- 图形和仪表板支持的多种模式
结构及原理
此图说明了普罗米修斯的结构及其一些生态系统组成部分:
图片来源:概述|普罗 米修斯 (prometheus.io)
更多详细信息可以去prometheus官方文档查看:概述|普罗 米修斯 (prometheus.io)
接下来开始安装使用prometheus
环境准备
服务器:Centos 7.6 IP:192.168.10.10 服务器建议关闭防火墙,需要用到的端口为 9090,9100 ,9093,3000
收集存储组件: Prometheus: prometheus-2.29.1.linux-amd64.tar.gz
展示组件:grafana: 8.1.1
告警组件:alertmanager: alertmanager-0.23.0.linux-amd64.tar.gz
采集组件:node_exporter: node_exporter-1.2.2.linux-amd64.tar.gz
更多组件下载连接:Download | Prometheus
第一步:安装prometheus并修改配置文件
#下载安装包: wget https://github.com/prometheus/prometheus/releases/download/v2.29.1/prometheus-2.29.1.linux-amd64.tar.gz #解压: tar -zxvf prometheus-2.29.1.linux-amd64.tar.gz mv prometheus-2.29.1.linux-amd64 prometheus #修改配置文件: cd /prometheus vim prometheus.yml # my global config global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. # scrape_timeout is set to the global default (10s). # 此处可以配置prometheus收集的监控数据存储到外置数据库,默认存储在自带的sqlite中. #remote_write: # - url: "http://localhost:8086/api/v1/prom/write?db=prometheus" #remote_read: # - url: "http://localhost:8086/api/v1/prom/read?db=prometheus" # Alertmanager configuration # alertmanager 告警配置 alerting: alertmanagers: - static_configs: - targets: - "localhost:9093" # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. # 定义alertmanager告警规则 rule_files: - "/volumes01/prometheus/rules/*.yaml" # A scrape configuration containing exactly one endpoint to scrape: # Here it's Prometheus itself. scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. #- job_name: "prometheus" # metrics_path defaults to '/metrics' # scheme defaults to 'http'. #static_configs: # - targets: ["localhost:9090"] - job_name: 'linux' file_sd_configs: #引入外部配置文件,当添加被监控的主机时能够动态刷新配置的功能 - files: - "/volumes01/prometheus/node/node-linux.yaml" #外部配置文件路径,文件内容如下 refresh_interval: 5s # 多久刷新一次配置 # 保存退出 ------------------------------------------------------------------------------------------- # 创建job监听文件 mkdir node vim node/node-linux.yaml #配置被监控主机信息 - targets: - "192.168.10.10:9100" labels: instance: "192.168.10.10" role: "linux" item: "XXX系统" # 保存退出 ------------------------------------------------------------------------------------------- # 创建告警规则 mkdir rules vim rules/linux.yaml groups: - name: ECS-Alert rules: - alert: 内存使用率过高 expr: 100-(node_memory_Buffers_bytes+node_memory_Cached_bytes+node_memory_MemFree_bytes)/node_memory_MemTotal_bytes*100 > 90 for: 3m # 告警持续时间,超过这个时间才会发送给alertmanager labels: severity: warning annotations: summary: "{{ $labels.job }} 内存使用率过高" description: "{{$labels.job}}的{{ $labels.instance }}服务器内存使用率超过90%,当前使用率[{{ $value }}]." - alert: cpu使用率过高 expr: (1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance)) * 100 > 90 for: 5m labels: severity: warning annotations: summary: "{{ $labels.job }} cpu使用率过高" description: "{{$labels.job}}的{{ $labels.instance }}服务器cpu使用率超过90%,当前使用率[{{ $value }}]." - alert: 硬盘空间不足 expr: max((node_filesystem_size_bytes{fstype=~"ext.?|xfs|nfs"}-node_filesystem_free_bytes{fstype=~"ext.?|xfs|nfs"}) *100/(node_filesystem_avail_bytes {fstype=~"ext.?|xfs|nfs"}+(node_filesystem_size_bytes{fstype=~"ext.?|xfs|nfs"}-node_filesystem_free_bytes{fstype=~"ext.?|xfs|nfs"})))by(instance) > 90 for: 10m labels: severity: warning annotations: summary: "{{ $labels.job }} 硬盘空间不足" description: "{{$labels.job}}的{{ $labels.instance }}服务器硬盘使用率超过90%,挂载点 {{ $labels.mountpoint }},当前使用率[{{ $value }}]." - alert: 服务器宕机 expr: up == 0 for: 10s labels: severity: error annotations: summary: "{{ $labels.job }} 服务器宕机" description: "{{$labels.job}}的{{ $labels.instance }}服务器已宕机,请进行检查." # 保存退出
第二步:安装node_exporter
# 下载安装包 wget https://github.com/prometheus/node_exporter/releases/download/v1.2.2/node_exporter-1.2.2.linux-amd64.tar.gz # 解压 tar -zxvf node_exporter-1.2.2.linux-amd64.tar.gz mv node_exporter-1.2.2.linux-amd64 node_exporter # 启动 nohup ./node_exporter & # 可以加入系统服务文章末尾会统一说明
第三步:安装alertmanager,配置告警模板
# 下载安装包 wget https://github.com/prometheus/alertmanager/releases/download/v0.23.0/alertmanager-0.23.0.linux-amd64.tar.gz # 解压 tar -zxvf alertmanager-0.23.0.linux-amd64.tar.gz mv alertmanager-0.23.0.linux-amd64 alertmanager # 修改配置文件 cd alertmanager vim alertmanager.yml # 全局配置项 global: resolve_timeout: 5m #处理超时时间,默认为5min smtp_from: '13591899785@163.com' smtp_smarthost: 'smtp.163.com:465' smtp_auth_username: '13591899785@163.com' smtp_auth_password: '此处不是邮箱的密码,是生成的终端登录密码' smtp_require_tls: false # 定义模板信息 templates: - 'template/*.tmpl' # 定义路由树信息 route: group_by: ['ECS'] # 报警分组依据 group_wait: 10s # 最初即第一次等待多久时间发送一组警报的通知 group_interval: 10s # 在发送新警报前的等待时间 repeat_interval: 6h # 发送重复警报的周期 对于email配置中,此项不可以设置过低,否则将会由于邮件发送太多频繁,被smtp服务器拒绝 receiver: 'email' # 发送警报的接收者的名称,以下receivers name的名称 # 定义警报接收者信息 receivers: - name: 'email' # 警报 email_configs: # 邮箱配置 - to: '13591899785@163.com' # 接收警报的email配置 html: '{{ template "email.message" . }}' # 设定邮箱的内容模板 headers: { Subject: "[WARN] 报警邮件"} # 接收邮件的标题 send_resolved: true #是否发送恢复通知 #- name: 'wechat' 微信告警 # wechat_configs: # - send_resolved: true # api_secret: 'RThYKZpaqfclgoTgSCh3BqE' # corp_id: 'ww2a818c8f5' # agent_id: '1000001' # to_party: '2' # message: '{{ template "wechat.message" . }}' # webhook_configs: # webhook配置 # - url: 'http://127.0.0.1:5001' # send_resolved: true #是否发送恢复通知 #保存退出 ------------------------------------------------------------------------- # 定义告警模板 mkdir template vim template/linux.tmpl {{ define "email.message" }} {{- if gt (len .Alerts.Firing) 0 -}} {{- range $index, $alert := .Alerts -}} {{- if eq $index 0 -}} **********告警通知********** 告警类型: {{ $alert.Labels.alertname }} 告警级别: {{ $alert.Labels.severity }} {{- end }} ===================== 告警主题: {{ $alert.Annotations.summary }} 告警详情: {{ $alert.Annotations.description }} 故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} {{ if gt (len $alert.Labels.instance) 0 -}}故障实例: {{ $alert.Labels.instance }}{{- end -}} {{- end }} {{- end }} {{- if gt (len .Alerts.Resolved) 0 -}} {{- range $index, $alert := .Alerts -}} {{- if eq $index 0 -}} **********恢复通知********** 告警类型: {{ $alert.Labels.alertname }} 告警级别: {{ $alert.Labels.severity }} {{- end }} ===================== 告警主题: {{ $alert.Annotations.summary }} 告警详情: {{ $alert.Annotations.description }} 故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} 恢复时间: {{ ($alert.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} {{ if gt (len $alert.Labels.instance) 0 -}}故障实例: {{ $alert.Labels.instance }}{{- end -}} {{- end }} {{- end }} {{- end }} # 保存退出
第四步:启动
启动方式可以选择直接nohup 启动或者将服务注册到系统服务中使用systemctl 控制启动二选一即可。
1.nohup启动
# 启动prometheus 默认端口 9090 cd /prometheus nohup ./prometheus & # 启动node_exporter 默认端口 9100 cd /node_exporter nohup ./node_exporter & # 启动alertmanager 默认端口 9093 cd alertmanager nohup ./alertmanager &
2.注册系统服务
# 注册prometheus服务 [root@prometheus-01 /]# vim /usr/lib/systemd/system/prometheus.service [Unit] Description=prometheus [Service] Restart=on-failure ExecStart=/prometheus/prometheus --config.file=/prometheus/prometheus.yml [Install] WantedBy=multi-user.target --------------------------------------------------------------------- # 注册alertmanager服务 [root@prometheus-01 /]# vim /usr/lib/systemd/system/alertmanager.service [Unit] Description=alertmanager [Service] Restart=on-failure ExecStart=/alertmanager/alertmanager --config.file=/alertmanager/alertmanager.yml [Install] WantedBy=multi-user.target --------------------------------------------------------------------- # 注册node_exporter服务 [root@prometheus-01 /]# vim /usr/lib/systemd/system/node_exporter.service [Unit] Description=node_exporter [Service] Restart=on-failure ExecStart=/volumes01/node_exporter/node_exporter [Install] WantedBy=multi-user.target --------------------------------------------------------------------- # 刷新daemon systemctl daemon-reload # 启动服务 [root@prometheus-01 /]# systemctl start prometheus node_exporter alertmanager # 检查启动状态 [root@prometheus-01 /]# systemctl status prometheus node_exporter alertmanager --------------------------------------------------------------------- # 加入开机自启动 [root@prometheus-01 /]# systemctl enable node_exporter prometheus alertmanager Created symlink from /etc/systemd/system/multi-user.target.wants/node_exporter.service to /usr/lib/systemd/system/node_exporter.service. Created symlink from /etc/systemd/system/multi-user.target.wants/prometheus.service to /usr/lib/systemd/system/prometheus.service. Created symlink from /etc/systemd/system/multi-user.target.wants/alertmanager.service to /usr/lib/systemd/system/alertmanager.service.
第五步:验证状态
- 浏览器访问:prometheus ———————— http://192.168.10.10:9090
- 浏览器访问:alertmanager ———————- http://192.168.10.10:9093
-
浏览器访问:node_exporter ——————— http://192.168.10.10:9100/metrics
第六步:安装grafana
官方文档:Install on RPM-based Linux | Grafana Labs
配置yum源:
[root@prometheus-01 /]# vim /etc/yum.repos.d/grafana.repo [grafana] name=grafana baseurl=https://packages.grafana.com/enterprise/rpm repo_gpgcheck=1 enabled=1 gpgcheck=1 gpgkey=https://packages.grafana.com/gpg.key sslverify=1 sslcacert=/etc/pki/tls/certs/ca-bundle.crt # 安装grafana [root@prometheus-01 /]# yum install -y grafana # 启动grafana [root@prometheus-01 /]# systemctl start grafana-server [root@prometheus-01 /]# systemctl enable grafana-server
第七步:访问grafana并配置展示监控数据
访问grafana默认端口:3000 ————-192.168.10.10:3000
grafana默认用户名密码: admin/admin 第一次登陆需要修改密码。
1.登录成功后配置数据源:
选择prometheus
配置数据源
配置完成后点击save & test 成功后即可
数据源配置完成后导入监控模板
模板ID :8919
然后点击导入就可以使用啦。
效果图展示
推荐一个告警规则的模板,包含各种常见的组件告警规则:https://awesome-prometheus-alerts.grep.to/rules#
至此本篇文章就结束了,有任何问题欢迎留言反馈。