@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
@@ -115,4 +115,193 @@ describe("KubernetesMetricCatalog", () => {
115
115
  getKubernetesMetricByMetricName("k8s.pod.memory.usage"),
116
116
  ).toBeDefined();
117
117
  });
118
+
119
+ /*
120
+ * The catalog's `unit` is rendered straight into the metric picker's
121
+ * dropdown label (`${friendlyName} (${unit})`), and its `description`
122
+ * into the help text below it. Both used to claim `k8s.*.cpu.utilization`
123
+ * was a percentage. It is not: kubeletstats emits it as CPU *cores in
124
+ * use* (UsageNanoCores / 1e9) carrying UCUM unit "1". A user who read
125
+ * "(%)" and typed 90 built a monitor comparing 90 against values around
126
+ * 0.18 — a silently dead monitor with no error surfaced anywhere.
127
+ */
128
+ describe("the kubeletstats cores gauges are not labelled as percentages", () => {
129
+ const coresGaugeNamePattern: RegExp = /\.cpu\.utilization$/i;
130
+
131
+ const coresGauges: Array<KubernetesMetricDefinition> = allMetrics.filter(
132
+ (m: KubernetesMetricDefinition) => {
133
+ return coresGaugeNamePattern.test(m.metricName);
134
+ },
135
+ );
136
+
137
+ test("the catalog still carries both of them", () => {
138
+ expect(coresGauges.length).toBeGreaterThan(0);
139
+ });
140
+
141
+ test("no .cpu.utilization entry declares a percent unit", () => {
142
+ for (const metric of coresGauges) {
143
+ expect(metric.unit).not.toBe("%");
144
+ expect(metric.unit).not.toBe("percent");
145
+ }
146
+ });
147
+
148
+ test("no .cpu.utilization description calls the value a percentage", () => {
149
+ /*
150
+ * The unit was only half the lie — the description said "CPU usage
151
+ * percentage for pods" too, and a unit-only assertion would miss it.
152
+ * The word may still appear while explaining how to DERIVE one, so
153
+ * the guard is on the claim, not the word.
154
+ */
155
+ for (const metric of coresGauges) {
156
+ expect(metric.description.toLowerCase()).not.toContain(
157
+ "usage percentage",
158
+ );
159
+ expect(metric.description.toLowerCase()).toContain("cores");
160
+ }
161
+ });
162
+
163
+ test("both cores gauges are declared in cores", () => {
164
+ expect(
165
+ getKubernetesMetricByMetricName("k8s.pod.cpu.utilization")?.unit,
166
+ ).toBe("cores");
167
+ expect(
168
+ getKubernetesMetricByMetricName("k8s.node.cpu.utilization")?.unit,
169
+ ).toBe("cores");
170
+ });
171
+
172
+ test("the friendlyName does not repeat the unit the picker appends", () => {
173
+ /*
174
+ * KubernetesMetricPicker builds its label as
175
+ * `${friendlyName}${unit ? ` (${unit})` : ""}`. A friendlyName of
176
+ * "Pod CPU Usage (Cores)" would render "Pod CPU Usage (Cores) (cores)".
177
+ */
178
+ for (const metric of allMetrics) {
179
+ if (!metric.unit) {
180
+ continue;
181
+ }
182
+ expect(metric.friendlyName.toLowerCase()).not.toContain(
183
+ `(${metric.unit.toLowerCase()})`,
184
+ );
185
+ }
186
+ });
187
+ });
188
+
189
+ /*
190
+ * "Node Disk I/O" was wired to `k8s.node.filesystem.available` — free
191
+ * space remaining, not I/O. A user alerting on node disk activity built
192
+ * a "greater than" monitor on headroom, which fires when the disk is
193
+ * EMPTY and stays silent as it fills.
194
+ */
195
+ describe("entries are named for the metric they are actually wired to", () => {
196
+ test("the mislabelled Node Disk I/O entry is gone", () => {
197
+ expect(getKubernetesMetricById("node-disk-io")).toBeUndefined();
198
+ });
199
+
200
+ test("it is replaced by an honest free-space entry", () => {
201
+ const entry: KubernetesMetricDefinition | undefined =
202
+ getKubernetesMetricById("node-filesystem-available");
203
+
204
+ expect(entry).toBeDefined();
205
+ expect(entry?.metricName).toBe("k8s.node.filesystem.available");
206
+ expect(entry?.friendlyName).toBe("Node Filesystem Available");
207
+ // Headroom alerts ask "how low did it get", not "what was the mean".
208
+ expect(entry?.defaultAggregation).toBe(AggregationType.Min);
209
+ });
210
+
211
+ test("no throughput-sounding name points at a level/limit gauge", () => {
212
+ /*
213
+ * The generalised guard: catches the NEXT entry named for one thing
214
+ * and wired to another, rather than just this one.
215
+ */
216
+ const throughputSoundingName: RegExp = /disk i\/o|network|throughput/i;
217
+
218
+ for (const metric of allMetrics) {
219
+ if (throughputSoundingName.test(metric.friendlyName)) {
220
+ expect(metric.metricName).not.toMatch(
221
+ /\.(available|capacity|limit|request)$/,
222
+ );
223
+ }
224
+ }
225
+ });
226
+ });
227
+
228
+ /*
229
+ * DashboardTemplates documents this trap after being bitten by it: these
230
+ * are per-resource gauges that re-emit on every scrape, so summing across
231
+ * the window multiplies (resources x scrapes) and produces numbers in the
232
+ * hundreds for a tiny cluster. `k8s.pod.phase` is worse still — its value
233
+ * is an enum code (1 = Pending ... 5 = Unknown), so a Sum is an arithmetic
234
+ * total of category labels.
235
+ */
236
+ describe("categorical and cumulative gauges are never summed", () => {
237
+ test("k8s.pod.phase does not default to Sum", () => {
238
+ const phase: KubernetesMetricDefinition | undefined =
239
+ getKubernetesMetricByMetricName("k8s.pod.phase");
240
+
241
+ expect(phase).toBeDefined();
242
+ expect(phase?.defaultAggregation).not.toBe(AggregationType.Sum);
243
+ // A phase code is dimensionless; "count" was the wrong dimension.
244
+ expect(phase?.unit).not.toBe("count");
245
+ });
246
+
247
+ test("no state/phase/condition gauge defaults to Sum", () => {
248
+ const describesAState: RegExp = /\bphase\b|\bcondition\b|\bstate\b|1 = /i;
249
+
250
+ for (const metric of allMetrics) {
251
+ if (describesAState.test(metric.description)) {
252
+ expect(metric.defaultAggregation).not.toBe(AggregationType.Sum);
253
+ }
254
+ }
255
+ });
256
+
257
+ test("no cumulative counter defaults to Sum", () => {
258
+ const describesACounter: RegExp = /cumulative/i;
259
+
260
+ for (const metric of allMetrics) {
261
+ if (describesACounter.test(metric.description)) {
262
+ expect(metric.defaultAggregation).not.toBe(AggregationType.Sum);
263
+ }
264
+ }
265
+ });
266
+ });
267
+
268
+ /*
269
+ * KubernetesMetricDefinition has no field for a datapoint-attribute
270
+ * filter, and KubernetesMonitorStepForm passes none, so every entry
271
+ * queries EVERY series of its metric. "Pod Network Receive" therefore
272
+ * summed receive AND transmit together over a cumulative counter —
273
+ * roughly double the real receive volume, and a chatty transmitter
274
+ * tripping a receive threshold it never crossed.
275
+ */
276
+ describe("no entry promises a filter the definition cannot express", () => {
277
+ test("the undeliverable directional entry is gone", () => {
278
+ expect(getKubernetesMetricById("pod-network-io-receive")).toBeUndefined();
279
+ expect(getKubernetesMetricById("pod-network-io")).toBeDefined();
280
+ });
281
+
282
+ test("no friendlyName claims a direction while carrying no filter", () => {
283
+ /*
284
+ * Becomes a real per-entry filter check the moment an optional
285
+ * `attributes` field lands on KubernetesMetricDefinition.
286
+ */
287
+ const hasAttributeFilterField: boolean = allMetrics.some(
288
+ (m: KubernetesMetricDefinition) => {
289
+ return (
290
+ (m as KubernetesMetricDefinition & { attributes?: unknown })
291
+ .attributes !== undefined
292
+ );
293
+ },
294
+ );
295
+
296
+ if (hasAttributeFilterField) {
297
+ return;
298
+ }
299
+
300
+ for (const metric of allMetrics) {
301
+ expect(metric.friendlyName).not.toMatch(
302
+ /\b(receive|transmit|ingress|egress)\b/i,
303
+ );
304
+ }
305
+ });
306
+ });
118
307
  });
@@ -30,6 +30,23 @@ import ObjectID from "../../../Types/ObjectID";
30
30
  * - Cluster-scalar templates must stay UNGROUPED. etcd leadership, API
31
31
  * server throttling and scheduler queue depth are one value for the
32
32
  * cluster; splitting them invents series that do not exist.
33
+ *
34
+ * - The key set is also the ALERT'S VOCABULARY. Series labels are
35
+ * stored on the alert and rendered into its title and description
36
+ * (SeriesLabelDisplay / SeriesContextEnricher), so a key left out
37
+ * here is a fact the on-call engineer does not get. That is why the
38
+ * namespace-scoped objects group by namespace as well as their own
39
+ * name: `k8s.pod.name` alone is not a Kubernetes identity, and
40
+ * "Pod: checkout-7d9f-2xk" with no namespace is a `kubectl` guess.
41
+ *
42
+ * - A key that only ONE side of a RATIO template carries is worse than
43
+ * a missing label: the two queries join by series fingerprint, so
44
+ * the formula silently stops producing values and the monitor stops
45
+ * alerting entirely. `k8s.namespace.name` is stamped directly by
46
+ * both kubeletstats and the k8s_cluster receiver and is safe;
47
+ * `k8s.node.name` on the k8s_cluster side only arrives via the
48
+ * best-effort k8sattributes processor and is deliberately NOT in any
49
+ * ratio template's key set. See buildKubernetesRatioMonitorConfig.
33
50
  */
34
51
 
35
52
  interface TemplateGroupByCase {
@@ -42,8 +59,12 @@ interface TemplateGroupByCase {
42
59
  const EXPECTED_GROUP_BY: Array<TemplateGroupByCase> = [
43
60
  {
44
61
  id: "k8s-crashloopbackoff",
45
- groupByKeys: ["resource.k8s.pod.name"],
46
- why: "restarts belong to one pod's containers",
62
+ groupByKeys: [
63
+ "resource.k8s.namespace.name",
64
+ "resource.k8s.pod.name",
65
+ "resource.k8s.container.name",
66
+ ],
67
+ why: "restarts belong to one CONTAINER of one pod, and the alert has to name which",
47
68
  },
48
69
  {
49
70
  id: "k8s-pod-pending",
@@ -67,13 +88,16 @@ const EXPECTED_GROUP_BY: Array<TemplateGroupByCase> = [
67
88
  },
68
89
  {
69
90
  id: "k8s-deployment-replica-mismatch",
70
- groupByKeys: ["resource.k8s.deployment.name"],
71
- why: "a stuck rollout belongs to one Deployment object",
91
+ groupByKeys: [
92
+ "resource.k8s.namespace.name",
93
+ "resource.k8s.deployment.name",
94
+ ],
95
+ why: "a stuck rollout belongs to one Deployment object, which is namespace-scoped",
72
96
  },
73
97
  {
74
98
  id: "k8s-job-failures",
75
- groupByKeys: ["resource.k8s.job.name"],
76
- why: "one failing Job must not hide the next",
99
+ groupByKeys: ["resource.k8s.namespace.name", "resource.k8s.job.name"],
100
+ why: "one failing Job must not hide the next; Job names repeat across namespaces",
77
101
  },
78
102
  {
79
103
  id: "k8s-etcd-no-leader",
@@ -97,8 +121,8 @@ const EXPECTED_GROUP_BY: Array<TemplateGroupByCase> = [
97
121
  },
98
122
  {
99
123
  id: "k8s-daemonset-unavailable",
100
- groupByKeys: ["resource.k8s.daemonset.name"],
101
- why: "the incident names one DaemonSet",
124
+ groupByKeys: ["resource.k8s.namespace.name", "resource.k8s.daemonset.name"],
125
+ why: "the incident names one DaemonSet, which is namespace-scoped",
102
126
  },
103
127
  {
104
128
  id: "k8s-node-cpu-request-utilization",
@@ -112,18 +136,18 @@ const EXPECTED_GROUP_BY: Array<TemplateGroupByCase> = [
112
136
  },
113
137
  {
114
138
  id: "k8s-hpa-at-max-replicas",
115
- groupByKeys: ["resource.k8s.hpa.name"],
116
- why: "saturation belongs to one HPA object",
139
+ groupByKeys: ["resource.k8s.namespace.name", "resource.k8s.hpa.name"],
140
+ why: "saturation belongs to one HPA object, which is namespace-scoped",
117
141
  },
118
142
  {
119
143
  id: "k8s-pod-memory-limit-saturation",
120
- groupByKeys: ["resource.k8s.pod.name"],
121
- why: "the pod about to be OOMKilled is the one to page on",
144
+ groupByKeys: ["resource.k8s.namespace.name", "resource.k8s.pod.name"],
145
+ why: "the pod about to be OOMKilled is the one to page on, and a pod name alone is not an identity",
122
146
  },
123
147
  {
124
148
  id: "k8s-pod-cpu-limit-saturation",
125
- groupByKeys: ["resource.k8s.pod.name"],
126
- why: "the throttled pod is the one to page on",
149
+ groupByKeys: ["resource.k8s.namespace.name", "resource.k8s.pod.name"],
150
+ why: "the throttled pod is the one to page on, and a pod name alone is not an identity",
127
151
  },
128
152
  ];
129
153
 
@@ -205,6 +229,63 @@ describe("KubernetesAlertTemplates - per-series group-by keys", () => {
205
229
  },
206
230
  );
207
231
 
232
+ /*
233
+ * Kubernetes object names are unique per (namespace, kind), not
234
+ * globally. A template that groups by a namespace-scoped object's name
235
+ * alone therefore does two wrong things at once: two same-named
236
+ * objects in different namespaces collapse into one series (so the
237
+ * second one's breach is silenced behind the first one's open alert),
238
+ * and the alert it does raise cannot be acted on without guessing the
239
+ * namespace.
240
+ */
241
+ const NAMESPACE_SCOPED_OBJECT_KEYS: Array<string> = [
242
+ "resource.k8s.pod.name",
243
+ "resource.k8s.container.name",
244
+ "resource.k8s.deployment.name",
245
+ "resource.k8s.statefulset.name",
246
+ "resource.k8s.daemonset.name",
247
+ "resource.k8s.job.name",
248
+ "resource.k8s.cronjob.name",
249
+ "resource.k8s.hpa.name",
250
+ ];
251
+
252
+ test.each(
253
+ EXPECTED_GROUP_BY.filter((tc: TemplateGroupByCase) => {
254
+ return tc.groupByKeys.some((key: string) => {
255
+ return NAMESPACE_SCOPED_OBJECT_KEYS.includes(key);
256
+ });
257
+ }),
258
+ )(
259
+ "$id groups a namespace-scoped object and therefore also by namespace",
260
+ (tc: TemplateGroupByCase) => {
261
+ expect(tc.groupByKeys).toContain("resource.k8s.namespace.name");
262
+ },
263
+ );
264
+
265
+ test("every query of a template shares one group-by key set", () => {
266
+ /*
267
+ * Ratio templates join their two queries by series fingerprint,
268
+ * which is computed from this key set. Two queries with different
269
+ * key sets produce fingerprints that never meet, the formula
270
+ * evaluates against an empty operand, and the monitor stops
271
+ * alerting without any error anywhere.
272
+ */
273
+ for (const template of getAllKubernetesAlertTemplates()) {
274
+ const step: MonitorStep = template.getMonitorStep(buildArgs());
275
+
276
+ const keySets: Array<string> = (
277
+ (step.data?.kubernetesMonitor?.metricViewConfig?.queryConfigs ||
278
+ []) as Array<any>
279
+ ).map((queryConfig: any) => {
280
+ return JSON.stringify(
281
+ queryConfig.metricQueryData.groupByAttributeKeys || [],
282
+ );
283
+ });
284
+
285
+ expect(new Set(keySets).size).toBeLessThanOrEqual(1);
286
+ }
287
+ });
288
+
208
289
  test("grouped templates are the majority of the shipped set", () => {
209
290
  const grouped: number = EXPECTED_GROUP_BY.filter(
210
291
  (tc: TemplateGroupByCase) => {
@@ -7,6 +7,8 @@ import {
7
7
  getPodmanAlertTemplatesByCategory,
8
8
  } from "../../../Types/Monitor/PodmanAlertTemplates";
9
9
  import MonitorStep from "../../../Types/Monitor/MonitorStep";
10
+ import { getPodmanMetricByMetricName } from "../../../Types/Monitor/PodmanMetricCatalog";
11
+ import { hasRecoveryDeadBand } from "./Utils/RecommendationCriteriaAssertions";
10
12
  import MonitorStepPodmanMonitor from "../../../Types/Monitor/MonitorStepPodmanMonitor";
11
13
  import MetricsAggregationType from "../../../Types/Metrics/MetricsAggregationType";
12
14
  import RollingTime from "../../../Types/RollingTime/RollingTime";
@@ -42,7 +44,7 @@ const PODMAN_TEMPLATES: Array<PodmanTemplateCase> = [
42
44
  severity: "Warning",
43
45
  metricName: "container.cpu.utilization",
44
46
  metricAlias: "container_cpu",
45
- aggregation: MetricsAggregationType.Max,
47
+ aggregation: MetricsAggregationType.Avg,
46
48
  rollingTime: RollingTime.Past5Minutes,
47
49
  offlineFilterType: FilterType.GreaterThan,
48
50
  onlineFilterType: FilterType.LessThanOrEqualTo,
@@ -54,7 +56,7 @@ const PODMAN_TEMPLATES: Array<PodmanTemplateCase> = [
54
56
  severity: "Warning",
55
57
  metricName: "container.memory.percent",
56
58
  metricAlias: "container_memory",
57
- aggregation: MetricsAggregationType.Max,
59
+ aggregation: MetricsAggregationType.Avg,
58
60
  rollingTime: RollingTime.Past5Minutes,
59
61
  offlineFilterType: FilterType.GreaterThan,
60
62
  onlineFilterType: FilterType.LessThanOrEqualTo,
@@ -72,19 +74,6 @@ const PODMAN_TEMPLATES: Array<PodmanTemplateCase> = [
72
74
  onlineFilterType: FilterType.LessThanOrEqualTo,
73
75
  threshold: 5,
74
76
  },
75
- {
76
- id: "podman-cpu-throttling",
77
- category: "Resource",
78
- severity: "Warning",
79
- metricName: "container.cpu.throttling_data.throttled_time",
80
- metricAlias: "cpu_throttled",
81
- aggregation: MetricsAggregationType.Max,
82
- rollingTime: RollingTime.Past5Minutes,
83
- // throttled_time is non-negative: (> 0) unhealthy, (= 0) healthy partitions it.
84
- offlineFilterType: FilterType.GreaterThan,
85
- onlineFilterType: FilterType.EqualTo,
86
- threshold: 0,
87
- },
88
77
  {
89
78
  id: "podman-high-pids",
90
79
  category: "Container",
@@ -105,10 +94,15 @@ const PODMAN_TEMPLATES: Array<PodmanTemplateCase> = [
105
94
  metricAlias: "container_uptime",
106
95
  aggregation: MetricsAggregationType.Min,
107
96
  rollingTime: RollingTime.Past1Minute,
108
- // uptime is non-negative: (= 0) unhealthy, (> 0) healthy partitions it.
109
- offlineFilterType: FilterType.EqualTo,
110
- onlineFilterType: FilterType.GreaterThan,
111
- threshold: 0,
97
+ /*
98
+ * uptime is never 0: the docker_stats receiver scrapes only RUNNING
99
+ * containers, so a stopped one emits nothing rather than a zero, and a
100
+ * running one is never sampled at the instant it started. The fire test
101
+ * is a low-uptime (restart) test, not an equality against zero.
102
+ */
103
+ offlineFilterType: FilterType.LessThan,
104
+ onlineFilterType: FilterType.GreaterThanOrEqualTo,
105
+ threshold: 120,
112
106
  },
113
107
  ];
114
108
 
@@ -217,7 +211,7 @@ describe("PodmanAlertTemplates", () => {
217
211
  );
218
212
 
219
213
  test.each(PODMAN_TEMPLATES)(
220
- "$id unhealthy/healthy criteria partition the range at $threshold",
214
+ "$id unhealthy/healthy criteria leave a recovery dead band around $threshold",
221
215
  (tc: PodmanTemplateCase) => {
222
216
  const template: PodmanAlertTemplate = getPodmanAlertTemplateById(tc.id)!;
223
217
  const step: MonitorStep = template.getMonitorStep(buildArgs());
@@ -237,7 +231,26 @@ describe("PodmanAlertTemplates", () => {
237
231
  tc.metricAlias,
238
232
  );
239
233
  expect(offlineFilter.value).toBe(tc.threshold);
240
- expect(onlineFilter.value).toBe(tc.threshold);
234
+ /*
235
+ * The healthy criteria recovers at a threshold strictly INSIDE the
236
+ * firing one, so a metric hovering at the boundary cannot satisfy
237
+ * both on consecutive evaluations. This assertion used to be
238
+ * `expect(onlineFilter.value).toBe(tc.threshold)` — the two criteria
239
+ * exactly partitioned the range, which is the flapping configuration
240
+ * this suite existed to lock in.
241
+ */
242
+ expect(
243
+ hasRecoveryDeadBand(
244
+ {
245
+ filterType: offlineFilter.filterType,
246
+ value: offlineFilter.value as number,
247
+ },
248
+ {
249
+ filterType: onlineFilter.filterType,
250
+ value: onlineFilter.value as number,
251
+ },
252
+ ),
253
+ ).toBe(true);
241
254
 
242
255
  expect(offlineFilter.filterType).toBe(tc.offlineFilterType);
243
256
  expect(onlineFilter.filterType).toBe(tc.onlineFilterType);
@@ -268,4 +281,160 @@ describe("PodmanAlertTemplates", () => {
268
281
  expect(offline.data.alerts[0].autoResolveAlert).toBe(true);
269
282
  }
270
283
  });
284
+
285
+ /*
286
+ * Lifetime, monotonic counters. Nothing between OTLP ingest and the
287
+ * criteria evaluator converts one to a delta or a rate — ingest keeps
288
+ * aggregationTemporality/isMonotonic only as catalog metadata for the
289
+ * dashboard's rate-view hint, AggregationType has no rate/increase member,
290
+ * and CompareCriteria.reduceWindow offers only Average/Sum/Max/Min. So a
291
+ * "> N" criteria on one of these fires the first time the container ever
292
+ * breaches and NEVER clears: the recovery comparison is unreachable until
293
+ * the container is recreated. `podman-cpu-throttling` did exactly that on
294
+ * throttled_time and was removed for it; this guard stops it, or an
295
+ * equivalent, being pasted back in from DockerAlertTemplates.
296
+ */
297
+ const CUMULATIVE_METRICS: Array<string> = [
298
+ "container.cpu.throttling_data.throttled_time",
299
+ "container.cpu.throttling_data.throttled_periods",
300
+ "container.cpu.usage.total",
301
+ ];
302
+
303
+ test("no template thresholds a cumulative counter it cannot recover from", () => {
304
+ for (const template of getAllPodmanAlertTemplates()) {
305
+ const monitor: MonitorStepPodmanMonitor = getPodmanMonitor(
306
+ template.getMonitorStep(buildArgs()),
307
+ );
308
+ for (const queryConfig of monitor.metricViewConfig
309
+ .queryConfigs as Array<any>) {
310
+ expect(CUMULATIVE_METRICS).not.toContain(
311
+ queryConfig.metricQueryData.filterData.metricName,
312
+ );
313
+ }
314
+ }
315
+ });
316
+
317
+ test("podman-cpu-throttling is not registered", () => {
318
+ // Removed deliberately — see the note in PodmanAlertTemplates.ts.
319
+ expect(getPodmanAlertTemplateById("podman-cpu-throttling")).toBeUndefined();
320
+ });
321
+
322
+ test("podman-container-down fires on a low uptime, not on an unreachable zero", () => {
323
+ const step: MonitorStep = getPodmanAlertTemplateById(
324
+ "podman-container-down",
325
+ )!.getMonitorStep(buildArgs());
326
+ const [offline, online]: Array<any> = step.data?.monitorCriteria.data
327
+ ?.monitorCriteriaInstanceArray as Array<any>;
328
+
329
+ /*
330
+ * A stopped container emits no rows at all and a running one is never
331
+ * scraped at the instant it started, so an equality-to-zero comparison
332
+ * on container.uptime can never be satisfied in either direction.
333
+ */
334
+ expect(offline.data.filters[0].filterType).not.toBe(FilterType.EqualTo);
335
+ expect(offline.data.filters[0].value).toBeGreaterThan(0);
336
+
337
+ // Wider than the 30s scrape and the 60s evaluation interval combined.
338
+ expect(offline.data.filters[0].value).toBeGreaterThanOrEqual(120);
339
+
340
+ // And recovery sits strictly outside the firing threshold.
341
+ expect(online.data.filters[0].filterType).toBe(
342
+ FilterType.GreaterThanOrEqualTo,
343
+ );
344
+ expect(online.data.filters[0].value).toBeGreaterThan(
345
+ offline.data.filters[0].value as number,
346
+ );
347
+ });
348
+
349
+ test("cumulative-counter templates do not claim windowed semantics", () => {
350
+ /*
351
+ * container.restarts is a running total kept by the container engine and
352
+ * nothing in the alerting path converts it to a delta, so copy promising
353
+ * a per-window count describes behaviour the query does not implement.
354
+ * The criteria description is what the on-call engineer reads in the
355
+ * Evaluation Logs, so the correction has to live there, not just in the
356
+ * template's own name.
357
+ */
358
+ const step: MonitorStep = getPodmanAlertTemplateById(
359
+ "podman-restart-loop",
360
+ )!.getMonitorStep(buildArgs());
361
+ const offline: any = (
362
+ step.data?.monitorCriteria.data
363
+ ?.monitorCriteriaInstanceArray as Array<any>
364
+ )[0];
365
+
366
+ expect(offline.data.description).toMatch(/running total|cumulative/i);
367
+ expect(offline.data.description).not.toMatch(/in the monitoring window/i);
368
+ expect(offline.data.incidents[0].description).toMatch(
369
+ /running total|cumulative/i,
370
+ );
371
+ expect(
372
+ getPodmanAlertTemplateById("podman-restart-loop")!.description,
373
+ ).not.toMatch(/crash loop/i);
374
+ });
375
+
376
+ test("percentage gauges use the aggregation their catalog entry declares", () => {
377
+ /*
378
+ * container.cpu.utilization and container.memory.percent are already
379
+ * per-container percentages; PodmanMetricCatalog declares Avg for both
380
+ * and the Docker Swarm templates use Avg on the identical metrics at the
381
+ * identical thresholds. Max on a per-minute bucket turns a sub-minute
382
+ * burst into a whole minute above the threshold, which contradicts the
383
+ * word "sustained" in the copy — and with the fire side now evaluated
384
+ * over ALL values in the window, Max means "every minute's PEAK crossed",
385
+ * which is strictly weaker than sustained load.
386
+ */
387
+ for (const id of ["podman-high-cpu", "podman-high-memory"]) {
388
+ const monitor: MonitorStepPodmanMonitor = getPodmanMonitor(
389
+ getPodmanAlertTemplateById(id)!.getMonitorStep(buildArgs()),
390
+ );
391
+ const filterData: any = (
392
+ monitor.metricViewConfig.queryConfigs as Array<any>
393
+ )[0].metricQueryData.filterData;
394
+
395
+ expect(filterData.aggegationType).toBe(MetricsAggregationType.Avg);
396
+ expect(filterData.aggegationType).toBe(
397
+ getPodmanMetricByMetricName(filterData.metricName)!.defaultAggregation,
398
+ );
399
+ }
400
+ });
401
+
402
+ test("podman-high-cpu states the percent-of-one-core scale", () => {
403
+ /*
404
+ * PodmanMetricCatalog: "100% = 1 full CPU core". A container spread over
405
+ * several cores sits permanently above 80 while healthy, so copy that
406
+ * reads as "80% of the container's CPU allowance" is wrong.
407
+ */
408
+ const step: MonitorStep =
409
+ getPodmanAlertTemplateById("podman-high-cpu")!.getMonitorStep(
410
+ buildArgs(),
411
+ );
412
+ const offline: any = (
413
+ step.data?.monitorCriteria.data
414
+ ?.monitorCriteriaInstanceArray as Array<any>
415
+ )[0];
416
+
417
+ expect(offline.data.incidents[0].description).toMatch(/core/i);
418
+ expect(offline.data.description).toMatch(/core/i);
419
+ });
420
+
421
+ test("podman-high-memory does not promise a limit the metric may not have", () => {
422
+ /*
423
+ * container.memory.percent falls back to a percentage of HOST total for a
424
+ * container started without --memory, which is Podman's default. Copy
425
+ * that says only "of its limit", and builds an OOM narrative on it, is
426
+ * wrong for exactly the container most able to take the host down.
427
+ */
428
+ const step: MonitorStep =
429
+ getPodmanAlertTemplateById("podman-high-memory")!.getMonitorStep(
430
+ buildArgs(),
431
+ );
432
+ const offline: any = (
433
+ step.data?.monitorCriteria.data
434
+ ?.monitorCriteriaInstanceArray as Array<any>
435
+ )[0];
436
+
437
+ expect(offline.data.incidents[0].description).toMatch(/host/i);
438
+ expect(offline.data.description).toMatch(/host/i);
439
+ });
271
440
  });