このページでは、ラムダ関数を手動で計測する方法を学習します。ランタイム言語別に整理されています。まだお持ちでない場合は、以下で無料の New Relic アカウントを作成して、今すぐデータの監視を開始してください。
Go-language Lambdaをインストゥルメントするには、以下の手順に従います。
Goエージェントパッケージをダウンロードして、関数と同じディレクトリに配置します。
次のコマンドを実行してエージェントをインストールします。
bash$go get -u github.com/newrelic/go-agent/v3/newrelic次のコマンドを実行して、
nrlambda
統合をインストールします。bash$go get -u github.com/newrelic/go-agent/v3/integrations/nrlambda
あなたのLambdaコードで、私たちのコンポーネントをインポートし、アプリケーションを作成し、Lambdaの起動方法を更新してください。インストゥルメンテーションの例をご覧ください。
必要に応じて、
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
というバイナリファイルが生成されます。次を使用できます。bash$GOOS=linux go build -o main次のものを使用して、バイナリをデプロイメントパッケージに圧縮します。
bash$zip deployment.zip mainAWSLambdaコンソールまたはAWSCLIのいずれかを使用してzipファイルをAWSにアップロードします。ハンドラーに
main
という名前を付けます(バイナリビルド中に指定された名前と一致させるため)。
次の環境変数は、Lambdaモニタリングが機能するために必要ではありませんが、Lambda関数を分散トレースに含める場合は必要です。分散トレースを有効にするには、AWSコンソールで次の環境変数を設定します。
オプションで、ロギングを構成するには、 Goエージェントロギングを参照してください。
少なくとも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:
Java Lambdaをインストゥルメントするには、以下の手順に従います。
プロジェクトの
build.gradle
ファイルに、OpenTracing AWSLambdaTracerとAWSLambdaOpenTracingSDKの依存関係を含めます。dependencies {compile("com.newrelic.opentracing:java-aws-lambda:2.1.0")compile("com.newrelic.opentracing:newrelic-java-lambda:2.2.1")compile("io.opentracing:opentracing-util:0.33.0")}JavaLambdaの例に示すようにAWSLambda
RequestHandler
インターフェースを実装し、doHandleRequest
メソッドをオーバーライドします。doHandleRequest
メソッドで、LambdaTracing.instrument(...)
APIを呼び出してルートスパンを作成し、ラムダ関数の実行をトレースします。これは、ラムダ関数のビジネスロジックを定義する場所でもあります。Java Lambdaの例に示すように、
LambdaTracer.INSTANCE
をOpenTracingグローバルトレーサーとして登録します。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 Functionsプロジェクトで、
NewRelic.OpenTracing.AmazonLambda.Tracer
NuGetパッケージをインストールします。注:
NewRelic.OpenTracing.AmazonLambda.Tracer
は、Amazon.Lambda.APIGatewayEvent
NuGetパッケージのバージョン1.2.0以降に依存します。環境がすでに下位バージョンのAmazon.Lambda.APIGatewayEvent
を使用している場合、NewRelicパッケージは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 ClientAmazonSQSClient client = new AmazonSQSClient("AWS_SECRET_ACCESS_KEY", AWS_REGION);// SendMessageRequestSendMessageRequest sendRequest = new SendMessageRequest("QUEUE_URI_STRING", "An SQS Message");Task<SendMessageResponse> responseOne = SQSWrapper.WrapRequest(client.SendMessageAsync, sendRequest);// String-basedTask<SendMessageResponse> responseTwo = SQSWrapper.WrapRequest(client.SendMessageAsync, "QUEUE_URI_STRING", "Another SQS Message");// SendMessageBatchRequestList<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 ListList<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 ClientAmazonSimpleNotificationServiceClient client = new Amazon.SimpleNotificationService.AmazonSimpleNotificationServiceClient("AWS_SECRET_ACCESS_KEY", AWS_REGION);// PublishRequest - Phone NumberPublishRequest phonePublishRequest = new PublishRequest();phonePublishRequest.PhoneNumber = +1XXX5555100;phonePublishRequest.Message = "An SNS Message for phones";Task<PublishResponse> phoneResponse = SNSWrapper.WrapRequest(client.PublishAsync, phonePublishRequest);// PublishRequest - ARNPublishRequest publishRequest = new PublishRequest("TOPIC_ARN", "An SNS Message");Task<PublishResponse> publishResponse = SNSWrapper.WrapRequest(client.PublishAsync, publishRequest);// String-based without subjectTask<PublishResponse> responseOne = SNSWrapper.WrapRequest(client.PublishAsync, "TOPIC_ARN", "Another SNS Message");// String-based with subjectTask<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
ディレクトリにインストールされていることを確認します。ノードパッケージマネージャーを使用します。bash$npm install newrelic --saveLambdaコードで、ファイルの先頭にエージェントモジュールを要求し、ハンドラー関数をラップします。例えば:
const newrelic = require('newrelic');// Other module loads go under the require statement 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
に設定するか、書き込み可能なファイルの場所に設定します。 NEW_RELIC_LOG_LEVEL
デフォルトではinfo
に設定されており、Lambaで関数ログを送信する場合にのみ使用されます。 他のログレベルを参照してください。
少なくとも1回Lambdaを呼び出します。これにより、CloudWatchロググループが作成されます。次のステップではこのグループが必要です。
ラッパーはLambda実行についてのデータを収集し、JSONメッセージを生成し、CloudWatchログにログ記録します。次に、CloudWatchを設定してそのログをNew Relicに送信します。
Lambdaで関数ログを送信する 方法の詳細を読む。
Python Lambdaをインストゥルメントするには:
Pythonエージェントパッケージをダウンロードし、関数と同じディレクトリに配置します。この場合は、pipを使用します。
bash$pip install -t . newrelic重要
Homebrewを使用している場合、次のエラーが発生する可能性があります:
DistutilsOptionError: must supply either home or prefix/exec-prefix -- not both
。詳細については、 HomebrewGitHubの投稿を参照してください。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/
フォルダー外のNewRelicファイルを含める必要はありません。- 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に送信します。