これは Mackerel Advent Calendar 2024 1日目の記事です。
前置き
こんにちは。サーバー監視・オブザーバビリティプラットフォームであるMackerelの開発者で、「オブザーバビリティの実現」チームでテックリード兼プロダクトオーナーをしております id:arthur-1 と申します。昨年のMackerel Advent Calendar 2023においては25記事書き切ることができましたが、今年は控えめにやっていきます。
さて、先日はCloudNative Days Winter 2024に参加させていただき、多くの方と交流できました。私はプレイベントである船上LT会にて、OpenFeature×AWS AppConfigの話で登壇したほか、OSS展示にOpenTelemetryに関する自作ツールのポスターを出していました。
船上LT会のときの最高の写真もらった w/ @taisuke_bigbaby #CNDW2024 pic.twitter.com/bbl5RcOeHl
— Arthur (@Arthur1__) 2024年11月29日
懇親会/2次会でPipeCDのメンテナの方々とたくさんお話しできたので、今回はMackerel×PipeCDのネタで行こうと思います。昨年の私のエントリを読んでいる方はお気づきかもしれませんが、以下の記事のPipeCD版をやります。
本題
PipeCDとは、GitOpsを実現する継続的デリバリーツールです。マルチプラットフォーム対応で統一されたプログレッシブデリバリーを行うことを目指しており、Kubernetesだけでなく、Amazon ECSやTerraformなどに対しても利用できるのが大きな特徴です。manifestが含まれたGitのリモートリポジトリの更新を検知して、自動でさまざまな環境に対してデプロイすることができます。
プログレッシブデリバリーを目指しているところが個人的には推しポイントです。先日私がWaroom Meetup #2にて障害対応に関する登壇をした際にも、手札に入れたい技術としてプログレッシブデリバリーを挙げていました。
なんらかのアプリケーションをデプロイしたり(Binary Push)、インフラの設定を変更したり(Configuration push)する行為は、障害を起こす主な要因の一つです*1。
監視サービスにおいて、こうしたシステムの変化や障害に関連し得るイベントと、モニタリングシグナルを紐づけて閲覧できるというのは大事な機能です。Mackerelにはグラフアノテーションという機能があり、グラフ上に時刻と紐づけてメモを残すことができます。グラフとは独立してブラウジングすることもできるので、サービスの様子の変化に関連するさまざまなイベントとその時刻を記録しておく場所としてご利用いただけます。
今回はPipeCDでデプロイメントが完了したら、その時刻でグラフアノテーションに書き込み、デプロイイベントとグラフを紐づけて描画できるようなものを作っていきます。
mkrで手軽にグラフアノテーションを作る
グラフアノテーションを手軽に投稿するにはMackerelのCLIであるmkrを利用するのが便利です。mkr annotationsコマンドで以下のようにしてグラフアノテーションを作ることができます。
export MACKEREL_APIKEY="***censored***" mkr annotations create --title "message" -s mackerel-service-name --from $(date +%s) --to $(date +%s)
Argo CDの場合のおさらい
Argo CDのSync起因でグラフアノテーションを書き込もうとしていた時には、Argo CDのResource Hooksの仕組みを使って、Sync完了後にmkrのコンテナイメージを動かすようなJobを定義していました。
apiVersion: batch/v1 kind: Job metadata: generateName: mackerel-sesame-deploy-annotation- annotations: argocd.argoproj.io/hook: PostSync argocd.argoproj.io/hook-delete-policy: HookSucceeded spec: template: spec: containers: - name: mkr-create-annotation image: docker.io/mackerel/mkr:latest env: - name: MACKEREL_APIKEY valueFrom: secretKeyRef: name: mackerel-arthur-1 key: apikey command: ["sh", "-c"] args: - | mkr annotations create --title "synced mackerel-sesame" \ -s iot-monitor -r mackerel-sesame \ --from $(date +%s) --to $(date +%s) restartPolicy: Never
PipeCDの場合
PipeCDにはv0.46からデプロイメントパイプラインにScript Runという種類のstageが実装されています。エントリ執筆現在(v0.49.4)ではアルファステータスとなっています。
デプロイを実行したステージの後にScript Runステージを入れ、そこで何らかの処理を行えばアノテーションを投稿できそうです。しかし、ここで実行できるコマンドは限られています*2。pipedのコンテナイメージにビルトインで入っているコマンドしか呼べず、もちろんここにmkrは入っていません。
そのため、mkrを含んだpipedのコンテナイメージを自前で作る必要があります。以下のようなDockerfileを書くことで、mkrを含んだpipedのコンテナイメージをビルドできます。mkrもpipedもイメージがAlpineベースなので、相性的にもバッチリです。
FROM mackerel/mkr:v0.59.0 AS mkr FROM ghcr.io/pipe-cd/piped:v0.49.3 COPY --from=mkr /usr/local/bin/mkr /usr/local/bin/mkr
カスタムビルドしたpipedを立てられたら、あとは以下のようにPipeCDのmanifest yamlを編集して、デプロイパイプラインの最後のステージとしてSCRIPT_RUNを追加してあげましょう。
apiVersion: pipecd.dev/v1beta1 kind: TerraformApp spec: name: plan-approval-apply-app input: terraformVersion: 1.8.3 pipeline: stages: - name: TERRAFORM_PLAN - name: WAIT_APPROVAL - name: TERRAFORM_APPLY # ↓↓ここから↓↓ - name: SCRIPT_RUN with: # サボってキーをそのまま埋め込んでますが、PipeCDのSecret management機能を使うと良さそうです env: MACKEREL_APIKEY: "***censored***" run: | mkr annotations create --title "synced ${SR_APPLICATION_NAME}" --description "${SR_SUMMARY} commit hash:${SR_TRIGGERED_COMMIT_HASH}" -s arthur --from "$SR_TRIGGERED_AT" --to $(date +%s) # ↑↑ここまで↑↑ description: | This app demonstrates how to deploy a Terraform resource with a customized pipeline.\ cf. [adding a new app](https://pipecd.dev/docs/user-guide/managing-application/adding-an-application/), [app configuration](https://pipecd.dev/docs/user-guide/configuration-reference/#terraform-application)
Deploymentが成功しているのを確認したら、Mackerelのサービスページやカスタムダッシュボードページなどで、グラフアノテーションが投稿されているのを眺めましょう。
デプロイメントがトリガーされてから終了するまでの時間や、デプロイしたアプリケーションの名前、commit hashといった情報がアノテーションに含まれていますね。PipeCDがさまざまな環境変数を用意してくれており*3、これを利用するとアノテーションに入れたいテキストや時刻を簡単に組み立てることができます。
メトリックの変化とデプロイイベントを無事視覚的に紐づけることができたところで、今回は以上になります。
明日のMackerel Advent Calendarは id:missasan の記事になります。お楽しみに!