Skip to content

Improve coordinator logs and extend structured logger #1389

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 12 commits into from
Oct 9, 2024
Merged
5 changes: 5 additions & 0 deletions .changeset/proud-yaks-thank.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@trigger.dev/core": patch
---

Improvements to structured logger and conditional payload logging
6 changes: 3 additions & 3 deletions apps/coordinator/src/checkpointer.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import { ExponentialBackoff } from "@trigger.dev/core/v3/apps";
import { testDockerCheckpoint } from "@trigger.dev/core/v3/apps";
import { SimpleLogger } from "@trigger.dev/core/v3/apps";
import { nanoid } from "nanoid";
import fs from "node:fs/promises";
import { ChaosMonkey } from "./chaosMonkey";
import { Buildah, Crictl, Exec } from "./exec";
import { setTimeout } from "node:timers/promises";
import { TempFileCleaner } from "./cleaner";
import { numFromEnv, boolFromEnv } from "./util";
import { SimpleStructuredLogger } from "@trigger.dev/core/v3/utils/structuredLogger";

type CheckpointerInitializeReturn = {
canCheckpoint: boolean;
Expand Down Expand Up @@ -86,7 +86,7 @@ export class Checkpointer {
#canCheckpoint = false;
#dockerMode: boolean;

#logger = new SimpleLogger("[checkptr]");
#logger = new SimpleStructuredLogger("checkpointer");
#abortControllers = new Map<string, AbortController>();
#failedCheckpoints = new Map<string, unknown>();
#waitingForRetry = new Set<string>();
Expand Down Expand Up @@ -137,7 +137,7 @@ export class Checkpointer {
return this.#getInitReturn(true);
}

this.#logger.error(testCheckpoint.message, testCheckpoint.error ?? "");
this.#logger.error(testCheckpoint.message, { error: testCheckpoint.error });
return this.#getInitReturn(false);
}

Expand Down
20 changes: 12 additions & 8 deletions apps/coordinator/src/cleaner.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { SimpleLogger } from "@trigger.dev/core/v3/apps";
import { SimpleStructuredLogger } from "@trigger.dev/core/v3/utils/structuredLogger";
import { Exec } from "./exec";
import { setTimeout } from "timers/promises";

Expand All @@ -10,14 +10,18 @@ interface TempFileCleanerOptions {
}

export class TempFileCleaner {
private logger = new SimpleLogger("[tmp-cleaner]");
private enabled = false;
private exec = new Exec({ logger: this.logger });

constructor(private opts: TempFileCleanerOptions) {}
private logger: SimpleStructuredLogger;
private exec: Exec;

constructor(private opts: TempFileCleanerOptions) {
this.logger = new SimpleStructuredLogger("tmp-cleaner", undefined, { ...this.opts });
this.exec = new Exec({ logger: this.logger });
}

async start() {
this.logger.log("start", this.opts);
this.logger.log("TempFileCleaner.start");
this.enabled = true;

if (!this.opts.leadingEdge) {
Expand All @@ -28,15 +32,15 @@ export class TempFileCleaner {
try {
await this.clean();
} catch (error) {
this.logger.error("error during tick", error);
this.logger.error("error during tick", { error });
}

await this.wait();
}
}

stop() {
this.logger.log("stop", this.opts);
this.logger.log("TempFileCleaner.stop");
this.enabled = false;
}

Expand Down Expand Up @@ -89,7 +93,7 @@ export class TempFileCleaner {
const rmOutput = await rm;

if (rmOutput.stderr.length > 0) {
this.logger.error("delete unsuccessful", rmOutput);
this.logger.error("delete unsuccessful", { rmOutput });
return;
}

Expand Down
16 changes: 8 additions & 8 deletions apps/coordinator/src/exec.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { SimpleLogger } from "@trigger.dev/core/v3/apps";
import { SimpleStructuredLogger } from "@trigger.dev/core/v3/utils/structuredLogger";
import { randomUUID } from "crypto";
import { homedir } from "os";
import { type Result, x } from "tinyexec";
Expand All @@ -18,23 +18,23 @@ class TinyResult {
}

interface ExecOptions {
logger?: SimpleLogger;
logger?: SimpleStructuredLogger;
abortSignal?: AbortSignal;
logOutput?: boolean;
trimArgs?: boolean;
neverThrow?: boolean;
}

export class Exec {
private logger: SimpleLogger;
private logger: SimpleStructuredLogger;
private abortSignal: AbortSignal | undefined;

private logOutput: boolean;
private trimArgs: boolean;
private neverThrow: boolean;

constructor(opts: ExecOptions) {
this.logger = opts.logger ?? new SimpleLogger();
this.logger = opts.logger ?? new SimpleStructuredLogger("exec");
this.abortSignal = opts.abortSignal;

this.logOutput = opts.logOutput ?? true;
Expand Down Expand Up @@ -103,15 +103,15 @@ interface BuildahOptions {

export class Buildah {
private id: string;
private logger: SimpleLogger;
private logger: SimpleStructuredLogger;
private exec: Exec;

private containers = new Set<string>();
private images = new Set<string>();

constructor(opts: BuildahOptions) {
this.id = opts.id ?? randomUUID();
this.logger = new SimpleLogger(`[buildah][${this.id}]`);
this.logger = new SimpleStructuredLogger("buildah", undefined, { id: this.id });

this.exec = new Exec({
logger: this.logger,
Expand Down Expand Up @@ -220,14 +220,14 @@ interface CrictlOptions {

export class Crictl {
private id: string;
private logger: SimpleLogger;
private logger: SimpleStructuredLogger;
private exec: Exec;

private archives = new Set<string>();

constructor(opts: CrictlOptions) {
this.id = opts.id ?? randomUUID();
this.logger = new SimpleLogger(`[crictl][${this.id}]`);
this.logger = new SimpleStructuredLogger("crictl", undefined, { id: this.id });

this.exec = new Exec({
logger: this.logger,
Expand Down
Loading
Loading