Datadog Forwarder を使用した Ruby サーバーレスアプリケーションのインスツルメンテーション

概要

Datadog Serverless の新規ユーザーの場合、代わりに Datadog Lambda Extension を使用して Lambda 関数をインスツルメントする手順に従ってください。Lambda がすぐに使える機能を提供する前に、Datadog Forwarder で Datadog Serverless をセットアップした場合は、このガイドを使用してインスタンスを維持してください。

前提条件

Datadog Forwarder Lambda 関数は、AWS Lambda トレース、拡張メトリクス、カスタムメトリクス、ログの取り込みに必要です。

構成

Datadog CLI は、既存の Lambda 関数のコンフィギュレーションを修正し、新しいデプロイを必要とせずにインスツルメンテーションを可能にします。Datadog のサーバーレスモニタリングをすばやく開始するための最適な方法です。

CI/CD パイプラインにコマンドを追加してすべてのサーバーレスアプリケーションにインスツルメンテーションを有効化することも可能です。Datadog CLI コマンドによる変更が上書きされないよう、通常のサーバーレスアプリケーションのデプロイにコマンドを実行します。

インストール

NPM または Yarn を使用して Datadog CLI をインストールします。

# NPM
npm install -g @datadog/datadog-ci

# Yarn
yarn global add @datadog/datadog-ci

インスツルメントする

関数をインスツルメントするには、AWS 資格情報を使用して次のコマンドを実行します。

datadog-ci lambda instrument -f <functionname> -f <another_functionname> -r <aws_region> -v <layer_version> --forwarder <forwarder_arn>

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

  • <functionname><another_functionname> を Lambda 関数名に置き換えます。
  • <aws_region> を AWS リージョン名に置き換えます。
  • <layer_version> を目的のバージョンの Datadog Lambda ライブラリに置き換えます。最新バージョンは 23 です。
  • <forwarder_arn> を Forwarder ARN に置き換えます (Forwarder のドキュメントを参照)。

例:

datadog-ci lambda instrument -f my-function -f another-function -r us-east-1 -v 23 --forwarder "arn:aws:lambda:us-east-1:000000000000:function:datadog-forwarder"

Lambda 関数が、コード署名を使用するよう構成してある場合、Datadog CLI でインスツルメントするには事前に Datadog の署名プロフィール ARN (arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProfile/9vMI9ZAGLc) を関数のコード署名構成に追加する必要があります。

CLI のドキュメントに詳細と追加のパラメーターがあります。

Datadog Serverless Plugin は、レイヤーを使用して Datadog Lambda ライブラリを関数に自動的に追加し、Datadog Forwarder を介してメトリクス、トレース、ログを Datadog に送信するように関数を構成します。

Lambda 関数が、コード署名を使用するよう構成してある場合、Datadog Serverless Plugin をインストールする前に Datadog の署名プロフィール ARN (arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProfile/9vMI9ZAGLc) を関数のコード署名構成に追加する必要があります。

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

  1. Datadog サーバーレスプラグインをインストールします。
    yarn add --dev serverless-plugin-datadog
    
  2. serverless.yml に以下を追加します。
    plugins:
      - serverless-plugin-datadog
    
  3. serverless.yml に、以下のセクションも追加します。
    custom:
      datadog:
        forwarderArn: # The Datadog Forwarder ARN goes here.
    
    Datadog Forwarder ARN またはインストールの詳細については、こちらを参照してください。追加の設定については、プラグインのドキュメントを参照してください。

インストール

Datadog Lambda ライブラリは、レイヤーまたは gem としてインストールできます。Datadog では、ほとんどの関数でライブラリをレイヤーとしてインストールすることを推奨しています。お使いの Lambda 関数がコンテナイメージとしてデプロイされている場合は、ライブラリを gem としてインストールする必要があります。

datadog-lambda gem のマイナーバージョンは、常にレイヤーのバージョンに一致します。たとえば、datadog-lambda v0.5.0 は、レイヤーバージョン 5 のコンテンツに一致します。

レイヤーの使用

以下のフォーマットで、ARN を使用して Lambda 関数にレイヤーを構成します。

# us、us3、us5、eu リージョンの場合
arn:aws:lambda:<AWS_REGION>:464622532012:layer:Datadog-<RUNTIME>:<VERSION>

# 米国政府リージョンの場合
arn:aws-us-gov:lambda:<AWS_REGION>:002406178527:layer:Datadog-<RUNTIME>:<VERSION>

使用できる RUNTIME オプションは、Ruby2-7Ruby3-2 です。最新の VERSION23 です。例:

arn:aws:lambda:us-east-1:464622532012:layer:Datadog-Ruby3-2:23

Lambda 関数が、コード署名を使用するよう構成してある場合、Datadog Lambda ライブラリをレイヤーとして追加するには事前に Datadog の署名プロフィール ARN (arn:aws:signer:us-east-1:464622532012:/signing-profiles/DatadogLambdaSigningProfile/9vMI9ZAGLc) を関数のコード署名構成に追加する必要があります。

Gem の使用

構築済みの Datadog Lambda レイヤーを使用できない場合、代替として以下を Gemfile に追加することができます。

gem 'datadog-lambda'
gem 'ddtrace'

ddtrace には、AWS Lambda で動作するよう Amazon Linux 用にコンパイルする必要のあるネイティブ拡張機能が含まれています。そのため、Datadog では Lambda をコンテナイメージとして構築しデプロイすることを推奨しています。AWS Lambda を使用するが関数をコンテナイメージとしてデプロイできない、という場合は、Lambda ライブラリを gem ではなくレイヤーとしてインストールすることをお勧めします。

お使いの関数の Dockerfile で bundle install を実行する前に、gccgmp-develmake をインストールし、ネイティブ拡張機能を正常にコンパイルします。

FROM <base image>

# コンテナイメージをアセンブル

RUN yum -y install gcc gmp-devel make
RUN bundle config set path 'vendor/bundle'
RUN bundle install

構成

Datadog APM を有効にし、Datadog Lambda ライブラリが提供するラッパーを使用して Lambda ハンドラー関数をラップします。

require 'datadog/lambda'

Datadog::Lambda.configure_apm do |c|
# インスツルメンテーションを有効にします
end

def handler(event:, context:)
    Datadog::Lambda.wrap(event, context) do
        return { statusCode: 200, body: 'Hello World' }
    end
end

サブスクライブ

関数の各ロググループに Datadog Forwarder Lambda 関数をサブスクライブします。これにより、メトリクス、トレース、ログを Datadog へ送信できるようになります。

  1. まだの場合は、Datadog Forwarder をインストールします
  2. Datadog Forwarder を関数のロググループにサブスクライブします

タグ

オプションではありますが、Datadog では以下の統合サービスタグ付けのドキュメントに従いサーバーレスアプリケーションに envserviceversion タグをタグ付けすることをお勧めします。

確認

以上の方法で関数を構成すると、Serverless Homepage でメトリクス、ログ、トレースを確認できるようになります。

カスタムビジネスロジックの監視

カスタムメトリクスまたはスパンの送信をご希望の場合は、以下のコード例をご参照ください。

require 'ddtrace'
require 'datadog/lambda'

Datadog::Lambda.configure_apm do |c|
# インスツルメンテーションを有効にします
end

def handler(event:, context:)
    # Datadog ラッパーを適用します
    Datadog::Lambda::wrap(event, context) do
        # Lambda 関数スパンにカスタムタグを追加します
        # X-Ray トレーシングが有効になっている場合は機能しません
        current_span = Datadog::Tracing.active_span
        current_span.set_tag('customer.id', '123456')

        some_operation()

        Datadog::Tracing.trace('hello.world') do |span|
          puts "Hello, World!"
        end

        # カスタムメトリクスを送信します
        Datadog::Lambda.metric(
          'coffee_house.order_value', # メトリクス名
          12.45, # メトリクス値
          time: Time.now.utc, # オプション、過去 20 分以内である必要があります
          "product":"latte", # タグ
          "order":"online" # タグ
        )
    end
end

# 関数をインスツルメントします
def some_operation()
    Datadog::Tracing.trace('some_operation') do |span|
        # ここで何かをします
    end
end

カスタムメトリクス送信の詳細については、Serverless Custom Metrics を参照してください。カスタムインスツルメンテーションの詳細については、カスタムインスツルメンテーションの Datadog APM ドキュメントを参照してください。

その他の参考資料

お役に立つドキュメント、リンクや記事: