a tomato

トマトが大好きです

docker上でgrafanaを使って様々な監視と通知をさせる

かなり久しぶりの更新です。

最近は開発者でもある程度インフラの事が出来ないといけない風潮になってきました。
ジェネラリストになる道もあるとは思うのですが、開発の割当時間をもっと増やしたいと思っている今日このごろです。

今回はインフラ周りの技術がテーマです。

会社でgrafana & prometheusを使って色々と監視やアラートを出す設定をしているのですが、自宅環境ではまだ対応出来ていなかったので設定していきます。

特に自宅環境は、非力なマシン上でdocker-containerをたくさん起動して公開しているので、grafanaでホストとコンテナの統合監視を実現します。

f:id:kzdev:20200209022835p:plain

構成

f:id:kzdev:20200209025011p:plain

grafana

様々なデータソースを元にダッシュボードやアラート設定を行う事ができます。

prometheus

様々なリソースの監視を行いデータソースとして蓄積、抽出が可能。
監視自体はexporterと呼ばれるモジュールに委任されていて、prometheusがexporterに対してポーリングを行います。

alertmanager

アラート通知に特化したprometheusの追加モジュール。Emailやチャットなど色々な通知が可能。

cAdvisor

dockerコンテナの情報を収集して、prometheusに情報を連携するためのモジュール。
ホスト上で動作しているコンテナの情報を収集してくれる。

mailhog

メール受信コンテナ。WEBの管理画面から受信したメールを確認可能。
今回はgrafanaのユーザ作成時のメール受信のために用意。

環境

  • CentOS Linux release 7.7.1908
  • Docker version 19.03.5, build 633a0ea
  • docker-compose version 1.25.4, build 8d51620a

docker起動

以下の内容でdocker-compose.ymlを用意する。
ホスト側のポート番号はお使いの環境に合わせて、バッティングしないものに変更して下さい。

version: '3.7'
volumes:
    prometheus_data: {}
services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    volumes:
      - ./prometheus:/etc/prometheus
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yaml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/usr/share/prometheus/console_libraries'
      - '--web.console.templates=/usr/share/prometheus/consoles'
    ports:
      - 9090:9090
    restart: always
  exporter:
    image: prom/node-exporter:latest
    container_name: node-exporter
    ports:
      - 9100:9100
    restart: always
  grafana:
    image: grafana/grafana
    container_name: grafana
    ports:
      - 3001:3000
    restart: always
    volumes:
      - ./grafana-data:/var/lib/grafana
    environment:
      - GF_SMTP_ENABLED=true
      - GF_SMTP_HOST=mailhog_mail_1:1025
      - GF_SMTP_FROM_ADDRESS=送信元アドレス
      - GF_ALERTING_ERROR_OR_TIMEOUT=keep_state
    external_links:
      - mailhog_mail_1
    networks:
      - default
      - grafana_default
  alertmanager:
    image: prom/alertmanager
    container_name: alertmanager
    volumes:
      - ./alertmanager:/etc/alertmanager
    command: "--config.file=/etc/alertmanager/config.yaml"
    ports:
      - 9093:9093
    restart: always
  cadvisor:
    image: google/cadvisor:latest
    restart: unless-stopped
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
    expose:
      - 8080
  nginx-exporter:
    #image: fish/nginx-exporter
    image: nginx/nginx-prometheus-exporter:0.5.0
    ports:
      - 9113:9113
    command:
      - "-nginx.scrape-uri=http://監視したいNGINXサーバ:80/stub_status"
      - "-web.telemetry-path=/metrics"

networks:
  grafana_default:
    external:
      name: mailhog_default

続いて、モジュールの設定ファイルを格納するフォルダを用意します。

mkdir prometheus
mkdir alertmanager

prometheusの設定ファイルを以下の内容で作成します。

vim prometheus/prometheus.yaml

---
global:
  scrape_interval:     15s
  evaluation_interval: 15s
  external_labels:
      monitor: 'codelab-monitor'

rule_files:
  - /etc/prometheus/alert.rules

alerting:
  alertmanagers:
    - scheme: http
      static_configs:
      - targets:
        - alertmanager:9093

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets:
        -  prometheus:9090
        -  node-exporter:9100
        -  cadvisor:8080
        -  nginx-exporter:9113

続いて、アラートルールの設定ファイルを以下の内容で作成します。

vim prometheus/alert.rules

---
groups:
- name: down
  rules:
  - alert: instance_down
    expr: up == 0
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "Instance {{ $labels.instance }} down"
      description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."

更に、alertmanager用の設定ファイルを以下の内容で作成します。

vim alertmanager/config.yaml

---
global:
  slack_api_url: SLACK通知先のWEB-HOOK URL

route:
  receiver: 'slack'

receivers:
  - name: 'slack'
    slack_configs:
    - channel: 'SLACK通知先のチャンネル名'

準備が出来たので、dockerを起動していきます。

docker-compose up -d 

grafanaの初期設定

http://<IPアドレス>:3001にアクセスします。
初回はadmin/adminでログイン出来ます。ログイン後にパスワード変更を促されるので変更して下さい。

続いて、Add data sourceに進みPrometheusを選択します。
設定は、以下のようにURLを指定して、Save & Testボタンを押下します。

f:id:kzdev:20200209031551p:plain

grafanaのユーザ追加

次に、Add Usersに進みinviteボタンを押下して、作成するユーザ情報を入力します。
Send invite emailにチェックを入れておきます。

Inviteボタンを押すとメールが送信されます。

このメールはmailhogが受けてくれているので、以下を開いてメール内容を確認します。

http://IPアドレス:8025/

f:id:kzdev:20200209032203p:plain

メールの受信を確認出来たら、Accept Invitationボタンを押して登録を完了させてください。

これで初期設定は完了です。
細かい設定やtipsについては、今後の別記事として書いて行きますが、現状は以下のような感じで運用しています。
サービスの停止やリソース減少時にすぐにslackにアラート通知が来るので、とても便利です。

f:id:kzdev:20200209032621p:plain

f:id:kzdev:20200209033243p:plain

参考

grafana.com prometheus.io