Prometheusのインストールと起動

Prometheusを起動するには、prometheusというバイナリを実行すればよい。以上である。

… 結論としてはそれだけだが、これだけではあまり親切ではないので、デモを交えて説明する。

Prometheusのインストールと起動

まずブラウザで「Prometheus GitHub」を検索すると、PrometheusのGitHubが出てくる。そこからPrometheusリポジトリへ移動し、Releasesページを開く。

Prometheus GitHub
GitHubのPrometheusリポジトリへ移動し、Releasesをクリックする。

ここで少し注意したいのは、リリースにはLatest-releaseとPre-releaseがある点である。Pre-releaseはβ版、いわゆる初期リリースのようなものなので、基本的にはLatest-releaseを使用するのがよい。

少し下へスクロールする。

Prometheus GitHub
Latestになっているバージョンを使用する。

LinuxでPrometheusをインストールする

各アーキテクチャごとにバイナリが用意されているので、ここではlinux-amd64を使用する。アーカイブURLをコピーし、wgetでダウンロードできる。wgetはすぐ終わるので、ダウンロードしたファイルをtarで展開する。するとディレクトリが作成され、中を見ると次のようにファイルが展開されている。

$ wget https://github.com/prometheus/prometheus/releases/download/v2.38.0/prometheus-2.38.0.linux-amd64.tar.gz
$ tar xfz prometheus-2.38.0.linux-amd64.tar.gz
$ cd prometheus-2.38.0.linux-amd64
$ ls -aF
./                 LICENSE            console_libraries/ prometheus*        promtool*
../                NOTICE             consoles/          prometheus.yml

上のファイルのうち、prometheusがPrometheusサーバー本体である。ここで次のコマンドを実行するとPrometheusが動作する。なお、システムでiptablesのようなファイアウォール機能を使用している場合は、コマンド実行前に9090番ポートの通信を許可する必要がある。

$ ./prometheus

macOSでPrometheusをインストールする

Homebrewでも簡単にインストールできる。

brew install prometheus

実行結果:

% brew install prometheus
Running `brew update --auto-update`...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> New Formulae
antidote                   commitlint                 liblbfgs                   pyyaml                     xctesthtmlreport
apophenia                  ghc@8.10                   objconv                    schemathesis               xwin

You have 3 outdated formulae installed.
You can upgrade them with brew upgrade
or list them with brew outdated.

==> Downloading https://ghcr.io/v2/homebrew/core/prometheus/manifests/2.38.0
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/prometheus/blobs/sha256:cc5db7e9f7a224c46e1f426b8a12ae2155ef379b1132922766ecb0a47ef5
==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sha256:cc5db7e9f7a224c46e1f426b8a12ae2155ef379b11329227
######################################################################## 100.0%
==> Pouring prometheus--2.38.0.arm64_monterey.bottle.tar.gz
==> Caveats
When run from `brew services`, `prometheus` is run from
`prometheus_brew_services` and uses the flags in:
   /opt/homebrew/etc/prometheus.args

To restart prometheus after an upgrade:
  brew services restart prometheus
Or, if you don't want/need a background service you can just run:
  /opt/homebrew/opt/prometheus/bin/prometheus_brew_services
==> Summary
🍺  /opt/homebrew/Cellar/prometheus/2.38.0: 22 files, 204.0MB
==> Running `brew cleanup prometheus`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).

インストール完了後、サービスを起動する。

brew services start prometheus

実行結果:

% brew services start prometheus
==> Tapping homebrew/services
Cloning into '/opt/homebrew/Library/Taps/homebrew/homebrew-services'...
remote: Enumerating objects: 2094, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 2094 (delta 0), reused 0 (delta 0), pack-reused 2090
Receiving objects: 100% (2094/2094), 586.80 KiB | 11.74 MiB/s, done.
Resolving deltas: 100% (927/927), done.
Tapped 1 command (45 files, 741.4KB).
==> Successfully started `prometheus` (label: homebrew.mxcl.prometheus)

逆にサービスを停止するコマンドは次のとおりである。

brew services stop prometheus

実行結果:

% brew services stop prometheus
Stopping `prometheus`... (might take a while)
==> Successfully stopped `prometheus` (label: homebrew.mxcl.prometheus)

Prometheusインストール完了後の確認

Prometheusを動作させた後は、動作しているホストの9090番ポートに接続する。URLとしては次へアクセスする。

http://(ホストIPアドレス):9090/

またはローカルにインストールした場合は、localhostへ接続してもよい。

http://localhost:9090/

Prometheus起動後画面
Prometheus起動後画面

これで最小限のインストールと設定が完了した。非常に簡単である。

Node Exporterを使う

このままでは何も監視していない状態なので、Node Exporterというものも使ってみる。

前にPrometheusを使うとき、Exporterがいろいろあるという話をした。それについてもう少し見てみよう。「Prometheus Exporter」と検索すると、Exporters and Integrationsというページが出てくる。リンクを開くと、多数のリンクが表示される。これらはすべてPrometheusのExporterである。

Prometheus Exporterページ
Prometheus Exporterページ

ここではこの中からNode Exporterを使用する。一覧では「Node/system metrics exporter」となっている。これはLinuxのようなシステムのメトリクス情報を収集するためのMetrics Exporterである。

LinuxでNode Exporterをインストールする

これを使用する場合も、先ほどのPrometheusと同様にReleasesページへ移動し、linux-amd64リンクをコピーしてwgetでダウンロードする。あとは展開するとnode_exporterディレクトリが作成されるので、そのディレクトリに入り、コマンドを動作させるだけでよい。

$ wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
$ tar xfz node_exporter-1.3.1.linux-amd64.tar.gz
$ cd node_exporter-1.3.1.linux-amd64
$ ./node_exporter

動作したらログを確認し、次のようなログが出ていればよい。

msg="Listening on" address=9100

macOSでNode Exporterをインストールする

brew install node_exporter

実行結果:

% brew install node_exporter
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).

You have 3 outdated formulae installed.
You can upgrade them with brew upgrade
or list them with brew outdated.

==> Downloading https://ghcr.io/v2/homebrew/core/node_exporter/manifests/1.3.1
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/node_exporter/blobs/sha256:8e99e508cef6d2a24256e593f93b74e2963ad1cc7e5c2afd00a5b8c2a
==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sha256:8e99e508cef6d2a24256e593f93b74e2963ad1cc7e5c2afd
######################################################################## 100.0%
==> Pouring node_exporter--1.3.1.arm64_monterey.bottle.tar.gz
==> Caveats
When run from `brew services`, `node_exporter` is run from
`node_exporter_brew_services` and uses the flags in:
  /opt/homebrew/etc/node_exporter.args

To restart node_exporter after an upgrade:
  brew services restart node_exporter
Or, if you don't want/need a background service you can just run:
  /opt/homebrew/opt/node_exporter/bin/node_exporter_brew_services
==> Summary
🍺  /opt/homebrew/Cellar/node_exporter/1.3.1: 11 files, 15.3MB
==> Running `brew cleanup node_exporter`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).

インストール完了後、サービスを起動する。

brew services start node_exporter

実行結果:

% brew services start node_exporter
==> Successfully started `node_exporter` (label: homebrew.mxcl.node_exporter)

Node Exporterインストール完了後の確認

では、Prometheusを使っていくうえで、Exporterの情報をどこに書けばよいかを見てみよう。

ダウンロードしたファイルでインストールした場合はインストールされたフォルダで、Homebrewでインストールした場合は/opt/homebrew/etc/で、prometheus.ymlというYAMLファイルを開く。すると次のような形でファイルが作成されている。

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: "prometheus"
    static_configs:
    - targets: ["localhost:9090"]

このファイルのscrape_configs項目にはPrometheusの設定、特に監視ターゲットの設定が書かれている。具体的には、ターゲットごとにjob_nameと設定を持つ。job_name項目はprometheusになっており、static_configsに対象を追加する。static_configsはPrometheusのService Discoveryとは別に提供される対象追加機能であり、静的に対象情報を収集できる。このように使用することで、従来のように単純にサーバーのIPアドレスやFQDNを渡すだけで、簡単にターゲットを監視できる。

今回はこのstatic_configsを使用し、先ほどダウンロードしたNode Exporterを監視してみよう。Node Exporterは9100番ポートでリスニングしているので、次のように書いて保存すればよい。

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: "prometheus"
    static_configs:
    - targets: ["localhost:9090"]
  - job_name: 'node'
    static_configs:
    - targets: ['localhost:9100']

次に、次のようにPrometheusを再起動する。
Linuxの場合: コマンドラインをCtrl+Cで切り、下記コマンドで再度起動すればよい。

$ ./prometheus

macOSのHomebrewの場合: brewサービスを停止(stop)してから再度起動(start)する。

% brew services stop prometheus
Stopping `prometheus`... (might take a while)
==> Successfully stopped `prometheus` (label: homebrew.mxcl.prometheus)

% brew services start prometheus
==> Successfully started `prometheus` (label: homebrew.mxcl.prometheus)

では実際に動作しているPrometheusを見てみよう。まず上部メニューのStatusのTargetsをクリックする。
Prometheus StatusのTargetsをクリック
StatusのTargetsをクリック

すると次のように、nodeとprometheusが動作していることを確認できる。
Prometheus Targets画面表示
Targets画面表示

ホーム画面へ移動し、このサーバーのメモリ使用量を見たい場合は、画面上部の入力フォームにnodeと入力すると、多数のメトリクスが候補として表示される。その中でメモリ関連に絞りたい場合は、フォームにmemoryを追加で入力すると、メモリに関連する情報が表示される。今回はnode_memory_active_bytesを選択する。

node_memory_active_bytes選択
node_memory_active_bytes選択

すると、下の画面のように数値が表示される。単位はバイトである。 node_memory_active_bytes選択
node_memory_active_bytesを実行したところ

そして上部のGraphタブを開くとグラフも表示される。
Graph

また、先ほど取得したのはメモリ使用量だけだったが、使用率を取得したい場合、割合を扱いたいなら現在値を全体で割ればよい。そのため、メモリ全体の容量を取得できれば計算できる。これもMetricsが用意されており、node_memory_total_bytesというものがある。これを使ってフォームに式を書けば、使用率グラフも確認できる。

Graph
メモリ使用率のグラフはY軸の値が小数になっているが、百分率で表示したい場合はnode_memory_active_bytes / node_memory_total_bytes * 100と入力すればよい。

このように、Prometheusによる監視を非常に簡単に実現でき、クエリも実行できる。

その他の要素

デモはここで終え、以降ではPrometheusの他の要素について軽く話してみる。

Prometheusストレージ

Prometheusのストレージは基本的にローカルにデータを保持し、2時間ごとにブロックが作成される。このブロックにはChunkデータ、Indexデータ、Metaデータなど複数のデータが含まれており、これらのデータによって実際に収集されたMetricsが保存されている。直近2時間未満のデータはメモリ上で活用され、万一クラッシュした場合に備えてWAL(Write Ahead Log: ログ先行書き込み)が用意されている。このような構造なのでシンプルだが、逆に言えば単独での冗長化や永続化の仕組みはない。

.
├── 01GCTTBW7XCBK1VE15SR6698EB
│   ├── chunks
│   │   └── 000001
│   ├── index
│   ├── meta.json
│   └── tombstones
├── chunks_head
│   ├── 000005
│   └── 000006
├── lock
├── queries.active
└── wal
    ├── 00000004
    ├── 00000005
    ├── 00000006
    └── checkpoint.00000003
        └── 00000000

Homebrewでインストールした場合、ディレクトリ位置は/opt/homebrew/var/prometheusである。

Prometheusのデータ構造

では、冗長化の仕組みがないならどうすればよいのか。外部にそのような仕組みを持たせることができる。これはRemote Storageと呼ばれ、外部データベースに保存する仕組みである。そのデータベースを使用すると、Metricsをそのデータベースへ転送したり、データベースからMetricsを読み取ったりできる。PostgreSQL、Graphite、InfluxDB、M3DB、Cortex、Thanosなど、さまざまなデータベースがサポートされている。これらのデータベース自体が直接PrometheusのRemote Storageをサポートしている場合もあり、サポートしていなくてもアダプタが存在する。このアダプタを使うことで、適切な形で渡すことなどができる。

アダプタを通したRemote Storageの使用
アダプタを通したRemote Storageの使用

実際にPrometheusを本番運用で使用するなら、データをローカルに保持し続けてもよいが、ある程度の期間や大量データになる場合は、このRemote Storageを活用するのがよいと思われる。

PromQL

PromQLはMetricsを抽出し、集計する言語である。ラベルによるフィルタリングを軽く紹介すると、次のようになる。

メトリクス名だけを使用:

prometheus_http_requests_total

ラベルでフィルタリング:

prometheus_http_requests_total{job="apiserver", handler="/api/v1/rules"}

正規表現フィルタリング:

prometheus_http_requests_total{job=~".*server"}

関数利用:

rate(prometheus_http_requests_total[5m])

一番上の例は単純にメトリクス名だけを使用する場合である。前のデモでもnode_memory_total_bytesnode_memory_active_bytesを使用したが、これはMetricsそのものを単純に取得したものである。

今回はサーバーが1台だけだったため1つのMetricsを扱ったが、複数台や複数コンポーネントが存在する場合は、それぞれでフィルタリングする必要がある。その場合、上から2番目に書かれているラベルでのフィルタリングを使用して取得できる。ラベルはメトリクス名の後に{...}で囲んで指定する。この例ではjobapiserverになっているが、前のnodeprometheusというjobがあった。ここにnodeをjobへ入れればNode Exporterが取得したMetricsだけを抽出でき、prometheusと指定すればPrometheusのMetricsだけを抽出することも簡単にできる。

このほかにも正規表現でフィルタリングしたり、抽出した指標を関数で加工したりできる。

まとめ

Prometheusはクラウドネイティブシステム監視ソフトウェアの1つである。非常にシンプルで簡単に使用できる点が大きな特徴である。

また今回は紹介できなかったが、強力なService Discovery機能があるため、たとえばKubernetesを使用したりクラウドプラットフォームを使用したりする場合には、特にぜひ使ってみることをおすすめする。

また、AlertManagerやGrafanaと連携することで、Prometheus単体ではできない機能を利用できる。逆に言えば、高度な可視化やAlertingは不要で、単にデータを収集して軽く検索できればよいという場合は、Prometheus単体で十分である。Alertingだけ欲しいならAlertManagerを使用すればよく、Alertingは不要で可視化だけしたいならGrafanaを組み合わせればよい。そのような形で組み合わせて連携できる。

最後に、Prometheusを使用するうえで覚えておいてほしいのは、このPrometheusはObservabilityの実現に向けた1つのツールなので、ぜひそのような視点で使ってほしいということである。