@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
@@ -7,10 +7,16 @@ import {
7
7
  getDockerAlertTemplatesByCategory,
8
8
  } from "../../../Types/Monitor/DockerAlertTemplates";
9
9
  import MonitorStep from "../../../Types/Monitor/MonitorStep";
10
+ import { hasRecoveryDeadBand } from "./Utils/RecommendationCriteriaAssertions";
10
11
  import MonitorStepDockerMonitor from "../../../Types/Monitor/MonitorStepDockerMonitor";
11
12
  import MetricsAggregationType from "../../../Types/Metrics/MetricsAggregationType";
12
13
  import RollingTime from "../../../Types/RollingTime/RollingTime";
13
- import { FilterType } from "../../../Types/Monitor/CriteriaFilter";
14
+ import {
15
+ CriteriaFilter,
16
+ EvaluateOverTimeType,
17
+ FilterType,
18
+ } from "../../../Types/Monitor/CriteriaFilter";
19
+ import CompareCriteria from "../../../Server/Utils/Monitor/Criteria/CompareCriteria";
14
20
  import ObjectID from "../../../Types/ObjectID";
15
21
 
16
22
  /*
@@ -30,9 +36,19 @@ import ObjectID from "../../../Types/ObjectID";
30
36
  * (a value matching neither leaves the monitor stuck in its previous
31
37
  * status) and no overlap (a value matching both makes the status depend
32
38
  * on evaluation order). The failure mode is a strict/non-strict slip.
33
- * The two zero-boundary templates (throttling, container-down) partition
34
- * the non-negative domain with `> 0` / `= 0`, so they are pinned per case
39
+ * The one remaining zero-boundary template (container-down) partitions
40
+ * the non-negative domain with `= 0` / `> 0`, so it is pinned per case
35
41
  * rather than by a generic complement rule.
42
+ *
43
+ * 4. The CUMULATIVE-COUNTER templates. `container.restarts` and
44
+ * `container.cpu.throttling_data.throttled_time` are monotonic LIFETIME
45
+ * counters. Both used to be compared to a static threshold, which fires
46
+ * on ancient history and can never recover — the counter cannot come
47
+ * back down, so the complementary healthy comparison is unreachable by
48
+ * construction. They now threshold the counter's per-minute GROWTH
49
+ * (`max - min`, summed over the window) via a two-query + formula
50
+ * config, and the tests below pin every part of that shape whose
51
+ * breakage would be SILENT.
36
52
  */
37
53
 
38
54
  interface DockerTemplateCase {
@@ -46,6 +62,13 @@ interface DockerTemplateCase {
46
62
  offlineFilterType: FilterType;
47
63
  onlineFilterType: FilterType;
48
64
  threshold: number;
65
+ /*
66
+ * Query/formula shape. A single-metric threshold template has exactly one
67
+ * query and no formula, which is the default; a template that differences a
68
+ * cumulative counter pins its own counts.
69
+ */
70
+ queryCount?: number;
71
+ formulaCount?: number;
49
72
  }
50
73
 
51
74
  const DOCKER_TEMPLATES: Array<DockerTemplateCase> = [
@@ -77,26 +100,42 @@ const DOCKER_TEMPLATES: Array<DockerTemplateCase> = [
77
100
  id: "docker-restart-loop",
78
101
  category: "Container",
79
102
  severity: "Critical",
103
+ // queryConfigs[0] is the Max half of the per-minute delta pair.
80
104
  metricName: "container.restarts",
105
+ // The criteria threshold the FORMULA, not either query.
81
106
  metricAlias: "container_restarts",
82
107
  aggregation: MetricsAggregationType.Max,
83
- rollingTime: RollingTime.Past5Minutes,
108
+ /*
109
+ * A lifetime counter, so the template alerts on its growth over a window
110
+ * wide enough for the 30s-scrape delta to see a real loop.
111
+ */
112
+ rollingTime: RollingTime.Past15Minutes,
113
+ queryCount: 2,
114
+ formulaCount: 1,
84
115
  offlineFilterType: FilterType.GreaterThan,
85
116
  onlineFilterType: FilterType.LessThanOrEqualTo,
86
- threshold: 5,
117
+ threshold: 3,
87
118
  },
88
119
  {
89
120
  id: "docker-cpu-throttling",
90
121
  category: "Resource",
91
122
  severity: "Warning",
123
+ // queryConfigs[0] is the Max half of the per-minute delta pair.
92
124
  metricName: "container.cpu.throttling_data.throttled_time",
125
+ // The criteria threshold the FORMULA, not either query.
93
126
  metricAlias: "cpu_throttled",
94
127
  aggregation: MetricsAggregationType.Max,
95
128
  rollingTime: RollingTime.Past5Minutes,
96
- // throttled_time is non-negative: (> 0) unhealthy, (= 0) healthy partitions it.
129
+ /*
130
+ * A lifetime NANOSECOND counter, so the template alerts on its growth
131
+ * (max - min per minute, summed): milliseconds of throttling per five
132
+ * minutes, not the container's lifetime total.
133
+ */
134
+ queryCount: 2,
135
+ formulaCount: 1,
97
136
  offlineFilterType: FilterType.GreaterThan,
98
- onlineFilterType: FilterType.EqualTo,
99
- threshold: 0,
137
+ onlineFilterType: FilterType.LessThanOrEqualTo,
138
+ threshold: 1000,
100
139
  },
101
140
  {
102
141
  id: "docker-high-pids",
@@ -108,7 +147,12 @@ const DOCKER_TEMPLATES: Array<DockerTemplateCase> = [
108
147
  rollingTime: RollingTime.Past5Minutes,
109
148
  offlineFilterType: FilterType.GreaterThan,
110
149
  onlineFilterType: FilterType.LessThanOrEqualTo,
111
- threshold: 500,
150
+ /*
151
+ * The cgroup pids controller counts TASKS (threads included), so 500 was
152
+ * ordinary for a JVM or a Go binary and the alert asserted a fork bomb
153
+ * against a container working as designed.
154
+ */
155
+ threshold: 2000,
112
156
  },
113
157
  {
114
158
  id: "docker-container-down",
@@ -222,9 +266,16 @@ describe("DockerAlertTemplates", () => {
222
266
 
223
267
  const queryConfigs: Array<any> = monitor.metricViewConfig
224
268
  .queryConfigs as Array<any>;
225
- // A single-metric threshold template has exactly one query, no formula.
226
- expect(queryConfigs).toHaveLength(1);
227
- expect(monitor.metricViewConfig.formulaConfigs).toHaveLength(0);
269
+ /*
270
+ * A single-metric threshold template has exactly one query and no
271
+ * formula; a cumulative-counter template carries two queries (Max and
272
+ * Min over the same metric) and a difference formula, and pins its own
273
+ * counts in the case table above.
274
+ */
275
+ expect(queryConfigs).toHaveLength(tc.queryCount ?? 1);
276
+ expect(monitor.metricViewConfig.formulaConfigs).toHaveLength(
277
+ tc.formulaCount ?? 0,
278
+ );
228
279
 
229
280
  const filterData: any = queryConfigs[0].metricQueryData.filterData;
230
281
  expect(filterData.metricName).toBe(tc.metricName);
@@ -234,7 +285,7 @@ describe("DockerAlertTemplates", () => {
234
285
  );
235
286
 
236
287
  test.each(DOCKER_TEMPLATES)(
237
- "$id unhealthy/healthy criteria partition the range at $threshold",
288
+ "$id unhealthy/healthy criteria leave a recovery dead band around $threshold",
238
289
  (tc: DockerTemplateCase) => {
239
290
  const template: DockerAlertTemplate = getDockerAlertTemplateById(tc.id)!;
240
291
  const step: MonitorStep = template.getMonitorStep(buildArgs());
@@ -248,7 +299,7 @@ describe("DockerAlertTemplates", () => {
248
299
  const offlineFilter: any = offline.data.filters[0];
249
300
  const onlineFilter: any = online.data.filters[0];
250
301
 
251
- // Both criteria evaluate the SAME metric alias at the SAME threshold.
302
+ // Both criteria evaluate the same metric alias, at different thresholds.
252
303
  expect(offlineFilter.metricMonitorOptions.metricAlias).toBe(
253
304
  tc.metricAlias,
254
305
  );
@@ -256,7 +307,26 @@ describe("DockerAlertTemplates", () => {
256
307
  tc.metricAlias,
257
308
  );
258
309
  expect(offlineFilter.value).toBe(tc.threshold);
259
- expect(onlineFilter.value).toBe(tc.threshold);
310
+ /*
311
+ * The healthy criteria recovers at a threshold strictly INSIDE the
312
+ * firing one, so a metric hovering at the boundary cannot satisfy
313
+ * both on consecutive evaluations. This assertion used to be
314
+ * `expect(onlineFilter.value).toBe(tc.threshold)` — the two criteria
315
+ * exactly partitioned the range, which is the flapping configuration
316
+ * this suite existed to lock in.
317
+ */
318
+ expect(
319
+ hasRecoveryDeadBand(
320
+ {
321
+ filterType: offlineFilter.filterType,
322
+ value: offlineFilter.value as number,
323
+ },
324
+ {
325
+ filterType: onlineFilter.filterType,
326
+ value: onlineFilter.value as number,
327
+ },
328
+ ),
329
+ ).toBe(true);
260
330
 
261
331
  // Only the comparison DIRECTION differs — pinned per template.
262
332
  expect(offlineFilter.filterType).toBe(tc.offlineFilterType);
@@ -290,4 +360,414 @@ describe("DockerAlertTemplates", () => {
290
360
  expect(offline.data.alerts[0].autoResolveAlert).toBe(true);
291
361
  }
292
362
  });
363
+
364
+ /*
365
+ * ---------------------------------------------------------------------
366
+ * Cumulative-counter guards.
367
+ *
368
+ * `container.restarts` is Docker's lifetime RestartCount and
369
+ * `container.cpu.throttling_data.throttled_time` is the cgroup's lifetime
370
+ * throttled nanoseconds. Both are monotonic: the value only ever goes up.
371
+ * Nothing between ingest and alerting differences them —
372
+ * OtelMetricsIngestService records aggregationTemporality/isMonotonic as
373
+ * catalog metadata for the browser's rate-view hint and stores the raw
374
+ * value, `transformAsRate` is read only by the chart code, and
375
+ * CompareCriteria.reduceWindow offers only Average/Sum/Max/Min.
376
+ *
377
+ * So a "> N" criteria on the RAW counter fires the first time the
378
+ * container ever breaches and never clears: the complementary healthy
379
+ * comparison is unreachable until the container is recreated. Both
380
+ * templates shipped exactly that. Every assertion below fails if someone
381
+ * points a criteria back at the raw counter.
382
+ * ---------------------------------------------------------------------
383
+ */
384
+
385
+ const CUMULATIVE_METRICS: Array<string> = [
386
+ "container.restarts",
387
+ "container.cpu.throttling_data.throttled_time",
388
+ "container.cpu.throttling_data.throttled_periods",
389
+ "container.cpu.usage.total",
390
+ ];
391
+
392
+ interface DeltaTemplateCase {
393
+ id: string;
394
+ metricName: string;
395
+ maxAlias: string;
396
+ minAlias: string;
397
+ resultAlias: string;
398
+ formula: string;
399
+ // A formula's legendUnit is a LABEL; it must be unset for a bare count.
400
+ legendUnit: string | undefined;
401
+ /*
402
+ * Per-minute GROWTH samples, the shape the formula produces. The busy
403
+ * window deliberately contains zeros and no single breaching minute:
404
+ * that is what makes it prove the window aggregation is Sum rather than
405
+ * the shared builder's AllValues default.
406
+ */
407
+ busyWindow: Array<number>;
408
+ }
409
+
410
+ const DELTA_TEMPLATES: Array<DeltaTemplateCase> = [
411
+ {
412
+ id: "docker-cpu-throttling",
413
+ metricName: "container.cpu.throttling_data.throttled_time",
414
+ maxAlias: "cpu_throttled_max",
415
+ minAlias: "cpu_throttled_min",
416
+ resultAlias: "cpu_throttled",
417
+ formula: "(cpu_throttled_max - cpu_throttled_min) / 1000000",
418
+ legendUnit: "ms",
419
+ // ms of throttling per minute: 1200 ms across five minutes, > 1000.
420
+ busyWindow: [0, 400, 0, 500, 300],
421
+ },
422
+ {
423
+ id: "docker-restart-loop",
424
+ metricName: "container.restarts",
425
+ maxAlias: "container_restarts_max",
426
+ minAlias: "container_restarts_min",
427
+ resultAlias: "container_restarts",
428
+ formula: "container_restarts_max - container_restarts_min",
429
+ legendUnit: undefined,
430
+ // Restarts per minute: 4 across the window, > 3, none in one minute.
431
+ busyWindow: [0, 1, 2, 0, 1],
432
+ },
433
+ ];
434
+
435
+ test("no criteria compares a cumulative lifetime counter directly", () => {
436
+ /*
437
+ * The broad guard: if a template queries one of these counters at all,
438
+ * the alias its criteria threshold must name a FORMULA, never one of the
439
+ * raw queries. This is the single assertion that stops either template
440
+ * regressing, and stops a third being pasted in from the same mistake.
441
+ */
442
+ for (const template of getAllDockerAlertTemplates()) {
443
+ const step: MonitorStep = template.getMonitorStep(buildArgs());
444
+ const monitor: MonitorStepDockerMonitor = getDockerMonitor(step);
445
+
446
+ const cumulativeQueryAliases: Array<string> = (
447
+ monitor.metricViewConfig.queryConfigs as Array<any>
448
+ )
449
+ .filter((q: any) => {
450
+ return CUMULATIVE_METRICS.includes(
451
+ q.metricQueryData.filterData.metricName,
452
+ );
453
+ })
454
+ .map((q: any) => {
455
+ return q.metricAliasData.metricVariable;
456
+ });
457
+
458
+ if (cumulativeQueryAliases.length === 0) {
459
+ continue;
460
+ }
461
+
462
+ const formulaAliases: Array<string> = (
463
+ (monitor.metricViewConfig.formulaConfigs as Array<any>) || []
464
+ ).map((f: any) => {
465
+ return f.metricAliasData.metricVariable;
466
+ });
467
+
468
+ for (const instance of step.data?.monitorCriteria.data
469
+ ?.monitorCriteriaInstanceArray as Array<any>) {
470
+ for (const filter of instance.data.filters as Array<any>) {
471
+ const alias: string = filter.metricMonitorOptions.metricAlias;
472
+ expect(cumulativeQueryAliases).not.toContain(alias);
473
+ expect(formulaAliases).toContain(alias);
474
+ }
475
+ }
476
+ }
477
+ });
478
+
479
+ test.each(DELTA_TEMPLATES)(
480
+ "$id subtracts a Min query from a Max query over the same counter",
481
+ (dc: DeltaTemplateCase) => {
482
+ /*
483
+ * Both halves must read the SAME metric, differ ONLY in aggregation,
484
+ * and group identically. Max/Max makes the delta identically zero, and
485
+ * mismatched group-by keys split the two into series fingerprints that
486
+ * never meet (buildSeriesBreakdown joins by fingerprint) so the formula
487
+ * evaluates against an empty operand. Either slip makes the monitor
488
+ * stop alerting with no error at all.
489
+ */
490
+ const monitor: MonitorStepDockerMonitor = getDockerMonitor(
491
+ getDockerAlertTemplateById(dc.id)!.getMonitorStep(buildArgs()),
492
+ );
493
+
494
+ const [maxQuery, minQuery] = monitor.metricViewConfig
495
+ .queryConfigs as Array<any>;
496
+
497
+ expect(maxQuery.metricQueryData.filterData.metricName).toBe(
498
+ dc.metricName,
499
+ );
500
+ expect(minQuery.metricQueryData.filterData.metricName).toBe(
501
+ dc.metricName,
502
+ );
503
+ expect(maxQuery.metricQueryData.filterData.aggegationType).toBe(
504
+ MetricsAggregationType.Max,
505
+ );
506
+ expect(minQuery.metricQueryData.filterData.aggegationType).toBe(
507
+ MetricsAggregationType.Min,
508
+ );
509
+ expect(minQuery.metricQueryData.groupByAttributeKeys).toEqual(
510
+ maxQuery.metricQueryData.groupByAttributeKeys,
511
+ );
512
+ expect(maxQuery.metricAliasData.metricVariable).toBe(dc.maxAlias);
513
+ expect(minQuery.metricAliasData.metricVariable).toBe(dc.minAlias);
514
+
515
+ /*
516
+ * Neither query carries a legendUnit, so MetricResultUnitConverter —
517
+ * which converts QUERY results only, from the MetricType native unit
518
+ * into legendUnit — passes the raw counter through untouched. Setting
519
+ * one here would convert BEFORE the formula subtracts.
520
+ */
521
+ expect(maxQuery.metricAliasData.legendUnit).toBeUndefined();
522
+ expect(minQuery.metricAliasData.legendUnit).toBeUndefined();
523
+
524
+ const formula: any = (
525
+ monitor.metricViewConfig.formulaConfigs as Array<any>
526
+ )[0];
527
+ expect(formula.metricAliasData.metricVariable).toBe(dc.resultAlias);
528
+ expect(formula.metricFormulaData.metricFormula).toBe(dc.formula);
529
+ /*
530
+ * ns -> ms happens INSIDE the formula, never via legendUnit, because
531
+ * MetricResultUnitConverter does not touch formula results. The unit
532
+ * here is only a label — it is what makes the alert sentence read
533
+ * "... ms" — and it must stay unset for a dimensionless count, because
534
+ * MetricMonitorCriteria reads a formula's legendUnit as the sample
535
+ * unit to convert FROM.
536
+ */
537
+ expect(formula.metricAliasData.legendUnit).toBe(dc.legendUnit);
538
+ },
539
+ );
540
+
541
+ test.each(DELTA_TEMPLATES)(
542
+ "$id sums the per-minute deltas on BOTH criteria",
543
+ (dc: DeltaTemplateCase) => {
544
+ /*
545
+ * Each sample is one minute's GROWTH of a cumulative counter, so the
546
+ * threshold only means "N per window" under Sum. The shared builder's
547
+ * AllValues default would instead demand a breach in every single
548
+ * minute — unreachable, because the first and last minute of a rolling
549
+ * window are partial and most minutes of a crash loop are zero. And
550
+ * the two criteria must agree, or the fire/recover pair is not
551
+ * comparing the same quantity.
552
+ */
553
+ const step: MonitorStep = getDockerAlertTemplateById(
554
+ dc.id,
555
+ )!.getMonitorStep(buildArgs());
556
+
557
+ const instances: Array<any> = step.data?.monitorCriteria.data
558
+ ?.monitorCriteriaInstanceArray as Array<any>;
559
+
560
+ expect(instances).toHaveLength(2);
561
+ for (const instance of instances) {
562
+ for (const filter of instance.data.filters as Array<any>) {
563
+ expect(filter.metricMonitorOptions.metricAggregationType).toBe(
564
+ EvaluateOverTimeType.Sum,
565
+ );
566
+ }
567
+ }
568
+ },
569
+ );
570
+
571
+ test.each(DELTA_TEMPLATES)(
572
+ "$id can actually recover — a quiet container clears, a busy one fires",
573
+ (dc: DeltaTemplateCase) => {
574
+ /*
575
+ * The defect this pins: with the raw lifetime counter, a container
576
+ * that misbehaved once reported a permanently non-zero value, so the
577
+ * fire comparison stayed true forever and the healthy comparison
578
+ * ("= 0", or a dead band below it) was unreachable by construction —
579
+ * a Critical/Warning alert no recovery could ever close.
580
+ *
581
+ * Driven through the real comparator, with the templates' own filters,
582
+ * over the per-minute DELTA samples the formula produces.
583
+ */
584
+ const step: MonitorStep = getDockerAlertTemplateById(
585
+ dc.id,
586
+ )!.getMonitorStep(buildArgs());
587
+ const [offline, online]: Array<any> = step.data?.monitorCriteria.data
588
+ ?.monitorCriteriaInstanceArray as Array<any>;
589
+
590
+ const fireFilter: CriteriaFilter = offline.data.filters[0];
591
+ const recoverFilter: CriteriaFilter = online.data.filters[0];
592
+
593
+ const evaluate: (
594
+ filter: CriteriaFilter,
595
+ samples: Array<number>,
596
+ ) => string | null = (
597
+ filter: CriteriaFilter,
598
+ samples: Array<number>,
599
+ ): string | null => {
600
+ return CompareCriteria.compareCriteriaNumbers({
601
+ value: samples,
602
+ threshold: filter.value as number,
603
+ criteriaFilter: filter,
604
+ });
605
+ };
606
+
607
+ /*
608
+ * A container that crash-looped / was throttled long ago and is idle
609
+ * now: the LIFETIME counter is still huge, but it stopped growing, so
610
+ * every per-minute delta is zero. Before the fix this window still
611
+ * fired and could never recover.
612
+ */
613
+ const quietWindow: Array<number> = [0, 0, 0, 0, 0];
614
+ expect(evaluate(fireFilter, quietWindow)).toBeNull();
615
+ expect(evaluate(recoverFilter, quietWindow)).not.toBeNull();
616
+
617
+ /*
618
+ * A container misbehaving right now. Most minutes are zero and no
619
+ * single minute reaches the threshold on its own — which is exactly
620
+ * why the window aggregation has to be Sum and not AllValues. Under
621
+ * AllValues this window would NOT fire, and this assertion is what
622
+ * catches a revert to the shared default.
623
+ */
624
+ expect(
625
+ dc.busyWindow.every((sample: number) => {
626
+ return sample <= (fireFilter.value as number);
627
+ }),
628
+ ).toBe(true);
629
+ expect(evaluate(fireFilter, dc.busyWindow)).not.toBeNull();
630
+ expect(evaluate(recoverFilter, dc.busyWindow)).toBeNull();
631
+
632
+ /*
633
+ * And structurally: recovery must be an INEQUALITY strictly inside the
634
+ * firing threshold. "Recovery requires a monotonic counter to return
635
+ * to exactly zero" is the shape that cannot come back.
636
+ */
637
+ expect(recoverFilter.filterType).toBe(FilterType.LessThanOrEqualTo);
638
+ expect(fireFilter.filterType).toBe(FilterType.GreaterThan);
639
+ expect(recoverFilter.value as number).toBeLessThan(
640
+ fireFilter.value as number,
641
+ );
642
+ },
643
+ );
644
+
645
+ /*
646
+ * ---------------------------------------------------------------------
647
+ * Copy guards. An alert sentence that names a wrong cause costs an
648
+ * engineer an investigation, so the claims each template makes are
649
+ * pinned the same way its thresholds are.
650
+ * ---------------------------------------------------------------------
651
+ */
652
+
653
+ function getOfflineCopy(id: string, args?: DockerAlertTemplateArgs): string {
654
+ const step: MonitorStep = getDockerAlertTemplateById(id)!.getMonitorStep(
655
+ args || buildArgs(),
656
+ );
657
+ const offline: any = (
658
+ step.data?.monitorCriteria.data
659
+ ?.monitorCriteriaInstanceArray as Array<any>
660
+ )[0];
661
+ return offline.data.incidents[0].description as string;
662
+ }
663
+
664
+ test("no incident description promises an exit code the pipeline never carries", () => {
665
+ /*
666
+ * docker_stats emits no exit-code attribute and the criteria root cause
667
+ * is built purely from metric samples, so "check the exit code" sent the
668
+ * reader looking for data that is not there.
669
+ */
670
+ for (const tc of DOCKER_TEMPLATES) {
671
+ expect(getOfflineCopy(tc.id).toLowerCase()).not.toContain("exit code");
672
+ }
673
+ });
674
+
675
+ test("docker-high-pids describes a TASK count, not a bare process count", () => {
676
+ /*
677
+ * The cgroup pids controller counts tasks — kernel threads included — so
678
+ * a JVM or a Go binary sits far above its process count. Keeping the
679
+ * threshold honest is what stops the alert asserting "fork bomb" at a
680
+ * container working as designed.
681
+ */
682
+ const template: DockerAlertTemplate =
683
+ getDockerAlertTemplateById("docker-high-pids")!;
684
+ const copy: string = `${template.description} ${getOfflineCopy(
685
+ "docker-high-pids",
686
+ )}`.toLowerCase();
687
+ expect(copy).toContain("thread");
688
+ expect(copy).toContain("task");
689
+ });
690
+
691
+ test("docker-high-memory does not promise an OOM kill it cannot know is coming", () => {
692
+ /*
693
+ * `container.memory.percent` divides by the container's limit when one
694
+ * is set and by HOST total memory when it is not, so an unlimited
695
+ * container at 86% will not be OOM-killed for exceeding a limit that
696
+ * does not exist. The copy has to name that denominator.
697
+ */
698
+ const copy: string = getOfflineCopy("docker-high-memory").toLowerCase();
699
+ expect(copy).toContain("host");
700
+ expect(copy).toContain("--memory");
701
+ });
702
+
703
+ test("docker-high-cpu states the per-CORE denominator", () => {
704
+ /*
705
+ * `container.cpu.utilization` is what `docker stats` prints: 100% is one
706
+ * full core, not 100% of the host. Without that sentence, "> 80%" reads
707
+ * as a share of the machine and is wrong by the host's core count.
708
+ */
709
+ const template: DockerAlertTemplate =
710
+ getDockerAlertTemplateById("docker-high-cpu")!;
711
+ expect(template.description.toLowerCase()).toContain("core");
712
+ expect(getOfflineCopy("docker-high-cpu").toLowerCase()).toContain("core");
713
+ });
714
+
715
+ /*
716
+ * ---------------------------------------------------------------------
717
+ * Title guards.
718
+ *
719
+ * MonitorRecommendationUtil.getMonitorName returns
720
+ * "<resource> - <template name>", and the templates used to append THAT
721
+ * to every title, so the rendered alert stated the same fact twice:
722
+ * "[Docker] High CPU Usage (>80%) - docker-host-01 - High Container CPU Usage"
723
+ * SeriesContextEnricher then appends the container identity on top, which
724
+ * pushes the one thing that differs between two alerts off the end of a
725
+ * phone notification.
726
+ * ---------------------------------------------------------------------
727
+ */
728
+
729
+ test("no incident or alert title repeats the monitor name", () => {
730
+ for (const tc of DOCKER_TEMPLATES) {
731
+ const template: DockerAlertTemplate = getDockerAlertTemplateById(tc.id)!;
732
+ // The exact shape MonitorRecommendationUtil.getMonitorName produces.
733
+ const args: DockerAlertTemplateArgs = {
734
+ ...buildArgs(),
735
+ monitorName: `docker-host-01 - ${template.name}`,
736
+ };
737
+
738
+ const offline: any = (
739
+ template.getMonitorStep(args).data?.monitorCriteria.data
740
+ ?.monitorCriteriaInstanceArray as Array<any>
741
+ )[0];
742
+
743
+ expect(offline.data.incidents[0].title).not.toContain(args.monitorName);
744
+ expect(offline.data.alerts[0].title).not.toContain(args.monitorName);
745
+ // The host is the half worth keeping — the alert email renders nothing else that names it.
746
+ expect(offline.data.incidents[0].title).toContain(args.hostIdentifier);
747
+ expect(offline.data.alerts[0].title).toContain(args.hostIdentifier);
748
+ }
749
+ });
750
+
751
+ test("a title built before a host is chosen does not end in a bare dash", () => {
752
+ /*
753
+ * DockerMonitorStepForm builds a step with `hostIdentifier || ""` while
754
+ * the picker is still empty, so the suffix has to disappear rather than
755
+ * render "... - ".
756
+ */
757
+ for (const tc of DOCKER_TEMPLATES) {
758
+ const args: DockerAlertTemplateArgs = {
759
+ ...buildArgs(),
760
+ hostIdentifier: "",
761
+ };
762
+ const offline: any = (
763
+ getDockerAlertTemplateById(tc.id)!.getMonitorStep(args).data
764
+ ?.monitorCriteria.data?.monitorCriteriaInstanceArray as Array<any>
765
+ )[0];
766
+
767
+ const title: string = offline.data.incidents[0].title as string;
768
+ expect(title.trim()).toBe(title);
769
+ expect(title.endsWith("-")).toBe(false);
770
+ expect(title.length).toBeGreaterThan(0);
771
+ }
772
+ });
293
773
  });