From 8c06b671c182562ee860696e62a7b8d6e7f65037 Mon Sep 17 00:00:00 2001 From: abcxff <79597906+abcxff@users.noreply.github.com> Date: Tue, 31 Mar 2026 17:14:56 -0400 Subject: [PATCH] feat(rivetkit): gcp log level format for rivet compute --- .../rivetkit/src/common/gcp-log-helper.ts | 35 +++++++++++++++++++ .../packages/rivetkit/src/common/log.ts | 21 ++++++++++- .../packages/rivetkit/src/utils/env-vars.ts | 4 +++ 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 rivetkit-typescript/packages/rivetkit/src/common/gcp-log-helper.ts diff --git a/rivetkit-typescript/packages/rivetkit/src/common/gcp-log-helper.ts b/rivetkit-typescript/packages/rivetkit/src/common/gcp-log-helper.ts new file mode 100644 index 0000000000..7b467d35cc --- /dev/null +++ b/rivetkit-typescript/packages/rivetkit/src/common/gcp-log-helper.ts @@ -0,0 +1,35 @@ +import type { LoggerOptions } from "pino"; + +// Lightweight version of @google-cloud/pino-logging-gcp-config. +// This only maps pino levels to GCP severity for compute environments. + +const PINO_TO_GCP_SEVERITY: Record = { + trace: "DEBUG", + debug: "DEBUG", + info: "INFO", + warn: "WARNING", + error: "ERROR", + fatal: "CRITICAL", +}; + +export function pinoLevelToGcpSeverity( + pinoSeverityLabel: string, + pinoSeverityLevel: number, +): Record { + const severity = + PINO_TO_GCP_SEVERITY[pinoSeverityLabel] ?? "INFO"; + return { severity, level: pinoSeverityLevel }; +} + +export function createGcpLoggingPinoConfig( + pinoLoggerOptionsMixin?: LoggerOptions, +): LoggerOptions { + const formattersMixin = pinoLoggerOptionsMixin?.formatters; + return { + ...pinoLoggerOptionsMixin, + formatters: { + ...formattersMixin, + level: pinoLevelToGcpSeverity, + }, + }; +} diff --git a/rivetkit-typescript/packages/rivetkit/src/common/log.ts b/rivetkit-typescript/packages/rivetkit/src/common/log.ts index 62dd7003d6..ecefa3772e 100644 --- a/rivetkit-typescript/packages/rivetkit/src/common/log.ts +++ b/rivetkit-typescript/packages/rivetkit/src/common/log.ts @@ -5,13 +5,19 @@ import { stdTimeFunctions, } from "pino"; import { z } from "zod/v4"; -import { getLogLevel, getLogTarget, getLogTimestamp } from "@/utils/env-vars"; +import { + getLogLevel, + getLogTarget, + getLogTimestamp, + getRivetComputeEnabled, +} from "@/utils/env-vars"; import { castToLogValue, formatTimestamp, LOGGER_CONFIG, stringify, } from "./logfmt"; +import { createGcpLoggingPinoConfig } from "./gcp-log-helper"; export type { Logger } from "pino"; @@ -116,6 +122,19 @@ export function configureDefaultLogger(logLevel?: LogLevel) { configuredLogLevel = logLevel; } + if (getRivetComputeEnabled() && typeof window === "undefined") { + baseLogger = pino( + createGcpLoggingPinoConfig({ + level: getPinoLevel(logLevel), + messageKey: "msg", + base: {}, + timestamp: getLogTimestamp() ? stdTimeFunctions.epochTime : false, + }), + ); + loggerCache.clear(); + return; + } + baseLogger = pino({ level: getPinoLevel(logLevel), messageKey: "msg", diff --git a/rivetkit-typescript/packages/rivetkit/src/utils/env-vars.ts b/rivetkit-typescript/packages/rivetkit/src/utils/env-vars.ts index 5e0cf1f3ad..5f1067702d 100644 --- a/rivetkit-typescript/packages/rivetkit/src/utils/env-vars.ts +++ b/rivetkit-typescript/packages/rivetkit/src/utils/env-vars.ts @@ -45,6 +45,10 @@ export const getRivetkitInspectorDisable = (): boolean => export const getRivetkitStoragePath = (): string | undefined => getEnvUniversal("RIVETKIT_STORAGE_PATH"); +// Internal compute marker for backend logging. Intentionally undocumented for now. +export const getRivetComputeEnabled = (): boolean => + getEnvUniversal("_RIVET_COMPUTE_ENABLED") === "1"; + // Logging configuration // DEPRECATED: LOG_LEVEL will be removed in a future version export const getLogLevel = (): string | undefined =>