108 lines
4.5 KiB
JavaScript
108 lines
4.5 KiB
JavaScript
|
"use strict";
|
||
|
Object.defineProperty(exports, "__esModule", {
|
||
|
value: true
|
||
|
});
|
||
|
const _findup = /*#__PURE__*/ _interop_require_default(require("next/dist/compiled/find-up"));
|
||
|
const _promises = /*#__PURE__*/ _interop_require_default(require("fs/promises"));
|
||
|
const _child_process = /*#__PURE__*/ _interop_require_default(require("child_process"));
|
||
|
const _assert = /*#__PURE__*/ _interop_require_default(require("assert"));
|
||
|
const _nodefetch = /*#__PURE__*/ _interop_require_default(require("next/dist/compiled/node-fetch"));
|
||
|
const _os = /*#__PURE__*/ _interop_require_default(require("os"));
|
||
|
const _readline = require("readline");
|
||
|
const _fs = require("fs");
|
||
|
const _path = /*#__PURE__*/ _interop_require_default(require("path"));
|
||
|
const _storage = require("../telemetry/storage");
|
||
|
function _interop_require_default(obj) {
|
||
|
return obj && obj.__esModule ? obj : {
|
||
|
default: obj
|
||
|
};
|
||
|
}
|
||
|
// Predefined set of the event names to be included in the trace.
|
||
|
// If the trace span's name matches to one of the event names in the set,
|
||
|
// it'll up uploaded to the trace server.
|
||
|
const EVENT_FILTER = new Set([
|
||
|
"client-hmr-latency",
|
||
|
"hot-reloader",
|
||
|
"webpack-invalid-client",
|
||
|
"webpack-invalidated-server",
|
||
|
"navigation-to-hydration"
|
||
|
]);
|
||
|
const { NEXT_TRACE_UPLOAD_DEBUG, // An external env to allow to upload full trace without picking up the relavant spans.
|
||
|
// This is mainly for the debugging purpose, to allwo manual audit for full trace for the given build.
|
||
|
// [NOTE] This may fail if build is large and generated trace is excessively large.
|
||
|
NEXT_TRACE_UPLOAD_FULL } = process.env;
|
||
|
const isDebugEnabled = !!NEXT_TRACE_UPLOAD_DEBUG || !!NEXT_TRACE_UPLOAD_FULL;
|
||
|
const shouldUploadFullTrace = !!NEXT_TRACE_UPLOAD_FULL;
|
||
|
const [, , traceUploadUrl, mode, _isTurboSession, projectDir, distDir] = process.argv;
|
||
|
const isTurboSession = _isTurboSession === "true";
|
||
|
(async function upload() {
|
||
|
const nextVersion = JSON.parse(await _promises.default.readFile(_path.default.resolve(__dirname, "../../package.json"), "utf8")).version;
|
||
|
const telemetry = new _storage.Telemetry({
|
||
|
distDir
|
||
|
});
|
||
|
const projectPkgJsonPath = await (0, _findup.default)("package.json");
|
||
|
(0, _assert.default)(projectPkgJsonPath);
|
||
|
const projectPkgJson = JSON.parse(await _promises.default.readFile(projectPkgJsonPath, "utf-8"));
|
||
|
const pkgName = projectPkgJson.name;
|
||
|
const commit = _child_process.default.spawnSync(_os.default.platform() === "win32" ? "git.exe" : "git", [
|
||
|
"rev-parse",
|
||
|
"HEAD"
|
||
|
], {
|
||
|
shell: true
|
||
|
}).stdout.toString().trimEnd();
|
||
|
const readLineInterface = (0, _readline.createInterface)({
|
||
|
input: (0, _fs.createReadStream)(_path.default.join(projectDir, distDir, "trace")),
|
||
|
crlfDelay: Infinity
|
||
|
});
|
||
|
const traces = new Map();
|
||
|
for await (const line of readLineInterface){
|
||
|
const lineEvents = JSON.parse(line);
|
||
|
for (const event of lineEvents){
|
||
|
if (// Always include root spans
|
||
|
event.parentId === undefined || shouldUploadFullTrace || EVENT_FILTER.has(event.name)) {
|
||
|
if (typeof event.tags.trigger === "string" && _path.default.isAbsolute(event.tags.trigger)) {
|
||
|
event.tags.trigger = "[project]/" + _path.default.relative(projectDir, event.tags.trigger).replaceAll(_path.default.sep, "/");
|
||
|
}
|
||
|
let trace = traces.get(event.traceId);
|
||
|
if (trace === undefined) {
|
||
|
trace = [];
|
||
|
traces.set(event.traceId, trace);
|
||
|
}
|
||
|
trace.push(event);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
const body = {
|
||
|
metadata: {
|
||
|
anonymousId: telemetry.anonymousId,
|
||
|
arch: _os.default.arch(),
|
||
|
commit,
|
||
|
cpus: _os.default.cpus().length,
|
||
|
isTurboSession,
|
||
|
mode,
|
||
|
nextVersion,
|
||
|
pkgName,
|
||
|
platform: _os.default.platform(),
|
||
|
sessionId: telemetry.sessionId
|
||
|
},
|
||
|
traces: [
|
||
|
...traces.values()
|
||
|
]
|
||
|
};
|
||
|
if (isDebugEnabled) {
|
||
|
console.log("Sending request with body", JSON.stringify(body, null, 2));
|
||
|
}
|
||
|
let res = await (0, _nodefetch.default)(traceUploadUrl, {
|
||
|
method: "POST",
|
||
|
headers: {
|
||
|
"Content-Type": "application/json",
|
||
|
"x-trace-transfer-mode": shouldUploadFullTrace ? "full" : "default"
|
||
|
},
|
||
|
body: JSON.stringify(body)
|
||
|
});
|
||
|
if (isDebugEnabled) {
|
||
|
console.log("Received response", res.status, await res.json());
|
||
|
}
|
||
|
})();
|
||
|
|
||
|
//# sourceMappingURL=trace-uploader.js.map
|