iT邦幫忙

2021 iThome 鐵人賽

DAY 21
0
Software Development

一個新鮮人如何完轉Spring boot與DevOps從0到101系列 第 21

配置 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 兼容
  • 等等

上一篇
Prometheus 與 Spring boot
下一篇
初探 OpenTelemetry
系列文
一個新鮮人如何完轉Spring boot與DevOps從0到10130

尚未有邦友留言

立即登入留言