跳转至

Prometheus安装与配置

prom

二进制安装

Prometheus 版本迭代很快,当前的最新版本是 2.19.0,我们这里使用的 Prometheus 版本是 2.19.0

# 创建Prometheus工作目录
useradd -s /usr/sbin/nologin prometheus
mkdir -p /data/prometheus/{bin,conf,data,log,rules}
chown -R prometheus.prometheus /data/prometheus
cd /data/prometheus/

# 下载二进制包文件
wget https://github.com.cnpmjs.org/prometheus/prometheus/releases/download/v2.19.0/prometheus-2.19.0.linux-amd64.tar.gz
tar xvf prometheus-2.19.0.linux-amd64.tar.gz

# 简单的启动测试
./prometheus --config-file='config.yaml'

# systemd配置文件
cat > /lib/systemd/system/prometheus.service <<EOF
[Unit]
Description=Prometheus
Documentation=https://prometheus.io/
After=network.target

[Service]
Type=simple
User=prometheus
ExecStart=/data/prometheus/bin/prometheus \
--config.file=/data/prometheus/conf/prometheus.yml \
--web.enable-lifecycle \
--storage.tsdb.path=/data/prometheus/data \
--web.external-url=http://prom.prometheus.cool \
--storage.tsdb.retention=90d
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

Docker安装

# 创建目录
wget -O /data/prometheus/config/prometheus.yml \
https://raw.githubusercontent.com/prometheus/prometheus/master/documentation/examples/prometheus.yml
chown -R prometheus.prometheus /data/prometheus/

# 权限问题:
$ docker exec -it prometheus sh
/prometheus $ id
uid=65534(nobody) gid=65534(nogroup)
# 启动
docker run -d --restart=always \
    --name=prometheus \
    -p 9090:9090 \
    -v /data/prometheus/config/:/etc/prometheus/ \
    -v /data/prometheus/data:/prometheus \
    -v /etc/localtime:/etc/localtime:ro \
    prom/prometheus \
    --config.file=/etc/prometheus/prometheus.yml \
    --storage.tsdb.path=/prometheus \
    --web.console.libraries=/etc/prometheus/console_libraries \
    --web.console.templates=/etc/prometheus/consoles \
    --storage.tsdb.retention.time=200h \
    --web.enable-lifecycle

Docker-compose管理

cat docker-compose.yml
version: '3.1'

services:
  prometheus:
    image: prom/prometheus
    volumes:
      - ./config:/prometheus
      - ./data/prometheus:/data
    command:
      - '--config.file=/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/data'
    ports:
      - 9090:9090
    depends_on:
      - alertmanager
    restart: always
    networks:
      - promnet

  alertmanager:
    image: prom/alertmanager
    volumes:
      - ./config:/prometheus
      - ./data/alertmanager:/data
    command:
      - '--config.file=/prometheus/alertmanager.yml'
      - '--storage.path=/data'
    ports:
      - 9093:9093
    networks:
      - promnet

  node:
    image: prom/node-exporter
    ports:
      - 9100:9100
    restart: always
    networks:
      - promnet

  cadvisor:
    image: google/cadvisor
    ports:
      - 9880:8080
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
    networks:
      - promnet

  collectd:
    image: prom/collectd-exporter
    ports:
      - 9103:9103
    restart: always
    networks:
      - promnet

  alerta:
    image: alerta/alerta-web
    ports:
      - 9080:8080
    depends_on:
      - db
    environment:
      - DEBUG=1  # remove this line to turn DEBUG off
      - DATABASE_URL=mongodb://db:27017/monitoring
      # - AUTH_REQUIRED=True
      - ADMIN_USERS=admin@alerta.io
      - PLUGINS=remote_ip,reject,heartbeat,blackout,prometheus
      - ALERTMANAGER_API_URL=http://alertmanager:9093
    restart: always
    networks:
      - promnet
      - dbnet

  db:
    image: mongo
    volumes:
      - ./data/mongodb:/data/db
    restart: always
    networks:
      - dbnet

networks:
  promnet:
    driver: bridge
  dbnet:
    driver: bridge

Prometheus参数说明

--version

显示当前应用程序版本号.

--config.file="prometheus.yml"

指定Prometheus配置文件路径

--web.listen-address="0.0.0.0:9090"

监听API、UI、telemetry地址

--web.read-timeout=5m

读取超时与最大连接数的关闭时间

--web.max-connections=512

当前连接的最大连接数

--web.external-url=<URL>

配置Prometheus外部访问的URL

--web.route-prefix=<path>

WEB节点的内部路由前缀.默认路径是 --web.external-url.

--web.user-assets=<path>

静态资源目录的路径,位于/user

--web.enable-lifecycle

启用重载配置文件

--web.enable-admin-api

为ADMIN启用API访问

--web.console.templates="consoles"

console模板目录的路径,位于/consoles

--web.console.libraries="console_libraries"

console 库存储路径

--web.page-title="Prometheus Time Series Collection and Processing Server"

Prometheus的文档示例标题

--web.cors.origin=".*"

用于CORS来源的正则表达式. Example: 'https?://(domain1|domain2).com'

--storage.tsdb.path="data/"

TSDB指标数据存储路径

--storage.tsdb.retention=STORAGE.TSDB.RETENTION

数据保留时间.此项参数已经被弃用, 使用 storage.tsdb.retention.time.

--storage.tsdb.retention.time=STORAGE.TSDB.RETENTION.TIME

数据保存多长时间。开启此设置,它将覆盖“ storage.tsdb.retention”。如果 storage.tsdb.retentionstorage.tsdb.retention.size 都未开启,则数据保留时间默认为15天。

--storage.tsdb.retention.size=STORAGE.TSDB.RETENTION.SIZE

块存储的最大字节数,支持的单位KB,MB,GB,TB,PB;此参数仅为测试。

--storage.tsdb.no-lockfile

不在数据目录创建锁文件

--storage.tsdb.allow-overlapping-blocks

允许重叠的Blocks,从而启用垂直压缩和垂直查询合并。

--storage.tsdb.wal-compression

压缩 tsdb WAL.

--storage.remote.flush-deadline=<duration>

关闭或配置重载时的等待时间

--storage.remote.read-sample-limit=5e7

在单个查询中通过远程读取接口返回的最大样本总数. 0表示没有限制.对于流式响应类型,将忽略此限制.

--storage.remote.read-concurrent-limit=10

并发远程读取调用的最大数. 0表示没有限制.

--storage.remote.read-max-bytes-in-frame=1048576

编组之前用于流式传输远程读取响应类型的单个帧中的最大字节数。请注意,客户端也可能会限制帧大小。默认为protobuf建议的1MB

--rules.alert.for-outage-tolerance=1h

容忍Prometheus中断恢复警报 for 状态的最长时间。

--rules.alert.for-grace-period=10m

警报和恢复的 for 状态之间的最短持续时间。仅对于配置的 for 时间大于限期的警报,此状态才会有效。

--rules.alert.resend-delay=1m

警报重新发送到Alertmanager之前等待的最小时间.

--alertmanager.notification-queue-capacity=10000

等待的Alertmanager通知的队列数.

--alertmanager.timeout=10s

向Alertmanager发送警报的超时时间.

--query.lookback-delta=5m

表达式求值期间检索指标的最大回溯持续时间

--query.timeout=2m

查询中止前需要花费的最长时间

--query.max-concurrency=20

并发执行的最大查询数

--query.max-samples=50000000

单个查询可以加载到内存中的最大样本数。注意:如果查询尝试将更多的样本加载到内存中,则查询将失败,因此这也限制了查询可以返回的样本数。

--log.level=info

记录日志级别,可选参数: [debug, info, warn, error]

--log.format=logfmt

日志消息的输出格式. 可选参数: [logfmt, json]

配置文件说明

# https://prometheus.io/docs/prometheus/latest/configuration/configuration/
# 全局配置
global:
  scrape_interval: 30s # 秒抓取一次数据,默认值为1分钟
  scrape_timeout: 30s # 抓取超时时间
  evaluation_interval: 60s # 每15分钟检测一次可用性,默认值为1分钟
  #scrape_timeout: 60s # 全局设置超时时间,这个注掉了。
  external_labels: # 联邦的label标识,可以附加在警报中,这样用于标识警报来源于那个Prometheus或Alertmanager
    dc: prom-master
# Alertmanager配置,需要在targets添加ip和端口,也可以使用主机名和域名
alerting:
  alertmanagers:
    - static_configs:
        # 此处可以配置成集群模式,也可以使用单一节点,后续会在Alertmanager章节详细讲解如何做Alertmanager集群高可用
        - targets: ['127.0.0.1:9097']
        #- targets: ['127.0.0.1:9098']
        #- targets: ['127.0.0.1:9099']

# 根据全局文件 'evaluation_interval' 的时间,根据 rule 配置文件进行检查,可配置多个。
# 可以没有配置文件,但是目录必须存在。
rule_files:
  - "/data/prometheus/rule_ssl/*.yml"
  - "/data/prometheus/rule_prod/*.yml"
# 抓取配置配置
scrape_configs:
  - job_name: 'http_200_monitor'
    metrics_path: /probe
    params:
      module: [http_2xx]  # 探测 HTTP POST 200 响应配置模块,返回值必须是200
    scrape_interval: 30s # 抓取时间
    file_sd_configs:
      - files:
        # 此处为blackbox 探测域名配置文件
        - /data/prometheus/domain_config/get.yml
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 127.0.0.1:9115  # blackbox exporter的IP、端口.
  - job_name: 'http_post_200_monitor'
    metrics_path: /probe
    params:
      module: [http_post_2xx_query]  # 探测 HTTP POST 200  响应配置模块.
    scrape_interval: 30s
    file_sd_configs:
      - files:
        - /data/prometheus/prod_config/domain_config/post.yml
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 127.0.0.1:9115
# consul 抓取规则
  - job_name: 'prod'
    metrics_path: /metrics
    honor_labels: false
    consul_sd_configs:
    - server: '172.x.x.x:8500'
      token: '2222-3333-5555-7777-99999'
      services: []
    relabel_configs:
      - source_labels: ['__address__']
        regex: (.*):(.*)8300
        action: drop
      - source_labels: ['__meta_consul_service']
        regex:         '(.*)'
        target_label:  'service'
        replacement:   '$1'
      - source_labels: ['__meta_consul_service_address']
        regex:         '(.*)'
        target_label:  'instance'
        replacement:   '$1'
      - source_labels: ['__meta_consul_service_port']
        regex:         '(.*)'
        target_label:  'instance'
        replacement:   '$2'
      - source_labels: ['__meta_consul_tags']
        regex:        ".*,(.*),.*"
        replacement:   '${1}'
        target_label:  'app'

验证

打开Prometheus web页面,在Console中使用 Metrics promhttp_metric_handler_requests_total 进行演示,这个 Metrics 是 prometheus 自身的 http 请求数。

prom1

切换到Graph,可以看到Metrics的曲线图。

prom2

Prometheus服务重载

Prometheus 对于更新配置文件,需要服务重启,如果在生产环境,随便重启服务是不可取的,因此需要热加载功能。

2.0 以后,热加载功能默认是关闭的,如需开启,需要在启动 Prometheus的时候,添加 --web.enable-lifecycle 参数。

curl -X POST http://192.168.1.210:9090/-/reload