@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
@@ -1,16 +1,24 @@
1
1
  import { afterEach, beforeEach, describe, expect, test } from "@jest/globals";
2
- import NetworkDeviceWalkUtil from "../../../../Server/Utils/Monitor/NetworkDeviceWalkUtil";
2
+ import NetworkDeviceWalkUtil, {
3
+ NetworkDevicePingResult,
4
+ } from "../../../../Server/Utils/Monitor/NetworkDeviceWalkUtil";
5
+ import { NetworkDevicePollMode } from "../../../../Server/Utils/Monitor/NetworkDeviceHydrationUtil";
3
6
  import MonitorResourceUtil from "../../../../Server/Utils/Monitor/MonitorResource";
4
7
  import NetworkDeviceMetricUtil from "../../../../Server/Utils/Monitor/NetworkDeviceMetricUtil";
5
8
  import NetworkInventoryUtil from "../../../../Server/Utils/Monitor/NetworkInventoryUtil";
6
9
  import SnmpInterfaceRateUtil from "../../../../Server/Utils/Monitor/SnmpInterfaceRateUtil";
7
10
  import MonitorService from "../../../../Server/Services/MonitorService";
8
11
  import NetworkDeviceService from "../../../../Server/Services/NetworkDeviceService";
12
+ import FindBy from "../../../../Server/Types/Database/FindBy";
13
+ import QueryHelper from "../../../../Server/Types/Database/QueryHelper";
9
14
  import Monitor from "../../../../Models/DatabaseModels/Monitor";
10
15
  import NetworkDevice from "../../../../Models/DatabaseModels/NetworkDevice";
16
+ import SortOrder from "../../../../Types/BaseDatabase/SortOrder";
17
+ import LIMIT_MAX from "../../../../Types/Database/LimitMax";
11
18
  import MonitorStep from "../../../../Types/Monitor/MonitorStep";
12
19
  import MonitorSteps from "../../../../Types/Monitor/MonitorSteps";
13
20
  import MonitorType from "../../../../Types/Monitor/MonitorType";
21
+ import PingMonitorResponse from "../../../../Types/Monitor/PingMonitor/PingMonitorResponse";
14
22
  import SnmpMonitorResponse from "../../../../Types/Monitor/SnmpMonitor/SnmpMonitorResponse";
15
23
  import ProbeMonitorResponse from "../../../../Types/Probe/ProbeMonitorResponse";
16
24
  import { JSONObject } from "../../../../Types/JSON";
@@ -19,15 +27,17 @@ import OneUptimeDate from "../../../../Types/Date";
19
27
 
20
28
  /*
21
29
  * NetworkDeviceWalkUtil is the server half of device-owned polling: the
22
- * device's assigned probe reports each SNMP walk here, and this util
30
+ * device's assigned probe reports each poll here - a ping always, and an
31
+ * SNMP walk as well when the device has credentials - and this util
23
32
  * computes interface rates against the previous walk, persists the new
24
33
  * delta baseline, syncs inventory, emits device-scoped metrics, and fans
25
- * the walk out to every Network Device monitor referencing the device.
34
+ * the poll out to every Network Device monitor referencing the device.
26
35
  *
27
36
  * These tests mock every collaborator and pin the orchestration contract:
28
37
  * the probe-scoping security guard, what flows into each collaborator (and
29
- * in what order), the lastWalkLog persistence gating, the fan-out
30
- * filtering, the synthesized ProbeMonitorResponse shape, and the
38
+ * in what order), the lastWalkLog persistence gating, the fan-out lookup
39
+ * (indexed column UNION legacy step JSON, deduped), the synthesized
40
+ * ProbeMonitorResponse shape under every ping/walk combination, and the
31
41
  * fault-isolation guarantees (metrics/criteria failures never break the
32
42
  * pipeline).
33
43
  */
@@ -65,9 +75,25 @@ function buildDevice(): NetworkDevice {
65
75
  return device;
66
76
  }
67
77
 
78
+ /*
79
+ * The fan-out lookup issues two queries on the same column and the mock
80
+ * has to tell them apart: QueryHelper.any / isNull are replaced with
81
+ * sentinels so the query object says which it is.
82
+ */
83
+ type MonitorLinkQuery = { __in?: Array<string>; __isNull?: true };
84
+
85
+ function linkQueryOf(findBy: FindBy<Monitor>): MonitorLinkQuery | undefined {
86
+ return (findBy.query as unknown as JSONObject)[
87
+ "autoProvisionedNetworkDeviceId"
88
+ ] as MonitorLinkQuery | undefined;
89
+ }
90
+
68
91
  function mockPipeline(options?: {
69
92
  device?: NetworkDevice | null | undefined;
93
+ // Hand-made monitors: linked to the device only through their step JSON.
70
94
  monitors?: Array<Monitor> | undefined;
95
+ // Provisioned monitors: linked through autoProvisionedNetworkDeviceId.
96
+ indexedMonitors?: Array<Monitor> | undefined;
71
97
  }): void {
72
98
  deviceFindSpy = jest
73
99
  .spyOn(NetworkDeviceService, "findOneBy")
@@ -83,9 +109,35 @@ function mockPipeline(options?: {
83
109
  deviceUpdateSpy = jest
84
110
  .spyOn(NetworkDeviceService, "updateColumnsByIdWithoutHooks")
85
111
  .mockResolvedValue(undefined);
112
+ jest.spyOn(QueryHelper, "any").mockImplementation(((
113
+ values: Array<string | ObjectID | number>,
114
+ ): MonitorLinkQuery => {
115
+ return {
116
+ __in: values.map((value: string | ObjectID | number) => {
117
+ return value.toString();
118
+ }),
119
+ };
120
+ }) as never);
121
+ jest
122
+ .spyOn(QueryHelper, "isNull")
123
+ .mockReturnValue({ __isNull: true } as never);
86
124
  monitorFindSpy = jest
87
125
  .spyOn(MonitorService, "findBy")
88
- .mockResolvedValue(options?.monitors || []);
126
+ .mockImplementation(
127
+ async (findBy: FindBy<Monitor>): Promise<Array<Monitor>> => {
128
+ const link: MonitorLinkQuery | undefined = linkQueryOf(findBy);
129
+
130
+ if (link?.__isNull) {
131
+ return options?.monitors || [];
132
+ }
133
+
134
+ if (link?.__in) {
135
+ return options?.indexedMonitors || [];
136
+ }
137
+
138
+ return [];
139
+ },
140
+ );
89
141
  monitorResourceSpy = jest
90
142
  .spyOn(MonitorResourceUtil, "monitorResource")
91
143
  .mockResolvedValue(undefined as never);
@@ -102,6 +154,17 @@ function mockPipeline(options?: {
102
154
  });
103
155
  }
104
156
 
157
+ function monitorFindCalls(kind: "indexed" | "legacy"): Array<FindBy<Monitor>> {
158
+ return monitorFindSpy.mock.calls
159
+ .map((call: Array<unknown>) => {
160
+ return call[0] as FindBy<Monitor>;
161
+ })
162
+ .filter((findBy: FindBy<Monitor>) => {
163
+ const link: MonitorLinkQuery | undefined = linkQueryOf(findBy);
164
+ return kind === "legacy" ? Boolean(link?.__isNull) : Boolean(link?.__in);
165
+ });
166
+ }
167
+
105
168
  function buildSnmpResponse(
106
169
  overrides?: Partial<SnmpMonitorResponse>,
107
170
  ): SnmpMonitorResponse {
@@ -125,6 +188,18 @@ function buildSnmpResponse(
125
188
  };
126
189
  }
127
190
 
191
+ const OK_PING: NetworkDevicePingResult = {
192
+ isOnline: true,
193
+ avgRttMs: 2.5,
194
+ packetLossPercent: 0,
195
+ };
196
+
197
+ const FAILED_PING: NetworkDevicePingResult = {
198
+ isOnline: false,
199
+ packetLossPercent: 100,
200
+ failureCause: "Request timed out",
201
+ };
202
+
128
203
  function buildStep(networkDeviceId: string | undefined): MonitorStep {
129
204
  const step: MonitorStep = new MonitorStep();
130
205
  step.data = {
@@ -165,15 +240,32 @@ function buildMonitor(options: {
165
240
  return monitor;
166
241
  }
167
242
 
168
- async function runWalk(snmpResponse: SnmpMonitorResponse): Promise<void> {
243
+ async function runPoll(input: {
244
+ snmpResponse?: SnmpMonitorResponse | undefined;
245
+ isOnline?: boolean | undefined;
246
+ pollMode?: NetworkDevicePollMode | undefined;
247
+ pingResponse?: NetworkDevicePingResult | undefined;
248
+ }): Promise<void> {
169
249
  await NetworkDeviceWalkUtil.processWalkResult({
170
250
  probeId: PROBE_ID,
171
251
  networkDeviceId: new ObjectID(DEVICE_ID),
172
- snmpResponse: snmpResponse,
252
+ ...input,
173
253
  monitoredAt: MONITORED_AT,
174
254
  });
175
255
  }
176
256
 
257
+ /*
258
+ * What a probe that predates ping-first polling reports: a walk and nothing
259
+ * else - no device verdict, no mode, no ping.
260
+ */
261
+ async function runWalk(snmpResponse: SnmpMonitorResponse): Promise<void> {
262
+ await runPoll({ snmpResponse: snmpResponse });
263
+ }
264
+
265
+ function synthesized(index: number = 0): ProbeMonitorResponse {
266
+ return monitorResourceSpy.mock.calls[index]![0] as ProbeMonitorResponse;
267
+ }
268
+
177
269
  beforeEach(() => {
178
270
  jest.spyOn(OneUptimeDate, "getCurrentDate").mockReturnValue(NOW);
179
271
  });
@@ -266,7 +358,7 @@ describe("NetworkDeviceWalkUtil.processWalkResult — happy path", () => {
266
358
  expect(lastWalkLog["monitoredAt"]).toEqual(NOW);
267
359
  });
268
360
 
269
- test("inventory is synced with the device's own projectId/deviceId and the in-flight response", async () => {
361
+ test("inventory is synced with the device's own projectId/deviceId, the in-flight response and the mode", async () => {
270
362
  mockPipeline();
271
363
  const snmpResponse: SnmpMonitorResponse = buildSnmpResponse();
272
364
 
@@ -280,6 +372,8 @@ describe("NetworkDeviceWalkUtil.processWalkResult — happy path", () => {
280
372
  expect((inventoryArgs["deviceId"] as ObjectID).toString()).toBe(DEVICE_ID);
281
373
  expect(inventoryArgs["snmpResponse"]).toBe(snmpResponse);
282
374
  expect(inventoryArgs["isOnline"]).toBe(true);
375
+ // An old probe only ever walked: its mode is snmp.
376
+ expect(inventoryArgs["pollMode"]).toBe("snmp");
283
377
  });
284
378
 
285
379
  test("device-scoped metrics are emitted with the device and probe identity", async () => {
@@ -303,6 +397,7 @@ describe("NetworkDeviceWalkUtil.processWalkResult — happy path", () => {
303
397
  expect(metricArgs["snmpResponse"]).toBe(snmpResponse);
304
398
  expect(metricArgs["responseTimeInMs"]).toBe(42);
305
399
  expect(metricArgs["isOnline"]).toBe(true);
400
+ expect(metricArgs["pingResponse"]).toBeUndefined();
306
401
  });
307
402
  });
308
403
 
@@ -353,6 +448,253 @@ describe("NetworkDeviceWalkUtil.processWalkResult — failed poll", () => {
353
448
  });
354
449
  });
355
450
 
451
+ /*
452
+ * Ping-first polling. A ping-first probe reports the device verdict (ping OR
453
+ * walk), the mode, the ping, and the walk only when one ran. What reaches
454
+ * inventory, metrics and the monitors under each combination is the whole
455
+ * contract of "a device without credentials still has a status".
456
+ */
457
+ describe("NetworkDeviceWalkUtil.processWalkResult — ping-first polling", () => {
458
+ const EXPECTED_OK_PING: PingMonitorResponse = {
459
+ packetsSent: 0,
460
+ packetsReceived: 0,
461
+ packetLossPercent: 0,
462
+ avgRoundTripTimeInMs: 2.5,
463
+ };
464
+
465
+ test("a reachable ping-only poll: no rates, no baseline, inventory and metrics in ping mode with no walk, and the ping carried", async () => {
466
+ mockPipeline();
467
+
468
+ await runPoll({ isOnline: true, pollMode: "ping", pingResponse: OK_PING });
469
+
470
+ expect(rateSpy).not.toHaveBeenCalled();
471
+ expect(deviceUpdateSpy).not.toHaveBeenCalled();
472
+
473
+ const inventoryArgs: JSONObject = inventorySpy.mock.calls[0][0];
474
+ expect(inventoryArgs["snmpResponse"]).toBeUndefined();
475
+ expect(inventoryArgs["isOnline"]).toBe(true);
476
+ expect(inventoryArgs["pollMode"]).toBe("ping");
477
+
478
+ const metricArgs: JSONObject = metricsSpy.mock.calls[0][0];
479
+ expect(metricArgs["snmpResponse"]).toBeUndefined();
480
+ // Walk time only: a ping-only poll writes no response-time point.
481
+ expect(metricArgs["responseTimeInMs"]).toBeUndefined();
482
+ expect(metricArgs["isOnline"]).toBe(true);
483
+ expect(metricArgs["pingResponse"]).toEqual(EXPECTED_OK_PING);
484
+ });
485
+
486
+ test("the monitor response on a ping-only poll carries NO snmpResponse - never a synthesized failure", async () => {
487
+ const step: MonitorStep = buildStep(DEVICE_ID);
488
+ mockPipeline({ monitors: [buildMonitor({ steps: [step] })] });
489
+
490
+ await runPoll({ isOnline: true, pollMode: "ping", pingResponse: OK_PING });
491
+
492
+ expect(monitorResourceSpy).toHaveBeenCalledTimes(1);
493
+ const response: ProbeMonitorResponse = synthesized();
494
+
495
+ expect(response.snmpResponse).toBeUndefined();
496
+ expect(response.isOnline).toBe(true);
497
+ expect(response.responseTimeInMs).toBeUndefined();
498
+ expect(response.isTimeout).toBeUndefined();
499
+ expect(response.failureCause).toBe("");
500
+ expect(response.pingResponse).toEqual(EXPECTED_OK_PING);
501
+ expect(response.monitorStepId.toString()).toBe(step.id.toString());
502
+ expect(response.monitoredAt).toEqual(MONITORED_AT);
503
+ });
504
+
505
+ test("an unreachable ping-only poll: verdict false, the ping's failure cause, still no walk", async () => {
506
+ mockPipeline({
507
+ monitors: [buildMonitor({ steps: [buildStep(DEVICE_ID)] })],
508
+ });
509
+
510
+ await runPoll({
511
+ isOnline: false,
512
+ pollMode: "ping",
513
+ pingResponse: FAILED_PING,
514
+ });
515
+
516
+ expect(inventorySpy.mock.calls[0][0]["isOnline"]).toBe(false);
517
+ expect(metricsSpy.mock.calls[0][0]["isOnline"]).toBe(false);
518
+
519
+ const response: ProbeMonitorResponse = synthesized();
520
+ expect(response.isOnline).toBe(false);
521
+ expect(response.snmpResponse).toBeUndefined();
522
+ expect(response.failureCause).toBe("Request timed out");
523
+ expect(response.pingResponse?.packetLossPercent).toBe(100);
524
+ });
525
+
526
+ test("snmp mode, ping answered, walk failed: the device is Up and the failed walk is the real walk", async () => {
527
+ mockPipeline({
528
+ monitors: [buildMonitor({ steps: [buildStep(DEVICE_ID)] })],
529
+ });
530
+ const failedWalk: SnmpMonitorResponse = buildSnmpResponse({
531
+ isOnline: false,
532
+ responseTimeInMs: 5000,
533
+ isTimeout: true,
534
+ failureCause: "SNMP timed out after 3 attempts",
535
+ interfaces: undefined,
536
+ });
537
+
538
+ await runPoll({
539
+ isOnline: true,
540
+ pollMode: "snmp",
541
+ pingResponse: OK_PING,
542
+ snmpResponse: failedWalk,
543
+ });
544
+
545
+ const inventoryArgs: JSONObject = inventorySpy.mock.calls[0][0];
546
+ expect(inventoryArgs["isOnline"]).toBe(true);
547
+ expect(inventoryArgs["pollMode"]).toBe("snmp");
548
+ expect(inventoryArgs["snmpResponse"]).toBe(failedWalk);
549
+
550
+ const response: ProbeMonitorResponse = synthesized();
551
+ // The device verdict, not the walk's.
552
+ expect(response.isOnline).toBe(true);
553
+ expect(response.snmpResponse).toBe(failedWalk);
554
+ expect(response.responseTimeInMs).toBe(5000);
555
+ expect(response.isTimeout).toBe(true);
556
+ // The walk's cause is the specific one; the walk-failing alert reads it.
557
+ expect(response.failureCause).toBe("SNMP timed out after 3 attempts");
558
+ });
559
+
560
+ /*
561
+ * ICMP-filtered SNMP gear. The walk is the proof of life; the ping's
562
+ * "timed out" is not a failure of anything and must not be surfaced as
563
+ * the poll's failure cause on a device that is Up.
564
+ */
565
+ test("snmp mode, ping failed, walk succeeded: Up, the walk verbatim, and no failure cause from the ping", async () => {
566
+ mockPipeline({
567
+ monitors: [buildMonitor({ steps: [buildStep(DEVICE_ID)] })],
568
+ });
569
+ const walk: SnmpMonitorResponse = buildSnmpResponse();
570
+
571
+ await runPoll({
572
+ isOnline: true,
573
+ pollMode: "snmp",
574
+ pingResponse: FAILED_PING,
575
+ snmpResponse: walk,
576
+ });
577
+
578
+ const response: ProbeMonitorResponse = synthesized();
579
+ expect(response.isOnline).toBe(true);
580
+ expect(response.snmpResponse).toBe(walk);
581
+ expect(response.responseTimeInMs).toBe(42);
582
+ expect(response.failureCause).toBe("");
583
+ expect(response.pingResponse?.packetLossPercent).toBe(100);
584
+ });
585
+
586
+ test("snmp mode, both failed: Down, the walk's cause first, the ping's when the walk has none", async () => {
587
+ mockPipeline({
588
+ monitors: [buildMonitor({ steps: [buildStep(DEVICE_ID)] })],
589
+ });
590
+
591
+ await runPoll({
592
+ isOnline: false,
593
+ pollMode: "snmp",
594
+ pingResponse: FAILED_PING,
595
+ snmpResponse: buildSnmpResponse({
596
+ isOnline: false,
597
+ failureCause: "SNMP timed out after 3 attempts",
598
+ interfaces: undefined,
599
+ }),
600
+ });
601
+
602
+ expect(synthesized().isOnline).toBe(false);
603
+ expect(synthesized().failureCause).toBe("SNMP timed out after 3 attempts");
604
+
605
+ monitorResourceSpy.mockClear();
606
+
607
+ await runPoll({
608
+ isOnline: false,
609
+ pollMode: "snmp",
610
+ pingResponse: FAILED_PING,
611
+ snmpResponse: buildSnmpResponse({
612
+ isOnline: false,
613
+ failureCause: "",
614
+ interfaces: undefined,
615
+ }),
616
+ });
617
+
618
+ expect(synthesized().failureCause).toBe("Request timed out");
619
+ });
620
+
621
+ test("an old probe's walk (no verdict, no mode, no ping) derives the verdict from the walk", async () => {
622
+ mockPipeline({
623
+ monitors: [buildMonitor({ steps: [buildStep(DEVICE_ID)] })],
624
+ });
625
+
626
+ await runWalk(
627
+ buildSnmpResponse({ isOnline: false, interfaces: undefined }),
628
+ );
629
+
630
+ expect(inventorySpy.mock.calls[0][0]["isOnline"]).toBe(false);
631
+ expect(inventorySpy.mock.calls[0][0]["pollMode"]).toBe("snmp");
632
+ expect(synthesized().isOnline).toBe(false);
633
+ expect(synthesized().pingResponse).toBeUndefined();
634
+ });
635
+
636
+ test("an old probe's walk with no verdict at all counts as answered (the inventory's convention)", async () => {
637
+ mockPipeline();
638
+
639
+ await runWalk({
640
+ oidResponses: [],
641
+ responseTimeInMs: 5,
642
+ } as unknown as SnmpMonitorResponse);
643
+
644
+ expect(inventorySpy.mock.calls[0][0]["isOnline"]).toBe(true);
645
+ });
646
+ });
647
+
648
+ describe("NetworkDeviceWalkUtil.toPingMonitorResponse", () => {
649
+ test("no ping (an old probe) is no response, never an invented one", () => {
650
+ expect(NetworkDeviceWalkUtil.toPingMonitorResponse(undefined)).toBe(
651
+ undefined,
652
+ );
653
+ });
654
+
655
+ test("maps the probe's shape onto the Ping monitor's, counts defaulting when the probe did not report them", () => {
656
+ expect(NetworkDeviceWalkUtil.toPingMonitorResponse(OK_PING)).toEqual({
657
+ packetsSent: 0,
658
+ packetsReceived: 0,
659
+ packetLossPercent: 0,
660
+ avgRoundTripTimeInMs: 2.5,
661
+ });
662
+
663
+ expect(
664
+ NetworkDeviceWalkUtil.toPingMonitorResponse({
665
+ ...OK_PING,
666
+ packetsSent: 2,
667
+ packetsReceived: 2,
668
+ }),
669
+ ).toEqual({
670
+ packetsSent: 2,
671
+ packetsReceived: 2,
672
+ packetLossPercent: 0,
673
+ avgRoundTripTimeInMs: 2.5,
674
+ });
675
+ });
676
+
677
+ test("a ping with no measured loss implies it from the verdict", () => {
678
+ expect(
679
+ NetworkDeviceWalkUtil.toPingMonitorResponse({ isOnline: true })
680
+ ?.packetLossPercent,
681
+ ).toBe(0);
682
+ expect(
683
+ NetworkDeviceWalkUtil.toPingMonitorResponse({ isOnline: false })
684
+ ?.packetLossPercent,
685
+ ).toBe(100);
686
+ });
687
+
688
+ test("a non-finite RTT is dropped rather than charted", () => {
689
+ expect(
690
+ NetworkDeviceWalkUtil.toPingMonitorResponse({
691
+ isOnline: true,
692
+ avgRttMs: Number.NaN,
693
+ })?.avgRoundTripTimeInMs,
694
+ ).toBeUndefined();
695
+ });
696
+ });
697
+
356
698
  describe("NetworkDeviceWalkUtil.processWalkResult — fault isolation", () => {
357
699
  test("a metrics failure does not break the pipeline: fan-out still happens", async () => {
358
700
  const watching: Monitor = buildMonitor({ steps: [buildStep(DEVICE_ID)] });
@@ -361,7 +703,7 @@ describe("NetworkDeviceWalkUtil.processWalkResult — fault isolation", () => {
361
703
 
362
704
  await expect(runWalk(buildSnmpResponse())).resolves.toBeUndefined();
363
705
 
364
- expect(monitorFindSpy).toHaveBeenCalledTimes(1);
706
+ expect(monitorFindSpy).toHaveBeenCalled();
365
707
  expect(monitorResourceSpy).toHaveBeenCalledTimes(1);
366
708
  });
367
709
 
@@ -376,11 +718,7 @@ describe("NetworkDeviceWalkUtil.processWalkResult — fault isolation", () => {
376
718
  await expect(runWalk(buildSnmpResponse())).resolves.toBeUndefined();
377
719
 
378
720
  expect(monitorResourceSpy).toHaveBeenCalledTimes(2);
379
- expect(
380
- (
381
- monitorResourceSpy.mock.calls[1][0] as ProbeMonitorResponse
382
- ).monitorId.toString(),
383
- ).toBe(second.id!.toString());
721
+ expect(synthesized(1).monitorId.toString()).toBe(second.id!.toString());
384
722
  });
385
723
  });
386
724
 
@@ -466,6 +804,18 @@ describe("NetworkDeviceWalkUtil.processWalkResult — monitor fan-out", () => {
466
804
  );
467
805
  });
468
806
 
807
+ test("a provisioned monitor found through its column is evaluated like a hand-made one", async () => {
808
+ const provisioned: Monitor = buildMonitor({
809
+ steps: [buildStep(DEVICE_ID)],
810
+ });
811
+ mockPipeline({ indexedMonitors: [provisioned] });
812
+
813
+ await runWalk(buildSnmpResponse());
814
+
815
+ expect(monitorResourceSpy).toHaveBeenCalledTimes(1);
816
+ expect(synthesized().monitorId.toString()).toBe(provisioned.id!.toString());
817
+ });
818
+
469
819
  test("the synthesized response carries the walk verbatim into the criteria pipeline", async () => {
470
820
  const step: MonitorStep = buildStep(DEVICE_ID);
471
821
  const monitor: Monitor = buildMonitor({ steps: [step] });
@@ -481,20 +831,20 @@ describe("NetworkDeviceWalkUtil.processWalkResult — monitor fan-out", () => {
481
831
  await runWalk(snmpResponse);
482
832
 
483
833
  expect(monitorResourceSpy).toHaveBeenCalledTimes(1);
484
- const synthesized: ProbeMonitorResponse =
485
- monitorResourceSpy.mock.calls[0][0];
486
-
487
- expect(synthesized.projectId.toString()).toBe(PROJECT_ID.toString());
488
- expect(synthesized.monitorId.toString()).toBe(monitor.id!.toString());
489
- expect(synthesized.monitorStepId.toString()).toBe(step.id.toString());
490
- expect(synthesized.probeId.toString()).toBe(PROBE_ID.toString());
491
- expect(synthesized.snmpResponse).toBe(snmpResponse);
492
- expect(synthesized.isOnline).toBe(false);
493
- expect(synthesized.responseTimeInMs).toBe(5000);
494
- expect(synthesized.isTimeout).toBe(true);
495
- expect(synthesized.failureCause).toBe("SNMP timed out after 3 attempts");
496
- expect(synthesized.monitoredAt).toEqual(MONITORED_AT);
497
- expect(synthesized.ingestedAt).toEqual(NOW);
834
+ const response: ProbeMonitorResponse = synthesized();
835
+
836
+ expect(response.projectId.toString()).toBe(PROJECT_ID.toString());
837
+ expect(response.monitorId.toString()).toBe(monitor.id!.toString());
838
+ expect(response.monitorStepId.toString()).toBe(step.id.toString());
839
+ expect(response.probeId.toString()).toBe(PROBE_ID.toString());
840
+ expect(response.snmpResponse).toBe(snmpResponse);
841
+ expect(response.isOnline).toBe(false);
842
+ expect(response.responseTimeInMs).toBe(5000);
843
+ expect(response.isTimeout).toBe(true);
844
+ expect(response.failureCause).toBe("SNMP timed out after 3 attempts");
845
+ expect(response.pingResponse).toBeUndefined();
846
+ expect(response.monitoredAt).toEqual(MONITORED_AT);
847
+ expect(response.ingestedAt).toEqual(NOW);
498
848
  });
499
849
 
500
850
  test("a walk with no failure cause synthesizes an empty string, never undefined", async () => {
@@ -507,13 +857,17 @@ describe("NetworkDeviceWalkUtil.processWalkResult — monitor fan-out", () => {
507
857
 
508
858
  await runWalk(snmpResponse);
509
859
 
510
- expect(
511
- (monitorResourceSpy.mock.calls[0][0] as ProbeMonitorResponse)
512
- .failureCause,
513
- ).toBe("");
860
+ expect(synthesized().failureCause).toBe("");
514
861
  });
515
862
  });
516
863
 
864
+ /*
865
+ * The fan-out lookup is the prerequisite for alert policies: a walk must
866
+ * find the monitors watching its device by an indexed column, not by
867
+ * scanning every Network Device monitor's step JSON in the project. The
868
+ * scan survives, paged and restricted to rows the index cannot serve, for
869
+ * hand-made monitors that carry the link only in their steps.
870
+ */
517
871
  describe("NetworkDeviceWalkUtil.findMonitorsWatchingDevices", () => {
518
872
  test("an empty device list short-circuits without querying", async () => {
519
873
  mockPipeline();
@@ -528,23 +882,44 @@ describe("NetworkDeviceWalkUtil.findMonitorsWatchingDevices", () => {
528
882
  expect(monitorFindSpy).not.toHaveBeenCalled();
529
883
  });
530
884
 
531
- test("queries the project's Network Device monitors", async () => {
885
+ test("issues an indexed query on the device column and a legacy scan restricted to unlinked rows, both scoped, sorted and paged", async () => {
532
886
  mockPipeline();
533
887
 
534
888
  await NetworkDeviceWalkUtil.findMonitorsWatchingDevices({
535
889
  projectId: PROJECT_ID,
536
- deviceIds: [DEVICE_ID],
890
+ deviceIds: [DEVICE_ID, OTHER_DEVICE_ID],
537
891
  });
538
892
 
539
- expect(monitorFindSpy).toHaveBeenCalledTimes(1);
540
- const query: JSONObject = monitorFindSpy.mock.calls[0][0].query;
541
- expect((query["projectId"] as ObjectID).toString()).toBe(
542
- PROJECT_ID.toString(),
543
- );
544
- expect(query["monitorType"]).toBe(MonitorType.NetworkDevice);
893
+ const indexed: Array<FindBy<Monitor>> = monitorFindCalls("indexed");
894
+ const legacy: Array<FindBy<Monitor>> = monitorFindCalls("legacy");
895
+ expect(indexed).toHaveLength(1);
896
+ expect(legacy).toHaveLength(1);
897
+
898
+ expect(linkQueryOf(indexed[0]!)?.__in).toEqual([
899
+ DEVICE_ID,
900
+ OTHER_DEVICE_ID,
901
+ ]);
902
+ expect(linkQueryOf(legacy[0]!)?.__isNull).toBe(true);
903
+
904
+ for (const findBy of [indexed[0]!, legacy[0]!]) {
905
+ const query: JSONObject = findBy.query as unknown as JSONObject;
906
+ expect((query["projectId"] as ObjectID).toString()).toBe(
907
+ PROJECT_ID.toString(),
908
+ );
909
+ expect(query["monitorType"]).toBe(MonitorType.NetworkDevice);
910
+ expect((findBy.sort as unknown as JSONObject)["_id"]).toBe(
911
+ SortOrder.Ascending,
912
+ );
913
+ expect(findBy.limit).toBe(LIMIT_MAX);
914
+ expect(findBy.skip).toBe(0);
915
+ expect(findBy.props.isRoot).toBe(true);
916
+ expect((findBy.select as unknown as JSONObject)["monitorSteps"]).toBe(
917
+ true,
918
+ );
919
+ }
545
920
  });
546
921
 
547
- test("keeps only monitors with at least one step referencing a given device, tolerating malformed steps", async () => {
922
+ test("keeps only legacy monitors with at least one step referencing a given device, tolerating malformed steps", async () => {
548
923
  const watching: Monitor = buildMonitor({ steps: [buildStep(DEVICE_ID)] });
549
924
  const watchingOther: Monitor = buildMonitor({
550
925
  steps: [buildStep(OTHER_DEVICE_ID)],
@@ -613,4 +988,66 @@ describe("NetworkDeviceWalkUtil.findMonitorsWatchingDevices", () => {
613
988
 
614
989
  expect(monitors).toHaveLength(2);
615
990
  });
991
+
992
+ test("unions the indexed and legacy results, indexed first, deduped by id", async () => {
993
+ const provisioned: Monitor = buildMonitor({
994
+ steps: [buildStep(DEVICE_ID)],
995
+ });
996
+ const handMade: Monitor = buildMonitor({ steps: [buildStep(DEVICE_ID)] });
997
+
998
+ /*
999
+ * A row cannot really be in both sets (the legacy scan is restricted to
1000
+ * NULL links), but the union must not depend on that: a monitor the
1001
+ * indexed query returned is never evaluated twice.
1002
+ */
1003
+ mockPipeline({
1004
+ indexedMonitors: [provisioned],
1005
+ monitors: [provisioned, handMade],
1006
+ });
1007
+
1008
+ const monitors: Array<Monitor> =
1009
+ await NetworkDeviceWalkUtil.findMonitorsWatchingDevices({
1010
+ projectId: PROJECT_ID,
1011
+ deviceIds: [DEVICE_ID],
1012
+ });
1013
+
1014
+ expect(
1015
+ monitors.map((monitor: Monitor) => {
1016
+ return monitor.id!.toString();
1017
+ }),
1018
+ ).toEqual([provisioned.id!.toString(), handMade.id!.toString()]);
1019
+ });
1020
+
1021
+ test("the legacy scan pages until a short page, and finds a monitor on the second page", async () => {
1022
+ mockPipeline();
1023
+
1024
+ const firstPage: Array<Monitor> = Array.from({ length: LIMIT_MAX }, () => {
1025
+ return buildMonitor({ steps: [buildStep(OTHER_DEVICE_ID)] });
1026
+ });
1027
+ const straggler: Monitor = buildMonitor({ steps: [buildStep(DEVICE_ID)] });
1028
+
1029
+ monitorFindSpy.mockImplementation(
1030
+ async (findBy: FindBy<Monitor>): Promise<Array<Monitor>> => {
1031
+ if (linkQueryOf(findBy)?.__in) {
1032
+ return [];
1033
+ }
1034
+
1035
+ return (findBy.skip as number) === 0 ? firstPage : [straggler];
1036
+ },
1037
+ );
1038
+
1039
+ const monitors: Array<Monitor> =
1040
+ await NetworkDeviceWalkUtil.findMonitorsWatchingDevices({
1041
+ projectId: PROJECT_ID,
1042
+ deviceIds: [DEVICE_ID],
1043
+ });
1044
+
1045
+ const legacy: Array<FindBy<Monitor>> = monitorFindCalls("legacy");
1046
+ expect(legacy).toHaveLength(2);
1047
+ expect(legacy[0]!.skip).toBe(0);
1048
+ expect(legacy[1]!.skip).toBe(LIMIT_MAX);
1049
+
1050
+ expect(monitors).toHaveLength(1);
1051
+ expect(monitors[0]!.id!.toString()).toBe(straggler.id!.toString());
1052
+ });
616
1053
  });