Skip to content

Commit

Permalink
perf: Record log entries after sending responses
Browse files Browse the repository at this point in the history
Right now, recording log entries happens while the request is being processed, and generally the response is blocked on completing the recording. This is not ideal, and Next.js v15.1's new `after()` function allows us to postpone recording the log entry until after the response has been sent. This should reduce TTFB (& subsequent metrics) with 5-10ms for each request that involves recording a log entry.
  • Loading branch information
beverloo committed Feb 23, 2025
1 parent 08e6999 commit 49d32cf
Show file tree
Hide file tree
Showing 72 changed files with 367 additions and 296 deletions.
4 changes: 2 additions & 2 deletions app/admin/events/[event]/hotels/HotelConfiguration.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { AvailabilityToggle } from '@app/admin/components/AvailabilityToggle';
import { AvailabilityWindow } from '@app/admin/components/AvailabilityWindow';
import { FormGridSection } from '@app/admin/components/FormGridSection';
import { HotelConfigurationTable } from './HotelConfigurationTable';
import { Log, kLogSeverity, kLogType } from '@lib/Log';
import { RecordLog, kLogSeverity, kLogType } from '@lib/Log';
import { SectionIntroduction } from '@app/admin/components/SectionIntroduction';
import { executeServerAction } from '@lib/serverAction';
import { getEventNameForId } from '@lib/EventLoader';
Expand Down Expand Up @@ -54,7 +54,7 @@ async function updateHotelConfiguration(eventId: number, formData: unknown) {
.where(tEvents.eventId.equals(eventId))
.executeUpdate();

await Log({
RecordLog({
type: kLogType.AdminEventPublishInfo,
severity: kLogSeverity.Warning,
sourceUser: props.user,
Expand Down
4 changes: 2 additions & 2 deletions app/admin/events/[event]/refunds/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import type { NextPageParams } from '@lib/NextRouterParams';
import { AvailabilityToggle } from '@app/admin/components/AvailabilityToggle';
import { AvailabilityWindow } from '@app/admin/components/AvailabilityWindow';
import { FormGridSection } from '@app/admin/components/FormGridSection';
import { Log, kLogSeverity, kLogType } from '@lib/Log';
import { RecordLog, kLogSeverity, kLogType } from '@lib/Log';
import { RefundsHeader } from './RefundsHeader';
import { RefundsTable } from './RefundsTable';
import { SectionIntroduction } from '@app/admin/components/SectionIntroduction';
Expand Down Expand Up @@ -58,7 +58,7 @@ async function updateRefundConfiguration(eventId: number, formData: unknown) {
.where(tEvents.eventId.equals(eventId))
.executeUpdate();

await Log({
RecordLog({
type: kLogType.AdminEventPublishInfo,
severity: kLogSeverity.Warning,
sourceUser: props.user,
Expand Down
4 changes: 2 additions & 2 deletions app/admin/events/[event]/settings/EventSettings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import Grid from '@mui/material/Grid2';
import { type EventAvailabilityStatus, kEventAvailabilityStatus } from '@lib/database/Types';
import { EventSettingsForm } from './EventSettingsForm';
import { FormGridSection } from '@app/admin/components/FormGridSection';
import { Log, kLogSeverity, kLogType } from '@lib/Log';
import { RecordLog, kLogSeverity, kLogType } from '@lib/Log';
import { executeServerAction } from '@lib/serverAction';
import db, { tEvents } from '@lib/database';

Expand Down Expand Up @@ -140,7 +140,7 @@ async function updateEventSettings(eventId: number, formData: unknown) {
.where(tEvents.eventId.equals(eventId))
.executeUpdate();

await Log({
RecordLog({
type: kLogType.AdminUpdateEvent,
severity: kLogSeverity.Warning,
sourceUser: props.user,
Expand Down
4 changes: 2 additions & 2 deletions app/admin/events/[event]/training/TrainingConfiguration.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import Grid from '@mui/material/Grid2';
import { AvailabilityToggle } from '@app/admin/components/AvailabilityToggle';
import { AvailabilityWindow } from '@app/admin/components/AvailabilityWindow';
import { FormGridSection } from '@app/admin/components/FormGridSection';
import { Log, kLogSeverity, kLogType } from '@lib/Log';
import { RecordLog, kLogSeverity, kLogType } from '@lib/Log';
import { TrainingConfigurationTable } from './TrainingConfigurationTable';
import { executeServerAction } from '@lib/serverAction';
import { getEventNameForId } from '@lib/EventLoader';
Expand Down Expand Up @@ -54,7 +54,7 @@ async function updateTrainingConfiguration(eventId: number, formData: unknown) {
.where(tEvents.eventId.equals(eventId))
.executeUpdate();

await Log({
RecordLog({
type: kLogType.AdminEventPublishInfo,
severity: kLogSeverity.Warning,
sourceUser: props.user,
Expand Down
4 changes: 2 additions & 2 deletions app/admin/system/environments/EnvironmentSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import Typography from '@mui/material/Typography';

import { ColorFieldElement } from '@app/admin/volunteers/teams/Team';
import { FormGridSection } from '@app/admin/components/FormGridSection';
import { Log, kLogSeverity, kLogType } from '@lib/Log';
import { RecordLog, kLogSeverity, kLogType } from '@lib/Log';
import { executeServerAction } from '@lib/serverAction';
import db, { tEnvironments } from '@lib/database';

Expand Down Expand Up @@ -69,7 +69,7 @@ async function updateEnvironmentSettings(id: number, formData: unknown) {
.executeUpdate();

if (!!affectedRows) {
await Log({
RecordLog({
type: kLogType.AdminUpdateEnvironment,
severity: kLogSeverity.Warning,
sourceUser: props.user,
Expand Down
4 changes: 2 additions & 2 deletions app/admin/volunteers/[id]/VolunteerPermissions.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import Typography from '@mui/material/Typography';
import type { AccessDescriptor, AccessOperation } from '@lib/auth/AccessDescriptor';
import { AccessControl, kAnyEvent, kAnyTeam, type AccessControlParams, type AccessResult } from '@lib/auth/AccessControl';
import { FormGridSection } from '@app/admin/components/FormGridSection';
import { Log, kLogSeverity, kLogType } from '@lib/Log';
import { RecordLog, kLogSeverity, kLogType } from '@lib/Log';
import { SectionIntroduction } from '@app/admin/components/SectionIntroduction';
import { VolunteerPermissionsTable, type VolunteerPermissionStatus } from './VolunteerPermissionsTable';
import { executeServerAction } from '@lib/serverAction';
Expand Down Expand Up @@ -153,7 +153,7 @@ async function updateVolunteerPermissions(userId: number, formData: unknown) {
.executeUpdate();

if (!!affectedRows) {
await Log({
RecordLog({
type: kLogType.AdminUpdatePermission,
severity: kLogSeverity.Warning,
sourceUser: props.user,
Expand Down
6 changes: 3 additions & 3 deletions app/api/admin/content/[[...id]]/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

import { z } from 'zod';

import { Log, kLogSeverity, kLogType } from '@lib/Log';
import { RecordLog, kLogSeverity, kLogType } from '@lib/Log';
import { Temporal } from '@lib/Temporal';
import { createDataTableApi, type DataTableEndpoints } from '../../../createDataTableApi';
import { executeAccessCheck } from '@lib/auth/AuthenticationContext';
Expand Down Expand Up @@ -352,7 +352,7 @@ export const { DELETE, POST, PUT, GET } = createDataTableApi(kContentRowModel, k
.executeSelectNoneOrOne();

if (contentContext?.contentType === kContentType.FAQ) {
await Log({
RecordLog({
type: kLogType.AdminKnowledgeBaseMutation,
severity: kLogSeverity.Warning,
sourceUser: props.user,
Expand All @@ -377,7 +377,7 @@ export const { DELETE, POST, PUT, GET } = createDataTableApi(kContentRowModel, k
}
}

await Log({
RecordLog({
type: kLogType.AdminContentMutation,
severity: kLogSeverity.Warning,
sourceUser: props.user,
Expand Down
4 changes: 2 additions & 2 deletions app/api/admin/content/categories/[[...id]]/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { notFound } from 'next/navigation';
import { z } from 'zod';

import { type DataTableEndpoints, createDataTableApi } from '../../../../createDataTableApi';
import { Log, kLogSeverity, kLogType } from '@lib/Log';
import { RecordLog, kLogSeverity, kLogType } from '@lib/Log';
import { executeAccessCheck } from '@lib/auth/AuthenticationContext';
import { getEventBySlug } from '@lib/EventLoader';
import db, { tContentCategories, tContent } from '@lib/database';
Expand Down Expand Up @@ -228,7 +228,7 @@ createDataTableApi(kContentCategoryRowModel, kContentCategoryContext, {
.selectOneColumn(tContentCategories.categoryTitle)
.executeSelectNoneOrOne();

await Log({
RecordLog({
type: kLogType.AdminKnowledgeBaseCategoryMutation,
severity: kLogSeverity.Warning,
sourceUser: props.user,
Expand Down
4 changes: 2 additions & 2 deletions app/api/admin/createEvent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { z } from 'zod';

import type { ActionProps } from '../Action';
import { kTemporalZonedDateTime, type ApiDefinition, type ApiRequest, type ApiResponse } from '../Types';
import { Log, kLogSeverity, kLogType } from '@lib/Log';
import { RecordLog, kLogSeverity, kLogType } from '@lib/Log';
import { executeAccessCheck } from '@lib/auth/AuthenticationContext';
import { getEventBySlug } from '@lib/EventLoader';
import db, { tEvents } from '@lib/database';
Expand Down Expand Up @@ -95,7 +95,7 @@ export async function createEvent(request: Request, props: ActionProps): Promise
.executeInsert();

if (!!insertId) {
Log({
RecordLog({
type: kLogType.AdminEventCreate,
severity: kLogSeverity.Warning,
sourceUser: props.user,
Expand Down
4 changes: 2 additions & 2 deletions app/api/admin/displays/[[...id]]/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { z } from 'zod';

import { type DataTableEndpoints, createDataTableApi } from '../../../createDataTableApi';
import { type DisplayHelpRequestStatus, kDisplayHelpRequestStatus } from '@lib/database/Types';
import { Log, kLogSeverity, kLogType } from '@lib/Log';
import { RecordLog, kLogSeverity, kLogType } from '@lib/Log';
import { Temporal } from '@lib/Temporal';
import { executeAccessCheck } from '@lib/auth/AuthenticationContext';
import { readSetting } from '@lib/Settings';
Expand Down Expand Up @@ -177,7 +177,7 @@ export const { GET, DELETE, PUT } = createDataTableApi(kDisplaysRowModel, kDispl
})
.executeSelectNoneOrOne();

await Log({
RecordLog({
type: kLogType.AdminDisplayMutation,
severity: kLogSeverity.Info,
sourceUser: props.user,
Expand Down
4 changes: 2 additions & 2 deletions app/api/admin/event/deadlines/[[...id]]/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { notFound } from 'next/navigation';
import { z } from 'zod';

import { type DataTableEndpoints, createDataTableApi } from '../../../../createDataTableApi';
import { Log, kLogSeverity, kLogType } from '@lib/Log';
import { RecordLog, kLogSeverity, kLogType } from '@lib/Log';
import { Temporal } from '@lib/Temporal';
import { executeAccessCheck } from '@lib/auth/AuthenticationContext';
import { getEventBySlug } from '@lib/EventLoader';
Expand Down Expand Up @@ -202,7 +202,7 @@ createDataTableApi(kEventDeadlineRowModel, kEventDeadlineContext, {

async writeLog({ context }, mutation, props) {
const event = await getEventBySlug(context.event);
await Log({
RecordLog({
type: kLogType.AdminEventDeadlineMutation,
severity: kLogSeverity.Warning,
sourceUser: props.user,
Expand Down
4 changes: 2 additions & 2 deletions app/api/admin/event/shifts/[[...id]]/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { notFound } from 'next/navigation';
import { z } from 'zod';

import { type DataTableEndpoints, createDataTableApi } from '../../../../createDataTableApi';
import { Log, kLogSeverity, kLogType } from '@lib/Log';
import { RecordLog, kLogSeverity, kLogType } from '@lib/Log';
import { executeAccessCheck, type PermissionAccessCheck } from '@lib/auth/AuthenticationContext';
import { getShiftsForEvent } from '@app/admin/lib/getShiftsForEvent';
import { validateContext } from '../../validateContext';
Expand Down Expand Up @@ -398,7 +398,7 @@ createDataTableApi(kEventShiftRowModel, kEventShiftContext, {
.selectOneColumn(tShifts.shiftName)
.executeSelectNoneOrOne();

await Log({
RecordLog({
type: kLogType.AdminEventShiftMutation,
severity: kLogSeverity.Warning,
sourceUser: props.user,
Expand Down
4 changes: 2 additions & 2 deletions app/api/admin/event/shifts/categories/[[...id]]/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import { z } from 'zod';

import { type DataTableEndpoints, createDataTableApi } from '../../../../../createDataTableApi';
import { Log, kLogSeverity, kLogType } from '@lib/Log';
import { RecordLog, kLogSeverity, kLogType } from '@lib/Log';
import { executeAccessCheck } from '@lib/auth/AuthenticationContext';
import db, { tShiftsCategories } from '@lib/database';

Expand Down Expand Up @@ -179,7 +179,7 @@ createDataTableApi(kEventShiftCategoryRowModel, kEventShiftCategoryContext, {
.selectOneColumn(tShiftsCategories.shiftCategoryName)
.executeSelectNoneOrOne();

await Log({
RecordLog({
type: kLogType.AdminEventShiftCategoryMutation,
severity: kLogSeverity.Warning,
sourceUser: props.user,
Expand Down
4 changes: 2 additions & 2 deletions app/api/admin/event/teams/[[...id]]/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { notFound } from 'next/navigation';
import { z } from 'zod';

import { type DataTableEndpoints, createDataTableApi } from '../../../../createDataTableApi';
import { Log, kLogSeverity, kLogType } from '@lib/Log';
import { RecordLog, kLogSeverity, kLogType } from '@lib/Log';
import { executeAccessCheck } from '@lib/auth/AuthenticationContext';
import { getEventBySlug } from '@lib/EventLoader';
import db, { tContent, tEventsTeams, tTeams } from '@lib/database';
Expand Down Expand Up @@ -190,7 +190,7 @@ export const { GET, PUT } = createDataTableApi(kEventTeamRowModel, kEventTeamCon
.selectOneColumn(tTeams.teamName)
.executeSelectNoneOrOne();

await Log({
RecordLog({
type: kLogType.AdminUpdateEvent,
severity: kLogSeverity.Warning,
sourceUser: props.user,
Expand Down
4 changes: 2 additions & 2 deletions app/api/admin/exports/[[...id]]/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { z } from 'zod';
import type { Event } from '@lib/Event';
import { type DataTableEndpoints, createDataTableApi } from '../../../createDataTableApi';
import { type ExportType, kExportType } from '@lib/database/Types';
import { Log, kLogSeverity, kLogType } from '@lib/Log';
import { RecordLog, kLogSeverity, kLogType } from '@lib/Log';
import { Temporal } from '@lib/Temporal';
import { executeAccessCheck, type AuthenticationContext } from '@lib/auth/AuthenticationContext';
import { getEventBySlug } from '@lib/EventLoader';
Expand Down Expand Up @@ -250,7 +250,7 @@ export const { DELETE, GET, POST } = createDataTableApi(kExportRowModel, kExport
})
.executeSelectOne();

await Log({
RecordLog({
type: kLogType.AdminExportMutation,
severity: kLogSeverity.Warning,
sourceUser: props.user,
Expand Down
4 changes: 2 additions & 2 deletions app/api/admin/hotels/[[...id]]/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { notFound } from 'next/navigation';
import { z } from 'zod';

import { type DataTableEndpoints, createDataTableApi } from '@app/api/createDataTableApi';
import { Log, kLogSeverity, kLogType } from '@lib/Log';
import { RecordLog, kLogSeverity, kLogType } from '@lib/Log';
import { executeAccessCheck } from '@lib/auth/AuthenticationContext';
import { getEventBySlug } from '@lib/EventLoader';
import db, { tHotels } from '@lib/database';
Expand Down Expand Up @@ -185,7 +185,7 @@ createDataTableApi(kHotelRowModel, kHotelContext, {

async writeLog({ context }, mutation, props) {
const event = await getEventBySlug(context.event);
await Log({
RecordLog({
type: kLogType.AdminEventHotelMutation,
severity: kLogSeverity.Info,
sourceUser: props.user,
Expand Down
10 changes: 5 additions & 5 deletions app/api/admin/hotels/assignments/[[...id]]/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { notFound } from 'next/navigation';
import { z } from 'zod';

import { type DataTableEndpoints, createDataTableApi } from '@app/api/createDataTableApi';
import { Log, kLogSeverity, kLogType } from '@lib/Log';
import { RecordLog, kLogSeverity, kLogType } from '@lib/Log';
import { Temporal } from '@lib/Temporal';
import { executeAccessCheck } from '@lib/auth/AuthenticationContext';
import { getEventBySlug } from '@lib/EventLoader';
Expand Down Expand Up @@ -223,7 +223,7 @@ createDataTableApi(kHotelAssignmentRowModel, kHotelAssignmentContext, {
if (!!affectedRows) {
for (const uid of [ booking.firstUserId, booking.secondUserId, booking.thirdUserId ]) {
if (!!uid) {
await Log({
RecordLog({
type: kLogType.AdminHotelAssignVolunteerDelete,
severity: kLogSeverity.Warning,
sourceUser: props.user,
Expand Down Expand Up @@ -318,7 +318,7 @@ createDataTableApi(kHotelAssignmentRowModel, kHotelAssignmentContext, {
if (updatedAssignmentSet.has(assignment))
continue; // the volunteer still has an assignment

await Log({
RecordLog({
type: kLogType.AdminHotelAssignVolunteerDelete,
severity: kLogSeverity.Warning,
sourceUser: props.user,
Expand All @@ -335,7 +335,7 @@ createDataTableApi(kHotelAssignmentRowModel, kHotelAssignmentContext, {
if (existingAssignmentSet.has(assignment))
continue; // the volunteer already had an assignment

await Log({
RecordLog({
type: kLogType.AdminHotelAssignVolunteer,
severity: kLogSeverity.Warning,
sourceUser: props.user,
Expand All @@ -352,7 +352,7 @@ createDataTableApi(kHotelAssignmentRowModel, kHotelAssignmentContext, {

async writeLog({ context }, mutation, props) {
const event = await getEventBySlug(context.event);
await Log({
RecordLog({
type: kLogType.AdminHotelBookingMutation,
severity: kLogSeverity.Info,
sourceUser: props.user,
Expand Down
4 changes: 2 additions & 2 deletions app/api/admin/program/activities/[[...id]]/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { notFound } from 'next/navigation';
import { z } from 'zod';

import { type DataTableEndpoints, createDataTableApi } from '../../../../createDataTableApi';
import { Log, kLogSeverity, kLogType } from '@lib/Log';
import { RecordLog, kLogSeverity, kLogType } from '@lib/Log';
import { executeAccessCheck } from '@lib/auth/AuthenticationContext';
import { getAnPlanActivityUrl } from '@lib/AnPlan';
import { getEventBySlug } from '@lib/EventLoader';
Expand Down Expand Up @@ -360,7 +360,7 @@ createDataTableApi(kProgramActivityRowModel, kProgramActivityContext, {
.selectOneColumn(tActivities.activityTitle)
.executeSelectNoneOrOne();

await Log({
RecordLog({
type: kLogType.AdminProgramMutation,
severity: kLogSeverity.Warning,
sourceUser: props.user,
Expand Down
4 changes: 2 additions & 2 deletions app/api/admin/program/areas/[[...id]]/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { notFound } from 'next/navigation';
import { z } from 'zod';

import { type DataTableEndpoints, createDataTableApi } from '../../../../createDataTableApi';
import { Log, kLogSeverity, kLogType } from '@lib/Log';
import { RecordLog, kLogSeverity, kLogType } from '@lib/Log';
import { executeAccessCheck } from '@lib/auth/AuthenticationContext';
import { getAnPlanAreaUrl } from '@lib/AnPlan';
import { getEventBySlug } from '@lib/EventLoader';
Expand Down Expand Up @@ -250,7 +250,7 @@ createDataTableApi(kProgramAreaRowModel, kProgramAreaContext, {
tActivitiesAreas.areaName))
.executeSelectNoneOrOne();

await Log({
RecordLog({
type: kLogType.AdminProgramMutation,
severity: kLogSeverity.Warning,
sourceUser: props.user,
Expand Down
4 changes: 2 additions & 2 deletions app/api/admin/program/locations/[[...id]]/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { notFound } from 'next/navigation';
import { z } from 'zod';

import { type DataTableEndpoints, createDataTableApi } from '../../../../createDataTableApi';
import { Log, kLogSeverity, kLogType } from '@lib/Log';
import { RecordLog, kLogSeverity, kLogType } from '@lib/Log';
import { executeAccessCheck } from '@lib/auth/AuthenticationContext';
import { getAnPlanLocationUrl } from '@lib/AnPlan';
import { getEventBySlug } from '@lib/EventLoader';
Expand Down Expand Up @@ -269,7 +269,7 @@ createDataTableApi(kProgramLocationRowModel, kProgramLocationContext, {
tActivitiesLocations.locationName))
.executeSelectNoneOrOne();

await Log({
RecordLog({
type: kLogType.AdminProgramMutation,
severity: kLogSeverity.Warning,
sourceUser: props.user,
Expand Down
Loading

0 comments on commit 49d32cf

Please sign in to comment.