Keycloak Metrics SPIで、Red Hat SSO(Keycloak)の稼働統計をGrafanaで見る

Red Hat Single Sign-on(以下、Red Hat SSO)の稼働統計をGrafanaで見てみます。
Red Hat SSOは、OSSのKeycloakをベースとした製品で、サポートを受けることができます。

稼働統計は、コミュニティの[Aerogear Keycloak Metrics SPI](https://github.com/aerogear/keycloak-metrics-spi)を利用します。
Keycloak Metrics SPIは、Red Hat SSOのサポート対象ではありませんが、利用することは可能です。
ちなみに、[Red Hat SSOのコンテナイメージ](https://catalog.redhat.com/software/containers/rh-sso-7/sso75-openshift-rhel8/611418806e1e42ca4d6decf1)は、Prometheusメトリクスが利用可能ですが、ログイン回数などのメトリクスはなく、Red Hat SSOの土台になっているJBoss EAPのメトリクスのみとなっています。(2021/10/18時点)

本手順は、Red Hat SSOのインストールから実施していきます。
(Keycloakでもインストールバイナリが異なるだけで手順は同じになります)

## 環境
・OpenJDK 8
・Red Hat SSO 7.5.0 (Keycloak 15.0.2)
・Aerogear Keycloak Metrics SPI 2.5.1

## 1. Red Hat SSOのインストール

[Red Hat カスタマーポータル](https://access.redhat.com/)にログインし、 Red Hat SSOをダウンロードします。
※本来はパッチもダウンロードして、パッチを当ててください。(執筆時はパッチは出てませんでした)
Red Hat SSOのzipインストールは、zip解凍すれば終わりです。配置場所は、任意です。

```sh
$ unzip rh-sso-7.5.0-server-dist.zip
```

zipを展開して作成したディレクトリーは、SSO_HOMEとします。
環境変数にしておきます。

```sh
$ export SSO_HOME="zipを展開して作成したディレクトリー"
```

Red Hat SSOの管理ユーザも作っておきます。(便宜上、admin/adminで作ってます)

```sh
$ $SSO_HOME/bin/add-user-keycloak.sh -u admin -p admin
Added 'admin' to '/xxxx/standalone/configuration/keycloak-add-user.json', restart server to load user
```

・参考手順

https://access.redhat.com/documentation/ja-jp/red_hat_single_sign-on/7.5/html/server_installation_and_configuration_guide/_installing_rh_sso_from_a_zip_file

## 2. Aerogear Keycloak Metrics SPIのインストールとセットアップ
$SSO_HOME/standalone/deploymentsに配置すればOKです。

```sh
$ cd $SSO_HOME/standalone/deployments
$ curl -LO https://github.com/aerogear/keycloak-metrics-spi/releases/download/2.5.1/keycloak-metrics-spi-2.5.1.jar
$ touch keycloak-metrics-spi-2.5.1.jar.dodeploy
$ ls
README.txt				keycloak-metrics-spi-2.5.1.jar		keycloak-metrics-spi-2.5.1.jar.dodeploy
```

### metrics-listener eventを有効化
metrics-listener eventを有効化します。これは、GUIでもできるのですが、手順作るのが楽なCUIでやります。

まずはRed Hat SSOを起動しておきます。
引数でバインドアドレスをワイルドカード(0.0.0.0)にしているのは、後述するPrometheusとGrafanaのインストールをdockerでやっているためです。(PrometheusからRed Hat SSOのメトリクス取得を楽にやるため)

```sh
$ $SSO_HOME/bin/standalone.sh -b 0.0.0.0
```

次に別ターミナルで、metrics-listener eventを有効化します。

```sh
$ $SSO_HOME/bin/kcadm.sh config credentials --server http://localhost:8080/auth --realm master --user admin --password admin
Logging into http://localhost:8080/auth as user admin of realm master
$ $SSO_HOME/bin/kcadm.sh update events/config -s "eventsEnabled=true" -s "adminEventsEnabled=true" -s "eventsListeners+=metrics-listener"
```

これで、メトリクスは取得できるので、curlで確認します。

```sh
$ curl http://localhost:8080/auth/realms/master/metrics
# HELP keycloak_user_event_CLIENT_LOGIN Generic KeyCloak User event
# TYPE keycloak_user_event_CLIENT_LOGIN counter
# HELP keycloak_user_event_REGISTER_NODE Generic KeyCloak User event
# TYPE keycloak_user_event_REGISTER_NODE counter
# HELP keycloak_user_event_VALIDATE_ACCESS_TOKEN_ERROR Generic KeyCloak User event
# TYPE keycloak_user_event_VALIDATE_ACCESS_TOKEN_ERROR counter
・・・
```

・参考手順

https://github.com/aerogear/keycloak-metrics-spi#install-and-setup

## 3. PrometheusとGrafanaのインストールとセットアップ

PrometheusとGrafanaは、dockerでやってしまいます。(やっぱり、コンテナは楽です)

以下のファイル構成で作成していきます。

```sh
$ tree .
.
├── docker-compose.yml
└── prometheus
    └── prometheus.yml
```

docker-compose.ymlは以下の内容になります。

```yml:docker-compose.yml
version: "3"

services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    volumes:
      - ./prometheus:/etc/prometheus/
    ports:
      - 9090:9090

  grafana:
    image: grafana/grafana
    container_name: grafana
    environment:
    - TERM=linux
    - GF_INSTALL_PLUGINS=grafana-piechart-panel # メトリクスのダッシュボードで必要となります
    ports:
      - 3000:3000
```
prometheus.ymlは以下の内容になります。
targetsのIPアドレスは、RH-SSOが動作しているマシンのIPアドレスにします。
インターバルは、すぐ確認したいので、5秒にしてます。

```yml:prometheus-compose.yml
global:
    scrape_interval: 5s 
    evaluation_interval: 5s
    external_labels:
      monitor: "sso-monitor"

rule_files:

scrape_configs:

  - job_name: "keycloak"  #　メトリクスのダッシュボードがkeycloakのjob名を参照するので、ここはkeycloakにします

    metrics_path: /auth/realms/master/metrics
    static_configs:
      - targets: ["192.168.68.111:8080"] # RH-SSOが動作しているマシンのIPアドレスにします
```

ファイルの準備ができたら、起動します。

```sh
$ docker-compose up -d 
Creating network "sso-metrics_default" with the default driver
Creating grafana    ... done
Creating prometheus ... done
```
## 4. Prometheusを見てみる

prometheusは、http://localhost:9090 にアクセスすると表示できます。
statusタブからtargetを押すとprometheus-compose.ymlで設定したjob_nameの"RH SSO"が確認できます。

![prometeus_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353997/609c2ecd-7e4b-d4cf-0197-e71330af1fd9.png)


## 5. Grafanaの設定とGrafanaを見てみる

Grafanaは、http://localhost:3000 にアクセスすると表示できます。
IDとパスワードは、admin/adminで入れます。なお、ログインするとパスワード変更が求めれます。

### DataSourceを設定する
左ペインのConfigurationからDataSourceタブで、Prometheusを選択します。
HTTPのURL項目に、http://prometheus:9090 を入力して、save&testを実行します。

![grafana1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353997/18c1bba7-ce38-ddf9-9008-41d5a6ad7635.png)

### Keycloak Metricsのダッシュボードを設定する
Keycloak Metrics用のダッシュボードが、公開されていますので、それを利用します。

左ペインのDashBordsからManagerを選択し、Importを選択します。
Import via grafana.comの項目に、https://grafana.com/grafana/dashboards/10441 を入力して、Loadを実行します。

![grafana2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353997/74eb062b-1304-080c-7378-03ddec946fa7.png)

後は、Dash BoardからKeycloak Metricsを参照することで、Realmやクライアント(アプリケーション)毎のログイン回数などが表示されます。

![grafana3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353997/24b727f5-8b90-9cad-a0de-2476e706e004.png)

## 6. まとめ
Red Hat SSOのインストールからGrafanaで稼働統計を見るとこまでの手順を記載しました。
運用で実際使うGrafanaのダッシュボードでは、このRealmだけ見たいや、トークンの状況を重点的に見たいなどあると思います。
いずれもカスタマイズ可能なので、Keycloak Metricsのダッシュボードを参考にして、運用で確認したい内容に仕上げていくのがいいかと思います。