Prometheus って Elasticsearch と何が違うの

まえおき
-------------------------

最近流行りの Prometheus は、ちょっと前から流行っている Elasticsearch と何が違うのか？:thinking:
※Prometheus は触りはじめて日が浅いので、誤りがあればご指摘ください。:bow:

そもそも Prometheus と Elasticsearch では目的が異なり、カバーできる範囲が異なる。
扱えるデータの種類は Elasticsearch のほうが広いので、まずは比較する機能を絞る。

- Elasticsearch には全文検索の用途があるが、これは Prometheus とは関係ない。
- インデックスを日付でわけて、ドキュメントのフィールドに時間を格納することで、
  ログのフィールドを時系列で集計する運用について Prometheus と比較可能。
  - `@timestamp` といったフィールドに時間を格納したログやメトリクスを
    logstash-2016.11.06 といったインデックスに格納する使い方のこと。

本記事では、後者について述べる。

まずはお金
--------------------------

- Elasticsearch でアラート機能を使うには有償の x-pack が必要になる。
- Prometheus は OSS で、アラート機能を使える。

ちなみに、アラート機能を使わず、データを可視化したいだけなら、それぞれに対応する可視化製品の比較をすべきだろう。

- Elasticsearch は Kibana と Grafana のどちらでも可視化できる。
- Prometheus は Grafana で可視化できる。

ここでは Kibana と Grafana の比較は行わない。

格納するデータの種類
---------------------------

- Elasticsearch は文字列や数値を格納でき、どちらについてもアラートを設定できる。
- Prometheus は数値のみを格納でき、これについてアラートを設定できる。

数値に対するアラートの機能差は、大きくはないはず。:thinking:

製品の目的
-------------------------

- Elasticsearch はデータを集積するのが目的なので、
  データを欠損しないための工夫や、
  クラスタを組んで可用性を高める工夫がある。
- Prometheus はメトリックを監視するのが目的なので、
  データの欠損はありうる。
  と[公式](https://prometheus.io/docs/introduction/overview/#when-does-it-not-fit?)に記載されている。

ちなみに、目的の違いが、プル型・プッシュ型というアーキテクチャに反映されていると考えられる。

プル型・プッシュ型
--------------------------

発生したデータが Elasticsearch や Prometheus に格納される処理のトリガーが異なる。

- Elasticsearch はプッシュ型。
  発生したログは Logstash や Fluentd が、メトリクスは Beats が、
  それぞれ Elasticsearch に送り付ける。

    ```
                            +----------+
                        +---* Logstash |
                        |   +----------+
                        |
    +---------------+   |   +---------+
    | Elasticsearch *<--+---* Fluentd |
    +---------------+   |   +---------+
                        |
                        |   +-------+
                        +---* Beats |
                            +-------+
    ```

- Prometheus はプル型。
  Prometheus が発生したログを収集する。
  ログを持っている側は Prometheus がログを集められるようにAPIを用意する。

    ```
                         +--------+
                     +-->* Apache |
                     |   +--------+
                     |
    +------------+   |   +------------+
    | Prometheus *---+-->* PostgreSQL |
    +------------+   |   +------------+
                     |
                     |   +------+
                     +-->* Node |
                         +------+
    ```

Elasticsearch は無理させると死ぬが Prometheus は死ぬほど無理できない。

ドリルダウンの深さ
--------------------------

- Elasticsearch はドキュメントベース。
  たとえば Logstash で Apache アクセスログを送ったときには、
  処理時間の長いログを上から順に抽出して、パスやステータスコード、サイズなどの
  別のフィールドと関連させて分析することができる。
- Prometheus はメトリックベース。
  たとえば Apache エクスポーターでメトリクスを Prometheus に見せたときには、
  長い処理時間がいつ発生したのかは分かるが、それを記録したログの中身は分からないので、
  パスやステータスコード、サイズが何であったのかは分からない。

まとめ
---------------------------

- とにかく無料でやりたいなら Prometheus でなくてはならず、
- 文字列に対するアラートを仕掛けたいなら Elasticsearch でなくてはならず、
- アラートが発報された後に分析を行いたいなら Elasticsearch でなくてはならず、
- データ喪失を防ぎたいなら Elasticsearch でなくてはならず、

後は以下の観点などで選べばよい。

- 好み。
- 取得したいデータは Elasticsearch と Prometheus のどちらに格納しやすいか。
  - Elasticsearch なら grok や Beats の有無。
  - Prometheus なら エクスポーターの有無。

最後に、手間を惜しまないなら Elasticsearch エクスポーターを使って、
Prometheus と Elasticsearch のどちらも使えばよい。

```
                     +--------+
                 +-->* Apache |
                 |   +--------+
                 |
+------------+   |   +------------+
| Prometheus *---+-->* PostgreSQL |
+------------+   |   +------------+
                 |
                 |   +------+                +----------+
                 +-->* Node |            +---* Logstash |
                 |   +------+            |   +----------+
                 |                       |
                 |   +---------------+   |   +---------+
                 +-->* Elasticsearch *<--+---* Fluentd |
                     +---------------+   |   +---------+
                                         |
                                         |   +-------+
                                         +---* Beats |
                                             +-------+
```