概要
PrometheusはSoundCloudというサービスのエンジニアによって開発されたオープンソースのシステム監視及びアラートツールキットです。内部に時系列のデータベースを持っていて、かつPull型のデータモデルを持っています。
詳細については、https://prometheus.ioをご覧ください。
特徴
Prometheusの主な機能は次のとおりです。
-
柔軟なクエリ言語であるPromQLを持つ
-
Pull型(over HTTP)の監視サービスで時系列の収集
-
独自のデータストア
-
グラフ化とダッシュボードのサポートの複数のモード(ただしGrafanaを使うことが多いです)
エコシステム
Prometheusエコシステムは非常に優秀なものがいくつかあります。
- 時系列データをスクレイプして保存するメインのPrometheusサーバー
- アプリケーションコードを計測するためのクライアントライブラリ
- 短命の仕事をサポートするためのプッシュゲートウェイ
- HAProxy、StatsD、Graphiteなどのサービス用の専用エクスポーター
- アラートを処理するalertmanager
アーキテクチャ
一見アーキテクチャを見ると複雑ですが導入は非常に簡単です。
上の図の流れの一例として、まず、左下のJobExporters(Prometheus Target)からメトリクスを真ん中のPrometheus ServerがPullをします。その後収集したデータからAlertmanagerでエラー検知してSlackに送ったり、PromQLでログの可視化、解析を行います。
登場人物
この部分は10分で理解する Prometheusの引用となってしまいますが、とてもわかりやすかったため、掲載させていただきます。
上のアーキテクチャ図にも複数コンポーネントが登場しますが、はじめのところは以下の二つだけ知っておけばとりあえずなんとかなります。
名称 | 説明 |
---|---|
exporter | 監視対象サーバー上で動かすプログラム テキスト形式でリソース情報を公開するWeb API のようなもの 監視対象のリソース毎に exporter が用意されている |
prometheus | 監視サーバーのプログラム 定期的に全ての exporter をポーリングしてリソース情報を収集する 監視したデータは prometheus 内の DB に保持される |
Exporter ⇨ アーキテクチャ図の左下
prometheus ⇨ アーキテクチャ図の真ん中
Prometheusのメリット
Prometheusを導入するメリットをいくつか紹介します。総合監視ツールZABBIX等と比較していきます。
- 時系列DBにデータを格納するのでI/Oが速く、画面表示が軽快(ただしGrafana経由が多い) ⇦ ZABBIXはRDBMSのため、重くなって画面表示が遅くなることがある。
- 分散管理が容易で、Diskやメモリの追加でスケールアップできる。 ⇦ ZABBIXはRDBMSのレプリケーションやDBのメモリチューニングが必要
- APIを介してホストの自動検出、削除が標準機能で可能であり、環境変更への対応が容易。
- エンドポイントを登録すればホストに紐づかなくても監視可能、柔軟性が高い。 ⇦ ZABBIXでもWEBを使えばできるが設定が必要
- Grafanaの機能だが、グラフやダッシュボードUIの作成が綺麗で容易
Prometheusのデメリット
デメリットもいくつかあります。
- データの長期保存を前提としていないので、別途に長期保存用のサーバが必要 ⇦ RDBMSなら問題ない
- デフォルトの設定だとID/PassなしのWEBアクセスでデータの閲覧や監視の無効化などができてしまうので、接続制限やBasic認証が必要
- ストレージ問題 ⇦ 一つ目と被りますが、Prometheusは、デフォルトではTSDB(Time Series Database)というローカルのストレージを利用するのですが、これは冗長化や可用性が考慮されていません。対策として、Metricsの容量設計やRemoteStorageという機能を用い、外部のDBに保存する必要があります。
一長一短だとは思いますが、差し引いてもかなり優秀なソフトウェアだと思います。
GUI(概観)
簡単に実際のダッシュボードの画面を貼り付けていきます。
グラフとか
なんとなくの動きは可視化されてますね。
Target全体
正常系
アラート
インスタンスが止まっていますね。。AlertManagerを使えばSlackに通知することもできます。⬇︎
たくさんアラートが飛んできています。
Grafana
ログデータ可視化ツールGrafanaを使うとかっこよく可視化できます。(大事)
また、ダッシュボードを作成したり、独自のUIパーツでカスタマイズすることもできます。
いい感じのデザインですね。
なんとなく知れたからいいやという方はここまでお疲れ様でした。
実際に触ってみたいという方はもう一踏ん張りしましょう!
ハンズオン
目標
- Prometheusなんとなく触れるようになる
- 環境が構築できる
- 起動できる
- targetとかなんとなくわかるようになる
前提知識
今回はDocker-composeを使うので前提知識とします。
- Docker-compose
環境のセットアップ
ローカル環境にインストールすることも可能ですが、コンテナを使うことが多いのでdockerを使ってセットアップしていきます。
フォルダ構成
tree
.
├── docker-compose.yaml
└── prometheus
└── prometheus.yml
1 directory, 2 files
docker-compose.yamlとprometheus.ymlを使います。実際の開発現場ではalert manager,grafana.envやalertrulesなども作成してカスタマイズしていきます。
docker-compose.yamlの作成
version: "3"
services:
prometheus:
image: prom/prometheus
container_name: prometheus
volumes:
- ./prometheus:/etc/prometheus/
ports:
- 127.0.0.1:9090:9090
grafana:
image: grafana/grafana
container_name: grafana
ports:
- 3000:3000
9090番ポートでprometheusサーバーを立て、3000番ポートでgrafanaサーバーを立てます。volumes: でローカルのprometheus設定ファイルをコンテナ内にマウントさせます。
prometheus.ymlの作成
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
external_labels:
monitor: "codelab-monitor"
rule_files:
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
こちらはprometheusの詳細設定を記述するファイルです。static_configsの場所に計測したいエンドポイントを設定します。また、監視の間隔や異常検知の定義(alert_rulesなど)もこのファイルに記述します。
起動
docker-compose up -d
これでprometheusサーバー、grafanaサーバーが起動したかと思います。
http://localhost:9090 に移動するとprometheusにアクセスできます。
また、statusタブからtargetを押すとhttp://localhost:9090/metricsが正常に動作していることがわかります。
それではgrafanaにもアクセスしましょう!
http://localhost:3000 に移動するとgrafanaにアクセスできます。初回起動時にユーザー名、パスワードを聞かれますがどちらもadminでログインできます。
prometheusと連携するためにはDataSourceからprometheusを追加する必要があります。
Save&Testを押して、Prometheus Statusボタンを押し、グラフが描画されるかどうか確認してください!
完成です
最後に
今回のハンズオンではプロメテウスサーバーの監視というあまり意味のないことをしましたが、APIサーバー、cacheサーバー、インフラなどprometheusでは様々を監視可能です。
不明点などございましたらお気軽にコメントをお願いします
参考文献
公式サイト
prometheus のデータを grafana でグラフ表示してみた
10分で理解する Prometheus
次世代監視の大本命! Prometheus を実運用してみた
10分で理解するGrafana
Observabilityをはじめよう!(後編) 〜Metrics/Logs/Tracesチュートリアル〜