Docker实战(一) 搭建Pprometheus监控平台

简介

Prometheus架构

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

你可能感兴趣的:(Docker实战(一) 搭建Pprometheus监控平台)