Prometheusをはじめから丁寧に解説してみた[ハンズオン]



![Prometheus でサーバ監視 - 長生村本郷Engineers'Blog](http://i.imgur.com/OmrFNL9.png)
## 概要

[Prometheus](https://prometheus.io/)は[SoundCloud](https://soundcloud.com/)というサービスのエンジニアによって開発されたオープンソースのシステム監視及びアラートツールキットです。内部に時系列のデータベースを持っていて、かつPull型のデータモデルを持っています。

詳細については、[https://prometheus.io](https://prometheus.io/)をご覧ください。


## 特徴

Prometheusの主な機能は次のとおりです。

- [柔軟なクエリ言語](https://prometheus.io/docs/prometheus/latest/querying/basics/)であるPromQLを持つ

- Pull型(over HTTP)の監視サービスで時系列の収集

- 独自のデータストア

- グラフ化とダッシュボードのサポートの複数のモード(ただし[Grafana](https://grafana.com/)を使うことが多いです)

  

## エコシステム

Prometheusエコシステムは非常に優秀なものがいくつかあります。

- 時系列データをスクレイプして保存するメインの[Prometheusサーバー](https://github.com/prometheus/prometheus)
- アプリケーションコードを計測するための[クライアントライブラリ](https://prometheus.io/docs/instrumenting/clientlibs/)
- 短命の仕事をサポートするための[プッシュゲートウェイ](https://github.com/prometheus/pushgateway)
- HAProxy、StatsD、Graphiteなどのサービス用の専用[エクスポーター](https://prometheus.io/docs/instrumenting/exporters/)
- アラートを処理する[alertmanager](https://github.com/prometheus/alertmanager)





## アーキテクチャ



![プロメテウスアーキテクチャ](https://prometheus.io/assets/architecture.png)
[#公式より抜粋](https://prometheus.io)


一見アーキテクチャを見ると複雑ですが導入は非常に簡単です。

上の図の流れの一例として、まず、左下のJobExporters(Prometheus Target)からメトリクスを真ん中のPrometheus ServerがPullをします。その後収集したデータからAlertmanagerでエラー検知してSlackに送ったり、PromQLでログの可視化、解析を行います。



## 登場人物

この部分は[10分で理解する Prometheus](https://qiita.com/Chanmoro/items/ac0eb1bf93760566b338)の引用となってしまいますが、とてもわかりやすかったため、掲載させていただきます。

上のアーキテクチャ図にも複数コンポーネントが登場しますが、はじめのところは以下の二つだけ知っておけばとりあえずなんとかなります。

| 名称       | 説明                                                         |
| :--------- | :----------------------------------------------------------- |
| exporter   | 監視対象サーバー上で動かすプログラム<br />テキスト形式でリソース情報を公開するWeb API のようなもの<br /> 監視対象のリソース毎に exporter が用意されている |
| prometheus | 監視サーバーのプログラム <br />定期的に全ての exporter をポーリングしてリソース情報を収集する <br />監視したデータは prometheus 内の DB に保持される |



**Exporter**   ⇨ アーキテクチャ図の左下

**prometheus**   ⇨ アーキテクチャ図の真ん中



## Prometheusのメリット

Prometheusを導入するメリットをいくつか紹介します。総合監視ツール[ZABBIX](https://www.zabbix.com/jp/features)等と比較していきます。



- 時系列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](https://prometheus.io/docs/prometheus/latest/storage/#remote-storage-integrations)という機能を用い、外部のDBに保存する必要があります。



一長一短だとは思いますが、差し引いてもかなり優秀なソフトウェアだと思います。



## GUI(概観)

簡単に実際のダッシュボードの画面を貼り付けていきます。



#### グラフとか
![スクリーンショット 2021-03-01 23.52.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628777/09d54312-e476-5d9e-718b-ada51260d91c.png)


なんとなくの動きは可視化されてますね。


#### Target全体
![スクリーンショット 2021-03-01 23.52.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628777/1011456d-db69-2508-7840-a71d0494451a.png)

#### 正常系

![スクリーンショット 2021-03-01 23.51.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628777/ff10a0b5-ca6c-41d6-2f55-db9fcef148ac.png)

#### アラート
![スクリーンショット 2021-03-01 23.58.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628777/5c0885af-acc2-9bea-21a7-82f84838456d.png)

インスタンスが止まっていますね。。AlertManagerを使えばSlackに通知することもできます。⬇︎

![スクリーンショット 2021-03-02 0.00.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628777/f45575d4-2610-c599-2e5f-b9bda42a5694.png)



たくさんアラートが飛んできています。

### Grafana

ログデータ可視化ツール[Grafana](http://grafana.com/)を使うとかっこよく可視化できます。（大事）

また、ダッシュボードを作成したり、独自のUIパーツでカスタマイズすることもできます。
![grafana_s.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F43699%2F243a0f06-3a20-e657-4c0d-1bd4cf6d89b9.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=5322ce267d20c9a30ee10febc062589b)

いい感じのデザインですね。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

なんとなく知れたからいいやという方はここまでお疲れ様でした。:bow:

実際に触ってみたいという方はもう一踏ん張りしましょう！:fire:



## ハンズオン

#### 目標

- Prometheusなんとなく触れるようになる
  - 環境が構築できる
  -  起動できる
  - targetとかなんとなくわかるようになる

#### 前提知識

今回はDocker-composeを使うので前提知識とします。

- Docker-compose

  

## 環境のセットアップ

ローカル環境にインストールすることも可能ですが、コンテナを使うことが多いのでdockerを使ってセットアップしていきます。

#### フォルダ構成

```shell
tree
.
├── docker-compose.yaml
└── prometheus
    └── prometheus.yml

1 directory, 2 files
```

 docker-compose.yamlとprometheus.ymlを使います。実際の開発現場ではalert manager,grafana.envやalertrulesなども作成してカスタマイズしていきます。



#### docker-compose.yamlの作成

```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の作成

```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など）もこのファイルに記述します。



#### 起動

```shell
docker-compose up -d
```

これでprometheusサーバー、grafanaサーバーが起動したかと思います。

 http://localhost:9090 に移動するとprometheusにアクセスできます。

また、statusタブからtargetを押すと[http://localhost:9090/metrics](http://4bdd98bc6a3c:9090/metrics)が正常に動作していることがわかります。

![スクリーンショット 2021-03-02 0.03.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628777/b43a0c94-c2ea-298c-dee6-410d1b7d01c7.png)


それではgrafanaにもアクセスしましょう！

http://localhost:3000 に移動するとgrafanaにアクセスできます。初回起動時にユーザー名、パスワードを聞かれますがどちらもadminでログインできます。

![login.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F25728%2F2e4ce85e-ba1f-5d74-f0a6-55ba1316c333.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=256acd64471ea0dac95e987d8ac83328)

prometheusと連携するためにはDataSourceからprometheusを追加する必要があります。

![スクリーンショット_2016-12-12_07-49-38.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F25728%2Fa405bf50-f6ab-3151-f2f5-16beebf59709.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=cf6c478c246a924cfcd778e9b3f5c412)

Save&Testを押して、Prometheus Statusボタンを押し、グラフが描画されるかどうか確認してください！

![dashboard.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F25728%2F2561f913-1987-faa9-42ec-77536cc050f5.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=240a5915547b75061088b159cc366cb8)

完成です :basketball_player: 

## 最後に
今回のハンズオンではプロメテウスサーバーの監視というあまり意味のないことをしましたが、APIサーバー、cacheサーバー、インフラなどprometheusでは様々を監視可能です。  
不明点などございましたらお気軽にコメントをお願いします :bow: 



## 参考文献
[公式サイト](https://prometheus.io/)
[prometheus のデータを grafana でグラフ表示してみた](https://qiita.com/tukiyo3/items/da379f6e5844c99b65df)
[10分で理解する Prometheus](https://qiita.com/Chanmoro/items/ac0eb1bf93760566b338)
[次世代監視の大本命！ Prometheus を実運用してみた](http://qiita.com/sugitak/items/ff8f5ad845283c5915d2)
[10分で理解するGrafana](https://qiita.com/Chanmoro/items/a23f0408f0e64658a775)
[Observabilityをはじめよう！(後編) 〜Metrics/Logs/Tracesチュートリアル〜](https://knowledge.sakura.ad.jp/26409/)