@oneuptime/common 12.0.33 → 12.0.34

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.
Files changed (652) hide show
  1. package/Models/AnalyticsModels/RumSession.ts +117 -1
  2. package/Models/AnalyticsModels/RumSessionChunk.ts +13 -0
  3. package/Models/DatabaseModels/AlertCustomField.ts +77 -3
  4. package/Models/DatabaseModels/ApiKeyPermission.ts +3 -27
  5. package/Models/DatabaseModels/IncidentCustomField.ts +77 -3
  6. package/Models/DatabaseModels/InventoryItemCustomField.ts +77 -3
  7. package/Models/DatabaseModels/MonitorCustomField.ts +77 -3
  8. package/Models/DatabaseModels/OnCallDutyPolicyCustomField.ts +77 -3
  9. package/Models/DatabaseModels/RumApplication.ts +6 -6
  10. package/Models/DatabaseModels/ScheduledMaintenanceCustomField.ts +77 -3
  11. package/Models/DatabaseModels/StatusPageCustomField.ts +77 -3
  12. package/Models/DatabaseModels/TeamCustomField.ts +77 -3
  13. package/Models/DatabaseModels/TeamMember.ts +0 -9
  14. package/Models/DatabaseModels/TeamMemberCustomField.ts +77 -3
  15. package/Models/DatabaseModels/TeamPermission.ts +3 -24
  16. package/Models/DatabaseModels/TelemetryIngestionKey.ts +260 -0
  17. package/Models/DatabaseModels/UserTelegram.ts +0 -4
  18. package/Scripts/benchmark-fanin-capacity.js +181 -0
  19. package/Server/API/TelemetryAPI.ts +1284 -164
  20. package/Server/API/UserNotificationSettingAPI.ts +55 -0
  21. package/Server/API/UserTelegramAPI.ts +48 -4
  22. package/Server/EnvironmentConfig.ts +35 -2
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.ts +91 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.ts +67 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.ts +139 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.ts +121 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
  28. package/Server/Infrastructure/QueueWorker.ts +20 -14
  29. package/Server/Infrastructure/Semaphore.ts +2 -0
  30. package/Server/Middleware/TelemetryIngest.ts +453 -7
  31. package/Server/Services/AccessTokenService.ts +1 -0
  32. package/Server/Services/AlertCustomFieldService.ts +98 -0
  33. package/Server/Services/AlertService.ts +37 -0
  34. package/Server/Services/ApiKeyPermissionService.ts +461 -29
  35. package/Server/Services/CustomFieldMappingService.ts +879 -0
  36. package/Server/Services/GlobalConfigService.ts +194 -0
  37. package/Server/Services/IncidentCustomFieldService.ts +98 -0
  38. package/Server/Services/IncidentService.ts +35 -0
  39. package/Server/Services/MetricService.ts +194 -0
  40. package/Server/Services/MonitorService.ts +32 -0
  41. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +78 -25
  42. package/Server/Services/ProjectService.ts +22 -0
  43. package/Server/Services/RoutineEmailSettingsService.ts +73 -0
  44. package/Server/Services/RumSessionReplayViewService.ts +104 -24
  45. package/Server/Services/ScheduledMaintenanceCustomFieldService.ts +98 -0
  46. package/Server/Services/ScheduledMaintenanceService.ts +32 -0
  47. package/Server/Services/TeamMemberService.ts +78 -0
  48. package/Server/Services/TeamPermissionService.ts +235 -3
  49. package/Server/Services/TelemetryIngestionKeyService.ts +722 -19
  50. package/Server/Services/UserNotificationSettingService.ts +34 -6
  51. package/Server/Services/UserTelegramService.ts +326 -5
  52. package/Server/Types/Database/QueryHelper.ts +2 -0
  53. package/Server/Utils/APIKey/AccessPermission.ts +5 -2
  54. package/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.ts +54 -0
  55. package/Server/Utils/CustomField/CustomFieldMappingRegistry.ts +415 -0
  56. package/Server/Utils/CustomField/CustomFieldMappingValidator.ts +335 -0
  57. package/Server/Utils/DataSource/EgressGuard.ts +177 -8
  58. package/Server/Utils/EmailRollup/EmailRollupConstants.ts +38 -5
  59. package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +57 -4
  60. package/Server/Utils/FrontendEnvironment.ts +40 -0
  61. package/Server/Utils/LogRedaction.ts +20 -0
  62. package/Server/Utils/Logger.ts +11 -0
  63. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +338 -77
  64. package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +30 -4
  65. package/Server/Utils/Monitor/MonitorAlert.ts +29 -6
  66. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +110 -15
  67. package/Server/Utils/Monitor/MonitorIncident.ts +22 -6
  68. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +29 -0
  69. package/Server/Utils/Monitor/SeriesContextEnricher.ts +304 -0
  70. package/Server/Utils/SSRFProtection.ts +217 -10
  71. package/Server/Utils/SessionReplay/SessionReplayGateCache.ts +239 -138
  72. package/Server/Utils/SessionReplay/SessionReplayHealthCounters.ts +305 -0
  73. package/Server/Utils/SessionReplay/SessionReplayReadService.ts +1430 -289
  74. package/Server/Utils/StartServer.ts +2 -17
  75. package/Server/Utils/TelegramVerificationToken.ts +185 -0
  76. package/Server/Utils/Telemetry/PinServiceName.ts +197 -0
  77. package/Server/Utils/Telemetry/TelemetryFanInWriter.ts +38 -16
  78. package/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.ts +92 -0
  79. package/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.ts +217 -0
  80. package/Server/Utils/VM/VMAPI.ts +1 -0
  81. package/Server/Utils/VM/VMRunner.ts +975 -95
  82. package/Tests/App/AdminDashboard/AdminHeaderSmallScreens.test.tsx +202 -0
  83. package/Tests/App/Dashboard/DashboardHeaderSmallScreens.test.tsx +404 -0
  84. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +468 -0
  85. package/Tests/App/Dashboard/NotificationEmailPreferences.test.tsx +399 -0
  86. package/Tests/App/StatusPage/StatusPageLastUpdated.test.tsx +263 -0
  87. package/Tests/App/StatusPage/StatusPageOverviewLiveAndSearch.test.tsx +753 -0
  88. package/Tests/App/StatusPage/StatusPageResourceSearchBox.test.tsx +224 -0
  89. package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +262 -0
  90. package/Tests/Models/CustomFieldMappingColumns.test.ts +166 -0
  91. package/Tests/Models/DatabaseModels/SessionReplayModels.test.ts +20 -6
  92. package/Tests/ResponsiveVisibility.test.ts +115 -0
  93. package/Tests/ResponsiveVisibility.ts +183 -0
  94. package/Tests/Server/API/SessionReplayAPI.test.ts +1940 -216
  95. package/Tests/Server/API/UserNotificationSettingAPI.test.ts +186 -0
  96. package/Tests/Server/API/UserTelegramAPISecurity.test.ts +231 -0
  97. package/Tests/Server/EnvironmentConfigFrontendSecurity.test.ts +234 -0
  98. package/Tests/Server/Infrastructure/Postgres/CustomFieldValueMappingMigration.test.ts +202 -0
  99. package/Tests/Server/Infrastructure/Postgres/InventoryItemArchiveMigration.test.ts +41 -0
  100. package/Tests/Server/Infrastructure/Postgres/SessionReplayRecordEverySessionByDefaultMigration.test.ts +169 -0
  101. package/Tests/Server/Infrastructure/QueueWorkerTimeout.test.ts +210 -0
  102. package/Tests/Server/Infrastructure/TelemetryExporterDeploymentConfig.test.ts +130 -0
  103. package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +4 -1
  104. package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +1163 -0
  105. package/Tests/Server/Middleware/TelemetryIngestTokenLog.test.ts +5 -3
  106. package/Tests/Server/Services/AddTelemetryIngestionKeyTypeMigration.test.ts +555 -0
  107. package/Tests/Server/Services/ApiKeyPermissionSecurity.test.ts +678 -0
  108. package/Tests/Server/Services/ApiKeyPermissionService.test.ts +276 -28
  109. package/Tests/Server/Services/CustomFieldDropdownOptionsColumnWidth.test.ts +431 -0
  110. package/Tests/Server/Services/CustomFieldMappingService.test.ts +850 -0
  111. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +32 -0
  112. package/Tests/Server/Services/GlobalConfigService.test.ts +414 -1
  113. package/Tests/Server/Services/MetricRawEntityKeyPrune.test.ts +592 -0
  114. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +226 -1
  115. package/Tests/Server/Services/RoutineEmailSettingsPostgres.test.ts +329 -0
  116. package/Tests/Server/Services/RumSessionReplayViewService.test.ts +267 -0
  117. package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +9 -0
  118. package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +9 -0
  119. package/Tests/Server/Services/TeamPrivilegeEscalation.test.ts +834 -0
  120. package/Tests/Server/Services/TelemetryIngestionKeyPolicyResolution.test.ts +814 -0
  121. package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +998 -0
  122. package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +141 -0
  123. package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +18 -10
  124. package/Tests/Server/Services/UserTelegramVerificationSecurity.test.ts +688 -0
  125. package/Tests/Server/Utils/AI/SRE/Insights/FixRouting.test.ts +497 -0
  126. package/Tests/Server/Utils/AI/Toolbox/Serializer.test.ts +383 -0
  127. package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +7 -3
  128. package/Tests/Server/Utils/AnalyticsDatabase/ClusterConfig.test.ts +315 -0
  129. package/Tests/Server/Utils/CustomField/CustomFieldMappingValidator.test.ts +437 -0
  130. package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +300 -11
  131. package/Tests/Server/Utils/EmailRollup/EmailRollupBurstWindow.test.ts +83 -0
  132. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1 -1
  133. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerPreferences.test.ts +362 -0
  134. package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +77 -1
  135. package/Tests/Server/Utils/FrontendEnvironment.test.ts +190 -0
  136. package/Tests/Server/Utils/LogRedaction.test.ts +26 -0
  137. package/Tests/Server/Utils/LoggerCredentialLeak.test.ts +23 -9
  138. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +584 -0
  139. package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestHeaderCriteria.test.ts +236 -0
  140. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +437 -0
  141. package/Tests/Server/Utils/Monitor/MonitorTemplateUtilSeriesContext.test.ts +176 -0
  142. package/Tests/Server/Utils/Monitor/SeriesContextEnricher.test.ts +356 -0
  143. package/Tests/Server/Utils/SSRFProtectionCloudServiceAddresses.test.ts +595 -0
  144. package/Tests/Server/Utils/SessionReplay/SessionReplayGateCachePolicy.test.ts +198 -1
  145. package/Tests/Server/Utils/SessionReplay/SessionReplayHealthCounters.test.ts +453 -0
  146. package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +1378 -0
  147. package/Tests/Server/Utils/SessionReplayOriginAllowListRefactor.test.ts +420 -0
  148. package/Tests/Server/Utils/TelegramVerificationToken.test.ts +253 -0
  149. package/Tests/Server/Utils/Telemetry/PinServiceName.test.ts +666 -0
  150. package/Tests/Server/Utils/Telemetry/TelemetryFanInWriterCapacity.test.ts +458 -0
  151. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +424 -0
  152. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.test.ts +528 -0
  153. package/Tests/Server/Utils/TelemetryExporterEnvironment.test.ts +56 -0
  154. package/Tests/Server/Utils/VM/VMRunnerHostBridgeLatency.test.ts +74 -0
  155. package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +100 -7
  156. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +1176 -6
  157. package/Tests/Types/CustomField/CustomFieldMappingCatalog.test.ts +220 -0
  158. package/Tests/Types/CustomField/CustomFieldValueMapping.test.ts +348 -0
  159. package/Tests/Types/JSONFunctions.test.ts +260 -0
  160. package/Tests/Types/Monitor/CephAlertTemplates.test.ts +422 -53
  161. package/Tests/Types/Monitor/DockerAlertTemplates.test.ts +495 -15
  162. package/Tests/Types/Monitor/DockerSwarmAlertTemplates.test.ts +191 -45
  163. package/Tests/Types/Monitor/HostAlertTemplates.test.ts +370 -42
  164. package/Tests/Types/Monitor/IotAlertTemplates.test.ts +375 -20
  165. package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +636 -42
  166. package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +189 -0
  167. package/Tests/Types/Monitor/KubernetesTemplateGroupByKeys.test.ts +95 -14
  168. package/Tests/Types/Monitor/PodmanAlertTemplates.test.ts +190 -21
  169. package/Tests/Types/Monitor/ProxmoxAlertTemplates.test.ts +352 -22
  170. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationAlertDebuggability.test.ts +363 -0
  171. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +93 -18
  172. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +259 -0
  173. package/Tests/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.test.ts +476 -0
  174. package/Tests/Types/Monitor/RumAlertTemplates.test.ts +136 -0
  175. package/Tests/Types/Monitor/SeriesContext/SeriesDebugHints.test.ts +661 -0
  176. package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +507 -0
  177. package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +270 -0
  178. package/Tests/Types/Monitor/TemplateGroupByKeys.test.ts +38 -10
  179. package/Tests/Types/Monitor/Utils/RecommendationCriteriaAssertions.ts +102 -0
  180. package/Tests/Types/NotificationSetting/RoutineEmailEvents.test.ts +47 -0
  181. package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +608 -0
  182. package/Tests/Types/Rum/SessionReplayCustomEvents.test.ts +434 -0
  183. package/Tests/Types/WebsiteRequest.test.ts +285 -3
  184. package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +16 -3
  185. package/Tests/UI/Components/Charts/ChartTrailingBucketGap.test.ts +691 -0
  186. package/Tests/UI/Components/ComponentsModal.test.tsx +12 -4
  187. package/Tests/UI/Components/ComponentsModalUsability.test.tsx +518 -0
  188. package/Tests/UI/Components/CustomFields/CustomFieldsDetailMapping.test.tsx +324 -0
  189. package/Tests/UI/Components/CustomFields/MapFromCustomFieldInput.test.tsx +176 -0
  190. package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +484 -0
  191. package/Tests/UI/Components/HeaderRightRail.test.tsx +157 -0
  192. package/Tests/UI/Components/IconDropdownItem.test.tsx +102 -0
  193. package/Tests/UI/Components/JSONTablePrototypePollution.test.tsx +117 -0
  194. package/Tests/UI/Components/KeyboardShortcutsModal.test.tsx +214 -0
  195. package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +561 -0
  196. package/Tests/UI/Components/MonitorGraphs/UptimeBarDayModal.test.tsx +302 -0
  197. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +28 -12
  198. package/Tests/UI/Components/ShortcutDialogGuard.test.tsx +74 -0
  199. package/Tests/UI/Components/StatusPage/ResourceGroupSectionAutoExpand.test.tsx +248 -0
  200. package/Tests/UI/Components/TableCellWrapping.test.tsx +625 -0
  201. package/Tests/UI/Components/TableLoadingStates.test.tsx +205 -0
  202. package/Tests/UI/Components/Workflow/NodePlacement.test.ts +148 -0
  203. package/Tests/UI/Components/Workflow/Workflow.test.tsx +981 -0
  204. package/Tests/UI/ConfigBrowserTelemetry.test.ts +70 -0
  205. package/Tests/UI/Rum/ChunkLoader.test.ts +1036 -2
  206. package/Tests/UI/Rum/FidelityNotices.test.ts +187 -0
  207. package/Tests/UI/Rum/InactivityMap.test.ts +341 -0
  208. package/Tests/UI/Rum/PrivacySummaryCard.test.tsx +259 -0
  209. package/Tests/UI/Rum/RecordingHealthCard.test.tsx +855 -0
  210. package/Tests/UI/Rum/RecordingHealthStrip.test.tsx +594 -0
  211. package/Tests/UI/Rum/ReplayCard.test.tsx +451 -0
  212. package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +536 -0
  213. package/Tests/UI/Rum/ReplayEngine.test.ts +2503 -0
  214. package/Tests/UI/Rum/ReplayEngineTypes.test.ts +171 -0
  215. package/Tests/UI/Rum/ReplayHeader.test.tsx +711 -0
  216. package/Tests/UI/Rum/ReplayLink.test.tsx +119 -0
  217. package/Tests/UI/Rum/ReplayPinControl.test.tsx +408 -0
  218. package/Tests/UI/Rum/ReplayPlaybackIntent.test.ts +152 -0
  219. package/Tests/UI/Rum/ReplayRail.test.tsx +1296 -0
  220. package/Tests/UI/Rum/ReplayRailDetail.test.tsx +900 -0
  221. package/Tests/UI/Rum/ReplayScrubber.test.tsx +763 -147
  222. package/Tests/UI/Rum/ReplaySignalTypes.test.ts +189 -0
  223. package/Tests/UI/Rum/ReplaySignals.test.ts +1579 -0
  224. package/Tests/UI/Rum/ReplayStage.test.tsx +396 -473
  225. package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +918 -0
  226. package/Tests/UI/Rum/ReplayTimeline.test.tsx +696 -0
  227. package/Tests/UI/Rum/SessionReplayEmptyState.test.tsx +499 -0
  228. package/Tests/UI/Rum/SessionReplaySearchBar.test.tsx +346 -0
  229. package/Tests/UI/Rum/SessionReplaySetupGuide.test.tsx +545 -0
  230. package/Tests/UI/Rum/SessionReplayTable.test.tsx +991 -0
  231. package/Tests/UI/Rum/TargetedCapturePanel.test.tsx +254 -0
  232. package/Tests/UI/Telemetry/BrowserExporterIsolation.test.ts +71 -0
  233. package/Tests/UI/Utils/GlobalKeyboardShortcut.test.ts +344 -0
  234. package/Tests/Utils/API.test.ts +308 -0
  235. package/Tests/Utils/HTTPResponseBodyReader.test.ts +323 -0
  236. package/Tests/Utils/NetworkDiscovery/DiscoveryScanStatus.test.ts +117 -0
  237. package/Tests/Utils/Rum/ChunkMath.test.ts +83 -0
  238. package/Tests/Utils/Rum/SessionReplayHealthDiagnosis.test.ts +993 -0
  239. package/Tests/Utils/Rum/SessionReplayStringMap.test.ts +245 -0
  240. package/Tests/Utils/StatusPage/ResourceSearch.test.ts +631 -0
  241. package/Tests/Utils/Telemetry/OriginAllowList.test.ts +633 -0
  242. package/Tests/Utils/Uptime/DayUptimeGraphUtil.test.ts +461 -0
  243. package/Tests/Utils/ValueFormatter.test.ts +148 -0
  244. package/Types/CustomField/CustomFieldMappingCatalog.ts +161 -0
  245. package/Types/CustomField/CustomFieldMappingSourceResource.ts +19 -0
  246. package/Types/CustomField/CustomFieldValueMapping.ts +288 -0
  247. package/Types/Icon/IconProp.ts +1 -0
  248. package/Types/JSONFunctions.ts +189 -43
  249. package/Types/Monitor/CephAlertTemplates.ts +157 -195
  250. package/Types/Monitor/DockerAlertTemplates.ts +338 -128
  251. package/Types/Monitor/DockerSwarmAlertTemplates.ts +95 -112
  252. package/Types/Monitor/HostAlertTemplates.ts +302 -130
  253. package/Types/Monitor/IotAlertTemplates.ts +112 -104
  254. package/Types/Monitor/KubernetesAlertTemplates.ts +415 -224
  255. package/Types/Monitor/KubernetesMetricCatalog.ts +23 -19
  256. package/Types/Monitor/PodmanAlertTemplates.ts +116 -163
  257. package/Types/Monitor/ProxmoxAlertTemplates.ts +217 -99
  258. package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +98 -6
  259. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +44 -7
  260. package/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.ts +383 -0
  261. package/Types/Monitor/RumAlertTemplates.ts +46 -7
  262. package/Types/Monitor/SeriesContext/SeriesDebugHints.ts +596 -0
  263. package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +554 -0
  264. package/Types/Monitor/ServiceAlertTemplates.ts +98 -11
  265. package/Types/Monitor/UptimeHistoryLabels.ts +56 -0
  266. package/Types/NotificationSetting/RoutineEmailEvents.ts +30 -0
  267. package/Types/Rum/SessionReplay.ts +209 -0
  268. package/Types/Rum/SessionReplayApi.ts +722 -0
  269. package/Types/Rum/SessionReplayCaptureTrigger.ts +21 -12
  270. package/Types/Rum/SessionReplayConsentMode.ts +11 -7
  271. package/Types/Rum/SessionReplayCustomEvents.ts +549 -0
  272. package/Types/Rum/SessionReplayHealth.ts +238 -0
  273. package/Types/Telemetry/TelemetryIngestSurface.ts +95 -0
  274. package/Types/Telemetry/TelemetryIngestionKeyPolicy.ts +75 -0
  275. package/Types/Telemetry/TelemetryIngestionKeyType.ts +29 -0
  276. package/Types/WebsiteRequest.ts +85 -3
  277. package/UI/Components/Charts/Area/AreaChart.tsx +13 -2
  278. package/UI/Components/Charts/Bar/BarChart.tsx +6 -2
  279. package/UI/Components/Charts/Line/LineChart.tsx +13 -2
  280. package/UI/Components/Charts/Types/XAxis/XAxis.ts +29 -0
  281. package/UI/Components/Charts/Utils/DataPoint.ts +22 -3
  282. package/UI/Components/Charts/Utils/TimeAnnotation.ts +76 -9
  283. package/UI/Components/Charts/Utils/XAxis.ts +217 -0
  284. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +143 -25
  285. package/UI/Components/CustomFields/MapFromCustomFieldInput.tsx +216 -0
  286. package/UI/Components/Graphs/DayUptimeGraph.tsx +173 -8
  287. package/UI/Components/Graphs/UptimeBarTooltip.tsx +22 -278
  288. package/UI/Components/Graphs/UptimeDaySummary.tsx +327 -0
  289. package/UI/Components/Header/Header.tsx +25 -9
  290. package/UI/Components/Header/IconDropdown/IconDropdownItem.tsx +10 -1
  291. package/UI/Components/Header/IconDropdown/IconDropdownMenu.tsx +6 -1
  292. package/UI/Components/Header/ProjectPicker/ProjectPicker.tsx +6 -1
  293. package/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.tsx +6 -1
  294. package/UI/Components/Icon/Icon.tsx +11 -0
  295. package/UI/Components/JSONTable/JSONTable.tsx +2 -2
  296. package/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.tsx +125 -0
  297. package/UI/Components/KeyboardShortcut/Screenshots/README.md +19 -0
  298. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-command-palette.png +0 -0
  299. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-dialog-dark.png +0 -0
  300. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-dialog.png +0 -0
  301. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-help-menu.png +0 -0
  302. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-narrow.png +0 -0
  303. package/UI/Components/ModelTable/Column.ts +15 -0
  304. package/UI/Components/Monitor/SeriesDebugCommandsViewer.tsx +64 -0
  305. package/UI/Components/Monitor/SeriesLabelsViewer.tsx +93 -0
  306. package/UI/Components/MonitorGraphs/Uptime.tsx +14 -2
  307. package/UI/Components/MonitorGraphs/UptimeBarDayModal.tsx +63 -10
  308. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
  309. package/UI/Components/StatusPage/ResourceGroupSection.tsx +40 -0
  310. package/UI/Components/Table/CellClassName.ts +81 -0
  311. package/UI/Components/Table/TableRow.tsx +20 -14
  312. package/UI/Components/Table/TableSkeletonRows.tsx +9 -9
  313. package/UI/Components/Table/Types/Column.ts +36 -0
  314. package/UI/Components/Tooltip/Tooltip.tsx +11 -1
  315. package/UI/Components/Workflow/ComponentsModal.tsx +60 -39
  316. package/UI/Components/Workflow/NodePlacement.ts +57 -0
  317. package/UI/Components/Workflow/Workflow.tsx +47 -18
  318. package/UI/Config.ts +15 -33
  319. package/UI/Utils/GlobalKeyboardShortcut.ts +208 -0
  320. package/UI/Utils/Telemetry/BrowserTelemetryConfig.ts +28 -0
  321. package/UI/Utils/Telemetry/Telemetry.ts +10 -8
  322. package/Utils/API.ts +129 -3
  323. package/Utils/HTTPResponseBodyReader.ts +221 -0
  324. package/Utils/NetworkDiscovery/DiscoveryScanStatus.ts +77 -0
  325. package/Utils/Rum/ChunkMath.ts +106 -0
  326. package/Utils/Rum/SessionReplayHealth.ts +732 -0
  327. package/Utils/Rum/SessionReplayStringMap.ts +226 -0
  328. package/Utils/Schema/ModelSchema.ts +1 -0
  329. package/Utils/StatusPage/ResourceSearch.ts +290 -0
  330. package/Utils/Telemetry/OriginAllowList.ts +355 -0
  331. package/Utils/Uptime/DayUptimeGraphUtil.ts +205 -0
  332. package/Utils/ValueFormatter.ts +35 -1
  333. package/build/dist/Models/AnalyticsModels/RumSession.js +102 -19
  334. package/build/dist/Models/AnalyticsModels/RumSession.js.map +1 -1
  335. package/build/dist/Models/AnalyticsModels/RumSessionChunk.js +11 -9
  336. package/build/dist/Models/AnalyticsModels/RumSessionChunk.js.map +1 -1
  337. package/build/dist/Models/DatabaseModels/AlertCustomField.js +79 -3
  338. package/build/dist/Models/DatabaseModels/AlertCustomField.js.map +1 -1
  339. package/build/dist/Models/DatabaseModels/ApiKeyPermission.js +3 -27
  340. package/build/dist/Models/DatabaseModels/ApiKeyPermission.js.map +1 -1
  341. package/build/dist/Models/DatabaseModels/IncidentCustomField.js +79 -3
  342. package/build/dist/Models/DatabaseModels/IncidentCustomField.js.map +1 -1
  343. package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js +79 -3
  344. package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js.map +1 -1
  345. package/build/dist/Models/DatabaseModels/MonitorCustomField.js +79 -3
  346. package/build/dist/Models/DatabaseModels/MonitorCustomField.js.map +1 -1
  347. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js +79 -3
  348. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js.map +1 -1
  349. package/build/dist/Models/DatabaseModels/RumApplication.js +6 -6
  350. package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
  351. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js +79 -3
  352. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js.map +1 -1
  353. package/build/dist/Models/DatabaseModels/StatusPageCustomField.js +79 -3
  354. package/build/dist/Models/DatabaseModels/StatusPageCustomField.js.map +1 -1
  355. package/build/dist/Models/DatabaseModels/TeamCustomField.js +79 -3
  356. package/build/dist/Models/DatabaseModels/TeamCustomField.js.map +1 -1
  357. package/build/dist/Models/DatabaseModels/TeamMember.js +0 -9
  358. package/build/dist/Models/DatabaseModels/TeamMember.js.map +1 -1
  359. package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js +79 -3
  360. package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js.map +1 -1
  361. package/build/dist/Models/DatabaseModels/TeamPermission.js +3 -24
  362. package/build/dist/Models/DatabaseModels/TeamPermission.js.map +1 -1
  363. package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js +267 -0
  364. package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js.map +1 -1
  365. package/build/dist/Models/DatabaseModels/UserTelegram.js +0 -4
  366. package/build/dist/Models/DatabaseModels/UserTelegram.js.map +1 -1
  367. package/build/dist/Server/API/TelemetryAPI.js +769 -109
  368. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  369. package/build/dist/Server/API/UserNotificationSettingAPI.js +35 -0
  370. package/build/dist/Server/API/UserNotificationSettingAPI.js.map +1 -0
  371. package/build/dist/Server/API/UserTelegramAPI.js +28 -6
  372. package/build/dist/Server/API/UserTelegramAPI.js.map +1 -1
  373. package/build/dist/Server/EnvironmentConfig.js +29 -2
  374. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  375. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.js +60 -0
  376. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.js.map +1 -0
  377. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.js +53 -0
  378. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.js.map +1 -0
  379. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.js +82 -0
  380. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.js.map +1 -0
  381. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.js +46 -0
  382. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.js.map +1 -0
  383. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
  384. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  385. package/build/dist/Server/Infrastructure/QueueWorker.js +19 -7
  386. package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
  387. package/build/dist/Server/Infrastructure/Semaphore.js +1 -0
  388. package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
  389. package/build/dist/Server/Middleware/TelemetryIngest.js +315 -8
  390. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  391. package/build/dist/Server/Services/AccessTokenService.js +1 -0
  392. package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
  393. package/build/dist/Server/Services/AlertCustomFieldService.js +93 -0
  394. package/build/dist/Server/Services/AlertCustomFieldService.js.map +1 -1
  395. package/build/dist/Server/Services/AlertService.js +34 -0
  396. package/build/dist/Server/Services/AlertService.js.map +1 -1
  397. package/build/dist/Server/Services/ApiKeyPermissionService.js +331 -28
  398. package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
  399. package/build/dist/Server/Services/CustomFieldMappingService.js +614 -0
  400. package/build/dist/Server/Services/CustomFieldMappingService.js.map +1 -0
  401. package/build/dist/Server/Services/GlobalConfigService.js +133 -0
  402. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  403. package/build/dist/Server/Services/IncidentCustomFieldService.js +93 -0
  404. package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
  405. package/build/dist/Server/Services/IncidentService.js +32 -0
  406. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  407. package/build/dist/Server/Services/MetricService.js +163 -0
  408. package/build/dist/Server/Services/MetricService.js.map +1 -1
  409. package/build/dist/Server/Services/MonitorService.js +29 -0
  410. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  411. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +79 -27
  412. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  413. package/build/dist/Server/Services/ProjectService.js +22 -0
  414. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  415. package/build/dist/Server/Services/RoutineEmailSettingsService.js +69 -0
  416. package/build/dist/Server/Services/RoutineEmailSettingsService.js.map +1 -0
  417. package/build/dist/Server/Services/RumSessionReplayViewService.js +86 -24
  418. package/build/dist/Server/Services/RumSessionReplayViewService.js.map +1 -1
  419. package/build/dist/Server/Services/ScheduledMaintenanceCustomFieldService.js +93 -0
  420. package/build/dist/Server/Services/ScheduledMaintenanceCustomFieldService.js.map +1 -1
  421. package/build/dist/Server/Services/ScheduledMaintenanceService.js +29 -0
  422. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  423. package/build/dist/Server/Services/TeamMemberService.js +62 -2
  424. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  425. package/build/dist/Server/Services/TeamPermissionService.js +166 -3
  426. package/build/dist/Server/Services/TeamPermissionService.js.map +1 -1
  427. package/build/dist/Server/Services/TelemetryIngestionKeyService.js +562 -18
  428. package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
  429. package/build/dist/Server/Services/UserNotificationSettingService.js +26 -6
  430. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  431. package/build/dist/Server/Services/UserTelegramService.js +257 -4
  432. package/build/dist/Server/Services/UserTelegramService.js.map +1 -1
  433. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  434. package/build/dist/Server/Utils/APIKey/AccessPermission.js +2 -2
  435. package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
  436. package/build/dist/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.js +27 -0
  437. package/build/dist/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.js.map +1 -0
  438. package/build/dist/Server/Utils/CustomField/CustomFieldMappingRegistry.js +226 -0
  439. package/build/dist/Server/Utils/CustomField/CustomFieldMappingRegistry.js.map +1 -0
  440. package/build/dist/Server/Utils/CustomField/CustomFieldMappingValidator.js +189 -0
  441. package/build/dist/Server/Utils/CustomField/CustomFieldMappingValidator.js.map +1 -0
  442. package/build/dist/Server/Utils/DataSource/EgressGuard.js +121 -7
  443. package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
  444. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +38 -5
  445. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -1
  446. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +44 -2
  447. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
  448. package/build/dist/Server/Utils/FrontendEnvironment.js +33 -0
  449. package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -0
  450. package/build/dist/Server/Utils/LogRedaction.js +20 -0
  451. package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
  452. package/build/dist/Server/Utils/Logger.js +10 -0
  453. package/build/dist/Server/Utils/Logger.js.map +1 -1
  454. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +287 -68
  455. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
  456. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +20 -4
  457. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
  458. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +29 -6
  459. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  460. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +88 -13
  461. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  462. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +22 -6
  463. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  464. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +22 -0
  465. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  466. package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js +237 -0
  467. package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js.map +1 -0
  468. package/build/dist/Server/Utils/SSRFProtection.js +136 -9
  469. package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
  470. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js +174 -89
  471. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js.map +1 -1
  472. package/build/dist/Server/Utils/SessionReplay/SessionReplayHealthCounters.js +223 -0
  473. package/build/dist/Server/Utils/SessionReplay/SessionReplayHealthCounters.js.map +1 -0
  474. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +945 -164
  475. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
  476. package/build/dist/Server/Utils/StartServer.js +3 -14
  477. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  478. package/build/dist/Server/Utils/TelegramVerificationToken.js +129 -0
  479. package/build/dist/Server/Utils/TelegramVerificationToken.js.map +1 -0
  480. package/build/dist/Server/Utils/Telemetry/PinServiceName.js +163 -0
  481. package/build/dist/Server/Utils/Telemetry/PinServiceName.js.map +1 -0
  482. package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js +28 -15
  483. package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js.map +1 -1
  484. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js +64 -0
  485. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js.map +1 -0
  486. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.js +171 -0
  487. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.js.map +1 -0
  488. package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
  489. package/build/dist/Server/Utils/VM/VMRunner.js +780 -69
  490. package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
  491. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js +60 -0
  492. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js.map +1 -0
  493. package/build/dist/Types/CustomField/CustomFieldMappingSourceResource.js +20 -0
  494. package/build/dist/Types/CustomField/CustomFieldMappingSourceResource.js.map +1 -0
  495. package/build/dist/Types/CustomField/CustomFieldValueMapping.js +141 -0
  496. package/build/dist/Types/CustomField/CustomFieldValueMapping.js.map +1 -0
  497. package/build/dist/Types/Icon/IconProp.js +1 -0
  498. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  499. package/build/dist/Types/JSONFunctions.js +118 -37
  500. package/build/dist/Types/JSONFunctions.js.map +1 -1
  501. package/build/dist/Types/Monitor/CephAlertTemplates.js +130 -171
  502. package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -1
  503. package/build/dist/Types/Monitor/DockerAlertTemplates.js +286 -121
  504. package/build/dist/Types/Monitor/DockerAlertTemplates.js.map +1 -1
  505. package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js +84 -105
  506. package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js.map +1 -1
  507. package/build/dist/Types/Monitor/HostAlertTemplates.js +250 -122
  508. package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -1
  509. package/build/dist/Types/Monitor/IotAlertTemplates.js +81 -81
  510. package/build/dist/Types/Monitor/IotAlertTemplates.js.map +1 -1
  511. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +375 -215
  512. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  513. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js +19 -19
  514. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js.map +1 -1
  515. package/build/dist/Types/Monitor/PodmanAlertTemplates.js +104 -153
  516. package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -1
  517. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +156 -91
  518. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js.map +1 -1
  519. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +67 -6
  520. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -1
  521. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +38 -7
  522. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
  523. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js +261 -0
  524. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js.map +1 -0
  525. package/build/dist/Types/Monitor/RumAlertTemplates.js +46 -7
  526. package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -1
  527. package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js +422 -0
  528. package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js.map +1 -0
  529. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +441 -0
  530. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -0
  531. package/build/dist/Types/Monitor/ServiceAlertTemplates.js +79 -15
  532. package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -1
  533. package/build/dist/Types/Monitor/UptimeHistoryLabels.js +17 -0
  534. package/build/dist/Types/Monitor/UptimeHistoryLabels.js.map +1 -0
  535. package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js +29 -0
  536. package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js.map +1 -0
  537. package/build/dist/Types/Rum/SessionReplay.js +117 -0
  538. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  539. package/build/dist/Types/Rum/SessionReplayApi.js +181 -0
  540. package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -0
  541. package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js +21 -12
  542. package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js.map +1 -1
  543. package/build/dist/Types/Rum/SessionReplayConsentMode.js +11 -7
  544. package/build/dist/Types/Rum/SessionReplayConsentMode.js.map +1 -1
  545. package/build/dist/Types/Rum/SessionReplayCustomEvents.js +172 -0
  546. package/build/dist/Types/Rum/SessionReplayCustomEvents.js.map +1 -0
  547. package/build/dist/Types/Rum/SessionReplayHealth.js +37 -0
  548. package/build/dist/Types/Rum/SessionReplayHealth.js.map +1 -0
  549. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +85 -0
  550. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -0
  551. package/build/dist/Types/Telemetry/TelemetryIngestionKeyPolicy.js +15 -0
  552. package/build/dist/Types/Telemetry/TelemetryIngestionKeyPolicy.js.map +1 -0
  553. package/build/dist/Types/Telemetry/TelemetryIngestionKeyType.js +30 -0
  554. package/build/dist/Types/Telemetry/TelemetryIngestionKeyType.js.map +1 -0
  555. package/build/dist/Types/WebsiteRequest.js +55 -3
  556. package/build/dist/Types/WebsiteRequest.js.map +1 -1
  557. package/build/dist/UI/Components/Charts/Area/AreaChart.js +13 -2
  558. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  559. package/build/dist/UI/Components/Charts/Bar/BarChart.js +6 -2
  560. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  561. package/build/dist/UI/Components/Charts/Line/LineChart.js +13 -2
  562. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  563. package/build/dist/UI/Components/Charts/Types/XAxis/XAxis.js.map +1 -1
  564. package/build/dist/UI/Components/Charts/Utils/DataPoint.js +15 -3
  565. package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
  566. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +40 -9
  567. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
  568. package/build/dist/UI/Components/Charts/Utils/XAxis.js +186 -0
  569. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  570. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +80 -6
  571. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  572. package/build/dist/UI/Components/CustomFields/MapFromCustomFieldInput.js +118 -0
  573. package/build/dist/UI/Components/CustomFields/MapFromCustomFieldInput.js.map +1 -0
  574. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +112 -7
  575. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  576. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js +5 -162
  577. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js.map +1 -1
  578. package/build/dist/UI/Components/Graphs/UptimeDaySummary.js +181 -0
  579. package/build/dist/UI/Components/Graphs/UptimeDaySummary.js.map +1 -0
  580. package/build/dist/UI/Components/Header/Header.js +2 -3
  581. package/build/dist/UI/Components/Header/Header.js.map +1 -1
  582. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js +2 -1
  583. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js.map +1 -1
  584. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js +7 -1
  585. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js.map +1 -1
  586. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js +7 -1
  587. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js.map +1 -1
  588. package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js +7 -1
  589. package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js.map +1 -1
  590. package/build/dist/UI/Components/Icon/Icon.js +5 -0
  591. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  592. package/build/dist/UI/Components/JSONTable/JSONTable.js +2 -2
  593. package/build/dist/UI/Components/JSONTable/JSONTable.js.map +1 -1
  594. package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.js +35 -0
  595. package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.js.map +1 -0
  596. package/build/dist/UI/Components/Monitor/SeriesDebugCommandsViewer.js +34 -0
  597. package/build/dist/UI/Components/Monitor/SeriesDebugCommandsViewer.js.map +1 -0
  598. package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js +49 -0
  599. package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js.map +1 -0
  600. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +1 -1
  601. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  602. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js +32 -6
  603. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js.map +1 -1
  604. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +38 -0
  605. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  606. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js +22 -1
  607. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js.map +1 -1
  608. package/build/dist/UI/Components/Table/CellClassName.js +55 -0
  609. package/build/dist/UI/Components/Table/CellClassName.js.map +1 -0
  610. package/build/dist/UI/Components/Table/TableRow.js +16 -13
  611. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  612. package/build/dist/UI/Components/Table/TableSkeletonRows.js +9 -8
  613. package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -1
  614. package/build/dist/UI/Components/Tooltip/Tooltip.js +25 -1
  615. package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
  616. package/build/dist/UI/Components/Workflow/ComponentsModal.js +47 -30
  617. package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
  618. package/build/dist/UI/Components/Workflow/NodePlacement.js +37 -0
  619. package/build/dist/UI/Components/Workflow/NodePlacement.js.map +1 -0
  620. package/build/dist/UI/Components/Workflow/Workflow.js +35 -18
  621. package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
  622. package/build/dist/UI/Config.js +10 -20
  623. package/build/dist/UI/Config.js.map +1 -1
  624. package/build/dist/UI/Utils/GlobalKeyboardShortcut.js +138 -0
  625. package/build/dist/UI/Utils/GlobalKeyboardShortcut.js.map +1 -0
  626. package/build/dist/UI/Utils/Telemetry/BrowserTelemetryConfig.js +14 -0
  627. package/build/dist/UI/Utils/Telemetry/BrowserTelemetryConfig.js.map +1 -0
  628. package/build/dist/UI/Utils/Telemetry/Telemetry.js +7 -5
  629. package/build/dist/UI/Utils/Telemetry/Telemetry.js.map +1 -1
  630. package/build/dist/Utils/API.js +67 -5
  631. package/build/dist/Utils/API.js.map +1 -1
  632. package/build/dist/Utils/HTTPResponseBodyReader.js +157 -0
  633. package/build/dist/Utils/HTTPResponseBodyReader.js.map +1 -0
  634. package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js +69 -0
  635. package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js.map +1 -0
  636. package/build/dist/Utils/Rum/ChunkMath.js +76 -0
  637. package/build/dist/Utils/Rum/ChunkMath.js.map +1 -1
  638. package/build/dist/Utils/Rum/SessionReplayHealth.js +534 -0
  639. package/build/dist/Utils/Rum/SessionReplayHealth.js.map +1 -0
  640. package/build/dist/Utils/Rum/SessionReplayStringMap.js +165 -0
  641. package/build/dist/Utils/Rum/SessionReplayStringMap.js.map +1 -0
  642. package/build/dist/Utils/Schema/ModelSchema.js +1 -0
  643. package/build/dist/Utils/Schema/ModelSchema.js.map +1 -1
  644. package/build/dist/Utils/StatusPage/ResourceSearch.js +200 -0
  645. package/build/dist/Utils/StatusPage/ResourceSearch.js.map +1 -0
  646. package/build/dist/Utils/Telemetry/OriginAllowList.js +299 -0
  647. package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -0
  648. package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js +147 -0
  649. package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js.map +1 -0
  650. package/build/dist/Utils/ValueFormatter.js +32 -1
  651. package/build/dist/Utils/ValueFormatter.js.map +1 -1
  652. package/package.json +1 -1
@@ -0,0 +1,236 @@
1
+ import IncomingRequestCriteria from "../../../../../Server/Utils/Monitor/Criteria/IncomingRequestCriteria";
2
+ import DataToProcess from "../../../../../Server/Utils/Monitor/DataToProcess";
3
+ import OneUptimeDate from "../../../../../Types/Date";
4
+ import Dictionary from "../../../../../Types/Dictionary";
5
+ import {
6
+ CheckOn,
7
+ CriteriaFilter,
8
+ FilterType,
9
+ } from "../../../../../Types/Monitor/CriteriaFilter";
10
+ import IncomingMonitorRequest from "../../../../../Types/Monitor/IncomingMonitor/IncomingMonitorRequest";
11
+ import ObjectID from "../../../../../Types/ObjectID";
12
+ import { describe, expect, test } from "@jest/globals";
13
+
14
+ /*
15
+ * CheckOn.RequestHeader and CheckOn.RequestHeaderValue on an Incoming
16
+ * Request monitor: "the ping must carry x-api-key", "the ping must NOT
17
+ * carry a header saying maintenance".
18
+ *
19
+ * Both are whole-token comparisons against the header map - a header is
20
+ * present or it is not - and both are case-insensitive on BOTH sides, which
21
+ * is the half that used to be missing: a filter typed the way HTTP headers
22
+ * are written ("X-Api-Key") was compared against a list that had already
23
+ * been lower-cased, so Contains never fired and NotContains fired on every
24
+ * request.
25
+ */
26
+
27
+ function buildRequest(headers: Dictionary<string> | undefined): DataToProcess {
28
+ const now: Date = OneUptimeDate.getCurrentDate();
29
+
30
+ const request: IncomingMonitorRequest = {
31
+ projectId: ObjectID.generate(),
32
+ monitorId: ObjectID.generate(),
33
+ requestBody: "",
34
+ requestHeaders: headers,
35
+ incomingRequestReceivedAt: now,
36
+ checkedAt: now,
37
+ };
38
+
39
+ return request as DataToProcess;
40
+ }
41
+
42
+ function evaluate(
43
+ headers: Dictionary<string> | undefined,
44
+ criteriaFilter: CriteriaFilter,
45
+ ): Promise<string | null> {
46
+ return IncomingRequestCriteria.isMonitorInstanceCriteriaFilterMet({
47
+ dataToProcess: buildRequest(headers),
48
+ criteriaFilter,
49
+ });
50
+ }
51
+
52
+ function headerFilter(
53
+ filterType: FilterType,
54
+ value: string | undefined,
55
+ ): CriteriaFilter {
56
+ return { checkOn: CheckOn.RequestHeader, filterType, value };
57
+ }
58
+
59
+ function headerValueFilter(
60
+ filterType: FilterType,
61
+ value: string | undefined,
62
+ ): CriteriaFilter {
63
+ return { checkOn: CheckOn.RequestHeaderValue, filterType, value };
64
+ }
65
+
66
+ const HEADERS: Dictionary<string> = {
67
+ "X-Api-Key": "SecretToken",
68
+ "content-type": "application/json",
69
+ };
70
+
71
+ describe("IncomingRequestCriteria - CheckOn.RequestHeader", () => {
72
+ describe("Contains", () => {
73
+ test("a header the request carries matches, however either side is cased", async () => {
74
+ for (const typed of ["x-api-key", "X-Api-Key", "X-API-KEY"]) {
75
+ expect(
76
+ await evaluate(HEADERS, headerFilter(FilterType.Contains, typed)),
77
+ ).toContain("Request header contains");
78
+ }
79
+ });
80
+
81
+ test("the message quotes the filter as it was typed, not as it was compared", async () => {
82
+ expect(
83
+ await evaluate(HEADERS, headerFilter(FilterType.Contains, "X-Api-Key")),
84
+ ).toBe("Request header contains X-Api-Key.");
85
+ });
86
+
87
+ test("a header the request does not carry does not match", async () => {
88
+ expect(
89
+ await evaluate(
90
+ HEADERS,
91
+ headerFilter(FilterType.Contains, "authorization"),
92
+ ),
93
+ ).toBeNull();
94
+ });
95
+
96
+ test("a prefix of a header name does not match: this compares whole names", async () => {
97
+ expect(
98
+ await evaluate(HEADERS, headerFilter(FilterType.Contains, "x-api")),
99
+ ).toBeNull();
100
+ });
101
+
102
+ test("a request with no headers at all matches nothing", async () => {
103
+ expect(
104
+ await evaluate(
105
+ undefined,
106
+ headerFilter(FilterType.Contains, "x-api-key"),
107
+ ),
108
+ ).toBeNull();
109
+ expect(
110
+ await evaluate({}, headerFilter(FilterType.Contains, "x-api-key")),
111
+ ).toBeNull();
112
+ });
113
+
114
+ test("a filter with no value cannot decide, so it does not match", async () => {
115
+ expect(
116
+ await evaluate(HEADERS, headerFilter(FilterType.Contains, undefined)),
117
+ ).toBeNull();
118
+ expect(
119
+ await evaluate(HEADERS, headerFilter(FilterType.Contains, "")),
120
+ ).toBeNull();
121
+ });
122
+ });
123
+
124
+ describe("Not Contains", () => {
125
+ test("a header the request does not carry matches", async () => {
126
+ expect(
127
+ await evaluate(
128
+ HEADERS,
129
+ headerFilter(FilterType.NotContains, "authorization"),
130
+ ),
131
+ ).toContain("Request header does not contain");
132
+ });
133
+
134
+ test("a header the request DOES carry does not match, whatever its casing", async () => {
135
+ for (const typed of ["x-api-key", "X-Api-Key", "X-API-KEY"]) {
136
+ expect(
137
+ await evaluate(HEADERS, headerFilter(FilterType.NotContains, typed)),
138
+ ).toBeNull();
139
+ }
140
+ });
141
+
142
+ test("Contains and Not Contains never agree on the same header", async () => {
143
+ for (const name of ["X-Api-Key", "authorization", "content-type"]) {
144
+ const contains: string | null = await evaluate(
145
+ HEADERS,
146
+ headerFilter(FilterType.Contains, name),
147
+ );
148
+ const notContains: string | null = await evaluate(
149
+ HEADERS,
150
+ headerFilter(FilterType.NotContains, name),
151
+ );
152
+
153
+ expect(Boolean(contains)).not.toBe(Boolean(notContains));
154
+ }
155
+ });
156
+ });
157
+
158
+ test("a filter type this check does not support does not match", async () => {
159
+ expect(
160
+ await evaluate(HEADERS, headerFilter(FilterType.EqualTo, "x-api-key")),
161
+ ).toBeNull();
162
+ });
163
+ });
164
+
165
+ describe("IncomingRequestCriteria - CheckOn.RequestHeaderValue", () => {
166
+ describe("Contains", () => {
167
+ test("a value the request carries matches, however either side is cased", async () => {
168
+ for (const typed of ["secrettoken", "SecretToken", "SECRETTOKEN"]) {
169
+ expect(
170
+ await evaluate(
171
+ HEADERS,
172
+ headerValueFilter(FilterType.Contains, typed),
173
+ ),
174
+ ).toContain("Request header value contains");
175
+ }
176
+ });
177
+
178
+ test("a value no header carries does not match", async () => {
179
+ expect(
180
+ await evaluate(
181
+ HEADERS,
182
+ headerValueFilter(FilterType.Contains, "text/html"),
183
+ ),
184
+ ).toBeNull();
185
+ });
186
+
187
+ test("a substring of a value does not match: this compares whole values", async () => {
188
+ expect(
189
+ await evaluate(
190
+ HEADERS,
191
+ headerValueFilter(FilterType.Contains, "secret"),
192
+ ),
193
+ ).toBeNull();
194
+ });
195
+
196
+ test("a request with no headers at all matches nothing", async () => {
197
+ expect(
198
+ await evaluate(
199
+ undefined,
200
+ headerValueFilter(FilterType.Contains, "secrettoken"),
201
+ ),
202
+ ).toBeNull();
203
+ });
204
+ });
205
+
206
+ describe("Not Contains", () => {
207
+ test("a value no header carries matches", async () => {
208
+ expect(
209
+ await evaluate(
210
+ HEADERS,
211
+ headerValueFilter(FilterType.NotContains, "text/html"),
212
+ ),
213
+ ).toContain("Request header value does not contain");
214
+ });
215
+
216
+ test("a value a header DOES carry does not match, whatever its casing", async () => {
217
+ for (const typed of ["secrettoken", "SecretToken"]) {
218
+ expect(
219
+ await evaluate(
220
+ HEADERS,
221
+ headerValueFilter(FilterType.NotContains, typed),
222
+ ),
223
+ ).toBeNull();
224
+ }
225
+ });
226
+
227
+ test("a filter with no value cannot decide, so it does not match", async () => {
228
+ expect(
229
+ await evaluate(
230
+ HEADERS,
231
+ headerValueFilter(FilterType.NotContains, undefined),
232
+ ),
233
+ ).toBeNull();
234
+ });
235
+ });
236
+ });
@@ -4,6 +4,7 @@ import MonitorStep from "../../../../Types/Monitor/MonitorStep";
4
4
  import MetricMonitorResponse, {
5
5
  ProxmoxAffectedResource,
6
6
  CephAffectedResource,
7
+ KubernetesAffectedResource,
7
8
  } from "../../../../Types/Monitor/MetricMonitor/MetricMonitorResponse";
8
9
  import {
9
10
  getProxmoxAlertTemplateById,
@@ -14,6 +15,13 @@ import {
14
15
  CephAlertTemplate,
15
16
  } from "../../../../Types/Monitor/CephAlertTemplates";
16
17
  import ObjectID from "../../../../Types/ObjectID";
18
+ import MonitorCriteriaInstance from "../../../../Types/Monitor/MonitorCriteriaInstance";
19
+ import {
20
+ CheckOn,
21
+ CriteriaFilter,
22
+ FilterType,
23
+ } from "../../../../Types/Monitor/CriteriaFilter";
24
+ import FilterCondition from "../../../../Types/Filter/FilterCondition";
17
25
 
18
26
  /*
19
27
  * WI-21 monitor-routing seam: the worker-side monitorProxmox /
@@ -48,6 +56,17 @@ type EvaluatorPrivate = {
48
56
  dataToProcess: unknown;
49
57
  monitorStep: MonitorStep;
50
58
  monitor: Monitor;
59
+ criteriaInstance?: MonitorCriteriaInstance | undefined;
60
+ }) => string | null;
61
+ buildKubernetesRootCauseAnalysis: (input: {
62
+ breakdown: {
63
+ clusterName: string;
64
+ metricName: string;
65
+ metricFriendlyName: string;
66
+ affectedResources: Array<KubernetesAffectedResource>;
67
+ attributes: Record<string, string>;
68
+ };
69
+ topResource: KubernetesAffectedResource;
51
70
  }) => string | null;
52
71
  };
53
72
 
@@ -320,3 +339,421 @@ describe("MonitorCriteriaEvaluator - Ceph root cause breakdown", () => {
320
339
  expect(context).toContain("- Metric: `ceph_osd_up`");
321
340
  });
322
341
  });
342
+
343
+ /*
344
+ * REGRESSION: the affected-resources filter used to be a hardcoded
345
+ * `metricValue > 0`.
346
+ *
347
+ * ceph_osd_up / ceph_osd_in / ceph_mon_quorum_status are 0/1 gauges and
348
+ * the OSD Down / OSD Out / Quorum Degraded criteria fire on `< 1`, so the
349
+ * ZERO rows are the down daemons — the filter dropped exactly the daemons
350
+ * the incident was about and rendered a table of the HEALTHY ones, under
351
+ * an incident description that ends "Check the root cause for the affected
352
+ * ceph_daemon label."
353
+ *
354
+ * The predicate now mirrors the criteria that matched, but ONLY inverts
355
+ * for a criteria that fires when the metric FALLS. Every upward comparison
356
+ * (`> 0` health checks, PG counts, latency, capacity ratios) and every
357
+ * `= 0` RECOVERY criteria keeps the old `> 0`, worst-highest-first table
358
+ * byte for byte — the recovery case matters because deriving the predicate
359
+ * from an `= 0` criteria would newly render an "Affected Resources" table
360
+ * of every resource sitting at 0 on the all-clear.
361
+ */
362
+ describe("MonitorCriteriaEvaluator - Ceph affected-resources breach predicate", () => {
363
+ function cephCriteriaInstance(index: number): MonitorCriteriaInstance {
364
+ const instances: Array<MonitorCriteriaInstance> =
365
+ cephStep().data!.monitorCriteria!.data!.monitorCriteriaInstanceArray;
366
+ const instance: MonitorCriteriaInstance | undefined = instances[index];
367
+ if (!instance) {
368
+ throw new Error(`ceph-osd-down criteria instance ${index} missing`);
369
+ }
370
+ return instance;
371
+ }
372
+
373
+ /** The real ceph-osd-down FIRING criteria: ceph_osd_up < 1. */
374
+ function osdDownFiringCriteria(): MonitorCriteriaInstance {
375
+ return cephCriteriaInstance(0);
376
+ }
377
+
378
+ /** The real ceph-osd-down RECOVERY criteria (an upward comparison). */
379
+ function osdDownRecoveryCriteria(): MonitorCriteriaInstance {
380
+ const instances: Array<MonitorCriteriaInstance> =
381
+ cephStep().data!.monitorCriteria!.data!.monitorCriteriaInstanceArray;
382
+ return cephCriteriaInstance(instances.length - 1);
383
+ }
384
+
385
+ function syntheticCriteria(
386
+ filters: Array<CriteriaFilter>,
387
+ ): MonitorCriteriaInstance {
388
+ const instance: MonitorCriteriaInstance = new MonitorCriteriaInstance();
389
+ instance.data = {
390
+ monitorStatusId: undefined,
391
+ filterCondition: FilterCondition.Any,
392
+ filters: filters,
393
+ incidents: [],
394
+ alerts: [],
395
+ name: "synthetic",
396
+ description: "synthetic",
397
+ id: ObjectID.generate().toString(),
398
+ };
399
+ return instance;
400
+ }
401
+
402
+ function cephContext(input: {
403
+ affectedResources: Array<CephAffectedResource>;
404
+ metricName?: string;
405
+ criteriaInstance?: MonitorCriteriaInstance | undefined;
406
+ }): string | null {
407
+ return Evaluator.buildCephRootCauseContext({
408
+ dataToProcess: metricResponse({
409
+ cephResourceBreakdown: {
410
+ clusterName: "prod-cluster",
411
+ metricName: input.metricName || "ceph_osd_up",
412
+ metricFriendlyName: "OSD Up",
413
+ affectedResources: input.affectedResources,
414
+ attributes: {},
415
+ },
416
+ }),
417
+ monitorStep: cephStep(),
418
+ monitor: new Monitor(),
419
+ criteriaInstance: input.criteriaInstance,
420
+ });
421
+ }
422
+
423
+ test("the real ceph-osd-down criteria is a `< 1` comparison on the metric value", () => {
424
+ /*
425
+ * Guards the fixture: if the template stops firing on a fall, the
426
+ * rest of this suite is testing nothing.
427
+ */
428
+ const filters: Array<CriteriaFilter> =
429
+ osdDownFiringCriteria().data?.filters || [];
430
+
431
+ expect(filters.length).toBeGreaterThan(0);
432
+ expect(filters[0]!.checkOn).toBe(CheckOn.MetricValue);
433
+ expect(filters[0]!.filterType).toBe(FilterType.LessThan);
434
+ expect(filters[0]!.value).toBe(1);
435
+ });
436
+
437
+ test("a `< 1` availability criteria keeps the DOWN daemons and drops the healthy ones", () => {
438
+ const context: string | null = cephContext({
439
+ criteriaInstance: osdDownFiringCriteria(),
440
+ affectedResources: [
441
+ // The down OSD. The old `> 0` filter removed exactly this row.
442
+ { daemon: "osd.3", hostname: "ceph-node-1", metricValue: 0 },
443
+ { daemon: "osd.4", hostname: "ceph-node-2", metricValue: 1 },
444
+ { daemon: "osd.5", hostname: "ceph-node-3", metricValue: 1 },
445
+ ],
446
+ });
447
+
448
+ expect(context).toContain("| Daemon | Pool | Host | Value |");
449
+ expect(context).toContain("| `osd.3` | - | `ceph-node-1` | **0** |");
450
+ expect(context).not.toContain("osd.4");
451
+ expect(context).not.toContain("osd.5");
452
+ expect(context).toContain("**Affected Resources** (1 total)");
453
+ });
454
+
455
+ test("every down daemon survives the top-10 cap when the criteria fires on a fall", () => {
456
+ const affectedResources: Array<CephAffectedResource> = [
457
+ { daemon: "osd.1", metricValue: 0 },
458
+ { daemon: "osd.2", metricValue: 0 },
459
+ ];
460
+
461
+ /*
462
+ * Twelve healthy OSDs — enough to overflow the ten-row slice if the
463
+ * predicate ever stops filtering them out.
464
+ */
465
+ for (let i: number = 10; i < 22; i++) {
466
+ affectedResources.push({ daemon: `osd.${i}`, metricValue: 1 });
467
+ }
468
+
469
+ const context: string | null = cephContext({
470
+ criteriaInstance: osdDownFiringCriteria(),
471
+ affectedResources,
472
+ });
473
+
474
+ expect(context).toContain("**Affected Resources** (2 total)");
475
+ expect(context).toContain("`osd.1`");
476
+ expect(context).toContain("`osd.2`");
477
+ expect(context).not.toContain("`osd.10`");
478
+ expect(context).not.toContain("*... and");
479
+ });
480
+
481
+ test("a fall criteria sorts worst (lowest) first", () => {
482
+ const context: string | null = cephContext({
483
+ metricName: "ceph_osd_apply_latency_ms",
484
+ criteriaInstance: syntheticCriteria([
485
+ {
486
+ checkOn: CheckOn.MetricValue,
487
+ filterType: FilterType.LessThanOrEqualTo,
488
+ value: 50,
489
+ },
490
+ ]),
491
+ affectedResources: [
492
+ { daemon: "osd.mild", metricValue: 50 },
493
+ { daemon: "osd.worst", metricValue: 5 },
494
+ { daemon: "osd.fine", metricValue: 500 },
495
+ ],
496
+ });
497
+
498
+ expect(context).toContain("**Affected Resources** (2 total)");
499
+ expect(context).not.toContain("osd.fine");
500
+
501
+ const worstIndex: number = context!.indexOf("`osd.worst`");
502
+ const mildIndex: number = context!.indexOf("`osd.mild`");
503
+ expect(worstIndex).toBeGreaterThan(-1);
504
+ expect(mildIndex).toBeGreaterThan(worstIndex);
505
+ });
506
+
507
+ test("a `> 0` count criteria renders exactly as the hardcoded filter did", () => {
508
+ const context: string | null = cephContext({
509
+ metricName: "ceph_osd_apply_latency_ms",
510
+ criteriaInstance: syntheticCriteria([
511
+ {
512
+ checkOn: CheckOn.MetricValue,
513
+ filterType: FilterType.GreaterThan,
514
+ value: 0,
515
+ },
516
+ ]),
517
+ affectedResources: [
518
+ { daemon: "osd.3", hostname: "ceph-node-1", metricValue: 250 },
519
+ { poolId: "2", poolName: "rbd", metricValue: 91 },
520
+ { daemon: "osd.5", hostname: "ceph-node-2", metricValue: 0 },
521
+ ],
522
+ });
523
+
524
+ expect(context).toContain("| `osd.3` | - | `ceph-node-1` | **250** |");
525
+ expect(context).toContain("| - | `rbd` (`2`) | - | **91** |");
526
+ expect(context).not.toContain("osd.5");
527
+ expect(context).toContain("**Affected Resources** (2 total)");
528
+
529
+ // Still worst-HIGHEST-first for an upward comparison.
530
+ const osdIndex: number = context!.indexOf("`osd.3`");
531
+ const poolIndex: number = context!.indexOf("`rbd` (`2`)");
532
+ expect(poolIndex).toBeGreaterThan(osdIndex);
533
+ });
534
+
535
+ test("an `= 0` recovery criteria does NOT turn the all-clear into a table of zeroes", () => {
536
+ const context: string | null = cephContext({
537
+ metricName: "ceph_pg_degraded",
538
+ criteriaInstance: syntheticCriteria([
539
+ {
540
+ checkOn: CheckOn.MetricValue,
541
+ filterType: FilterType.EqualTo,
542
+ value: 0,
543
+ },
544
+ ]),
545
+ affectedResources: [
546
+ { poolId: "2", poolName: "rbd", metricValue: 0 },
547
+ { poolId: "3", poolName: "cephfs", metricValue: 0 },
548
+ ],
549
+ });
550
+
551
+ expect(context).not.toContain("| Daemon | Pool | Host | Value |");
552
+ expect(context).not.toContain("**Affected Resources**");
553
+ });
554
+
555
+ test("the real recovery criteria (an upward comparison) keeps the `> 0` fallback", () => {
556
+ const context: string | null = cephContext({
557
+ criteriaInstance: osdDownRecoveryCriteria(),
558
+ affectedResources: [
559
+ { daemon: "osd.3", metricValue: 0 },
560
+ { daemon: "osd.4", metricValue: 1 },
561
+ ],
562
+ });
563
+
564
+ expect(context).toContain("| `osd.4` | - | - | **1** |");
565
+ expect(context).not.toContain("osd.3");
566
+ });
567
+
568
+ test("no criteriaInstance falls back to dropping zero rows", () => {
569
+ const context: string | null = cephContext({
570
+ affectedResources: [
571
+ { daemon: "osd.3", metricValue: 0 },
572
+ { daemon: "osd.4", metricValue: 1 },
573
+ ],
574
+ });
575
+
576
+ expect(context).toContain("| `osd.4` | - | - | **1** |");
577
+ expect(context).not.toContain("osd.3");
578
+ });
579
+
580
+ test("a non-metric-value filter is ignored and keeps the `> 0` fallback", () => {
581
+ const context: string | null = cephContext({
582
+ criteriaInstance: syntheticCriteria([
583
+ {
584
+ checkOn: CheckOn.IsOnline,
585
+ filterType: FilterType.LessThan,
586
+ value: 1,
587
+ },
588
+ ]),
589
+ affectedResources: [
590
+ { daemon: "osd.3", metricValue: 0 },
591
+ { daemon: "osd.4", metricValue: 1 },
592
+ ],
593
+ });
594
+
595
+ expect(context).toContain("| `osd.4` | - | - | **1** |");
596
+ expect(context).not.toContain("osd.3");
597
+ });
598
+
599
+ test("a mixed fall/rise criteria keeps the `> 0` fallback rather than guessing", () => {
600
+ const context: string | null = cephContext({
601
+ criteriaInstance: syntheticCriteria([
602
+ {
603
+ checkOn: CheckOn.MetricValue,
604
+ filterType: FilterType.LessThan,
605
+ value: 1,
606
+ },
607
+ {
608
+ checkOn: CheckOn.MetricValue,
609
+ filterType: FilterType.GreaterThan,
610
+ value: 90,
611
+ },
612
+ ]),
613
+ affectedResources: [
614
+ { daemon: "osd.3", metricValue: 0 },
615
+ { daemon: "osd.4", metricValue: 1 },
616
+ ],
617
+ });
618
+
619
+ expect(context).toContain("| `osd.4` | - | - | **1** |");
620
+ expect(context).not.toContain("osd.3");
621
+ });
622
+ });
623
+
624
+ /*
625
+ * REGRESSION: buildKubernetesRootCauseAnalysis routed POD-scoped metrics
626
+ * into the NODE branches.
627
+ *
628
+ * The CPU branch matched any name containing both "cpu" and
629
+ * "utilization", so `k8s.pod.cpu.utilization` and
630
+ * `k8s.pod.cpu_limit_utilization` were answered with "Node CPU
631
+ * utilization has exceeded the configured threshold" plus
632
+ * "consider scaling the cluster" — contradicting the pod-limit template's
633
+ * own description and naming a node for a pod-scoped alert. The memory
634
+ * branch did the same for "memory" + "usage".
635
+ *
636
+ * Also: the pod-Pending branch was gated on
637
+ * `breakdown.attributes["k8s.pod.phase"] === "Pending"`, an UNPREFIXED key
638
+ * for an attribute nothing in the agent emits (the phase is the metric's
639
+ * VALUE), so the branch never ran at all.
640
+ */
641
+ describe("MonitorCriteriaEvaluator - Kubernetes root cause analysis scoping", () => {
642
+ const NODE_CPU_TEXT: string =
643
+ "Node CPU utilization has exceeded the configured threshold.";
644
+ const NODE_MEMORY_TEXT: string =
645
+ "Node memory utilization has exceeded the configured threshold.";
646
+
647
+ function analyse(input: {
648
+ metricName: string;
649
+ attributes?: Record<string, string>;
650
+ topResource?: KubernetesAffectedResource;
651
+ }): string | null {
652
+ const topResource: KubernetesAffectedResource = input.topResource || {
653
+ podName: "web-7d9f",
654
+ nodeName: "node-1",
655
+ metricValue: 93.4,
656
+ };
657
+
658
+ return Evaluator.buildKubernetesRootCauseAnalysis({
659
+ breakdown: {
660
+ clusterName: "prod",
661
+ metricName: input.metricName,
662
+ metricFriendlyName: "Friendly Name",
663
+ affectedResources: [topResource],
664
+ attributes: input.attributes || {},
665
+ },
666
+ topResource,
667
+ });
668
+ }
669
+
670
+ test("k8s.node.cpu.utilization still gets the node CPU guidance", () => {
671
+ const analysis: string | null = analyse({
672
+ metricName: "k8s.node.cpu.utilization",
673
+ });
674
+
675
+ expect(analysis).toContain(NODE_CPU_TEXT);
676
+ expect(analysis).toContain("consider scaling the cluster");
677
+ });
678
+
679
+ test("a non-canonical node cpu utilization metric still gets the node branch", () => {
680
+ const analysis: string | null = analyse({
681
+ metricName: "k8s.node.cpu_limit_utilization",
682
+ });
683
+
684
+ expect(analysis).toContain(NODE_CPU_TEXT);
685
+ });
686
+
687
+ test("k8s.pod.cpu.utilization is NOT answered with node CPU advice", () => {
688
+ const analysis: string | null = analyse({
689
+ metricName: "k8s.pod.cpu.utilization",
690
+ });
691
+
692
+ expect(analysis).not.toContain(NODE_CPU_TEXT);
693
+ expect(analysis).not.toContain("consider scaling the cluster");
694
+ expect(analysis).toContain("`k8s.pod.cpu.utilization`");
695
+ expect(analysis).toContain("Most affected pod: `web-7d9f`");
696
+ });
697
+
698
+ test("k8s.pod.cpu_limit_utilization is NOT answered with node CPU advice", () => {
699
+ const analysis: string | null = analyse({
700
+ metricName: "k8s.pod.cpu_limit_utilization",
701
+ });
702
+
703
+ expect(analysis).not.toContain(NODE_CPU_TEXT);
704
+ expect(analysis).toContain("`k8s.pod.cpu_limit_utilization`");
705
+ });
706
+
707
+ test("k8s.node.memory.usage still gets the node memory guidance", () => {
708
+ const analysis: string | null = analyse({
709
+ metricName: "k8s.node.memory.usage",
710
+ });
711
+
712
+ expect(analysis).toContain(NODE_MEMORY_TEXT);
713
+ });
714
+
715
+ test("k8s.pod.memory_limit_utilization is NOT answered with node memory advice", () => {
716
+ const analysis: string | null = analyse({
717
+ metricName: "k8s.pod.memory_limit_utilization",
718
+ });
719
+
720
+ expect(analysis).not.toContain(NODE_MEMORY_TEXT);
721
+ expect(analysis).toContain("`k8s.pod.memory_limit_utilization`");
722
+ });
723
+
724
+ test("k8s.pod.memory.usage is NOT answered with node memory advice", () => {
725
+ const analysis: string | null = analyse({
726
+ metricName: "k8s.pod.memory.usage",
727
+ });
728
+
729
+ expect(analysis).not.toContain(NODE_MEMORY_TEXT);
730
+ expect(analysis).toContain("`k8s.pod.memory.usage`");
731
+ });
732
+
733
+ test("k8s.pod.phase gets the Pending guidance with an EMPTY attribute map", () => {
734
+ /*
735
+ * The old gate required breakdown.attributes["k8s.pod.phase"] to be
736
+ * "Pending". Nothing ever sets it — the breakdown attributes are the
737
+ * query's `resource.`-prefixed map — so this assertion fails on the
738
+ * pre-fix code.
739
+ */
740
+ const analysis: string | null = analyse({
741
+ metricName: "k8s.pod.phase",
742
+ attributes: {},
743
+ });
744
+
745
+ expect(analysis).toContain(
746
+ "Pods are stuck in Pending phase and unable to be scheduled.",
747
+ );
748
+ expect(analysis).toContain("kubectl describe pod web-7d9f");
749
+ });
750
+
751
+ test("k8s.pod.phase is not swallowed by a resource-prefixed attribute map", () => {
752
+ const analysis: string | null = analyse({
753
+ metricName: "k8s.pod.phase",
754
+ attributes: { "resource.k8s.cluster.name": "prod" },
755
+ });
756
+
757
+ expect(analysis).toContain("Pods are stuck in Pending phase");
758
+ });
759
+ });