Go サーバーレスアプリケーションのインスツルメンテーション

Go Lambda 関数がまだランタイム go1.x を使用していて、provided.al2 ランタイムに移行できない場合、代わりに Datadog Forwarder を使用してインスツルメントする必要があります。
Lambda 関数が公共のインターネットにアクセスできない VPC にデプロイされている場合、datadoghq.com Datadog サイトには AWS PrivateLink を、それ以外のサイトにはプロキシを使用してデータを送信することができます。

インストール

Datadog Serverless Plugin は、Datadog Lambda 拡張機能 を介してメトリクス、トレース、ログを Datadog に送信するように関数を自動的に構成します。

Datadog サーバーレスプラグインをインストールして構成するには、次の手順に従います。

Datadog サーバーレスプラグインをインストールします。

serverless plugin install --name serverless-plugin-datadog

serverless.yml を更新します:

custom:
  datadog:
    site: <DATADOG_SITE>
    apiKeySecretArn: <DATADOG_API_KEY_SECRET_ARN>

関数をインスツルメントするには、AWS CDK アプリの Stack オブジェクトに DatadogServerless 変換と CfnMapping を追加します。以下の Python のサンプルコードを参照してください (他の言語での使用方法も同様です)。

  • <DATADOG_SITE> を、テレメトリーの送信先となる Datadog サイトに置き換えます。
  • <DATADOG_API_KEY_SECRET_ARN> を、Datadog API キーが安全に保存されている AWS シークレットの ARN に置き換えます。キーはプレーンテキスト文字列として保存する必要があります (JSON blob ではありません)。また、secretsmanager:GetSecretValue権限が必要です。迅速なテストのために、代わりに apiKey を使用して、Datadog API キーをプレーンテキストで設定することができます。

詳細および追加設定については、プラグインドキュメントを参照してください。

Datadog Lambda 拡張機能のインストール

AWS のリージョンやアーキテクチャに応じた ARN 形式で、Datadog Lambda 拡張機能の Lambda レイヤーを Lambda 関数に追加します。

# AWS 商用リージョンにデプロイされた x86 ベースの Lambda にはこの形式を使用します
arn:aws:lambda:<AWS_REGION>:464622532012:layer:Datadog-Extension:28

# AWS 商用リージョンにデプロイされた arm64 ベースの Lambda にはこの形式を使用します
arn:aws:lambda:<AWS_REGION>:464622532012:layer:Datadog-Extension-ARM:28

# AWS GovCloud リージョンにデプロイされた x86 ベースの Lambda にはこの形式を使用します
arn:aws-us-gov:lambda:<AWS_REGION>:002406178527:layer:Datadog-Extension:28

# AWS GovCloud リージョンにデプロイされた arm64 ベースの Lambda にはこの形式を使用します
arn:aws-us-gov:lambda:<AWS_REGION>:002406178527:layer:Datadog-Extension-ARM:28

<AWS_REGION>us-east-1 などの有効な AWS リージョンに置き換えてください。

必要な環境変数を構成する

  • DD_SITE を設定します。(右側で正しい SITE が選択されていることを確認してください)。
  • DD_API_KEY_SECRET_ARN を、Datadog API キーが安全に保存されている AWS シークレットの ARN に設定します。キーはプレーンテキスト文字列として保存する必要があります (JSON blob ではありません)。また、secretsmanager:GetSecretValue権限が必要です。迅速なテストのために、代わりに DD_API_KEY を使用して、Datadog API キーをプレーンテキストで設定することができます。

Datadog Lambda ライブラリのインストール

go get github.com/DataDog/datadog-lambda-go

Lambda 関数のコードを更新する

package main

import (
  "github.com/aws/aws-lambda-go/lambda"
  "github.com/DataDog/datadog-lambda-go"
  "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
  httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http"
)

func main() {
  // Lambda ハンドラーをラップします
  lambda.Start(ddlambda.WrapFunction(myHandler, nil))
}

func myHandler(ctx context.Context, event MyEvent) (string, error) {
  // HTTP リクエストをトレースします
  req, _ := http.NewRequestWithContext(ctx, "GET", "https://www.datadoghq.com", nil)
  client := http.Client{}
  client = *httptrace.WrapClient(&client)
  client.Do(req)

  // カスタムメトリクスを送信します
  ddlambda.Metric(
    "coffee_house.order_value", // メトリクス名
    12.45, // メトリクス値
    "product:latte", "order:online" // 関連タグ
  )

  // カスタムスパンを作成します
  s, _ := tracer.StartSpanFromContext(ctx, "child.span")
  time.Sleep(100 * time.Millisecond)
  s.Finish()
}

次のステップ

  • おめでとうございます。Serverless Homepage でメトリクス、ログ、トレースを見ることができるようになりました。
  • テレメトリーの収集に問題がある場合は、トラブルシューティングガイドを参照してください
  • 高度な構成を参照して以下のことを行ってください。
    • タグを使ったテレメトリー接続
    • AWS API Gateway、SQS などのテレメトリーを収集する
    • Lambda のリクエストとレスポンスのペイロードを取得する
    • Lambda 関数のエラーをソースコードにリンクする
    • ログまたはトレースから機密情報をフィルタリングまたはスクラブする

その他の参考資料