Skip to content

Prometheus と Grafana による EMQX クラスターの監視

目的

EMQX Exporter をデプロイし、Prometheus と Grafana を使って EMQX クラスターを監視します。

Prometheus と Grafana のデプロイ

  • Prometheus のデプロイ方法については、Prometheus のドキュメントをご参照ください。
  • Grafana のデプロイ方法については、Grafana のドキュメントをご参照ください。

EMQX クラスターのデプロイ

EMQX は Prometheus 互換の HTTP API を通じて様々なメトリクスを公開しています。

yaml
apiVersion: apps.emqx.io/v2
kind: EMQX
metadata:
  name: emqx
spec:
  image: emqx/emqx:6.2.0
  config:
    data: |
      license {
        key = "..."
      }

上記の内容を emqx.yaml として保存し、以下のコマンドを実行して EMQX クラスターをデプロイします。

bash
$ kubectl apply -f emqx.yaml
emqx.apps.emqx.io/emqx created

EMQX クラスターの状態を確認し、STATUSReady になっていることを確認してください。完了までに時間がかかる場合があります。

bash
$ kubectl get emqx emqx
NAME   STATUS   AGE
emqx   Ready    10m

API シークレットの作成

Prometheus は EMQX ダッシュボード API からメトリクスを取得するため、ダッシュボードにサインインして API シークレットを作成 してください。

EMQX Exporter のデプロイ

emqx-exporter は EMQX の Prometheus API で公開されていない一部のメトリクスを公開するために設計されています。

yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: emqx-exporter
  name: emqx-exporter-service
spec:
  ports:
    - name: metrics
      port: 8085
      targetPort: metrics
  selector:
    app: emqx-exporter
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: emqx-exporter
  labels:
    app: emqx-exporter
spec:
  selector:
    matchLabels:
      app: emqx-exporter
  replicas: 1
  template:
    metadata:
      labels:
        app: emqx-exporter
    spec:
      securityContext:
        runAsUser: 1000
      containers:
        - name: exporter
          image: emqx-exporter:latest
          imagePullPolicy: IfNotPresent
          args:
            # "emqx-dashboard-service-name" は operator によって作成され、18083 ポートを公開するサービス名です
            - --emqx.nodes=${emqx-dashboard-service-name}:18083
            - --emqx.auth-username=${paste_your_new_api_key_here}
            - --emqx.auth-password=${paste_your_new_secret_here}
          securityContext:
            allowPrivilegeEscalation: false
            runAsNonRoot: true
          ports:
            - containerPort: 8085
              name: metrics
              protocol: TCP
          resources:
            limits:
              cpu: 100m
              memory: 100Mi
            requests:
              cpu: 100m
              memory: 20Mi

引数の --emqx.nodes には operator によって作成され、18083 ポートを公開しているサービス名を設定してください。サービス名は kubectl get svc コマンドで確認できます。

上記の内容を emqx-exporter.yaml として保存し、--emqx.auth-username--emqx.auth-password を新しい API シークレットに置き換えてください。以下のコマンドで emqx-exporter をデプロイします。

bash
kubectl apply -f emqx-exporter.yaml

emqx-exporter の Pod の状態を確認します。

bash
$ kubectl get po -l="app=emqx-exporter"
NAME                            STATUS   AGE
emqx-exporter-856564c95-j4q5v   Running  8m33s

Prometheus 監視設定

Prometheus Operator は PodMonitorServiceMonitor CRD を使って、Pod やサービスの監視方法を動的に定義します。

yaml
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: emqx
  labels:
    app.kubernetes.io/name: emqx
spec:
  podMetricsEndpoints:
    - interval: 5s
      path: /api/v5/prometheus/stats
      # emqx ダッシュボードの containerPort 名
      port: dashboard
      relabelings:
        - action: replace
          # ユーザー定義のクラスター名、一意である必要があります
          replacement: emqx5
          targetLabel: cluster
        - action: replace
          # 固定値、変更しないでください
          replacement: emqx
          targetLabel: from
        - action: replace
          # 固定値、変更しないでください
          sourceLabels: ['pod']
          targetLabel: "instance"
  selector:
    matchLabels:
      # emqx Pod のラベルと同じ
      apps.emqx.io/instance: emqx
      apps.emqx.io/managed-by: emqx-operator
  namespaceSelector:
    matchNames:
      # EMQX クラスターを他のネームスペースにデプロイしている場合は変更してください
      #- default
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: emqx-exporter
  labels:
    app: emqx-exporter
spec:
  selector:
    matchLabels:
      # emqx-exporter サービスのラベルと同じ
      app: emqx-exporter
  endpoints:
    - port: metrics
      interval: 5s
      path: /metrics
      relabelings:
        - action: replace
          # ユーザー定義のクラスター名、一意である必要があります
          replacement: emqx5
          targetLabel: cluster
        - action: replace
          # 固定値、変更しないでください
          replacement: exporter
          targetLabel: from
        - action: replace
          # 固定値、変更しないでください
          sourceLabels: ['pod']
          regex: '(.*)-.*-.*'
          replacement: $1
          targetLabel: "instance"
        - action: labeldrop
          # 固定値、変更しないでください
          regex: 'pod'
  namespaceSelector:
    matchNames:
      # exporter を他のネームスペースにデプロイしている場合は変更してください
      #- default

path は指標収集インターフェースのパスを示します。EMQX 5 では /api/v5/prometheus/stats です。selector.matchLabels はマッチする Pod のラベルを示し、apps.emqx.io/instance: emqx となっています。

targetLabelcluster の値は現在のクラスター名を表し、一意である必要があります。

上記の内容を monitor.yaml として保存し、以下のコマンドを実行してください。

bash
$ kubectl apply -f monitor.yaml

Prometheus での EMQX 指標の確認

Prometheus のインターフェースを開き、グラフページに切り替えて emqx と入力すると、以下の図のように表示されます。

Status -> Targets ページに切り替えると、以下の図のようにクラスター内のすべての監視対象 EMQX Pod 情報が確認できます。

Grafana テンプレートのインポート

すべてのダッシュボード テンプレート をインポートしてください。メインダッシュボード EMQX を開いてお楽しみください。