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中增加如下依赖:
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-actuator</artifactId>
 <version>2.1.0.RELEASE</version>
</dependency>
<dependency>
 <groupId>io.micrometer</groupId>
 <artifactId>micrometer-registry-prometheus</artifactId>
 <version>1.1.2</version>
</dependency>

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 <db_name> ]  --> 指定需要备份的数据库名
    [ -portable ]            --> 表示在线备份
    [ -host <host:port> ]    --> influxdb服务所在的机器,端口号默认为8088
    [ -retention <rp_name> ] | [ -shard <shard_ID> -retention <rp_name> ]  --> 备份的保留策略,注意shard是挂在rp下的;我们需要备份的就是shard中的数据
    [ -start <timestamp> [ -end <timestamp> ] | -since <timestamp> ]   --> 备份指定时间段的数据
    <path-to-backup>   --> 备份文件的输出地址

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350