@oneuptime/common 11.5.4 → 11.5.5
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/DatabaseModels/AIAgentTaskPullRequest.ts +56 -45
- package/Models/DatabaseModels/AIInsight.ts +748 -0
- package/Models/DatabaseModels/AIRun.ts +262 -0
- package/Models/DatabaseModels/CodeRepository.ts +42 -0
- package/Models/DatabaseModels/GlobalConfig.ts +105 -0
- package/Models/DatabaseModels/Index.ts +4 -8
- package/Models/DatabaseModels/InstanceHealthLog.ts +277 -0
- package/Models/DatabaseModels/LlmLog.ts +33 -0
- package/Models/DatabaseModels/Project.ts +123 -6
- package/Models/DatabaseModels/Runbook.ts +1 -1
- package/Server/API/AIAgentDataAPI.ts +802 -140
- package/Server/API/AIAgentTaskAPI.ts +132 -69
- package/Server/API/AIAgentTaskLogAPI.ts +65 -41
- package/Server/API/AIAgentTaskPullRequestAPI.ts +41 -0
- package/Server/API/AIInsightAPI.ts +220 -0
- package/Server/API/AIInvestigationAPI.ts +363 -1
- package/Server/API/CodeFixRunAPI.ts +251 -0
- package/Server/API/GitHubAPI.ts +246 -3
- package/Server/API/TelemetryExceptionAPI.ts +193 -48
- package/Server/EnvironmentConfig.ts +1 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783943300000-DropServiceCodeRepository.ts +26 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783947444597-CodeFixRunsOnAIRun.ts +73 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783950962813-AddCodeFixTaskType.ts +29 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783954040984-AddInstrumentationFixTasksFlag.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783957160597-MigrationName.ts +51 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783958542237-AddTaskContextToAIRun.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783965945957-AddInvestigationVerdictAndGrade.ts +47 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783970619301-AddFixGuardrailColumns.ts +53 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783970619302-DropLegacyAIAgentTaskTables.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783977781677-AddCiStatusToFixPullRequests.ts +37 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1783990000000-AddCompletionTokensToLlmLog.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784010274993-AddSentinelInsight.ts +75 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784010274994-AddSentinelInsightFlags.ts +37 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784030612266-RenameSentinelToAI.ts +203 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784033837629-MigrationName.ts +163 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +30 -0
- package/Server/Infrastructure/Queue.ts +82 -4
- package/Server/Infrastructure/Semaphore.ts +62 -1
- package/Server/Services/AIAgentService.ts +32 -0
- package/Server/Services/AIAgentTaskPullRequestService.ts +117 -0
- package/Server/Services/AIInsightService.ts +174 -0
- package/Server/Services/AIRunEventService.ts +63 -0
- package/Server/Services/AIRunService.ts +259 -1
- package/Server/Services/AIService.ts +249 -7
- package/Server/Services/AlertService.ts +4 -4
- package/Server/Services/CodeRepositoryService.ts +209 -0
- package/Server/Services/GlobalConfigService.ts +148 -0
- package/Server/Services/IncidentService.ts +183 -38
- package/Server/Services/IncidentStateTimelineService.ts +24 -4
- package/Server/Services/Index.ts +4 -4
- package/Server/Services/{AIAgentTaskLogService.ts → InstanceHealthLogService.ts} +1 -1
- package/Server/Services/LlmLogService.ts +27 -0
- package/Server/Services/LlmProviderService.ts +108 -0
- package/Server/Services/MetricBaselineService.ts +123 -0
- package/Server/Services/MonitorService.ts +15 -0
- package/Server/Services/TelemetryExceptionService.ts +323 -116
- package/Server/Services/TraceAggregationService.ts +176 -0
- package/Server/Types/Workflow/ComponentCode.ts +6 -0
- package/Server/Types/Workflow/Components/AI/GenerateText.ts +326 -0
- package/Server/Types/Workflow/Components/Index.ts +2 -0
- package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +1 -1
- package/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.ts +71 -0
- package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +243 -0
- package/Server/Utils/AI/CodeFix/CodeFixRunQueue.ts +131 -0
- package/Server/Utils/AI/CodeFix/FixRunBudget.ts +148 -0
- package/Server/Utils/AI/CodeFix/OpenPullRequestCap.ts +117 -0
- package/Server/Utils/AI/Eval/EvalCorpus.ts +369 -0
- package/Server/Utils/AI/Eval/EvalScores.ts +172 -0
- package/Server/Utils/AI/Eval/ReplayInvestigation.ts +87 -0
- package/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.ts +676 -0
- package/Server/Utils/AI/{Sentinel/SentinelInvestigationEngine.ts → SRE/AIInvestigationEngine.ts} +58 -37
- package/Server/Utils/AI/{Sentinel/SentinelMemory.ts → SRE/AIMemory.ts} +3 -3
- package/Server/Utils/AI/{Sentinel → SRE}/AlertInvestigationRunner.ts +50 -20
- package/Server/Utils/AI/SRE/ConfidenceSignal.ts +293 -0
- package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +115 -0
- package/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.ts +223 -0
- package/Server/Utils/AI/{Sentinel → SRE}/IncidentInvestigationRunner.ts +71 -21
- package/Server/Utils/AI/{Sentinel → SRE}/IncidentPostmortemRunner.ts +8 -8
- package/Server/Utils/AI/SRE/Insights/Detectors/ErrorLogSpikeDetector.ts +364 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +317 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/Index.ts +27 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/MetricDriftDetector.ts +221 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +238 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/TraceLatencyRegressionDetector.ts +521 -0
- package/Server/Utils/AI/SRE/Insights/FixRouting.ts +242 -0
- package/Server/Utils/AI/SRE/Insights/InsightScanner.ts +290 -0
- package/Server/Utils/AI/SRE/Insights/InsightStore.ts +283 -0
- package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +242 -0
- package/Server/Utils/AI/SRE/Insights/Triage.ts +162 -0
- package/Server/Utils/AI/SRE/Insights/Types.ts +49 -0
- package/Server/Utils/AI/SRE/InstrumentationTaskTrigger.ts +212 -0
- package/Server/Utils/AI/SRE/InvestigationGrader.ts +282 -0
- package/Server/Utils/AI/{Sentinel → SRE}/InvestigationQueue.ts +114 -19
- package/Server/Utils/AI/{Sentinel → SRE}/README.md +4 -4
- package/Server/Utils/AI/SRE/SubjectCodeFixRun.ts +172 -0
- package/Server/Utils/AI/Toolbox/{SentinelActionTools.ts → AIActionTools.ts} +22 -1
- package/Server/Utils/AI/Toolbox/Index.ts +2 -2
- package/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.ts +526 -0
- package/Server/Utils/CodeRepository/GitHub/GitHub.ts +319 -1
- package/Server/Utils/CodeRepository/ServiceRepoLinkSuggester.ts +221 -0
- package/Server/Utils/CodeRepository/StackTraceRepoResolver.ts +571 -0
- package/Server/Utils/Execute.ts +2 -1
- package/Server/Utils/LLM/LLMService.ts +160 -30
- package/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.ts +152 -0
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +29 -0
- package/Tests/Server/Infrastructure/Queue.test.ts +227 -0
- package/Tests/Server/Infrastructure/SemaphorePermit.test.ts +159 -0
- package/Tests/Server/Services/AIAgentTaskPullRequestOutcomeStats.test.ts +154 -0
- package/Tests/Server/Services/AIInsightService.test.ts +324 -0
- package/Tests/Server/Services/AIRunCodeFixClaim.test.ts +401 -0
- package/Tests/Server/Services/AIRunHumanVerdict.test.ts +161 -0
- package/Tests/Server/Services/AIServiceDailyBudget.test.ts +95 -5
- package/Tests/Server/Services/AIServiceProjectAccess.test.ts +259 -0
- package/Tests/Server/Services/FixFromIncidentTaskTrigger.test.ts +249 -0
- package/Tests/Server/Services/FixPerformanceTaskTrigger.test.ts +274 -0
- package/Tests/Server/Services/GlobalConfigService.test.ts +80 -0
- package/Tests/Server/Services/IncidentInternalNoteAnnouncement.test.ts +1 -1
- package/Tests/Server/Services/InstrumentationTaskTrigger.test.ts +313 -0
- package/Tests/Server/Services/LlmProviderProjectOwned.test.ts +132 -0
- package/Tests/Server/Services/TelemetryExceptionAIFixReadiness.test.ts +405 -0
- package/Tests/Server/Services/TelemetryExceptionCodeFixRun.test.ts +322 -0
- package/Tests/Server/Services/TraceServiceLatencyProfile.test.ts +278 -0
- package/Tests/Server/Types/Workflow/Components/AIGenerateText.test.ts +722 -0
- package/Tests/Server/Utils/AI/{SentinelAlertGating.test.ts → AIAlertGating.test.ts} +19 -19
- package/Tests/Server/Utils/AI/AIConfidenceSignal.test.ts +362 -0
- package/Tests/Server/Utils/AI/{SentinelInvestigationQueue.test.ts → AIInvestigationQueue.test.ts} +19 -19
- package/Tests/Server/Utils/AI/CodeAgentWorkspaceGuard.test.ts +138 -0
- package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +335 -0
- package/Tests/Server/Utils/AI/CodeFixRunQueue.test.ts +134 -0
- package/Tests/Server/Utils/AI/EvalCorpus.test.ts +209 -0
- package/Tests/Server/Utils/AI/EvalScores.test.ts +343 -0
- package/Tests/Server/Utils/AI/FixRunBudget.test.ts +218 -0
- package/Tests/Server/Utils/AI/Insights/ErrorLogSpikeDetector.test.ts +437 -0
- package/Tests/Server/Utils/AI/Insights/ExceptionSpikeDetector.test.ts +287 -0
- package/Tests/Server/Utils/AI/Insights/InsightDetectorsIndex.test.ts +34 -0
- package/Tests/Server/Utils/AI/Insights/InsightFixRouting.test.ts +572 -0
- package/Tests/Server/Utils/AI/Insights/InsightNeverThrowsHardening.test.ts +344 -0
- package/Tests/Server/Utils/AI/Insights/InsightScanner.test.ts +720 -0
- package/Tests/Server/Utils/AI/Insights/InsightStore.test.ts +467 -0
- package/Tests/Server/Utils/AI/Insights/InsightStoreHardening.test.ts +370 -0
- package/Tests/Server/Utils/AI/Insights/InsightTriage.test.ts +210 -0
- package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +221 -0
- package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +328 -0
- package/Tests/Server/Utils/AI/Insights/MetricBaselineDrift.test.ts +182 -0
- package/Tests/Server/Utils/AI/Insights/MetricDriftDetector.test.ts +280 -0
- package/Tests/Server/Utils/AI/Insights/NewExceptionDetector.test.ts +259 -0
- package/Tests/Server/Utils/AI/Insights/TraceLatencyRegressionDetector.test.ts +770 -0
- package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +343 -0
- package/Tests/Server/Utils/AI/LLMServiceRequestPolicy.test.ts +307 -0
- package/Tests/Server/Utils/AI/OpenPullRequestCap.test.ts +170 -0
- package/Tests/Server/Utils/AI/SpanTreeAnalyzer.test.ts +559 -0
- package/Tests/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.test.ts +158 -0
- package/Tests/Server/Utils/GitHubCheckRunsConclusion.test.ts +100 -0
- package/Tests/Server/Utils/GitHubPullRequestStateMapping.test.ts +50 -0
- package/Tests/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.test.ts +266 -0
- package/Tests/Server/Utils/ServiceRepoLinkSuggester.test.ts +167 -0
- package/Tests/Server/Utils/StackTraceRepoResolver.test.ts +527 -0
- package/Tests/Types/AI/AIChatPermissionMode.test.ts +112 -0
- package/Tests/Types/AI/CodeFixTaskType.test.ts +152 -0
- package/Tests/Types/AI/FixPullRequestCiStatus.test.ts +181 -0
- package/Tests/Types/Monitor/MonitorStepSqlMonitor.test.ts +110 -0
- package/Tests/Types/Monitor/SqlDatabaseType.test.ts +55 -0
- package/Tests/Types/Workflow/AIGenerateTextMetadata.test.ts +180 -0
- package/Tests/UI/Components/TableBulkCsvExport.test.tsx +168 -0
- package/Tests/UI/Utils/TableColumnsToCsv.test.ts +523 -0
- package/Types/AI/AIChatTypes.ts +8 -0
- package/Types/AI/AIInsightEvidence.ts +77 -0
- package/Types/AI/AIInsightHumanVerdict.ts +15 -0
- package/Types/AI/AIInsightSeverity.ts +13 -0
- package/Types/AI/AIInsightStatus.ts +38 -0
- package/Types/AI/AIInsightType.ts +41 -0
- package/Types/AI/AIRunAutoGrade.ts +18 -0
- package/Types/AI/AIRunEventType.ts +5 -0
- package/Types/AI/AIRunHumanVerdict.ts +17 -0
- package/Types/AI/AIRunType.ts +6 -0
- package/Types/AI/CodeFixTaskContext.ts +88 -0
- package/Types/AI/CodeFixTaskType.ts +132 -0
- package/Types/AI/FixPullRequestCiStatus.ts +132 -0
- package/Types/BaseDatabase/AggregationIntervalUtil.ts +67 -0
- package/Types/Incident/IncidentMetricType.ts +7 -0
- package/Types/Monitor/CriteriaFilter.ts +8 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +67 -0
- package/Types/Monitor/MonitorStep.ts +38 -0
- package/Types/Monitor/MonitorStepSqlMonitor.ts +141 -0
- package/Types/Monitor/MonitorType.ts +17 -0
- package/Types/Monitor/SqlDatabaseType.ts +49 -0
- package/Types/Monitor/SqlMonitor/SqlMonitorResponse.ts +28 -0
- package/Types/Permission.ts +11 -95
- package/Types/Probe/ProbeMonitorResponse.ts +2 -0
- package/Types/Runbook/RunbookStep.ts +26 -2
- package/Types/Runbook/RunbookStepType.ts +1 -0
- package/Types/Workflow/Component.ts +13 -0
- package/Types/Workflow/ComponentID.ts +1 -0
- package/Types/Workflow/Components/AI.ts +148 -0
- package/Types/Workflow/Components.ts +8 -0
- package/UI/Components/AI/GenerateFromAIModal.tsx +1 -1
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +11 -0
- package/UI/Components/MoreMenu/MoreMenu.tsx +1 -1
- package/UI/Components/Table/Table.tsx +38 -2
- package/UI/Utils/TableColumnsToCsv.ts +385 -0
- package/Utils/Monitor/MonitorMetricType.ts +1 -0
- package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js +59 -45
- package/build/dist/Models/DatabaseModels/AIAgentTaskPullRequest.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AIInsight.js +795 -0
- package/build/dist/Models/DatabaseModels/AIInsight.js.map +1 -0
- package/build/dist/Models/DatabaseModels/AIRun.js +274 -0
- package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CodeRepository.js +43 -0
- package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +110 -0
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +4 -8
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/InstanceHealthLog.js +304 -0
- package/build/dist/Models/DatabaseModels/InstanceHealthLog.js.map +1 -0
- package/build/dist/Models/DatabaseModels/LlmLog.js +35 -0
- package/build/dist/Models/DatabaseModels/LlmLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +127 -6
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Runbook.js +1 -1
- package/build/dist/Models/DatabaseModels/Runbook.js.map +1 -1
- package/build/dist/Server/API/AIAgentDataAPI.js +568 -85
- package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
- package/build/dist/Server/API/AIAgentTaskAPI.js +100 -44
- package/build/dist/Server/API/AIAgentTaskAPI.js.map +1 -1
- package/build/dist/Server/API/AIAgentTaskLogAPI.js +49 -25
- package/build/dist/Server/API/AIAgentTaskLogAPI.js.map +1 -1
- package/build/dist/Server/API/AIAgentTaskPullRequestAPI.js +27 -0
- package/build/dist/Server/API/AIAgentTaskPullRequestAPI.js.map +1 -1
- package/build/dist/Server/API/AIInsightAPI.js +140 -0
- package/build/dist/Server/API/AIInsightAPI.js.map +1 -0
- package/build/dist/Server/API/AIInvestigationAPI.js +257 -1
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/CodeFixRunAPI.js +181 -0
- package/build/dist/Server/API/CodeFixRunAPI.js.map +1 -0
- package/build/dist/Server/API/GitHubAPI.js +164 -2
- package/build/dist/Server/API/GitHubAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryExceptionAPI.js +148 -43
- package/build/dist/Server/API/TelemetryExceptionAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +1 -1
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783943300000-DropServiceCodeRepository.js +23 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783943300000-DropServiceCodeRepository.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783947444597-CodeFixRunsOnAIRun.js +32 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783947444597-CodeFixRunsOnAIRun.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783950962813-AddCodeFixTaskType.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783950962813-AddCodeFixTaskType.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783954040984-AddInstrumentationFixTasksFlag.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783954040984-AddInstrumentationFixTasksFlag.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783957160597-MigrationName.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783957160597-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783958542237-AddTaskContextToAIRun.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783958542237-AddTaskContextToAIRun.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783965945957-AddInvestigationVerdictAndGrade.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783965945957-AddInvestigationVerdictAndGrade.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619301-AddFixGuardrailColumns.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619301-AddFixGuardrailColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619302-DropLegacyAIAgentTaskTables.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783970619302-DropLegacyAIAgentTaskTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783977781677-AddCiStatusToFixPullRequests.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783977781677-AddCiStatusToFixPullRequests.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783990000000-AddCompletionTokensToLlmLog.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783990000000-AddCompletionTokensToLlmLog.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274993-AddSentinelInsight.js +32 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274993-AddSentinelInsight.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274994-AddSentinelInsightFlags.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784010274994-AddSentinelInsightFlags.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784030612266-RenameSentinelToAI.js +125 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784030612266-RenameSentinelToAI.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784033837629-MigrationName.js +62 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784033837629-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +30 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Queue.js +73 -3
- package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
- package/build/dist/Server/Infrastructure/Semaphore.js +44 -1
- package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
- package/build/dist/Server/Services/AIAgentService.js +29 -0
- package/build/dist/Server/Services/AIAgentService.js.map +1 -1
- package/build/dist/Server/Services/AIAgentTaskPullRequestService.js +78 -0
- package/build/dist/Server/Services/AIAgentTaskPullRequestService.js.map +1 -1
- package/build/dist/Server/Services/AIInsightService.js +164 -0
- package/build/dist/Server/Services/AIInsightService.js.map +1 -0
- package/build/dist/Server/Services/AIRunEventService.js +49 -0
- package/build/dist/Server/Services/AIRunEventService.js.map +1 -1
- package/build/dist/Server/Services/AIRunService.js +221 -0
- package/build/dist/Server/Services/AIRunService.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +198 -11
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +4 -4
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/CodeRepositoryService.js +180 -0
- package/build/dist/Server/Services/CodeRepositoryService.js.map +1 -1
- package/build/dist/Server/Services/GlobalConfigService.js +84 -0
- package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +149 -37
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentStateTimelineService.js +24 -4
- package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +4 -4
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/{AIAgentTaskLogService.js → InstanceHealthLogService.js} +2 -2
- package/build/dist/Server/Services/InstanceHealthLogService.js.map +1 -0
- package/build/dist/Server/Services/LlmLogService.js +23 -0
- package/build/dist/Server/Services/LlmLogService.js.map +1 -1
- package/build/dist/Server/Services/LlmProviderService.js +96 -0
- package/build/dist/Server/Services/LlmProviderService.js.map +1 -1
- package/build/dist/Server/Services/MetricBaselineService.js +65 -0
- package/build/dist/Server/Services/MetricBaselineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +9 -1
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryExceptionService.js +243 -82
- package/build/dist/Server/Services/TelemetryExceptionService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +124 -0
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Types/Workflow/ComponentCode.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/AI/GenerateText.js +240 -0
- package/build/dist/Server/Types/Workflow/Components/AI/GenerateText.js.map +1 -0
- package/build/dist/Server/Types/Workflow/Components/Index.js +2 -0
- package/build/dist/Server/Types/Workflow/Components/Index.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js +48 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js.map +1 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +174 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixRunQueue.js +126 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixRunQueue.js.map +1 -0
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +131 -0
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -0
- package/build/dist/Server/Utils/AI/CodeFix/OpenPullRequestCap.js +99 -0
- package/build/dist/Server/Utils/AI/CodeFix/OpenPullRequestCap.js.map +1 -0
- package/build/dist/Server/Utils/AI/Eval/EvalCorpus.js +245 -0
- package/build/dist/Server/Utils/AI/Eval/EvalCorpus.js.map +1 -0
- package/build/dist/Server/Utils/AI/Eval/EvalScores.js +83 -0
- package/build/dist/Server/Utils/AI/Eval/EvalScores.js.map +1 -0
- package/build/dist/Server/Utils/AI/Eval/ReplayInvestigation.js +12 -0
- package/build/dist/Server/Utils/AI/Eval/ReplayInvestigation.js.map +1 -0
- package/build/dist/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.js +439 -0
- package/build/dist/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.js.map +1 -0
- package/build/dist/Server/Utils/AI/{Sentinel/SentinelInvestigationEngine.js → SRE/AIInvestigationEngine.js} +47 -31
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -0
- package/build/dist/Server/Utils/AI/{Sentinel/SentinelMemory.js → SRE/AIMemory.js} +5 -5
- package/build/dist/Server/Utils/AI/SRE/AIMemory.js.map +1 -0
- package/build/dist/Server/Utils/AI/{Sentinel → SRE}/AlertInvestigationRunner.js +42 -19
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js +226 -0
- package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js +100 -0
- package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.js +174 -0
- package/build/dist/Server/Utils/AI/SRE/FixPerformanceTaskTrigger.js.map +1 -0
- package/build/dist/Server/Utils/AI/{Sentinel → SRE}/IncidentInvestigationRunner.js +60 -22
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -0
- package/build/dist/Server/Utils/AI/{Sentinel → SRE}/IncidentPostmortemRunner.js +9 -9
- package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ErrorLogSpikeDetector.js +268 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ErrorLogSpikeDetector.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +226 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/Index.js +26 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/Index.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/MetricDriftDetector.js +159 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/MetricDriftDetector.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +177 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/TraceLatencyRegressionDetector.js +384 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/TraceLatencyRegressionDetector.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js +180 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightScanner.js +269 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightScanner.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js +231 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +206 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Triage.js +121 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Triage.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Types.js +2 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Types.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js +148 -0
- package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +231 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -0
- package/build/dist/Server/Utils/AI/{Sentinel → SRE}/InvestigationQueue.js +102 -23
- package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js +167 -0
- package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/{SentinelActionTools.js → AIActionTools.js} +18 -2
- package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/Index.js +2 -2
- package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.js +301 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/ClickhouseCapacity.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +240 -2
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/ServiceRepoLinkSuggester.js +127 -0
- package/build/dist/Server/Utils/CodeRepository/ServiceRepoLinkSuggester.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/StackTraceRepoResolver.js +336 -0
- package/build/dist/Server/Utils/CodeRepository/StackTraceRepoResolver.js.map +1 -0
- package/build/dist/Server/Utils/Execute.js.map +1 -1
- package/build/dist/Server/Utils/LLM/LLMService.js +125 -25
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.js +120 -0
- package/build/dist/Server/Utils/Monitor/Criteria/SqlMonitorCriteria.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +21 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Types/AI/AIInsightEvidence.js +2 -0
- package/build/dist/Types/AI/AIInsightEvidence.js.map +1 -0
- package/build/dist/Types/AI/AIInsightHumanVerdict.js +16 -0
- package/build/dist/Types/AI/AIInsightHumanVerdict.js.map +1 -0
- package/build/dist/Types/AI/AIInsightSeverity.js +14 -0
- package/build/dist/Types/AI/AIInsightSeverity.js.map +1 -0
- package/build/dist/Types/AI/AIInsightStatus.js +36 -0
- package/build/dist/Types/AI/AIInsightStatus.js.map +1 -0
- package/build/dist/Types/AI/AIInsightType.js +42 -0
- package/build/dist/Types/AI/AIInsightType.js.map +1 -0
- package/build/dist/Types/AI/AIRunAutoGrade.js +19 -0
- package/build/dist/Types/AI/AIRunAutoGrade.js.map +1 -0
- package/build/dist/Types/AI/AIRunEventType.js +5 -0
- package/build/dist/Types/AI/AIRunEventType.js.map +1 -1
- package/build/dist/Types/AI/AIRunHumanVerdict.js +18 -0
- package/build/dist/Types/AI/AIRunHumanVerdict.js.map +1 -0
- package/build/dist/Types/AI/AIRunType.js +6 -0
- package/build/dist/Types/AI/AIRunType.js.map +1 -1
- package/build/dist/Types/AI/CodeFixTaskContext.js +29 -0
- package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -0
- package/build/dist/Types/AI/CodeFixTaskType.js +122 -0
- package/build/dist/Types/AI/CodeFixTaskType.js.map +1 -0
- package/build/dist/Types/AI/FixPullRequestCiStatus.js +102 -0
- package/build/dist/Types/AI/FixPullRequestCiStatus.js.map +1 -0
- package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js +55 -0
- package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js.map +1 -1
- package/build/dist/Types/Incident/IncidentMetricType.js +7 -0
- package/build/dist/Types/Incident/IncidentMetricType.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaFilter.js +7 -0
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +62 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +28 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js +93 -0
- package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorType.js +15 -0
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/SqlDatabaseType.js +47 -0
- package/build/dist/Types/Monitor/SqlDatabaseType.js.map +1 -0
- package/build/dist/Types/Monitor/SqlMonitor/SqlMonitorResponse.js +2 -0
- package/build/dist/Types/Monitor/SqlMonitor/SqlMonitorResponse.js.map +1 -0
- package/build/dist/Types/Permission.js +10 -84
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Runbook/RunbookStepType.js +1 -0
- package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
- package/build/dist/Types/Workflow/ComponentID.js +1 -0
- package/build/dist/Types/Workflow/ComponentID.js.map +1 -1
- package/build/dist/Types/Workflow/Components/AI.js +135 -0
- package/build/dist/Types/Workflow/Components/AI.js.map +1 -0
- package/build/dist/Types/Workflow/Components.js +7 -0
- package/build/dist/Types/Workflow/Components.js.map +1 -1
- package/build/dist/UI/Components/AI/GenerateFromAIModal.js +1 -1
- package/build/dist/UI/Components/AI/GenerateFromAIModal.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +9 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +1 -1
- package/build/dist/UI/Components/Table/Table.js +28 -2
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Utils/TableColumnsToCsv.js +291 -0
- package/build/dist/UI/Utils/TableColumnsToCsv.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorMetricType.js +1 -0
- package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
- package/package.json +1 -1
- package/Models/DatabaseModels/AIAgentTask.ts +0 -660
- package/Models/DatabaseModels/AIAgentTaskLog.ts +0 -426
- package/Models/DatabaseModels/AIAgentTaskTelemetryException.ts +0 -399
- package/Models/DatabaseModels/ServiceCodeRepository.ts +0 -647
- package/Server/Services/AIAgentTaskService.ts +0 -240
- package/Server/Services/AIAgentTaskTelemetryExceptionService.ts +0 -39
- package/Server/Services/ServiceCodeRepositoryService.ts +0 -55
- package/Tests/Server/Services/AIAgentTaskServiceClaim.test.ts +0 -146
- package/Types/AI/AIAgentTaskMetadata.ts +0 -25
- package/Types/AI/AIAgentTaskType.ts +0 -40
- package/build/dist/Models/DatabaseModels/AIAgentTask.js +0 -691
- package/build/dist/Models/DatabaseModels/AIAgentTask.js.map +0 -1
- package/build/dist/Models/DatabaseModels/AIAgentTaskLog.js +0 -447
- package/build/dist/Models/DatabaseModels/AIAgentTaskLog.js.map +0 -1
- package/build/dist/Models/DatabaseModels/AIAgentTaskTelemetryException.js +0 -415
- package/build/dist/Models/DatabaseModels/AIAgentTaskTelemetryException.js.map +0 -1
- package/build/dist/Models/DatabaseModels/ServiceCodeRepository.js +0 -665
- package/build/dist/Models/DatabaseModels/ServiceCodeRepository.js.map +0 -1
- package/build/dist/Server/Services/AIAgentTaskLogService.js.map +0 -1
- package/build/dist/Server/Services/AIAgentTaskService.js +0 -217
- package/build/dist/Server/Services/AIAgentTaskService.js.map +0 -1
- package/build/dist/Server/Services/AIAgentTaskTelemetryExceptionService.js +0 -36
- package/build/dist/Server/Services/AIAgentTaskTelemetryExceptionService.js.map +0 -1
- package/build/dist/Server/Services/ServiceCodeRepositoryService.js +0 -54
- package/build/dist/Server/Services/ServiceCodeRepositoryService.js.map +0 -1
- package/build/dist/Server/Utils/AI/Sentinel/AlertInvestigationRunner.js.map +0 -1
- package/build/dist/Server/Utils/AI/Sentinel/IncidentInvestigationRunner.js.map +0 -1
- package/build/dist/Server/Utils/AI/Sentinel/IncidentPostmortemRunner.js.map +0 -1
- package/build/dist/Server/Utils/AI/Sentinel/InvestigationQueue.js.map +0 -1
- package/build/dist/Server/Utils/AI/Sentinel/SentinelInvestigationEngine.js.map +0 -1
- package/build/dist/Server/Utils/AI/Sentinel/SentinelMemory.js.map +0 -1
- package/build/dist/Server/Utils/AI/Toolbox/SentinelActionTools.js.map +0 -1
- package/build/dist/Types/AI/AIAgentTaskMetadata.js +0 -6
- package/build/dist/Types/AI/AIAgentTaskMetadata.js.map +0 -1
- package/build/dist/Types/AI/AIAgentTaskType.js +0 -29
- package/build/dist/Types/AI/AIAgentTaskType.js.map +0 -1
|
@@ -5,28 +5,32 @@ import { IncidentFeedEventType } from "../../../../Models/DatabaseModels/Inciden
|
|
|
5
5
|
import IncidentInternalNote from "../../../../Models/DatabaseModels/IncidentInternalNote";
|
|
6
6
|
import IncidentFeedService from "../../../Services/IncidentFeedService";
|
|
7
7
|
import IncidentInternalNoteService from "../../../Services/IncidentInternalNoteService";
|
|
8
|
+
import IncidentService from "../../../Services/IncidentService";
|
|
8
9
|
import IncidentAIContextBuilder, {
|
|
9
10
|
IncidentContextData,
|
|
10
11
|
} from "../IncidentAIContextBuilder";
|
|
11
|
-
import
|
|
12
|
-
import
|
|
13
|
-
import
|
|
12
|
+
import { AI_INCIDENT_INVESTIGATION_FEATURE } from "../../../Services/AIService";
|
|
13
|
+
import AIInvestigationEngine from "./AIInvestigationEngine";
|
|
14
|
+
import AIInvestigationQueue from "./InvestigationQueue";
|
|
15
|
+
import AIConfidenceSignal, { ConfidenceSignal } from "./ConfidenceSignal";
|
|
16
|
+
import AIMemory from "./AIMemory";
|
|
17
|
+
import InstrumentationTaskTrigger from "./InstrumentationTaskTrigger";
|
|
14
18
|
import { ObservabilityAssistantResult } from "../Chat/ObservabilityAssistant";
|
|
15
19
|
import logger from "../../Logger";
|
|
16
20
|
import CaptureSpan from "../../Telemetry/CaptureSpan";
|
|
17
21
|
|
|
18
22
|
/*
|
|
19
|
-
*
|
|
23
|
+
* AI SRE — incident investigation.
|
|
20
24
|
*
|
|
21
|
-
* When a new incident is declared, wakes
|
|
25
|
+
* When a new incident is declared, wakes AI to investigate it (read-only)
|
|
22
26
|
* and post a cited root-cause analysis into the incident timeline + Slack/Teams
|
|
23
27
|
* — before the on-call engineer has finished reading the page. The trigger only
|
|
24
|
-
* records durable intent (a Queued AIRun via
|
|
28
|
+
* records durable intent (a Queued AIRun via AIInvestigationQueue), so a
|
|
25
29
|
* pod restart can no longer orphan an investigation; the heavy lifting (run
|
|
26
30
|
* lifecycle, the agent loop, confidence gating) lives in the shared
|
|
27
|
-
*
|
|
31
|
+
* AIInvestigationEngine. See Internal/Roadmap/AISentinelExecution.md.
|
|
28
32
|
*/
|
|
29
|
-
export default class
|
|
33
|
+
export default class AIIncidentInvestigationRunner {
|
|
30
34
|
/*
|
|
31
35
|
* Entry point called (fire-and-forget) from IncidentService.onCreateSuccess.
|
|
32
36
|
* Cheap: gates + a Queued AIRun row; execution happens via the queue.
|
|
@@ -41,7 +45,7 @@ export default class SentinelIncidentInvestigationRunner {
|
|
|
41
45
|
|
|
42
46
|
try {
|
|
43
47
|
if (
|
|
44
|
-
!(await
|
|
48
|
+
!(await AIInvestigationEngine.isEnabledForProject(
|
|
45
49
|
projectId,
|
|
46
50
|
"Incident",
|
|
47
51
|
))
|
|
@@ -49,20 +53,20 @@ export default class SentinelIncidentInvestigationRunner {
|
|
|
49
53
|
return;
|
|
50
54
|
}
|
|
51
55
|
|
|
52
|
-
await
|
|
56
|
+
await AIInvestigationQueue.enqueue({
|
|
53
57
|
projectId,
|
|
54
58
|
subjectIncidentId: incidentId,
|
|
55
59
|
});
|
|
56
60
|
} catch (error) {
|
|
57
61
|
logger.error(
|
|
58
|
-
`
|
|
62
|
+
`AI: unexpected error enqueueing investigation for incident ${incidentId.toString()}: ${error}`,
|
|
59
63
|
);
|
|
60
64
|
}
|
|
61
65
|
}
|
|
62
66
|
|
|
63
67
|
/*
|
|
64
68
|
* Execute a claimed run: assemble incident context and hand it to the
|
|
65
|
-
* engine. Called by
|
|
69
|
+
* engine. Called by AIInvestigationQueue after a successful claim.
|
|
66
70
|
* Never throws — failures are handed to the queue's retry policy so a
|
|
67
71
|
* claimed run is always finalized or requeued.
|
|
68
72
|
*/
|
|
@@ -85,11 +89,11 @@ export default class SentinelIncidentInvestigationRunner {
|
|
|
85
89
|
|
|
86
90
|
/*
|
|
87
91
|
* Recurrence memory: pull in past resolved incidents that share this
|
|
88
|
-
* incident's monitors/labels so
|
|
92
|
+
* incident's monitors/labels so AI can recognise "I've seen this
|
|
89
93
|
* before" and reference the prior fix.
|
|
90
94
|
*/
|
|
91
95
|
const priorCasesContext: string =
|
|
92
|
-
await
|
|
96
|
+
await AIMemory.getPriorSimilarIncidentsContext({
|
|
93
97
|
projectId,
|
|
94
98
|
currentIncidentId: incidentId,
|
|
95
99
|
monitorNames: (contextData.incident.monitors || [])
|
|
@@ -111,7 +115,7 @@ export default class SentinelIncidentInvestigationRunner {
|
|
|
111
115
|
* Context assembly failed — the run is claimed, so hand it to the
|
|
112
116
|
* retry policy rather than leaving it Running until the sweeper.
|
|
113
117
|
*/
|
|
114
|
-
await
|
|
118
|
+
await AIInvestigationQueue.failOrRequeue({
|
|
115
119
|
aiRunId,
|
|
116
120
|
attemptCount,
|
|
117
121
|
errorMessage: `Failed to build incident context: ${
|
|
@@ -122,16 +126,17 @@ export default class SentinelIncidentInvestigationRunner {
|
|
|
122
126
|
return;
|
|
123
127
|
}
|
|
124
128
|
|
|
125
|
-
await
|
|
129
|
+
await AIInvestigationEngine.executeRun({
|
|
126
130
|
aiRunId,
|
|
127
131
|
projectId,
|
|
128
132
|
attemptCount,
|
|
129
133
|
request: {
|
|
130
|
-
|
|
134
|
+
// Persisted LlmLog label — owned by AIService (G4 budget list).
|
|
135
|
+
feature: AI_INCIDENT_INVESTIGATION_FEATURE,
|
|
131
136
|
contextSummary,
|
|
132
137
|
postAnalysis: async (postData: {
|
|
133
138
|
analysisMarkdown: string;
|
|
134
|
-
|
|
139
|
+
confidence: ConfidenceSignal;
|
|
135
140
|
result: ObservabilityAssistantResult;
|
|
136
141
|
}): Promise<void> => {
|
|
137
142
|
await IncidentFeedService.createIncidentFeedItem({
|
|
@@ -142,10 +147,15 @@ export default class SentinelIncidentInvestigationRunner {
|
|
|
142
147
|
feedInfoInMarkdown: postData.analysisMarkdown,
|
|
143
148
|
/*
|
|
144
149
|
* Quiet mode: an inconclusive investigation posts to the timeline
|
|
145
|
-
* but does NOT loudly ping the workspace / on-call.
|
|
150
|
+
* but does NOT loudly ping the workspace / on-call. Fail
|
|
151
|
+
* direction (G6): when the confidence classification itself
|
|
152
|
+
* failed, the ping SENDS — quiet mode fails louder, not silent.
|
|
146
153
|
*/
|
|
147
154
|
workspaceNotification: {
|
|
148
|
-
sendWorkspaceNotification:
|
|
155
|
+
sendWorkspaceNotification:
|
|
156
|
+
AIConfidenceSignal.shouldSendWorkspaceNotification(
|
|
157
|
+
postData.confidence,
|
|
158
|
+
),
|
|
149
159
|
},
|
|
150
160
|
});
|
|
151
161
|
|
|
@@ -173,7 +183,47 @@ export default class SentinelIncidentInvestigationRunner {
|
|
|
173
183
|
});
|
|
174
184
|
} catch (error) {
|
|
175
185
|
logger.error(
|
|
176
|
-
`
|
|
186
|
+
`AI: failed to post RCA internal note for incident ${incidentId.toString()}: ${error}`,
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/*
|
|
191
|
+
* Measurement layer: record the time-to-rca metric (seconds from
|
|
192
|
+
* incident creation to this analysis post, with the same base
|
|
193
|
+
* attribute shape as every other incident metric). Best-effort —
|
|
194
|
+
* metrics must never break the RCA post.
|
|
195
|
+
*/
|
|
196
|
+
try {
|
|
197
|
+
await IncidentService.recordTimeToRootCausePostedMetric({
|
|
198
|
+
incidentId,
|
|
199
|
+
});
|
|
200
|
+
} catch (error) {
|
|
201
|
+
logger.error(
|
|
202
|
+
`AI: failed to record time-to-rca metric for incident ${incidentId.toString()}: ${error}`,
|
|
203
|
+
);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/*
|
|
207
|
+
* Inconclusive means the telemetry was insufficient — for
|
|
208
|
+
* opted-in projects (Project.enableInstrumentationFixTasks,
|
|
209
|
+
* default false), queue an ImproveInstrumentation fix task that
|
|
210
|
+
* opens a PR adding the missing observability. Runs strictly
|
|
211
|
+
* AFTER the analysis is posted, and the trigger never throws, so
|
|
212
|
+
* the investigation can neither be blocked nor failed by it.
|
|
213
|
+
* Fail direction (G6): only a POSITIVE inconclusive verdict
|
|
214
|
+
* (deterministic floor or classification) enqueues — a failed
|
|
215
|
+
* classification does NOT create a PR.
|
|
216
|
+
*/
|
|
217
|
+
if (
|
|
218
|
+
AIConfidenceSignal.shouldEnqueueInstrumentationTask(
|
|
219
|
+
postData.confidence,
|
|
220
|
+
)
|
|
221
|
+
) {
|
|
222
|
+
await InstrumentationTaskTrigger.enqueueForInconclusiveInvestigation(
|
|
223
|
+
{
|
|
224
|
+
projectId,
|
|
225
|
+
incidentId,
|
|
226
|
+
},
|
|
177
227
|
);
|
|
178
228
|
}
|
|
179
229
|
},
|
|
@@ -4,14 +4,14 @@ import Incident from "../../../../Models/DatabaseModels/Incident";
|
|
|
4
4
|
import { IncidentFeedEventType } from "../../../../Models/DatabaseModels/IncidentFeed";
|
|
5
5
|
import IncidentService from "../../../Services/IncidentService";
|
|
6
6
|
import IncidentFeedService from "../../../Services/IncidentFeedService";
|
|
7
|
-
import
|
|
7
|
+
import AIInvestigationEngine from "./AIInvestigationEngine";
|
|
8
8
|
import logger from "../../Logger";
|
|
9
9
|
import CaptureSpan from "../../Telemetry/CaptureSpan";
|
|
10
10
|
|
|
11
11
|
/*
|
|
12
|
-
*
|
|
12
|
+
* AI SRE — auto-draft postmortem on resolve (Phase 3, "close the loop").
|
|
13
13
|
*
|
|
14
|
-
* When an incident moves to a resolved state,
|
|
14
|
+
* When an incident moves to a resolved state, AI drafts a postmortem from
|
|
15
15
|
* the incident timeline + telemetry (reusing the existing
|
|
16
16
|
* IncidentService.generatePostmortemFromAI) and saves it to the incident for a
|
|
17
17
|
* human to review and edit — turning a ~90-minute manual writeup into a review.
|
|
@@ -22,7 +22,7 @@ import CaptureSpan from "../../Telemetry/CaptureSpan";
|
|
|
22
22
|
*/
|
|
23
23
|
const MAX_FEED_PREVIEW_CHARS: number = 6000;
|
|
24
24
|
|
|
25
|
-
export default class
|
|
25
|
+
export default class AIIncidentPostmortemRunner {
|
|
26
26
|
@CaptureSpan()
|
|
27
27
|
public static async draftPostmortemOnResolve(data: {
|
|
28
28
|
incidentId: ObjectID;
|
|
@@ -32,7 +32,7 @@ export default class SentinelIncidentPostmortemRunner {
|
|
|
32
32
|
|
|
33
33
|
try {
|
|
34
34
|
if (
|
|
35
|
-
!(await
|
|
35
|
+
!(await AIInvestigationEngine.isEnabledForProject(
|
|
36
36
|
projectId,
|
|
37
37
|
"Incident",
|
|
38
38
|
))
|
|
@@ -83,7 +83,7 @@ export default class SentinelIncidentPostmortemRunner {
|
|
|
83
83
|
projectId,
|
|
84
84
|
incidentFeedEventType: IncidentFeedEventType.PostmortemNote,
|
|
85
85
|
displayColor: Blue500,
|
|
86
|
-
feedInfoInMarkdown: `## 🧠
|
|
86
|
+
feedInfoInMarkdown: `## 🧠 AI — Draft Postmortem\n\nOneUptime AI drafted a postmortem for incident #${incident.incidentNumber} from the incident timeline and telemetry. It has been saved on the incident for you to review and edit.`,
|
|
87
87
|
moreInformationInMarkdown:
|
|
88
88
|
draft.length > MAX_FEED_PREVIEW_CHARS
|
|
89
89
|
? `${draft.substring(0, MAX_FEED_PREVIEW_CHARS)}\n\n…(truncated — the full draft is saved on the incident.)`
|
|
@@ -94,11 +94,11 @@ export default class SentinelIncidentPostmortemRunner {
|
|
|
94
94
|
});
|
|
95
95
|
|
|
96
96
|
logger.debug(
|
|
97
|
-
`
|
|
97
|
+
`AI: drafted postmortem for incident ${incidentId.toString()}.`,
|
|
98
98
|
);
|
|
99
99
|
} catch (error) {
|
|
100
100
|
logger.error(
|
|
101
|
-
`
|
|
101
|
+
`AI: failed to draft postmortem for incident ${incidentId.toString()}: ${error}`,
|
|
102
102
|
);
|
|
103
103
|
}
|
|
104
104
|
}
|
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
import ObjectID from "../../../../../../Types/ObjectID";
|
|
2
|
+
import OneUptimeDate from "../../../../../../Types/Date";
|
|
3
|
+
import AIInsightType from "../../../../../../Types/AI/AIInsightType";
|
|
4
|
+
import AIInsightSeverity from "../../../../../../Types/AI/AIInsightSeverity";
|
|
5
|
+
import Service from "../../../../../../Models/DatabaseModels/Service";
|
|
6
|
+
import LogAggregationService, {
|
|
7
|
+
AnalyticsTopItem,
|
|
8
|
+
HistogramBucket,
|
|
9
|
+
} from "../../../../../Services/LogAggregationService";
|
|
10
|
+
import ServiceService from "../../../../../Services/ServiceService";
|
|
11
|
+
import {
|
|
12
|
+
InsightCandidate,
|
|
13
|
+
InsightDetector,
|
|
14
|
+
InsightScanContext,
|
|
15
|
+
} from "../Types";
|
|
16
|
+
|
|
17
|
+
/*
|
|
18
|
+
* ErrorLogSpike — the project's Error/Fatal log volume in the last hour
|
|
19
|
+
* spiked well above its own average hourly rate over the prior 24 hours.
|
|
20
|
+
*
|
|
21
|
+
* Two-stage on purpose (cost): stage 1 is ONE project-wide severity
|
|
22
|
+
* histogram, which ClickHouse serves from the proj_severity_histogram
|
|
23
|
+
* projection because severityText and the minute bucket are the
|
|
24
|
+
* projection's own keys. Only when stage 1 finds a spike does stage 2 run
|
|
25
|
+
* the service-attribution query — a top-list grouped by primaryEntityId,
|
|
26
|
+
* which falls back to a base-table scan but is bounded to the single spike
|
|
27
|
+
* hour. Deterministic — no LLM anywhere in this detector.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
// The spike window, compared against the prior baseline window.
|
|
31
|
+
export const ERROR_LOG_SPIKE_RECENT_WINDOW_MINUTES: number = 60;
|
|
32
|
+
|
|
33
|
+
/*
|
|
34
|
+
* Baseline: the 24 hours before the spike window, averaged per hour.
|
|
35
|
+
* Self-baselining means chronically chatty projects don't alert on their
|
|
36
|
+
* normal error volume.
|
|
37
|
+
*/
|
|
38
|
+
export const ERROR_LOG_SPIKE_BASELINE_WINDOW_HOURS: number = 24;
|
|
39
|
+
|
|
40
|
+
/*
|
|
41
|
+
* Absolute floor: below 100 errors/hour a "3x spike" can be 20→100 raw
|
|
42
|
+
* lines — routine flakiness, not an event worth a human's attention.
|
|
43
|
+
*/
|
|
44
|
+
export const ERROR_LOG_SPIKE_MIN_RECENT_COUNT: number = 100;
|
|
45
|
+
|
|
46
|
+
/*
|
|
47
|
+
* Volume multiplier that counts as a spike. The baseline hourly average is
|
|
48
|
+
* floored at 1 (see evaluateSpike) so a silent project's first errors
|
|
49
|
+
* still register without producing infinite multipliers.
|
|
50
|
+
*/
|
|
51
|
+
export const ERROR_LOG_SPIKE_MIN_MULTIPLIER: number = 3;
|
|
52
|
+
|
|
53
|
+
// A >= 10x spike is a step change, not a fluctuation — escalate to High.
|
|
54
|
+
export const ERROR_LOG_SPIKE_HIGH_SEVERITY_MULTIPLIER: number = 10;
|
|
55
|
+
|
|
56
|
+
/*
|
|
57
|
+
* Histogram bucket size. The projection is minute-grained, so any bucket
|
|
58
|
+
* size is projection-served; 5 minutes keeps the recent/prior split error
|
|
59
|
+
* bounded to one bucket (< 5 min of data) while returning only ~300 rows
|
|
60
|
+
* for the whole 25h window.
|
|
61
|
+
*/
|
|
62
|
+
export const ERROR_LOG_SPIKE_HISTOGRAM_BUCKET_MINUTES: number = 5;
|
|
63
|
+
|
|
64
|
+
/*
|
|
65
|
+
* At most this many per-service insights per spike. More than 3 services
|
|
66
|
+
* spiking together is one platform event, not N service events — the
|
|
67
|
+
* project-wide evidence block carries the full attribution list anyway.
|
|
68
|
+
*/
|
|
69
|
+
export const ERROR_LOG_SPIKE_MAX_ATTRIBUTED_SERVICES: number = 3;
|
|
70
|
+
|
|
71
|
+
// Severity levels that count as "errors" for this detector (OTel names).
|
|
72
|
+
export const ERROR_LOG_SEVERITIES: Array<string> = ["Error", "Fatal"];
|
|
73
|
+
|
|
74
|
+
/*
|
|
75
|
+
* A ClickHouse DateTime rendered with no zone designator: "YYYY-MM-DD
|
|
76
|
+
* hh:mm:ss" (the shape LogAggregationService.getHistogram reads out of the
|
|
77
|
+
* `bucket` column), optionally "T"-separated and/or fractional. Anchored on
|
|
78
|
+
* purpose — any string carrying a zone (…Z, …+05:30) must NOT match, because
|
|
79
|
+
* parseBucketTime appends a Z to whatever matches and a double-designator
|
|
80
|
+
* string parses to an Invalid Date (which splitHistogram would then skip,
|
|
81
|
+
* zeroing the bucket).
|
|
82
|
+
*/
|
|
83
|
+
const ZONE_LESS_DATETIME_REGEX: RegExp =
|
|
84
|
+
/^\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}(\.\d+)?$/;
|
|
85
|
+
|
|
86
|
+
export interface ErrorLogSpikeDecision {
|
|
87
|
+
isSpike: boolean;
|
|
88
|
+
// recent count / max(baseline hourly average, 1).
|
|
89
|
+
multiplier: number;
|
|
90
|
+
severity: AIInsightSeverity;
|
|
91
|
+
recentCount: number;
|
|
92
|
+
// prior-window count / ERROR_LOG_SPIKE_BASELINE_WINDOW_HOURS (unfloored).
|
|
93
|
+
baselineHourlyAverage: number;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export default class ErrorLogSpikeDetector implements InsightDetector {
|
|
97
|
+
public insightType: AIInsightType = AIInsightType.ErrorLogSpike;
|
|
98
|
+
|
|
99
|
+
/*
|
|
100
|
+
* ClickHouse serves DateTime columns as a zone-less wall clock in the
|
|
101
|
+
* column's own zone — UTC in every OneUptime deployment. `new Date()` reads
|
|
102
|
+
* that shape as the PROCESS's LOCAL time, so on a worker whose TZ is not UTC
|
|
103
|
+
* every bucket silently slides by the UTC offset and the recent/prior
|
|
104
|
+
* boundary below lands in the wrong place: positive offsets push the spike's
|
|
105
|
+
* buckets into the baseline (suppressing every spike while inflating the
|
|
106
|
+
* average it is compared against), negative offsets drag hours of baseline
|
|
107
|
+
* into the "last 60 minutes" (fabricating spikes whose counts cannot even
|
|
108
|
+
* reconcile with stage 2, which binds real Date params and queries the true
|
|
109
|
+
* hour). Normalizing to an explicit UTC instant makes the split depend only
|
|
110
|
+
* on the data, never on the worker's clock configuration.
|
|
111
|
+
*
|
|
112
|
+
* Zone-carrying strings are parsed verbatim — see ZONE_LESS_DATETIME_REGEX.
|
|
113
|
+
* Anything else stays an Invalid Date so splitHistogram's isNaN guard still
|
|
114
|
+
* skips it. Same idiom as the dashboard's EdgeDetailPanel.parseBucketStart.
|
|
115
|
+
*/
|
|
116
|
+
public static parseBucketTime(time: string): Date {
|
|
117
|
+
const trimmedTime: string = time.trim();
|
|
118
|
+
|
|
119
|
+
if (ZONE_LESS_DATETIME_REGEX.test(trimmedTime)) {
|
|
120
|
+
return new Date(`${trimmedTime.replace(" ", "T")}Z`);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return new Date(trimmedTime);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/*
|
|
127
|
+
* Pure split of one histogram into the recent window and the prior
|
|
128
|
+
* baseline window. A bucket belongs to "recent" when it STARTS at or
|
|
129
|
+
* after the boundary; the boundary-straddling bucket therefore counts as
|
|
130
|
+
* prior — a deliberate conservative bias (understates the spike by at
|
|
131
|
+
* most one bucket of data rather than inflating it).
|
|
132
|
+
*/
|
|
133
|
+
public static splitHistogram(
|
|
134
|
+
buckets: Array<HistogramBucket>,
|
|
135
|
+
recentWindowStart: Date,
|
|
136
|
+
): { recentCount: number; priorCount: number } {
|
|
137
|
+
let recentCount: number = 0;
|
|
138
|
+
let priorCount: number = 0;
|
|
139
|
+
|
|
140
|
+
for (const bucket of buckets) {
|
|
141
|
+
const bucketTime: Date = ErrorLogSpikeDetector.parseBucketTime(
|
|
142
|
+
bucket.time,
|
|
143
|
+
);
|
|
144
|
+
if (isNaN(bucketTime.getTime())) {
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
if (bucketTime.getTime() >= recentWindowStart.getTime()) {
|
|
148
|
+
recentCount += bucket.count;
|
|
149
|
+
} else {
|
|
150
|
+
priorCount += bucket.count;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return { recentCount, priorCount };
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/*
|
|
158
|
+
* Pure decision: recent-hour error count vs the prior 24h window count.
|
|
159
|
+
* Spike ⇔ recent >= ERROR_LOG_SPIKE_MIN_RECENT_COUNT AND
|
|
160
|
+
* recent >= ERROR_LOG_SPIKE_MIN_MULTIPLIER * max(prior/24, 1).
|
|
161
|
+
*/
|
|
162
|
+
public static evaluateSpike(
|
|
163
|
+
recentCount: number,
|
|
164
|
+
priorWindowCount: number,
|
|
165
|
+
): ErrorLogSpikeDecision {
|
|
166
|
+
const baselineHourlyAverage: number =
|
|
167
|
+
priorWindowCount / ERROR_LOG_SPIKE_BASELINE_WINDOW_HOURS;
|
|
168
|
+
const effectiveBaseline: number = Math.max(baselineHourlyAverage, 1);
|
|
169
|
+
const multiplier: number = recentCount / effectiveBaseline;
|
|
170
|
+
|
|
171
|
+
const isSpike: boolean =
|
|
172
|
+
recentCount >= ERROR_LOG_SPIKE_MIN_RECENT_COUNT &&
|
|
173
|
+
multiplier >= ERROR_LOG_SPIKE_MIN_MULTIPLIER;
|
|
174
|
+
|
|
175
|
+
return {
|
|
176
|
+
isSpike,
|
|
177
|
+
multiplier,
|
|
178
|
+
severity:
|
|
179
|
+
multiplier >= ERROR_LOG_SPIKE_HIGH_SEVERITY_MULTIPLIER
|
|
180
|
+
? AIInsightSeverity.High
|
|
181
|
+
: AIInsightSeverity.Medium,
|
|
182
|
+
recentCount,
|
|
183
|
+
baselineHourlyAverage,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/*
|
|
188
|
+
* Stable dedupe key: per attributed service, or "project" for the
|
|
189
|
+
* unattributed project-wide spike.
|
|
190
|
+
*/
|
|
191
|
+
public static buildFingerprint(serviceId: string | undefined): string {
|
|
192
|
+
return `error-log-spike:${serviceId || "project"}`;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
public async detect(
|
|
196
|
+
context: InsightScanContext,
|
|
197
|
+
): Promise<Array<InsightCandidate>> {
|
|
198
|
+
const recentWindowStart: Date = OneUptimeDate.addRemoveMinutes(
|
|
199
|
+
context.now,
|
|
200
|
+
-1 * ERROR_LOG_SPIKE_RECENT_WINDOW_MINUTES,
|
|
201
|
+
);
|
|
202
|
+
const baselineWindowStart: Date = OneUptimeDate.addRemoveHours(
|
|
203
|
+
recentWindowStart,
|
|
204
|
+
-1 * ERROR_LOG_SPIKE_BASELINE_WINDOW_HOURS,
|
|
205
|
+
);
|
|
206
|
+
|
|
207
|
+
/*
|
|
208
|
+
* Stage 1 — projection-fast project-wide severity histogram over the
|
|
209
|
+
* whole 25h (baseline + spike) range. severityTexts stays on the
|
|
210
|
+
* projection; adding any service/entity filter here would silently
|
|
211
|
+
* force a base-table scan (LogAggregationService.appendCommonFilters).
|
|
212
|
+
*/
|
|
213
|
+
const buckets: Array<HistogramBucket> =
|
|
214
|
+
await LogAggregationService.getHistogram({
|
|
215
|
+
projectId: context.projectId,
|
|
216
|
+
startTime: baselineWindowStart,
|
|
217
|
+
endTime: context.now,
|
|
218
|
+
bucketSizeInMinutes: ERROR_LOG_SPIKE_HISTOGRAM_BUCKET_MINUTES,
|
|
219
|
+
severityTexts: ERROR_LOG_SEVERITIES,
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
const { recentCount, priorCount } = ErrorLogSpikeDetector.splitHistogram(
|
|
223
|
+
buckets,
|
|
224
|
+
recentWindowStart,
|
|
225
|
+
);
|
|
226
|
+
|
|
227
|
+
const decision: ErrorLogSpikeDecision = ErrorLogSpikeDetector.evaluateSpike(
|
|
228
|
+
recentCount,
|
|
229
|
+
priorCount,
|
|
230
|
+
);
|
|
231
|
+
|
|
232
|
+
if (!decision.isSpike) {
|
|
233
|
+
return [];
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/*
|
|
237
|
+
* Stage 2 — service attribution, only now that a spike exists. This
|
|
238
|
+
* top-list groups by primaryEntityId, which rejects the projection and
|
|
239
|
+
* scans the base table — acceptable because the scan is bounded to the
|
|
240
|
+
* single spike hour.
|
|
241
|
+
*/
|
|
242
|
+
const topItems: Array<AnalyticsTopItem> =
|
|
243
|
+
await LogAggregationService.getAnalyticsTopList({
|
|
244
|
+
projectId: context.projectId,
|
|
245
|
+
startTime: recentWindowStart,
|
|
246
|
+
endTime: context.now,
|
|
247
|
+
bucketSizeInMinutes: ERROR_LOG_SPIKE_RECENT_WINDOW_MINUTES,
|
|
248
|
+
chartType: "toplist",
|
|
249
|
+
groupBy: ["primaryEntityId"],
|
|
250
|
+
aggregation: "count",
|
|
251
|
+
severityTexts: ERROR_LOG_SEVERITIES,
|
|
252
|
+
limit: ERROR_LOG_SPIKE_MAX_ATTRIBUTED_SERVICES,
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
/*
|
|
256
|
+
* Resolve entity ids to Service names. Non-Service entities (hosts,
|
|
257
|
+
* clusters) resolve to null and keep their raw id as the label — the
|
|
258
|
+
* evidence must stand alone even when attribution is imperfect.
|
|
259
|
+
*/
|
|
260
|
+
const topServices: Array<{
|
|
261
|
+
serviceId: string;
|
|
262
|
+
serviceName: string;
|
|
263
|
+
isService: boolean;
|
|
264
|
+
count: number;
|
|
265
|
+
}> = [];
|
|
266
|
+
|
|
267
|
+
for (const item of topItems) {
|
|
268
|
+
const service: Service | null = await ServiceService.findOneById({
|
|
269
|
+
id: new ObjectID(item.value),
|
|
270
|
+
select: { name: true },
|
|
271
|
+
props: { isRoot: true },
|
|
272
|
+
});
|
|
273
|
+
topServices.push({
|
|
274
|
+
serviceId: item.value,
|
|
275
|
+
serviceName: service?.name || item.value,
|
|
276
|
+
isService: Boolean(service?.name),
|
|
277
|
+
count: item.count,
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
const detailLines: Array<string> = [
|
|
282
|
+
"**Error-log spike detected**",
|
|
283
|
+
"",
|
|
284
|
+
`- Error/Fatal logs in the last ${ERROR_LOG_SPIKE_RECENT_WINDOW_MINUTES} minutes: ${decision.recentCount}`,
|
|
285
|
+
`- Baseline: ${decision.baselineHourlyAverage.toFixed(2)}/hour over the prior ${ERROR_LOG_SPIKE_BASELINE_WINDOW_HOURS}h (${priorCount} total)`,
|
|
286
|
+
`- Spike multiplier: ${decision.multiplier.toFixed(1)}x`,
|
|
287
|
+
];
|
|
288
|
+
if (topServices.length > 0) {
|
|
289
|
+
detailLines.push("", "Top contributing services in the spike window:");
|
|
290
|
+
for (const top of topServices) {
|
|
291
|
+
detailLines.push(`- ${top.serviceName}: ${top.count} error logs`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
const detailMarkdown: string = detailLines.join("\n");
|
|
295
|
+
|
|
296
|
+
const evidenceTopServices: Array<{ serviceName: string; count: number }> =
|
|
297
|
+
topServices.map(
|
|
298
|
+
(top: {
|
|
299
|
+
serviceId: string;
|
|
300
|
+
serviceName: string;
|
|
301
|
+
isService: boolean;
|
|
302
|
+
count: number;
|
|
303
|
+
}): { serviceName: string; count: number } => {
|
|
304
|
+
return { serviceName: top.serviceName, count: top.count };
|
|
305
|
+
},
|
|
306
|
+
);
|
|
307
|
+
|
|
308
|
+
/*
|
|
309
|
+
* One insight per top contributing service so each can be routed and
|
|
310
|
+
* triaged in its own context; when attribution found nothing, a single
|
|
311
|
+
* project-wide insight still surfaces the event.
|
|
312
|
+
*/
|
|
313
|
+
if (topServices.length === 0) {
|
|
314
|
+
return [
|
|
315
|
+
{
|
|
316
|
+
insightType: AIInsightType.ErrorLogSpike,
|
|
317
|
+
fingerprint: ErrorLogSpikeDetector.buildFingerprint(undefined),
|
|
318
|
+
title: `Error-log spike: ${decision.multiplier.toFixed(1)}x normal volume across the project`,
|
|
319
|
+
detailMarkdown,
|
|
320
|
+
severity: decision.severity,
|
|
321
|
+
evidence: {
|
|
322
|
+
logSpike: {
|
|
323
|
+
recentErrorCount: decision.recentCount,
|
|
324
|
+
baselineHourlyAverage: decision.baselineHourlyAverage,
|
|
325
|
+
spikeMultiplier: decision.multiplier,
|
|
326
|
+
windowMinutes: ERROR_LOG_SPIKE_RECENT_WINDOW_MINUTES,
|
|
327
|
+
topServices: evidenceTopServices,
|
|
328
|
+
},
|
|
329
|
+
},
|
|
330
|
+
},
|
|
331
|
+
];
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
return topServices.map(
|
|
335
|
+
(top: {
|
|
336
|
+
serviceId: string;
|
|
337
|
+
serviceName: string;
|
|
338
|
+
isService: boolean;
|
|
339
|
+
count: number;
|
|
340
|
+
}): InsightCandidate => {
|
|
341
|
+
return {
|
|
342
|
+
insightType: AIInsightType.ErrorLogSpike,
|
|
343
|
+
fingerprint: ErrorLogSpikeDetector.buildFingerprint(top.serviceId),
|
|
344
|
+
title: `Error-log spike: ${decision.multiplier.toFixed(1)}x normal volume in ${top.serviceName}`,
|
|
345
|
+
detailMarkdown,
|
|
346
|
+
severity: decision.severity,
|
|
347
|
+
serviceName: top.serviceName,
|
|
348
|
+
telemetryServiceId: top.isService
|
|
349
|
+
? new ObjectID(top.serviceId)
|
|
350
|
+
: undefined,
|
|
351
|
+
evidence: {
|
|
352
|
+
logSpike: {
|
|
353
|
+
recentErrorCount: decision.recentCount,
|
|
354
|
+
baselineHourlyAverage: decision.baselineHourlyAverage,
|
|
355
|
+
spikeMultiplier: decision.multiplier,
|
|
356
|
+
windowMinutes: ERROR_LOG_SPIKE_RECENT_WINDOW_MINUTES,
|
|
357
|
+
topServices: evidenceTopServices,
|
|
358
|
+
},
|
|
359
|
+
},
|
|
360
|
+
};
|
|
361
|
+
},
|
|
362
|
+
);
|
|
363
|
+
}
|
|
364
|
+
}
|