🐱
PrismaをAWS X-Rayで分析できるようにしてみる
LambdaなどでX-Rayを有効にするのは簡単に出来るので、最近は有効にすることが多いのですが、DBアクセスによく使うPrismaの部分も対象に出来ないかと試行錯誤してみました。
多少無理やり感はあるのですが、分析できるようには出来たので、備忘と共有として残しておきます。
PrismaのX-Ray組み込みコード
早速ですが、下記がコードになります。
import AWSXRay from 'aws-xray-sdk'
const prisma = new PrismaClient({
log: [{ level: 'query', emit: 'event' }],
}).$on('query', async (event) => {
if (process.env.AWS_XRAY_DAEMON_ADDRESS) {
try {
const segment = AWSXRay.getSegment()
if (segment) {
const start_time = (event.timestamp.valueOf() - event.duration) * 1e-3
const end_time = event.timestamp.valueOf() * 1e-3
const subSegment = segment.addNewSubsegment('mysql')
subSegment.addSqlData({ sanitized_query: event.query })
subSegment.addAttribute('start_time', start_time)
subSegment.addAttribute('end_time', end_time)
subSegment.addAttribute('in_progress', false)
subSegment.addAttribute('namespace', 'remote')
subSegment.close()
}
} catch {
// X-Rayのせいでエラーとかは嫌なので、エラーは潰す
}
}
})
クエリのログ出力用の機構を利用
クエリのログ出力用の機構を利用して、X-Rayのデータ登録を行うような仕組みにしています。
timestamp
とduration
を利用して、start_time
、end_time
を算出。
mysql
の部分は好きに変更してください。
X-Rayの利用環境チェック
ローカル実行など、X-Rayを利用できないケース用に、AWS_XRAY_DAEMON_ADDRESS
環境変数の有無(X-Rayを利用できる環境か)を確認してから実行するようにしています。
X-Rayはあくまでも分析用なので、メイン処理に影響しないように
X-Rayはあくまでも分析用なので、エラーは潰すようにしています。
Discussion