{"version":3,"file":"dbLogging.mjs","names":[],"sources":["../../src/modules/dbLogging.ts"],"sourcesContent":["import type { getPrismaClient, PrismaClientOptions } from '@prisma/client/runtime/client.d.ts'\nimport env from 'env-var'\nimport type { LoggerOptions } from 'pino'\nimport type { SleetClient } from 'sleetcord'\n\nimport { baseLogger, LOG_LEVEL } from './logging.ts'\nimport { Sentry } from './sentry.ts'\n\ntype PrismaClient =\n  ReturnType<typeof getPrismaClient> extends new (optionsArg: PrismaClientOptions) => infer T\n    ? T\n    : never\n\ntype PrismaClientWith$on = Pick<PrismaClient, '$on'>\n\nconst USE_PINO_PRETTY = env.get('USE_PINO_PRETTY').required().asBool()\n\nconst loggerOptions: LoggerOptions = {\n  level: LOG_LEVEL,\n}\n\nif (USE_PINO_PRETTY) {\n  loggerOptions.transport = {\n    target: 'pino-dev',\n  }\n}\n\nconst prismaLogger = baseLogger.child({ module: 'prisma' })\n\n/** Warn if a query took longer than X ms */\nconst QUERY_TOO_LONG_WARNING = 2_000\n\n/**\n * Inits DB logging using a prisma client, logs queries, info, warnings, errors + warnings for queries that take too long\n * @param prisma The prisma client to use\n * @param sleet The Sleet client to use\n */\nexport function initDBLogging(prisma: PrismaClientWith$on, sleet: SleetClient) {\n  prisma.$on('query', (e) => {\n    const fixedDuration = e.duration.toFixed(4)\n\n    prismaLogger.debug(\n      { ...moduleName(sleet), type: 'query', duration: e.duration },\n      `${e.query}; (Took ${fixedDuration}ms)`,\n    )\n\n    if (e.duration > QUERY_TOO_LONG_WARNING) {\n      const context = {\n        ...moduleName(sleet),\n        type: 'query-too-long',\n        duration: e.duration,\n      }\n      const message = `${e.query}; (Took too long ${fixedDuration}ms)`\n\n      prismaLogger.warn(context, message)\n      Sentry.captureMessage(message, {\n        level: 'warning',\n        extra: context,\n      })\n    }\n  })\n\n  prisma.$on('info', (e: { message: string; target: string }) => {\n    prismaLogger.info(\n      { ...moduleName(sleet), type: 'prisma-info' },\n      `${e.message} (Target ${e.target})`,\n    )\n\n    Sentry.captureMessage(e.message, {\n      level: 'info',\n      extra: {\n        ...moduleName(sleet),\n      },\n      tags: {\n        target: e.target,\n        type: 'prisma-info',\n      },\n    })\n  })\n\n  prisma.$on('warn', (e: { message: string; target: string }) => {\n    prismaLogger.warn(\n      { ...moduleName(sleet), type: 'prisma-warn' },\n      `${e.message} (Target ${e.target})`,\n    )\n\n    Sentry.captureMessage(e.message, {\n      level: 'warning',\n      extra: {\n        ...moduleName(sleet),\n      },\n      tags: {\n        target: e.target,\n        type: 'prisma-warn',\n      },\n    })\n  })\n\n  prisma.$on('error', (e: { message: string; target: string }) => {\n    prismaLogger.error(\n      { ...moduleName(sleet), type: 'prisma-error' },\n      `${e.message} (Target ${e.target})`,\n    )\n\n    Sentry.captureMessage(e.message, {\n      level: 'error',\n      extra: {\n        ...moduleName(sleet),\n      },\n      tags: {\n        target: e.target,\n        type: 'prisma-error',\n      },\n    })\n  })\n}\n\nfunction moduleName(sleet: SleetClient): { name: string } | undefined {\n  const module = sleet.runningModuleStore.getStore()\n  if (module) {\n    return { name: module.name }\n  }\n  return undefined\n}\n"],"mappings":";;;;AAeA,MAAM,kBAAkB,IAAI,IAAI,kBAAkB,CAAC,UAAU,CAAC,QAAQ;AAEtE,MAAM,gBAA+B,EACnC,OAAO,WACR;AAED,IAAI,gBACF,eAAc,YAAY,EACxB,QAAQ,YACT;AAGH,MAAM,eAAe,WAAW,MAAM,EAAE,QAAQ,UAAU,CAAC;;AAG3D,MAAM,yBAAyB;;;;;;AAO/B,SAAgB,cAAc,QAA6B,OAAoB;AAC7E,QAAO,IAAI,UAAU,MAAM;EACzB,MAAM,gBAAgB,EAAE,SAAS,QAAQ,EAAE;AAE3C,eAAa,MACX;GAAE,GAAG,WAAW,MAAM;GAAE,MAAM;GAAS,UAAU,EAAE;GAAU,EAC7D,GAAG,EAAE,MAAM,UAAU,cAAc,KACpC;AAED,MAAI,EAAE,WAAW,wBAAwB;GACvC,MAAM,UAAU;IACd,GAAG,WAAW,MAAM;IACpB,MAAM;IACN,UAAU,EAAE;IACb;GACD,MAAM,UAAU,GAAG,EAAE,MAAM,mBAAmB,cAAc;AAE5D,gBAAa,KAAK,SAAS,QAAQ;AACnC,UAAO,eAAe,SAAS;IAC7B,OAAO;IACP,OAAO;IACR,CAAC;;GAEJ;AAEF,QAAO,IAAI,SAAS,MAA2C;AAC7D,eAAa,KACX;GAAE,GAAG,WAAW,MAAM;GAAE,MAAM;GAAe,EAC7C,GAAG,EAAE,QAAQ,WAAW,EAAE,OAAO,GAClC;AAED,SAAO,eAAe,EAAE,SAAS;GAC/B,OAAO;GACP,OAAO,EACL,GAAG,WAAW,MAAM,EACrB;GACD,MAAM;IACJ,QAAQ,EAAE;IACV,MAAM;IACP;GACF,CAAC;GACF;AAEF,QAAO,IAAI,SAAS,MAA2C;AAC7D,eAAa,KACX;GAAE,GAAG,WAAW,MAAM;GAAE,MAAM;GAAe,EAC7C,GAAG,EAAE,QAAQ,WAAW,EAAE,OAAO,GAClC;AAED,SAAO,eAAe,EAAE,SAAS;GAC/B,OAAO;GACP,OAAO,EACL,GAAG,WAAW,MAAM,EACrB;GACD,MAAM;IACJ,QAAQ,EAAE;IACV,MAAM;IACP;GACF,CAAC;GACF;AAEF,QAAO,IAAI,UAAU,MAA2C;AAC9D,eAAa,MACX;GAAE,GAAG,WAAW,MAAM;GAAE,MAAM;GAAgB,EAC9C,GAAG,EAAE,QAAQ,WAAW,EAAE,OAAO,GAClC;AAED,SAAO,eAAe,EAAE,SAAS;GAC/B,OAAO;GACP,OAAO,EACL,GAAG,WAAW,MAAM,EACrB;GACD,MAAM;IACJ,QAAQ,EAAE;IACV,MAAM;IACP;GACF,CAAC;GACF;;AAGJ,SAAS,WAAW,OAAkD;CACpE,MAAM,SAAS,MAAM,mBAAmB,UAAU;AAClD,KAAI,OACF,QAAO,EAAE,MAAM,OAAO,MAAM"}