Merge pull request #647 from pikasTech/fix-observe-otel-visibility-1811-20260622

fix(observability): keep probe and otel summaries bounded
This commit is contained in:
Lyon
2026-06-22 12:02:31 +08:00
committed by GitHub
2 changed files with 38 additions and 15 deletions
+13 -11
View File
@@ -7601,6 +7601,7 @@ function runNodeWebProbeObserveAnalyze(options: NodeWebProbeObserveOptions, spec
"const tail = (text, limit = 1200) => String(text || '').slice(-limit);",
"const takeHead = (value, limit) => Array.isArray(value) ? value.slice(0, limit) : [];",
"const takeTail = (value, limit) => Array.isArray(value) ? value.slice(-limit) : [];",
"const firstArray = (...values) => { for (const value of values) if (Array.isArray(value)) return value; return []; };",
"const clip = (value, limit = 160) => value === null || value === undefined ? null : String(value).slice(0, limit);",
"const stdoutJson = readJson(stdoutPath);",
"const reportJson = readJson(reportJsonPath);",
@@ -7624,7 +7625,7 @@ function runNodeWebProbeObserveAnalyze(options: NodeWebProbeObserveOptions, spec
" roundItems: takeTail(srcMetrics.roundItems, 8).map(slimRound),",
" rounds: Array.isArray(srcMetrics.rounds) ? takeTail(srcMetrics.rounds, 8).map(slimRound) : srcMetrics.rounds,",
" turnColumns: takeTail(srcMetrics.turnColumns, 8).map(slimTurnColumn),",
" turnTimingRows: srcMetrics.turnTimingRows ?? null,",
" turnTimingRows: Array.isArray(srcMetrics.turnTimingRows) ? srcMetrics.turnTimingRows.length : (srcMetrics.turnTimingRows ?? null),",
" turnTimingNonMonotonicCount: srcMetrics.turnTimingNonMonotonicCount ?? null,",
" turnTimingTotalElapsedDecreaseCount: srcMetrics.turnTimingTotalElapsedDecreaseCount ?? null,",
" turnTimingTerminalElapsedGrowthCount: srcMetrics.turnTimingTerminalElapsedGrowthCount ?? null,",
@@ -7644,7 +7645,7 @@ function runNodeWebProbeObserveAnalyze(options: NodeWebProbeObserveOptions, spec
"const srcPromptNetwork = objectOrNull(source?.promptNetwork);",
"const promptNetwork = srcPromptNetwork ? { promptSegments: srcPromptNetwork.promptSegments ?? null } : null;",
"const compact = source ? {",
" ok: analyzerExit === 0 && source.ok !== false,",
" ok: analyzerExit === 0,",
" counts: source.counts ?? null,",
" analysisWindow: objectOrNull(source.analysisWindow),",
" archiveSummary: objectOrNull(source.archiveSummary),",
@@ -7653,15 +7654,16 @@ function runNodeWebProbeObserveAnalyze(options: NodeWebProbeObserveOptions, spec
" pagePerformance,",
" promptNetwork,",
" pagePerformanceSlowApi: takeHead(sourceSlowApi, 4).map(slimSlowApi),",
" findings: takeHead(source.findings, 6).map(slimFinding),",
" httpErrorGroups: takeHead(source.httpErrorGroups, 4).map(slimNetworkGroup),",
" requestFailedGroups: takeHead(source.requestFailedGroups, 5).map(slimNetworkGroup),",
" domDiagnosticGroups: takeHead(source.domDiagnosticGroups, 3).map(slimDomGroup),",
" domDiagnosticSamples: takeHead(source.domDiagnosticSamples, 5).map(slimDomSample),",
" consoleAlertGroups: takeHead(source.consoleAlertGroups, 5).map(slimConsoleGroup),",
" consoleAlertSamples: takeHead(source.consoleAlertSamples, 5).map(slimConsoleSample),",
" runnerErrors: takeTail(source.runnerErrors, 8).map(slimRunnerError),",
" turnTimingRecentUpdateJumps: takeHead(source.turnTimingRecentUpdateJumps, 5).map(slimJump),",
" findings: takeHead(firstArray(source.findings, fullSource?.findings), 6).map(slimFinding),",
" httpErrorGroups: takeHead(firstArray(source.httpErrorGroups, fullSource?.httpErrorGroups), 4).map(slimNetworkGroup),",
" requestFailedGroups: takeHead(firstArray(source.requestFailedGroups, fullSource?.requestFailedGroups), 5).map(slimNetworkGroup),",
" domDiagnosticGroups: takeHead(firstArray(source.domDiagnosticGroups, fullSource?.domDiagnosticGroups), 3).map(slimDomGroup),",
" domDiagnosticSamples: takeHead(firstArray(source.domDiagnosticSamples, fullSource?.domDiagnosticSamples), 5).map(slimDomSample),",
" consoleAlertGroups: takeHead(firstArray(source.consoleAlertGroups, fullSource?.consoleAlertGroups), 5).map(slimConsoleGroup),",
" consoleAlertSamples: takeHead(firstArray(source.consoleAlertSamples, fullSource?.consoleAlertSamples), 5).map(slimConsoleSample),",
" runnerErrors: takeTail(firstArray(source.runnerErrors, fullSource?.runnerErrors), 8).map(slimRunnerError),",
" turnTimingRecentUpdateJumps: takeHead(firstArray(source.turnTimingRecentUpdateJumps, srcMetrics?.turnTimingRecentUpdateJumps, fullSource?.turnTimingRecentUpdateJumps), 5).map(slimJump),",
" turnTimingElapsedZeroResets: takeHead(firstArray(source.turnTimingElapsedZeroResets, srcMetrics?.turnTimingElapsedZeroResets, fullSource?.turnTimingElapsedZeroResets), 5).map(slimJump),",
" reportJsonPath: source.reportJsonPath || reportJsonPath,",
" reportJsonSha256: source.reportJsonSha256 || sha256(reportJsonPath),",
" reportMdPath: source.reportMdPath || reportMdPath,",
+25 -4
View File
@@ -750,9 +750,10 @@ async function search(config: UniDeskConfig, options: SearchOptions): Promise<Re
}
function inferSearchTempoQuery(options: SearchOptions): string | null {
if (options.path !== null) return `{ .http.route = ${JSON.stringify(options.path)} }`;
if (options.status !== null) return `{ .http.response.status_code = ${options.status} }`;
return null;
const filters: string[] = [];
if (options.path !== null) filters.push(`.http.route = ${JSON.stringify(options.path)}`);
if (options.status !== null) filters.push(`.http.response.status_code = ${options.status}`);
return filters.length > 0 ? `{ ${filters.join(" && ")} }` : null;
}
function businessTraceIdFromSearchText(value: string | null): string | null {
@@ -827,7 +828,7 @@ function renderTraceTable(input: {
return [
shortenEnd(textValue(span.name), 48),
shortenEnd(textValue(span.service), 28),
spanDetail(span, 140),
spanDetail(span, 360),
];
});
const countRows = asArray(input.result.spanNameCounts).slice(0, 8).map((item) => {
@@ -1039,6 +1040,7 @@ function uniqueSpanRecords(values: unknown[]): Record<string, unknown>[] {
function spanDetail(span: Record<string, unknown>, maxLength: number): string {
const attrs = asPlainRecord(span.attributes);
const parts = [
valuePart("durationMs", span.durationMs),
attrPart(attrs, "failureKind"),
attrPart(attrs, "errorSummary"),
attrPart(attrs, "error.message"),
@@ -1059,11 +1061,30 @@ function spanDetail(span: Record<string, unknown>, maxLength: number): string {
attrPart(attrs, "commandFingerprint"),
attrPart(attrs, "http.route"),
attrPart(attrs, "http.response.status_code"),
attrPart(attrs, "db.system"),
attrPart(attrs, "db.operation.name"),
attrPart(attrs, "db.sql.table"),
attrPart(attrs, "db.query.arg_count"),
attrPart(attrs, "db.index.expected"),
attrPart(attrs, "db.pool.max_open"),
attrPart(attrs, "db.pool.open_connections"),
attrPart(attrs, "db.pool.in_use"),
attrPart(attrs, "db.pool.idle"),
attrPart(attrs, "db.pool.wait_count"),
attrPart(attrs, "db.pool.wait_duration_ms"),
attrPart(attrs, "error.code"),
attrPart(attrs, "error.category"),
attrPart(attrs, "error.layer"),
].filter((item) => item !== null) as string[];
if (parts.length === 0) return "-";
return shortenEnd(parts.join(" "), maxLength);
}
function valuePart(key: string, value: unknown): string | null {
if (value === null || value === undefined || value === "") return null;
return `${key}=${textValue(value)}`;
}
function attrPart(attrs: Record<string, unknown> | null, key: string): string | null {
if (attrs === null) return null;
const value = attrs[key];