@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
|
@@ -1,10 +1,219 @@
|
|
|
1
1
|
import DatabaseService from "./DatabaseService";
|
|
2
2
|
import Model from "../../Models/DatabaseModels/CodeRepository";
|
|
3
|
+
import ObjectID from "../../Types/ObjectID";
|
|
4
|
+
import LIMIT_MAX from "../../Types/Database/LimitMax";
|
|
5
|
+
import CodeRepositoryType from "../../Types/CodeRepository/CodeRepositoryType";
|
|
6
|
+
import URL from "../../Types/API/URL";
|
|
7
|
+
import logger from "../Utils/Logger";
|
|
8
|
+
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
9
|
+
import {
|
|
10
|
+
RepoResolution,
|
|
11
|
+
ResolvableRepository,
|
|
12
|
+
resolveRepositoryForExceptionFix,
|
|
13
|
+
} from "../Utils/CodeRepository/StackTraceRepoResolver";
|
|
14
|
+
import GitHubUtil, {
|
|
15
|
+
GitHubRepository,
|
|
16
|
+
} from "../Utils/CodeRepository/GitHub/GitHub";
|
|
17
|
+
|
|
18
|
+
export interface ImportReposFromInstallationResult {
|
|
19
|
+
imported: number;
|
|
20
|
+
skipped: number;
|
|
21
|
+
}
|
|
3
22
|
|
|
4
23
|
export class Service extends DatabaseService<Model> {
|
|
5
24
|
public constructor() {
|
|
6
25
|
super(Model);
|
|
7
26
|
}
|
|
27
|
+
|
|
28
|
+
/*
|
|
29
|
+
* Imports all repositories accessible to a GitHub App installation into a
|
|
30
|
+
* project. Repositories that already exist for the project (matched on
|
|
31
|
+
* organizationName + repositoryName) are skipped. Never deletes anything.
|
|
32
|
+
*/
|
|
33
|
+
@CaptureSpan()
|
|
34
|
+
public async importReposFromInstallation(data: {
|
|
35
|
+
projectId: ObjectID;
|
|
36
|
+
installationId: string;
|
|
37
|
+
}): Promise<ImportReposFromInstallationResult> {
|
|
38
|
+
const installationRepositories: Array<GitHubRepository> =
|
|
39
|
+
await GitHubUtil.listRepositoriesForInstallation(data.installationId);
|
|
40
|
+
|
|
41
|
+
// Fetch existing repositories once so we can skip duplicates and de-dupe display names.
|
|
42
|
+
const existingRepositories: Array<Model> = await this.findBy({
|
|
43
|
+
query: {
|
|
44
|
+
projectId: data.projectId,
|
|
45
|
+
},
|
|
46
|
+
select: {
|
|
47
|
+
_id: true,
|
|
48
|
+
name: true,
|
|
49
|
+
organizationName: true,
|
|
50
|
+
repositoryName: true,
|
|
51
|
+
},
|
|
52
|
+
limit: LIMIT_MAX,
|
|
53
|
+
skip: 0,
|
|
54
|
+
props: {
|
|
55
|
+
isRoot: true,
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
const existingRepositoryKeys: Set<string> = new Set<string>(
|
|
60
|
+
existingRepositories.map((repository: Model) => {
|
|
61
|
+
return `${repository.organizationName?.toLowerCase()}/${repository.repositoryName?.toLowerCase()}`;
|
|
62
|
+
}),
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
const existingDisplayNames: Set<string> = new Set<string>(
|
|
66
|
+
existingRepositories
|
|
67
|
+
.map((repository: Model) => {
|
|
68
|
+
return repository.name?.toLowerCase() || "";
|
|
69
|
+
})
|
|
70
|
+
.filter((name: string) => {
|
|
71
|
+
return Boolean(name);
|
|
72
|
+
}),
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
let imported: number = 0;
|
|
76
|
+
let skipped: number = 0;
|
|
77
|
+
|
|
78
|
+
for (const repository of installationRepositories) {
|
|
79
|
+
const repositoryKey: string = `${repository.ownerLogin.toLowerCase()}/${repository.name.toLowerCase()}`;
|
|
80
|
+
|
|
81
|
+
if (existingRepositoryKeys.has(repositoryKey)) {
|
|
82
|
+
skipped++;
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/*
|
|
87
|
+
* Display name is unique per project. If a repository with the same
|
|
88
|
+
* name exists (e.g. same repo name in a different org), fall back to
|
|
89
|
+
* the org-qualified name, then a numeric suffix.
|
|
90
|
+
*/
|
|
91
|
+
let displayName: string = repository.name;
|
|
92
|
+
|
|
93
|
+
if (existingDisplayNames.has(displayName.toLowerCase())) {
|
|
94
|
+
displayName = repository.fullName;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
let suffix: number = 2;
|
|
98
|
+
|
|
99
|
+
while (existingDisplayNames.has(displayName.toLowerCase())) {
|
|
100
|
+
displayName = `${repository.fullName} (${suffix})`;
|
|
101
|
+
suffix++;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const codeRepository: Model = new Model();
|
|
105
|
+
codeRepository.projectId = data.projectId;
|
|
106
|
+
codeRepository.name = displayName;
|
|
107
|
+
codeRepository.repositoryHostedAt = CodeRepositoryType.GitHub;
|
|
108
|
+
codeRepository.organizationName = repository.ownerLogin;
|
|
109
|
+
codeRepository.repositoryName = repository.name;
|
|
110
|
+
codeRepository.mainBranchName = repository.defaultBranch || "main";
|
|
111
|
+
codeRepository.gitHubAppInstallationId = data.installationId;
|
|
112
|
+
|
|
113
|
+
if (repository.htmlUrl) {
|
|
114
|
+
codeRepository.repositoryUrl = URL.fromString(repository.htmlUrl);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (repository.description) {
|
|
118
|
+
codeRepository.description = repository.description;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
try {
|
|
122
|
+
await this.create({
|
|
123
|
+
data: codeRepository,
|
|
124
|
+
props: {
|
|
125
|
+
isRoot: true,
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
existingRepositoryKeys.add(repositoryKey);
|
|
130
|
+
existingDisplayNames.add(displayName.toLowerCase());
|
|
131
|
+
imported++;
|
|
132
|
+
} catch (error) {
|
|
133
|
+
// One bad repository should not abort the whole import.
|
|
134
|
+
logger.error(
|
|
135
|
+
`Failed to import repository ${repository.fullName} from GitHub App installation ${data.installationId} into project ${data.projectId.toString()}:`,
|
|
136
|
+
);
|
|
137
|
+
logger.error(error);
|
|
138
|
+
skipped++;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return { imported, skipped };
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/*
|
|
146
|
+
* Resolve which of the project's repositories an exception's code lives
|
|
147
|
+
* in, AT RUNTIME — stack-trace path matching over cached git trees, with
|
|
148
|
+
* exact-name-match and only-repository fallbacks. This replaces the old
|
|
149
|
+
* manual ServiceCodeRepository mapping table.
|
|
150
|
+
*/
|
|
151
|
+
@CaptureSpan()
|
|
152
|
+
public async resolveRepositoryForException(data: {
|
|
153
|
+
projectId: ObjectID;
|
|
154
|
+
stackTrace: string | null;
|
|
155
|
+
serviceName: string | null;
|
|
156
|
+
}): Promise<RepoResolution | null> {
|
|
157
|
+
const repositories: Array<Model> = await this.findBy({
|
|
158
|
+
query: {
|
|
159
|
+
projectId: data.projectId,
|
|
160
|
+
},
|
|
161
|
+
select: {
|
|
162
|
+
_id: true,
|
|
163
|
+
name: true,
|
|
164
|
+
organizationName: true,
|
|
165
|
+
repositoryName: true,
|
|
166
|
+
mainBranchName: true,
|
|
167
|
+
gitHubAppInstallationId: true,
|
|
168
|
+
repositoryHostedAt: true,
|
|
169
|
+
},
|
|
170
|
+
skip: 0,
|
|
171
|
+
limit: LIMIT_MAX,
|
|
172
|
+
props: {
|
|
173
|
+
isRoot: true,
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
// Only GitHub-App-connected repos can be cloned/pushed by the agent.
|
|
178
|
+
const resolvable: Array<ResolvableRepository> = repositories
|
|
179
|
+
.filter((repository: Model) => {
|
|
180
|
+
return (
|
|
181
|
+
repository.repositoryHostedAt === CodeRepositoryType.GitHub &&
|
|
182
|
+
Boolean(repository.gitHubAppInstallationId) &&
|
|
183
|
+
Boolean(repository.id)
|
|
184
|
+
);
|
|
185
|
+
})
|
|
186
|
+
.map((repository: Model) => {
|
|
187
|
+
return {
|
|
188
|
+
id: repository.id!.toString(),
|
|
189
|
+
name: repository.name || "",
|
|
190
|
+
organizationName: repository.organizationName || "",
|
|
191
|
+
repositoryName: repository.repositoryName || "",
|
|
192
|
+
mainBranchName: repository.mainBranchName || "main",
|
|
193
|
+
gitHubAppInstallationId: repository.gitHubAppInstallationId || null,
|
|
194
|
+
};
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
if (resolvable.length === 0) {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return resolveRepositoryForExceptionFix({
|
|
202
|
+
stackTrace: data.stackTrace,
|
|
203
|
+
serviceName: data.serviceName,
|
|
204
|
+
repositories: resolvable,
|
|
205
|
+
getTreePaths: (
|
|
206
|
+
repository: ResolvableRepository,
|
|
207
|
+
): Promise<Array<string>> => {
|
|
208
|
+
return GitHubUtil.getRepositoryTreePaths({
|
|
209
|
+
installationId: repository.gitHubAppInstallationId!,
|
|
210
|
+
organizationName: repository.organizationName,
|
|
211
|
+
repositoryName: repository.repositoryName,
|
|
212
|
+
branchName: repository.mainBranchName,
|
|
213
|
+
});
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
}
|
|
8
217
|
}
|
|
9
218
|
|
|
10
219
|
export default new Service();
|
|
@@ -4,6 +4,8 @@ import InMemoryTTLCache from "../Infrastructure/InMemoryTTLCache";
|
|
|
4
4
|
import ObjectID from "../../Types/ObjectID";
|
|
5
5
|
import { OnUpdate } from "../Types/Database/Hooks";
|
|
6
6
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
7
|
+
import UpdateBy from "../Types/Database/UpdateBy";
|
|
8
|
+
import BadDataException from "../../Types/Exception/BadDataException";
|
|
7
9
|
|
|
8
10
|
export class Service extends DatabaseService<Model> {
|
|
9
11
|
/*
|
|
@@ -41,6 +43,152 @@ export class Service extends DatabaseService<Model> {
|
|
|
41
43
|
return value;
|
|
42
44
|
}
|
|
43
45
|
|
|
46
|
+
@CaptureSpan()
|
|
47
|
+
protected override async onBeforeUpdate(
|
|
48
|
+
updateBy: UpdateBy<Model>,
|
|
49
|
+
): Promise<OnUpdate<Model>> {
|
|
50
|
+
const capacitySettingKeys: Array<keyof Model> = [
|
|
51
|
+
"clickhouseCapacityNotificationEnabled",
|
|
52
|
+
"clickhouseCapacityNotificationThresholdPercent",
|
|
53
|
+
"clickhouseDataPruningEnabled",
|
|
54
|
+
"clickhouseDataPruningThresholdPercent",
|
|
55
|
+
"clickhouseDataPruningTargetPercent",
|
|
56
|
+
];
|
|
57
|
+
|
|
58
|
+
const isCapacitySettingUpdate: boolean = capacitySettingKeys.some(
|
|
59
|
+
(key: keyof Model): boolean => {
|
|
60
|
+
return updateBy.data[key] !== undefined;
|
|
61
|
+
},
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
if (!isCapacitySettingUpdate) {
|
|
65
|
+
return {
|
|
66
|
+
updateBy,
|
|
67
|
+
carryForward: null,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/*
|
|
72
|
+
* GlobalConfig updates are partial. Load the current singleton values so
|
|
73
|
+
* cross-field validation still compares the effective pruning threshold
|
|
74
|
+
* and target when the request changes only one of them.
|
|
75
|
+
*/
|
|
76
|
+
const currentConfig: Model | null = await this.findOneBy({
|
|
77
|
+
query: updateBy.query,
|
|
78
|
+
select: {
|
|
79
|
+
clickhouseCapacityNotificationThresholdPercent: true,
|
|
80
|
+
clickhouseDataPruningThresholdPercent: true,
|
|
81
|
+
clickhouseDataPruningTargetPercent: true,
|
|
82
|
+
},
|
|
83
|
+
props: {
|
|
84
|
+
isRoot: true,
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
const normalizePercent: (value: unknown, fieldName: string) => number = (
|
|
89
|
+
value: unknown,
|
|
90
|
+
fieldName: string,
|
|
91
|
+
): number => {
|
|
92
|
+
let normalizedValue: unknown = value;
|
|
93
|
+
|
|
94
|
+
if (typeof normalizedValue === "string") {
|
|
95
|
+
const trimmedValue: string = normalizedValue.trim();
|
|
96
|
+
normalizedValue =
|
|
97
|
+
trimmedValue === "" ? Number.NaN : Number(trimmedValue);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (
|
|
101
|
+
typeof normalizedValue !== "number" ||
|
|
102
|
+
!Number.isFinite(normalizedValue) ||
|
|
103
|
+
!Number.isInteger(normalizedValue) ||
|
|
104
|
+
normalizedValue < 1 ||
|
|
105
|
+
normalizedValue > 100
|
|
106
|
+
) {
|
|
107
|
+
throw new BadDataException(
|
|
108
|
+
`${fieldName} must be an integer between 1 and 100.`,
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return normalizedValue;
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
if (
|
|
116
|
+
updateBy.data.clickhouseCapacityNotificationThresholdPercent !== undefined
|
|
117
|
+
) {
|
|
118
|
+
updateBy.data.clickhouseCapacityNotificationThresholdPercent =
|
|
119
|
+
normalizePercent(
|
|
120
|
+
updateBy.data
|
|
121
|
+
.clickhouseCapacityNotificationThresholdPercent as unknown,
|
|
122
|
+
"ClickHouse capacity notification threshold",
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (updateBy.data.clickhouseDataPruningThresholdPercent !== undefined) {
|
|
127
|
+
updateBy.data.clickhouseDataPruningThresholdPercent = normalizePercent(
|
|
128
|
+
updateBy.data.clickhouseDataPruningThresholdPercent as unknown,
|
|
129
|
+
"ClickHouse data pruning threshold",
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (updateBy.data.clickhouseDataPruningTargetPercent !== undefined) {
|
|
134
|
+
updateBy.data.clickhouseDataPruningTargetPercent = normalizePercent(
|
|
135
|
+
updateBy.data.clickhouseDataPruningTargetPercent as unknown,
|
|
136
|
+
"ClickHouse data pruning target",
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const getEffectivePercent: (
|
|
141
|
+
updatedValue: unknown,
|
|
142
|
+
currentValue: number | undefined,
|
|
143
|
+
defaultValue: number,
|
|
144
|
+
fieldName: string,
|
|
145
|
+
) => number = (
|
|
146
|
+
updatedValue: unknown,
|
|
147
|
+
currentValue: number | undefined,
|
|
148
|
+
defaultValue: number,
|
|
149
|
+
fieldName: string,
|
|
150
|
+
): number => {
|
|
151
|
+
const value: unknown =
|
|
152
|
+
updatedValue !== undefined
|
|
153
|
+
? updatedValue
|
|
154
|
+
: currentValue ?? defaultValue;
|
|
155
|
+
|
|
156
|
+
return normalizePercent(value, fieldName);
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
getEffectivePercent(
|
|
160
|
+
updateBy.data.clickhouseCapacityNotificationThresholdPercent,
|
|
161
|
+
currentConfig?.clickhouseCapacityNotificationThresholdPercent,
|
|
162
|
+
80,
|
|
163
|
+
"ClickHouse capacity notification threshold",
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
const pruningThresholdPercent: number = getEffectivePercent(
|
|
167
|
+
updateBy.data.clickhouseDataPruningThresholdPercent,
|
|
168
|
+
currentConfig?.clickhouseDataPruningThresholdPercent,
|
|
169
|
+
90,
|
|
170
|
+
"ClickHouse data pruning threshold",
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
const pruningTargetPercent: number = getEffectivePercent(
|
|
174
|
+
updateBy.data.clickhouseDataPruningTargetPercent,
|
|
175
|
+
currentConfig?.clickhouseDataPruningTargetPercent,
|
|
176
|
+
80,
|
|
177
|
+
"ClickHouse data pruning target",
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
if (pruningTargetPercent >= pruningThresholdPercent) {
|
|
181
|
+
throw new BadDataException(
|
|
182
|
+
"ClickHouse data pruning target must be lower than the pruning threshold.",
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
return {
|
|
187
|
+
updateBy,
|
|
188
|
+
carryForward: null,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
|
|
44
192
|
@CaptureSpan()
|
|
45
193
|
protected override async onUpdateSuccess(
|
|
46
194
|
onUpdate: OnUpdate<Model>,
|
|
@@ -6,6 +6,9 @@ import FindBy from "../Types/Database/FindBy";
|
|
|
6
6
|
import { OnCreate, OnDelete, OnFind, OnUpdate } from "../Types/Database/Hooks";
|
|
7
7
|
import QueryHelper from "../Types/Database/QueryHelper";
|
|
8
8
|
import DatabaseService from "./DatabaseService";
|
|
9
|
+
import AIRunService from "./AIRunService";
|
|
10
|
+
import AIRunType from "../../Types/AI/AIRunType";
|
|
11
|
+
import AIRunStatus from "../../Types/AI/AIRunStatus";
|
|
9
12
|
import IncidentOwnerTeamService from "./IncidentOwnerTeamService";
|
|
10
13
|
import IncidentOwnerUserService from "./IncidentOwnerUserService";
|
|
11
14
|
import IncidentStateService from "./IncidentStateService";
|
|
@@ -84,7 +87,7 @@ import ProjectService from "./ProjectService";
|
|
|
84
87
|
import IncidentTemplateService from "./IncidentTemplateService";
|
|
85
88
|
import IncidentTemplate from "../../Models/DatabaseModels/IncidentTemplate";
|
|
86
89
|
import AIService, { AILogResponse } from "./AIService";
|
|
87
|
-
import
|
|
90
|
+
import AIIncidentInvestigationRunner from "../Utils/AI/SRE/IncidentInvestigationRunner";
|
|
88
91
|
import IncidentAIContextBuilder, {
|
|
89
92
|
AIGenerationContext,
|
|
90
93
|
IncidentContextData,
|
|
@@ -1239,21 +1242,21 @@ export class Service extends DatabaseService<Model> {
|
|
|
1239
1242
|
})
|
|
1240
1243
|
.then(async () => {
|
|
1241
1244
|
/*
|
|
1242
|
-
*
|
|
1245
|
+
* AI (AI SRE): automatically investigate the new incident and post
|
|
1243
1246
|
* a cited root cause analysis to the incident timeline + Slack/Teams.
|
|
1244
1247
|
* Runs last so the workspace channels already exist, and is gated per
|
|
1245
1248
|
* project (opt-in) + requires a configured LLM provider. Read-only.
|
|
1246
1249
|
*/
|
|
1247
1250
|
try {
|
|
1248
1251
|
if (createdItem.projectId && createdItem.id) {
|
|
1249
|
-
await
|
|
1252
|
+
await AIIncidentInvestigationRunner.investigateNewIncident({
|
|
1250
1253
|
incidentId: createdItem.id,
|
|
1251
1254
|
projectId: createdItem.projectId,
|
|
1252
1255
|
});
|
|
1253
1256
|
}
|
|
1254
1257
|
} catch (error) {
|
|
1255
1258
|
logger.error(
|
|
1256
|
-
`
|
|
1259
|
+
`AI incident investigation failed in IncidentService.onCreateSuccess: ${error}`,
|
|
1257
1260
|
{
|
|
1258
1261
|
projectId: createdItem.projectId?.toString(),
|
|
1259
1262
|
incidentId: createdItem.id?.toString(),
|
|
@@ -2795,14 +2798,23 @@ ${incidentSeverity.name}
|
|
|
2795
2798
|
return Service.DEFAULT_METRIC_RETENTION_DAYS;
|
|
2796
2799
|
}
|
|
2797
2800
|
|
|
2801
|
+
/*
|
|
2802
|
+
* Load the incident + its owners and build the attribute set shared by
|
|
2803
|
+
* every incident metric (all values strings for ClickHouse
|
|
2804
|
+
* Map(String, String) storage; arrays joined comma-separated). Factored
|
|
2805
|
+
* out of refreshIncidentMetrics so one-off metric writers — e.g. the
|
|
2806
|
+
* AI time-to-rca metric recorded when an investigation posts its
|
|
2807
|
+
* analysis — record the exact same attribute shape.
|
|
2808
|
+
*/
|
|
2798
2809
|
@CaptureSpan()
|
|
2799
|
-
public async
|
|
2810
|
+
public async getIncidentMetricContext(data: {
|
|
2800
2811
|
incidentId: ObjectID;
|
|
2801
|
-
}): Promise<
|
|
2812
|
+
}): Promise<{ incident: Model; baseMetricAttributes: JSONObject }> {
|
|
2802
2813
|
const incident: Model | null = await this.findOneById({
|
|
2803
2814
|
id: data.incidentId,
|
|
2804
2815
|
select: {
|
|
2805
2816
|
projectId: true,
|
|
2817
|
+
createdAt: true,
|
|
2806
2818
|
declaredAt: true,
|
|
2807
2819
|
postmortemPostedAt: true,
|
|
2808
2820
|
monitors: {
|
|
@@ -2898,6 +2910,161 @@ ${incidentSeverity.name}
|
|
|
2898
2910
|
return Boolean(name);
|
|
2899
2911
|
}) as Array<string>;
|
|
2900
2912
|
|
|
2913
|
+
/*
|
|
2914
|
+
* common attributes shared by all incident metrics
|
|
2915
|
+
* All values must be strings for ClickHouse Map(String, String) storage.
|
|
2916
|
+
* Arrays are joined as comma-separated strings.
|
|
2917
|
+
*/
|
|
2918
|
+
const baseMetricAttributes: JSONObject = {
|
|
2919
|
+
incidentId: data.incidentId.toString(),
|
|
2920
|
+
projectId: incident.projectId.toString(),
|
|
2921
|
+
monitorIds: (
|
|
2922
|
+
incident.monitors
|
|
2923
|
+
?.map((monitor: Monitor) => {
|
|
2924
|
+
return monitor._id?.toString();
|
|
2925
|
+
})
|
|
2926
|
+
.filter(Boolean) || []
|
|
2927
|
+
).join(", "),
|
|
2928
|
+
monitorNames: (
|
|
2929
|
+
incident.monitors
|
|
2930
|
+
?.map((monitor: Monitor) => {
|
|
2931
|
+
return monitor.name?.toString();
|
|
2932
|
+
})
|
|
2933
|
+
.filter(Boolean) || []
|
|
2934
|
+
).join(", "),
|
|
2935
|
+
incidentSeverityId: incident.incidentSeverity?._id?.toString(),
|
|
2936
|
+
incidentSeverityName: incident.incidentSeverity?.name?.toString(),
|
|
2937
|
+
ownerUserIds: ownerUserIds.join(", "),
|
|
2938
|
+
ownerUserNames: ownerUserNames.join(", "),
|
|
2939
|
+
ownerTeamIds: ownerTeamIds.join(", "),
|
|
2940
|
+
ownerTeamNames: ownerTeamNames.join(", "),
|
|
2941
|
+
};
|
|
2942
|
+
|
|
2943
|
+
return { incident, baseMetricAttributes };
|
|
2944
|
+
}
|
|
2945
|
+
|
|
2946
|
+
/*
|
|
2947
|
+
* AI measurement layer: record how long the incident waited for its
|
|
2948
|
+
* AI root-cause analysis — seconds from incident creation to now, written
|
|
2949
|
+
* once from IncidentInvestigationRunner.postAnalysis. Deliberately NOT
|
|
2950
|
+
* part of refreshIncidentMetrics: the refresh's replace-list excludes
|
|
2951
|
+
* this metric name, so refreshes never tombstone it.
|
|
2952
|
+
*/
|
|
2953
|
+
@CaptureSpan()
|
|
2954
|
+
public async recordTimeToRootCausePostedMetric(data: {
|
|
2955
|
+
incidentId: ObjectID;
|
|
2956
|
+
}): Promise<void> {
|
|
2957
|
+
const {
|
|
2958
|
+
incident,
|
|
2959
|
+
baseMetricAttributes,
|
|
2960
|
+
}: { incident: Model; baseMetricAttributes: JSONObject } =
|
|
2961
|
+
await this.getIncidentMetricContext({ incidentId: data.incidentId });
|
|
2962
|
+
|
|
2963
|
+
const now: Date = OneUptimeDate.getCurrentDate();
|
|
2964
|
+
const incidentCreatedAt: Date =
|
|
2965
|
+
incident.createdAt || incident.declaredAt || now;
|
|
2966
|
+
|
|
2967
|
+
const metricRetentionDays: number = await this.getMetricRetentionDays();
|
|
2968
|
+
const retentionDate: Date = OneUptimeDate.addRemoveDays(
|
|
2969
|
+
OneUptimeDate.getCurrentDate(),
|
|
2970
|
+
metricRetentionDays,
|
|
2971
|
+
);
|
|
2972
|
+
|
|
2973
|
+
const timeToRcaMetric: MutableMetric = new MutableMetric();
|
|
2974
|
+
|
|
2975
|
+
timeToRcaMetric.projectId = incident.projectId!;
|
|
2976
|
+
timeToRcaMetric.primaryEntityId = incident.id!;
|
|
2977
|
+
timeToRcaMetric.primaryEntityType = ServiceType.Incident;
|
|
2978
|
+
timeToRcaMetric.name = IncidentMetricType.TimeToRootCausePosted;
|
|
2979
|
+
timeToRcaMetric.metricPointId = IncidentMetricType.TimeToRootCausePosted;
|
|
2980
|
+
timeToRcaMetric.value = OneUptimeDate.getDifferenceInSeconds(
|
|
2981
|
+
now,
|
|
2982
|
+
incidentCreatedAt,
|
|
2983
|
+
);
|
|
2984
|
+
timeToRcaMetric.attributes = {
|
|
2985
|
+
...baseMetricAttributes,
|
|
2986
|
+
// Every time-to-rca point is AI-posted by construction.
|
|
2987
|
+
aiInvestigated: "true",
|
|
2988
|
+
};
|
|
2989
|
+
timeToRcaMetric.attributeKeys = TelemetryUtil.getAttributeKeys(
|
|
2990
|
+
timeToRcaMetric.attributes,
|
|
2991
|
+
);
|
|
2992
|
+
timeToRcaMetric.time = now;
|
|
2993
|
+
timeToRcaMetric.timeUnixNano = OneUptimeDate.toUnixNano(now);
|
|
2994
|
+
timeToRcaMetric.metricPointType = MetricPointType.Sum;
|
|
2995
|
+
timeToRcaMetric.retentionDate = retentionDate;
|
|
2996
|
+
|
|
2997
|
+
await MutableMetricService.createMutableMetrics({
|
|
2998
|
+
metrics: [timeToRcaMetric],
|
|
2999
|
+
});
|
|
3000
|
+
|
|
3001
|
+
// Register the metric type so it shows up in the type catalog.
|
|
3002
|
+
const metricType: MetricType = new MetricType();
|
|
3003
|
+
metricType.name = IncidentMetricType.TimeToRootCausePosted;
|
|
3004
|
+
metricType.description =
|
|
3005
|
+
"Time from incident creation to the AI investigation's posted root-cause analysis";
|
|
3006
|
+
metricType.unit = "seconds";
|
|
3007
|
+
|
|
3008
|
+
TelemetryUtil.indexMetricNameServiceNameMap({
|
|
3009
|
+
metricNameServiceNameMap: {
|
|
3010
|
+
[IncidentMetricType.TimeToRootCausePosted]: metricType,
|
|
3011
|
+
},
|
|
3012
|
+
projectId: incident.projectId!,
|
|
3013
|
+
}).catch((err: Error) => {
|
|
3014
|
+
logger.error(err, {
|
|
3015
|
+
projectId: incident.projectId?.toString(),
|
|
3016
|
+
incidentId: incident.id?.toString(),
|
|
3017
|
+
} as LogAttributes);
|
|
3018
|
+
});
|
|
3019
|
+
}
|
|
3020
|
+
|
|
3021
|
+
@CaptureSpan()
|
|
3022
|
+
public async refreshIncidentMetrics(data: {
|
|
3023
|
+
incidentId: ObjectID;
|
|
3024
|
+
}): Promise<void> {
|
|
3025
|
+
const {
|
|
3026
|
+
incident,
|
|
3027
|
+
baseMetricAttributes,
|
|
3028
|
+
}: { incident: Model; baseMetricAttributes: JSONObject } =
|
|
3029
|
+
await this.getIncidentMetricContext({ incidentId: data.incidentId });
|
|
3030
|
+
|
|
3031
|
+
// getIncidentMetricContext guarantees this; re-checked for TS narrowing.
|
|
3032
|
+
if (!incident.projectId) {
|
|
3033
|
+
throw new BadDataException("Incident Project ID not found");
|
|
3034
|
+
}
|
|
3035
|
+
|
|
3036
|
+
/*
|
|
3037
|
+
* aiInvestigated dimension for MTTA/MTTR (AI measurement layer):
|
|
3038
|
+
* did a completed AI investigation run for this incident? One
|
|
3039
|
+
* indexed countBy per metric refresh (triggeredByIncidentId is indexed)
|
|
3040
|
+
* — acceptable at refresh frequency. Failure must never break metric
|
|
3041
|
+
* recording, so this is best-effort false.
|
|
3042
|
+
*/
|
|
3043
|
+
let aiInvestigated: boolean = false;
|
|
3044
|
+
try {
|
|
3045
|
+
const completedInvestigationCount: PositiveNumber =
|
|
3046
|
+
await AIRunService.countBy({
|
|
3047
|
+
query: {
|
|
3048
|
+
runType: AIRunType.Investigation,
|
|
3049
|
+
status: AIRunStatus.Completed,
|
|
3050
|
+
triggeredByIncidentId: data.incidentId,
|
|
3051
|
+
},
|
|
3052
|
+
props: {
|
|
3053
|
+
isRoot: true,
|
|
3054
|
+
},
|
|
3055
|
+
});
|
|
3056
|
+
|
|
3057
|
+
aiInvestigated = completedInvestigationCount.toNumber() > 0;
|
|
3058
|
+
} catch (err) {
|
|
3059
|
+
logger.error(
|
|
3060
|
+
err as Error,
|
|
3061
|
+
{
|
|
3062
|
+
projectId: incident.projectId?.toString(),
|
|
3063
|
+
incidentId: incident.id?.toString(),
|
|
3064
|
+
} as LogAttributes,
|
|
3065
|
+
);
|
|
3066
|
+
}
|
|
3067
|
+
|
|
2901
3068
|
// get incident state timeline
|
|
2902
3069
|
|
|
2903
3070
|
const incidentStateTimelines: Array<IncidentStateTimeline> =
|
|
@@ -2973,36 +3140,6 @@ ${incidentSeverity.name}
|
|
|
2973
3140
|
|
|
2974
3141
|
const metricTypesMap: Dictionary<MetricType> = {};
|
|
2975
3142
|
|
|
2976
|
-
/*
|
|
2977
|
-
* common attributes shared by all incident metrics
|
|
2978
|
-
* All values must be strings for ClickHouse Map(String, String) storage.
|
|
2979
|
-
* Arrays are joined as comma-separated strings.
|
|
2980
|
-
*/
|
|
2981
|
-
const baseMetricAttributes: JSONObject = {
|
|
2982
|
-
incidentId: data.incidentId.toString(),
|
|
2983
|
-
projectId: incident.projectId.toString(),
|
|
2984
|
-
monitorIds: (
|
|
2985
|
-
incident.monitors
|
|
2986
|
-
?.map((monitor: Monitor) => {
|
|
2987
|
-
return monitor._id?.toString();
|
|
2988
|
-
})
|
|
2989
|
-
.filter(Boolean) || []
|
|
2990
|
-
).join(", "),
|
|
2991
|
-
monitorNames: (
|
|
2992
|
-
incident.monitors
|
|
2993
|
-
?.map((monitor: Monitor) => {
|
|
2994
|
-
return monitor.name?.toString();
|
|
2995
|
-
})
|
|
2996
|
-
.filter(Boolean) || []
|
|
2997
|
-
).join(", "),
|
|
2998
|
-
incidentSeverityId: incident.incidentSeverity?._id?.toString(),
|
|
2999
|
-
incidentSeverityName: incident.incidentSeverity?.name?.toString(),
|
|
3000
|
-
ownerUserIds: ownerUserIds.join(", "),
|
|
3001
|
-
ownerUserNames: ownerUserNames.join(", "),
|
|
3002
|
-
ownerTeamIds: ownerTeamIds.join(", "),
|
|
3003
|
-
ownerTeamNames: ownerTeamNames.join(", "),
|
|
3004
|
-
};
|
|
3005
|
-
|
|
3006
3143
|
const incidentCountMetric: MutableMetric = new MutableMetric();
|
|
3007
3144
|
|
|
3008
3145
|
incidentCountMetric.projectId = incident.projectId;
|
|
@@ -3068,7 +3205,11 @@ ${incidentSeverity.name}
|
|
|
3068
3205
|
OneUptimeDate.getCurrentDate(),
|
|
3069
3206
|
incidentStartsAt,
|
|
3070
3207
|
);
|
|
3071
|
-
|
|
3208
|
+
// aiInvestigated: the MTTA with/without-AI dimension.
|
|
3209
|
+
timeToAcknowledgeMetric.attributes = {
|
|
3210
|
+
...baseMetricAttributes,
|
|
3211
|
+
aiInvestigated: aiInvestigated.toString(),
|
|
3212
|
+
};
|
|
3072
3213
|
timeToAcknowledgeMetric.attributeKeys =
|
|
3073
3214
|
TelemetryUtil.getAttributeKeys(timeToAcknowledgeMetric.attributes);
|
|
3074
3215
|
|
|
@@ -3119,7 +3260,11 @@ ${incidentSeverity.name}
|
|
|
3119
3260
|
OneUptimeDate.getCurrentDate(),
|
|
3120
3261
|
incidentStartsAt,
|
|
3121
3262
|
);
|
|
3122
|
-
|
|
3263
|
+
// aiInvestigated: the MTTR with/without-AI dimension.
|
|
3264
|
+
timeToResolveMetric.attributes = {
|
|
3265
|
+
...baseMetricAttributes,
|
|
3266
|
+
aiInvestigated: aiInvestigated.toString(),
|
|
3267
|
+
};
|
|
3123
3268
|
timeToResolveMetric.attributeKeys = TelemetryUtil.getAttributeKeys(
|
|
3124
3269
|
timeToResolveMetric.attributes,
|
|
3125
3270
|
);
|