@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
|
@@ -0,0 +1,521 @@
|
|
|
1
|
+
import ObjectID from "../../../../../../Types/ObjectID";
|
|
2
|
+
import OneUptimeDate from "../../../../../../Types/Date";
|
|
3
|
+
import SortOrder from "../../../../../../Types/BaseDatabase/SortOrder";
|
|
4
|
+
import InBetween from "../../../../../../Types/BaseDatabase/InBetween";
|
|
5
|
+
import AIInsightType from "../../../../../../Types/AI/AIInsightType";
|
|
6
|
+
import AIInsightSeverity from "../../../../../../Types/AI/AIInsightSeverity";
|
|
7
|
+
import {
|
|
8
|
+
PerformanceCodeLocation,
|
|
9
|
+
PerformanceFinding,
|
|
10
|
+
} from "../../../../../../Types/AI/CodeFixTaskContext";
|
|
11
|
+
import Span from "../../../../../../Models/AnalyticsModels/Span";
|
|
12
|
+
import Service from "../../../../../../Models/DatabaseModels/Service";
|
|
13
|
+
import SpanService from "../../../../../Services/SpanService";
|
|
14
|
+
import ServiceService from "../../../../../Services/ServiceService";
|
|
15
|
+
import TraceAggregationService, {
|
|
16
|
+
ServiceLatencyProfile,
|
|
17
|
+
ServiceLatencyProfileRow,
|
|
18
|
+
TraceAnalyticsTopItem,
|
|
19
|
+
} from "../../../../../Services/TraceAggregationService";
|
|
20
|
+
import SpanTreeAnalyzer, {
|
|
21
|
+
AnalyzableSpan,
|
|
22
|
+
} from "../../../PerfEvidence/SpanTreeAnalyzer";
|
|
23
|
+
import FixPerformanceTaskTrigger from "../../FixPerformanceTaskTrigger";
|
|
24
|
+
import logger from "../../../../Logger";
|
|
25
|
+
import {
|
|
26
|
+
InsightCandidate,
|
|
27
|
+
InsightDetector,
|
|
28
|
+
InsightScanContext,
|
|
29
|
+
} from "../Types";
|
|
30
|
+
|
|
31
|
+
/*
|
|
32
|
+
* TraceLatencyRegression — a service whose recent p99 span latency
|
|
33
|
+
* regressed to a multiple of its own 24-hour baseline, with the evidence
|
|
34
|
+
* drilled down to span-tree findings from a representative slow trace.
|
|
35
|
+
*
|
|
36
|
+
* Stage 1 is two per-service latency-profile queries (recent hour vs the
|
|
37
|
+
* prior 24h) via TraceAggregationService.getServiceLatencyProfile, which is
|
|
38
|
+
* served by the Span proj_agg_by_service aggregate projection: this runs
|
|
39
|
+
* unattended for every opted-in project every 15 minutes, so it must read
|
|
40
|
+
* pre-aggregated minute rows, not 25 hours of raw spans. p99 (not p95) on
|
|
41
|
+
* purpose: quantile(0.99) is the only percentile state that projection
|
|
42
|
+
* stores, and quantile states of different levels do not merge. The drill
|
|
43
|
+
* (slowest operation → representative trace → span-tree analysis → code
|
|
44
|
+
* locations) runs ONLY for services that regressed, and the resulting
|
|
45
|
+
* findings are stored on the insight because ClickHouse span retention is
|
|
46
|
+
* short — the stored evidence must outlive the spans (FixPerformance
|
|
47
|
+
* taskContext precedent). Deterministic — no LLM anywhere in this detector.
|
|
48
|
+
*/
|
|
49
|
+
|
|
50
|
+
// The regression window, compared against the prior baseline window.
|
|
51
|
+
export const LATENCY_RECENT_WINDOW_HOURS: number = 1;
|
|
52
|
+
|
|
53
|
+
/*
|
|
54
|
+
* Baseline: the 24 hours before the regression window. Self-baselining
|
|
55
|
+
* per service — a chronically slow service does not alert on being its
|
|
56
|
+
* usual slow self.
|
|
57
|
+
*/
|
|
58
|
+
export const LATENCY_BASELINE_WINDOW_HOURS: number = 24;
|
|
59
|
+
|
|
60
|
+
/*
|
|
61
|
+
* Absolute floor: a p99 under one second is not worth a human's attention
|
|
62
|
+
* even if it doubled — sub-second "regressions" are dominated by cache
|
|
63
|
+
* and GC noise.
|
|
64
|
+
*/
|
|
65
|
+
export const LATENCY_MIN_RECENT_P99_MS: number = 1000;
|
|
66
|
+
|
|
67
|
+
// p99 multiplier over the service's own baseline that counts as regression.
|
|
68
|
+
export const LATENCY_MIN_REGRESSION_MULTIPLIER: number = 2;
|
|
69
|
+
|
|
70
|
+
// A >= 4x p99 regression is a step change — escalate to High.
|
|
71
|
+
export const LATENCY_HIGH_SEVERITY_MULTIPLIER: number = 4;
|
|
72
|
+
|
|
73
|
+
/*
|
|
74
|
+
* The baseline p99 is only trustworthy with enough prior samples; below
|
|
75
|
+
* this the "baseline" is a handful of requests and the multiplier is
|
|
76
|
+
* noise. Matches the cold-start posture of the metric baselines.
|
|
77
|
+
*/
|
|
78
|
+
export const LATENCY_MIN_PRIOR_SAMPLE_COUNT: number = 100;
|
|
79
|
+
|
|
80
|
+
/*
|
|
81
|
+
* Per-service rows fetched per window. The profile query ranks by request
|
|
82
|
+
* volume, so this bounds the scan to the 25 busiest services — the ones a
|
|
83
|
+
* p99 regression actually hurts (and the prior-sample-count gate would
|
|
84
|
+
* reject quiet services anyway).
|
|
85
|
+
*/
|
|
86
|
+
export const LATENCY_SERVICE_LIMIT: number = 25;
|
|
87
|
+
|
|
88
|
+
/*
|
|
89
|
+
* Span cap for the representative-trace fetch — mirrors the trace
|
|
90
|
+
* waterfall tools' cap; beyond this the analyzer's evidence quality
|
|
91
|
+
* degrades anyway.
|
|
92
|
+
*/
|
|
93
|
+
export const LATENCY_MAX_TRACE_SPANS: number = 500;
|
|
94
|
+
|
|
95
|
+
/*
|
|
96
|
+
* The drill's top-list ranks operations by p99, and for a group of ONE span
|
|
97
|
+
* the p99 IS that span's own duration — so a single freak-slow request would
|
|
98
|
+
* take the top slot outright. Fetch a small candidate set instead of one row
|
|
99
|
+
* and let the sample floor below choose among them. Ten is enough: an
|
|
100
|
+
* operation that cannot beat ten rivals on p99 is not the story.
|
|
101
|
+
*/
|
|
102
|
+
export const LATENCY_TOP_OPERATION_CANDIDATES: number = 10;
|
|
103
|
+
|
|
104
|
+
/*
|
|
105
|
+
* Minimum spans an operation must have in the recent window before its p99
|
|
106
|
+
* is treated as evidence — and, just as load-bearing, before its name is
|
|
107
|
+
* allowed into the fingerprint. The fingerprint embeds the operation, so a
|
|
108
|
+
* noisy winner does not merely mislabel one insight: it churns the dedupe
|
|
109
|
+
* key tick after tick, and each new key is a NEW insight row plus a NEW
|
|
110
|
+
* triage LLM run for one and the same ongoing regression. Deliberately far
|
|
111
|
+
* below LATENCY_MIN_PRIOR_SAMPLE_COUNT — this gate only asks "is this
|
|
112
|
+
* operation real traffic", not "is this baseline trustworthy".
|
|
113
|
+
*/
|
|
114
|
+
export const LATENCY_MIN_OPERATION_SAMPLE_COUNT: number = 20;
|
|
115
|
+
|
|
116
|
+
export interface LatencyRegressionDecision {
|
|
117
|
+
isRegression: boolean;
|
|
118
|
+
// recent p99 / prior p99 (0 when the prior p99 is 0).
|
|
119
|
+
multiplier: number;
|
|
120
|
+
severity: AIInsightSeverity;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// One service's joined recent-vs-prior latency profile.
|
|
124
|
+
export interface ServiceLatencyWindows {
|
|
125
|
+
primaryEntityId: string;
|
|
126
|
+
recentP99Ms: number;
|
|
127
|
+
recentSampleCount: number;
|
|
128
|
+
priorP99Ms: number;
|
|
129
|
+
priorSampleCount: number;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export default class TraceLatencyRegressionDetector implements InsightDetector {
|
|
133
|
+
public insightType: AIInsightType = AIInsightType.TraceLatencyRegression;
|
|
134
|
+
|
|
135
|
+
/*
|
|
136
|
+
* Pure decision: regression ⇔ recent p99 >= LATENCY_MIN_RECENT_P99_MS
|
|
137
|
+
* AND prior window has >= LATENCY_MIN_PRIOR_SAMPLE_COUNT samples AND
|
|
138
|
+
* recent p99 >= LATENCY_MIN_REGRESSION_MULTIPLIER * prior p99 (> 0).
|
|
139
|
+
*/
|
|
140
|
+
public static evaluateRegression(input: {
|
|
141
|
+
recentP99Ms: number;
|
|
142
|
+
priorP99Ms: number;
|
|
143
|
+
priorSampleCount: number;
|
|
144
|
+
}): LatencyRegressionDecision {
|
|
145
|
+
const multiplier: number =
|
|
146
|
+
input.priorP99Ms > 0 ? input.recentP99Ms / input.priorP99Ms : 0;
|
|
147
|
+
|
|
148
|
+
const isRegression: boolean =
|
|
149
|
+
input.recentP99Ms >= LATENCY_MIN_RECENT_P99_MS &&
|
|
150
|
+
input.priorSampleCount >= LATENCY_MIN_PRIOR_SAMPLE_COUNT &&
|
|
151
|
+
input.priorP99Ms > 0 &&
|
|
152
|
+
multiplier >= LATENCY_MIN_REGRESSION_MULTIPLIER;
|
|
153
|
+
|
|
154
|
+
return {
|
|
155
|
+
isRegression,
|
|
156
|
+
multiplier,
|
|
157
|
+
severity:
|
|
158
|
+
multiplier >= LATENCY_HIGH_SEVERITY_MULTIPLIER
|
|
159
|
+
? AIInsightSeverity.High
|
|
160
|
+
: AIInsightSeverity.Medium,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/*
|
|
165
|
+
* Pure join of the two per-service profile query results on
|
|
166
|
+
* primaryEntityId. Services missing from the prior window join with a
|
|
167
|
+
* zero baseline (and are then rejected by the sample-count gate).
|
|
168
|
+
*/
|
|
169
|
+
public static joinServiceWindows(
|
|
170
|
+
recentRows: Array<ServiceLatencyProfileRow>,
|
|
171
|
+
priorRows: Array<ServiceLatencyProfileRow>,
|
|
172
|
+
): Array<ServiceLatencyWindows> {
|
|
173
|
+
const priorByEntity: Map<string, ServiceLatencyProfileRow> = new Map();
|
|
174
|
+
for (const row of priorRows) {
|
|
175
|
+
if (row.primaryEntityId) {
|
|
176
|
+
priorByEntity.set(row.primaryEntityId, row);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
const joined: Array<ServiceLatencyWindows> = [];
|
|
181
|
+
for (const row of recentRows) {
|
|
182
|
+
const entityId: string = row.primaryEntityId || "";
|
|
183
|
+
if (!entityId) {
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
const prior: ServiceLatencyProfileRow | undefined =
|
|
187
|
+
priorByEntity.get(entityId);
|
|
188
|
+
joined.push({
|
|
189
|
+
primaryEntityId: entityId,
|
|
190
|
+
recentP99Ms: row.p99DurationMs,
|
|
191
|
+
recentSampleCount: row.count,
|
|
192
|
+
priorP99Ms: prior?.p99DurationMs || 0,
|
|
193
|
+
priorSampleCount: prior?.count || 0,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
return joined;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/*
|
|
200
|
+
* Pure decision: the slowest operation whose p99 is backed by real
|
|
201
|
+
* traffic. Candidates below LATENCY_MIN_OPERATION_SAMPLE_COUNT are
|
|
202
|
+
* dropped outright — with n=1 the "p99" is just that one span, so an
|
|
203
|
+
* unfiltered ranking hands the top slot to whatever freak request the
|
|
204
|
+
* window happened to catch.
|
|
205
|
+
*
|
|
206
|
+
* Ranking is re-established here rather than trusting the query's row
|
|
207
|
+
* order: ClickHouse's ORDER BY val DESC is not a total order, and ties
|
|
208
|
+
* broken arbitrarily by the server would move the fingerprint (which
|
|
209
|
+
* embeds the operation name) from tick to tick. Ties fall to volume,
|
|
210
|
+
* then to the name — a total, deterministic order.
|
|
211
|
+
*
|
|
212
|
+
* Undefined when nothing clears the floor. The caller then emits
|
|
213
|
+
* service-level evidence under the stable service-scoped fingerprint,
|
|
214
|
+
* which is strictly better than naming an operation we do not believe.
|
|
215
|
+
*/
|
|
216
|
+
public static pickSlowestOperation(
|
|
217
|
+
items: Array<TraceAnalyticsTopItem>,
|
|
218
|
+
): string | undefined {
|
|
219
|
+
const credible: Array<TraceAnalyticsTopItem> = items.filter(
|
|
220
|
+
(item: TraceAnalyticsTopItem): boolean => {
|
|
221
|
+
return (
|
|
222
|
+
item.value.length > 0 &&
|
|
223
|
+
item.count >= LATENCY_MIN_OPERATION_SAMPLE_COUNT
|
|
224
|
+
);
|
|
225
|
+
},
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
credible.sort(
|
|
229
|
+
(a: TraceAnalyticsTopItem, b: TraceAnalyticsTopItem): number => {
|
|
230
|
+
if (b.metricValue !== a.metricValue) {
|
|
231
|
+
return b.metricValue - a.metricValue;
|
|
232
|
+
}
|
|
233
|
+
if (b.count !== a.count) {
|
|
234
|
+
return b.count - a.count;
|
|
235
|
+
}
|
|
236
|
+
return a.value.localeCompare(b.value);
|
|
237
|
+
},
|
|
238
|
+
);
|
|
239
|
+
|
|
240
|
+
return credible[0]?.value;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/*
|
|
244
|
+
* Nanoseconds → milliseconds conversion into the analyzer's input shape
|
|
245
|
+
* (the AIInvestigationAPI conversion, kept local because the API file
|
|
246
|
+
* does not export it). Pure — the ns→ms arithmetic is unit-tested.
|
|
247
|
+
*/
|
|
248
|
+
public static toAnalyzableSpans(spans: Array<Span>): Array<AnalyzableSpan> {
|
|
249
|
+
return spans.map((span: Span): AnalyzableSpan => {
|
|
250
|
+
const attributes: Record<string, string> = {};
|
|
251
|
+
|
|
252
|
+
for (const [key, value] of Object.entries(span.attributes || {})) {
|
|
253
|
+
if (value !== null && value !== undefined) {
|
|
254
|
+
attributes[key] = String(value);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
return {
|
|
259
|
+
spanId: span.spanId?.toString() || "",
|
|
260
|
+
parentSpanId: span.parentSpanId?.toString() || undefined,
|
|
261
|
+
name: span.name || "",
|
|
262
|
+
startMs: Number(span.startTimeUnixNano) / 1_000_000,
|
|
263
|
+
endMs: Number(span.endTimeUnixNano) / 1_000_000,
|
|
264
|
+
durationMs: Number(span.durationUnixNano) / 1_000_000,
|
|
265
|
+
attributes,
|
|
266
|
+
};
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/*
|
|
271
|
+
* Stable dedupe key: service + NORMALIZED operation name (ids/digits
|
|
272
|
+
* collapsed), so the same regressing endpoint refreshes one insight no
|
|
273
|
+
* matter which concrete URL the representative trace hit.
|
|
274
|
+
*/
|
|
275
|
+
public static buildFingerprint(
|
|
276
|
+
serviceEntityId: string,
|
|
277
|
+
operationName: string | undefined,
|
|
278
|
+
): string {
|
|
279
|
+
return `latency:${serviceEntityId}:${SpanTreeAnalyzer.normalizeSpanName(
|
|
280
|
+
operationName || "",
|
|
281
|
+
)}`;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
public async detect(
|
|
285
|
+
context: InsightScanContext,
|
|
286
|
+
): Promise<Array<InsightCandidate>> {
|
|
287
|
+
const recentWindowStart: Date = OneUptimeDate.addRemoveHours(
|
|
288
|
+
context.now,
|
|
289
|
+
-1 * LATENCY_RECENT_WINDOW_HOURS,
|
|
290
|
+
);
|
|
291
|
+
const priorWindowStart: Date = OneUptimeDate.addRemoveHours(
|
|
292
|
+
recentWindowStart,
|
|
293
|
+
-1 * LATENCY_BASELINE_WINDOW_HOURS,
|
|
294
|
+
);
|
|
295
|
+
|
|
296
|
+
// Stage 1 — per-service latency profile: recent hour vs prior 24h.
|
|
297
|
+
const recentProfile: ServiceLatencyProfile =
|
|
298
|
+
await TraceAggregationService.getServiceLatencyProfile({
|
|
299
|
+
projectId: context.projectId,
|
|
300
|
+
startTime: recentWindowStart,
|
|
301
|
+
endTime: context.now,
|
|
302
|
+
limit: LATENCY_SERVICE_LIMIT,
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
const priorProfile: ServiceLatencyProfile =
|
|
306
|
+
await TraceAggregationService.getServiceLatencyProfile({
|
|
307
|
+
projectId: context.projectId,
|
|
308
|
+
startTime: priorWindowStart,
|
|
309
|
+
endTime: recentWindowStart,
|
|
310
|
+
limit: LATENCY_SERVICE_LIMIT,
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
/*
|
|
314
|
+
* A partial window is not "less data", it is WRONG data: a p99 and a
|
|
315
|
+
* span count computed over whatever fraction ClickHouse managed before
|
|
316
|
+
* the execution cap fired. Comparing a partial window against a
|
|
317
|
+
* complete one manufactures regressions that never happened (and hides
|
|
318
|
+
* ones that did). Skip this project's latency detection for the tick
|
|
319
|
+
* and let the next one, 15 minutes out, decide — a delayed insight is
|
|
320
|
+
* recoverable, a fabricated one (which may open a fix PR) is not.
|
|
321
|
+
*/
|
|
322
|
+
if (recentProfile.isPartial || priorProfile.isPartial) {
|
|
323
|
+
logger.info(
|
|
324
|
+
`TraceLatencyRegressionDetector: skipping project ${context.projectId.toString()} for this scan — the service latency profile query returned a possibly partial result (execution cap reached).`,
|
|
325
|
+
);
|
|
326
|
+
return [];
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
const joined: Array<ServiceLatencyWindows> =
|
|
330
|
+
TraceLatencyRegressionDetector.joinServiceWindows(
|
|
331
|
+
recentProfile.rows,
|
|
332
|
+
priorProfile.rows,
|
|
333
|
+
);
|
|
334
|
+
|
|
335
|
+
const candidates: Array<InsightCandidate> = [];
|
|
336
|
+
|
|
337
|
+
for (const windows of joined) {
|
|
338
|
+
const decision: LatencyRegressionDecision =
|
|
339
|
+
TraceLatencyRegressionDetector.evaluateRegression({
|
|
340
|
+
recentP99Ms: windows.recentP99Ms,
|
|
341
|
+
priorP99Ms: windows.priorP99Ms,
|
|
342
|
+
priorSampleCount: windows.priorSampleCount,
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
if (!decision.isRegression) {
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
candidates.push(
|
|
350
|
+
await this.drillRegression({
|
|
351
|
+
context,
|
|
352
|
+
windows,
|
|
353
|
+
decision,
|
|
354
|
+
recentWindowStart,
|
|
355
|
+
}),
|
|
356
|
+
);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
return candidates;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/*
|
|
363
|
+
* Drill one regressed service down to a concrete, code-shaped story:
|
|
364
|
+
* slowest CREDIBLE operation (p99 in the spike hour, sample floor
|
|
365
|
+
* applied) → the single slowest span of that operation → its whole trace
|
|
366
|
+
* → deterministic span-tree findings + code.* locations. When no
|
|
367
|
+
* operation clears the floor the insight stays at service level rather
|
|
368
|
+
* than pinning the blame — and the drill queries are skipped entirely.
|
|
369
|
+
*/
|
|
370
|
+
private async drillRegression(input: {
|
|
371
|
+
context: InsightScanContext;
|
|
372
|
+
windows: ServiceLatencyWindows;
|
|
373
|
+
decision: LatencyRegressionDecision;
|
|
374
|
+
recentWindowStart: Date;
|
|
375
|
+
}): Promise<InsightCandidate> {
|
|
376
|
+
const serviceEntityId: ObjectID = new ObjectID(
|
|
377
|
+
input.windows.primaryEntityId,
|
|
378
|
+
);
|
|
379
|
+
|
|
380
|
+
/*
|
|
381
|
+
* Candidate operations for the service — the top-list ranks by the
|
|
382
|
+
* metric (p99) and returns each operation's span count alongside it,
|
|
383
|
+
* which is exactly what the sample floor needs. Bounded: one 1-hour
|
|
384
|
+
* query pinned to the one service that regressed.
|
|
385
|
+
*/
|
|
386
|
+
const topOperations: Array<TraceAnalyticsTopItem> =
|
|
387
|
+
await TraceAggregationService.getAnalyticsTopList({
|
|
388
|
+
projectId: input.context.projectId,
|
|
389
|
+
startTime: input.recentWindowStart,
|
|
390
|
+
endTime: input.context.now,
|
|
391
|
+
bucketSizeInMinutes: LATENCY_RECENT_WINDOW_HOURS * 60,
|
|
392
|
+
chartType: "toplist",
|
|
393
|
+
metric: "p99Duration",
|
|
394
|
+
groupBy: ["name"],
|
|
395
|
+
serviceIds: [serviceEntityId],
|
|
396
|
+
limit: LATENCY_TOP_OPERATION_CANDIDATES,
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
const operationName: string | undefined =
|
|
400
|
+
TraceLatencyRegressionDetector.pickSlowestOperation(topOperations);
|
|
401
|
+
|
|
402
|
+
/*
|
|
403
|
+
* Representative trace: the slowest span of the slowest operation in
|
|
404
|
+
* the spike window, then that trace's full span set. Explicit
|
|
405
|
+
* projectId in every root query — the scanner never relies on ACL.
|
|
406
|
+
*/
|
|
407
|
+
let sampleTraceId: string | undefined = undefined;
|
|
408
|
+
let findings: Array<PerformanceFinding> = [];
|
|
409
|
+
let codeLocations: Array<PerformanceCodeLocation> = [];
|
|
410
|
+
|
|
411
|
+
if (operationName) {
|
|
412
|
+
const slowestSpans: Array<Span> = await SpanService.findBy({
|
|
413
|
+
query: {
|
|
414
|
+
projectId: input.context.projectId,
|
|
415
|
+
primaryEntityId: serviceEntityId,
|
|
416
|
+
name: operationName,
|
|
417
|
+
startTime: new InBetween(input.recentWindowStart, input.context.now),
|
|
418
|
+
} as never,
|
|
419
|
+
select: {
|
|
420
|
+
traceId: true,
|
|
421
|
+
} as never,
|
|
422
|
+
sort: {
|
|
423
|
+
durationUnixNano: SortOrder.Descending,
|
|
424
|
+
} as never,
|
|
425
|
+
limit: 1,
|
|
426
|
+
skip: 0,
|
|
427
|
+
props: { isRoot: true },
|
|
428
|
+
});
|
|
429
|
+
|
|
430
|
+
sampleTraceId = slowestSpans[0]?.traceId?.toString() || undefined;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
if (sampleTraceId) {
|
|
434
|
+
const traceSpans: Array<Span> = await SpanService.findBy({
|
|
435
|
+
query: {
|
|
436
|
+
projectId: input.context.projectId,
|
|
437
|
+
traceId: sampleTraceId,
|
|
438
|
+
} as never,
|
|
439
|
+
select: {
|
|
440
|
+
spanId: true,
|
|
441
|
+
parentSpanId: true,
|
|
442
|
+
name: true,
|
|
443
|
+
startTimeUnixNano: true,
|
|
444
|
+
endTimeUnixNano: true,
|
|
445
|
+
durationUnixNano: true,
|
|
446
|
+
attributes: true,
|
|
447
|
+
} as never,
|
|
448
|
+
sort: {
|
|
449
|
+
startTimeUnixNano: SortOrder.Ascending,
|
|
450
|
+
} as never,
|
|
451
|
+
limit: LATENCY_MAX_TRACE_SPANS,
|
|
452
|
+
skip: 0,
|
|
453
|
+
props: { isRoot: true },
|
|
454
|
+
});
|
|
455
|
+
|
|
456
|
+
const analyzableSpans: Array<AnalyzableSpan> =
|
|
457
|
+
TraceLatencyRegressionDetector.toAnalyzableSpans(traceSpans);
|
|
458
|
+
|
|
459
|
+
findings = SpanTreeAnalyzer.analyzeTrace(analyzableSpans);
|
|
460
|
+
codeLocations = FixPerformanceTaskTrigger.collectCodeLocations(
|
|
461
|
+
analyzableSpans,
|
|
462
|
+
findings,
|
|
463
|
+
);
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
const service: Service | null = await ServiceService.findOneById({
|
|
467
|
+
id: serviceEntityId,
|
|
468
|
+
select: { name: true },
|
|
469
|
+
props: { isRoot: true },
|
|
470
|
+
});
|
|
471
|
+
const serviceName: string | null = service?.name || null;
|
|
472
|
+
|
|
473
|
+
const detailLines: Array<string> = [
|
|
474
|
+
"**Trace latency regression detected**",
|
|
475
|
+
"",
|
|
476
|
+
`- Service: ${serviceName || input.windows.primaryEntityId}`,
|
|
477
|
+
`- Recent p99 (last ${LATENCY_RECENT_WINDOW_HOURS}h): ${input.windows.recentP99Ms.toFixed(0)} ms over ${input.windows.recentSampleCount} spans`,
|
|
478
|
+
`- Baseline p99 (prior ${LATENCY_BASELINE_WINDOW_HOURS}h): ${input.windows.priorP99Ms.toFixed(0)} ms over ${input.windows.priorSampleCount} spans`,
|
|
479
|
+
`- Regression multiplier: ${input.decision.multiplier.toFixed(1)}x`,
|
|
480
|
+
];
|
|
481
|
+
if (operationName) {
|
|
482
|
+
detailLines.push(`- Slowest operation: \`${operationName}\``);
|
|
483
|
+
}
|
|
484
|
+
if (sampleTraceId) {
|
|
485
|
+
detailLines.push(`- Representative trace: \`${sampleTraceId}\``);
|
|
486
|
+
}
|
|
487
|
+
if (findings.length > 0) {
|
|
488
|
+
detailLines.push(
|
|
489
|
+
"",
|
|
490
|
+
"## Span-tree findings (representative trace)",
|
|
491
|
+
"",
|
|
492
|
+
SpanTreeAnalyzer.renderFindingsMarkdown(findings),
|
|
493
|
+
);
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
return {
|
|
497
|
+
insightType: AIInsightType.TraceLatencyRegression,
|
|
498
|
+
fingerprint: TraceLatencyRegressionDetector.buildFingerprint(
|
|
499
|
+
input.windows.primaryEntityId,
|
|
500
|
+
operationName,
|
|
501
|
+
),
|
|
502
|
+
title: `Latency regression: p99 ${input.decision.multiplier.toFixed(1)}x${operationName ? ` on ${operationName}` : ""}${serviceName ? ` in ${serviceName}` : ""}`,
|
|
503
|
+
detailMarkdown: detailLines.join("\n"),
|
|
504
|
+
severity: input.decision.severity,
|
|
505
|
+
serviceName: serviceName || undefined,
|
|
506
|
+
telemetryServiceId: serviceName ? serviceEntityId : undefined,
|
|
507
|
+
traceId: sampleTraceId,
|
|
508
|
+
evidence: {
|
|
509
|
+
latency: {
|
|
510
|
+
recentP99Ms: input.windows.recentP99Ms,
|
|
511
|
+
baselineP99Ms: input.windows.priorP99Ms,
|
|
512
|
+
regressionMultiplier: input.decision.multiplier,
|
|
513
|
+
operationName,
|
|
514
|
+
sampleTraceId,
|
|
515
|
+
performanceFindings: findings.length > 0 ? findings : undefined,
|
|
516
|
+
codeLocations: codeLocations.length > 0 ? codeLocations : undefined,
|
|
517
|
+
},
|
|
518
|
+
},
|
|
519
|
+
};
|
|
520
|
+
}
|
|
521
|
+
}
|