🐱

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のデータ登録を行うような仕組みにしています。
timestampdurationを利用して、start_timeend_timeを算出。
mysqlの部分は好きに変更してください。

X-Rayの利用環境チェック

ローカル実行など、X-Rayを利用できないケース用に、AWS_XRAY_DAEMON_ADDRESS環境変数の有無(X-Rayを利用できる環境か)を確認してから実行するようにしています。

X-Rayはあくまでも分析用なので、メイン処理に影響しないように

X-Rayはあくまでも分析用なので、エラーは潰すようにしています。

Discussion