KyselyLogger: improve parameter serialization

This commit is contained in:
Alex Gleason 2025-01-27 19:26:26 -06:00
parent 05c90fb677
commit 5ea33f6817
No known key found for this signature in database
GPG key ID: 7211D1F99744FBB7

View file

@ -3,6 +3,7 @@ import { Logger } from 'kysely';
import { dbQueriesCounter, dbQueryDurationHistogram } from '@/metrics.ts'; import { dbQueriesCounter, dbQueryDurationHistogram } from '@/metrics.ts';
import { errorJson } from '@/utils/log.ts'; import { errorJson } from '@/utils/log.ts';
import { JsonValue } from '@std/json';
/** Log the SQL for queries. */ /** Log the SQL for queries. */
export const KyselyLogger: Logger = (event) => { export const KyselyLogger: Logger = (event) => {
@ -14,14 +15,7 @@ export const KyselyLogger: Logger = (event) => {
dbQueriesCounter.inc(); dbQueriesCounter.inc();
dbQueryDurationHistogram.observe(duration); dbQueryDurationHistogram.observe(duration);
/** Parameters serialized to JSON. */ const parameters = query.parameters.map(serializeParameter);
const parameters = query.parameters.map((parameter) => {
try {
return JSON.stringify(parameter);
} catch {
return String(parameter);
}
});
if (event.level === 'query') { if (event.level === 'query') {
logi({ level: 'debug', ns: 'ditto.sql', sql, parameters, duration }); logi({ level: 'debug', ns: 'ditto.sql', sql, parameters, duration });
@ -31,3 +25,21 @@ export const KyselyLogger: Logger = (event) => {
logi({ level: 'error', ns: 'ditto.sql', sql, parameters, error: errorJson(event.error), duration }); logi({ level: 'error', ns: 'ditto.sql', sql, parameters, error: errorJson(event.error), duration });
} }
}; };
/** Serialize parameter to JSON. */
function serializeParameter(parameter: unknown): JsonValue {
if (Array.isArray(parameter)) {
return parameter.map(serializeParameter);
}
if (
typeof parameter === 'string' || typeof parameter === 'number' || typeof parameter === 'boolean' ||
parameter === null
) {
return parameter;
}
try {
return JSON.stringify(parameter);
} catch {
return String(parameter);
}
}