Prometheusの共同作成者であるJuliusVolzの記事

序章

Prometheusは、オープンソースの監視システムおよび時系列データベースです。 メトリックの生成と収集、ダッシュボードでの結果データのグラフ化、異常のアラートなど、監視の多くの側面に対応します。 これを実現するために、個別に実行されるが組み合わせて使用されるさまざまなコンポーネントを提供します。

Dockerは、Linuxコンテナー(または他のカプセル化テクノロジー)を使用してサーバープロセスをカプセル化する方法を提供します。これにより、サーバープロセスをより簡単に管理し、相互に分離できます。 Dockerの詳細については、 Dockerエコシステム:一般的なコンポーネントの概要を参照してください。

このチュートリアルでは、DockerでPrometheusを使用するための3つの主要コンポーネントをインストールする方法を学習します。 これらは:

  • メトリックを収集してクエリするPrometheusサーバー
  • Prometheus互換形式でシステムメトリックをエクスポートするノードエクスポータ
  • Grafana、他のバックエンドの中でもPrometheusをサポートするWebベースのグラフィカルダッシュボードビルダー

Prometheusエコシステムにはさらに多くのコンポーネントがありますが、これら3つはPrometheusを使用するための良い出発点を提供します。

前提条件

このチュートリアルに従うには、次のものが必要です。

  • Ubuntu14.04ドロップレット
  • sudoアクセス権を持つユーザー(詳細については、 Ubuntu 14.04での初期サーバーセットアップチュートリアルを参照してください)
  • Ubuntu14.04にDockerComposeをインストールして使用する方法のステップ1の手順でインストールされたDocker

注:この記事は、1 CPU / 512 MB RAMUbuntu14.04ドロップレットでテストされています。 Prometheusの構成は、この記事のステップ1で説明されているように、利用可能なリソースの量に合わせて調整する必要があります。

ステップ1—Prometheusをインストールする

このセクションでは、Dockerを使用してメインのPrometheusサーバーをインストールする方法について説明します。 続行する前に、前提条件セクションに従ってDockerをインストールしてください。 Prometheusサーバーは、Prometheusエコシステムの中心的な部分であり、メトリックの収集と保存、および式クエリの処理とアラートの生成を担当します。

すべてのPrometheusコンポーネントのDockerコンテナイメージは、DockerHubのprom組織でホストされています。 prom/prometheus Dockerイメージを追加オプションなしで実行すると、コンテナー内の/etc/prometheus/prometheus.ymlにある構成ファイルの例を使用してPrometheusサーバーが起動します。 また、コンテナ内の/prometheusにマウントされたDockerデータボリュームを使用して、収集されたメトリックデータを保存します。 このデータボリュームディレクトリは、実際には、コンテナが最初に起動されたときにDockerが自動作成するホスト上のディレクトリです。 その中のデータは、同じコンテナーの再起動間で保持されます。

デフォルトの構成ファイルをオーバーライドする方法は複数あります。 たとえば、カスタム構成ファイルをホストファイルシステムからDockerデータボリュームとしてコンテナーに渡すことも、独自の構成ファイルをコンテナーイメージにベイクして派生したDockerコンテナーを構築することもできます。 このチュートリアルでは、ホストシステムから構成ファイルを渡すことを選択します。

メトリックのストレージを編成するためのさまざまなパターンもあります。 このチュートリアルでは、Dockerイメージのデフォルトの動作であるDockerデータボリュームを使用してメトリックを保存します。 または、ニーズに適している場合は、データボリュームコンテナの作成を検討することもできます。

注: Dockerデータボリュームを作成する方法については、 Ubuntu14.04でDockerデータボリュームを操作する方法をお読みください。

まず、~/prometheus.ymlのホストファイルシステムに最小限のPrometheus構成ファイルを作成します。

  1. nano ~/prometheus.yml

次の内容をファイルに追加します(your_server_ipをDropletのIPアドレスに置き換えます)。

〜/ prometheus.yml
# A scrape configuration scraping a Node Exporter and the Prometheus server
# itself.
scrape_configs:
  # Scrape Prometheus itself every 5 seconds.
  - job_name: 'prometheus'
    scrape_interval: 5s
    target_groups:
      - targets: ['localhost:9090']

  # Scrape the Node Exporter every 5 seconds.
  - job_name: 'node'
    scrape_interval: 5s
    target_groups:
      - targets: ['your_server_ip:9100']

この構成例では、Prometheusがそれ自体から(PrometheusはPrometheus互換形式でそれ自体に関するメトリックも公開するため)、および後で設定するNodeExporterからメトリックをスクレイプします。 Prometheusはlocalhostホスト名を使用してコンテナ内で接続できますが、ノードエクスポータは別のネットワーク名前空間を持つ別のコンテナで実行されるため、サーバーの外部IPを使用してノードエクスポータをスクレイプする必要があります。

外部構成ファイルを使用してPrometheusDockerコンテナーを起動します。

  1. docker run -d -p 9090:9090 -v ~/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus -config.file=/etc/prometheus/prometheus.yml -storage.local.path=/prometheus -storage.local.memory-chunks=10000

このコマンドを初めて実行すると、DockerHubからDockerイメージがプルされます。

このコマンドは非常に長く、多くのコマンドラインオプションが含まれています。 それをもっと詳しく見てみましょう:

  • -dオプションは、Prometheusコンテナーをデタッチモードで開始します。つまり、コンテナーはバックグラウンドで開始され、CTRL+Cを押しても終了しません。
  • -p 9090:9090オプションは、PrometheusのWebポート(9090)を公開し、ホストシステムの外部IPアドレスを介して到達可能にします。
  • -v [...]オプションは、prometheus.yml構成ファイルをホストファイルシステムから、Prometheusが予期するコンテナー内の場所(/etc/prometheus/prometheus.yml)にマウントします。
  • -config.fileオプションは、コンテナー内のPrometheus構成ファイルの場所に応じて設定されます。
  • -storage.local.pathオプションは、コンテナー内のメトリックの保存場所を構成します。
  • 最後に、-storage.local.memory-chunksオプションは、Prometheusのメモリ使用量を、このチュートリアルのホストシステムの非常に少量のRAM(512MBのみ)と少数の保存された時系列(1000未満)に調整します。 これは、デフォルトの1048576ではなく、10000サンプルチャンク(シリーズごとに約10チャンク)のみをメモリに保持するようにPrometheusに指示します。 これは、より多くのRAMを搭載したマシンでPrometheusを実行する場合、およびより多くの時系列を保存する場合に、必ず調整する必要がある値です。 これに関する詳細については、Prometheusのストレージドキュメントを参照してください。

次のコマンドを使用して、実行中のすべてのDockerコンテナーを一覧表示できます。

  1. docker ps

たとえば、PrometheusDockerコンテナの場合は次のようになります。

Output of `docker ps`
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6a89ac39911e prom/prometheus "/bin/prometheus -con" 2 hours ago Up 2 hours 0.0.0.0:9090->9090/tcp stoic_pike

docker ps出力に表示されるコンテナIDを使用して、次のコマンドで実行中のPrometheusサーバーのログを調べることができます。

  1. docker logs container_id

この例では、コマンドは次のようになります。

  1. docker logs 6a89ac39911e

ホストのファイルシステムのどこにメトリックストレージボリュームが保存されているかを確認するには、container_idを使用して次のコマンドを実行できます。

  1. docker inspect container_id

これにより、マウントされたDockerボリュームのホストパスなど、コンテナーの構成に関する情報が出力されます。

次のような出力のセクションを見つけます。

Output of `docker inspect`
... "Mounts": [ { "Source": "/home/sammy/prometheus.yml", "Destination": "/etc/prometheus/prometheus.yml", "Mode": "", "RW": true }, { "Name": "821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c", "Source": "/var/lib/docker/volumes/821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c/_data", "Destination": "/prometheus", "Driver": "local", "Mode": "", "RW": true } ], ...

この例では、メトリックはホストシステムの/var/lib/docker/volumes/821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c/_dataに保存されています。 このディレクトリは、Prometheusコンテナを最初に起動したときにDockerによって自動的に作成されました。 コンテナ内の/prometheusディレクトリにマップされます。 このディレクトリ内のデータは、同じコンテナを再起動しても保持されます。 必要に応じて、メトリックデータを保存するための既存のホストディレクトリをマウントすることもできます。 これを実現する方法については、 Ubuntu14.04でDockerデータボリュームを操作する方法を参照してください。

これで、http://your_server_ip:9090/でPrometheusサーバーにアクセスできるようになります。 http://your_server_ip:9090/statusに移動し、 Targetsセクションでprometheusジョブのhttp://localhost:9090/metricsエンドポイントを見つけて、自身に関するメトリックを収集していることを確認します。 このターゲットのState列には、ターゲットの状態がHEALTHYと表示されます。 対照的に、http://localhost:9100/metrics(ノードエクスポータ)エンドポイントは、ノードエクスポータがまだ開始されておらず、スクレイプできないため、UNHEALTHYとして表示されます。

The Node Exporter target should be shown as UNHEALTHY

要約すると、これで、ホストファイルシステムにあるカスタムPrometheus構成ファイル~/prometheus.ymlを使用して、PrometheusがDockerコンテナーとして実行されます。 メトリックストレージは、コンテナの/prometheusディレクトリにあります。このディレクトリは、このセクションで説明するdocker inspectコマンドで示されるパスによってホストシステムにバックアップされます。

ステップ2—ノードエクスポーターの設定

このセクションでは、PrometheusNodeExporterをインストールします。 Node Exporterは、実行中のホストマシン(ノード)に関するPrometheusメトリックを公開するサーバーです。 これには、マシンのファイルシステム、ネットワークデバイス、プロセッサ使用量、メモリ使用量などに関するメトリックが含まれます。

DockerでNodeExporterを実行すると、実行しているホストに関するメトリックを公開することが全体の目的であるため、いくつかの課題が発生することに注意してください。 それ以上のオプションなしでDockerで実行すると、ファイルシステムやネットワークデバイスなどのリソースのDockerの名前空間により、ホストの環境とは異なるコンテナの環境に関するメトリックのみがエクスポートされます。 したがって、通常は、Dockerの外部のホストシステムで直接NodeExporterを実行することをお勧めします。 ただし、Dockerを使用してすべてのプロセスを管理する必要がある場合は、Docker内からホストメトリックをエクスポートするための合理的な概算を提供する回避策について説明します。

Dockerを使用してポート9100でNodeExporterを起動するには:

  1. docker run -d -p 9100:9100 -v "/proc:/host/proc" -v "/sys:/host/sys" -v "/:/rootfs" --net="host" prom/node-exporter -collector.procfs /host/proc -collector.sysfs /host/proc -collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"

次のDockerフラグとNodeExporterフラグは、hostメトリックの妥当な概算を提供するために使用されます。

  • Linuxでは、NodeExporterはほとんどのメトリックを/procおよび/sysファイルシステムから収集します。 これらのファイルシステムは、Dockerの-vフラグを使用して、ホストから/hostディレクトリの下のコンテナーにマウントされます。
  • NodeExporterの-collector.procfsおよび-collector.sysfsフラグを介して、非標準の場所で/procおよび/sysファイルシステムを探すようにNodeExporterに指示します。
  • ホストファイルシステムのメトリックを報告するために、ルート(/)ファイルシステム全体をコンテナー(/rootfs)にマウントし、Dockerの-vフラグを使用します。
  • NodeExporterの-collector.filesystem.ignored-mount-pointsフラグを使用して、ホストシステムに属していないコンテナ内の他のファイルシステムを無視します。 このオプションは、報告されたメトリックから除外するマウントポイントの正規表現を取ります。
  • --net=host Dockerフラグを使用して、コンテナーをホストと同じネットワークスタックに配置します。これにより、/proc/net/devなどのファイルから読み取ると、ホストと同じ結果が得られます( /procホストからマウントされたファイルシステムでは不十分です)。

一部のメトリックは、ホスト上で直接実行されているノードエクスポーターと比較すると依然として異なることに注意してください。 具体的には、ファイルシステムの使用状況について報告されたメトリックには、mountpointラベルの値に/rootfsプレフィックスが含まれます。これは、コンテナのこのプレフィックスの下にルートファイルシステムをマウントするためです。 また、説明されている回避策が将来のNode Exporter機能に十分であるという保証もありません。そのため、独自の裁量でDocker上でNodeExporterを実行してください。

これで、Prometheusサーバーはノードエクスポーターのスクレイピングを自動的に開始するはずです。 http://your_server_ip:9090/statusにあるPrometheusサーバーのステータスページに移動し、nodeジョブのhttp://your_server_ip:9100/metricsターゲットがHEALTHY状態を示していることを確認します。

The Node Exporter target should be shown as HEALTHY

ステップ3—Grafanaを設定する

最後に、Grafanaをセットアップします。 Grafanaは、グラフ化するデータをクエリするためのバックエンドとしてPrometheusをサポートするグラフィカルダッシュボードビルダーです。

Grafanaは、ダッシュボードのメタデータ(存在するダッシュボードや表示するグラフなど)を構成可能なSQLベースのデータベースに保存します。 Grafanaは、ローカルのファイルベースのSQLite3データベースと、MySQLやPostgreSQLなどの外部データベースサーバーの使用をサポートしています。

このチュートリアルでは、Dockerデータボリュームに支えられたSQLite3データベースを使用します。 詳細については、Sqliteの使用方法と使用時期を参照してください。

選択した管理者パスワード(admin_password)を使用してDockerコンテナーとしてGrafanaを起動します。

  1. docker run -d -p 3000:3000 -e "GF_SECURITY_ADMIN_PASSWORD=admin_password" -v ~/grafana_db:/var/lib/grafana grafana/grafana

これにより、DockerHubからGrafanaDockerイメージがダウンロードされ、ホストシステムの~/grafana_dbとコンテナーファイルシステムの/var/lib/grafanaに配置された新しいDockerボリュームが作成されます。 コンテナ内で、Grafanaは/var/lib/grafana/grafana.dbでSQLite3データベースを自動的に作成して初期化します。

-eフラグを使用すると、Dockerコンテナ内で起動されたプロセスに環境変数を渡すことができます。 ここでは、これを使用してGF_SECURITY_ADMIN_PASSWORD環境変数を目的のダッシュボード管理者パスワードに設定し、デフォルトのパスワードadminを上書きします。 環境変数を使用して、他のGrafana構成設定をオーバーライドすることもできます。 詳細については、環境変数の使用を参照してください。

Grafanaが正しく実行されていることを確認するには、http://your_server_ip:3000/に移動します。 管理者のユーザー名はadminで、パスワードは以前にDockerコンテナーを起動したときに選択したものです。

Log in to Grafana with your chosen password

ログインすると、Grafanaのメインビューが表示されます。

Grafana main view

Grafanaの使用を開始する方法の詳細については、Grafanaのドキュメントを参照してください。 Prometheus Grafanaのドキュメントには、GrafanaをPrometheusと組み合わせて使用する方法も示されています。

結論

おめでとう! Prometheusサーバー、ノードエクスポーター、Grafanaをセットアップしました。すべてDockerを使用しています。 これらは現在すべて同じマシンで実行されていますが、これはデモンストレーションのみを目的としています。 本番環境では、通常、監視対象のすべてのマシン、複数のPrometheusサーバー(組織の必要に応じて)、およびこれらのサーバーからのデータをグラフ化するための単一のGrafanaサーバーでNodeExporterを実行します。

Prometheusの一般的な使用方法の詳細については、そのドキュメントを参照してください。