Skip to content

Prometheus部署

1.prometheus概述

该手册主要向读者介绍如何快速在linux系统下搭建Prometheus监控环境,主要涉及Prometheus server、node-exporter、Alertmanger、Prometheus JavaAgent等Prometheus生态体系下的相关组件的部署工作。

注:该手册是基于Prometheus 2.26.0版本整理所得。附Prometheus生态体系图

  • prometheus server:prometheus监控的服务端,主要承接周期性抓取jobs/exporters的指标数据并存储;周期性评估记录/告警规则文件,并作出相应处理,如将告警数据推至alertmanager等;内置强大的PromQL查询语法,检索数据更方便快捷;对接 grafana数据可视化套件,将指标数据可视化

jobs/exporters:exporter表示暴露符合prometheus监控规范的接口的应用,可以是官方提供的node-exporter、mysql-exporter等,亦可以是自己开发的微服务应用(暴露符合规范的接口);jobs是指prometheus server发起的一个个抓取任务,一个抓取任务中可能包含从一个或者多个exporter的抓取指标数据,如可以将主机指标收集设为一个job,该任务下就可以包含从多个node-exporter抓取指标数据(一个主机部署一个node-exporter)

oms 运维平台提供以下安装介质。

文件名称说明备注
prometheus-2.26.0.linux-amd64.tar.gzPrometheus安装包必选
zookeeper-exporter-1.0.2.tar.gzZookeeper监控服务可选,单独服务部署
node_exporter-1.1.2.linux-amd64.tar.gz主机节点监控服务可选,单独服务部署
rocketmq-exporter-0.0.2.zipRocketmq监控服务可选,单独服务部署
redis_exporter-v1.20.0.linux-amd64.tar.gzRedis监控服务可选,单独服务部署
kafka_exporter-1.2.0.linux-amd64.tar.gzKafka 监控服务可选,单独服务部署
thanos-0.19.0.linux-amd64.tar.gzPrometheus高可用组件可选,使用Prometheus集群时,建议使用

1.1.Prometheus Server部署

1.1.1上传并解压安装包

将prometheus-2.26.0.linux-amd64.tar.gz安装包上传至规划的机器的对应目录下,并解压。

解压命令:tar -xf prometheus-2.26.0.linux-amd64.tar.gz

1.1.2.配置简述

global.scrape_interval:定时抓取指标数据的频率,默认为1m

global.evaluation_interval:评估rules(即rule_files)的频率,默认为1m

altering.alertmanagers:配置alertmanger的地址,统一处理告警信息

rule_files:配置自定义的规则文件,这个规则文件包括record rules和alert rules,prometheus会周期性(global.evaluation_interval配置的时间)的对依据规则文件中的“规则”进行评估

scrape_configs :抓取配置(静态抓取、动态抓取…),前面提到Prometheus是以主动抓取(pull)的方式,以global.scrape_interval为周期,不断抓取exporter的指标信息,并实施监控。那么exporter的地址则需要配置在抓取配置中,以便其知道具体要监控/抓取哪些exporter的指标信息。默认会将prometheus server自身纳入监控

配置参考如下:

yaml
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: 'Host-192.168.161.116' #主机监控
    metrics_path: '/metrics'
    static_configs:
      - targets: [ '192.168.161.116:9100' ]
        labels:
          ip: '192.168.161.116'
    relabel_configs:
      - action: labeldrop
        regex: "job"   #正则匹配标签名称
  - job_name: 'Host-192.168.161.128'
    metrics_path: '/metrics'
    static_configs:
      - targets: [ '192.168.161.128:9100' ]
        labels:
          ip: '192.168.161.128'
    relabel_configs:
      - action: labeldrop
        regex: "job"   #正则匹配标签名称
  - job_name: 'Host-192.168.161.163'
    metrics_path: '/metrics'
    static_configs:
      - targets: [ '192.168.161.163:9100' ]
        labels:
          ip: '192.168.161.163'
    relabel_configs:
      - action: labeldrop
        regex: "job"   #正则匹配标签名称
  - job_name: 'Host-192.168.161.69'
    metrics_path: '/metrics'
    static_configs:
      - targets: [ '192.168.161.69:9100' ]
        labels:
          ip: '192.168.161.69'
    relabel_configs:
      - action: labeldrop
        regex: "job"   #正则匹配标签名称
  - job_name: 'Host-192.168.161.70'
    metrics_path: '/metrics'
    static_configs:
      - targets: [ '192.168.161.70:9100' ]
        labels:
          ip: '192.168.161.70'
    relabel_configs:
      - action: labeldrop
        regex: "job"   #正则匹配标签名称
  - job_name: 'RedisMonitor'  #redis监控
    metrics_path: '/metrics'
    static_configs:
      - targets: [ '192.168.161.116:9121' ]
    relabel_configs:
      - action: labeldrop
        regex: "job"   #正则匹配标签名称
  - job_name: 'KafkaMonitor'  #kafka监控
    metrics_path: '/metrics'
    static_configs:
      - targets: [ '192.168.161.116:9308' ]
    relabel_configs:
      - action: labeldrop
        regex: "job"   #正则匹配标签名称
  - job_name: 'ZookeeperMonitor' #zookeeper监控
    metrics_path: '/metrics'
    static_configs:
      - targets: [ '192.168.161.116:9141' ]
    #      labels:
    #        ip: '192.168.161.116:2181'
    relabel_configs:
      - action: labeldrop
        regex: "job"   #正则匹配标签名称
  - job_name: 'comet-buss' #业务监控
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: [ '192.168.161.69:9012','192.168.161.69:9030','192.168.161.69:9060','192.168.161.69:9020','192.168.161.69:9040','192.168.161.69:9070' ]
    relabel_configs:
      - action: labeldrop
        regex: "job"   #正则匹配标签名称
        #labels:
  - job_name: 'RocketmqMonitor' #rocketmq监控
    metrics_path: '/metrics'
    static_configs:
      - targets: [ '192.168.161.116:5557' ]
    relabel_configs:
      - action: labeldrop
        regex: "job"   #正则匹配标签名称
  - job_name: 'app-jvm' #应用jvm监控
    metrics_path: '/lhdmon/prometheus'
    static_configs:
      - targets: [ '192.168.164.179:9010','192.168.164.180:9010' ]
    relabel_configs:
      - action: labeldrop
        regex: "job"   #正则匹配标签名称
        #labels:

1.1.3.启动项简述

使用人员可以在Prometheus的安装目录下,执行./prometheus -h命令,查看prometheus server相关的启动项有哪些,此处主要介绍几个比较实用的启动项

--config.file:启动所需指定的配置文件路径

--storage.tsdb.retention.time:指标数据存储策略,默认为15d(即15天),另外还支持y, w, d, h, m, s, ms

--web.listen-address:prometheus server访问地址,可以用于UI界面、API的访问。默认为0.0.0.0:9090

--web.enable-lifecycle:配置热加载,停止api,具体如下表

PUT /-/reload POST /-/reload触发Prometheus配置和规则文件得重新加载。默认情况下是禁用得,需要通过--web.enable-lifecycle启动项启用
PUT /-/quit POST /-/quit触发Prometheus的正常关闭,默认情况下禁用,需要通过--web.enable-lifecycle启动项启用

--web.enable-admin-api:启用tsdb admin api,可以进行prometheus的数据备份及删除

POST /api/v1/admin/tsdb/snapshot PUT /api/v1/admin/tsdb/snapshot参数 skip_head:true/false,默认为false。表示是否跳过备份存储在内存中还未写如磁盘的数据。 注:备份的数据会存在storage.tsdb.path/snapshots目录下

配置远程读写 influxDB

yaml
remote_write:
  - url: "http://127.0.0.1:8086/api/v1/prom/write?db=prometheus"
remote_read:
  - url: "http://127.0.0.1:8086/api/v1/prom/read?db=prometheus"

若influxdb配置密码,则

yaml
remote_write:
  - url: "http://127.0.0.1:8086/api/v1/prom/write?db=prometheus&u=username&p=password"
remote_read:
  - url: "http://127.0.0.1:8086/api/v1/prom/read?db=prometheus&u=username&p=password"

如使用influxdb存储prometheus数据,需提前在influxdb中创建prometheus数据库,创建语句如下:

shell
influx -username  root -password root  #使用密码登录influxdb
influx  #不使用密码登录influxdb
create database prometheus; #创建prometheus数据库

若现场安装influx-proxy,此处配置influx-proxy的地址。

若influx-proxy地址为多个,此处配置influx-proxy的负载地址。

1.1.4. 启动(不强制root)

进入prometheus安装目录下,执行如下启动命令:

./prometheus --web.enable-lifecycle --web.enable-admin-api --config.file=prometheus.yml --storage.tsdb.retention.time=1w >out.log 2>&1 &

启动完成后,可以通过netstat或者ps命令查看是否启动成功:

netstat -an | grep 9090

prometheus启动端口

ps -ef | grep prometheus

亦可以在浏览器输入IP:PORT,出现如下界面也表示启动成功

1.1.5.热加载

对配置文件进行修改后,若需要热加载,可以使用下面两种方式:

  • kill -HUP pid

  • curl -X POST http://IP:Port/-/reload (需要在启动参数中添加 --web.enable-lifecycle,见1.3节)

1.2.主机监控Node-exporter部署

Node-exporter作为prometheus监控主机的重要工具(关于exporter,文档开头有做介绍),因此作为代表,在此处进行部署说明。

1.2.1.上传并解压安装包

将node_exporter-1.1.2.linux-amd64.tar.gz上传至要被prometheus监控的主机节点的安装目录下,并解压。

解压命令:tar -xf node_exporter-1.1.2.linux-amd64.tar.gz

1.2.2.启动项简述

同样可以在node-exporter安装目录下执行**./node_exporter -h**命令,查看它的启动项参数都有哪些,此处主要介绍几个比较实用的启动项

--web.listen-address:设置node-exporter的地址(此处IP会取当前机器的IP,无需指定),默认为 :9100,注意冒号不能省

--web.telemetry-path:公开指标的路径,默认为/metrics。即具体的指标访问路径为IP: PORT/metrics。需要注意,此处的路径设置,与prometheus的metrics_path配置项相关联,具体见3.5小节。

--collector.:这里的 号是泛指,意为所有--collector.开头的启动项,这一类启动项表示node-exporter需要收集的哪些指标项,如果不想让它收集某个指标项,则使用no前缀作为启动项启动node-exporter即可。如--no-collector.softnet表示不收集softnet指标项,将其作为启动项随node-exporter启动,便不再收集该指标项

1.2.3.启动(不强制root)

进入node-exporter安装目录下,执行如下命令:

**nohup ./node_**exporter --web.listen-address=:9100 >out.log 2>&1 &

该命令已写入start.sh脚本,可使用./start.sh脚本启动,如需增加配置项,可修改start.sh脚本。

启动完成后,可以通过netstat或者ps命令查看是否启动成功:

netstat -an | grep 9100

ps -ef | grep node_exporter

亦可以在浏览器输入IP:PORT/metrics,出现如下界面也表示启动成功。

1.2.4.接入Prometheus Server

prometheus是采用主动抓取(pull)的方式将各个exporter的指标数据采集并存储。

  • 采用静态配置的方式,将exporter的地址维护在配置文件中,然后调用prometheus动态加载配置的api(/-/reload),在不重启prometheus server的情况下,将新的exporter纳入监控

具体配置如下图,以将上文中部署的node-exporter纳入监控为例

yaml
  - job_name: 'Host-192.168.164.179'
    metrics_path: '/metrics'
    static_configs:
      - targets: [ '192.168.164.179:9100' ]
        labels:
          ip: '192.168.164.179'
  - job_name: 'Host-192.168.164.180'
    metrics_path: '/metrics'
    static_configs:
      - targets: [ '192.168.164.180:9100' ]
        labels:
          ip: '192.168.164.180'

job_name**:抓取exporter指标数据的名称,需要在整个抓取配置中保持唯一

metrics_path:抓取exporter指标数据的HTTP资源路径,默认为/metrics,这与exporter配置的公开指标路径相对应( 如node-exporter的--web.telemetry-path启动项),如果都为/metrics则不必配置

static_configs:需要手动将所有exporter地址在此维护,它下面有两个配置项需要关注

targets:配置exporter的IP:PORT,可以配置多个

labels:为exporter设置标签,标签为key: value的形式,该配置不是必配项

  • 配置完成后调用prometheus的重新加载配置的api,命令如下

curl -X POST http://IP:PORT/-/reload

  • 当配置重新加载后可以在prometheus的界面如下操作

如上图,可以看到prometheus已经将node-exporter接入监控中,并可以看到自定义的标签

1.3.三方中间件exporter 部署

1.3.1.redis_exporter

解压 redis_exporter-v1.20.0.linux-amd64.tar.gz

进入解压目录执行 ./redis_exporter & (默认监控的redis:127.0.0.1:6379)

也可以使用脚本启动./start.sh IP:PORT

若redis配置了密码,则使用以下命令启动

./redis_exporter -redis.password 密码 &

检查服务是否启动:ps -ef | grep redis_exporter

若需要设置其他信息,如 监听的redis的地址、端口信息 执行 ./redis_exporter –help 进行查看

执行 curl 127.0.0.1:9121/metrics 查看监控信息

接入 Prometheus server: (配置prometheus.yml)

yaml
  - job_name: 'RedisMonitor'
    metrics_path: '/metrics'
    static_configs:
      - targets: [ '192.168.164.179:9121' ]
        labels:
          ip: '192.168.164.179:6379'

若redis集群配置密码,则参考如下命令启动redis_exporter,详情请参考./redis_exporter –help

shell
./redis_exporter -redis.addr 127.0.0.1:6379  -redis.password 1q2w3e4R &

redis集群配置参考:

yaml
  - job_name: 'RedisMonitor'
    metrics_path: '/scrape'
    static_configs:
      - targets:
          #redis集群各节点地址
          - redis://192.168.161.216:6379
          - redis://192.168.161.216:6380
          - redis://192.168.161.125:6379
          - redis://192.168.161.125:6380
          - redis://192.168.161.198:6379
          - redis://192.168.161.198:6380
    relabel_configs:
      - source_labels: [ __address__ ]
        target_label: __param_target
      - source_labels: [ __param_target ]
        target_label: instance
      - target_label: __address__
        replacement: 192.168.161.216:9121  #redis_exporter地址

1.3.2.kafka_exporter

解压 kafka_exporter-1.2.0.linux-amd64.tar.gz

进入解压目录,执行 ./kafka _exporter & (默认监控的kafka: 127.0.0.1:9092)(若kafka为集群只需填写kafka集群的⼀个ip即可)

也可以使用脚本启动./start.sh IP:PORT

检查服务是否启动:ps -ef | grep kafka _exporter

执行 curl 127.0.0.1:9308/metrics 查看监控信息

若需要设置其他信息,如 监听的kafka的地址、端口信息 执行 ./kafka_exporter –help 进行查看

接入 Prometheus server: (配置prometheus.yml)

yaml
  - job_name: 'KafkaMonitor'
    metrics_path: '/metrics'
    static_configs:
      - targets: [ '192.168.164.179:9308' ]
        labels:
          ip: '192.168.164.179:9092'

1.3.3.zookeeper_exporter

解压 zookeeper-exporter-1.0.2.tar.gz

进入解压目录,执行 ./zookeeper_exporter & (默认监控的zookeeper: 127.0.0.1:2181)

也可以使用脚本启动./start.sh IP:PORT

检查服务是否启动:ps -ef | grep zookeeper_exporter

执行 curl 127.0.0.1:9141/metrics 查看监控信息

若需要设置其他信息,如 监听的zookeeper的地址、端口信息 执行 ./zookeeper_exporter –help 进行查看

接入 Prometheus server: (配置prometheus.yml)

yaml
  - job_name: 'ZookeeperMonitor'
    metrics_path: '/metrics'
    static_configs:
      - targets: [ '192.168.164.179:9141' ]
        labels:
          ip: '192.168.164.179:2181'

1.3.4.rocketmq_exporter

解压 rocketmq-exporter-0.0.2.zip

进入解压目录,执行./start.sh IP:PORT启动,如果rocketmq为集群,指定rocketmq.config.namesrvAddr的多个地址使用分号(😉 分隔,如:--rocketmq.config.namesrvAddr=192.168.164.179:9876;192.168.164.180:9876;192.168.164.181:9876

检查服务是否启动:ps -ef | grep rocketmq-exporter

执行 curl 127.0.0.1:5557/metrics 查看监控信息

接入 Prometheus server: (配置prometheus.yml)

yaml
  - job_name: 'RocketmqMonitor'
    metrics_path: '/metrics'
    static_configs:
      - targets: [ '192.168.164.182:5557' ]

1.3.5.elasticsearch_exporter

解压 elasticsearch_exporter-1.2.1.linux-amd64.zip

进入解压目录,执行./start.sh IP:PORT启动

检查服务是否启动:ps -ef | grep elasticsearch_exporter

执行 curl 127.0.0.1:5557/metrics 查看监控信息

若需要设置其他信息,如 监听的elasticsearch的地址、端口信息 执行 ./elasticsearch_exporter –help 进行查看

接入 Prometheus server: (配置prometheus.yml)

yaml
  - job_name: 'elasticsearch'
    metrics_path: '/metrics'
    static_configs:
      - targets: [ '192.168.164.179:9114' ]
        labels:
          instance: '192.168.164.179:9200'

若es集群配置密码,则参考如下命令启动elasticsearch_exporter

shell
nohup ./elasticsearch_exporter --es.all=true --es.indices --es.cluster_settings --es.indices_settings --es.shards=true --es.snapshots  --es.uri=http://用户名:密码@192.168.164.179:9200 &

1.4.Thanos (不推荐)

1.4.1.概念

Thanos Sidecar

Sidecar作为一个单独的进程和已有的Prometheus实例运行在一个server上,互不影响。Sidecar可以视为一个Proxy组件,所有对Prometheus的访问都通过Sidecar来代理进行。通过Sidecar还可以将采集到的数据直接备份到云端对象存储服务器。

Thanos Querier

所有的Sidecar与Querier直连,同时Querier实现了一套Prometheus官方的HTTP API从而保证对外提供与Prometheus一致的数据源接口,Grafana可以通过同一个查询接口请求不同集群的数据,Querier负责找到对应的集群并通过Sidecar获取数据。Querier本身也是水平可扩展的,因而可以实现高可部署,而且Querier可以实现对高可部署的Prometheus的数据进行合并从而保证多次查询结果的一致性,从而解决全局视图和高可用的问题。

1.4.2.部署前准备

部署Thanos前必须将Prometheus服务的节点名称进行设置。如下图,修改Prometheus.yml

确定 Prometheus 服务的data 目录。

1.4.3.启动

上传并解压thanos-0.19.0.linux-amd64.tar.gz,进入到解压后的thanos目录中。

启动sidecar :

shell
./thanos sidecar --prometheus.url=http://localhost:9090 --tsdb.path=/home/galaxy/prometheus-2.26.0.linux-amd64/data
--grpc-address=192.168.162.101:10901 --http-address=192.168.162.101:10902

说明:tsdb.path与 prometheus 启动时的storage.tsdb.path 目录为同一个目录,该值默认为 data

启动query:

shell
./thanos query --http-address=192.168.162.101:10903 --grpc-address=192.168.162.101:10904 --store=192.168.162.101:10901

说明:store配置的是sidecar的grpc-address.

访问 query 启动使用的 http-address,(http://192.168.162.101:10903) 即可访问thanos前端界面,如下图: