简介
Prometheus Server由Go语言编写而成,采取“拉”(pull)的方式,获取多种Prometheus Targets的监控信息。它本身自带一个时序型数据库(TSDB),用于存储拉取到的监控信息,默认的存储时长为168h(7天)。
0 准备工作
0.1、关闭虚拟机防火墙。
systemctl stop firewalld
0.2、关闭selinux
### 临时关闭
setenforce 0
###永久关闭
打开`/etc/selinux/config`,将`SELINUX`值修改为`disabled`
0.3、暴露端点、pom.xml中添加依赖
对应用进行监控时,需要对指定端点进行暴露,并在pom.xml中添加依赖
1.pom中增加如下依赖:
org.springframework.boot
spring-boot-starter-actuator
2.1.0.RELEASE
io.micrometer
micrometer-registry-prometheus
1.1.2
2.application.properties增加如下配置:
#普罗米修斯监控
spring.application.name=idinfo_verify
management.endpoints.web.exposure.include=prometheus,info,health,metrics,httptrace,mappings
management.endpoint.health.show-details=always
metrics.tags.application=${spring.application.name}
0.4、安装go环境
由于Prometheus 是用golang开发的,如果使用二进制安装Prometheus的话,首先要安装一个go环境;如果采用docker安装,需要安装docker环境。
下载地址:https://studygolang.com/dl
1、解压安装
tar -C /usr/local/ -xvf go1.13.linux-amd64.tar.gz
2、配置环境变量
vim /etc/profile
export PATH=$PATH:/usr/local/go/bin
source /etc/profile
3、验证
go version
1 部署Prometheus Server
1.1 二进制部署
下载地址:https://prometheus.io/download/
1、安装
tar -C /usr/local/ -xvf prometheus-2.12.0.linux-amd64.tar.gz
ln -sv /usr/local/prometheus-2.12.0.linux-amd64/ /usr/local/Prometheus
2、修改配置文件
vim /usr/local/Prometheus/prometheus.yml
此配置文件下,添加exporter 的IP信息、应用的ip、端口以及actuator路径信息,举例如下:
- job_name: 'prometheus'
#名称
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['172.16.40.189:9100']
#exporer地址
- job_name: 'personauth'
scrape_interval: 15s
scrape_timeout: 10s
metrics_path: '/actuator/prometheus'
#健康检查路径
static_configs:
- targets: ['172.16.40.189:8888']
#应用的IP
3、启动
/usr/local/Prometheus/prometheus --config.file=/usr/local/Prometheus/prometheus.yml &
1.2 docker部署
1、拉取镜像
docker pull prometheus
2、启动镜像
docker run -dit -p 9090:9090 --privileged=true -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml --name prometheus ImageID
3、进入容器
docker exec -it ContainerID bash
4、prometheus.yml位置在/etc/prometheus/下,如果需要修改配置文件,建议使用VS Code编辑后,复制到/etc/prometheus/下,并重新启动容器。
docker cp prometheus.yml ContainerID:/etc/prometheus
docker restart ContainerID
5、重启后,docker ps
查看容器状态,如果容器未运行,docker logs ContainerID
查看日志。运行失败的原因可能有以下几种:
① 配置文件格式错误,需要重新编辑配置文件,编辑完成后重启容器。
②未关闭防火墙:
###关闭防火墙
systemctl stop firewalld
###重启docker.server
systemctl restart docker.service
重启容器即可
2--部署Node-Exporter
2.1 二进制部署
下载地址:https://github.com/prometheus/node_exporter/releases/
在被监控的服务器上部署Node-Exporter,它的作用是采集此服务器硬件监控信息及应用监控信息并发送到Prometheus Server
1、解压
tar -xvf node_exporter-0.17.0.linux-amd64.tar.gz -C /usr/local/
2、启动
/usr/local/node_exporter-0.17.0.linux-amd64/node_exporter &
2.2 docker部署
1、拉取镜像
docker pull prom/node-exporter
2、运行
docker run -dit -p 9100:9100 --name node-exporter e5a616e4b9c
3、修改容器时间,将/etc下的localtime文件替换并重启
docker cp localtime b4131f98e13:/etc/
docker restart b4131f98e13
3 部署Grafana
3.1 二进制部署
1、下载grafana rpm包
https://dl.grafana.com/oss/release/grafana-6.4.2-1.x86_64.rpm
2、安装
yum localinstall grafana-6.4.2-1.x86_64.rpm
3、启动
service grafana-server start
4、开机自启动
chkconfig --add grafana-server
查看是否添加成功
chkconfig --list grafana-server
如果5显示启用,则表示成功
grafana-server 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
3.2 docker部署
拉取镜像
docker pull grafana
启动
docker run -dit --name=grafana --privileged=true -p 3000:3000 grafana
Grafana启动后,访问Grafana IP:3000,初始用户名、密码均为admin。
4 部署InfluxDB
4.1 二进制部署
1、下载rpm包
https://dl.influxdata.com/influxdb/releases/influxdb-1.7.8.x86_64.rpm
2、安装
yum localinstall influxdb-1.7.8.x86_64.rpm
3、启动
service influxdb start
4、开机自启动
chkconfig --add influxdb
查看是否添加成功
chkconfig --list influxdb
4.2 docker部署
1、拉取influxdb镜像
docker pull influxdb:1.7.8
2、启动influxdb
docker run -dit -p 8086:8086 -p 8083:8083 --privileged=true -v /var/lib/influxdb:/var/lib/influxdb --name influxdb-3 c0c0eb7f0b #暴露默认端口8086 将容器中的/var/lib/influxdb挂载到本地/var/lib/influxdb下(宿主机在前、容器在后)
3、进入influxdb,创建数据库 prometheus
docker exec -it influxdb /bin/bash
root@ca171fb358f1:/# influx
Connected to http://localhost:8086 version 1.7.8
InfluxDB shell version: 1.7.8
> show databases
name: databases
name
----
_internal
> create database "prometheus"
> show databases
name: databases
name
----
_internal
prometheus
4、进入Prometheus,修改配置文件/etc/prometheus/prometheus.yml
remote_write:
- url: "http://192.168.109.180:8086/api/v1/prom/write?db=prometheus"
#basic_auth: 可选用户
#username: prom
#password: prom
5、添加后,查看数据库prometheus
> use prometheus
Using database prometheus
> show measurements
name: measurements
name
----
go_gc_duration_seconds
go_gc_duration_seconds_count
go_gc_duration_seconds_sum
go_goroutines
go_info
go_memstats_alloc_bytes
go_memstats_alloc_bytes_total
go_memstats_buck_hash_sys_bytes
go_memstats_frees_total
go_memstats_gc_cpu_fraction
go_memstats_gc_sys_bytes
go_memstats_heap_alloc_bytes
go_memstats_heap_idle_bytes
go_memstats_heap_inuse_bytes
go_memstats_heap_objects
go_memstats_heap_released_bytes
go_memstats_heap_sys_bytes
go_memstats_last_gc_time_seconds
5 Influxdb数据库的备份与恢复
5.1 命令备份与恢复
备份数据库命令
influxd backup
[ -database ] --> 指定需要备份的数据库名
[ -portable ] --> 表示在线备份
[ -host ] --> influxdb服务所在的机器,端口号默认为8088
[ -retention ] | [ -shard -retention ] --> 备份的保留策略,注意shard是挂在rp下的;我们需要备份的就是shard中的数据
[ -start [ -end ] | -since ] --> 备份指定时间段的数据
--> 备份文件的输出地址
1、将库prometheus
备份到/usr/local/src/influxdb_bak
下
[root@localhost ~]# influxd backup -portable -database prometheus /usr/local/src/influxdb_bak
2019/11/15 01:14:47 backing up metastore to /usr/local/src/influxdb_bak/meta.00
2019/11/15 01:14:47 backing up db=prometheus
2019/11/15 01:14:47 backing up db=prometheus rp=autogen shard=2 to /usr/local/src/influxdb_bak/prometheus.autogen.00002.00 since 0001-01-01T00:00:00Z
2019/11/15 01:14:48 backup complete:
2019/11/15 01:14:48 /usr/local/src/influxdb_bak/20191115T011447Z.meta
2019/11/15 01:14:48 /usr/local/src/influxdb_bak/20191115T011447Z.s2.tar.gz
2019/11/15 01:14:48 /usr/local/src/influxdb_bak/20191115T011447Z.manifest
备份成功。
2、恢复到一个新的数据库中。
到存储备份文件夹下执行如下命令:
influxd restore -portable -db prometheus ./
root@ce559a7eeb7a:/home/influxdb_bak# influxd restore -portable -db prometheus ./
2019/11/15 01:18:17 Restoring shard 2 live from backup 20191115T011447Z.s2.tar.gz
恢复成功,可进入数据库验证。
5.2 挂载到本地进行备份与恢复
由于在创建容器时,将数据库文件已经挂载到宿主机上。当前的容器不可用时,可删除容器并重新创建。创建时使用同样的命令,由于容器中此路径下无文件,宿主机此路径下保存着完整的数据文件。容器启动后,自动恢复数据。
补充
数据库文件备份后,应及时将备份文件复制到宿主机上,供以后进行恢复。恢复时,需要将备份文件复制到容器中,再执行相关语句。
可考虑:在新建容器时,将备份文件路径挂载出来,并在容器中执行定时任务,定期的将数据库进行备份,并及时的挂载到宿主机上。因为备份的文件不会被覆盖,所以在备份之前要将备份文件夹清空,宿主机也应及时清空。
6 influxdb数据存储策略
官方文档--存储策略:
https://docs.influxdata.com/influxdb/v1.7/query_language/schema_exploration/#show-retention-policies
1、新建存储策略,并设置为默认
CREATE RETENTION POLICY "60_days" ON "prometheus" DURATION 60d REPLICATION 1 DEFAULT
2、查看策略
SHOW RETENTION POLICIES ON prometheus
3、修改策略
ALTER RETENTION POLICY "2_hours" ON "prometheus" DURATION 4h DEFAULT
4、删除策略
DROP RETENTION POLICY "2_hours" ON "prometheus"
7 Alert Manager
7.1 二进制部署
注意点:
- 如果alermanager的版本改变,文中相关路径也需要同步改变。
- alertmanager.yml 位置:
/etc/alertmanager-0.19.0.linux-amd64/
- wechat.tmpl位置:
/etc/alertmanager-0.19.0.linux-amd64/template/
(alertmanager.yml文件中配置)- prometheus.yml,rules.yml位置:
/etc/prometheus/
(prometheus.yml文件中配置)
1、下载二进制包
https://prometheus.io/download/
2、解压文件后,上传到指定的文件夹 /etc/alertmanager-0.19.0.linux-amd64
3、文件赋权
chmod 755 alertmanager
4、启动
/etc/alertmanager-0.19.0/alertmanager
默认启动端口为 9093,现在修改启动端口为8084并后台启动:
/etc/alertmanager-0.19.0/alertmanager --cluster.listen-address="" --web.listen-address=:8084 &
7.2 docker部署
基础环境镜像下载:
docker pull alpine
将alpine镜像的标签修改为alert manager:1
docker tag 965ea09ff2e alertmanager:1
dockerfile:
FROM alertmanager:1
ADD altermanager-0.19.0.tar /etc/
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
EXPOSE 8084
WORKDIR /etc/alertmanager-0.19.0
RUN chmod 755 /etc/alertmanager-0.19.0/alertmanager
CMD ["./alertmanager","--web.listen-address=:8084"]
启动命令:
docker run -dit -p 8084:8084 --name alertmanager 90790cfc159
进入容器:
docker exec -it d64144e3fa4e /bin/sh
8--Alert Manager 配置
1、prometheus.yml
编辑prometheus.yml,添加告警规则配置文件的读取路径。
rule_files:
- "/etc/prometheus/rules.yml"
2、rules.yml
添加告警配置文件,并将此文件放入prometheus.yml指定的位置。
groups:
# - name: prometheus_go_goroutines
# rules:
# - alert: go_goroutines_numbers
# expr: go_goroutines > 7
# for: 15s
# annotations:
# summary: "prometheus的gorotine数据超过7!当前值{{ $value }}"
- name: service-status
rules:
- alert: 服务器状态
expr: up{job="互联网认证接入区"} == 0 or up{job="互联网开通接入区"} == 0 or up{job="专线认证接入区"} == 0 or up{job="专线开通接入区"} == 0 or up{job="业务区"} == 0
for: 15s
annotations:
summary: "{{ $labels.instance }}宕机"
#description: "服务宕机,请立即查看!"
3、alertmanager.yml
编辑alertmanager.yml,添加告警模板的位置、告警发送的方式、地址以及相关路由规则。
global:
resolve_timeout: 5m
wechat_api_corp_id: '企业微信账号唯一 ID,可以在 我的企业 中查看'
wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/' #企业微信固定的接口地址
wechat_api_secret: '第三方企业应用的密钥,可以在自己创建的第三方企业应用详情页面查看'
templates:
- '/etc/alertmanager-0.19.0/template/wechat.tmpl'
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1m
receiver: 'wechat'
receivers:
- name: 'wechat'
wechat_configs:
- corp_id: '企业微信账号唯一 ID,可以在 我的企业 中查看'
to_party: '组ID'
agent_id: 第三方企业应用的 ID,可以在自己创建的第三方企业应用详情页面查看。
api_secret: '第三方企业应用的密钥,可以在自己创建的第三方企业应用详情页面查看'
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
4、wechat.tmpl是微信告警信息的模板,编辑完成后,放到alertmanager.yml指定 的路径。
{{ define "wechat.default.message" }}
{{ range .Alerts }}
========start======
@警报--测试
告警主机: {{ .Labels.instance }}
告警主题: {{ .Annotations.summary }}
告警详情: {{ .Annotations.description }}
触发时间: {{ .StartsAt.Format "2006-01-02 15:04:05" }}
=========end======
{{ end }}
{{ end }}
碰到的坑
1、AlertManager 报警信息中,触发时间未以北京时间作为展示
解决方法:容器(被监控对象)的时区为UTC,将容器中的localtime文件替换为CST即可。
2、访问/actuator/prometheus,返回值正常,但是访问/actuator/health,返回status为down。且有报错,类似于db.xxxx select 1
原因:Prometheus检查应用的健康状态时,如果应用连接数据库,会对数据库连接做健康检查,如果不通过则会报错。由于本系统并没有采用Oracle数据库,因此不存在一张特定的表,所以健康检查不通过。
在配置文件中添加以下代码即可:
management.health.db.enabled=false