Skip to content

Commit

Permalink
npx convex self-host logs (#34131)
Browse files Browse the repository at this point in the history
like env and the rest of the cli commands, add logs to `npx convex self-host`

also rewrite the npx convex logs tests to avoid sleeping

GitOrigin-RevId: 9af5685dadc0ca034d053f5e1c7686cd48adc25d
  • Loading branch information
ldanilek authored and Convex, Inc. committed Feb 6, 2025
1 parent 1225e89 commit 14bd7e1
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 34 deletions.
24 changes: 24 additions & 0 deletions npm-packages/convex/src/cli/lib/command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { OneoffCtx } from "../../bundler/context.js";
import {
CONVEX_SELF_HOST_ADMIN_KEY_VAR_NAME,
CONVEX_SELF_HOST_URL_VAR_NAME,
parseInteger,
parsePositiveInteger,
} from "./utils/utils.js";

Expand Down Expand Up @@ -145,6 +146,17 @@ declare module "@commander-js/extra-typings" {
component?: string;
}
>;

/**
* Adds options for the `logs` command.
*/
addLogsOptions(): Command<
Args,
Opts & {
history: number;
success: boolean;
}
>;
}
}

Expand Down Expand Up @@ -491,3 +503,15 @@ Command.prototype.addDataOptions = function () {
)
.argument("[table]", "If specified, list documents in this table.");
};

Command.prototype.addLogsOptions = function () {
return this.option(
"--history [n]",
"Show `n` most recent logs. Defaults to showing all available logs.",
parseInteger,
).option(
"--success",
"Print a log line for every successful function execution",
false,
);
};
19 changes: 19 additions & 0 deletions npm-packages/convex/src/cli/lib/logs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,25 @@ const MAX_UDF_STREAM_FAILURE_COUNT = 5;

type LogDestination = "stdout" | "stderr";

export async function logsForDeployment(
ctx: Context,
credentials: {
url: string;
adminKey: string;
},
options: {
success: boolean;
history: number;
deploymentNotice: string;
},
) {
logMessage(ctx, chalk.yellow(`Watching logs${options.deploymentNotice}...`));
await watchLogs(ctx, credentials.url, credentials.adminKey, "stdout", {
history: options.history,
success: options.success,
});
}

export async function watchLogs(
ctx: Context,
url: string,
Expand Down
43 changes: 9 additions & 34 deletions npm-packages/convex/src/cli/logs.ts
Original file line number Diff line number Diff line change
@@ -1,30 +1,19 @@
import { Command } from "@commander-js/extra-typings";
import chalk from "chalk";
import { logMessage, oneoffContext } from "../bundler/context.js";
import { oneoffContext } from "../bundler/context.js";
import {
deploymentSelectionFromOptions,
fetchDeploymentCredentialsProvisionProd,
} from "./lib/api.js";
import { actionDescription } from "./lib/command.js";
import { watchLogs } from "./lib/logs.js";
import { parseInteger } from "./lib/utils/utils.js";
import { logsForDeployment } from "./lib/logs.js";

export const logs = new Command("logs")
.summary("Watch logs from your deployment")
.description(
"Stream function logs from your Convex deployment.\nBy default, this streams from your project's dev deployment.",
)
.allowExcessArguments(false)
.option(
"--history [n]",
"Show `n` most recent logs. Defaults to showing all available logs.",
parseInteger,
)
.option(
"--success",
"Print a log line for every successful function execution",
false,
)
.addLogsOptions()
.addDeploymentSelectionOptions(actionDescription("Watch logs from"))
.showHelpAfterError()
.action(async (cmdOptions) => {
Expand All @@ -35,27 +24,13 @@ export const logs = new Command("logs")
ctx,
deploymentSelection,
);
if (cmdOptions.prod) {
logMessage(
ctx,
chalk.yellow(
`Watching logs for production deployment ${
credentials.deploymentName || ""
}...`,
),
);
} else {
logMessage(
ctx,
chalk.yellow(
`Watching logs for dev deployment ${
credentials.deploymentName || ""
}...`,
),
);
}
await watchLogs(ctx, credentials.url, credentials.adminKey, "stdout", {
const deploymentName = credentials.deploymentName
? ` ${credentials.deploymentName}`
: "";
const deploymentNotice = ` for ${cmdOptions.prod ? "production" : "dev"} deployment${deploymentName}`;
await logsForDeployment(ctx, credentials, {
history: cmdOptions.history,
success: cmdOptions.success,
deploymentNotice,
});
});
20 changes: 20 additions & 0 deletions npm-packages/convex/src/cli/selfHost.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import { CONVEX_DEPLOYMENT_VAR_NAME } from "./lib/deployment.js";
import { runInDeployment } from "./lib/run.js";
import { importIntoDeployment } from "./lib/convexImport.js";
import { exportFromDeployment } from "./lib/convexExport.js";
import { logsForDeployment } from "./lib/logs.js";
import { functionSpecForDeployment } from "./lib/functionSpec.js";
import { dataInDeployment } from "./lib/data.js";
import {
Expand Down Expand Up @@ -372,3 +373,22 @@ selfHost
file: !!options.file,
});
});

selfHost
.command("logs")
.summary("Watch logs from your deployment")
.description("Stream function logs from your Convex deployment.")
.allowExcessArguments(false)
.addLogsOptions()
.addSelfHostOptions()
.showHelpAfterError()
.action(async (cmdOptions) => {
const ctx = oneoffContext();

const credentials = await selfHostCredentials(ctx, true, cmdOptions);
await logsForDeployment(ctx, credentials, {
history: cmdOptions.history,
success: cmdOptions.success,
deploymentNotice: "",
});
});

0 comments on commit 14bd7e1

Please sign in to comment.