Keycloak でメトリクス情報の取得

株式会社 日立製作所の茂木です。今回は Keycloak のプラグインについて紹介します。

Keycloak はプラグインの開発を容易にするため、様々な機能の Service Provider Interface(SPI)を提供しています。この SPI を利用したプラグインがコミュニティベースで開発されていて、Keycloak の公式 HP でも紹介されています。[Keycloak - Extensions](https://www.keycloak.org/extensions.html)

今回はこれらのなかから、Prometheus 形式で Keycloak の Metrics が取得可能になる`keycloak-metrics-spi`を紹介していきます。

## keycloak-metrics-spi

Metrics として下記の情報が取得できるようになります。

- Java VM のパフォーマンス (Heap など)
- ログインなどの Event
- Endpoint ごとのレスポンスタイム

これらの Metrics を利用するため、プラグインをインストールして Prometheus で Metrics の取得、Grafana での可視化までを行っていきます。

## 検証環境

- Keycloak 8.0.0
- keycloak-metrics-spi 1.0.4
- prometheus 2.14.0
- grafana 6.4.4

## Keycloak の設定

Keycloak の Metrics を取得できるようにするため、`keycloak-metrics-spi`を導入して Keyclaok の設定を行っていきます。

### keycloak-metrics-spi の導入

まずプラグインの導入を行います。`keycloak-metrics-spi`の jar ファイルは、GitHub の[Release ページ](https://github.com/aerogear/keycloak-metrics-spi/releases)から取得できます。

![metrics-release.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273221/c1eac190-e4d1-848a-cd1b-50b2ca985c28.png)


今回は執筆時点で最新の`1.0.4`をダウンロードします。ダウンロードしてきた jar ファイルは Keycloak の `standalone/deployments/`ディレクトリに配置します。

ファイルを配置して Keycloak を起動後、Server Info -> Providers 画面で`metrics`、`metrics-listener`が有効になっていることを確認します。

![server-info-realm-rest.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273221/e9d1b570-7c11-aa60-2f92-4d597b25a5df.png)

![server-info-event-listener.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273221/9dcdd39e-3236-32c9-dc6c-a151dc3ff837.png)

### Keycloak の設定

`keycloak-metrics-spi`では、ログイン回数などの情報を Event Listner SPI を利用して取得しています。イベントの情報を取得できるようにするため、Event 保存の有効化および Event Listener SPI の有効化を行います。Readme には CLI を利用した方法が説明されていますが、今回は Admin Console から設定します。

Event -> Config を開き、下記の設定を行います。

- Event Listeners に`metrics-listener`を追加
- Save Events を ON に設定
- 
![event-config.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273221/6b1af2ae-89c7-2967-e540-f78b2423f6de.png)

### Metrics Endpoint の確認

`keycloak-metrics-spi`をインストールすると、`http://localhost:8080/auth/realms/master/metrics` でメトリクス情報が取れるようになります。ブラウザでアクセスすると、下記のようにメトリクスを取得できていることが確認できます。

![metrics-list.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273221/a1fb012f-601e-a5ec-6a06-9e9292abf273.png)

## Prometheus の設定

Prometheus が Keycloak の Metrics 情報を取得できるように、`prometheus.yaml`の`scrape_config`に下記の設定を追加します。

```yaml
scrape_configs:
  - job_name: "keycloak"
    metrics_path: /auth/realms/master/metrics
    static_configs:
      - targets: ["localhost:8080"]
```

設定追加後に Prometheus を起動し、Status -> Targets から Keycloak のエンドポイントが Target として設定されていることが確認できます。

![prometheus-targets.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273221/4ea6d41b-5e22-8f62-567e-5300a132e34e.png)

Keycloak の Metrics が取得できていれば、ログイン数や Java Heap の使用量といった情報をグラフ表示できるようになります。

- Login 数の表示

![prometheus-logins.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273221/eddc68b4-b03a-fcf8-73fe-641a477686a6.png)

- Java Heap 使用量の表示

![prometheus-heap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273221/20a5eb9b-5d81-d7bb-a2e1-c1a1a801b984.png)

## Grafana での Dash Board 表示

最後に Prometheus が取得した Metrics を基に、Grafana で可視化してみます。Grafana のサイトで公開されている[Keycloak Metrics](https://grafana.com/grafana/dashboards/10441) という Dash Board があるので、これを Grafana にインポートします。なお、この Dash Board には [Pie Chart プラグイン](https://grafana.com/grafana/plugins/grafana-piechart-panel)が利用されているので、先にインストールしておいてください。

正しく設定されていれば、下に示すような Dash Board が表示されます。

![grafana-dashboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273221/4fc4a2c6-3716-9552-e0e1-7b82a44afe4f.png)

## 最後に

今回は`keycloak-metrics-spi`を紹介しましたが、他にも様々なプラグインが紹介されています。今後も色々なプラグインが開発されていくと思うので注目していきたいと思っています。