Sardine では、安定性を非常に重視しています。より多くのマーチャントやさまざまなユースケースへとスケールしていく中で、モニタリングとアラートはますます重要になります。私たちはホスティングに GCP を利用していますが、GCP が基本的な機能を提供している一方で、モニタリング体制をさらに強化するために datadog を採用することにしました。
Datadog を利用するメリットは次のとおりです:
- カスタムラベルを使ってログを動的にフィルタリングおよびグループ化できる機能。GCPでも一応似たことはできますが、実際のところあまりうまくはいきません。
- 同じモニターに対して警告とアラートを設定する。
- 異なるしきい値で、本番およびステージングなどの別々の GCP プロジェクト間でモニター定義を共有します。
- 異なる GCP プロジェクト間でダッシュボード定義を共有する。
- 全体的によりクリーンで直感的なUIになり、不具合も減りました。
Datadog は、オンラインガイドを提供しており、GCP との連携方法を説明しています。私たちはインフラ管理に terraform を使っているため、すべてを terraform で構築したいと考えました。
Datadog からの GCP 連携を設定する
最初のステップは、Datadog で「integrations」>「Google Cloud Platform」を選択し、プロジェクトを追加することです。そのためには、適切な権限を持つサービスアカウントが必要です。
resource "google_service_account" "datadog-connect" { account_id = "datadog-connect" display_name = "Datadog 接続用サービスアカウント"}resource "google_project_iam_member" "datadog-connect" { for_each = toset([ "roles/cloudasset.viewer", "roles/compute.viewer", "roles/monitoring.viewer", ]) role = each.key member = "serviceAccount:${google_service_account.datadog-connect.email}"}
さらに、特定のタグを持つホストに対してのみメトリクス収集を制限することもできます。開発プロジェクトでは開発者がいつでも自由にリソースを作成できるため、監視対象のホストには特定のラベル「datadog:monitored」を付与し、そのホストからのみメトリクスを収集するようにしています

さらに重要な点として、Datadog コネクタは GCP が提供するすべてのメトリクスを収集しているわけではありません。たとえば、私たちは以前、監視において p95 値の gcp.loadbalancing.https.backend_latencies メトリクスを利用していましたが、Datadog は 2021 年 8 月時点では avg と sumsqdev しか収集できません でした。そのため、アプリケーションレベルで独自のカスタムメトリクスを定義する必要がありました。
ログ収集
GCE または GKE 上で動作しているアプリケーションについては、Datadog Agent を使用してローカルでログを収集できます。その他のログについては、ログシンクと Pub/Sub を使ってログを転送する必要があります。
resource "google_pubsub_topic" "export-logs-to-datadog" { name = "export-logs-to-datadog"}resource "google_pubsub_subscription" "datadog-logs" { name = "datadog-logs" topic = google_pubsub_topic.export-logs-to-datadog.name message_retention_duration = "604800s" retain_acked_messages = false ack_deadline_seconds = 60 push_config { push_endpoint = "https://gcp-intake.logs.datadoghq.com/v1/input/${var.datadog_key}/" }}resource "google_logging_project_sink" "datadog-sink" { name = "datadog-sink" destination = "pubsub.googleapis.com/${google_pubsub_topic.export-logs-to-datadog.id}" filter = "" unique_writer_identity = true}resource "google_project_iam_member" "pubsub-publisher-permisson" { role = "roles/pubsub.publisher" member = google_logging_project_sink.datadog-sink.writer_identity}
ログ構造が Datadog のログ UI に正しく反映されるように、カスタムのログパイプラインを定義する必要がある場合があります。以下が当社のパイプラインです。

カスタムメトリクス(Datadog エージェント)
追加のメトリクス、ログ、およびカスタムメトリクスを収集するには、Datadog Agentをインストールする必要があります。Agent は Docker イメージとしても、ほとんどの OS 向けのパッケージとしても提供されているため、通常は非常に簡単に導入できます。
私たちにとっての一つの問題は、(まだ)GKE を使っていなかったことです。私たちは container-optimized OS 上のマネージドインスタンスグループを使っていました。アプリケーションのほとんどに golang を使っているため、アプリケーションの Docker イメージはとてもシンプルで、scratch イメージ上に golang アプリケーションをコピーしているだけです。つまり、datadog パッケージをインストールするための OS が存在しないため、container-optimized OS 上で 2 つの Docker イメージ(アプリケーションイメージと datadog agent イメージ)を同時に動かす方法を考える必要がありました。
あまり詳しくは文書化されていませんが、VM の startup_script で Docker を起動できることが分かりました。
module "managed_instance_group_template" { source = "terraform-google-modules/vm/google//modules/instance_template" ...startup_script = "docker run -d --name dd-agent ...."
以上です!セットアップの途中段階ですが、すでに Datadog から価値が得られていて、とても満足しています!

