Repository URL to install this package:
|
Version:
0.7.0 ▾
|
// (c) Copyright 2023 Supertenant Ltd. - all rights reserved.
// See LICENSE file in project root for license terms.
"use strict";const shimmer=require("shimmer");let logger;logger=require("../../../logger").getLogger("tracing/prisma",newLogger=>{logger=newLogger});const requireHook=require("../../../util/requireHook"),{getErrorDetails,getStackTrace}=require("../../tracingUtil"),EXIT=require("../../constants")["EXIT"],cls=require("../../cls");let isActive=!1;const providerAndDataSourceUriMap=new WeakMap;function instrumentPrismaClient(prismaClientModule){instrumentClientConstructor(prismaClientModule),shimRequest(prismaClientModule)}function instrumentClientConstructor(prismaClientModule){if("function"==typeof prismaClientModule.PrismaClient){class InstanaPrismaClient extends prismaClientModule.PrismaClient{constructor(){var configPromise;super(...arguments),this._engine&&"function"==typeof this._engine.getConfig?"function"==typeof(configPromise=this._engine.getConfig()).then?configPromise.then(configResult=>{var dataSourceUrlObject;configResult&&Array.isArray(configResult.datasources)&&(configResult=configResult.datasources[0])&&((dataSourceUrlObject=configResult.url)&&dataSourceUrlObject.value?providerAndDataSourceUriMap.set(this._engine,{provider:configResult.activeProvider,dataSourceUrl:redactPassword(configResult.activeProvider,dataSourceUrlObject.value)}):dataSourceUrlObject&&dataSourceUrlObject.fromEnvVar&&providerAndDataSourceUriMap.set(this._engine,{provider:configResult.activeProvider,dataSourceUrl:redactPassword(configResult.activeProvider,process.env[dataSourceUrlObject.fromEnvVar])}))}):logger.debug("The operation getConfig did not yield a thenable, the database URL will not be captured on spans."):logger.debug("PrismaClient#_engine.getConfig does not exist, the database URL will not be captured on spans.")}}prismaClientModule.PrismaClient=InstanaPrismaClient}}function shimRequest(prismaClientModule){prismaClientModule&&prismaClientModule.PrismaClient&&prismaClientModule.PrismaClient.prototype&&prismaClientModule.PrismaClient.prototype._request?shimmer.wrap(prismaClientModule.PrismaClient.prototype,"_request",instrumentRequest):logger.debug("prismaClientModule.PrismaClient.prototype._request does not exist, will not instrument Prisma.")}function instrumentRequest(original){return function(){if(cls.skipExitTracing({isActive:isActive}))return original.apply(this,arguments);var argsForOriginalRequest=new Array(arguments.length);for(let i=0;i<arguments.length;i++)argsForOriginalRequest[i]=arguments[i];return instrumentedRequest(this,original,argsForOriginalRequest)}}function instrumentedRequest(ctx,originalRequest,argsForOriginalRequest){return cls.ns.runAndReturn(()=>{const span=cls.startSpan("prisma",EXIT);span.stack=getStackTrace(instrumentedRequest,1);var params=argsForOriginalRequest[0]||{},providerAndDataSourceUri=ctx._engine&&providerAndDataSourceUriMap.get(ctx._engine)||{},params=(span.data.prisma={model:params.model,action:params.action,provider:providerAndDataSourceUri.provider,url:providerAndDataSourceUri.dataSourceUrl},originalRequest.apply(ctx,argsForOriginalRequest));return params||"function"==typeof params.then?params.then(value=>(finishSpan(null,span),value)).catch(error=>(finishSpan(error,span),error)):(span.cancel(),params)})}function redactPassword(provider,url){if("string"!=typeof provider||"string"!=typeof url||"sqlite"===provider.toLowerCase())return url;if(!["cockroachdb","mongodb","mysql","postgresql","sqlserver"].includes(provider.toLowerCase()))return null;if("sqlserver"===provider.toLowerCase())return redactPasswordFromMsSQLUrl(url);try{var parsedUrl=new URL(url);return null!=parsedUrl&&(parsedUrl.password="_redacted_"),parsedUrl.toString()}catch(e){return null}}function redactPasswordFromMsSQLUrl(url){url=/(.*;\s*password\s*=\s*)[^;]*(.*)/i.exec(url);return url?url[1]+"_redacted_"+url[2]:null}function finishSpan(error,span){error&&(span.ec=1,span.data.prisma.error=getErrorDetails(error)),span.d=Date.now()-span.ts,span.transmit()}exports.init=function(){requireHook.onModuleLoad("@prisma/client",instrumentPrismaClient)},exports._redactPassword=redactPassword,exports.activate=function(){isActive=!0},exports.deactivate=function(){isActive=!1};