1、Prometheus & Grafana搭建

1.1、Prometheus 介绍

Prometheus 是一套开源的系统监控、报警、时间序列数据库的组合,最初有 SoundCloud 开发的,后来随着越来越多公司使用,于是便独立成开源项目。我们常用的 Kubernetes 容器集群管理中,通常会搭配 Prometheus 一起来进行监控。Prometheus 基本原理是通过 Http 协议周期性抓取被监控组件的状态,而输出这些被监控的组件的 Http 接口为 Exporter,现在各个公司常用的 Exporter 都已经提供了,可以直接安装使用,如 haproxy_exporter、blockbox_exporter、mysqld_exporter、node_exporter 等等,更多支持的组件可查看

Prometheus 官网架构图如下:

prometheus spring配置 prometheus搭建_数据

上图简化如下:

prometheus spring配置 prometheus搭建_数据_02

总体而言,prometheus的核心是在于Server,我们要接入prometheus的话,实际上就是开放接口给prometheus拉取数据,然后在web-ui下配置图形化界面进而实现监控的功能。

1.2、Grafana 介绍

Grafana 是一个可视化仪表盘,它拥有美观的图标和布局展示,功能齐全的仪表盘和图形编辑器,默认支持 CloudWatch、Graphite、Elasticsearch、InfluxDB、Mysql、PostgreSQL、Prometheus、OpenTSDB 等作为数据源。我们可以将 Prometheus 抓取的数据,通过 Grafana 优美的展示出来,非常直观。

示例图:

prometheus spring配置 prometheus搭建_docker_03

简而言之,prometheus server采集到的数据通过接入Grafana进行展示,Grafana官网提供了多种采集数据的模板,如mysql 、服务器、docker等。

1.3、Prometheus部署

1.3.1 Docker方式安装

Docker 镜像启动很简单,只需要一条命令即可,使用默认配置的话,可以直接使用如下命令启动。

docker run --name prometheus -d -p 127.0.0.1:9090:9090 prometheus/prometheus
1.3.2 二进制源码安装

下载 Prometheus 二进制源码安装包,可以访问 Prometheus download 页面下载指定版本

cd /opt
wget https://github.com/prometheus/prometheus/releases/download/v2.3.2/prometheus-2.3.2.darwin-amd64.tar.gz
tar -zxvf prometheus-2.3.2.darwin-amd64.tar.gz

启动 Prometheus,使用默认配置文件 prometheus.yml 启动

cd prometheus-2.3.2
./prometheus  --config.file="prometheus.yml" &  ##启动
pkill prometheus   ## 停止
./promtool check config prometheus.yml ##核查yml配置文件是否正确,用于格式检查

安装完成后,访问 IP:9090 web界面

prometheus spring配置 prometheus搭建_docker_04

1.4 Grafana部署

Grafana 安装也很方便,根据官网文档 Grafana Install,里面有针对各个系统提供的安装方法

1.4.1 二进制源码安装
cd /opt
wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-5.2.2.darwin-amd64.tar.gz
tar -zxvf grafana-5.2.2.darwin-amd64.tar.gz
cd grafana-5.2.2
./bin/grafana-server web
1.4.2 Docker方式安装
docker run \
--user root \
-d \
-p 3000:3000 \
--name=grafana \
-v /home/monitor/grafana:/var/lib/grafana \
grafana/grafana

本地浏览器访问 http://localhost:3000 即可打开 Grafana Web 页面(默认账号密码:admin admin )

prometheus spring配置 prometheus搭建_配置文件_05

1.5、Grafana配置监控

既然我们已经起了Grafana了,就直接用Grafana作为监控的可视化工具啦(prometheus有自带的可视化界面,但我们就不用)。进到Grafana首页,配置prometheus作为我们的数据源。

prometheus spring配置 prometheus搭建_docker_06

进到配置页面,写下对应的URL,然后保存就好了。

prometheus spring配置 prometheus搭建_数据_07

至此,Prometheus和Garafana已经部署完毕,并且接入。

2、Exporter简介

概述

prometheus spring配置 prometheus搭建_docker_08

Exporter是Prometheus的指标数据收集组件。它负责从目标Jobs收集数据,并把收集到的数据转换为Prometheus支持的时序数据格式。 和传统的指标数据收集组件不同的是,他只负责收集,并不向Server端发送数据,而是等待Prometheus Server 主动抓取,node-exporter 默认的抓取url地址:http://ip:9100/metrics

另外,如果因为环境原因,网络不可达的场景,Prometheus可以使用Pushgateway这个组件推送node-exporter的指标数据到远端Prometheus。

2.1 Node-export

node-export由Prometheus官方提供、维护,属于监控指标收集类UNIX内核操作系统的必备的exporter。

Prometheus使用exporter工具来暴露主机和应用程序上的指标,目前有很多可用于各种目的的exporter。现在我们将专注于一个特定的exporter:Node Exporter。

2.1.1、安装Node Exporter
# 下载
wget https://github.com/prometheus/node_exporter/releases/download/v1.0.0/node_exporter-1.0.0.linux-386.tar.gz
# 解压
tar -zxf node_exporter-1.0.0.linux-386.tar.gz —C/usr/localcd /usr/local
# 重命名
mv node_exporter-1.0.0/ node_exporter
2.1.2、配置到系统服务
cat > /etc/systemd/system/node_exporter.service << EOF
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/node_exporter/node_exporter
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
2.1.3、启动并查看状态
# 启动
systemctl start node_exporter
# 查看状态
systemctl status node_exporter

或者进入解压目录执行

./node_exporter
2.1.4、 访问web

http://ip:9100

prometheus spring配置 prometheus搭建_数据_09

3、 Prometheus监控Export

3.1 prometheus

新建prometheus的配置文件prometheus.yml(这份配置其实就是告诉prometheus要去哪个端口中拉取对应的监控数据)

global:
  scrape_interval:     15s
  evaluation_interval: 15s
scrape_configs:
  - job_name: 'node-export'
    static_configs:
    - targets: ['ip:9100']  // TODO ip自己写
3.1.1、 重启prometheus
#二进制包
cd prometheus-2.3.2
./prometheus  --config.file="prometheus.yml" &  ##启动

如果采用docker安装,配置映射的文件后,重启容器

3.1.2 、web查看

prometheus spring配置 prometheus搭建_数据_10

3.2 grafana

使用现有的模板吧,直接import对应的模板,相关的模板可以在 https://grafana.com/grafana/dashboards/ 这里查到

prometheus spring配置 prometheus搭建_prometheus spring配置_11

我们直接服务器的监控直接选用8919的就好了

prometheus spring配置 prometheus搭建_数据_12

import后就能直接看到高大上的监控页面了:

prometheus spring配置 prometheus搭建_配置文件_13

prometheus spring配置 prometheus搭建_配置文件_14

4、Prometheus监控JVM

Java的监控也特别简单,在项目中多引入两个pom依赖(SpringBoot自带的监控组件actuator

<!--监控-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--适配prometheus-->
<dependency>
  <groupId>io.micrometer</groupId>
  <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

然后在配置文件application.yml 上加上对应的配置(开启监控并可以让prometheus拉取配置)

# 监控配置  TODO
management:
  endpoint:
    health:
      show-details: always
    metrics:
      enabled: true
    prometheus:
      enabled: true
  endpoints:
    web:
      exposure:
        include: '*'
  metrics:
    export:
      prometheus:
        enabled: true

当我们启动服务后,访问/actuator路径就能看到一大堆输出的指标了,包括prometheus的

prometheus spring配置 prometheus搭建_docker_15

能看到这些指标被打印了,说明我们程序接入已经完成了,剩下的就是通过prometheus来采集应用的指标了。

要让prometheus采集到Java应用的数据,其实就是改下对应的配置文件就完事了。在前面写好的的prometheus.yml文件下添加相关的配置信息:

- job_name: 'austin'
    metrics_path: '/actuator/prometheus' # 采集的路径
    static_configs:
    - targets: ['ip:port'] # todo 这里的ip和端口写自己的应用下的

我们访问:ip:9090/targets这个路径下,能看到现在prometheus能采集到的端点有哪些,看到都是自己所配置的状态为up,那就说明正常了

prometheus spring配置 prometheus搭建_prometheus spring配置_16

在Grafana配置对应的监控就好啦。这里我选用了4701模板的JVM监控和12900SpringBoot监控,可以简单看下他们的效果

prometheus spring配置 prometheus搭建_docker_17

prometheus spring配置 prometheus搭建_数据_18

4.1 压测

到目前为止,我们想要发消息,都是通过HTTP接口进行调用的,而恰好的是,Spring actuator是能监控到HTTP的数据的。那我们就压测一把看看监控平台的指标会不会变?

这里我使用wrk这个压测工具来(它足够简单易用)所以,首先安装他(环境Centos 7.6):

sudo yum groupinstall 'Development Tools'
sudo yum install -y openssl-devel git 
git clone https://github.com/wg/wrk.git wrk
cd wrk
make
# 将可执行文件移动到 /usr/local/bin 位置
sudo cp wrk /usr/local/bin

# 验证安装是否成功
wrk -v
wrk -t2 -c100 -d10s --latency http://localhost:8080/login/toLogin (开两个线程 并发100 持续10s)

Grafana监控变化

prometheus spring配置 prometheus搭建_docker_19

5、Prometheus监控processExport

5.1、Process Exporter简介

在Prometheus中,可以借助process-exporter用以检测所选进程的状态信息。

用法:

process-exporter [options] -config.path filename.yml

若选择监控的进城并对其进行分组,可以使用命令行参数或者yaml配置文件。推荐使用-config.path指定配置文件路径。

详细.yml配置文件格式及规则参考https://github.com/ncabatoff/process-exporter

# 若监控主机上所有进程
process_names:
  - name: "{{.Comm}}"
    cmdline:
    - '.+'
# 若监控主机上某个进程
process_names:
 - name: "{{.Matches}}"
   cmdline:
   - 'hadoop'

可用的模板变量如下

{{.Comm}}           包含原始可执行文件的基本名称,即 /proc/<pid>/stat
 
{{.ExeBase}}        包含可执行文件的基本名称
 
{{.ExeFull}}        包含可执行文件的标准路径
 
{{.Username}}       包含有效用户的用户名
 
{{.Matches}}        包含所有由于应用cmdline正则表达式而产生的匹配项
 
{{.PID}}            包含过程的PID。请注意,使用PID意味着该组将仅包含一个进程
 
{{.StartTime}}      包含过程的开始时间。与PID结合使用时,这很有用,因为PID会随着时间的推移而被重用

不建议使用PID或StartTime

5.2、 安装Process Exporter

# 下载
wget https://github.com/ncabatoff/process-exporter/releases/download/v0.7.2/process-exporter-0.7.2.linux-amd64.tar.gz
# 解压并安装
tar -zxvf process-exporter-0.7.2.linux-amd64.tar.gz -C /usr/local
# 重命名
mv process-exporter-0.7.2.linux-amd64/ process_exporter

注册到系统服务

cat > /usr/lib/systemd/system/process_exporter.service << EOF
[Unit]
Description=process_exporter
Documentation=https://github.com/ncabatoff/process-exporter
After=network.target
 
[Service]
Type=simple
ExecStart=/usr/local/process_exporter/process-exporter -config.path=/usr/local/process_exporter/process-conf.yaml
Restart=always
 
[Install]
WantedBy=multi-user.target
EOF

加载并开机自启

systemctl daemon-reload && systemctl enable process_exporter

启动process exporter

systemctl daemon-reload && systemctl enable process_exporter

eg: 监控hadoop进程

vi process-conf.yaml
 
process_names:
 - name: "{{.Matches}}"
   cmdline:
   - 'hadoop'

启动process exporter后查看metric信息 http://ip:9256

5.3、 接入Prometheus

在prometheus配置文件prometheus.yml中,添加process exporter信息

- job_name: Process
  static_configs:
  - targets: ['localhost:9256']

检查prometheus.yml配置文件

./promtool check config prometheus.yml
[root@master prometheus-2.18.1]#  ./promtool check config prometheus.yml
Checking prometheus.yml
  SUCCESS: 0 rule files found

重启prometheus

systemctl restart prometheus

4. 接入Grafana图形化展示

输入导入的模板id 249,数据源选择Prometheus,点击import导入。

prometheus spring配置 prometheus搭建_prometheus spring配置_20

6、docker-compose编排

新建一个prometheus的文件夹,存放docker-compose.yml的信息

version: '2'

networks:
    monitor:
        driver: bridge

services:
    prometheus:
        image: prom/prometheus
        container_name: prometheus
        hostname: prometheus
        restart: always
        volumes:
            - ./prometheus.yml:/etc/prometheus/prometheus.yml
#            - ./node_down.yml:/usr/local/etc/node_down.yml:rw
        ports:
            - "9090:9090"
        networks:
            - monitor

    alertmanager:
        image: prom/alertmanager
        container_name: alertmanager
        hostname: alertmanager
        restart: always
#        volumes:
#            - ./alertmanager.yml:/usr/local/etc/alertmanager.yml
        ports:
            - "9093:9093"
        networks:
            - monitor

    grafana:
        image: grafana/grafana
        container_name: grafana
        hostname: grafana
        restart: always
        ports:
            - "3000:3000"
        networks:
            - monitor

    node-exporter:
        image: quay.io/prometheus/node-exporter
        container_name: node-exporter
        hostname: node-exporter
        restart: always
        ports:
            - "9100:9100"
        networks:
            - monitor

    cadvisor:
        image: google/cadvisor:latest
        container_name: cadvisor
        hostname: cadvisor
        restart: always
        volumes:
            - /:/rootfs:ro
            - /var/run:/var/run:rw
            - /sys:/sys:ro
            - /var/lib/docker/:/var/lib/docker:ro
        ports:
            - "8899:8080"
        networks:
            - monitor

这里拉取的镜像分别有:

  • cadvisor 用于获取docker容器的指标
  • node-exporter 用户获取服务器的指标
  • grafana 监控的web-ui好用的可视化组件
  • alertmanager 告警组件(目前暂未用到)
  • prometheus 核心监控组件

新建prometheus的配置文件prometheus.yml(这份配置其实就是告诉prometheus要去哪个端口中拉取对应的监控数据)

global:
  scrape_interval:     15s
  evaluation_interval: 15s
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
    - targets: ['ip:9090']  // TODO ip自己写
  - job_name: 'cadvisor'
    static_configs:
    - targets: ['ip:8899']  // TODO ip自己写
  - job_name: 'node'
    static_configs:
    - targets: ['ip:9100']  // TODO ip自己写

这里要注意端口,按自己配置的来

把这份prometheus.yml的配置往/etc/prometheus/prometheus.yml 路径下复制一份(有很多配置的信息我都忽略没写了,prometheus的功能还是蛮强大的,对监控想深入了解的可以官网看看文档)

随后在目录下docker-compose up -d启动,于是我们就可以分别访问:

  • http://ip:9100/metrics( 查看服务器的指标)
  • http://ip:8899/metrics(查看docker容器的指标)
  • http://ip:9090/(prometheus的原生web-ui)
  • http://ip:3000/(Grafana开源的监控可视化组件页面)

prometheus spring配置 prometheus搭建_docker_21

一个docker-compose起了5个服务器,真好使!

7、Pushgateway

1.Pushgateway简介

Pushgateway是prometheus的一个组件,prometheus server默认是通过exporter主动获取数据(默认采取pull拉取数据),pushgateway则是通过被动方式推送数据到prometheus server,用户可以写一些自定义的监控脚本把需要监控的数据发送给pushgateway, 然后pushgateway再把数据发送给Prometheus server

总结就是pushgateway是普罗米修斯的一个组件,是通过被动的方式将数据上传至普罗米修斯。这个可以解决不在一个网段的问题。

2、pushgateway缺点

  • Prometheus拉取状态只针对 pushgateway, 不能对每个节点都有效;
  • Pushgateway出现问题,整个采集到的数据都会出现问题
  • 监控下线,prometheus还会拉取到旧的监控数据,需要手动清理 pushgateway不要的数据。

3、安装pushgateway

docker run -d --name pushgateway -p 9091:9091 prom/pushgateway

在浏览器访问node ip :9091出现如下ui界面

prometheus spring配置 prometheus搭建_配置文件_22

4、修改prometheus.yaml文件

- job_name: 'pushgateway'
      scrape_interval: 5s
      static_configs:
      - targets: ['192.168.100.6:9091']
      honor_labels: true

重启Prometheus

prometheus spring配置 prometheus搭建_配置文件_23

5、推送指定的数据格式到pushgateway

现在普罗米修斯还采集不到任何和pushgateway相关的数据,因为我们需要将数据上报到pushgateway,普罗米修斯才可以采集到,所以现在需要将数据推送到pushgateway。

metric指标名 3.6指标值 test_job这个是job的名字 这些都是固定的格式

echo " metric 3.6" | curl --data-binary @- http://192.168.2.250:9091/metrics/job/test_job

注:--data-binary 表示发送二进制数据,注意:它是使用POST方式发送的

prometheus spring配置 prometheus搭建_数据_24

prometheus spring配置 prometheus搭建_数据_25

6、把数据上报到pushgateway

在被监控服务所在的机器配置数据上报,这个脚本是采集内存信息的

node_memory_usages=$(free -m | grep Mem | awk '{print $3/$2*100}')
job_name="memory"
instance_name="192.168.2.250"

cat <<EOF | curl --data-binary @- http://192.168.2.250:9091/metrics/job/$job_name/instance/$instance_name
node_memory_usages $node_memory_usages
EOF

打开pushgateway web ui界面,可看到如下:

prometheus spring配置 prometheus搭建_prometheus spring配置_26

打开prometheus ui界面,可看到如下memory_usage的metrics指标

prometheus spring配置 prometheus搭建_数据_27

设置计划任务,每分钟定时上报数据

crontab -e
 
*/1 * * * * /opt/push.sh

7、自定义图标

prometheus spring配置 prometheus搭建_配置文件_28