Prometheus 学习笔记

Prometheus 是由 SoundCloud 开源监控告警解决方案,主要模块包含 Server, Exporters, Pushgateway, PromQL, Alertmanager, WebUI 等。
Prometheus 核心组件有 Prometheus Server(抓取数据和存储时序数据,提供查询和 Alert Rule 配置管理),client libraries(对接 Prometheus Server, 查询和上报数据),push gateway (批量,短期的监控数据的汇总节点,业务数据汇报等), exporters (汇报机器数据的 node_exporter)以及 alertmanager (警通知管理)。

安装

二进制安装

  1. # wget https://github.com/prometheus/prometheus/releases/download/v2.13.0/prometheus-2.13.0.darwin-amd64.tar.gz
    
  2. 解压压缩包
    # tar xvfz prometheus-*.tar.gz
    # cd prometheus-*
    
  3. 主服务器端运行程序
    # ./prometheus --config.file=prometheus.yml
    
  4. 从服务器端下载最新 Node_Exporter 并运行(该步骤需要先前配置好 prometheus.yml)
    # wget https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.darwin-amd64.tar.gz
    # tar xvfz node_exporter-*.*-amd64.tar.gz
    # cd node_exporter-*.*-amd64
    # ./node_exporter
    

Docker 安装

  1. 主服务器端执行 Docker 命令
    1. 通过挂载映射配置文件运行
      # docker run -p 9090:9090 -v /tmp/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
      
    2. 通过运行参数读取配置文件运行
      # docker run -p 9090:9090 -v /prometheus-data prom/prometheus --config.file=/prometheus-data/prometheus.yml
      
  2. 从服务器端执行 Docker 命令
    docker run -d -p 9100:9100 \
    -v "/proc:/host/proc:ro" \
    -v "/sys:/host/sys:ro" \
    -v "/:/rootfs:ro" \
    --net="host" \
    prom/node-exporter
    

配置

全局配置

  • scrape_interval: 拉取 targets 的默认时间间隔。
  • scrape_timeout: 拉取一个 target 的超时时间。
  • evaluation_interval: 执行 rules 的时间间隔。
  • external_labels: 额外的属性,会添加到拉取的数据并存到数据库中。

告警配置

  • alert_relabel_configs: 动态修改 alert 属性的规则配置。
  • alertmanagers: 用于动态发现 Alertmanager 的配置。

规则配置

  • 主要用于配置规则文件,它支持多个文件以及文件目录。

数据拉取配置

  • job_name:任务名称
  • honor_labels: 用于解决拉取数据标签有冲突,当设置为 true, 以拉取数据为准,否则以服务配置为准
  • params:数据拉取访问时带的请求参数
  • scrape_interval: 拉取时间间隔
  • scrape_timeout: 拉取超时时间
  • metrics_path: 拉取节点的 metric 路径
  • scheme: 拉取数据访问协议
  • sample_limit: 存储的数据标签个数限制,如果超过限制,该数据将被忽略,不入存储;默认值为0,表示没有限制
  • relabel_configs: 拉取数据重置标签配置
  • metric_relabel_configs:metric 重置标签配置

远程可写存储

  • url: 访问地址
  • remote_timeout: 请求超时时间
  • write_relabel_configs: 标签重置配置, 拉取到的数据,经过重置处理后,发送给远程存储

远程可读存储

  • url: 访问地址
  • remote_timeout: 请求超时时间

服务发现

  • static_configs: 静态服务发现
  • dns_sd_configs: DNS 服务发现
  • file_sd_configs: 文件服务发现
  • consul_sd_configs: Consul 服务发现
  • serverset_sd_configs: Serverset 服务发现
  • nerve_sd_configs: Nerve 服务发现
  • marathon_sd_configs: Marathon 服务发现
  • kubernetes_sd_configs: Kubernetes 服务发现
  • gce_sd_configs: GCE 服务发现
  • ec2_sd_configs: EC2 服务发现
  • openstack_sd_configs: OpenStack 服务发现
  • azure_sd_configs: Azure 服务发现
  • triton_sd_configs: Triton 服务发现

配置实例

  1. prometheus.yml
    global:
    scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
    evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
    alerting:
    alertmanagers:
    - static_configs:
    - targets:
       - altermanager:9093   #设置altermanager的地址,后文会写到安装altermanager
    rule_files:
    - "first_rules.yml"   # 设置报警规则
    # - "second_rules.yml"
    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']   #这个自带的默认监控prometheus所在机器的prometheus状态
    - job_name: "uat-apps-status"      # 自己定义的监控的job_name
    static_configs:
      - targets: ['192.168.98.73:9091']   # 指向pushgateway.  我在每台机器上使用的是推的方式到pushgateway,所以采取了此种方式。
        labels:
          instance: uat    #新添加的标签,可以自定义
    scrape_interval: 60s
    
  2. alert_rules.yml
    groups:
    - name: example   #报警规则的名字
    rules:
    
    # Alert for any instance that is unreachable for >5 minutes.
    - alert: InstanceDown     #检测job的状态,持续1分钟metrices不能访问会发给altermanager进行报警
    expr: up == 0
    for: 1m    #持续时间
    labels:
      serverity: page
    annotations:
      summary: "Instance {{ $labels.instance }} down"
      description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."
    
    - alert: "it's has problem"  #报警的名字
    expr: "test_tomcat{exported_instance="uat",exported_job="uat-app-status",host="test",instance="uat",job="uat-apps-status"} -  test_tomcat{exported_instance="uat",exported_job="uat-app-status",host="test",instance="uat",job="uat-apps-status"} offset 1w > 5"   # 这个意思是监控该表达式查询出来的值与一周前的值进行比较,大于5且持续10m钟就发送给altermanager进行报警
    for: 1m  #持续时间
    labels:
      serverity: warning
    annotations:
      summary: "{{ $labels.type }}趋势增高"
      description: "机器:{{ $labels.host }} tomcat_id:{{ $labels.id }} 类型:{{ $labels.type }} 与一周前的差值大于5,当前的差值为:{{ $value }}"    #自定义的报警内容
    

数据可视化

自带 WebUI

Prometheus 自带了 Web Console, 安装成功后可以访问 http://localhost:9090/graph 页面,用它可以进行任何 PromQL 查询和调试工作。Prometheus 自带的 Web 界面比较简单,因为它的目的是为了及时查询数据,方便 PromeQL 调试。
因此在这方面,更推荐使用 Grafana。

Grafana

  1. 下载安装最新安装包并启动。
  2. 打开http://[IP_Address]:3000 配置Grafana(默认用户密码为admin/admin,第一次登陆会提示你改密码)
  3. 选择Prometheus为数据源,并进行配置。
  4. 这里选择一个合适的模板,然后在 Grafana 中导入和即可展示数据。
  • 注:也可以使用 Docker 安装 Grafana
    # chmod 777 /opt/grafana-storage
    # docker run -d \
    -p 3000:3000 \
    --name=grafana \
    -v /opt/grafana-storage:/var/lib/grafana \
    grafana/grafana
    

PromQL

查询条件

Prometheus 存储的是时序数据,而它的时序是由名字和一组标签构成的,其实名字也可以写出标签的形式,例如 http_requests_total 等价于 {name=”http_requests_total”}。
一个简单的查询相当于是对各种标签的筛选,例如:
$ http_requests_total{code="200"} // 表示查询名字为 http_requests_total,code 为 "200" 的数据
查询条件支持正则匹配,例如:
http_requests_total{code!="200"}  // 表示查询 code 不为 "200" 的数据
http_requests_total{code=~"2.."} // 表示查询 code 为 "2xx" 的数据
http_requests_total{code!~"2.."} // 表示查询 code 不为 "2xx" 的数据

查询结果类型

PromQL 查询结果主要有 3 种类型:
  • 瞬时数据 (Instant vector): 包含一组时序,每个时序只有一个点,例如:http_requests_total
  • 区间数据 (Range vector): 包含一组时序,每个时序有多个点,例如:http_requests_total[5m]
  • 纯量数据 (Scalar): 纯量只有一个数字,没有时序,例如:count(http_requests_total)

参考资料

评论