Skip to content

Commit 2156e15

Browse files
committed
Adding some additional telemetry during deploy to help debug issues
1 parent 49b4d47 commit 2156e15

File tree

4 files changed

+144
-89
lines changed

4 files changed

+144
-89
lines changed

.changeset/long-fireants-search.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"trigger.dev": patch
3+
---
4+
5+
Adding some additional telemetry during deploy to help debug issues

packages/cli-v3/src/commands/deploy.ts

Lines changed: 78 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1286,7 +1286,7 @@ async function compileProject(
12861286

12871287
const javascriptProject = new JavascriptProject(config.projectDir);
12881288

1289-
const dependencies = await gatherRequiredDependencies(allImports, config, javascriptProject);
1289+
const dependencies = await resolveRequiredDependencies(allImports, config, javascriptProject);
12901290

12911291
logger.debug("gatherRequiredDependencies()", { dependencies });
12921292

@@ -1300,6 +1300,10 @@ async function compileProject(
13001300
},
13011301
};
13021302

1303+
span.setAttributes({
1304+
...flattenAttributes(packageJsonContents, "packageJson.contents"),
1305+
});
1306+
13031307
await writeJSONFile(join(tempDir, "package.json"), packageJsonContents);
13041308

13051309
const copyResult = await copyAdditionalFiles(config, tempDir);
@@ -1548,81 +1552,103 @@ async function typecheckProject(config: ResolvedConfig, options: DeployCommandOp
15481552

15491553
// Returns the dependencies that are required by the output that are found in output and the CLI package dependencies
15501554
// Returns the dependency names and the version to use (taken from the CLI deps package.json)
1551-
async function gatherRequiredDependencies(
1555+
async function resolveRequiredDependencies(
15521556
imports: Metafile["outputs"][string]["imports"],
15531557
config: ResolvedConfig,
15541558
project: JavascriptProject
15551559
) {
1556-
const dependencies: Record<string, string> = {};
1557-
const resolvablePackageNames = new Set<string>();
1560+
return await tracer.startActiveSpan("resolveRequiredDependencies", async (span) => {
1561+
const resolvablePackageNames = new Set<string>();
15581562

1559-
for (const file of imports) {
1560-
if ((file.kind !== "require-call" && file.kind !== "dynamic-import") || !file.external) {
1561-
continue;
1562-
}
1563+
for (const file of imports) {
1564+
if ((file.kind !== "require-call" && file.kind !== "dynamic-import") || !file.external) {
1565+
continue;
1566+
}
15631567

1564-
const packageName = detectPackageNameFromImportPath(file.path);
1568+
const packageName = detectPackageNameFromImportPath(file.path);
15651569

1566-
if (!packageName) {
1567-
continue;
1570+
if (!packageName) {
1571+
continue;
1572+
}
1573+
1574+
resolvablePackageNames.add(packageName);
15681575
}
15691576

1570-
resolvablePackageNames.add(packageName);
1571-
}
1577+
span.setAttribute("resolvablePackageNames", Array.from(resolvablePackageNames));
15721578

1573-
const resolvedPackageVersions = await project.resolveAll(Array.from(resolvablePackageNames));
1574-
const missingPackages = Array.from(resolvablePackageNames).filter(
1575-
(packageName) => !resolvedPackageVersions[packageName]
1576-
);
1579+
const resolvedPackageVersions = await project.resolveAll(Array.from(resolvablePackageNames));
1580+
const missingPackages = Array.from(resolvablePackageNames).filter(
1581+
(packageName) => !resolvedPackageVersions[packageName]
1582+
);
15771583

1578-
for (const missingPackage of missingPackages) {
1579-
const internalDependencyVersion =
1580-
(packageJson.dependencies as Record<string, string>)[missingPackage] ??
1581-
detectDependencyVersion(missingPackage);
1584+
span.setAttributes({
1585+
...flattenAttributes(resolvedPackageVersions, "resolvedPackageVersions"),
1586+
});
1587+
span.setAttribute("missingPackages", missingPackages);
15821588

1583-
if (internalDependencyVersion) {
1584-
dependencies[missingPackage] = stripWorkspaceFromVersion(internalDependencyVersion);
1585-
}
1586-
}
1589+
const dependencies: Record<string, string> = {};
15871590

1588-
for (const [packageName, version] of Object.entries(resolvedPackageVersions)) {
1589-
dependencies[packageName] = version;
1590-
}
1591+
for (const missingPackage of missingPackages) {
1592+
const internalDependencyVersion =
1593+
(packageJson.dependencies as Record<string, string>)[missingPackage] ??
1594+
detectDependencyVersion(missingPackage);
15911595

1592-
if (config.additionalPackages) {
1593-
for (const packageName of config.additionalPackages) {
1594-
if (dependencies[packageName]) {
1595-
continue;
1596+
if (internalDependencyVersion) {
1597+
dependencies[missingPackage] = stripWorkspaceFromVersion(internalDependencyVersion);
15961598
}
1599+
}
15971600

1598-
const packageParts = parsePackageName(packageName);
1601+
for (const [packageName, version] of Object.entries(resolvedPackageVersions)) {
1602+
dependencies[packageName] = version;
1603+
}
15991604

1600-
if (packageParts.version) {
1601-
dependencies[packageParts.name] = packageParts.version;
1602-
continue;
1603-
} else {
1604-
const externalDependencyVersion = await project.resolve(packageParts.name, {
1605-
allowDev: true,
1606-
});
1605+
if (config.additionalPackages) {
1606+
span.setAttribute("additionalPackages", config.additionalPackages);
16071607

1608-
if (externalDependencyVersion) {
1609-
dependencies[packageParts.name] = externalDependencyVersion;
1608+
for (const packageName of config.additionalPackages) {
1609+
if (dependencies[packageName]) {
1610+
continue;
1611+
}
1612+
1613+
const packageParts = parsePackageName(packageName);
1614+
1615+
if (packageParts.version) {
1616+
dependencies[packageParts.name] = packageParts.version;
16101617
continue;
16111618
} else {
1612-
logger.log(
1613-
`${chalkWarning("X Warning:")} Could not find version for package ${chalkPurple(
1614-
packageName
1615-
)}, add a version specifier to the package name (e.g. ${
1616-
packageParts.name
1617-
}@latest) or add it to your project's package.json`
1618-
);
1619+
const externalDependencyVersion = await project.resolve(packageParts.name, {
1620+
allowDev: true,
1621+
});
1622+
1623+
if (externalDependencyVersion) {
1624+
dependencies[packageParts.name] = externalDependencyVersion;
1625+
continue;
1626+
} else {
1627+
logger.log(
1628+
`${chalkWarning("X Warning:")} Could not find version for package ${chalkPurple(
1629+
packageName
1630+
)}, add a version specifier to the package name (e.g. ${
1631+
packageParts.name
1632+
}@latest) or add it to your project's package.json`
1633+
);
1634+
}
16191635
}
16201636
}
16211637
}
1622-
}
16231638

1624-
// Make sure we sort the dependencies by key to ensure consistent hashing
1625-
return Object.fromEntries(Object.entries(dependencies).sort(([a], [b]) => a.localeCompare(b)));
1639+
// Make sure we sort the dependencies by key to ensure consistent hashing
1640+
const result = Object.fromEntries(
1641+
Object.entries(dependencies).sort(([a], [b]) => a.localeCompare(b))
1642+
);
1643+
1644+
span.setAttributes({
1645+
...flattenAttributes(result, "dependencies"),
1646+
});
1647+
1648+
span.end();
1649+
1650+
return result;
1651+
});
16261652
}
16271653

16281654
type AdditionalFilesReturn =

packages/cli-v3/src/utilities/build.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ export function bundleDependenciesPlugin(
149149
}
150150
}
151151

152-
logger.ignore(`[${buildIdentifier}] Externalizing ${args.path}`, {
152+
logger.debug(`[${buildIdentifier}] Externalizing ${args.path}`, {
153153
...args,
154154
});
155155

packages/cli-v3/src/utilities/javascriptProject.ts

Lines changed: 60 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ import { PackageManager, getUserPackageManager } from "./getUserPackageManager";
66
import { PackageJson } from "type-fest";
77
import { assertExhaustive } from "./assertExhaustive";
88
import { builtinModules } from "node:module";
9+
import { tracer } from "../cli/common";
10+
import { recordSpanException } from "@trigger.dev/core/v3/otel";
11+
import { flattenAttributes } from "@trigger.dev/core/v3";
912

1013
export type ResolveOptions = { allowDev: boolean };
1114

@@ -47,60 +50,81 @@ export class JavascriptProject {
4750
packageNames: string[],
4851
options?: ResolveOptions
4952
): Promise<Record<string, string>> {
50-
const externalPackages = packageNames.filter((packageName) => !isBuiltInModule(packageName));
53+
return tracer.startActiveSpan("JavascriptProject.resolveAll", async (span) => {
54+
const externalPackages = packageNames.filter((packageName) => !isBuiltInModule(packageName));
5155

52-
const opts = { allowDev: false, ...options };
56+
const opts = { allowDev: false, ...options };
5357

54-
const command = await this.#getCommand();
58+
const command = await this.#getCommand();
5559

56-
try {
57-
const versions = await command.resolveDependencyVersions(externalPackages, {
58-
cwd: this.projectPath,
60+
span.setAttributes({
61+
externalPackages,
62+
packageManager: command.name,
5963
});
6064

61-
if (versions) {
62-
logger.debug(`Resolved [${externalPackages.join(", ")}] version using ${command.name}`, {
63-
versions,
65+
try {
66+
const versions = await command.resolveDependencyVersions(externalPackages, {
67+
cwd: this.projectPath,
6468
});
65-
}
66-
67-
// Merge the resolved versions with the package.json dependencies
68-
const missingPackages = externalPackages.filter((packageName) => !versions[packageName]);
69-
const missingPackageVersions: Record<string, string> = {};
7069

71-
for (const packageName of missingPackages) {
72-
const packageJsonVersion = this.packageJson.dependencies?.[packageName];
73-
74-
if (typeof packageJsonVersion === "string") {
75-
logger.debug(`Resolved ${packageName} version using package.json`, {
76-
packageJsonVersion,
70+
if (versions) {
71+
logger.debug(`Resolved [${externalPackages.join(", ")}] version using ${command.name}`, {
72+
versions,
7773
});
7874

79-
missingPackageVersions[packageName] = packageJsonVersion;
75+
span.setAttributes({
76+
...flattenAttributes(versions, "versions"),
77+
});
8078
}
8179

82-
if (opts.allowDev) {
83-
const devPackageJsonVersion = this.packageJson.devDependencies?.[packageName];
80+
// Merge the resolved versions with the package.json dependencies
81+
const missingPackages = externalPackages.filter((packageName) => !versions[packageName]);
82+
const missingPackageVersions: Record<string, string> = {};
83+
84+
for (const packageName of missingPackages) {
85+
const packageJsonVersion = this.packageJson.dependencies?.[packageName];
8486

85-
if (typeof devPackageJsonVersion === "string") {
86-
logger.debug(`Resolved ${packageName} version using devDependencies`, {
87-
devPackageJsonVersion,
87+
if (typeof packageJsonVersion === "string") {
88+
logger.debug(`Resolved ${packageName} version using package.json`, {
89+
packageJsonVersion,
8890
});
8991

90-
missingPackageVersions[packageName] = devPackageJsonVersion;
92+
missingPackageVersions[packageName] = packageJsonVersion;
93+
}
94+
95+
if (opts.allowDev) {
96+
const devPackageJsonVersion = this.packageJson.devDependencies?.[packageName];
97+
98+
if (typeof devPackageJsonVersion === "string") {
99+
logger.debug(`Resolved ${packageName} version using devDependencies`, {
100+
devPackageJsonVersion,
101+
});
102+
103+
missingPackageVersions[packageName] = devPackageJsonVersion;
104+
}
91105
}
92106
}
93-
}
94107

95-
return { ...versions, ...missingPackageVersions };
96-
} catch (error) {
97-
logger.debug(`Failed to resolve dependency versions using ${command.name}`, {
98-
packageNames,
99-
error,
100-
});
108+
span.setAttributes({
109+
...flattenAttributes(missingPackageVersions, "missingPackageVersions"),
110+
missingPackages,
111+
});
101112

102-
return {};
103-
}
113+
span.end();
114+
115+
return { ...versions, ...missingPackageVersions };
116+
} catch (error) {
117+
recordSpanException(span, error);
118+
span.end();
119+
120+
logger.debug(`Failed to resolve dependency versions using ${command.name}`, {
121+
packageNames,
122+
error,
123+
});
124+
125+
return {};
126+
}
127+
});
104128
}
105129

106130
async resolve(packageName: string, options?: ResolveOptions): Promise<string | undefined> {

0 commit comments

Comments
 (0)