Datadog Forwarder を使用した Go サーバーレスアプリケーションのインスツルメンテーション
概要
必須セットアップ
未構成の場合:
AWS インテグレーションと Datadog Forwarder をインストールしたら、手順に従ってアプリケーションをインスツルメントし、Datadog にメトリクス、ログ、トレースを送信します。
構成
インストール
次のコマンドを実行して、Datadog Lambda ライブラリをローカルにインストールします。
go get github.com/DataDog/datadog-lambda-go
インスツルメントする
関数をインスツルメントするには、次の手順に従います。
環境変数 DD_FLUSH_TO_LOG
と DD_TRACE_ENABLED
を true
に設定します。
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"
)
Datadog Lambda ライブラリが提供するラッパーを使用して、Lambda 関数ハンドラーをラップします。
func main() {
// Wrap your lambda handler like this
lambda.Start(ddlambda.WrapHandler(myHandler, nil))
/* OR with manual configuration options
lambda.Start(ddlambda.WrapHandler(myHandler, &ddlambda.Config{
BatchInterval: time.Second * 15
APIKey: "my-api-key",
}))
*/
}
含まれているライブラリを使用して、追加のスパンを作成し、ログとトレースを接続し、トレースコンテキストを他のサービスに渡します。
func myHandler(ctx context.Context, event MyEvent) (string, error) {
// Trace an HTTP request
req, _ := http.NewRequestWithContext(ctx, "GET", "https://www.datadoghq.com", nil)
client := http.Client{}
client = *httptrace.WrapClient(&client)
client.Do(req)
// Connect your Lambda logs and traces
currentSpan, _ := tracer.SpanFromContext(ctx)
log.Printf("my log message %v", currentSpan)
// Create a custom span
s, _ := tracer.StartSpanFromContext(ctx, "child.span")
time.Sleep(100 * time.Millisecond)
s.Finish()
}
サブスクライブ
メトリクス、トレース、ログを Datadog へ送信するには、関数の各ロググループに Datadog Forwarder Lambda 関数をサブスクライブします。
- まだの場合は、Datadog Forwarder をインストールします。
- Datadog Forwarder を関数のロググループにサブスクライブします。
タグ
これはオプションですが、Datadog は、統合サービスタグ付け向けに、サーバーレスアプリケーションに env
、service
、version
タグをタグ付けすることをお勧めします。
確認
以上の方法で関数を構成すると、Serverless Homepage でメトリクス、ログ、トレースを確認できるようになります。
カスタムビジネスロジックの監視
カスタムメトリクスの送信をご希望の場合は、以下のコード例をご参照ください。
package main
import (
"github.com/aws/aws-lambda-go/lambda"
"github.com/DataDog/datadog-lambda-go"
)
func main() {
// ハンドラー関数をラップします
lambda.Start(ddlambda.WrapHandler(myHandler, nil))
}
func myHandler(ctx context.Context, event MyEvent) (string, error) {
// カスタムメトリクスを送信します
ddlambda.Metric(
"coffee_house.order_value", // メトリクス名
12.45, // メトリクス値
"product:latte", "order:online" // 関連タグ
)
// Submit a custom metric with timestamp
ddlambda.MetricWithTimestamp(
"coffee_house.order_value", // メトリクス名
12.45, // メトリクス値
time.Now(), // タイムスタンプ、過去 20 分以内である必要があります
"product:latte", "order:online" // Associated tags
)
req, err := http.NewRequest("GET", "http://example.com/status")
// Datadog 分散型トレーシングヘッダを追加
ddlambda.AddTraceHeaders(ctx, req)
client := http.Client{}
client.Do(req)
}
カスタムメトリクスの送信に関する詳細を参照してください。
その他の参考資料