このページでは、lambda関数を手動でインストゥルメントする方法を学習します。関数はランタイム言語で整理されています。
Go-language Lambdaをインストゥルメントするには、以下の手順に従います。
Goエージェントパッケージをダウンロードし、関数と同じディレクトリに置きます。
エージェントをインストール:
go get -u github.com/newrelic/go-agent/v3/newrelic
を呼び出します。nrlambdaインテグレーション
go get -u github.com/newrelic/go-agent/v3/integrations/nrlambda
をインストールします。Lambdaコードで、コンポーネントをインポートし、アプリケーションを作成し、Lambdaの起動方法を更新します。インストゥルメントされたLambdaの例については、GitHubリポジトリを参照してください。
オプション:RecordCustomEvent API
を使用して、Lambdaの呼び出しに関連付けられる
カスタムイベントを追加します。例:func handler(ctx context.Context) {if txn := newrelic.FromContext(ctx); nil != txn {txn.Application().RecordCustomEvent("MyEvent", map[string]interface{}{"zip": "zap",})}fmt.Println("hello world!")}Lambda関数を構築して圧縮し、AWSにアップロードします。
Lambdaの圧縮とアップロードについての推奨は、次のとおりです。
Linuxで実行するバイナリを構築します。これにより、
main
と呼ばれるバイナリファイルが作成されます。次のものを使用できます。$ GOOS=linux go build -o main次のものを使用して、バイナリをデプロイメントパッケージに圧縮します。
$ zip deployment.zip mainAWS LambdaコンソールまたはAWS CLIのいずれかを使用して、zipファイルをAWSにアップロードします。(バイナリ構築中に付けられた名前と同じにするため)ハンドラーの名前を
main
にします。
次の環境変数はLambdaをモニターする機能には不要ですが、Lambda機能をディストリビューティッド(分散)トレーシングに含める場合は必要です。ディストリビューティッド(分散)トレーシングを有効にするには、AWSコンソールで以下の環境変数を設定します。
オプション:ログ作成を設定するには、Go agentのログ作成を参照してください。
少なくとも1回Lambdaを呼び出します。これにより、CloudWatchロググループが作成されます。次のステップではこのグループが必要です。
ラッパーはLambda実行についてのデータを収集し、JSONメッセージを生成し、CloudWatchログにログ記録します。次に、CloudWatchを設定してそのログをNew Relicに送信します。
JavaでのAWS Lambdaのモニタリングでは、APM Javaエージェントは使用しません。代わりに、次の2つのOpenTracing依存関係を使用します。
AWS Lambda OpenTracing Java SDK:AWS Lambda RequestHandlerおよびRequestStreamHandlerのOpenTracingインストゥルメンテーション。
当社のAWS Lambda OpenTracing Tracer:OpenTracing Tracerの実装は、AWS Lambdaをモニターするように設計されています。スパン、エラーイベント、トランザクションイベント、エラートレースを生成し、ディストリビューティッド(分散)トレーシングをサポートします。
ヒント
サポート対象の OpenTracing バージョン
OpenTracing 0.31.0:
- Lambda Tracer:com.newrelic.opentracing:newrelic-java-lambda:1.1.1
- Lambda SDK:com.newrelic.opentracing:java-aws-lambda:1.0.0
OpenTracing 0.32.0、0.33.0:
- Lambda Tracer:com.newrelic.opentracing:newrelic-java-lambda:2.1.1
- Lambda SDK:com.newrelic.opentracing:java-aws-lambda:1.0.0
Java Lambdaをインストゥルメントするには、以下の手順に従います。
プロジェクトの
build.gradle
ファイルに、OpenTracing AWS Lambda TracerとAWS Lambda OpenTracing SDKの依存関係を含めます。dependencies {compile("com.newrelic.opentracing:java-aws-lambda:2.1.0")compile("com.newrelic.opentracing:newrelic-java-lambda:2.1.1")compile("io.opentracing:opentracing-util:0.33.0")}Java Lambdaの例
に示されたようにAWS Lambda RequestHandlerインタフェースを実装し、doHandleRequest
メソッドを上書きします。doHandleRequest
メソッドで、LambdaTracing.instrument(...)
APIを呼び出して、lambda関数の実行をトレースするrootスパンを作成します。ここでは、Lambda関数のビジネスロジックも定義します。Java Lambdaの例
に示されたように、LambdaTracer.INSTANCEをOpenTracing Globalトレーサーとして登録します。ZIPデプロイメントパッケージを作成し、AWS Lambdaにアップロードします。または、その他の方法でディプロイします。
AWS Lambdaコンソールで、ハンドラーを設定します。Java Lambda例の場合は、ハンドラーは
com.handler.example.MyLambdaHandler::handleRequest
となります。handleRequest
が前提となっているため、com.handler.example.MyLambdaHandler
も使用できます。以下の AWSコンソール環境変数は、Lambda関数をディストリビューティッド(分散)トレーシングに含める場合は必要です。これが推奨されます。
オプション:Lambdaコンソールで、この環境変数を追加してデバッグロギングを有効にします。
NEW_RELIC_DEBUG
はtrue
です。少なくとも1回Lambdaを呼び出します。これにより、CloudWatchロググループが作成されます。次のステップではこのグループが必要です。
ラッパーはLambda実行についてのデータを収集し、JSONメッセージを生成し、CloudWatchログにログ記録します。次に、CloudWatchを設定してそのログをNew Relicに送信します。
以下のような、一般的な使用例を示す完全なプロジェクトのAWS Lambdaディストリビューティッド(分散)トレーシングの例を参照してください。
- Lambda関数間のディストリビューティッド(分散)トレーシング
- 手作業でのスパン作成(別名カスタムインストゥルメンテーション)
- 外部コールのトレース
- カスタムアトリビュート(別名タグ)のスパンへの追加
.NET CoreベースのAWS Lambda関数のモニタリングでは、標準.NET Core APMエージェントは使用しません。代わりに、NuGetパッケージを使用します。
.NET Core Lambdaをインストゥルメントするには、以下の手順に従います。
Lambda関数プロジェクトに、
NewRelic.OpenTracing.AmazonLambda.Tracer NuGet
パッケージをインストールします。注:
NewRelic.OpenTracing.AmazonLambda.Tracer
は、Amazon.Lambda.APIGatewayEvent
NuGet パッケージのバージョン1.2.0 以降によって異なります。環境がすでに下位バージョンのAmazon.Lambda.APIGatewayEvent
を使用している場合、New RelicパッケージはSystem.MissingMethodException
などのエラーを生成する可能性があります。NuGetパッケージとOpenTracingユーティリティをインポートします。
using OpenTracing.Util;using NewRelic.OpenTracing.AmazonLambda;この例で示されたように、機能を以下のようにインストゥルメントします。
public class Function{static Function(){// Register The NewRelic Lambda Tracer InstanceGlobalTracer.Register(NewRelic.OpenTracing.AmazonLambda.LambdaTracer.Instance);}public object FunctionWrapper(ILambdaContext context){// Instantiate NewRelic TracingWrapper and pass your FunctionHandler as// an argumentreturn new TracingRequestHandler().LambdaWrapper(FunctionHandler, context);}/// <summary>/// A simple function that takes a string and does a ToUpper/// </summary>/// <param name="input"></param>/// <param name="context"></param>/// <returns></returns>public object FunctionHandler(ILambdaContext context){ ... }}ヒント
FunctionWrapper
に渡される引数は、FunctionHandler
の署名と一致する必要があります。ハンドラー関数がタスクを返す場合、Lambdaラッパーは返されたタスクが完了するまでブロックします。そのため、持続時間を計測でき、例外がある場合それを把握できます。また、
APIGatewayProxyFunction
から継承することもできます。例については、以下を参照してください。
public async Task<int> FunctionHandlerAsync(ILambdaContext lambdaContext){return await new TracingRequestHandler().LambdaWrapper(ActualFunctionHandlerAsync, lambdaContext);}public async Task<APIGatewayProxyResponse> ActualFunctionHandlerAsync(ILambdaContextlambdaContext){ // Function can make other async operations here...}public class LambdaFunction : APIGatewayProxyFunction{static LambdaFunction(){// Register The NewRelic Lambda Tracer InstanceOpenTracing.Util.GlobalTracer.Register(NewRelic.OpenTracing.AmazonLambda.LambdaTracer.Instance);}public override Task<APIGatewayProxyResponse> FunctionHandlerAsync(APIGatewayProxyRequest request, ILambdaContext lambdaContext){Task<APIGatewayProxyResponse> task = new TracingRequestHandler().LambdaWrapper(ActualFunctionHandlerAsync, request, lambdaContext);return task;}public Task<APIGatewayProxyResponse> ActualFunctionHandlerAsync(APIGatewayProxyRequest request, ILambdaContext lambdaContext){return base.FunctionHandlerAsync(request, lambdaContext);}}SQSおよびSNSのオプション:.NET Lambda Tracerのバージョン1.0以降、ディストリビューティッド(分散)トレーシングのサポートがSQSとSNSについて追加されています。SQSまたはSNSにおいてディストリビューティッド(分散)トレーシングを有効にするには、このステップの項目を完了させるとともに、これに続くステップにおいて環境変数を設定する必要があります。
重要
SQSおよびSNSにおいてディストリビューティッド(分散)トレーシングのサポートを有効にすると、SQSとSNSの両方において自動インストゥルメンテーションが無効になり、それらのインストゥルメントに向けてこれらのwrapperの使用が要求されることになります。
NEW_RELIC_USE_DT_WRAPPER
環境変数をtrue
に設定します。- SQSおよびSNSコールをインストゥルメントするには、規定のwrapperを使用する必要があります。
SQS wrapperは、以下の手法のラッピングをサポートしています。
Amazon.SQS.AmazonSQSClient.SendMessageAsync(...)
Amazon.SQS.AmazonSQSClient.SendMessageBatchAsync(...)
例
// SQS Client AmazonSQSClient client = new AmazonSQSClient("AWS_SECRET_ACCESS_KEY", AWS_REGION); // SendMessageRequest SendMessageRequest sendRequest = new SendMessageRequest("QUEUE_URI_STRING", "An SQS Message"); Task<SendMessageResponse> responseOne = SQSWrapper.WrapRequest(client.SendMessageAsync, sendRequest); // String-based Task<SendMessageResponse> responseTwo = SQSWrapper.WrapRequest(client.SendMessageAsync, "QUEUE_URI_STRING", "Another SQS Message"); // SendMessageBatchRequest List<SendMessageBatchRequestEntry> batchEntries = new List<SendMessageBatchRequestEntry>(); batchEntries.Add(new SendMessageBatchRequestEntry("id1", "First SQS Message")); batchEntries.Add(new SendMessageBatchRequestEntry("id2", "Second SQS Message")); batchEntries.Add(new SendMessageBatchRequestEntry("id3", "Third SQS Message")); SendMessageBatchRequest sendBatchRequest = new SendMessageBatchRequest(QUEUE_URI, batchEntries); Task<SendMessageBatchResponse> response = SQSWrapper.WrapRequest(client.SendMessageBatchAsync, sendBatchRequest); // SendMessageBatchRequestEntry List List<SendMessageBatchRequestEntry> moreBatchEntries = new List<SendMessageBatchRequestEntry>(); batchEntries.Add(new SendMessageBatchRequestEntry("id4", "Fourth SQS Message")); batchEntries.Add(new SendMessageBatchRequestEntry("id5", "Fifth SQS Message")); batchEntries.Add(new SendMessageBatchRequestEntry("id6", "Sixth SQS Message")); Task<SendMessageBatchResponse> response = SQSWrapper.WrapRequest(client.SendMessageBatchAsync, moreBatchEntries);
SNS wrapperは、以下の手法のラッピングをサポートしています。
Amazon.SimpleNotificationService.AmazonSimpleNotificationServiceClient.PublishAsync(...)
例
// SNS Client AmazonSimpleNotificationServiceClient client = new Amazon.SimpleNotificationService.AmazonSimpleNotificationServiceClient("AWS_SECRET_ACCESS_KEY", AWS_REGION); // PublishRequest - Phone Number PublishRequest phonePublishRequest = new PublishRequest(); phonePublishRequest.PhoneNumber = +1XXX5555100; phonePublishRequest.Message = "An SNS Message for phones"; Task<PublishResponse> phoneResponse = SNSWrapper.WrapRequest(client.PublishAsync, phonePublishRequest); // PublishRequest - ARN PublishRequest publishRequest = new PublishRequest("TOPIC_ARN", "An SNS Message"); Task<PublishResponse> publishResponse = SNSWrapper.WrapRequest(client.PublishAsync, publishRequest); // String-based without subject Task<PublishResponse> ResponseOne = SNSWrapper.WrapRequest(client.PublishAsync, "TOPIC_ARN", "Another SNS Message"); // String-based with subject Task<PublishResponse> ResponseTwo = SNSWrapper.WrapRequest(client.PublishAsync, "TOPIC_ARN", "Yet Another SNS Message", "A Subject");
次の環境変数はLambdaをモニターする機能には不要ですが、Lambda機能をディストリビューティッド(分散)トレーシングに含める場合は必要です。ディストリビューティッド(分散)トレーシングを有効にするには、AWS Lambdaコンソールで次の環境変数を設定します。
ラッパー関数 (上記の例では
FunctionWrapper
)が関数ハンドラーとして設定されていることを確認します。少なくとも1回Lambdaを呼び出します。これにより、CloudWatchロググループが作成されます。次のステップではこのグループが必要です。
ラッパーはLambda実行についてのデータを収集し、JSONメッセージを生成し、CloudWatchログにログ記録します。次に、CloudWatchを設定してそのログをNew Relicに送信します。
Node.js Lambdaをインストゥルメントするには:
Node.jsエージェントパッケージをダウンロードし、関数と同じディレクトリに配置し、エージェントが
node_modules
ディレクトリで依存関係としてインストールされていることを確認します。Node Package Managerを使用します。npm install newrelic --saveAWS SDKモジュールをNode.jsエージェントとともにインストールするには:
npm install @newrelic/aws-sdk --saveLambdaコードで、ファイルの先頭でエージェントモジュールとAWS SDKを要求し、ハンドラー関数をラップします。例:
const newrelic = require('newrelic');require('@newrelic/aws-sdk');// Other module loads go under the two require statements abovemodule.exports.handler = newrelic.setLambdaHandler((event, context, callback) => {// This is your handler function codeconsole.log('Lambda executed');callback();});オプション:
recordCustomEvent
APIを使用して、Lambdaにカスタムイベントを追加することもできます。例:module.exports.handler = newrelic.setLambdaHandler((event, context, callback) => {newrelic.recordCustomEvent(‘MyEventType’, {foo: ‘bar’});console.log('Lambda executed');callback();});Lambda関数とNode.jsエージェントフォルダを一緒に圧縮します。要件および推奨:
- New Relicエージェントフォルダに入っていないNew Relicファイルは、含める必要はありません。
- Lambda関数のファイル名が、例えば、
lambda_function.node
の場合は、zipファイルをlambda_function.zip
と命名することを推奨します。tarballは使用しないでください。 - Lambdaと関連モジュールはすべて、zipファイルのルートディレクトリにある必要があります。つまり、ファイルを含むファイルを圧縮するとうまくいきません。
圧縮したファイルを、AWS Lambdaアカウントにアップロードします。
AWSコンソールで、以下の環境変数を設定します。
オプション:ローカル環境においてAWS以外のサーバーレスモードでエージェントを実行するには、環境変数
NEW_RELIC_SERVERLESS_MODE_ENABLED
をtrue
に設定します。(これをAWS Lambda環境で実行する場合、エージェントはサーバーレスモードで自動的に実行されます。AWSで実行中の場合、この変数は使用しないでください。)オプション:サーバーレスモードでのロギングを有効にするには、環境変数を次のように設定します。
NEW_RELIC_LOG_ENABLED
をtrue
に設定します。- CloudWatchに出力する場合は、
NEW_RELIC_LOG
をstdout
に設定、または書き込み可能なファイルロケーションに設定します。 - ログレベルは、デフォルトで
info
に設定されます。その他のログレベルを参照してください。
少なくとも1回Lambdaを呼び出します。これにより、CloudWatchロググループが作成されます。次のステップではこのグループが必要です。
ラッパーはLambda実行についてのデータを収集し、JSONメッセージを生成し、CloudWatchログにログ記録します。次に、CloudWatchを設定してそのログをNew Relicに送信します。
Python Lambdaをインストゥルメントするには:
Pythonエージェントパッケージをダウンロードし、関数と同じディレクトリに配置します。この場合は、pipを使用します。
pip install -t . newrelic重要
Homebrewを使用する場合は、以下のエラーが発生することがあります。
DistutilsOptionError:ホームまたはprefix/exec-prefixのいずれかを提供する必要があります。両方ではありません
。詳細については、Homebrew GitHubの投稿を参照してください。Lambdaコードで、Pythonエージェントモジュールをインポートし、New Relicデコレーターを使用してハンドラー関数を修飾します。最初に、コードにNew Relicパッケージをインポートする必要があります。次の例を見てみましょう。
import newrelic.agentnewrelic.agent.initialize()@newrelic.agent.lambda_handler()def handler(event, context):...オプション:
record_custom_event
APIを使用して、Lambdaにカスタムイベントを追加することもできます。次の例を見てみましょう。@newrelic.agent.lambda_handler()def handler(event, context):newrelic.agent.record_custom_event('CustomEvent', {'foo': 'bar'})…このガイドラインを使用して、
lambda_function.py
とnewrelic/
フォルダを一緒に圧縮します。newrelic/
フォルダに入っていないNew Relicファイルは、含める必要はありません。- Lambda関数ファイル名が、たとえば
lambda_function.py
の場合は、zipファイルをlambda_function.zip
と命名します。tarballは使用しないでください。 - Lambdaと関連モジュールはすべて、zipファイルのルートディレクトリにある必要があります。つまり、ファイルを含むファイルを圧縮するとうまくいきません。
圧縮したファイルを、AWS Lambdaアカウントにアップロードします。
AWSコンソールで、以下の環境変数を設定します。
NEW_RELIC_SERVERLESS_MODE_ENABLED
。true
に設定します。
次の環境変数はLambdaをモニターする機能には不要ですが、Lambda機能をディストリビューティッド(分散)トレーシングに含める場合は必要です。ディストリビューティッド(分散)トレーシングを有効にするには、AWSコンソールで以下の環境変数を設定します。
オプション:ロギングを設定するには、AWSコンソールで
NEW_RELIC_LOG
とNEW_RELIC_LOG_LEVEL
環境変数を使用します。少なくとも1回Lambdaを呼び出します。これにより、CloudWatchロググループが作成されます。次のステップではこのグループが必要です。
New Relicデコレーターは、Lambda実行についてのデータを収集し、JSONメッセージを生成し、CloudWatchログに記録します。次に、CloudWatchを設定してそのログをNew Relicに送信します。
その他のヘルプ
さらに支援が必要な場合は、これらのサポートと学習リソースを確認してください:
- Explorers Hubでは、コミュニティからのサポートを受けたり、ディスカッションに参加したりすることができます。
- 当社サイトで答えを見つけて、サポートポータルの使用方法を確認してください。
- Linux、Windows、およびmacOS向けトラブルシューティングツールであるNew Relic Diagnosticsを実行してください。
- New Relicの とandドキュメント をご確認ください。