配置 Promethues 与 Grafana

docker-compose 范例可参考 github 上的配置,主要是 prometheus、pushgateway 和 grafana 如果需要搭配告警需要 alertmanager 服务。nodeexporter 是官方提供监控主机资源的服务可参考此链结。同样的使用 docker-compose up 就可以将服务启动,但是配置档需要依照需求进行修正。9090 Port 是 prometheus 预设的服务存取。

version: '3.6'
services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    volumes:
      - ./prometheus:/etc/prometheus
      - prometheus_pv:/prometheus
    command:
      - '--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=24h'
      - '--web.enable-lifecycle'
    restart: unless-stopped
    expose:
      - "9090"
    ports:
      - 3010:9090
    networks:
      - monitor-net
    labels:
      org.label-schema.group: "monitor"
    depends_on:
      - grafana
      - nodeexporter
      - pushgateway
      - alertmanager
  
  pushgateway:
    image: prom/pushgateway
    container_name: pushgateway
    volumes:
      - pushgateway_pv:/data
    command:
      - --persistence.file=/data/pushgateway.data
      - --persistence.interval=1h
    restart: unless-stopped
    expose:
      - 9091
    ports:
      - 8080:9091
    networks:
      - monitor-net
    labels:
      org.label-schema.group: "monitor"

  alertmanager:
    image: prom/alertmanager
    container_name: alertmanager
    volumes:
      - ./alertmanager:/prometheus
      - alertmanager_pv:/data
    command:
      - '--config.file=/prometheus/alertmanager.yml'
      - '--storage.path=/data'
    networks:
      - monitor-net
    labels:
      org.label-schema.group: "monitor"
      org.label-schema.service: "alert"

  grafana:
    image: grafana/grafana
    container_name: grafana
    user: "472"
    volumes:
      - grafana_pv:/var/lib/grafana # docker volume create grafana_pv
      - ./grafana/provisioning:/etc/grafana/provisioning
    env_file:
      - .env.grfana
    restart: unless-stopped
    ports:
      - 3000:3000
    networks:
      - monitor-net
    labels:
      org.label-schema.group: "monitor"

  nodeexporter:
    image: prom/node-exporter
    container_name: node_exporter
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.rootfs=/rootfs'
      - '--path.sysfs=/host/sys'
      - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)'
    restart: unless-stopped
    expose:
      - 9100
    network_mode: host
    labels:
      org.label-schema.group: "monitor"

networks:
  monitor-net:
    driver: bridge

volumes:
    prometheus_pv: {}
    grafana_pv: {}   
    alertmanager_pv: {}
    pushgateway_pv: {}

/prometheus/prometheus.yml 下配置相关的参数

global:
  scrape_interval: 5s # 多久获取一次目标
  evaluation_interval: 15s # 多久评估一次规则
rule_files: # 如果有使用 Alert,可用此关键字导入规则档案
  - alerts/*.yml
alerting:
  alertmanagers:
    - static_configs:
      - targets:
        # Alertmanager's default port is 9093
        - alertmanager:9093
scrape_configs: # 以下是设定要抓取资料的不同服务
  - job_name: 'nodeexporter' # 针对主机资源
    metrics_path: /metrics
    file_sd_configs:
      - files:
        - /etc/prometheus/nodeexporter.yml
        refresh_interval: 3m 
  - job_name: 'cadvisor' # 针对容器
    metrics_path: /metrics
    file_sd_configs:
      - files:
        - /etc/prometheus/cadvisor.yml
        refresh_interval: 3m 
  - job_name: 'postgresql-exporter' # 针对 postgresql 
    metrics_path: /metrics
    file_sd_configs:
      - files:
        - /etc/prometheus/postgresqlexporter.yml
        refresh_interval: 3m 
  - job_name: 'es-exporter' 
    scrape_interval: 60s
    scrape_timeout:  30s
    metrics_path: /metrics
    file_sd_configs:
      - files:
        - /etc/prometheus/elasticsearchexporter.yml
        refresh_interval: 3m 

  - job_name: 'pushgateway'
    scrape_interval: 5s
    honor_labels: true
    file_sd_configs:
      - files:
        - /etc/prometheus/pushgateway.yml
        refresh_interval: 3m

  - job_name: 'otel-collector'
    scrape_interval: 10s
    static_configs:
    file_sd_configs:
      - files:
        - /etc/prometheus/otel.yml

  - job_name: 'docker'
    static_configs:
      - targets: ['192.168.101.129:9323']
        labels:
          group: 'local'

  - job_name: 'prometheus'
    scrape_interval: 10s
    static_configs:
      - targets: ['localhost:9090']
        labels:
          group: 'local'

scrape_configs 下是设定要抓取资料的不同服务。job_name 可用来做一个识别,scrape_interval 获取 metric 的频率,static_configs 通常都用来指定其要监控服务的位置。在 Spring boot 中我们就会透过 pushgateway 方式将我们的 metric 传给 Prometheus。files 这些配置可以对应 /monitor/prometheus 下的内容。

PromQL

内建,支持两种向量,同时内建一组用於数据处理的函示

  • 即时向量
    • 最近一次时间戳上跟踪的数据指标
  • 时间范围向量
    • 指定时间范围内的所有时间戳上的数据指标
    • 通常与聚合函数共用
  • 标量
    • 一个浮点数的数据值
  • 字串
    • 可使用单引号或双引号、反引号(不会转义)

范围向量可写成 http_request_total{method="Get"} offset 5m 获取过去 5 分钟的资料;http_request_total{method="Get"}[5m] offset 1d 获取一天之前的5分钟内资料

匹配器
  • 操作符
    • =
    • !=
    • =~
    • !~
范例
  • 每台主机 CPU 在 5 分钟内的平均使用率
    (1-avg(irate(node_cpu_seconds_total{mode='idle'}[5m])) by (instance)) * 100

服务发现

Prom 是基於 pull 方式抓取数据,因此需要事先知道各个 Target 的位置,因此才需要服务发现方式来动态侦测 Target。

  • 基於档案
    • 撰写额外的档案,并定义下面 yml 的内容至 prom 中
    • 变动可让 prom 定期询问更新
- job_name: "xxxx"
    file_sd_configs:
    - file:
      - target/*.yml # 档案路径
      refresh_interval: 2m # 每两分钟重新加载

指标抓取生命周期

  1. 服务发现
  • 发现 Target
  1. 配置
  2. 重新标签(relabe_configs)
  • 储存在 Prom 之前做的动作
  1. 抓取
  2. 重新标记(metric_relable_configs)
  • 抓取的指标在保存之前,允许用户端重新打标和过滤
    • 定义在 job 配置中的 metric_relabel_configs,通常用来删除不必要指标或着添加、删除、修改指标的标签值或格式

而每个 Target 都有标签。通常会有

  • __address__
    • 连接位置
  • __metrics_path__
    • 抓取 target 上指标时使用的 URL 路径,默认为 metrics
  • __scheme__
    • target 所使用的协定

Alert 生命周期

global:
  scrape_interval: 20s
  evaluation_interval: 1m

在 Prom 中我们设置每 20s 获取一次指标。评估间格(evaluation interval)为 1 分钟。我们触发一个告警会是:
指标监控时间+scrape_interval+evaluation_interval+FOR

更详细内容可参考此链接

配置

告警规则配置如下,可参考此地方其提供许多相关告警配置:

groups:

- name: host
  rules:
# Memory
# Node memory is filling up (< 10% left)
  - alert: HostOutOfMemory
    expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < 10
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: Host out of memory (instance {{ $labels.instance }})
      description: Node memory is filling up (< 10% left)\n  VALUE = {{ $value }}\n  LABELS = {{ $labels }}

同时 prom 也进行配置,以用来触发告警

rule_files: # 规则的路径
  - alerts/*.yml

alerting: # 与 alertmanagers 配置
  alertmanagers:
    - static_configs:
      - targets:
        # Alertmanager's default port is 9093
        - alertmanager:9093

通知的配置可参考此链接

Grafana

设置 datasource

简单来说就是数据来源。

新增一个仪表板来实验

使用 promQL 进行获取数据指标

仪表板设计

  • 汇入来至 grafana 官方社群友人提供的仪表板
    • 透过 ID 或是 Json 格式汇入
  • 自订义
Default paths
Setting Default value
GF_PATHS_CONFIG /etc/grafana/grafana.ini
GF_PATHS_DATA /var/lib/grafana
GF_PATHS_HOME /usr/share/grafana
GF_PATHS_LOGS /var/log/grafana
GF_PATHS_PLUGINS /var/lib/grafana/plugins
GF_PATHS_PROVISIONING /etc/grafana/provisioning

官方链接

这边个人对於 JVM 的内容其实不是很熟习,这一部分是我未来要学习的目标,虽然 Promethues 与 Grafana 都有配置好,但对於应用程序服务的程序语言或是生命周期这些不熟悉都是没意义的。

Actuator 部分提供了很多的端点给我们使用像

  • /health
    • 提供应用程序的健康状态
  • /prometheus
    • 返回指标(通用指标或自定义指标这些也许是 JVM 相关资讯 ),其格式为与 Prometheus 兼容
  • 等等

<<:  Leetcode 挑战 Day 18 [ 367. Valid Perfect Square ]

>>:  Day#06 新增

Day8# Array & Slice(下)

昨天没有写完的 Array & Slice(上) ,今天要来把补完进度。 那我们就开始吧 ─...

Day14 订单 -- 多项目结构

昨天看完基础结构後,有没有发现纪录购买商品的部份不是那麽范用, 包含数量、商品项目id、商品单价格等...

Day 1 行前说明

领队报告领队报告,Python爬虫之旅就要启程啦~ 请团员们准备好行李,我们准备出发! 今天的影片为...

[Day 25] BDD - godog image封装

封装 由於之後我打算将godog在CI/CD工具上定期跑BDD测试,所以我想要将godog封装在im...

[Day26] swift & kotlin 游戏篇!(8) 小鸡BB-游戏制作-历史纪录

Swift 游戏示意 Swift 游戏纪录 最後一个功能是游戏纪录 修改一下Player.swift...