feat: add more api logs (#1870)

Adds more detailed API logging using Pino
This commit is contained in:
David Nguyen
2025-06-30 19:46:32 +10:00
committed by GitHub
parent 0cc729e9bd
commit 7487399123
74 changed files with 1395 additions and 544 deletions

View File

@ -1,10 +1,13 @@
import type { Team, User } from '@prisma/client';
import type { TsRestRequest } from '@ts-rest/serverless';
import type { Logger } from 'pino';
import { AppError, AppErrorCode } from '@documenso/lib/errors/app-error';
import { getApiTokenByToken } from '@documenso/lib/server-only/public-api/get-api-token-by-token';
import type { BaseApiLog, RootApiLog } from '@documenso/lib/types/api-logs';
import type { ApiRequestMetadata } from '@documenso/lib/universal/extract-request-metadata';
import { extractRequestMetadata } from '@documenso/lib/universal/extract-request-metadata';
import { nanoid } from '@documenso/lib/universal/id';
import { logger } from '@documenso/lib/utils/logger';
type B = {
@ -28,10 +31,24 @@ export const authenticatedMiddleware = <
args: T & { req: TsRestRequest },
user: Pick<User, 'id' | 'email' | 'name' | 'disabled'>,
team: Team,
options: { metadata: ApiRequestMetadata },
options: { metadata: ApiRequestMetadata; logger: Logger },
) => Promise<R>,
) => {
return async (args: T, { request }: B) => {
const requestMetadata = extractRequestMetadata(request);
const apiLogger = logger.child({
ipAddress: requestMetadata.ipAddress,
userAgent: requestMetadata.userAgent,
requestId: nanoid(),
} satisfies RootApiLog);
const infoToLog: BaseApiLog = {
auth: 'api',
source: 'apiV1',
path: request.url,
};
try {
const { authorization } = args.headers;
@ -52,8 +69,14 @@ export const authenticatedMiddleware = <
});
}
apiLogger.info({
...infoToLog,
userId: apiToken.user.id,
apiTokenId: apiToken.id,
} satisfies BaseApiLog);
const metadata: ApiRequestMetadata = {
requestMetadata: extractRequestMetadata(request),
requestMetadata,
source: 'apiV1',
auth: 'api',
auditUser: {
@ -63,17 +86,6 @@ export const authenticatedMiddleware = <
},
};
// Todo: Get from Hono context instead.
logger.info({
ipAddress: metadata.requestMetadata.ipAddress,
userAgent: metadata.requestMetadata.userAgent,
auth: 'api',
source: 'apiV1',
path: request.url,
userId: apiToken.user.id,
apiTokenId: apiToken.id,
});
return await handler(
{
...args,
@ -81,10 +93,12 @@ export const authenticatedMiddleware = <
},
apiToken.user,
apiToken.team,
{ metadata },
{ metadata, logger: apiLogger },
);
} catch (err) {
console.log({ err: err });
console.log({ err });
apiLogger.info(infoToLog);
let message = 'Unauthorized';