@oneuptime/common 11.5.11 → 11.5.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/AnalyticsModels/NetworkFlow.ts +12 -1
- package/Models/DatabaseModels/AIInsight.ts +30 -0
- package/Models/DatabaseModels/Project.ts +30 -0
- package/Models/DatabaseModels/TelemetryException.ts +128 -0
- package/Server/API/AIAgentDataAPI.ts +129 -5
- package/Server/API/AIInvestigationAPI.ts +87 -0
- package/Server/API/StatusPageAPI.ts +14 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784640000000-AddExceptionTriageAndPrivacyColumns.ts +56 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -2
- package/Server/Services/AIRunService.ts +8 -0
- package/Server/Services/IncidentService.ts +62 -67
- package/Server/Services/MonitorGroupService.ts +15 -2
- package/Server/Services/MonitorService.ts +91 -3
- package/Server/Services/MonitorStatusTimelineService.ts +285 -100
- package/Server/Services/StatusPageService.ts +59 -34
- package/Server/Services/TelemetryExceptionService.ts +320 -24
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +15 -4
- package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +15 -4
- package/Server/Utils/AI/SRE/Insights/InsightScanner.ts +222 -24
- package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +225 -9
- package/Server/Utils/AI/SRE/SubjectCodeFixRun.ts +39 -0
- package/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.ts +114 -0
- package/Server/Utils/Monitor/MonitorResource.ts +43 -14
- package/Server/Utils/Monitor/MonitorStatusTimeline.ts +32 -7
- package/Server/Utils/Monitor/MonitorStatusTimelineReconciler.ts +362 -0
- package/Server/Utils/Telemetry/ExceptionSanitizer.ts +222 -0
- package/Tests/Server/Services/MonitorStatusTimelineService.test.ts +235 -0
- package/Tests/Server/Services/TelemetryExceptionCodeFixRun.test.ts +205 -1
- package/Tests/Server/Utils/AI/Insights/InsightScanner.test.ts +150 -141
- package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +277 -1
- package/Tests/Server/Utils/ExceptionSanitizer.test.ts +70 -0
- package/Tests/Server/Utils/InsightTriageClassification.test.ts +57 -0
- package/Tests/Server/Utils/Monitor/MonitorStatusTimelineReconciler.test.ts +555 -0
- package/Tests/Server/Utils/TelemetryImprovementTaskTrigger.test.ts +141 -0
- package/Tests/Types/Database/CompareOperatorWireSerialization.test.ts +216 -0
- package/Tests/Types/Database/GreaterThan.test.ts +5 -1
- package/Tests/Types/Database/GreaterThanOrEqual.test.ts +5 -1
- package/Tests/Types/Database/GreaterThanOrNull.test.ts +24 -1
- package/Tests/Types/Database/LessThan.test.ts +5 -1
- package/Tests/Types/Database/LessThanOrEqual.test.ts +24 -1
- package/Tests/Types/Database/LessThanOrNull.test.ts +5 -1
- package/Tests/UI/Components/ModelTableSelectFromColumns.test.ts +259 -0
- package/Tests/Utils/Uptime/UptimeUtil.test.ts +726 -0
- package/Types/AI/CodeFixTaskContext.ts +6 -0
- package/Types/AI/CodeFixTaskType.ts +38 -1
- package/Types/AI/ExceptionAIClassification.ts +27 -0
- package/Types/BaseDatabase/GreaterThan.ts +8 -1
- package/Types/BaseDatabase/GreaterThanOrEqual.ts +8 -1
- package/Types/BaseDatabase/GreaterThanOrNull.ts +9 -1
- package/Types/BaseDatabase/LessThan.ts +8 -1
- package/Types/BaseDatabase/LessThanOrEqual.ts +9 -1
- package/Types/BaseDatabase/LessThanOrNull.ts +8 -1
- package/Types/Log/LogScrubPatternType.ts +7 -0
- package/Types/Trace/TraceScrubPatternType.ts +7 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +15 -46
- package/UI/Components/ModelTable/SelectFromColumns.ts +129 -0
- package/Utils/StatusPage/ResourceUptime.ts +11 -1
- package/Utils/Uptime/UptimeUtil.ts +142 -36
- package/build/dist/Models/AnalyticsModels/NetworkFlow.js +12 -1
- package/build/dist/Models/AnalyticsModels/NetworkFlow.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AIInsight.js +31 -0
- package/build/dist/Models/DatabaseModels/AIInsight.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +31 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryException.js +134 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Server/API/AIAgentDataAPI.js +97 -8
- package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +55 -0
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +12 -2
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784640000000-AddExceptionTriageAndPrivacyColumns.js +33 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784640000000-AddExceptionTriageAndPrivacyColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -2
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AIRunService.js +9 -2
- package/build/dist/Server/Services/AIRunService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +47 -56
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/MonitorGroupService.js +15 -2
- package/build/dist/Server/Services/MonitorGroupService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +66 -3
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +244 -102
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +57 -33
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryExceptionService.js +263 -22
- package/build/dist/Server/Services/TelemetryExceptionService.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +12 -4
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +12 -4
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightScanner.js +193 -22
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightScanner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +178 -9
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js +37 -0
- package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.js +98 -0
- package/build/dist/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +34 -12
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js +25 -8
- package/build/dist/Server/Utils/Monitor/MonitorStatusTimeline.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStatusTimelineReconciler.js +268 -0
- package/build/dist/Server/Utils/Monitor/MonitorStatusTimelineReconciler.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js +149 -0
- package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js.map +1 -0
- package/build/dist/Types/AI/CodeFixTaskType.js +38 -1
- package/build/dist/Types/AI/CodeFixTaskType.js.map +1 -1
- package/build/dist/Types/AI/ExceptionAIClassification.js +28 -0
- package/build/dist/Types/AI/ExceptionAIClassification.js.map +1 -0
- package/build/dist/Types/BaseDatabase/GreaterThan.js +8 -1
- package/build/dist/Types/BaseDatabase/GreaterThan.js.map +1 -1
- package/build/dist/Types/BaseDatabase/GreaterThanOrEqual.js +8 -1
- package/build/dist/Types/BaseDatabase/GreaterThanOrEqual.js.map +1 -1
- package/build/dist/Types/BaseDatabase/GreaterThanOrNull.js +9 -1
- package/build/dist/Types/BaseDatabase/GreaterThanOrNull.js.map +1 -1
- package/build/dist/Types/BaseDatabase/LessThan.js +8 -1
- package/build/dist/Types/BaseDatabase/LessThan.js.map +1 -1
- package/build/dist/Types/BaseDatabase/LessThanOrEqual.js +9 -1
- package/build/dist/Types/BaseDatabase/LessThanOrEqual.js.map +1 -1
- package/build/dist/Types/BaseDatabase/LessThanOrNull.js +8 -1
- package/build/dist/Types/BaseDatabase/LessThanOrNull.js.map +1 -1
- package/build/dist/Types/Log/LogScrubPatternType.js +7 -0
- package/build/dist/Types/Log/LogScrubPatternType.js.map +1 -1
- package/build/dist/Types/Trace/TraceScrubPatternType.js +7 -0
- package/build/dist/Types/Trace/TraceScrubPatternType.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +12 -37
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/SelectFromColumns.js +82 -0
- package/build/dist/UI/Components/ModelTable/SelectFromColumns.js.map +1 -0
- package/build/dist/Utils/StatusPage/ResourceUptime.js +4 -1
- package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
- package/build/dist/Utils/Uptime/UptimeUtil.js +86 -33
- package/build/dist/Utils/Uptime/UptimeUtil.js.map +1 -1
- package/package.json +1 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784401962564-MigrationName.ts +0 -101
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784401962564-MigrationName.js +0 -40
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784401962564-MigrationName.js.map +0 -1
|
@@ -8,10 +8,17 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
8
8
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
9
|
};
|
|
10
10
|
import OneUptimeDate from "../../../../../Types/Date";
|
|
11
|
+
import AIInsightStatus, { AIInsightStatusHelper, } from "../../../../../Types/AI/AIInsightStatus";
|
|
12
|
+
import AIInsightType from "../../../../../Types/AI/AIInsightType";
|
|
13
|
+
import ExceptionAIClassification from "../../../../../Types/AI/ExceptionAIClassification";
|
|
11
14
|
import AIInsightService from "../../../../Services/AIInsightService";
|
|
15
|
+
import ProjectService from "../../../../Services/ProjectService";
|
|
16
|
+
import TelemetryExceptionService from "../../../../Services/TelemetryExceptionService";
|
|
12
17
|
import { AI_INSIGHT_TRIAGE_FEATURE } from "../../../../Services/AIService";
|
|
13
18
|
import AIInvestigationEngine from "../AIInvestigationEngine";
|
|
14
19
|
import AIInvestigationQueue from "../InvestigationQueue";
|
|
20
|
+
import InsightFixRouting from "./FixRouting";
|
|
21
|
+
import ToolResultSerializer from "../../Toolbox/Serializer";
|
|
15
22
|
import logger from "../../../Logger";
|
|
16
23
|
import CaptureSpan from "../../../Telemetry/CaptureSpan";
|
|
17
24
|
/*
|
|
@@ -45,7 +52,17 @@ const PREVENTIVE_TRIAGE_FRAMING = `IMPORTANT — this is PREVENTIVE TRIAGE, not
|
|
|
45
52
|
- Establish the most likely root cause of the finding.
|
|
46
53
|
- Estimate the blast radius: which services/users/operations are affected, and how badly.
|
|
47
54
|
- Recommend exactly ONE next action (the single most useful thing an engineer should do first).
|
|
48
|
-
Cite the evidence for every factual claim. If the telemetry cannot support a conclusion, say so plainly. Do not refer to "the incident" — there is none
|
|
55
|
+
Cite the evidence for every factual claim. If the telemetry cannot support a conclusion, say so plainly. Do not refer to "the incident" — there is none.
|
|
56
|
+
|
|
57
|
+
CLASSIFICATION — you MUST end your analysis with one line in EXACTLY this format, on its own line, with nothing after it:
|
|
58
|
+
Classification: <verdict>
|
|
59
|
+
where <verdict> is exactly one of: code-fault, user-error, expected-denial, infrastructure, unknown.
|
|
60
|
+
- code-fault: a defect in the monitored code that a code change should fix.
|
|
61
|
+
- user-error: an expected consequence of invalid end-user input (bad parameters, malformed values, garbage in a URL). The code rejected it correctly; the input was wrong.
|
|
62
|
+
- expected-denial: an intentional check doing its job — authentication/authorization failures, plan or paywall rejections, rate limits, or security scanners/fuzzers tripping validation on purpose-built probes.
|
|
63
|
+
- infrastructure: an environmental condition (network timeout, connection reset, resource exhaustion, dependency outage) rather than a logic defect.
|
|
64
|
+
- unknown: the evidence does not support a confident verdict.
|
|
65
|
+
This verdict gates automation: ONLY code-fault findings may get an automatic fix pull request, so classify conservatively — when torn between code-fault and anything else, pick the other one.`;
|
|
49
66
|
export default class InsightTriageRunner {
|
|
50
67
|
/*
|
|
51
68
|
* Execute a claimed triage run: load the insight, build its description
|
|
@@ -56,11 +73,13 @@ export default class InsightTriageRunner {
|
|
|
56
73
|
static async executeTriage(data) {
|
|
57
74
|
const { aiRunId, projectId, sentinelInsightId, attemptCount } = data;
|
|
58
75
|
let contextSummary;
|
|
76
|
+
let insight = null;
|
|
59
77
|
try {
|
|
60
|
-
|
|
78
|
+
insight = await AIInsightService.findOneById({
|
|
61
79
|
id: sentinelInsightId,
|
|
62
80
|
select: {
|
|
63
81
|
_id: true,
|
|
82
|
+
projectId: true,
|
|
64
83
|
insightType: true,
|
|
65
84
|
severity: true,
|
|
66
85
|
title: true,
|
|
@@ -68,6 +87,7 @@ export default class InsightTriageRunner {
|
|
|
68
87
|
evidence: true,
|
|
69
88
|
serviceName: true,
|
|
70
89
|
traceId: true,
|
|
90
|
+
telemetryExceptionId: true,
|
|
71
91
|
metricName: true,
|
|
72
92
|
firstSeenAt: true,
|
|
73
93
|
lastSeenAt: true,
|
|
@@ -101,25 +121,168 @@ export default class InsightTriageRunner {
|
|
|
101
121
|
feature: AI_INSIGHT_TRIAGE_FEATURE,
|
|
102
122
|
contextSummary,
|
|
103
123
|
postAnalysis: async (postData) => {
|
|
124
|
+
const classification = this.parseClassification(postData.analysisMarkdown);
|
|
104
125
|
/*
|
|
105
|
-
* The quiet inbox —
|
|
106
|
-
* no workspace notification, no owner/on-call
|
|
107
|
-
* and no instrumentation-task trigger. Insights
|
|
108
|
-
* never enter the notification pipeline
|
|
109
|
-
* the summary waits on the Insights page
|
|
126
|
+
* The quiet inbox — the summary and verdict land on the insight
|
|
127
|
+
* row: no feed items, no workspace notification, no owner/on-call
|
|
128
|
+
* ping, no metrics, and no instrumentation-task trigger. Insights
|
|
129
|
+
* never page and never enter the notification pipeline
|
|
130
|
+
* (Preventive-lane rule); the summary waits on the Insights page
|
|
131
|
+
* until a human looks.
|
|
110
132
|
*/
|
|
111
133
|
await AIInsightService.updateOneById({
|
|
112
134
|
id: sentinelInsightId,
|
|
113
135
|
data: {
|
|
114
136
|
triageSummaryMarkdown: postData.analysisMarkdown,
|
|
115
137
|
triageCompletedAt: OneUptimeDate.getCurrentDate(),
|
|
138
|
+
classification: classification,
|
|
116
139
|
},
|
|
117
140
|
props: { isRoot: true },
|
|
118
141
|
});
|
|
119
|
-
logger.debug(`AI insights: triage summary posted for insight ${sentinelInsightId.toString()} (run ${aiRunId.toString()}, confident=${postData.confidence.confident} via ${postData.confidence.source}).`);
|
|
142
|
+
logger.debug(`AI insights: triage summary posted for insight ${sentinelInsightId.toString()} (run ${aiRunId.toString()}, classification=${classification}, confident=${postData.confidence.confident} via ${postData.confidence.source}).`);
|
|
143
|
+
/*
|
|
144
|
+
* Verdict-driven follow-through. Best-effort by design: the
|
|
145
|
+
* triage summary is already posted, and a failure here must not
|
|
146
|
+
* fail the triage run itself.
|
|
147
|
+
*/
|
|
148
|
+
try {
|
|
149
|
+
await this.actOnClassification({
|
|
150
|
+
insight: insight,
|
|
151
|
+
classification: classification,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
logger.error(`AI insights: post-triage action failed for insight ${sentinelInsightId.toString()} (verdict ${classification}): ${error}`);
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
/*
|
|
162
|
+
* Parse the mandatory trailing "Classification: <verdict>" line out of
|
|
163
|
+
* the triage analysis. The LAST match wins (the model may discuss the
|
|
164
|
+
* taxonomy earlier in its reasoning). Anything unparseable is Unknown —
|
|
165
|
+
* and Unknown never routes a fix, so a malformed answer fails closed.
|
|
166
|
+
*/
|
|
167
|
+
static parseClassification(analysisMarkdown) {
|
|
168
|
+
const matches = Array.from((analysisMarkdown || "").matchAll(/^\s*\**\s*classification\s*\**\s*[:=]\s*\**\s*(code-fault|user-error|expected-denial|infrastructure|unknown)\b/gim));
|
|
169
|
+
const last = matches[matches.length - 1];
|
|
170
|
+
if (!last || !last[1]) {
|
|
171
|
+
return ExceptionAIClassification.Unknown;
|
|
172
|
+
}
|
|
173
|
+
return last[1].toLowerCase();
|
|
174
|
+
}
|
|
175
|
+
/*
|
|
176
|
+
* Act on the triage verdict:
|
|
177
|
+
*
|
|
178
|
+
* 1. Stamp the verdict onto the exception group row (aiClassification)
|
|
179
|
+
* so the exceptions list can filter on it and the fix lane can skip
|
|
180
|
+
* known-non-defects without re-triaging.
|
|
181
|
+
* 2. code-fault → route the automatic fix (InsightFixRouting owns every
|
|
182
|
+
* gate: enableAi, enableInsightFixTasks, budget, readiness, dedupe)
|
|
183
|
+
* and flip the insight to FixOpened when a run was queued.
|
|
184
|
+
* 3. expected-denial → optionally auto-archive the exception group when
|
|
185
|
+
* the project opted in (autoArchiveNonActionableExceptions). Only
|
|
186
|
+
* expected denials are archived — user errors and infrastructure
|
|
187
|
+
* conditions stay visible for a human to judge.
|
|
188
|
+
*/
|
|
189
|
+
static async actOnClassification(data) {
|
|
190
|
+
const { insight, classification } = data;
|
|
191
|
+
if (!insight.id || !insight.projectId) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
/*
|
|
195
|
+
* The verdict stamp on the exception group is metadata and always
|
|
196
|
+
* lands; the AUTOMATION below (fix PR, auto-archive) additionally
|
|
197
|
+
* requires that no human closed the insight while the triage run sat
|
|
198
|
+
* in the queue or executed. The `insight` object is a snapshot from
|
|
199
|
+
* claim time — minutes to half an hour old — so the status MUST be
|
|
200
|
+
* re-read here: an insight a human Dismissed or Resolved in the
|
|
201
|
+
* meantime gets no PR and keeps its terminal status.
|
|
202
|
+
*/
|
|
203
|
+
if (insight.telemetryExceptionId) {
|
|
204
|
+
await TelemetryExceptionService.updateOneById({
|
|
205
|
+
id: insight.telemetryExceptionId,
|
|
206
|
+
data: {
|
|
207
|
+
aiClassification: classification,
|
|
120
208
|
},
|
|
209
|
+
props: { isRoot: true },
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
const currentInsight = await AIInsightService.findOneById({
|
|
213
|
+
id: insight.id,
|
|
214
|
+
select: {
|
|
215
|
+
_id: true,
|
|
216
|
+
status: true,
|
|
217
|
+
},
|
|
218
|
+
props: { isRoot: true },
|
|
219
|
+
});
|
|
220
|
+
if (!currentInsight ||
|
|
221
|
+
(currentInsight.status &&
|
|
222
|
+
AIInsightStatusHelper.isTerminalStatus(currentInsight.status))) {
|
|
223
|
+
logger.debug(`AI insights: skipping post-triage automation for insight ${insight.id.toString()} — insight is ${(currentInsight === null || currentInsight === void 0 ? void 0 : currentInsight.status) || "deleted"}.`);
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
const project = await ProjectService.findOneById({
|
|
227
|
+
id: insight.projectId,
|
|
228
|
+
select: {
|
|
229
|
+
_id: true,
|
|
230
|
+
enableAi: true,
|
|
231
|
+
enableInsightFixTasks: true,
|
|
232
|
+
autoArchiveNonActionableExceptions: true,
|
|
121
233
|
},
|
|
234
|
+
props: { isRoot: true },
|
|
122
235
|
});
|
|
236
|
+
if (!project) {
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
/*
|
|
240
|
+
* TraceLatencyRegression insights are fix-routed DETERMINISTICALLY at
|
|
241
|
+
* scan time (their span-tree evidence needs no LLM verdict — see
|
|
242
|
+
* InsightScanner.routeNewInsight); routing them again here would
|
|
243
|
+
* duplicate the run/PR. The verdict gate applies to exception
|
|
244
|
+
* insights only.
|
|
245
|
+
*/
|
|
246
|
+
const isVerdictGatedInsight = insight.insightType !== AIInsightType.TraceLatencyRegression;
|
|
247
|
+
if (classification === ExceptionAIClassification.CodeFault &&
|
|
248
|
+
isVerdictGatedInsight) {
|
|
249
|
+
const fixResult = await InsightFixRouting.routeInsightFix({
|
|
250
|
+
insight: insight,
|
|
251
|
+
project: project,
|
|
252
|
+
});
|
|
253
|
+
if (fixResult.fixAiRunId) {
|
|
254
|
+
/*
|
|
255
|
+
* Conditional flip: only a still-ActionRequired insight moves to
|
|
256
|
+
* FixOpened, so a dismissal landing between the status re-read
|
|
257
|
+
* above and this write can never be clobbered.
|
|
258
|
+
*/
|
|
259
|
+
await AIInsightService.updateOneBy({
|
|
260
|
+
query: {
|
|
261
|
+
_id: insight.id.toString(),
|
|
262
|
+
status: AIInsightStatus.ActionRequired,
|
|
263
|
+
},
|
|
264
|
+
data: {
|
|
265
|
+
status: AIInsightStatus.FixOpened,
|
|
266
|
+
fixAiRunId: fixResult.fixAiRunId,
|
|
267
|
+
},
|
|
268
|
+
props: { isRoot: true },
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
if (classification === ExceptionAIClassification.ExpectedDenial &&
|
|
274
|
+
project.autoArchiveNonActionableExceptions === true &&
|
|
275
|
+
insight.telemetryExceptionId) {
|
|
276
|
+
await TelemetryExceptionService.updateOneById({
|
|
277
|
+
id: insight.telemetryExceptionId,
|
|
278
|
+
data: {
|
|
279
|
+
isArchived: true,
|
|
280
|
+
markedAsArchivedAt: OneUptimeDate.getCurrentDate(),
|
|
281
|
+
},
|
|
282
|
+
props: { isRoot: true },
|
|
283
|
+
});
|
|
284
|
+
logger.debug(`AI insights: auto-archived exception ${insight.telemetryExceptionId.toString()} (expected-denial verdict, project opted in).`);
|
|
285
|
+
}
|
|
123
286
|
}
|
|
124
287
|
// Build the compact insight record that seeds the triage.
|
|
125
288
|
static buildInsightSummary(insight) {
|
|
@@ -159,7 +322,13 @@ export default class InsightTriageRunner {
|
|
|
159
322
|
lines.push("## Raw evidence values");
|
|
160
323
|
lines.push(renderedEvidence);
|
|
161
324
|
}
|
|
162
|
-
|
|
325
|
+
/*
|
|
326
|
+
* Detector detailMarkdown and evidence quote raw exception messages —
|
|
327
|
+
* sweep secrets/PII before the text reaches the LLM provider. (The
|
|
328
|
+
* chat/investigation toolbox path already redacts its tool results;
|
|
329
|
+
* this closes the same gap for the detector-supplied context.)
|
|
330
|
+
*/
|
|
331
|
+
return ToolResultSerializer.redact(lines.join("\n")).text;
|
|
163
332
|
}
|
|
164
333
|
/*
|
|
165
334
|
* Render the stored evidence JSON compactly: one line per populated
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InsightTriageRunner.js","sourceRoot":"","sources":["../../../../../../../Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,aAAa,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"InsightTriageRunner.js","sourceRoot":"","sources":["../../../../../../../Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -98,6 +98,37 @@ export default class SubjectCodeFixRun {
|
|
|
98
98
|
return ((_a = run.taskContext) === null || _a === void 0 ? void 0 : _a.traceId) === data.traceId;
|
|
99
99
|
}) || null);
|
|
100
100
|
}
|
|
101
|
+
/*
|
|
102
|
+
* Per-(service, recipe) dedupe for the service-scoped instrumentation
|
|
103
|
+
* recipes (ImproveLogging / ImproveTracing): at most one non-terminal
|
|
104
|
+
* run of a recipe per (project, telemetryServiceId). Same in-memory
|
|
105
|
+
* taskContext matching as the per-trace guard above — the id lives in
|
|
106
|
+
* JSON the Query layer cannot filter on, and the candidate set is
|
|
107
|
+
* bounded and rare.
|
|
108
|
+
*/
|
|
109
|
+
static async findNonTerminalRunForTelemetryService(data) {
|
|
110
|
+
const activeRuns = await AIRunService.findBy({
|
|
111
|
+
query: {
|
|
112
|
+
projectId: data.projectId,
|
|
113
|
+
runType: AIRunType.CodeFix,
|
|
114
|
+
codeFixTaskType: data.taskType,
|
|
115
|
+
status: QueryHelper.notIn([
|
|
116
|
+
AIRunStatus.Completed,
|
|
117
|
+
AIRunStatus.Error,
|
|
118
|
+
AIRunStatus.Cancelled,
|
|
119
|
+
AIRunStatus.Stale,
|
|
120
|
+
]),
|
|
121
|
+
},
|
|
122
|
+
select: { _id: true, taskContext: true },
|
|
123
|
+
limit: LIMIT_PER_PROJECT,
|
|
124
|
+
skip: 0,
|
|
125
|
+
props: { isRoot: true },
|
|
126
|
+
});
|
|
127
|
+
return (activeRuns.find((run) => {
|
|
128
|
+
var _a;
|
|
129
|
+
return ((_a = run.taskContext) === null || _a === void 0 ? void 0 : _a.telemetryServiceId) === data.telemetryServiceId;
|
|
130
|
+
}) || null);
|
|
131
|
+
}
|
|
101
132
|
/*
|
|
102
133
|
* Record the durable intent as a Queued CodeFix AIRun that the external
|
|
103
134
|
* agent worker claims via /ai-agent-task/get-pending-task. `userId` is
|
|
@@ -158,6 +189,12 @@ __decorate([
|
|
|
158
189
|
__metadata("design:paramtypes", [Object]),
|
|
159
190
|
__metadata("design:returntype", Promise)
|
|
160
191
|
], SubjectCodeFixRun, "findNonTerminalPerformanceFixRunForTrace", null);
|
|
192
|
+
__decorate([
|
|
193
|
+
CaptureSpan(),
|
|
194
|
+
__metadata("design:type", Function),
|
|
195
|
+
__metadata("design:paramtypes", [Object]),
|
|
196
|
+
__metadata("design:returntype", Promise)
|
|
197
|
+
], SubjectCodeFixRun, "findNonTerminalRunForTelemetryService", null);
|
|
161
198
|
__decorate([
|
|
162
199
|
CaptureSpan(),
|
|
163
200
|
__metadata("design:type", Function),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubjectCodeFixRun.js","sourceRoot":"","sources":["../../../../../../Server/Utils/AI/SRE/SubjectCodeFixRun.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"SubjectCodeFixRun.js","sourceRoot":"","sources":["../../../../../../Server/Utils/AI/SRE/SubjectCodeFixRun.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import CodeFixTaskType from "../../../../Types/AI/CodeFixTaskType";
|
|
11
|
+
import BadDataException from "../../../../Types/Exception/BadDataException";
|
|
12
|
+
import ServiceService from "../../../Services/ServiceService";
|
|
13
|
+
import SubjectCodeFixRun from "./SubjectCodeFixRun";
|
|
14
|
+
import CaptureSpan from "../../Telemetry/CaptureSpan";
|
|
15
|
+
/*
|
|
16
|
+
* AI SRE — the service-scoped instrumentation-improvement triggers:
|
|
17
|
+
* ImproveLogging and ImproveTracing. One click on a service's Logs or
|
|
18
|
+
* Traces page opens a draft PR that improves that service's logging or
|
|
19
|
+
* tracing hygiene — parameterized log messages, correct severities, spans
|
|
20
|
+
* on uninstrumented paths, proper exception recording — WITHOUT changing
|
|
21
|
+
* behavior.
|
|
22
|
+
*
|
|
23
|
+
* Like FixFromIncident and FixPerformance these are human-triggered from a
|
|
24
|
+
* user-facing endpoint (POST /ai-investigation/
|
|
25
|
+
* create-telemetry-improvement-task), so there is no project opt-in flag —
|
|
26
|
+
* the human in the loop IS the gate — and every unmet gate FAILS EARLY
|
|
27
|
+
* with a clear message. The recipe's grounding is the SERVICE: repository
|
|
28
|
+
* resolution at task-details time uses the service name (name-match /
|
|
29
|
+
* only-repository), the same path the incident-subject recipes use.
|
|
30
|
+
*/
|
|
31
|
+
export default class TelemetryImprovementTaskTrigger {
|
|
32
|
+
/*
|
|
33
|
+
* Gate and enqueue an ImproveLogging / ImproveTracing CodeFix run for a
|
|
34
|
+
* telemetry service. The caller must already have loaded the service
|
|
35
|
+
* under the USER's permissions (the access check) — this method reads
|
|
36
|
+
* and writes as root.
|
|
37
|
+
*
|
|
38
|
+
* Throws BadDataException naming the failed gate: unsupported recipe, no
|
|
39
|
+
* GitHub-App repository, a duplicate active run for the same service, or
|
|
40
|
+
* (via enqueueSubjectCodeFixRun) the daily fix-run budget.
|
|
41
|
+
*/
|
|
42
|
+
static async createTelemetryImprovementTask(data) {
|
|
43
|
+
var _a;
|
|
44
|
+
if (data.taskType !== CodeFixTaskType.ImproveLogging &&
|
|
45
|
+
data.taskType !== CodeFixTaskType.ImproveTracing) {
|
|
46
|
+
throw new BadDataException(`Task type "${data.taskType}" is not a telemetry-improvement recipe. Supported: ${CodeFixTaskType.ImproveLogging}, ${CodeFixTaskType.ImproveTracing}.`);
|
|
47
|
+
}
|
|
48
|
+
const service = await ServiceService.findOneById({
|
|
49
|
+
id: data.telemetryServiceId,
|
|
50
|
+
select: {
|
|
51
|
+
_id: true,
|
|
52
|
+
name: true,
|
|
53
|
+
projectId: true,
|
|
54
|
+
},
|
|
55
|
+
props: { isRoot: true },
|
|
56
|
+
});
|
|
57
|
+
if (!service ||
|
|
58
|
+
((_a = service.projectId) === null || _a === void 0 ? void 0 : _a.toString()) !== data.projectId.toString()) {
|
|
59
|
+
throw new BadDataException("Telemetry service not found.");
|
|
60
|
+
}
|
|
61
|
+
// Gate — a repository the agent can actually open a PR against.
|
|
62
|
+
const hasConnectedRepository = await SubjectCodeFixRun.hasGitHubAppConnectedRepository(data.projectId);
|
|
63
|
+
if (!hasConnectedRepository) {
|
|
64
|
+
throw new BadDataException("No GitHub-App-connected repository exists for this project, so the agent has nowhere to open the pull request. Connect one under AI > Code Repositories.");
|
|
65
|
+
}
|
|
66
|
+
/*
|
|
67
|
+
* Gate — per-(service, recipe) dedupe: repeated clicks must not fan
|
|
68
|
+
* out into duplicate PRs.
|
|
69
|
+
*/
|
|
70
|
+
const existingRun = await SubjectCodeFixRun.findNonTerminalRunForTelemetryService({
|
|
71
|
+
projectId: data.projectId,
|
|
72
|
+
taskType: data.taskType,
|
|
73
|
+
telemetryServiceId: data.telemetryServiceId.toString(),
|
|
74
|
+
});
|
|
75
|
+
if (existingRun) {
|
|
76
|
+
throw new BadDataException(`An ${data.taskType === CodeFixTaskType.ImproveLogging
|
|
77
|
+
? "improve-logging"
|
|
78
|
+
: "improve-tracing"} task is already queued or running for this service. Track its progress on the AI > Tasks page.`);
|
|
79
|
+
}
|
|
80
|
+
const taskContext = {
|
|
81
|
+
telemetryServiceId: data.telemetryServiceId.toString(),
|
|
82
|
+
serviceName: service.name || undefined,
|
|
83
|
+
};
|
|
84
|
+
return SubjectCodeFixRun.enqueueSubjectCodeFixRun({
|
|
85
|
+
projectId: data.projectId,
|
|
86
|
+
taskType: data.taskType,
|
|
87
|
+
userId: data.userId,
|
|
88
|
+
taskContext,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
__decorate([
|
|
93
|
+
CaptureSpan(),
|
|
94
|
+
__metadata("design:type", Function),
|
|
95
|
+
__metadata("design:paramtypes", [Object]),
|
|
96
|
+
__metadata("design:returntype", Promise)
|
|
97
|
+
], TelemetryImprovementTaskTrigger, "createTelemetryImprovementTask", null);
|
|
98
|
+
//# sourceMappingURL=TelemetryImprovementTaskTrigger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TelemetryImprovementTaskTrigger.js","sourceRoot":"","sources":["../../../../../../Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,eAAe,MAAM,sCAAsC,CAAC;AAEnE,OAAO,gBAAgB,MAAM,8CAA8C,CAAC;AAG5E,OAAO,cAAc,MAAM,kCAAkC,CAAC;AAC9D,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,WAAW,MAAM,6BAA6B,CAAC;AAEtD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,OAAO,OAAO,+BAA+B;IAClD;;;;;;;;;OASG;IAEiB,AAAb,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,IAKlD;;QACC,IACE,IAAI,CAAC,QAAQ,KAAK,eAAe,CAAC,cAAc;YAChD,IAAI,CAAC,QAAQ,KAAK,eAAe,CAAC,cAAc,EAChD,CAAC;YACD,MAAM,IAAI,gBAAgB,CACxB,cAAc,IAAI,CAAC,QAAQ,uDAAuD,eAAe,CAAC,cAAc,KAAK,eAAe,CAAC,cAAc,GAAG,CACvJ,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAmB,MAAM,cAAc,CAAC,WAAW,CAAC;YAC/D,EAAE,EAAE,IAAI,CAAC,kBAAkB;YAC3B,MAAM,EAAE;gBACN,GAAG,EAAE,IAAI;gBACT,IAAI,EAAE,IAAI;gBACV,SAAS,EAAE,IAAI;aAChB;YACD,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;SACxB,CAAC,CAAC;QAEH,IACE,CAAC,OAAO;YACR,CAAA,MAAA,OAAO,CAAC,SAAS,0CAAE,QAAQ,EAAE,MAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,EAC3D,CAAC;YACD,MAAM,IAAI,gBAAgB,CAAC,8BAA8B,CAAC,CAAC;QAC7D,CAAC;QAED,gEAAgE;QAChE,MAAM,sBAAsB,GAC1B,MAAM,iBAAiB,CAAC,+BAA+B,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE1E,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC5B,MAAM,IAAI,gBAAgB,CACxB,0JAA0J,CAC3J,CAAC;QACJ,CAAC;QAED;;;WAGG;QACH,MAAM,WAAW,GACf,MAAM,iBAAiB,CAAC,qCAAqC,CAAC;YAC5D,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE;SACvD,CAAC,CAAC;QAEL,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,IAAI,gBAAgB,CACxB,MACE,IAAI,CAAC,QAAQ,KAAK,eAAe,CAAC,cAAc;gBAC9C,CAAC,CAAC,iBAAiB;gBACnB,CAAC,CAAC,iBACN,iGAAiG,CAClG,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAuB;YACtC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE;YACtD,WAAW,EAAE,OAAO,CAAC,IAAI,IAAI,SAAS;SACvC,CAAC;QAEF,OAAO,iBAAiB,CAAC,wBAAwB,CAAC;YAChD,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW;SACZ,CAAC,CAAC;IACL,CAAC;CACF;AA3EqB;IADnB,WAAW,EAAE;;;;2EA2Eb"}
|
|
@@ -9,7 +9,8 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
9
9
|
};
|
|
10
10
|
import MonitorProbeService from "../../Services/MonitorProbeService";
|
|
11
11
|
import MonitorService from "../../Services/MonitorService";
|
|
12
|
-
import MonitorStatusTimelineService from "../../Services/MonitorStatusTimelineService";
|
|
12
|
+
import MonitorStatusTimelineService, { MONITOR_STATUS_SAME_AS_PREVIOUS_ERROR_MESSAGE, MONITOR_STATUS_TIMELINE_LOCK_ERROR_MESSAGE, } from "../../Services/MonitorStatusTimelineService";
|
|
13
|
+
import ServerException from "../../../Types/Exception/ServerException";
|
|
13
14
|
import logger from "../Logger";
|
|
14
15
|
import MonitorCriteriaEvaluator from "./MonitorCriteriaEvaluator";
|
|
15
16
|
import MonitorLogUtil from "./MonitorLogUtil";
|
|
@@ -727,6 +728,14 @@ export default class MonitorResourceUtil {
|
|
|
727
728
|
monitorStatusTimeline.statusChangeLog = JSON.parse(JSON.stringify(dataToProcess));
|
|
728
729
|
monitorStatusTimeline.rootCause =
|
|
729
730
|
"No monitoring criteria met. Change to default status. ";
|
|
731
|
+
/*
|
|
732
|
+
* Tracks whether the monitor really is at its default status after the
|
|
733
|
+
* create call, so the summary event below records only what actually
|
|
734
|
+
* happened. On the lock-skip path the write was REFUSED - recording a
|
|
735
|
+
* "reverted" event there would put a false entry in the monitor log and
|
|
736
|
+
* mask the very lock failure the error log surfaces.
|
|
737
|
+
*/
|
|
738
|
+
let revertedToDefaultStatus = true;
|
|
730
739
|
try {
|
|
731
740
|
await MonitorStatusTimelineService.create({
|
|
732
741
|
data: monitorStatusTimeline,
|
|
@@ -745,23 +754,36 @@ export default class MonitorResourceUtil {
|
|
|
745
754
|
* exact message so unrelated BadDataExceptions still propagate.
|
|
746
755
|
*/
|
|
747
756
|
if (err instanceof BadDataException &&
|
|
748
|
-
err.message ===
|
|
749
|
-
"Monitor Status cannot be same as previous status.") {
|
|
757
|
+
err.message === MONITOR_STATUS_SAME_AS_PREVIOUS_ERROR_MESSAGE) {
|
|
750
758
|
logger.debug(`${dataToProcess.monitorId.toString()} - Monitor status already at default; skipping duplicate status timeline (concurrent race).`);
|
|
751
759
|
}
|
|
760
|
+
else if (err instanceof ServerException &&
|
|
761
|
+
err.message === MONITOR_STATUS_TIMELINE_LOCK_ERROR_MESSAGE) {
|
|
762
|
+
/*
|
|
763
|
+
* The per-monitor timeline mutex could not be acquired (fail-closed
|
|
764
|
+
* create, see MonitorStatusTimelineService). Skipping is recoverable:
|
|
765
|
+
* the next probe result re-evaluates the same criteria and recreates
|
|
766
|
+
* the revert-to-default, while failing here would abort the whole
|
|
767
|
+
* ingest run and lose the monitor log for this probe result.
|
|
768
|
+
*/
|
|
769
|
+
logger.error(`${dataToProcess.monitorId.toString()} - Could not acquire the monitor status timeline lock; skipping revert to default status. It will be retried on the next probe result.`);
|
|
770
|
+
revertedToDefaultStatus = false;
|
|
771
|
+
}
|
|
752
772
|
else {
|
|
753
773
|
throw err;
|
|
754
774
|
}
|
|
755
775
|
}
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
776
|
+
if (revertedToDefaultStatus) {
|
|
777
|
+
const defaultStatusName = await getMonitorStatusName(monitorSteps.data.defaultMonitorStatusId);
|
|
778
|
+
evaluationSummary.events.push({
|
|
779
|
+
type: "monitor-status-changed",
|
|
780
|
+
title: "Monitor status reverted",
|
|
781
|
+
message: defaultStatusName
|
|
782
|
+
? `Monitor status reverted to "${defaultStatusName}" because no monitoring criteria were met.`
|
|
783
|
+
: "Monitor status reverted to its default state because no monitoring criteria were met.",
|
|
784
|
+
at: OneUptimeDate.getCurrentDate(),
|
|
785
|
+
});
|
|
786
|
+
}
|
|
765
787
|
}
|
|
766
788
|
}
|
|
767
789
|
await releaseMutex();
|