docker上でgrafanaを使って様々な監視と通知をさせる
かなり久しぶりの更新です。
最近は開発者でもある程度インフラの事が出来ないといけない風潮になってきました。
ジェネラリストになる道もあるとは思うのですが、開発の割当時間をもっと増やしたいと思っている今日このごろです。
今回はインフラ周りの技術がテーマです。
会社でgrafana & prometheusを使って色々と監視やアラートを出す設定をしているのですが、自宅環境ではまだ対応出来ていなかったので設定していきます。
特に自宅環境は、非力なマシン上でdocker-containerをたくさん起動して公開しているので、grafanaでホストとコンテナの統合監視を実現します。
構成
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
ボタンを押下します。
grafanaのユーザ追加
次に、Add Usersに進みinvite
ボタンを押下して、作成するユーザ情報を入力します。
Send invite emailにチェックを入れておきます。
Invite
ボタンを押すとメールが送信されます。
このメールはmailhogが受けてくれているので、以下を開いてメール内容を確認します。
http://IPアドレス:8025/
メールの受信を確認出来たら、Accept Invitation
ボタンを押して登録を完了させてください。
これで初期設定は完了です。
細かい設定やtipsについては、今後の別記事として書いて行きますが、現状は以下のような感じで運用しています。
サービスの停止やリソース減少時にすぐにslackにアラート通知が来るので、とても便利です。