こんにちは。香田です。
今回はAWS LambdaでNew Relic Logs in Contextを利用する方法を紹介していきます。
事前にNew RelicのAWSインテグレーションが必要になる為、下記を参考に設定してみてください。
Introduction to AWS integrations
New Relic Logs in Contextについて
New Relic Logs in Contextを利用すると APMで取得されるエラー情報やトレース情報のコンテキストに応じたログを表示することが可能です。
Logs In Contextを利用する場合、New RelicのAPM Agentを利用する必要がありますが、
AWS Lambda等をサポートしているサーバーレス モニタリングを利用することで、APMと同じようにエラーやトレース情報よりLogs in Contextが確認可能です。
今回は簡易な手順で設定可能なサーバーレス モニタリングを利用し、Logs in Contextを確認していきます。
Serverless Frameworkを利用しAWS環境の構築
Logs in Contextの確認用のAWS環境として、API Gateway、Lambda環境を構築していきます。
構築にはServerless Frameworkを利用していきます。
はじめに作業ディレクトリを作成します。
$ mkdir workspace
$ cd workspace
serverlessをインストールします。
$ npm install -g serverless
New Relicより提供されているserverless pluginをインストールします。
プラグインを利用することで、New Relicへデータが転送されサーバーレス モニタリングが利用可能となります。
$ npm install --save-dev serverless-newrelic-lambda-layers
NEW_RELIC_API_KEY
、NEW_RELIC_ACCOUNT_ID
を環境変数に設定します。
$ export NEW_RELIC_API_KEY=xxxx
$ export NEW_RELIC_ACCOUNT_ID=xxxx
Serverless Frameworkの設定ファイルserverless.yml
を作成します。
service: hello-world
frameworkVersion: "3"
provider:
name: aws
runtime: python3.9
stage: dev
apiName: hello-world-api
region: ap-northeast-1
timeout: 300
plugins:
- serverless-newrelic-lambda-layers
custom:
newRelic:
accountId: ${env:NEW_RELIC_ACCOUNT_ID}
apiKey: ${env:NEW_RELIC_API_KEY}
# Lambda Extension
enableFunctionLogs: true
functions:
hello:
name: hello
handler: handler.hello
events:
- http:
path: /hello
method: get
Lambda 関数のコードとしてhandler.py
という名前でファイルを作成します。
import json
import logging
import datetime
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def hello(event, context):
body = {
"message": "Hello world",
}
response = {
"statusCode": 200,
"body": json.dumps(body)
}
for i in range(5):
dt_now = datetime.datetime.now()
message = "test%d New Relic Logs in Contest %s" % (i, dt_now)
logger.info(message)
return response
AWS環境へデプロイします。
$ sls deploy --verbose
Logs in Contextの確認
Logs in Contextを確認する為、API Gatewayへリクエストをしばらく送ってみます。
API GatewayのIDを確認し環境変数へ設定します。
$ export API_ID=xxxx
API Gatewayへリクエストをしばらく送信します。
while true; do
curl -s https://${API_ID}.execute-api.ap-northeast-1.amazonaws.com/dev/hello | jq -r .message
sleep 1
done
リクエストをしばらく送信後、New Relicへアクセスし[Explorer]、[Lambda functions]より作成された関数を選択します。
[Distributed tracing]よりTrace groupを選択します。
Traceを選択し[Logs]をクリックします。
下記のようにLambdaのトレースに紐づいたログが確認できるはずです。
ログをさらに絞り込みたい場合は[Open in logs]をクリックします。
下記のように[Logs]の方で参照可能となります。
さいごに
AWS LambdaでNew Relic Logs in Contextを利用する方法如何でしたでしょうか?
Logs in Contextを利用することで、トレースやエラーといった情報を起点に目的のログを直接参照可能になる為、トラブルシューティングの時にも有用ではないでしょうか。
最後までご覧いただきありがとうございます。