Keycloak に prometheus Providerをインストールする(aerogear/keycloak-metrics-spi)

keycloak に prometheus エンドポイントを追加する

keycloak に prometheus エンドポイントを追加してみたときの作業メモです。
今回は aerogear/keycloak-metrics-spi を使ってみました。

aerogear/keycloak-metrics-spi について

  • Keycloak の EventListenrに追加することでPrometheus用のメトリクスを出力する
  • Keycloak に Prometheus Endpoint が追加されるためこのProviderを入れるだけでPrometheusにデータを送れる
  • JVM パラメータもメトリクスとして出力される

できること

  • Keycloak の各種 Event を Prometheusフォーマットで出力できる
  • JVM パラメータもメトリクスとして出力される
  • Prometheus Endpoint が起動する(/auth/realms//metrics)

できないこと

  • (今のところ見つからない)

環境

Keycloak 6.0.1
Docker 19.03

手順

keycloak への provider インストール

keycloak に provider をインストールする手順をまとめます

SPIモジュールのビルド

今回インストールするモジュールは以下 https://github.com/aerogear/keycloak-metrics-spi

  • clone、build

    $ git clone git@github.com:aerogear/keycloak-metrics-spi.git
    
    $ cd keycloak-metrics-spi/
    $ docker run --rm  -v $PWD:/app -w /app -u $UID:$GID gradle gradle clean build
    
    $ ls build/libs/
    keycloak-metrics-spi-1.0.2-SNAPSHOT.jar
    

ビルドに成功すると build/libs/keycloak-metrics-spi-1.0.2-SNAPSHOT.jar が生成されます

keycloak コンテナの作成

リソースの準備

  • artifacts/

    • 前項で作成した keycloak-metrics-spi-1.0.2-SNAPSHOT.jar
  • Dockerfile

    FROM jboss/keycloak:6.0.1
    
    USER root
    
    COPY artifacts/*.jar /opt/jboss/keycloak/providers/
    
    EXPOSE 8080 9990
    
    ENTRYPOINT [ "/opt/jboss/tools/docker-entrypoint.sh" ]
    CMD ["-b", "0.0.0.0", "-bmanagement", "0.0.0.0"]
    

コンテナーイメージ Build

$ docker build -t keycloak-prometheus ./

keycloak 起動

$ docker run -d -p 18080:8080 \
        -e KEYCLOAK_USER=admin \
        -e KEYCLOAK_PASSWORD=admin \
        --name keycloak \
        keycloak-prometheus
  1. http://localhost:18080 にアクセス
  2. admin/admin で admin console にログイン
  3. ServerInfo に metrics-listener が表示されていたらProviderのインストールは成功
  4. Manage -> Events -> Events Config で EventsListener に metrics-listener を追加します

prometeus の起動

  • prometheus.yml
global:
  scrape_interval:     15s # By default, scrape targets every 15 seconds.

  # Attach these labels to any time series or alerts when communicating with
  # external systems (federation, remote storage, Alertmanager).
  external_labels:
    monitor: 'codelab-monitor'

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s

    static_configs:
      - targets: ['localhost:9090']
  - job_name: 'keycloak'

    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s
    metrics_path: '/auth/realms/master/metrics'

    static_configs:
      - targets: ['keycloak:8080']
  • prometheus の起動

    ## network
    $ docker network create prometheus
    
    ## add keycloak in prometheus network
    $ docker network connect prometheus keycloak
    
    ## prometheus
    $ docker run \
        -d -p 9090:9090 \
        --network prometheus \
        -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
        prom/prometheus
    

使い方

http://localhost:9090/ にアクセスすることでいろいろなグラフを表示できます

参考資料

https://github.com/aerogear/keycloak-metrics-spi/blob/master/README.md