concourseのMetricsをstackdriverに送ってみる(Prometheus -> stackdirver)

これはRecruit Engineers Advent Calendar22日目の記事です。(許して

最近はConcourse CIを利用してCI/CD環境を準備することが多いのですが、ちゃんと使えば使うほど、プロジェクトの中でも重要度が高まり、ちゃんと運用しないと辛いことになってしまいます。 CI/CD環境もちゃんとモニタリングして運用していくぞ!ということで色々調べていくとconcourseではメトリクスエンドポイントが提供されているのを見つけました。

公式の利用例も公開されていて、かっちょいいダッシュボードが見えるようになっています。 https://metrics.concourse-ci.org/dashboard/db/concourse

メトリクスは

  • InfluxDB
  • NewRelic
  • Prometheus
  • Datadog
  • Riemann

のフォーマットで提供されていますが、直近ではstackdriverの検証もやっており、concourseのためだけにdatadogやPrometheusを準備するのは面倒だったため、Googleが公開しているPrometheus-to-sd を利用してみます。

exmapleとしてkube-state-metrics をstackdriverに送るサンプルが公開されているため、これをもとに弄ってみます。

https://github.com/GoogleCloudPlatform/k8s-stackdriver/blob/master/prometheus-to-sd/kubernetes/prometheus-to-sd-kube-state-metrics.yaml

apiVersion: v1
kind: Pod
metadata:
  name: kube-metrics
spec:
  hostNetwork: true
  containers:
  - name: kube-state-metrics
    image: gcr.io/google-containers/kube-state-metrics:v1.4.0
    ports:
      - name: http-metrics
        containerPort: 8080
    readinessProbe:
      httpGet:
        path: /healthz
        port: 8080
      initialDelaySeconds: 5
      timeoutSeconds: 5
    resources:
      requests:
        memory: 200Mi
        cpu: 100m
      limits:
        memory: 300Mi
        cpu: 200m
  - name: prometheus-to-sd
    image: gcr.io/google-containers/prometheus-to-sd:v0.3.2
    ports:
      - name: profiler
        containerPort: 6060
    command:
      - /monitor
      - --stackdriver-prefix=custom.googleapis.com
      - --source=kube-state-metrics:http://localhost:8080
      - --pod-id=$(POD_NAME)
      - --namespace-id=$(POD_NAMESPACE)
    env:
      - name: POD_NAME
        valueFrom:
          fieldRef:
            fieldPath: metadata.name
      - name: POD_NAMESPACE
        valueFrom:
          fieldRef:
            fieldPath: metadata.namespace

concourseの環境はGKE上にhelmで準備します。 https://github.com/helm/charts/tree/master/stable/concourse

今回は 面倒なので prometheusのmetricsをstackdriverに送るところまでがスコープなので 、 prometheus.enabled にして web-deployment.yaml に以下のcontainerを追加します。 promethusをenableするとserviceも作成されるので Prometheus-to-sd はdeploymentで準備してservice経由で取得するのが正しい気もするが、省略します

        - name: prometheus-to-sd
          image: gcr.io/google-containers/prometheus-to-sd:v0.3.2
          ports:
            - name: profiler
              containerPort: 6060
          command:
            - /monitor
            - --stackdriver-prefix=custom.googleapis.com
            - --source=concourse:http://localhost:9391
            - --pod-id=$(POD_NAME)
            - --namespace-id=$(POD_NAMESPACE)
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
 

これで設定は終了、これをGKEにデプロイして同じプロジェクトのstackdriver MonitoringからMetricsを確認するとメトリクスが飛んで出来てるのが確認できます

f:id:int_tt:20181225085335p:plain

TODO

  • pipelineを準備してちゃんと試せていないのでPrometheusと同等のMetricsがちゃんと取得できてるか確認する
  • 仕組みちゃんと調べる
  • prometheusもstackdriverもまだnoobなので途中経過を書く