跳到主要內容

Prometheus + Grafana + Exporters = Server Monitor

Grafana
功能強大且美觀的Dashboard
Prometheus
用來作為數據收集及儲存,透過設定至各 exporter 端"拉"資料回來
exporter
Prometheus exporter

環境建置


使用 docker-compose 時,會依所在目錄建立 ${path}-default docker network
純粹為了賞心悅目 建立一個 monitor-net 集中堆放 Grafana , Prometheus , xxxx exporter

建立 docker network



docker network create monitor-net


Grafana + Prometheus docker-compose.yml


version: '3' 
services: 
  grafana:
    image: grafana/grafana
    ports:
     - 9000:9000
     - 9010:3000
    environment:
     - GF_SERVER_ROOT_URL= 
     - GF_SECURITY_ADMIN_PASSWORD=
    volumes:  # copy grafana.ini to /etc/grafana
     - /etc/grafana/grafana.ini:/etc/grafana/grafana.ini
     - /var/lib/grafana:/var/lib/grafana
     - /var/log/grafana:/var/log/grafana
    container_name: my-grafana
    restart: always
    networks:
      - myonitornet
  prometheus:
    image: prom/prometheus
    ports:
     - 9090:9090
    volumes:   # copy prometheus.yml to /etc/prometheus
     - /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
    command: --config.file=/etc/prometheus/prometheus.yml
    container_name: my-prometheus
    restart: always
    networks:
      - myonitornet
networks:
  myonitornet:
    external:
      name: monitor-net


Others exporter docker-compose.yml



version: '3' # 目前使用的版本,可以參考官網
services: 
  nodeexporter:
    image: prom/node-exporter
    ports: 
     - 9100:9100
    container_name: my-nodeexporter
    restart: always
    networks:
        - myonitornet
  cadivor:
    image: google/cadvisor
    ports:
      - 9111:8080
    container_name: my-cadivor
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
      - /dev/disk/:/dev/disk:ro
    restart: always
    networks:
        - myonitornet
  redisexporter:
    image: oliver006/redis_exporter
    ports:
     - 9121:9121
    container_name: my-redisexporter
    environment:
      - REDIS_ADDR=# ${redis domain}:${redis port}
      - REDIS_PASSWORD=# ${redis password}
    restart: always
    networks:
        - myonitornet
  mysqlexporter:
    image: prom/mysqld-exporter
    ports:
     - 9131:9104
    environment:
      # ${user name}@${password}@)${domain}:${port}}/${database}
      - DATA_SOURCE_NAME=
    container_name: my-mysqlexporter
    restart: always
    networks:
        - myonitornet
  esexporter:
    image: justwatch/elasticsearch_exporter:1.1.0
    ports:
      - 9141:9114
    container_name: my-esexporter
    command:
      - '--es.uri=# ${es address}:${es port}
    restart: always
    networks:
        - myonitornet
networks:
  myonitornet:
    external:
      name: monitor-net
  


環境設定


Prometheus Config

Examples



global:
    scrape_interval: 15s
    external_labels:
      monitor: 'my-monitor'
  scrape_configs:
    - job_name: 'prometheus'
      scrape_interval: 5s
      static_configs:
        - targets: ['${prometheus server}:9090']
    - job_name: 'node resources'
      scrape_interval: 10s
      tls_config:
        insecure_skip_verify: true
      static_configs:
        - targets: ['${server 1}:9100']
        - targets: ['${server 2}:9100']
    - job_name: 'cadvisor'
      scrape_interval: 10s
      static_configs:
        - targets: ['${server 1}:9111']
        - targets: ['${server 2}:9111']
    - job_name: 'redis resources'
      scrape_interval: 10s
      static_configs:
        - targets: ['${server 1}:9121']
        - targets: ['${server 2}:9121']
    - job_name: 'mysql resources'
      scrape_interval: 10s
      static_configs:
        - targets: ['${server 1}:9131']
    - job_name: 'elasticsearch resources'
      scrape_interval: 10s
      static_configs:
        - targets: ['${server 1}:9141']
    


Grafana Config

留言

這個網誌中的熱門文章

FluentD 存取 File Log

其他文章參考 FluentD 存取 Nginx Access Log (1/2) FluentD 存取 Nginx Access Log (2/2) 以上是 Nginx + FluentD + (ES|Mongo) Demo 針對access.log 做解析 現在以Log4X 產生的日誌檔作為範例說明 會遇到的問題有 日誌內容會有多行的情況 # multiline 希望每條日誌內容加入 UUID 以便追蹤 # https://github.com/chaeyk/fluent-plugin-add-uuid 使用 Slack 作為通知的通道 # https://github.com/sowawa/fluent-plugin-slack Log4X Layout Format Example <?xml version="1.0" encoding="utf-8" ?> <configuration> <log4net> <appender name="All" type="log4net.Appender.RollingFileAppender"> <file value="/var/log/web.log" /> <appendToFile value="true" /> <rollingStyle value="Size" /> <datePattern value="yyyy-MM-dd" /> <maximumFileSize value="5MB" /> <maxSizeRollBackups value="10" /> <staticLogFileName value="true" /> <PreserveLogFileNameExtension value=...

申請免費 SSL,自動續訂

參考 acme.sh 搭配 GoDaddy 自動續期 Let's Encrypt 免費萬用憑證 使用 acme.sh + Cloudflare 申請免費 Wildcard SSL (Let’s Encrypt) 節略如下 安裝 acme.sh # 安裝 acme.sh ,安裝後重新登入 curl https://get.acme.sh | sh # 自動更新 acme.sh --upgrade --auto-upgrade acme.sh 設定存取 Goddy vi ~/.acme.sh/account.conf # Goddy API GD_Key="" GD_Secret="" acme.sh 設定存取 Cloudflare # Cloudflare API Keys # Global API Key [View] export CF_Key="" export CF_Email="" 申請網域(Domain)的萬用憑證,成功後會顯示憑證存放的路徑 $> acme.sh --issue --dns dns_gd -d ${domain} -d *.${domain} 安裝憑證 # 建立 /etc/nginx/ssl/${domain} 路徑 $> acme.sh --install-cert -d ${domain} --key-file /etc/nginx/ssl/${domain}/key.pem --fullchain-file /etc/nginx/ssl/${domain}/cert.pem --reloadcmd "sudo nginx -s reload"

FluentD 實作 Nginx Access Log 補充

FluentD 實作 Nginx Access Log 補充 前一篇針對 FluentD 安裝 及 Nginx Access log format 設定提供範例 本篇補充 1. 將 access_log 存入 MySQL 2. 針對Input 加工,ex 解析 Path 拆成不同欄位,在傳入 Output 延伸閱讀 FluentD 參數說明 FluentD 實作 Nginx Access Log 將 access_log 存入 MySQL <worker 0> <source> ... 略 </source> <match nginx.web.access> @type copy ... 略 <store> @type sql host ${MySQL Host address} port ${MySQL Port} adapter mysql2 database ${MySQL Database} username ${MySQL User Name} password ${MySQL Password} <table> table ${MySQL table} column_mapping 'logtime:logtime,method:method,path:path,code:code,size:size,resptime:resptime,token:token,path_url:path_url,timestamp:created_at' </table> </store> </match> </worker> 針對Input 加工,ex 解析 Path 拆成不同欄位,在傳入 Output 情境: 以下 access log 範例,需要針對 Query Parameter 拆解並存入新欄位,以利分析. [27/Dec/2019:07:14:10 ...