使用 Prometheus-Operator 从 Keycloak 自动抓取领域指标

Auto-scrape realm metrics from Keycloak with Prometheus-Operator

我使用 bitnami/keycloak Helm chart (https://bitnami.com/stack/keycloak/helm) 安装了 Keycloak。

因为我也在使用 Prometheus-Operator 进行监控,所以我启用了指标端点和服务监控器:

keycloak:
  ...
  metrics:
    enabled: true
    serviceMonitor:
      enabled: true
      namespace: monitoring
      additionalLabels:
        release: my-prom-operator-release

因为我对实际领域指标更感兴趣,所以我安装了 keycloak-metrics-spi 提供程序 (https://github.com/aerogear/keycloak-metrics-spi),方法是设置一个将其下载到共享卷的初始化容器。

keycloak:
  ...
  extraVolumeMounts:
    - name: providers
      mountPath: /opt/bitnami/keycloak/providers

  extraVolumes:
    - name: providers
      emptyDir: {}
  ...
  initContainers:
    - name: metrics-spi-provider
      image: SOME_IMAGE_WITH_WGET_INSTALLED
      imagePullPolicy: Always
      command:
        - sh
      args:
        - -c
        - |
          KEYCLOAK_METRICS_SPI_VERSION=2.5.2
          wget --no-check-certificate -O /providers/keycloak-metrics-spi-${KEYCLOAK_METRICS_SPI_VERSION}.jar \
            https://github.com/aerogear/keycloak-metrics-spi/releases/download/${KEYCLOAK_METRICS_SPI_VERSION}/keycloak-metrics-spi-${KEYCLOAK_METRICS_SPI_VERSION}.jar
          chmod +x /providers/keycloak-metrics-spi-${KEYCLOAK_METRICS_SPI_VERSION}.jar
          touch /providers/keycloak-metrics-spi-${KEYCLOAK_METRICS_SPI_VERSION}.jar.dodeploy
      volumeMounts:
        - name: providers
          mountPath: /providers

提供商在常规 public-facinghttp 端口而不是 http-management 端口上启用指标端点,这不是很好为了我。但是我可以在我的反向代理中阻止对它们的外部访问。

我缺少的是对这些端点的某种自动抓取。现在我创建了一个额外的模板,它为图表中预定义列表的每个元素创建了一个新的服务监视器:

values.yaml

keycloak:
  ...
  metrics:
    extraServiceMonitors:
      - realmName: master
      - realmName: my-realm

servicemonitor-metrics-spi.yaml

{{- range $serviceMonitor := .Values.keycloak.metrics.extraServiceMonitors }}
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: {{ $.Release.Name }}-spi-{{ $serviceMonitor.realmName }}
...
spec:
  endpoints:
    - port: http
      path: /auth/realms/{{ $serviceMonitor.realmName }}/metrics
...
{{- end }}

有更好的方法吗?这样 Prometheus 就可以自动检测我所有的领域并抓取它们的端点?

提前致谢!

正如@jan-garaj 所说,无需查询所有端点。所有return所有领域的累积数据。所以只需要抓取一个领域的端点(例如主领域)。

非常感谢!

它可能对某些人有帮助,bitnami 图像因此 helm chart 已经包含 metrics-spi-provider。因此不需要任何进一步的安装操作,但必须在值中启用指标。