@oneuptime/common 12.0.32 → 12.0.33

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 (597) hide show
  1. package/Models/AnalyticsModels/Span.ts +14 -0
  2. package/Models/DatabaseModels/EnterpriseLicense.ts +56 -0
  3. package/Models/DatabaseModels/Index.ts +10 -0
  4. package/Models/DatabaseModels/Monitor.ts +76 -0
  5. package/Models/DatabaseModels/NetworkAlertPolicy.ts +690 -0
  6. package/Models/DatabaseModels/NetworkDevice.ts +176 -1
  7. package/Models/DatabaseModels/NetworkSite.ts +201 -2
  8. package/Models/DatabaseModels/NetworkSiteType.ts +102 -3
  9. package/Models/DatabaseModels/NetworkSnmpCredentialProfile.ts +841 -0
  10. package/Models/DatabaseModels/TelemetryException.ts +119 -0
  11. package/Models/DatabaseModels/UserNotificationEmailRollupBatch.ts +334 -0
  12. package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +370 -0
  13. package/Models/DatabaseModels/UserNotificationEmailRollupSetting.ts +282 -0
  14. package/Server/API/EnterpriseLicenseAPI.ts +391 -64
  15. package/Server/API/LlmProviderAPI.ts +137 -22
  16. package/Server/EnvironmentConfig.ts +14 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.ts +55 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.ts +31 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.ts +124 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.ts +132 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.ts +79 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.ts +191 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
  24. package/Server/Infrastructure/QueueWorker.ts +38 -8
  25. package/Server/Middleware/BearerTokenAuthorization.ts +12 -0
  26. package/Server/Middleware/ProjectAuthorization.ts +11 -0
  27. package/Server/Middleware/SCIMAuthorization.ts +12 -0
  28. package/Server/Middleware/TelemetryIngest.ts +11 -0
  29. package/Server/Services/AIBillingService.ts +101 -27
  30. package/Server/Services/EnterpriseLicenseInstanceService.ts +197 -0
  31. package/Server/Services/EnterpriseLicenseService.ts +55 -0
  32. package/Server/Services/Index.ts +10 -0
  33. package/Server/Services/MonitorService.ts +143 -21
  34. package/Server/Services/MonitorStatusTimelineService.ts +150 -8
  35. package/Server/Services/MonitorTemplateService.ts +217 -1
  36. package/Server/Services/NetworkAlertPolicyEngineService.ts +2159 -0
  37. package/Server/Services/NetworkAlertPolicyService.ts +944 -0
  38. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +9 -10
  39. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +60 -15
  40. package/Server/Services/NetworkDeviceService.ts +1032 -73
  41. package/Server/Services/NetworkSiteService.ts +1502 -129
  42. package/Server/Services/NetworkSiteTypeService.ts +1216 -0
  43. package/Server/Services/NetworkSnmpCredentialProfileService.ts +238 -0
  44. package/Server/Services/NotificationService.ts +118 -28
  45. package/Server/Services/ProjectService.ts +105 -48
  46. package/Server/Services/StatusPagePrivateUserService.ts +103 -3
  47. package/Server/Services/UserNotificationEmailRollupBatchService.ts +78 -0
  48. package/Server/Services/UserNotificationEmailRollupItemService.ts +79 -0
  49. package/Server/Services/UserNotificationEmailRollupSettingService.ts +113 -0
  50. package/Server/Services/UserNotificationSettingService.ts +62 -25
  51. package/Server/Services/UserService.ts +95 -0
  52. package/Server/Types/Database/QueryHelper.ts +2 -2
  53. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +14 -3
  54. package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +10 -0
  55. package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +10 -0
  56. package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +62 -1
  57. package/Server/Utils/AI/Toolbox/AlertTools.ts +15 -1
  58. package/Server/Utils/Billing/BillingFailureNoticeThrottle.ts +80 -0
  59. package/Server/Utils/DataSource/HttpFetch.ts +9 -2
  60. package/Server/Utils/EmailRollup/EmailRollupConstants.ts +98 -0
  61. package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +872 -0
  62. package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +781 -0
  63. package/Server/Utils/EmailRollup/EmailRollupWriter.ts +368 -0
  64. package/Server/Utils/LLM/LLMService.ts +78 -0
  65. package/Server/Utils/LogRedaction.ts +8 -0
  66. package/Server/Utils/Logger.ts +79 -1
  67. package/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.ts +190 -0
  68. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +9 -2
  69. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +61 -1
  70. package/Server/Utils/Monitor/MonitorCriteriaDataExtractor.ts +14 -0
  71. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +49 -0
  72. package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +255 -4
  73. package/Server/Utils/Monitor/MonitorMetricUtil.ts +41 -0
  74. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +43 -0
  75. package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +499 -19
  76. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +66 -10
  77. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +238 -44
  78. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +146 -39
  79. package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +31 -18
  80. package/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.ts +213 -0
  81. package/Server/Utils/OutboundUserAgent.ts +152 -0
  82. package/Server/Utils/StartServer.ts +51 -19
  83. package/Server/Utils/Telemetry/CaptureSpan.ts +32 -8
  84. package/Server/Utils/Telemetry/ErrorClassResolver.ts +120 -0
  85. package/Server/Utils/Telemetry/SpanUtil.ts +33 -0
  86. package/Server/Utils/Telemetry.ts +198 -51
  87. package/Server/Views/Partials/SensitiveUrlToken.ejs +140 -0
  88. package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +134 -33
  89. package/Tests/App/Dashboard/AskAiSuggestedPrompts.test.ts +279 -0
  90. package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +517 -0
  91. package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +26 -0
  92. package/Tests/App/Dashboard/DeviceStatusHero.test.tsx +588 -0
  93. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +18 -9
  94. package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +632 -0
  95. package/Tests/App/Dashboard/MonitorRecommendationCreateProgress.test.tsx +682 -0
  96. package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +4 -2
  97. package/Tests/App/Dashboard/NetworkDeviceCreateFormMonitorBinding.test.tsx +676 -0
  98. package/Tests/App/Dashboard/NetworkDeviceCreateFormPingMonitor.test.tsx +791 -0
  99. package/Tests/App/Dashboard/NetworkDeviceCreateFormProbeAndSnmp.test.tsx +833 -0
  100. package/Tests/App/Dashboard/NetworkDeviceCriteriaFilter.test.ts +161 -0
  101. package/Tests/App/Dashboard/NetworkDeviceSettingsMonitoringSection.test.tsx +458 -0
  102. package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +41 -5
  103. package/Tests/App/Dashboard/PingMonitorProvisioning.test.ts +368 -0
  104. package/Tests/App/Dashboard/RecommendationCard.test.tsx +796 -0
  105. package/Tests/App/Dashboard/RecommendationToolbar.test.tsx +519 -0
  106. package/Tests/App/Dashboard/RecommendationsList.test.tsx +661 -0
  107. package/Tests/App/Dashboard/UseBulkCreatePingMonitors.test.tsx +899 -0
  108. package/Tests/App/Dashboard/UseBulkSnmpCredentialProfileActions.test.tsx +732 -0
  109. package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +256 -0
  110. package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +11 -1
  111. package/Tests/App/StatusPage/StatusPageLoginCodeBootstrap.test.ts +9 -4
  112. package/Tests/Models/NetworkSiteHierarchy.test.ts +41 -4
  113. package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +951 -7
  114. package/Tests/Server/API/LlmProviderConnectionTest.test.ts +522 -0
  115. package/Tests/Server/Infrastructure/Postgres/NetworkSnmpCredentialProfilesAndAlertPoliciesMigration.test.ts +854 -0
  116. package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +18 -0
  117. package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +535 -0
  118. package/Tests/Server/Services/AIChatPrivacyPin.test.ts +560 -0
  119. package/Tests/Server/Services/BillingRechargeOwnerEmailGuards.test.ts +783 -0
  120. package/Tests/Server/Services/EnterpriseLicenseInstanceServiceDeletionUsage.test.ts +707 -0
  121. package/Tests/Server/Services/EnterpriseLicenseServiceUsageAggregationLock.test.ts +329 -0
  122. package/Tests/Server/Services/MonitorServiceDeleteNetworkDeviceCleanup.test.ts +294 -0
  123. package/Tests/Server/Services/MonitorStatusBridgeProbePath.test.ts +802 -0
  124. package/Tests/Server/Services/MonitorStatusTimelineService.test.ts +72 -2
  125. package/Tests/Server/Services/NetworkAlertPolicyEngineHooks.test.ts +752 -0
  126. package/Tests/Server/Services/NetworkAlertPolicyEngineService.test.ts +1849 -0
  127. package/Tests/Server/Services/NetworkAlertPolicyModel.test.ts +1793 -0
  128. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +47 -4
  129. package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +97 -12
  130. package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +148 -3
  131. package/Tests/Server/Services/NetworkDeviceMonitorBindingUpdateGuard.test.ts +514 -0
  132. package/Tests/Server/Services/NetworkDeviceMonitorStatusStamp.test.ts +447 -58
  133. package/Tests/Server/Services/NetworkDeviceMonitoringMethodTransition.test.ts +739 -0
  134. package/Tests/Server/Services/NetworkDevicePollingTenancy.test.ts +501 -0
  135. package/Tests/Server/Services/NetworkDeviceSiteDefaultProbe.test.ts +432 -0
  136. package/Tests/Server/Services/NetworkSiteMonitoringDefaults.test.ts +498 -0
  137. package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +337 -55
  138. package/Tests/Server/Services/NetworkSiteService.test.ts +1868 -131
  139. package/Tests/Server/Services/NetworkSiteTypeService.test.ts +1109 -0
  140. package/Tests/Server/Services/NetworkSnmpCredentialProfileModel.test.ts +926 -0
  141. package/Tests/Server/Services/NetworkSnmpCredentialProfileService.test.ts +796 -0
  142. package/Tests/Server/Services/ProjectServiceNetworkSiteTypeDefaults.test.ts +214 -0
  143. package/Tests/Server/Services/StatusPagePrivateUserEmailChangePasswordResetExpiry.test.ts +269 -0
  144. package/Tests/Server/Services/UserEmailChangePasswordResetExpiry.test.ts +472 -0
  145. package/Tests/Server/Services/UserNotificationEmailRollupModels.test.ts +569 -0
  146. package/Tests/Server/Services/UserNotificationEmailRollupSettingModel.test.ts +314 -0
  147. package/Tests/Server/Services/UserNotificationEmailRollupSettingService.test.ts +409 -0
  148. package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +856 -0
  149. package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +102 -1
  150. package/Tests/Server/Types/Database/Permissions/DashboardAccessPermission.test.ts +321 -0
  151. package/Tests/Server/Types/Database/QueryHelperOperators.test.ts +17 -0
  152. package/Tests/Server/Utils/AI/AlertMonitorFilters.test.ts +124 -0
  153. package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +208 -0
  154. package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +235 -0
  155. package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +253 -0
  156. package/Tests/Server/Utils/Captcha.test.ts +422 -0
  157. package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +96 -2
  158. package/Tests/Server/Utils/Database/MigrationFailureLog.test.ts +466 -0
  159. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1096 -0
  160. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerClaim.test.ts +466 -0
  161. package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +1428 -0
  162. package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +752 -0
  163. package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +864 -0
  164. package/Tests/Server/Utils/LoggerFaultDemotion.test.ts +346 -0
  165. package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +633 -0
  166. package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +196 -0
  167. package/Tests/Server/Utils/Monitor/DatabaseMetricWrite.test.ts +367 -0
  168. package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +100 -0
  169. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +5 -0
  170. package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +512 -31
  171. package/Tests/Server/Utils/Monitor/NetworkDeviceMetricUtil.test.ts +252 -0
  172. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +479 -42
  173. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +351 -5
  174. package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +136 -12
  175. package/Tests/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.test.ts +306 -0
  176. package/Tests/Server/Utils/OutboundUserAgent.test.ts +266 -0
  177. package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClientUserAgent.test.ts +141 -0
  178. package/Tests/Server/Utils/Telemetry/ErrorClassResolver.test.ts +298 -0
  179. package/Tests/Server/Utils/Telemetry.test.ts +456 -66
  180. package/Tests/Types/Monitor/DatabaseMetricCatalog.test.ts +388 -0
  181. package/Tests/Types/Monitor/MonitorStepDatabaseMonitor.test.ts +243 -0
  182. package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +1 -0
  183. package/Tests/Types/Monitor/MonitorType.test.ts +1 -0
  184. package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +16 -7
  185. package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +60 -0
  186. package/Tests/Types/NetworkDevice/NetworkAlertPolicyScope.test.ts +655 -0
  187. package/Tests/Types/NetworkDevice/NetworkDeviceMonitoringMethod.test.ts +115 -26
  188. package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +39 -0
  189. package/Tests/Types/NotificationSetting/NotificationEmailRollupPolicy.test.ts +299 -0
  190. package/Tests/Types/Telemetry/ErrorClass.test.ts +483 -0
  191. package/Tests/UI/Components/BasicRadioButtons.test.tsx +336 -0
  192. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +15 -0
  193. package/Tests/UI/Components/ProgressBar.test.tsx +38 -2
  194. package/Tests/UI/Components/SideMenuItem.test.tsx +226 -4
  195. package/Tests/UI/Components/SideMenuSection.test.tsx +310 -0
  196. package/Tests/UI/Components/SideOverSubmitState.test.tsx +335 -0
  197. package/Tests/UI/Utils/PageScrollLock.test.tsx +377 -0
  198. package/Tests/UI/Utils/PermissionGate.test.ts +78 -0
  199. package/Tests/UI/Utils/SensitiveUrlToken.test.ts +140 -0
  200. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +69 -0
  201. package/Tests/Utils/EnterpriseLicenseSync.test.ts +7 -1
  202. package/Tests/Utils/EnterpriseLicenseUsage.test.ts +433 -2
  203. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +280 -1
  204. package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
  205. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +38 -0
  206. package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +284 -23
  207. package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +177 -0
  208. package/Tests/Utils/NetworkDevice/MonitoringMethodThreadedClassifiers.test.ts +992 -0
  209. package/Tests/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.test.ts +427 -0
  210. package/Tests/Utils/NetworkDevice/ReachabilityStampConsistency.test.ts +185 -0
  211. package/Tests/Utils/NetworkDevice/SnmpCredentialUtil.test.ts +268 -0
  212. package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +55 -5
  213. package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +98 -21
  214. package/Tests/Utils/NetworkDiscovery/DiscoveryImportEligibility.test.ts +98 -20
  215. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +8 -7
  216. package/Tests/Utils/NetworkDiscovery/PingMonitorBuilderForAddress.test.ts +274 -0
  217. package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +230 -51
  218. package/Tests/Utils/NetworkSite/TypeHierarchyUtil.test.ts +209 -0
  219. package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +145 -0
  220. package/Types/AI/ExceptionAIClassification.ts +10 -24
  221. package/Types/Email/EmailTemplateType.ts +2 -0
  222. package/Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary.ts +5 -0
  223. package/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.ts +13 -0
  224. package/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.ts +6 -0
  225. package/Types/Exception/ApiException.ts +10 -0
  226. package/Types/Exception/BadDataException.ts +11 -0
  227. package/Types/Exception/BadRequestException.ts +11 -0
  228. package/Types/Exception/Exception.ts +65 -0
  229. package/Types/Exception/ForbiddenException.ts +10 -0
  230. package/Types/Exception/NotAuthenticatedException.ts +10 -0
  231. package/Types/Exception/NotAuthorizedException.ts +10 -0
  232. package/Types/Exception/NotFoundException.ts +11 -0
  233. package/Types/Exception/PayloadTooLargeException.ts +11 -0
  234. package/Types/Exception/PaymentRequiredException.ts +10 -0
  235. package/Types/Exception/ServiceUnavailableException.ts +10 -0
  236. package/Types/Exception/SsoAuthorizationException.ts +10 -0
  237. package/Types/Exception/TenantNotFoundException.ts +11 -0
  238. package/Types/Exception/TimeoutException.ts +10 -0
  239. package/Types/Exception/TooManyRequestsException.ts +10 -0
  240. package/Types/Exception/UnableToReachServer.ts +10 -0
  241. package/Types/Exception/WebsiteRequestException.ts +10 -0
  242. package/Types/Monitor/CriteriaFilter.ts +60 -2
  243. package/Types/Monitor/DatabaseMetricCatalog.ts +693 -0
  244. package/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.ts +83 -0
  245. package/Types/Monitor/MonitorCriteriaInstance.ts +76 -0
  246. package/Types/Monitor/MonitorMetricType.ts +71 -0
  247. package/Types/Monitor/MonitorStep.ts +76 -0
  248. package/Types/Monitor/MonitorStepDatabaseMonitor.ts +171 -0
  249. package/Types/Monitor/MonitorStepSqlMonitor.ts +2 -20
  250. package/Types/Monitor/MonitorType.ts +47 -1
  251. package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +22 -1
  252. package/Types/Monitor/SqlConnectionConfig.ts +31 -0
  253. package/Types/NetworkDevice/NetworkAlertPolicyScope.ts +343 -0
  254. package/Types/NetworkDevice/NetworkDeviceMonitoringMethod.ts +42 -22
  255. package/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.ts +30 -0
  256. package/Types/NotificationSetting/NotificationEmailRollupCategory.ts +255 -0
  257. package/Types/NotificationSetting/NotificationEmailRollupPolicy.ts +104 -0
  258. package/Types/Permission.ts +90 -0
  259. package/Types/Probe/ProbeMonitorResponse.ts +16 -0
  260. package/Types/Telemetry/ErrorClass.ts +274 -0
  261. package/Types/Telemetry/UnitOfWork.ts +59 -0
  262. package/UI/Components/CommandPalette/CommandPalette.tsx +2 -8
  263. package/UI/Components/EditionLabel/EditionLabel.tsx +4 -0
  264. package/UI/Components/Modal/Modal.tsx +2 -8
  265. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
  266. package/UI/Components/ProgressBar/ProgressBar.tsx +12 -1
  267. package/UI/Components/RadioButtons/BasicRadioButtons.tsx +37 -7
  268. package/UI/Components/SideMenu/SideMenu.tsx +123 -5
  269. package/UI/Components/SideMenu/SideMenuItem.tsx +76 -84
  270. package/UI/Components/SideMenu/SideMenuSection.tsx +55 -23
  271. package/UI/Components/SideOver/SideOver.tsx +21 -20
  272. package/UI/Utils/PageScrollLock.ts +79 -3
  273. package/UI/Utils/PermissionGate.ts +61 -0
  274. package/UI/Utils/SensitiveUrlToken.ts +112 -0
  275. package/UI/Utils/TestLLMProvider.ts +11 -0
  276. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +16 -0
  277. package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +191 -11
  278. package/Utils/Monitor/MonitorMetricType.ts +153 -1
  279. package/Utils/Monitor/NetworkTopologyUtil.ts +23 -3
  280. package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +65 -14
  281. package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +43 -14
  282. package/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.ts +247 -0
  283. package/Utils/NetworkDevice/SnmpCredentialUtil.ts +68 -0
  284. package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +15 -7
  285. package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +52 -17
  286. package/Utils/NetworkDiscovery/DiscoveryImportEligibility.ts +55 -23
  287. package/Utils/NetworkDiscovery/PingMonitorBuilder.ts +115 -13
  288. package/Utils/NetworkSite/SiteStatusRollupUtil.ts +66 -20
  289. package/Utils/NetworkSite/TypeHierarchyUtil.ts +313 -0
  290. package/build/dist/Models/AnalyticsModels/Span.js +14 -0
  291. package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
  292. package/build/dist/Models/DatabaseModels/EnterpriseLicense.js +59 -0
  293. package/build/dist/Models/DatabaseModels/EnterpriseLicense.js.map +1 -1
  294. package/build/dist/Models/DatabaseModels/Index.js +10 -0
  295. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  296. package/build/dist/Models/DatabaseModels/Monitor.js +75 -0
  297. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  298. package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js +713 -0
  299. package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js.map +1 -0
  300. package/build/dist/Models/DatabaseModels/NetworkDevice.js +180 -1
  301. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  302. package/build/dist/Models/DatabaseModels/NetworkSite.js +200 -2
  303. package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
  304. package/build/dist/Models/DatabaseModels/NetworkSiteType.js +102 -3
  305. package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -1
  306. package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js +878 -0
  307. package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js.map +1 -0
  308. package/build/dist/Models/DatabaseModels/TelemetryException.js +123 -0
  309. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  310. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js +363 -0
  311. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js.map +1 -0
  312. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +402 -0
  313. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -0
  314. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js +296 -0
  315. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js.map +1 -0
  316. package/build/dist/Server/API/EnterpriseLicenseAPI.js +273 -60
  317. package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
  318. package/build/dist/Server/API/LlmProviderAPI.js +108 -13
  319. package/build/dist/Server/API/LlmProviderAPI.js.map +1 -1
  320. package/build/dist/Server/EnvironmentConfig.js +12 -0
  321. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  322. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js +24 -0
  323. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js.map +1 -0
  324. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js +16 -0
  325. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js.map +1 -0
  326. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js +111 -0
  327. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js.map +1 -0
  328. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js +77 -0
  329. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js.map +1 -0
  330. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js +50 -0
  331. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js.map +1 -0
  332. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js +83 -0
  333. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js.map +1 -0
  334. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
  335. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  336. package/build/dist/Server/Infrastructure/QueueWorker.js +33 -5
  337. package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
  338. package/build/dist/Server/Middleware/BearerTokenAuthorization.js +12 -0
  339. package/build/dist/Server/Middleware/BearerTokenAuthorization.js.map +1 -1
  340. package/build/dist/Server/Middleware/ProjectAuthorization.js +11 -0
  341. package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
  342. package/build/dist/Server/Middleware/SCIMAuthorization.js +12 -0
  343. package/build/dist/Server/Middleware/SCIMAuthorization.js.map +1 -1
  344. package/build/dist/Server/Middleware/TelemetryIngest.js +11 -0
  345. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  346. package/build/dist/Server/Services/AIBillingService.js +70 -16
  347. package/build/dist/Server/Services/AIBillingService.js.map +1 -1
  348. package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js +167 -0
  349. package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js.map +1 -1
  350. package/build/dist/Server/Services/EnterpriseLicenseService.js +39 -0
  351. package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
  352. package/build/dist/Server/Services/Index.js +10 -0
  353. package/build/dist/Server/Services/Index.js.map +1 -1
  354. package/build/dist/Server/Services/MonitorService.js +119 -21
  355. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  356. package/build/dist/Server/Services/MonitorStatusTimelineService.js +127 -8
  357. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  358. package/build/dist/Server/Services/MonitorTemplateService.js +162 -0
  359. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  360. package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js +1683 -0
  361. package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js.map +1 -0
  362. package/build/dist/Server/Services/NetworkAlertPolicyService.js +732 -0
  363. package/build/dist/Server/Services/NetworkAlertPolicyService.js.map +1 -0
  364. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +10 -9
  365. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  366. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +54 -11
  367. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  368. package/build/dist/Server/Services/NetworkDeviceService.js +841 -70
  369. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  370. package/build/dist/Server/Services/NetworkSiteService.js +1145 -107
  371. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
  372. package/build/dist/Server/Services/NetworkSiteTypeService.js +863 -0
  373. package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -1
  374. package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js +217 -0
  375. package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js.map +1 -0
  376. package/build/dist/Server/Services/NotificationService.js +80 -17
  377. package/build/dist/Server/Services/NotificationService.js.map +1 -1
  378. package/build/dist/Server/Services/ProjectService.js +66 -30
  379. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  380. package/build/dist/Server/Services/StatusPagePrivateUserService.js +92 -2
  381. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  382. package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js +76 -0
  383. package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js.map +1 -0
  384. package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js +77 -0
  385. package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js.map +1 -0
  386. package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js +111 -0
  387. package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js.map +1 -0
  388. package/build/dist/Server/Services/UserNotificationSettingService.js +46 -20
  389. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  390. package/build/dist/Server/Services/UserService.js +90 -0
  391. package/build/dist/Server/Services/UserService.js.map +1 -1
  392. package/build/dist/Server/Types/Database/QueryHelper.js +1 -1
  393. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  394. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +14 -3
  395. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
  396. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +10 -0
  397. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
  398. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +10 -0
  399. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
  400. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +54 -1
  401. package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -1
  402. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +18 -4
  403. package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
  404. package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js +59 -0
  405. package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js.map +1 -0
  406. package/build/dist/Server/Utils/DataSource/HttpFetch.js +2 -1
  407. package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
  408. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +91 -0
  409. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -0
  410. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +691 -0
  411. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -0
  412. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +497 -0
  413. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -0
  414. package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +257 -0
  415. package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -0
  416. package/build/dist/Server/Utils/LLM/LLMService.js +64 -1
  417. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  418. package/build/dist/Server/Utils/LogRedaction.js +8 -0
  419. package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
  420. package/build/dist/Server/Utils/Logger.js +63 -1
  421. package/build/dist/Server/Utils/Logger.js.map +1 -1
  422. package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js +141 -0
  423. package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js.map +1 -0
  424. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
  425. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  426. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +51 -1
  427. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  428. package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js +7 -0
  429. package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js.map +1 -1
  430. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +37 -0
  431. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  432. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +158 -6
  433. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
  434. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
  435. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  436. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +32 -0
  437. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  438. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +330 -21
  439. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
  440. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +55 -10
  441. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
  442. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +178 -49
  443. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
  444. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +119 -29
  445. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  446. package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +30 -17
  447. package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -1
  448. package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js +158 -0
  449. package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js.map +1 -0
  450. package/build/dist/Server/Utils/OutboundUserAgent.js +123 -0
  451. package/build/dist/Server/Utils/OutboundUserAgent.js.map +1 -0
  452. package/build/dist/Server/Utils/StartServer.js +38 -14
  453. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  454. package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +28 -8
  455. package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
  456. package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js +95 -0
  457. package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js.map +1 -0
  458. package/build/dist/Server/Utils/Telemetry/SpanUtil.js +29 -0
  459. package/build/dist/Server/Utils/Telemetry/SpanUtil.js.map +1 -1
  460. package/build/dist/Server/Utils/Telemetry.js +162 -46
  461. package/build/dist/Server/Utils/Telemetry.js.map +1 -1
  462. package/build/dist/Types/AI/ExceptionAIClassification.js +10 -24
  463. package/build/dist/Types/AI/ExceptionAIClassification.js.map +1 -1
  464. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  465. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  466. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js +2 -0
  467. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js.map +1 -0
  468. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js +7 -0
  469. package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js.map +1 -0
  470. package/build/dist/Types/Exception/ApiException.js +9 -0
  471. package/build/dist/Types/Exception/ApiException.js.map +1 -1
  472. package/build/dist/Types/Exception/BadDataException.js +10 -0
  473. package/build/dist/Types/Exception/BadDataException.js.map +1 -1
  474. package/build/dist/Types/Exception/BadRequestException.js +10 -0
  475. package/build/dist/Types/Exception/BadRequestException.js.map +1 -1
  476. package/build/dist/Types/Exception/Exception.js +56 -0
  477. package/build/dist/Types/Exception/Exception.js.map +1 -1
  478. package/build/dist/Types/Exception/ForbiddenException.js +9 -0
  479. package/build/dist/Types/Exception/ForbiddenException.js.map +1 -1
  480. package/build/dist/Types/Exception/NotAuthenticatedException.js +9 -0
  481. package/build/dist/Types/Exception/NotAuthenticatedException.js.map +1 -1
  482. package/build/dist/Types/Exception/NotAuthorizedException.js +9 -0
  483. package/build/dist/Types/Exception/NotAuthorizedException.js.map +1 -1
  484. package/build/dist/Types/Exception/NotFoundException.js +10 -0
  485. package/build/dist/Types/Exception/NotFoundException.js.map +1 -1
  486. package/build/dist/Types/Exception/PayloadTooLargeException.js +10 -0
  487. package/build/dist/Types/Exception/PayloadTooLargeException.js.map +1 -1
  488. package/build/dist/Types/Exception/PaymentRequiredException.js +9 -0
  489. package/build/dist/Types/Exception/PaymentRequiredException.js.map +1 -1
  490. package/build/dist/Types/Exception/ServiceUnavailableException.js +9 -0
  491. package/build/dist/Types/Exception/ServiceUnavailableException.js.map +1 -1
  492. package/build/dist/Types/Exception/SsoAuthorizationException.js +9 -0
  493. package/build/dist/Types/Exception/SsoAuthorizationException.js.map +1 -1
  494. package/build/dist/Types/Exception/TenantNotFoundException.js +10 -0
  495. package/build/dist/Types/Exception/TenantNotFoundException.js.map +1 -1
  496. package/build/dist/Types/Exception/TimeoutException.js +9 -0
  497. package/build/dist/Types/Exception/TimeoutException.js.map +1 -1
  498. package/build/dist/Types/Exception/TooManyRequestsException.js +9 -0
  499. package/build/dist/Types/Exception/TooManyRequestsException.js.map +1 -1
  500. package/build/dist/Types/Exception/UnableToReachServer.js +9 -0
  501. package/build/dist/Types/Exception/UnableToReachServer.js.map +1 -1
  502. package/build/dist/Types/Exception/WebsiteRequestException.js +9 -0
  503. package/build/dist/Types/Exception/WebsiteRequestException.js.map +1 -1
  504. package/build/dist/Types/Monitor/CriteriaFilter.js +45 -2
  505. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  506. package/build/dist/Types/Monitor/DatabaseMetricCatalog.js +594 -0
  507. package/build/dist/Types/Monitor/DatabaseMetricCatalog.js.map +1 -0
  508. package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js +21 -0
  509. package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js.map +1 -0
  510. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +70 -0
  511. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  512. package/build/dist/Types/Monitor/MonitorMetricType.js +61 -0
  513. package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
  514. package/build/dist/Types/Monitor/MonitorStep.js +54 -0
  515. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  516. package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js +122 -0
  517. package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js.map +1 -0
  518. package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -1
  519. package/build/dist/Types/Monitor/MonitorType.js +45 -1
  520. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  521. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +21 -1
  522. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
  523. package/build/dist/Types/Monitor/SqlConnectionConfig.js +2 -0
  524. package/build/dist/Types/Monitor/SqlConnectionConfig.js.map +1 -0
  525. package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js +172 -0
  526. package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js.map +1 -0
  527. package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js +40 -22
  528. package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js.map +1 -1
  529. package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js +26 -0
  530. package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js.map +1 -0
  531. package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js +186 -0
  532. package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js.map +1 -0
  533. package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js +87 -0
  534. package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js.map +1 -0
  535. package/build/dist/Types/Permission.js +80 -0
  536. package/build/dist/Types/Permission.js.map +1 -1
  537. package/build/dist/Types/Telemetry/ErrorClass.js +216 -0
  538. package/build/dist/Types/Telemetry/ErrorClass.js.map +1 -0
  539. package/build/dist/Types/Telemetry/UnitOfWork.js +59 -0
  540. package/build/dist/Types/Telemetry/UnitOfWork.js.map +1 -0
  541. package/build/dist/UI/Components/CommandPalette/CommandPalette.js +2 -7
  542. package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
  543. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +3 -0
  544. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  545. package/build/dist/UI/Components/Modal/Modal.js +2 -7
  546. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  547. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +39 -0
  548. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  549. package/build/dist/UI/Components/ProgressBar/ProgressBar.js +12 -1
  550. package/build/dist/UI/Components/ProgressBar/ProgressBar.js.map +1 -1
  551. package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js +6 -6
  552. package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js.map +1 -1
  553. package/build/dist/UI/Components/SideMenu/SideMenu.js +67 -5
  554. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  555. package/build/dist/UI/Components/SideMenu/SideMenuItem.js +49 -53
  556. package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
  557. package/build/dist/UI/Components/SideMenu/SideMenuSection.js +25 -7
  558. package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
  559. package/build/dist/UI/Components/SideOver/SideOver.js +5 -20
  560. package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
  561. package/build/dist/UI/Utils/PageScrollLock.js +31 -3
  562. package/build/dist/UI/Utils/PageScrollLock.js.map +1 -1
  563. package/build/dist/UI/Utils/PermissionGate.js +42 -1
  564. package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
  565. package/build/dist/UI/Utils/SensitiveUrlToken.js +97 -0
  566. package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -0
  567. package/build/dist/UI/Utils/TestLLMProvider.js +4 -5
  568. package/build/dist/UI/Utils/TestLLMProvider.js.map +1 -1
  569. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +15 -0
  570. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -1
  571. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +111 -9
  572. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
  573. package/build/dist/Utils/Monitor/MonitorMetricType.js +109 -1
  574. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  575. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +8 -3
  576. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  577. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +27 -7
  578. package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -1
  579. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +7 -5
  580. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -1
  581. package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js +180 -0
  582. package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js.map +1 -0
  583. package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js +12 -0
  584. package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js.map +1 -0
  585. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +15 -5
  586. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
  587. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +44 -15
  588. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
  589. package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js +52 -23
  590. package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js.map +1 -1
  591. package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js +85 -13
  592. package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js.map +1 -1
  593. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +30 -15
  594. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
  595. package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js +191 -0
  596. package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js.map +1 -0
  597. package/package.json +2 -2
@@ -0,0 +1,388 @@
1
+ import AggregationType from "../../../Types/BaseDatabase/AggregationType";
2
+ import {
3
+ DatabaseMetricCategory,
4
+ DatabaseMetricDefinition,
5
+ DatabaseMetricGroup,
6
+ getAllDatabaseMetrics,
7
+ getDatabaseMetricById,
8
+ getDatabaseMetricByMetricType,
9
+ getDatabaseMetricCategoryDescription,
10
+ getDatabaseMetricCategoryOrder,
11
+ getDatabaseMetricsByCategory,
12
+ getDatabaseMetricsByGroup,
13
+ getDatabaseMetricsForEngine,
14
+ isDatabaseMetricType,
15
+ } from "../../../Types/Monitor/DatabaseMetricCatalog";
16
+ import MonitorMetricType from "../../../Types/Monitor/MonitorMetricType";
17
+ import SqlDatabaseType, {
18
+ SqlDatabaseTypeUtil,
19
+ } from "../../../Types/Monitor/SqlDatabaseType";
20
+ import { describe, expect, test } from "@jest/globals";
21
+
22
+ /*
23
+ * The catalog is the only place a Database Health metric is declared: title,
24
+ * legend, unit, description, aggregation, display card, collection group and
25
+ * engine support all resolve through it. A row that is malformed here does
26
+ * not throw - it produces a blank chart legend, a chart that is aggregated
27
+ * the wrong way, or a criterion an operator can set but that can never be
28
+ * met. These tests are what turns those into failures.
29
+ */
30
+
31
+ const DATABASE_METRIC_PREFIX: string = "oneuptime.monitor.database.";
32
+
33
+ const allMetrics: Array<DatabaseMetricDefinition> = getAllDatabaseMetrics();
34
+ const orderedCategories: Array<DatabaseMetricCategory> =
35
+ getDatabaseMetricCategoryOrder();
36
+ const supportedEngines: Array<SqlDatabaseType> =
37
+ SqlDatabaseTypeUtil.getSupportedDatabaseTypes();
38
+
39
+ /*
40
+ * Units are not free text: the summary view and the criteria expectation
41
+ * builder pick a formatter from this value, so an invented unit renders as a
42
+ * raw number with a stray suffix.
43
+ */
44
+ const KNOWN_UNITS: Array<string> = ["", "%", "s", "ms", "bytes"];
45
+
46
+ describe("DatabaseMetricCatalog", () => {
47
+ test("returns a non-empty catalog", () => {
48
+ expect(allMetrics.length).toBeGreaterThan(0);
49
+ });
50
+
51
+ test("getAllDatabaseMetrics hands back a copy, not the live array", () => {
52
+ const first: Array<DatabaseMetricDefinition> = getAllDatabaseMetrics();
53
+ first.pop();
54
+ expect(getAllDatabaseMetrics().length).toBe(allMetrics.length);
55
+ });
56
+
57
+ test("every definition has the fields the UI renders", () => {
58
+ for (const metric of allMetrics) {
59
+ expect(metric.id.length).toBeGreaterThan(0);
60
+ expect(metric.friendlyName.length).toBeGreaterThan(0);
61
+ expect(metric.description.length).toBeGreaterThan(0);
62
+ expect(metric.metricType.length).toBeGreaterThan(0);
63
+ }
64
+ });
65
+
66
+ test("ids are stable kebab-case identifiers and are unique", () => {
67
+ const ids: Array<string> = allMetrics.map(
68
+ (metric: DatabaseMetricDefinition) => {
69
+ return metric.id;
70
+ },
71
+ );
72
+
73
+ for (const id of ids) {
74
+ expect(id).toMatch(/^database-[a-z0-9-]+$/);
75
+ }
76
+
77
+ expect(new Set(ids).size).toBe(ids.length);
78
+ });
79
+
80
+ test("metric types are unique", () => {
81
+ const metricTypes: Array<MonitorMetricType> = allMetrics.map(
82
+ (metric: DatabaseMetricDefinition) => {
83
+ return metric.metricType;
84
+ },
85
+ );
86
+
87
+ expect(new Set(metricTypes).size).toBe(metricTypes.length);
88
+ });
89
+
90
+ test("every definition uses a declared aggregation, category and group", () => {
91
+ for (const metric of allMetrics) {
92
+ expect(Object.values(AggregationType)).toContain(
93
+ metric.defaultAggregation,
94
+ );
95
+ expect(Object.values(DatabaseMetricCategory)).toContain(metric.category);
96
+ expect(Object.values(DatabaseMetricGroup)).toContain(metric.group);
97
+ }
98
+ });
99
+
100
+ test("every definition uses a unit the formatters understand", () => {
101
+ for (const metric of allMetrics) {
102
+ expect(KNOWN_UNITS).toContain(metric.unit);
103
+ }
104
+ });
105
+
106
+ /*
107
+ * Averaging a counter inside a time bucket produces a number that means
108
+ * nothing. Max returns the latest sample, which the chart differences into
109
+ * a rate. Counters are identified by their description because the series
110
+ * name is not a reliable signal - "connections.total" is a gauge.
111
+ */
112
+ test("cumulative counters aggregate with Max", () => {
113
+ const counters: Array<DatabaseMetricDefinition> = allMetrics.filter(
114
+ (metric: DatabaseMetricDefinition) => {
115
+ return metric.description.startsWith("Cumulative");
116
+ },
117
+ );
118
+
119
+ // Guards against a wording change quietly emptying the set.
120
+ expect(counters.length).toBeGreaterThanOrEqual(10);
121
+
122
+ for (const counter of counters) {
123
+ expect(counter.defaultAggregation).toBe(AggregationType.Max);
124
+ }
125
+ });
126
+
127
+ /*
128
+ * Open connections is a gauge despite the ".total" suffix its series name
129
+ * inherited. Averaging it is correct; treating it as a counter would chart
130
+ * a meaningless step function.
131
+ */
132
+ test("open connections is a gauge, not a counter", () => {
133
+ const connections: DatabaseMetricDefinition | null =
134
+ getDatabaseMetricByMetricType(MonitorMetricType.DatabaseConnectionsTotal);
135
+
136
+ expect(connections?.metricType.endsWith(".total")).toBe(true);
137
+ expect(connections?.defaultAggregation).toBe(AggregationType.Avg);
138
+ });
139
+
140
+ test("every definition names at least one engine that can produce it", () => {
141
+ for (const metric of allMetrics) {
142
+ expect(metric.engines.length).toBeGreaterThan(0);
143
+
144
+ for (const engine of metric.engines) {
145
+ expect(supportedEngines).toContain(engine);
146
+ }
147
+
148
+ // A duplicated engine would double a metric in the picker.
149
+ expect(new Set(metric.engines).size).toBe(metric.engines.length);
150
+ }
151
+ });
152
+ });
153
+
154
+ /*
155
+ * The enum carries the series names because MonitorMetricUtil writes rows
156
+ * keyed by MonitorMetricType; the catalog carries everything else. A member
157
+ * added to one and not the other fails silently - a series with no title and
158
+ * no description, or a catalog row that never gets written.
159
+ */
160
+ describe("catalog and MonitorMetricType do not drift apart", () => {
161
+ test("every database series in the enum has a catalog definition", () => {
162
+ const undeclared: Array<string> = Object.values(MonitorMetricType).filter(
163
+ (metricType: MonitorMetricType) => {
164
+ return (
165
+ metricType.startsWith(DATABASE_METRIC_PREFIX) &&
166
+ getDatabaseMetricByMetricType(metricType) === null
167
+ );
168
+ },
169
+ );
170
+
171
+ expect(undeclared).toEqual([]);
172
+ });
173
+
174
+ test("every catalog definition points at a database series in the enum", () => {
175
+ const enumValues: Array<string> = Object.values(MonitorMetricType);
176
+
177
+ for (const metric of allMetrics) {
178
+ expect(enumValues).toContain(metric.metricType);
179
+ expect(metric.metricType.startsWith(DATABASE_METRIC_PREFIX)).toBe(true);
180
+ }
181
+ });
182
+
183
+ /*
184
+ * isDatabaseMetricType gates a prelude in front of five metadata switches
185
+ * in MonitorMetricTypeUtil. If a shared probe series ever matched, the
186
+ * catalog would hijack the title and unit of every monitor type that uses
187
+ * it, not just Database Health.
188
+ */
189
+ test("shared probe series are not database metrics", () => {
190
+ for (const metric of allMetrics) {
191
+ expect(isDatabaseMetricType(metric.metricType)).toBe(true);
192
+ }
193
+
194
+ for (const shared of [
195
+ MonitorMetricType.IsOnline,
196
+ MonitorMetricType.ResponseTime,
197
+ MonitorMetricType.CPUUsagePercent,
198
+ MonitorMetricType.ExecutionTime,
199
+ ]) {
200
+ expect(isDatabaseMetricType(shared)).toBe(false);
201
+ }
202
+ });
203
+ });
204
+
205
+ describe("categories", () => {
206
+ test("the display order lists every category exactly once", () => {
207
+ expect(new Set(orderedCategories).size).toBe(orderedCategories.length);
208
+ expect([...orderedCategories].sort()).toEqual(
209
+ Object.values(DatabaseMetricCategory).sort(),
210
+ );
211
+ });
212
+
213
+ test("every category has at least one metric and a description", () => {
214
+ for (const category of orderedCategories) {
215
+ expect(getDatabaseMetricsByCategory(category).length).toBeGreaterThan(0);
216
+ expect(
217
+ getDatabaseMetricCategoryDescription(category).length,
218
+ ).toBeGreaterThan(0);
219
+ }
220
+ });
221
+
222
+ test("getDatabaseMetricsByCategory returns only that category", () => {
223
+ for (const category of orderedCategories) {
224
+ for (const metric of getDatabaseMetricsByCategory(category)) {
225
+ expect(metric.category).toBe(category);
226
+ }
227
+ }
228
+ });
229
+
230
+ test("an unknown category has no description rather than undefined", () => {
231
+ expect(
232
+ getDatabaseMetricCategoryDescription(
233
+ "Not A Category" as DatabaseMetricCategory,
234
+ ),
235
+ ).toBe("");
236
+ });
237
+ });
238
+
239
+ /*
240
+ * Groups are the unit of graceful degradation: the probe runs one query per
241
+ * group and reports a group it could not read. A group with no metrics would
242
+ * be a degradation notice an operator can do nothing with.
243
+ */
244
+ describe("collection groups", () => {
245
+ test("every declared group has at least one metric", () => {
246
+ for (const group of Object.values(DatabaseMetricGroup)) {
247
+ expect(getDatabaseMetricsByGroup(group).length).toBeGreaterThan(0);
248
+ }
249
+ });
250
+
251
+ test("getDatabaseMetricsByGroup returns only that group", () => {
252
+ for (const group of Object.values(DatabaseMetricGroup)) {
253
+ for (const metric of getDatabaseMetricsByGroup(group)) {
254
+ expect(metric.group).toBe(group);
255
+ }
256
+ }
257
+ });
258
+
259
+ test("grouping partitions the catalog", () => {
260
+ const grouped: number = Object.values(DatabaseMetricGroup).reduce(
261
+ (total: number, group: DatabaseMetricGroup) => {
262
+ return total + getDatabaseMetricsByGroup(group).length;
263
+ },
264
+ 0,
265
+ );
266
+
267
+ expect(grouped).toBe(allMetrics.length);
268
+ });
269
+ });
270
+
271
+ describe("lookups", () => {
272
+ test("getDatabaseMetricByMetricType round-trips every definition", () => {
273
+ for (const metric of allMetrics) {
274
+ expect(getDatabaseMetricByMetricType(metric.metricType)).toEqual(metric);
275
+ }
276
+ });
277
+
278
+ test("getDatabaseMetricById round-trips every definition", () => {
279
+ for (const metric of allMetrics) {
280
+ expect(getDatabaseMetricById(metric.id)).toEqual(metric);
281
+ }
282
+ });
283
+
284
+ /*
285
+ * Null rather than undefined: DatabaseMonitorCriteria returns early on a
286
+ * null definition, which is how a criterion naming a metric that no longer
287
+ * exists stops evaluating instead of throwing on every check.
288
+ */
289
+ test("unknown keys resolve to null", () => {
290
+ expect(getDatabaseMetricById("does-not-exist")).toBeNull();
291
+ expect(getDatabaseMetricById("")).toBeNull();
292
+ expect(
293
+ getDatabaseMetricByMetricType("not.a.series" as MonitorMetricType),
294
+ ).toBeNull();
295
+ });
296
+ });
297
+
298
+ /*
299
+ * Engine support is verified against live servers (PostgreSQL 15.18, MySQL
300
+ * 8.4.11, SQL Server 2022), not inferred from documentation. The picker
301
+ * builds from these lists, so a wrong entry offers an operator a threshold on
302
+ * a series their engine will never write - a criterion that sits permanently
303
+ * unmet and looks like a working alert.
304
+ */
305
+ describe("engine support", () => {
306
+ test("every supported engine can produce some metric", () => {
307
+ for (const engine of supportedEngines) {
308
+ const metrics: Array<DatabaseMetricDefinition> =
309
+ getDatabaseMetricsForEngine(engine);
310
+
311
+ expect(metrics.length).toBeGreaterThan(0);
312
+
313
+ for (const metric of metrics) {
314
+ expect(metric.engines).toContain(engine);
315
+ }
316
+ }
317
+ });
318
+
319
+ test("no metric is stranded with no engine that can write it", () => {
320
+ const reachable: Set<MonitorMetricType> = new Set<MonitorMetricType>();
321
+
322
+ for (const engine of supportedEngines) {
323
+ for (const metric of getDatabaseMetricsForEngine(engine)) {
324
+ reachable.add(metric.metricType);
325
+ }
326
+ }
327
+
328
+ expect(reachable.size).toBe(allMetrics.length);
329
+ });
330
+
331
+ test("PostgreSQL-only maintenance metrics are absent from MySQL", () => {
332
+ const mysql: Array<MonitorMetricType> = getDatabaseMetricsForEngine(
333
+ SqlDatabaseType.MySQL,
334
+ ).map((metric: DatabaseMetricDefinition) => {
335
+ return metric.metricType;
336
+ });
337
+
338
+ expect(mysql).not.toContain(
339
+ MonitorMetricType.DatabaseTransactionIdUsedPercent,
340
+ );
341
+ expect(mysql).not.toContain(MonitorMetricType.DatabaseDeadTuples);
342
+ expect(mysql).toContain(MonitorMetricType.DatabaseTempDiskTablesTotal);
343
+ });
344
+
345
+ // Stock MySQL exposes no deadlock counter at all.
346
+ test("deadlocks are PostgreSQL and SQL Server only", () => {
347
+ const deadlocks: DatabaseMetricDefinition | null =
348
+ getDatabaseMetricByMetricType(MonitorMetricType.DatabaseDeadlocksTotal);
349
+
350
+ expect(deadlocks?.engines).toEqual([
351
+ SqlDatabaseType.PostgreSQL,
352
+ SqlDatabaseType.MicrosoftSqlServer,
353
+ ]);
354
+ });
355
+
356
+ /*
357
+ * SQL Server's `user connections` setting defaults to 0, meaning
358
+ * unlimited, so a percentage of the ceiling has no denominator there.
359
+ */
360
+ test("the connection ceiling and its percentage skip SQL Server", () => {
361
+ for (const metricType of [
362
+ MonitorMetricType.DatabaseConnectionsMax,
363
+ MonitorMetricType.DatabaseConnectionsUsedPercent,
364
+ ]) {
365
+ expect(getDatabaseMetricByMetricType(metricType)?.engines).not.toContain(
366
+ SqlDatabaseType.MicrosoftSqlServer,
367
+ );
368
+ }
369
+ });
370
+
371
+ /*
372
+ * The degradation counter is produced by the collector, not read from the
373
+ * engine, so it must survive on every engine - it is the series an
374
+ * operator alerts on to notice they have lost visibility.
375
+ */
376
+ test("the failed-group counter is available on every engine", () => {
377
+ const failed: DatabaseMetricDefinition | null =
378
+ getDatabaseMetricByMetricType(
379
+ MonitorMetricType.DatabaseMetricGroupsFailed,
380
+ );
381
+
382
+ expect(failed).not.toBeNull();
383
+
384
+ for (const engine of supportedEngines) {
385
+ expect(failed?.engines).toContain(engine);
386
+ }
387
+ });
388
+ });
@@ -0,0 +1,243 @@
1
+ import { DatabaseMetricGroup } from "../../../Types/Monitor/DatabaseMetricCatalog";
2
+ import { JSONObject } from "../../../Types/JSON";
3
+ import MonitorStepDatabaseMonitor, {
4
+ DEFAULT_DATABASE_CONNECTION_TIMEOUT_IN_MS,
5
+ DEFAULT_DATABASE_METRIC_GROUPS,
6
+ DEFAULT_DATABASE_STATEMENT_TIMEOUT_IN_MS,
7
+ MonitorStepDatabaseMonitorUtil,
8
+ } from "../../../Types/Monitor/MonitorStepDatabaseMonitor";
9
+ import {
10
+ MAX_SQL_CONNECTION_TIMEOUT_IN_MS,
11
+ MAX_SQL_STATEMENT_TIMEOUT_IN_MS,
12
+ } from "../../../Types/Monitor/MonitorStepSqlMonitor";
13
+ import SqlDatabaseType from "../../../Types/Monitor/SqlDatabaseType";
14
+ import { describe, expect, test } from "@jest/globals";
15
+
16
+ describe("MonitorStepDatabaseMonitorUtil", () => {
17
+ describe("getDefault", () => {
18
+ test("starts on PostgreSQL with its own port and validated TLS", () => {
19
+ const config: MonitorStepDatabaseMonitor =
20
+ MonitorStepDatabaseMonitorUtil.getDefault();
21
+
22
+ expect(config.databaseType).toBe(SqlDatabaseType.PostgreSQL);
23
+ expect(config.port).toBe(5432);
24
+ // Opting out of chain validation must be a decision, never a default.
25
+ expect(config.rejectUnauthorizedSsl).toBe(true);
26
+ expect(config.useWindowsIntegratedAuthentication).toBe(false);
27
+ });
28
+
29
+ test("collects every metric group by default", () => {
30
+ /*
31
+ * Safe to default on only because a group the login cannot read
32
+ * reports itself unavailable instead of failing the check. If that
33
+ * contract ever changes, this default has to change with it.
34
+ */
35
+ const config: MonitorStepDatabaseMonitor =
36
+ MonitorStepDatabaseMonitorUtil.getDefault();
37
+
38
+ expect(config.enabledMetricGroups).toEqual(
39
+ DEFAULT_DATABASE_METRIC_GROUPS,
40
+ );
41
+ expect(config.enabledMetricGroups).toHaveLength(
42
+ Object.values(DatabaseMetricGroup).length,
43
+ );
44
+ });
45
+
46
+ test("returns a fresh group array each time", () => {
47
+ // A shared array would let one monitor's edit reconfigure every other.
48
+ const first: MonitorStepDatabaseMonitor =
49
+ MonitorStepDatabaseMonitorUtil.getDefault();
50
+ const second: MonitorStepDatabaseMonitor =
51
+ MonitorStepDatabaseMonitorUtil.getDefault();
52
+
53
+ first.enabledMetricGroups.pop();
54
+
55
+ expect(second.enabledMetricGroups).toEqual(
56
+ DEFAULT_DATABASE_METRIC_GROUPS,
57
+ );
58
+ expect(DEFAULT_DATABASE_METRIC_GROUPS).toHaveLength(
59
+ Object.values(DatabaseMetricGroup).length,
60
+ );
61
+ });
62
+
63
+ test("defaults to a tighter statement timeout than a user query would get", () => {
64
+ /*
65
+ * Health queries are introspection and should return in milliseconds.
66
+ * If pg_stat_activity takes ten seconds the useful signal is "this
67
+ * server is in trouble", not a longer wait.
68
+ */
69
+ const config: MonitorStepDatabaseMonitor =
70
+ MonitorStepDatabaseMonitorUtil.getDefault();
71
+
72
+ expect(config.statementTimeoutInMs).toBe(
73
+ DEFAULT_DATABASE_STATEMENT_TIMEOUT_IN_MS,
74
+ );
75
+ expect(config.statementTimeoutInMs).toBeLessThan(
76
+ MAX_SQL_STATEMENT_TIMEOUT_IN_MS,
77
+ );
78
+ expect(config.connectionTimeoutInMs).toBe(
79
+ DEFAULT_DATABASE_CONNECTION_TIMEOUT_IN_MS,
80
+ );
81
+ });
82
+ });
83
+
84
+ describe("sanitizeMetricGroups", () => {
85
+ test("keeps recognized groups and drops anything else", () => {
86
+ expect(
87
+ MonitorStepDatabaseMonitorUtil.sanitizeMetricGroups([
88
+ DatabaseMetricGroup.Locks,
89
+ "Telepathy",
90
+ DatabaseMetricGroup.Storage,
91
+ 42,
92
+ null,
93
+ ]),
94
+ // Canonical order, not input order: Locks precedes Storage.
95
+ ).toEqual([DatabaseMetricGroup.Locks, DatabaseMetricGroup.Storage]);
96
+ });
97
+
98
+ test("normalizes to the canonical order regardless of input order", () => {
99
+ // Keeps the config form and the collector iterating in one order.
100
+ expect(
101
+ MonitorStepDatabaseMonitorUtil.sanitizeMetricGroups([
102
+ DatabaseMetricGroup.Maintenance,
103
+ DatabaseMetricGroup.Connections,
104
+ ]),
105
+ ).toEqual([
106
+ DatabaseMetricGroup.Connections,
107
+ DatabaseMetricGroup.Maintenance,
108
+ ]);
109
+ });
110
+
111
+ test("de-duplicates repeated groups", () => {
112
+ expect(
113
+ MonitorStepDatabaseMonitorUtil.sanitizeMetricGroups([
114
+ DatabaseMetricGroup.Locks,
115
+ DatabaseMetricGroup.Locks,
116
+ ]),
117
+ ).toEqual([DatabaseMetricGroup.Locks]);
118
+ });
119
+
120
+ test.each([
121
+ ["an empty list", []],
122
+ ["a list of only unknown values", ["nope", "also-nope"]],
123
+ ["a non-array", "Locks"],
124
+ ["undefined", undefined],
125
+ ["null", null],
126
+ ])("falls back to every group for %s", (_label: string, input: unknown) => {
127
+ /*
128
+ * A monitor that silently collects nothing is worse than one that
129
+ * collects what it can, so an unusable list means "everything"
130
+ * rather than "nothing".
131
+ */
132
+ expect(
133
+ MonitorStepDatabaseMonitorUtil.sanitizeMetricGroups(input),
134
+ ).toEqual(DEFAULT_DATABASE_METRIC_GROUPS);
135
+ });
136
+ });
137
+
138
+ describe("fromJSON", () => {
139
+ test("round-trips a full configuration through toJSON", () => {
140
+ const config: MonitorStepDatabaseMonitor = {
141
+ ...MonitorStepDatabaseMonitorUtil.getDefault(),
142
+ databaseType: SqlDatabaseType.MicrosoftSqlServer,
143
+ host: "sql.internal",
144
+ port: 1433,
145
+ databaseName: "orders",
146
+ username: "monitoring",
147
+ password: "{{monitorSecrets.dbPassword}}",
148
+ useSsl: true,
149
+ enabledMetricGroups: [
150
+ DatabaseMetricGroup.Connections,
151
+ DatabaseMetricGroup.Replication,
152
+ ],
153
+ };
154
+
155
+ const restored: MonitorStepDatabaseMonitor =
156
+ MonitorStepDatabaseMonitorUtil.fromJSON(
157
+ MonitorStepDatabaseMonitorUtil.toJSON(config),
158
+ );
159
+
160
+ expect(restored).toEqual(config);
161
+ });
162
+
163
+ test("preserves a monitor-secret reference verbatim", () => {
164
+ /*
165
+ * The server resolves {{monitorSecrets.name}} on the way to the probe.
166
+ * Any mangling here turns into an authentication failure that looks
167
+ * like a wrong password.
168
+ */
169
+ const restored: MonitorStepDatabaseMonitor =
170
+ MonitorStepDatabaseMonitorUtil.fromJSON({
171
+ host: "db.internal",
172
+ password: "{{monitorSecrets.dbPassword}}",
173
+ } as JSONObject);
174
+
175
+ expect(restored.password).toBe("{{monitorSecrets.dbPassword}}");
176
+ });
177
+
178
+ test("clamps timeouts to the shared SQL ceilings", () => {
179
+ const restored: MonitorStepDatabaseMonitor =
180
+ MonitorStepDatabaseMonitorUtil.fromJSON({
181
+ statementTimeoutInMs: 999999,
182
+ connectionTimeoutInMs: 999999,
183
+ } as JSONObject);
184
+
185
+ expect(restored.statementTimeoutInMs).toBe(
186
+ MAX_SQL_STATEMENT_TIMEOUT_IN_MS,
187
+ );
188
+ expect(restored.connectionTimeoutInMs).toBe(
189
+ MAX_SQL_CONNECTION_TIMEOUT_IN_MS,
190
+ );
191
+ });
192
+
193
+ test("falls back to safe values for an empty payload", () => {
194
+ const restored: MonitorStepDatabaseMonitor =
195
+ MonitorStepDatabaseMonitorUtil.fromJSON({});
196
+
197
+ expect(restored.databaseType).toBe(SqlDatabaseType.PostgreSQL);
198
+ expect(restored.rejectUnauthorizedSsl).toBe(true);
199
+ expect(restored.enabledMetricGroups).toEqual(
200
+ DEFAULT_DATABASE_METRIC_GROUPS,
201
+ );
202
+ });
203
+
204
+ test("treats an explicitly false rejectUnauthorizedSsl as a real choice", () => {
205
+ /*
206
+ * Distinguishing "absent" from "false" matters: absent must default to
207
+ * validating the chain, but a user who turned validation off for a
208
+ * self-signed certificate must keep that setting.
209
+ */
210
+ expect(
211
+ MonitorStepDatabaseMonitorUtil.fromJSON({
212
+ rejectUnauthorizedSsl: false,
213
+ } as JSONObject).rejectUnauthorizedSsl,
214
+ ).toBe(false);
215
+
216
+ expect(
217
+ MonitorStepDatabaseMonitorUtil.fromJSON({}).rejectUnauthorizedSsl,
218
+ ).toBe(true);
219
+ });
220
+
221
+ test("normalizes an unusable group list rather than trusting it", () => {
222
+ expect(
223
+ MonitorStepDatabaseMonitorUtil.fromJSON({
224
+ enabledMetricGroups: ["Locks", "not-a-group"],
225
+ } as JSONObject).enabledMetricGroups,
226
+ ).toEqual([DatabaseMetricGroup.Locks]);
227
+ });
228
+ });
229
+
230
+ describe("toJSON", () => {
231
+ test("copies the group array instead of aliasing it", () => {
232
+ const config: MonitorStepDatabaseMonitor =
233
+ MonitorStepDatabaseMonitorUtil.getDefault();
234
+
235
+ const json: JSONObject = MonitorStepDatabaseMonitorUtil.toJSON(config);
236
+ (json["enabledMetricGroups"] as Array<DatabaseMetricGroup>).pop();
237
+
238
+ expect(config.enabledMetricGroups).toEqual(
239
+ DEFAULT_DATABASE_METRIC_GROUPS,
240
+ );
241
+ });
242
+ });
243
+ });
@@ -113,6 +113,7 @@ describe("MonitorStep.getDefaultMonitorStep telemetry sub-config seeding", () =>
113
113
  MonitorType.SyntheticMonitor,
114
114
  MonitorType.CustomJavaScriptCode,
115
115
  MonitorType.SQLQuery,
116
+ MonitorType.Database,
116
117
  MonitorType.Manual,
117
118
  MonitorType.Profiles,
118
119
  MonitorType.Kubernetes,
@@ -124,6 +124,7 @@ describe("MonitorTypeHelper", () => {
124
124
  MonitorType.DNSSEC,
125
125
  MonitorType.Domain,
126
126
  MonitorType.ExternalStatusPage,
127
+ MonitorType.Database,
127
128
  ])("returns true for %s", (monitorType: MonitorType) => {
128
129
  expect(MonitorTypeHelper.isProbableMonitor(monitorType)).toBe(true);
129
130
  });
@@ -12,7 +12,7 @@ import {
12
12
  } from "../../../UI/Components/CardSelect/CardSelect";
13
13
 
14
14
  /*
15
- * The monitor type picker offers 29 types. Whether someone finds the right one
15
+ * The monitor type picker offers 31 types. Whether someone finds the right one
16
16
  * comes down to whether the words they already use - "k8s", "postgres",
17
17
  * "heartbeat", "tls" - are attached to the card, because none of them appear
18
18
  * in its title or its copy. These are the searches this catalog promises to
@@ -192,8 +192,8 @@ describe("MonitorType keywords", () => {
192
192
  describe("card copy is scannable", () => {
193
193
  /*
194
194
  * Every description used to open with "This monitor type lets you
195
- * monitor", so the first five words of all 29 cards were identical and
196
- * carried nothing. Reading the grid meant skipping them 29 times.
195
+ * monitor", so the first five words of every card were identical and
196
+ * carried nothing. Reading the grid meant skipping them on every card.
197
197
  */
198
198
  test("no description opens with the old boilerplate", () => {
199
199
  for (const props of allProps) {
@@ -230,10 +230,19 @@ describe("MonitorType keywords", () => {
230
230
  ["k8s", MonitorType.Kubernetes],
231
231
  ["kubernetes", MonitorType.Kubernetes],
232
232
  ["eks", MonitorType.Kubernetes],
233
- ["postgres", MonitorType.SQLQuery],
234
- ["postgresql", MonitorType.SQLQuery],
235
- ["mysql", MonitorType.SQLQuery],
236
- ["database", MonitorType.SQLQuery],
233
+ /*
234
+ * Both database cards answer to the engine names. Someone typing an
235
+ * engine into a monitoring product wants its health series, not the
236
+ * escape hatch for a query they have to write themselves - so the
237
+ * engine words rank Database Health first, and SQL Query keeps the
238
+ * searches that describe what only it does.
239
+ */
240
+ ["postgres", MonitorType.Database],
241
+ ["postgresql", MonitorType.Database],
242
+ ["mysql", MonitorType.Database],
243
+ ["database", MonitorType.Database],
244
+ ["query", MonitorType.SQLQuery],
245
+ ["row count", MonitorType.SQLQuery],
237
246
  ["heartbeat", MonitorType.IncomingRequest],
238
247
  ["cron", MonitorType.IncomingRequest],
239
248
  ["webhook", MonitorType.IncomingRequest],