prometheus基础


1、下载prometheus

cd /usr/local/src
wget https://github.com/prometheus/prometheus/releases/download/v2.31.1/prometheus-2.31.1.linux-amd64.tar.gz tar xf prometheus-2.31.1.linux-amd64.tar.gz
mv prometheus-2.31.1.linux-amd64 /usr/local/prometheus-2.31.1

2、创建基础配置文件

cd /usr/local/prometheus-2.31.1
vim prometheus.yml
# 全局配置
global: scrape_interval: 15s # 默认,每隔15秒钟抓取一次数据
# 在与外部系统(比如federation,远程存储系统,Altermanager)通信时,以下标签会贴到时间序列或者告警的后面 external_labels: monitor: 'codelab-monitor' # 抓取配置
# 在这里配置要抓取的地址 scrape_configs: # 任务名会被添加时间序列数据中,稍后会在后面的示例中看到任务名的位置
- job_name: 'prometheus' # 针对prometheus任务,我们设置5s抓取一次数据,覆盖了全局的15s scrape_interval: 5s
# 静态配置,在这里填写所有目标地址的信息,协议默认是http,路径默认是/metrics
# 即抓取数据时,其实是访问 http://localhost:9090/metrics static_configs: - targets: ['localhost:9090']

3、启动prometheus

./prometheus --config.file=prometheus.yml

prometheus默认将数据存储在当前目录的data目录下,即:

如果要指定其他存储路径(比如存储到/data/prometheus_data),则添加参数:

./prometheus --config.file=prometheus.yml --storage.tsdb.path=/data/prometheus_data

4、访问prometheus的状态页

浏览器访问:http://localhost:9090/,页面如下所示

如果是远程地址,则访问:http://ip:9090/

5、使用表达式浏览器

prometheus会从http://localhost:9090/metrics地址读取数据,然后存储起来,之后就可以在状态页面上查询这些数据。

切换到graph标签,然后在表达式浏览器中输入prometheus_target_interval_length_seconds,该度量名

表示每次抓取数据的间隔时间,比如第一次抓取是10:15:05,第二次抓取是10:15:10,则间隔时间是5s。

上面是5个时间序列,同时,这5个时间序列都记录了一个值,反映在上面的图中。

在上面的图中,每个时间点,都有5个值。

每个时间序列的组成:度量名 + 标签

其中prometheus_target_interval_length_seconds是度量名,{}代表的就是标签。由于标签内的quantile不同,因此这是5个不同的标签。

其中quantile代表分位数。

这些标签通过quantile指定了不同的延迟百分比。

如果只对99%延迟感兴趣,则执行表达式:prometheus_target_interval_length_seconds{quantile="0.99"}

此时图中只有一条线。

如果要计算返回的时间序列的数量,则执行表达式:count(prometheus_target_interval_length_seconds)

更详细的表达式语法在:https://prometheus.io/docs/prometheus/latest/querying/basics/

6、使用目标样例

下载node_exporter并启动:

wget https://github.com/prometheus/node_exporter/releases/download/v*/node_exporter-*.*-amd64.tar.gz
tar xvfz node_exporter-*.*-amd64.tar.gz
cd node_exporter-*.*-amd64

# 在不同的终端中启动这2个node_exporter
./node_exporter --web.listen-address 127.0.0.1:8080
./node_exporter --web.listen-address 127.0.0.1:8081
./node_exporter --web.listen-address 127.0.0.1:8082

然后修改prometheus的配置文件,从而让prometheus监控这3个目标:

scrape_configs:
  # 这是针对prometheus任务的配置
  - job_name: 'prometheus'

    scrape_interval: 5s

    static_configs:
      - targets: ['localhost:9090']

  # 这是针对node任务的配置
  - job_name:       'node'

    scrape_interval: 5s

    static_configs:
      - targets: ['localhost:8080', 'localhost:8081']
        # 给8080和8081绑定标签 group: 'production',以表示这两个目标是生产服务器
        labels:
          group: 'production'

      - targets: ['localhost:8082']
        # 给8082绑定标签 group: 'canary',以表示这个目标是候选服务器
        labels:
          group: 'canary'

http://localhost:8080/metrics

http://localhost:8081/metrics

http://localhost:8082/metrics

之后,prometheus就会从上述三个地址抓取数据。

验证是否抓取到数据:

node_cpu_seconds_total

展示node任务下,所有目标的cpu总秒数

这是目标 8080 上的cpu0的情况,总共有8个mode,因此有8个时间序列,所以在单个时间点,会有8个数据。(每个时间序列携带一个数据)

这是目标 8080 上的cpu1的情况,总共有8个mode,因此有8个时间序列,所以在单个时间点,会有8个数据。(每个时间序列携带一个数据)

7、配置规则,将已抓取的数据聚合成新时间序列

如果执行一个查询,该查询需要聚合上千个时间序列来计算,可能会很慢。

执行一个常规的聚合查询:avg by (job, instance, mode) (rate(node_cpu_seconds_total[5m]))

现在创建一个规则文件:

vim prometheus.rules.yml
groups:
- name: cpu-node
  rules:
  # 创建的新时间序列(从其他表达式聚合而来)
  - record: job_instance_mode:node_cpu_seconds:avg_rate5m
    expr: avg by (job, instance, mode) (rate(node_cpu_seconds_total[5m]))

修改prometheus.yml文件,以加载规则文件:

global:
  scrape_interval:     15s  
  evaluation_interval: 15s   # 每隔15s评估一次规则

  external_labels:
    monitor: 'codelab-monitor'

rule_files:
  - 'prometheus.rules.yml'

scrape_configs:
  - job_name: 'prometheus'

    scrape_interval: 5s

    static_configs:
      - targets: ['localhost:9090']

  - job_name:       'node'

    scrape_interval: 5s

    static_configs:
      - targets: ['localhost:8080', 'localhost:8081']
        labels:
          group: 'production'

      - targets: ['localhost:8082']
        labels:
          group: 'canary'

重新启动prometheus,然后执行新表达式:

job_instance_mode:node_cpu_seconds:avg_rate5m

重启之后: