PCFのbosh-prometheus をWavefront Proxyにつなげる

# 始めに

Pivotal Cloud Foundry(PCF)を管理する場合、一つの監視方法として、bosh-prometheusという手段があります。
これは、Prometheus、Grafanaなどの管理コンポーネントをインストールするためのコンポーネントです。

https://github.com/bosh-prometheus/prometheus-boshrelease

これだけで、監視を完成させることができるかもしれないですが、Prometheusの以下の特性に悩まされるかもしれないです。

* データのバックアップや可用性
* 長期のRetention期間でメトリクスを保管
* パフォーマンス要件

これらの一つの解決方法として、Prometheusのストレージ連携先としてWavefrontを使う方法です。
Prometheusをあくまで、テンポラリーストレージとして使い、長期データの保管先やメトリクスの分析先としてWavefront使います。


# イメージ

Prometheusの連携イメージは以下のとおりです。

<img width="437" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666491/622c086b-2c23-5f12-1407-40c3f0aaa281.png">

すでにPrometheusがある前提で追加のインストールが必要なのが以下です。

* [Prometheus Storage Adapter for Wavefront](https://github.com/wavefrontHQ/prometheus-storage-adapter)
* Wavefront Proxy

Wavefront Proxyに関しては、[Wavefront Nozzle](https://qiita.com/hmachi/items/fd2621d5aa7126e98c5e)をインストールすることで、追加されます。

よってこの記事では、Prometheus Storage Adaptor for Wavefrontの接続方法を中心に紹介します。

# 準備編

PCF環境と[bosh-prometheus](https://github.com/bosh-prometheus/prometheus-boshrelease)のインストールを完了してください。

さらに、以下の記事にあるとおり、Wavefront Nozzleをインストールしてください。
https://qiita.com/hmachi/items/fd2621d5aa7126e98c5e

# Prometheus Storage Adaptorのインストール

インストール方法は、この[Github](https://github.com/wavefrontHQ/prometheus-storage-adapter)にあるとおりです。
StandaloneとDockerイメージの方法が紹介されています。

今回は手早く始めるために、Dockerイメージをcf pushして使う方法でためします。
まず、cfでdiego_dockerを有効にします。

```
$ cf enable-feature-flag diego_docker
```

その後、cf pushでdockerイメージを起動します。
`-c`の引数の中の`-proxy`はそれぞれの環境のWavefront ProxyのIPアドレスを指定してください。
また`-prefix`は最終的にWavefrontのメトリクスの接頭語になるので、みわけがつくものにしてください。

```
$ cf push wf-prom-proxy --docker-image wavefronthq/prometheus-storage-adapter  -c '/bin/adapter -proxy 192.168.3.5 -proxy-port 2878 -listen 8080 -prefix prom'
```

完了したら、一応念のためCurlでサービスが稼働しているか確認します。

```
% curl http://wf-prom-proxy.apps.SYSTEM_DOMAIN/health
{"Message":"OK"}
```

`{"Message":"OK"}`と表示されれば、サービスは起動しているということなので、一旦は成功です。

# bosh-prometheusの再構成

今度はbosh-prometheusを再構成して、作成したアダプターにデータを送るようにします。

以下のYamlファイルを作ります。

```yaml
- type: replace
  path: /instance_groups/name=prometheus2/jobs/name=prometheus2/properties/prometheus/remote_write?/-
  value:
    url: http://wf-prom-proxy.apps.SYSTEM_DOMAIN/receive
```

完了後、`bosh deploy`に`-o <yaml_file>`で再度Prometheusをデプロイします。(これは、それぞれのbosh-promethesのデプロイされ方によって、異なるので割愛します）

これで完了です。もし、ただし起動していない場合、以下のLogなどでデバッグしてください。

```
$ cf logs wf-prom-proxy
```

# Wavefrontでは、どうみえるか

ここまで設定すると、WavefrontにPrometheusのメトリクスが見えてくるはずです。
メトリクスは以下のロジックでみえるようになります。

* `_`アンダースコアを`.`ドットに切り替える
* 接頭語に`-prefix`を指定したものが付与される。

例えば以下のように`bosh_deployment_instances`というPrometheusのメトリクスは

<img width="1779" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666491/78426a66-e47f-ea44-7852-65cd22d9b578.png">

Wavefrontからは`prom.bosh.deployment.instances`としてみえるようになります。



<img width="1781" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666491/5d190525-29f6-f667-a4d9-31888747e084.png">

# PPSはどうなるか？

Wavefrontで注意しないといけないのが、課金方式が秒あたりのメトリクス転送量(Points Per Sec)が課金料に影響するという点です。
実際実機でみたところ、接続直後にバーストしましたが、その後、Prometheus接続後私の環境では +100pps で落ち着きました。

<img width="1770" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666491/db6a02de-9e93-fb12-b62b-0572400fc988.png">


ただ、注意が必要なのが、これはPrometheusのRemote WriteのTuningが関係しています。

https://prometheus.io/docs/practices/remote_write/

より大きな環境の場合、特にmax_samples_per_sendに注視しつつ、メトリクスが落ちていないかなどをモニターしながら適切な値のチューニングが必要と思われます。