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に送るサンプルが公開されているため、これをもとに弄ってみます。
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を確認するとメトリクスが飛んで出来てるのが確認できます
TODO
- pipelineを準備してちゃんと試せていないのでPrometheusと同等のMetricsがちゃんと取得できてるか確認する
- 仕組みちゃんと調べる
- prometheusもstackdriverもまだnoobなので途中経過を書く