Skip to content

Commit 1b47269

Browse files
committed
fix(logger): let the request context own requestId and keep absent fields from erasing it
An explicit requestId on a line, or one bound with withMetadata, replaced the request context's id in the JSON line, and an undefined one deleted it, so a line could stop correlating with its request. Inside a request context the context's id is now authoritative, matching the OpenTelemetry export; a requestId passed with a line names the request only outside one. Undefined fields no longer erase fields the line already carries. v2 chat logs its mothership request id as simRequestId. Request ids that defaulted to 'unknown' default to generateRequestId(). log-message-tag now sees optional calls, computed levels, withMetadata-derived loggers and log-named receivers, follows let prefixes, resolves names per function, and only treats an interpolated requestId or reqId, and log* helpers or .call(logger), as message sources.
1 parent 40aa955 commit 1b47269

16 files changed

Lines changed: 298 additions & 125 deletions

File tree

‎apps/sim/app/api/v2/chat/route.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ export const POST = withRouteHandler(
200200

201201
const messageId = generateId()
202202
const requestId = generateId()
203-
let reqLogger = logger.withMetadata({ messageId, requestId })
203+
let reqLogger = logger.withMetadata({ messageId, simRequestId: requestId })
204204

205205
try {
206206
const workspaceAccess = await assertActiveWorkspaceAccess(workspaceId, userId)
@@ -284,7 +284,7 @@ export const POST = withRouteHandler(
284284
return v2Error('INTERNAL_ERROR', 'Internal server error')
285285
}
286286
const chatId = resolvedChat.chatId
287-
reqLogger = logger.withMetadata({ chatId, messageId, requestId })
287+
reqLogger = logger.withMetadata({ chatId, messageId, simRequestId: requestId })
288288

289289
/**
290290
* Write this turn's display copy to the conversation the route just

‎apps/sim/ee/workspace-forking/lib/copy/cleanup-failed.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { createLogger } from '@sim/logger'
1111
import { getErrorMessage } from '@sim/utils/errors'
1212
import { isRecordLike } from '@sim/utils/object'
1313
import { and, asc, eq, exists, gt, inArray, isNull, notExists, sql } from 'drizzle-orm'
14+
import { generateRequestId } from '@/lib/core/utils/request'
1415
import type { SubBlockRecord } from '@/lib/workflows/persistence/remap-internal-ids'
1516
import { invalidateDeployedStateCache } from '@/lib/workflows/persistence/utils'
1617
import {
@@ -116,7 +117,7 @@ export async function clearFailedForkResourceReferences(params: {
116117
deployedTargetWorkflowIds?: string[]
117118
requestId?: string
118119
}): Promise<{ cleared: number; clearingFailed: boolean }> {
119-
const { childWorkspaceId, failures, requestId = 'unknown' } = params
120+
const { childWorkspaceId, failures, requestId = generateRequestId() } = params
120121
if (failures.length === 0) return { cleared: 0, clearingFailed: false }
121122

122123
const failedKnowledgeBaseIds = failures.flatMap((failure) =>

‎apps/sim/ee/workspace-forking/lib/copy/content-copy-runner.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { createLogger } from '@sim/logger'
33
import { getErrorMessage } from '@sim/utils/errors'
44
import { isTriggerDevEnabled } from '@/lib/core/config/env-flags'
55
import { runDetached } from '@/lib/core/utils/background'
6+
import { generateRequestId } from '@/lib/core/utils/request'
67
import { finishBackgroundWork } from '@/ee/workspace-forking/lib/background-work/store'
78
import { clearFailedForkResourceReferences } from '@/ee/workspace-forking/lib/copy/cleanup-failed'
89
import type { BlobCopyTask } from '@/ee/workspace-forking/lib/copy/copy-files'
@@ -219,7 +220,7 @@ export async function scheduleForkContentCopy(
219220
payload: ForkContentCopyPayload,
220221
options: { detachedLabel: string; requestId?: string }
221222
): Promise<void> {
222-
const { detachedLabel, requestId = 'unknown' } = options
223+
const { detachedLabel, requestId = generateRequestId() } = options
223224
try {
224225
if (isTriggerDevEnabled) {
225226
const [{ forkContentCopyTask }, { tasks }, { resolveTriggerRegion }] = await Promise.all([

‎apps/sim/ee/workspace-forking/lib/copy/copy-files.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
lockWorkspaceStorageForMutationInTx,
1010
resolveStorageBillingContext,
1111
} from '@/lib/billing/storage'
12+
import { generateRequestId } from '@/lib/core/utils/request'
1213
import type { DbOrTx } from '@/lib/db/types'
1314
import {
1415
allocateUniqueWorkspaceFileName,
@@ -270,7 +271,7 @@ export async function planForkFileCopies(params: {
270271
*/
271272
export async function executeForkFileBlobCopies(
272273
blobTasks: BlobCopyTask[],
273-
requestId = 'unknown',
274+
requestId = generateRequestId(),
274275
contentRefMaps?: ForkContentRefMaps,
275276
control?: ForkCopyControl
276277
): Promise<{ copied: number; failed: number; failedTargetKeys: string[] }> {

‎apps/sim/ee/workspace-forking/lib/copy/copy-resources.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import {
4242
type StorageBillingContext,
4343
} from '@/lib/billing/storage'
4444
import { mapWithConcurrency } from '@/lib/core/utils/concurrency'
45+
import { generateRequestId } from '@/lib/core/utils/request'
4546
import type { DbOrTx } from '@/lib/db/types'
4647
import {
4748
type DurableSecretProvenance,
@@ -1113,7 +1114,7 @@ export async function copyForkResourceContent(params: {
11131114
requestId?: string
11141115
control?: ForkCopyControl
11151116
}): Promise<{ copied: number; failed: number; failures: ForkFailedResource[] }> {
1116-
const { contentPlan, contentRefMaps, control, requestId = 'unknown' } = params
1117+
const { contentPlan, contentRefMaps, control, requestId = generateRequestId() } = params
11171118
const { childWorkspaceId, userId } = contentPlan
11181119

11191120
let copiedResources = 0

‎apps/sim/ee/workspace-forking/lib/copy/copy-workflows.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { generateId } from '@sim/utils/id'
44
import { isRecordLike } from '@sim/utils/object'
55
import { and, eq, inArray, isNull } from 'drizzle-orm'
66
import type { FolderResourceType } from '@/lib/api/contracts/folders'
7+
import { generateRequestId } from '@/lib/core/utils/request'
78
import type { DbOrTx } from '@/lib/db/types'
89
import { buildFolderPathIndex, ROOT_FOLDER_PATH } from '@/lib/folders/paths'
910
import { assertFolderCollectionHasRoom } from '@/lib/folders/queries'
@@ -499,7 +500,7 @@ export async function copyWorkflowStateIntoTarget(
499500
nameRegistry,
500501
resolveBlockId,
501502
triggerPathByBlockId,
502-
requestId = 'unknown',
503+
requestId = generateRequestId(),
503504
} = params
504505

505506
const targetFolderId = sourceMeta.folderId ? (folderIdMap.get(sourceMeta.folderId) ?? null) : null

‎apps/sim/ee/workspace-forking/lib/create-fork.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { generateId } from '@sim/utils/id'
77
import { and, eq } from 'drizzle-orm'
88
import type { Workspace } from '@/lib/api/contracts/workspaces'
99
import { enqueueOutboxEvent } from '@/lib/core/outbox/service'
10+
import { generateRequestId } from '@/lib/core/utils/request'
1011
import { requireForkProject } from '@/lib/projects/membership'
1112
import { buildDefaultWorkflowArtifacts } from '@/lib/workflows/defaults'
1213
import { insertNewWorkflowRow } from '@/lib/workflows/persistence/new-workflow-row'
@@ -146,7 +147,7 @@ const FORK_KIND_TO_RESOURCE_TYPE: Partial<Record<ForkRemapKind, ForkResourceType
146147
* all credential references) are cleared; env-var references are preserved.
147148
*/
148149
export async function createFork(params: CreateForkParams): Promise<CreateForkResult> {
149-
const { source, policy, userId, requestId = 'unknown' } = params
150+
const { source, policy, userId, requestId = generateRequestId() } = params
150151
const admission = params.admission
151152
if (admission) {
152153
const receipt = await findWorkspaceOperationReceipt(

‎apps/sim/ee/workspace-forking/lib/promote/promote.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import type {
99
ForkSyncBlocker,
1010
PromoteCopyResources,
1111
} from '@/lib/api/contracts/workspace-fork'
12+
import { generateRequestId } from '@/lib/core/utils/request'
1213
import type { DbOrTx } from '@/lib/db/types'
1314
import { MAX_FOLDERS_PER_WORKSPACE } from '@/lib/folders/constants'
1415
import { isFolderPathEffectivelyLocked } from '@/lib/folders/paths'
@@ -510,7 +511,7 @@ function groupDependentOverrides(
510511
*/
511512
export async function promoteFork(params: PromoteForkParams): Promise<PromoteForkResult> {
512513
const { edge, sourceWorkspaceId, targetWorkspaceId, direction, userId } = params
513-
const requestId = params.requestId ?? 'unknown'
514+
const requestId = params.requestId ?? generateRequestId()
514515
const admission = params.admission
515516
const revisionScope = { sourceWorkspaceId, targetWorkspaceId, edge }
516517
if (admission) {

‎apps/sim/lib/execution/payloads/materialization.server.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type { Principal } from '@sim/auth/principal'
22
import { createLogger, type Logger } from '@sim/logger'
33
import { toError } from '@sim/utils/errors'
44
import { OrchestrationError } from '@/lib/core/orchestration/types'
5+
import { generateRequestId } from '@/lib/core/utils/request'
56
import { isPayloadSizeLimitError } from '@/lib/core/utils/stream-limits'
67
import { isUserFileWithMetadata } from '@/lib/core/utils/user-file'
78
import { getExecutionKeyParts } from '@/lib/execution/payloads/access-keys'
@@ -398,7 +399,7 @@ export async function readUserFileContentWithContributors(
398399
let contributingFiles: readonly WorkspaceFileSecretProvenanceIdentity[] | undefined
399400
let renderedContributingFiles: readonly WorkspaceFileSecretProvenanceIdentity[] | undefined
400401
const log = getLogger(options)
401-
const requestId = options.requestId ?? 'unknown'
402+
const requestId = options.requestId ?? generateRequestId()
402403

403404
try {
404405
const servable = await downloadServableFileFromStorage(file, requestId, log, {

‎apps/sim/lib/uploads/utils/user-file-base64.server.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { createLogger } from '@sim/logger'
44
import { isPlainRecord } from '@sim/utils/object'
55
import { getRedisClient } from '@/lib/core/config/redis'
66
import { getRedisBudgetKeys, getRedisBudgetLimits } from '@/lib/core/redis/byte-budget.server'
7+
import { generateRequestId } from '@/lib/core/utils/request'
78
import { isUserFileWithMetadata } from '@/lib/core/utils/user-file'
89
import { recordMaterializedAccessKeys } from '@/lib/execution/payloads/access-keys'
910
import {
@@ -444,7 +445,7 @@ async function resolveBase64(
444445
return { base64: null }
445446
}
446447

447-
const requestId = options.requestId ?? 'unknown'
448+
const requestId = options.requestId ?? generateRequestId()
448449
try {
449450
const result = await readUserFileContentWithContributors(file, {
450451
requestId,

0 commit comments

Comments
 (0)