KATOエンジニヤリング開発日誌

「アウトプット無きエンジニアにインプットもチャンスも無い」の精神で書いています

Software-Design 2018年2月号のPrometheus 2.0の記事 2

前回に引き続きサーバ監視ソフトであるPrometheusを触っていきます。

www.kato-eng.info

Prometheusの概要

Prometheusは大きく分けて次の4つのコンポーネントに分かれている。

  • Prometheus
    • 各コンポーネントの取りまとめ役
  • Alert manager
    • Prometheusが発したアラートを人間にわかりやすい形にまとめてくれる
  • Exporter
    • 監視エージェント
  • Grafana
    • 可視化ツール

図にすると下記のようになる。

f:id:masayuki_kato:20180321110703j:plain

Exporterは監視エージェントのことで、監視対象のアプリーケション毎・ホスト毎に1つのExporterを立てる。

Prometheus本体が監視データの取り扱いをしており、各Exporterから情報を取得し、ローカルディスク上にある高性能な時系列データベース(TSDB:Time Series Database)に格納する。

GrafanaがPrometheus本体に対しクエリを実行すると、Prometheus本体はTSDBからデータを取り出し、点の系列として返す。

また、Prometheus本体は監視対象に対しAPIなどを利用して監視をしており、集めたデータがアラート条件を満たした場合にAlertmanagerに対しアラートを飛ばす。

Prometheusの操作

Console画面の表示

はじめに前回の記事を参考にPrometheusをCUI上で起動しておく。その状態でブラウザのアドレス入力欄に「localhost:9090」と入力する。

f:id:masayuki_kato:20180321103624p:plain

するとConsole画面が開くので、Console画面上部にあるボックスにクエリを打ち込んで実行してみる。

f:id:masayuki_kato:20180321103852p:plain

「go_goroutines」クエリはGo言語の軽量スレッドであるGoroutineの数が出力される。

f:id:masayuki_kato:20180321103933p:plain

node_exporterを使う

ブラウザのアドレス入力欄に「localhost:9100/metrics」と入力すると詳細が出力されているのが確認できる。

f:id:masayuki_kato:20180321111959p:plain

Prometheusはこれらのメトリクスを15秒毎に収集しており、これまでの監視ツールと比べて監視する粒度が細かく、有事の際の分析効率が高まる。

このnode_exporterを監視するためにPrometheus本体のディレクトリにある「prometheus.yml」を編集する。

prometheus-2.0.0-rc.3.darwin-amd64 $vim prometheus.yml

ymlファイルの一番下の行にある「static_configs」の内容を下記のように編集する。

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets:
        - 'localhost:9090'
        - 'localhost:9100'

編集が完了したらPrometheusを再起動し、再度ブラウザから「localhost:9090」を開く。

f:id:masayuki_kato:20180321112711p:plain

新たな監視対象が増えていることが確認できる。

f:id:masayuki_kato:20180321112759p:plain

Service Discoveryで管理する

小規模な環境では上記の設定変更で運用できるが、クラウドなどのオートスケーリング環境では現実的な運用とは言えなくなる。

Prometheusには他のシステムから現在動作中のサーバ情報などを取得して監視対象に追加させるService Discovery機能が組み込まれている。

練習用にAWS等のクラウド環境を用意するのは手間なので、今回はFile Discoveryを試してみる。

prometheus.ymlファイルを編集するので念のためにコピーをとっておく。

prometheus-2.0.0-rc.3.darwin-amd64 $cp prometheus.yml prometheus.yml.bk
prometheus-2.0.0-rc.3.darwin-amd64 $vim prometheus.yml

ymlファイルの下のほうにある「scrape_configs」の項目を下記のように編集する。

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'file_sd'
    file_sd_configs:
      - files: ['file_sd.json']
        refresh_interval: 10s

この状態でPrometheusを再起動してConsole画面を開いても監視対象は見つからない。

f:id:masayuki_kato:20180321124410p:plain

しかし、prometheus本体があるディレクトリに「file_sd.json」ファイルを下記の内容で作成すると、Prometheusを再起動せずとも、Prometheusの監視先として追加されているのがわかる。

[
  {
    "targets": ["localhost:9090", "localhost:9100"],
    "labels": {"found_by": "file_sd"}
  }
]

f:id:masayuki_kato:20180321124758p:plain

このFile Discoveryも設定ファイルと変わらないと感じるかもしれないが、Prometheus本体の設定を運用中に変えることなく別のファイルで管理できるので、設定変更による影響を小さくすることができる。