@oneuptime/common 14.0.3 → 14.0.5

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 (617) hide show
  1. package/Models/DatabaseModels/Alert.ts +55 -0
  2. package/Models/DatabaseModels/DatabaseServer.ts +1650 -0
  3. package/Models/DatabaseModels/DatabaseServerEndpoint.ts +540 -0
  4. package/Models/DatabaseModels/DatabaseServerFeed.ts +625 -0
  5. package/Models/DatabaseModels/DatabaseServerLabelRule.ts +514 -0
  6. package/Models/DatabaseModels/DatabaseServerOwnerRule.ts +596 -0
  7. package/Models/DatabaseModels/DatabaseServerOwnerTeam.ts +491 -0
  8. package/Models/DatabaseModels/DatabaseServerOwnerUser.ts +490 -0
  9. package/Models/DatabaseModels/Incident.ts +55 -0
  10. package/Models/DatabaseModels/Index.ts +16 -0
  11. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +26 -0
  12. package/Models/DatabaseModels/ScheduledMaintenance.ts +55 -0
  13. package/Models/DatabaseModels/TelemetryException.ts +2 -0
  14. package/Models/DatabaseModels/UserProjectSsoConsent.ts +146 -0
  15. package/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.ts +673 -0
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.ts +51 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
  18. package/Server/Middleware/MultipartFormData.ts +1 -1
  19. package/Server/Middleware/TelemetryIngest.ts +15 -8
  20. package/Server/Services/AlertReminderRuleService.ts +100 -24
  21. package/Server/Services/DatabaseServerEndpointService.ts +895 -0
  22. package/Server/Services/DatabaseServerFeedService.ts +128 -0
  23. package/Server/Services/DatabaseServerLabelRuleEngineService.ts +340 -0
  24. package/Server/Services/DatabaseServerLabelRuleService.ts +14 -0
  25. package/Server/Services/DatabaseServerOwnerRuleEngineService.ts +425 -0
  26. package/Server/Services/DatabaseServerOwnerRuleService.ts +14 -0
  27. package/Server/Services/DatabaseServerOwnerTeamService.ts +180 -0
  28. package/Server/Services/DatabaseServerOwnerUserService.ts +173 -0
  29. package/Server/Services/DatabaseServerService.ts +4546 -0
  30. package/Server/Services/DatabaseService.ts +14 -8
  31. package/Server/Services/DockerResourceService.ts +43 -2
  32. package/Server/Services/IncidentReminderRuleService.ts +103 -23
  33. package/Server/Services/Index.ts +16 -0
  34. package/Server/Services/InventoryItemService.ts +113 -5
  35. package/Server/Services/IoTDeviceService.ts +145 -37
  36. package/Server/Services/OpenTelemetryIngestService.ts +19 -0
  37. package/Server/Services/PodmanResourceService.ts +43 -2
  38. package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +107 -23
  39. package/Server/Services/ServiceService.ts +1 -1
  40. package/Server/Services/TelemetryUsageBillingService.ts +29 -2
  41. package/Server/Services/UserProjectSsoConsentService.ts +74 -0
  42. package/Server/Services/UserService.ts +14 -1
  43. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +18 -0
  44. package/Server/Types/Database/QueryHelper.ts +30 -1
  45. package/Server/Utils/AI/Toolbox/ResourceTools.ts +69 -1
  46. package/Server/Utils/Database/AffectedResourceRelations.ts +6 -0
  47. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +188 -6
  48. package/Server/Utils/Monitor/MonitorAlert.ts +28 -1
  49. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +2262 -755
  50. package/Server/Utils/Monitor/MonitorIncident.ts +28 -1
  51. package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +268 -6
  52. package/Server/Utils/Monitor/MonitorResource.ts +47 -11
  53. package/Server/Utils/Monitor/MonitorResourceContext.ts +1 -0
  54. package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +239 -21
  55. package/Server/Utils/Monitor/PerSeriesResolutionRootCause.ts +43 -0
  56. package/Server/Utils/Monitor/SeriesResourceLabels.ts +291 -0
  57. package/Server/Utils/Monitor/SeriesResourceLinker.ts +111 -12
  58. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +25 -0
  59. package/Server/Utils/StartServer.ts +26 -6
  60. package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +2 -0
  61. package/Server/Utils/Telemetry/DatabaseEndpointDiscovery.ts +688 -0
  62. package/Server/Utils/Telemetry/EntityRegistry.ts +5 -1
  63. package/Server/Utils/Telemetry/LogExceptionExtractor.ts +18 -1
  64. package/Server/Utils/Telemetry/ResourceEntityFilter.ts +175 -12
  65. package/Server/Utils/Telemetry/ResourceFacetResolver.ts +12 -0
  66. package/Server/Utils/Telemetry/ServiceDependencyDiscovery.ts +606 -36
  67. package/Server/Utils/Telemetry/Telemetry.ts +16 -0
  68. package/Server/Utils/Telemetry/TelemetryEntity.ts +22 -22
  69. package/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.ts +16 -10
  70. package/Tests/App/Accounts/SignedInRedirect.test.tsx +241 -0
  71. package/Tests/App/AdminDashboard/AdminHeaderSmallScreens.test.tsx +221 -4
  72. package/Tests/App/Dashboard/AIInsightsResourcePageContext.test.ts +42 -0
  73. package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +100 -0
  74. package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +86 -0
  75. package/Tests/App/Dashboard/AffectedResourcesPickerHiddenTypes.test.tsx +2 -0
  76. package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +19 -0
  77. package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +14 -0
  78. package/Tests/App/Dashboard/CorrelateFilterBuilder.test.tsx +26 -1
  79. package/Tests/App/Dashboard/DashboardAppSsoError.test.tsx +501 -0
  80. package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +64 -1
  81. package/Tests/App/Dashboard/DashboardHeaderSmallScreens.test.tsx +178 -18
  82. package/Tests/App/Dashboard/DashboardMasterPageSsoRedirect.test.tsx +444 -0
  83. package/Tests/App/Dashboard/DashboardNavBarForeignHiddenRule.test.tsx +573 -0
  84. package/Tests/App/Dashboard/DatabaseChartAxes.test.tsx +431 -0
  85. package/Tests/App/Dashboard/DatabaseContainerDetailBadge.test.tsx +249 -0
  86. package/Tests/App/Dashboard/DatabaseDashboardE2EFixes.test.ts +681 -0
  87. package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +1801 -0
  88. package/Tests/App/Dashboard/DatabaseFleetSummaryRefresh.test.tsx +280 -0
  89. package/Tests/App/Dashboard/DatabaseFormHelpers.test.tsx +321 -0
  90. package/Tests/App/Dashboard/DatabaseMetricMonitorLink.test.tsx +795 -0
  91. package/Tests/App/Dashboard/DatabaseOverviewHeader.test.tsx +580 -0
  92. package/Tests/App/Dashboard/DatabaseRecommendationsEngineMetrics.test.ts +270 -0
  93. package/Tests/App/Dashboard/DatabaseServerComponents.test.tsx +1486 -0
  94. package/Tests/App/Dashboard/DatabaseServerEngineMetricsFilter.test.ts +223 -0
  95. package/Tests/App/Dashboard/DatabaseServerPresentation.test.ts +435 -0
  96. package/Tests/App/Dashboard/DatabaseServerSummary.test.ts +186 -0
  97. package/Tests/App/Dashboard/DatabaseServerTelemetryQueries.test.ts +1553 -0
  98. package/Tests/App/Dashboard/DatabaseTableTruncation.test.tsx +326 -0
  99. package/Tests/App/Dashboard/DatabaseTelemetryScope.test.ts +512 -0
  100. package/Tests/App/Dashboard/DatabaseTelemetryTabs.test.tsx +774 -0
  101. package/Tests/App/Dashboard/DatabaseViewLayout.test.tsx +233 -0
  102. package/Tests/App/Dashboard/DatabaseWorkloadBadge.test.tsx +972 -0
  103. package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +5 -0
  104. package/Tests/App/Dashboard/DiscoveryReviewUnnamedHostHint.test.tsx +1061 -0
  105. package/Tests/App/Dashboard/EventOverlayScope.test.ts +147 -0
  106. package/Tests/App/Dashboard/EventOverlayScopeHook.test.tsx +1 -0
  107. package/Tests/App/Dashboard/LogsResourceFacetChips.test.tsx +1 -0
  108. package/Tests/App/Dashboard/MetricsViewerDrillDown.test.tsx +310 -0
  109. package/Tests/App/Dashboard/MetricsViewerEntityScopedRows.test.tsx +495 -0
  110. package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +132 -1
  111. package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +5 -0
  112. package/Tests/App/Dashboard/ProductOrientation.test.tsx +4 -3
  113. package/Tests/App/Dashboard/RecommendationsLoadedContext.test.tsx +349 -0
  114. package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +62 -0
  115. package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
  116. package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +14 -0
  117. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +2 -0
  118. package/Tests/App/Dashboard/ServiceMapDatabaseLink.test.tsx +1085 -0
  119. package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +10 -0
  120. package/Tests/App/Dashboard/TracesResourceFacets.test.tsx +2 -1
  121. package/Tests/App/StatusPage/StatusPageHeaderForeignHiddenRule.test.tsx +284 -0
  122. package/Tests/ClassStrings.ts +178 -0
  123. package/Tests/Fixtures/MobilePasskeyUser.json +1 -2
  124. package/Tests/ForeignHiddenRuleGuard.ts +2152 -0
  125. package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +2250 -0
  126. package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +24 -5
  127. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
  128. package/Tests/RenderedMarkup.ts +518 -0
  129. package/Tests/ResponsiveVisibility.test.ts +490 -4
  130. package/Tests/ResponsiveVisibility.ts +505 -52
  131. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
  132. package/Tests/Server/Infrastructure/Postgres/AddDatabaseServerTablesMigration.test.ts +541 -0
  133. package/Tests/Server/Infrastructure/Postgres/AddUserProjectSsoConsentMigration.test.ts +234 -0
  134. package/Tests/Server/Services/ContainerSnapshotUpsertPostgres.test.ts +319 -0
  135. package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +13 -0
  136. package/Tests/Server/Services/DatabaseServerEndpointService.test.ts +2033 -0
  137. package/Tests/Server/Services/DatabaseServerFeedAndOwnerServices.test.ts +529 -0
  138. package/Tests/Server/Services/DatabaseServerLifecycle.test.ts +3302 -0
  139. package/Tests/Server/Services/DatabaseServerRegistries.test.ts +603 -0
  140. package/Tests/Server/Services/DatabaseServerRuleEngines.test.ts +754 -0
  141. package/Tests/Server/Services/DatabaseServerService.test.ts +3558 -0
  142. package/Tests/Server/Services/DatabaseServerSqlPostgres.test.ts +2045 -0
  143. package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlockedPostgres.test.ts +362 -0
  144. package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlockedReply.test.ts +210 -0
  145. package/Tests/Server/Services/HookFreeWriteLengthClamp.test.ts +18 -0
  146. package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +2 -0
  147. package/Tests/Server/Services/IncomingCallPolicyEscalationRuleTarget.test.ts +225 -0
  148. package/Tests/Server/Services/InventoryItemDisplayName.test.ts +280 -2
  149. package/Tests/Server/Services/InventoryUpsertSchemaParity.test.ts +8 -2
  150. package/Tests/Server/Services/IoTDeviceLatestMetricsPostgres.test.ts +689 -0
  151. package/Tests/Server/Services/IoTDeviceService.test.ts +379 -0
  152. package/Tests/Server/Services/LatestMetricsValuesShape.test.ts +360 -0
  153. package/Tests/Server/Services/LlmModelPriceService.test.ts +402 -0
  154. package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +7 -1
  155. package/Tests/Server/Services/OwnerRowUniqueness.test.ts +61 -9
  156. package/Tests/Server/Services/ReminderRuleLookupPostgres.test.ts +2250 -0
  157. package/Tests/Server/Services/ReminderRuleRefreshOpenSubjectsPaging.test.ts +653 -0
  158. package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +68 -20
  159. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +3 -3
  160. package/Tests/Server/Services/TelemetryResourceFacetCounting.test.ts +9 -0
  161. package/Tests/Server/Services/UserProjectSsoConsentPostgres.test.ts +153 -0
  162. package/Tests/Server/Services/UserProjectSsoConsentService.test.ts +192 -0
  163. package/Tests/Server/Services/UserServiceFirstMasterAdminElection.test.ts +71 -0
  164. package/Tests/Server/Services/UserSignupIdTakeoverPostgres.test.ts +238 -0
  165. package/Tests/Server/Services/WorkspaceNotificationSummaryHelpers.test.ts +592 -0
  166. package/Tests/Server/Types/Billing/PayAsYouGoMeteredAuthorization.test.ts +3 -0
  167. package/Tests/Server/Types/Database/EventOverlayScopePostgres.test.ts +1 -0
  168. package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +11 -0
  169. package/Tests/Server/Types/Database/Permissions/InfrastructureOwnershipScope.test.ts +8 -0
  170. package/Tests/Server/Types/Database/QueryHelperBooleanForCriteriaBackedRule.test.ts +1094 -0
  171. package/Tests/Server/Utils/AI/ResourceTools.test.ts +134 -0
  172. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +41 -0
  173. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +279 -9
  174. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaDisplayContext.test.ts +933 -0
  175. package/Tests/Server/Utils/Monitor/DatabaseMaintenanceSuppression.test.ts +582 -0
  176. package/Tests/Server/Utils/Monitor/DatabaseServerMonitorLinking.test.ts +753 -0
  177. package/Tests/Server/Utils/Monitor/MonitorActionTimestamps.test.ts +1 -0
  178. package/Tests/Server/Utils/Monitor/MonitorAlertCriteriaReferences.test.ts +1 -0
  179. package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +119 -0
  180. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +60 -25
  181. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorAffectedResourceEdgeCases.test.ts +1719 -0
  182. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorKubernetesAffectedResources.test.ts +1447 -0
  183. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorKubernetesRatioEmail.test.ts +352 -0
  184. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformMetricUnits.test.ts +717 -0
  185. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformRawScan.test.ts +2125 -0
  186. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformSeriesAffectedResources.test.ts +1288 -0
  187. package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +1 -0
  188. package/Tests/Server/Utils/Monitor/MonitorIncidentCriteriaReferences.test.ts +1 -0
  189. package/Tests/Server/Utils/Monitor/MonitorIncidentMemberRoleMembership.test.ts +1 -0
  190. package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +88 -0
  191. package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +205 -0
  192. package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +62 -0
  193. package/Tests/Server/Utils/Monitor/MonitorResourceDatabaseMaintenance.test.ts +803 -0
  194. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +133 -3
  195. package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +1 -0
  196. package/Tests/Server/Utils/Monitor/PerSeriesRecoveryResolution.test.ts +472 -1
  197. package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1 -0
  198. package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +236 -2
  199. package/Tests/Server/Utils/SeriesResourceLabels.test.ts +70 -0
  200. package/Tests/Server/Utils/StartServerProtobufContentType.test.ts +54 -0
  201. package/Tests/Server/Utils/Telemetry/DatabaseEndpointDiscovery.test.ts +1895 -0
  202. package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +7 -0
  203. package/Tests/Server/Utils/Telemetry/LogExceptionExtractorSeverityGate.test.ts +90 -0
  204. package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +570 -0
  205. package/Tests/Server/Utils/Telemetry/ResourceFacetResolver.test.ts +97 -2
  206. package/Tests/Server/Utils/Telemetry/ServiceDependencyDiscovery.test.ts +1337 -0
  207. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +295 -0
  208. package/Tests/Types/AI/AIResourceContext.test.ts +30 -0
  209. package/Tests/Types/DatabaseServer/DatabaseContainerClassifier.test.ts +3644 -0
  210. package/Tests/Types/DatabaseServer/DatabaseContainerCommand.test.ts +340 -0
  211. package/Tests/Types/DatabaseServer/DatabaseContainerCommandCorpus.ts +826 -0
  212. package/Tests/Types/DatabaseServer/DatabaseContainerCommandPostgres.test.ts +150 -0
  213. package/Tests/Types/DatabaseServer/DatabaseEndpoint.test.ts +2657 -0
  214. package/Tests/Types/DatabaseServer/DatabaseServerDiscoverySource.test.ts +64 -0
  215. package/Tests/Types/DatabaseServer/DatabaseServerEntityKeys.test.ts +952 -0
  216. package/Tests/Types/DatabaseServer/DatabaseServerMetricCatalog.test.ts +1161 -0
  217. package/Tests/Types/DatabaseServer/DatabaseSystem.test.ts +1514 -0
  218. package/Tests/Types/DatabaseServer/DatabaseTelemetryResolver.test.ts +1558 -0
  219. package/Tests/Types/Monitor/CephAlertTemplates.test.ts +255 -6
  220. package/Tests/Types/Monitor/DatabaseAlertTemplates.test.ts +2254 -0
  221. package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +298 -0
  222. package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +271 -0
  223. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +253 -9
  224. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +13 -5
  225. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +4 -2
  226. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +111 -2
  227. package/Tests/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.test.ts +61 -0
  228. package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +114 -0
  229. package/Tests/Types/Monitor/Utils/KubernetesAgentEmittedMetrics.ts +181 -0
  230. package/Tests/Types/NetworkDevice/DiscoveredHostNamingStatus.test.ts +401 -0
  231. package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +4 -1
  232. package/Tests/Types/Telemetry/ResourceFacetCatalog.test.ts +24 -2
  233. package/Tests/UI/Components/Card.test.tsx +93 -2
  234. package/Tests/UI/Components/FeedOptions.test.ts +6 -0
  235. package/Tests/UI/Components/FeedOptionsButton.test.tsx +8 -1
  236. package/Tests/UI/Components/ForeignHiddenRuleResilience.test.tsx +1147 -0
  237. package/Tests/UI/Components/HeaderRightRail.test.tsx +41 -1
  238. package/Tests/UI/Components/LogsEntityNames.test.ts +16 -1
  239. package/Tests/UI/Components/LogsFacetSidebarHiddenFacets.test.tsx +7 -3
  240. package/Tests/UI/Components/ResourceFacetConfigs.test.ts +2 -1
  241. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  242. package/Tests/UI/Components/SrOnlyForeignRule.test.tsx +994 -0
  243. package/Tests/UI/Components/StatusPage/ResourceListSelection.test.tsx +34 -1
  244. package/Tests/UI/Components/TelemetryFacetSidebarHiddenFacets.test.tsx +4 -1
  245. package/Tests/UI/ForeignHiddenRuleGuard.test.ts +1951 -0
  246. package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +19 -1
  247. package/Tests/UI/Rum/ReplayTabSwitcher.test.tsx +19 -1
  248. package/Tests/UI/TailwindPlayCdnForeignHiddenRule.test.ts +1005 -0
  249. package/Tests/UI/ThemeGroupHoverReveal.test.ts +847 -0
  250. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +70 -0
  251. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +21 -0
  252. package/Tests/UI/Utils/ModelAPISsoRedirect.test.ts +127 -0
  253. package/Tests/UI/Utils/Navigation.test.ts +102 -0
  254. package/Tests/UI/Utils/Telemetry/TelemetryEntityNames.test.ts +23 -0
  255. package/Tests/Utils/LabelRuleImportExport.test.ts +5 -0
  256. package/Tests/Utils/MetricUnitUtil.test.ts +227 -2
  257. package/Tests/Utils/Monitor/MetricValueFormatter.test.ts +288 -2
  258. package/Tests/Utils/Monitor/PlatformResourceIdentityAndUnits.test.ts +1559 -0
  259. package/Tests/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.test.ts +2546 -0
  260. package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +315 -0
  261. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +336 -1
  262. package/Tests/Utils/NetworkDiscovery/NetbiosNameUtil.test.ts +244 -0
  263. package/Tests/Utils/ValueFormatter.test.ts +50 -0
  264. package/Tests/tsconfig.json +16 -0
  265. package/Types/AI/AIResourceContext.ts +7 -0
  266. package/Types/Dashboard/DashboardTemplates.ts +2 -1
  267. package/Types/DatabaseServer/DatabaseConnectionSpan.ts +77 -0
  268. package/Types/DatabaseServer/DatabaseContainerClassifier.ts +2068 -0
  269. package/Types/DatabaseServer/DatabaseContainerCommand.ts +801 -0
  270. package/Types/DatabaseServer/DatabaseEndpoint.ts +1943 -0
  271. package/Types/DatabaseServer/DatabaseServerDiscoverySource.ts +68 -0
  272. package/Types/DatabaseServer/DatabaseServerMetricCatalog.ts +966 -0
  273. package/Types/DatabaseServer/DatabaseSystem.ts +2124 -0
  274. package/Types/DatabaseServer/DatabaseTelemetryResolver.ts +555 -0
  275. package/Types/Email/EmailTemplateType.ts +1 -0
  276. package/Types/Monitor/CephAlertTemplates.ts +18 -0
  277. package/Types/Monitor/DatabaseAlertTemplates.ts +2020 -0
  278. package/Types/Monitor/KubernetesAlertTemplates.ts +64 -24
  279. package/Types/Monitor/KubernetesMetricCatalog.ts +118 -19
  280. package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +14 -0
  281. package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +93 -10
  282. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +109 -8
  283. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +36 -7
  284. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +43 -2
  285. package/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.ts +41 -6
  286. package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +26 -0
  287. package/Types/NetworkDevice/DiscoveredHostNamingStatus.ts +147 -0
  288. package/Types/Permission.ts +267 -0
  289. package/Types/Probe/ProbeApiIngestResponse.ts +8 -0
  290. package/Types/Rules/RuleCriteriaFieldRegistry.ts +10 -0
  291. package/Types/Rules/RuleRun.ts +12 -0
  292. package/Types/Telemetry/EntityType.ts +23 -0
  293. package/Types/Telemetry/ResourceFacetCatalog.ts +14 -0
  294. package/Types/Telemetry/ServiceType.ts +8 -0
  295. package/UI/Components/Banner/Banner.tsx +1 -1
  296. package/UI/Components/Card/Card.tsx +1 -1
  297. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +2 -2
  298. package/UI/Components/Charts/Line/LineChart.tsx +7 -0
  299. package/UI/Components/CommandPalette/CommandPalette.tsx +1 -1
  300. package/UI/Components/Date/StartAndEndDate.tsx +5 -5
  301. package/UI/Components/Diagram/HorizontalStepChain.tsx +1 -1
  302. package/UI/Components/Feed/FeedOptionsButton.tsx +1 -1
  303. package/UI/Components/Forms/BasicForm.tsx +1 -1
  304. package/UI/Components/Header/Header.tsx +1 -1
  305. package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -1
  306. package/UI/Components/HeaderAlert/HeaderAlert.tsx +1 -1
  307. package/UI/Components/LogsViewer/components/FacetValueRow.tsx +1 -1
  308. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +1 -1
  309. package/UI/Components/Modal/ModalFooter.tsx +1 -1
  310. package/UI/Components/ModelDetail/CardModelDetail.tsx +2 -2
  311. package/UI/Components/ModelTable/BaseModelTable.tsx +4 -4
  312. package/UI/Components/Navbar/NavBar.tsx +9 -2
  313. package/UI/Components/Navbar/NavBarMenuModal.tsx +2 -2
  314. package/UI/Components/Page/Page.tsx +1 -1
  315. package/UI/Components/Pagination/Pagination.tsx +3 -3
  316. package/UI/Components/ProgressButtons/ProgressButtonItem.tsx +1 -1
  317. package/UI/Components/SideMenu/SideMenu.tsx +4 -1
  318. package/UI/Components/StatusPage/ResourceGroupNavigator.tsx +4 -2
  319. package/UI/Components/StatusPage/ResourceList.tsx +6 -6
  320. package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +1 -1
  321. package/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.tsx +1 -1
  322. package/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.tsx +1 -1
  323. package/UI/Components/Workflow/ComponentsModal.tsx +2 -2
  324. package/UI/Components/Workflow/StepTraceViewer.tsx +1 -1
  325. package/UI/Styles/Theme.css +8 -1
  326. package/UI/Utils/Navigation.ts +89 -42
  327. package/UI/Utils/Telemetry/TelemetryEntityNames.ts +7 -0
  328. package/UI/Utils/TelemetryService.ts +4 -3
  329. package/Utils/LabelRuleImportExport.ts +2 -0
  330. package/Utils/MetricUnitUtil.ts +103 -11
  331. package/Utils/Monitor/MetricValueFormatter.ts +66 -13
  332. package/Utils/Monitor/PlatformMetricUnitUtil.ts +215 -0
  333. package/Utils/Monitor/PlatformResourceIdentity.ts +514 -0
  334. package/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.ts +425 -0
  335. package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +32 -0
  336. package/Utils/NetworkDiscovery/NetbiosNameUtil.ts +73 -0
  337. package/Utils/Telemetry/DatabaseServerEntityKeys.ts +275 -0
  338. package/Utils/Telemetry/EntityKey.ts +176 -0
  339. package/Utils/ValueFormatter.ts +16 -0
  340. package/build/dist/Models/DatabaseModels/Alert.js +54 -0
  341. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  342. package/build/dist/Models/DatabaseModels/DatabaseServer.js +1683 -0
  343. package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -0
  344. package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js +559 -0
  345. package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js.map +1 -0
  346. package/build/dist/Models/DatabaseModels/DatabaseServerFeed.js +648 -0
  347. package/build/dist/Models/DatabaseModels/DatabaseServerFeed.js.map +1 -0
  348. package/build/dist/Models/DatabaseModels/DatabaseServerLabelRule.js +522 -0
  349. package/build/dist/Models/DatabaseModels/DatabaseServerLabelRule.js.map +1 -0
  350. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerRule.js +603 -0
  351. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerRule.js.map +1 -0
  352. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerTeam.js +506 -0
  353. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerTeam.js.map +1 -0
  354. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerUser.js +505 -0
  355. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerUser.js.map +1 -0
  356. package/build/dist/Models/DatabaseModels/Incident.js +54 -0
  357. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  358. package/build/dist/Models/DatabaseModels/Index.js +16 -0
  359. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  360. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  361. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +54 -0
  362. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  363. package/build/dist/Models/DatabaseModels/TelemetryException.js +2 -0
  364. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  365. package/build/dist/Models/DatabaseModels/UserProjectSsoConsent.js +162 -0
  366. package/build/dist/Models/DatabaseModels/UserProjectSsoConsent.js.map +1 -0
  367. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.js +240 -0
  368. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.js.map +1 -0
  369. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.js +26 -0
  370. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.js.map +1 -0
  371. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
  372. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  373. package/build/dist/Server/Middleware/MultipartFormData.js +1 -1
  374. package/build/dist/Server/Middleware/TelemetryIngest.js +15 -8
  375. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  376. package/build/dist/Server/Services/AlertReminderRuleService.js +72 -23
  377. package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
  378. package/build/dist/Server/Services/DatabaseServerEndpointService.js +694 -0
  379. package/build/dist/Server/Services/DatabaseServerEndpointService.js.map +1 -0
  380. package/build/dist/Server/Services/DatabaseServerFeedService.js +110 -0
  381. package/build/dist/Server/Services/DatabaseServerFeedService.js.map +1 -0
  382. package/build/dist/Server/Services/DatabaseServerLabelRuleEngineService.js +272 -0
  383. package/build/dist/Server/Services/DatabaseServerLabelRuleEngineService.js.map +1 -0
  384. package/build/dist/Server/Services/DatabaseServerLabelRuleService.js +13 -0
  385. package/build/dist/Server/Services/DatabaseServerLabelRuleService.js.map +1 -0
  386. package/build/dist/Server/Services/DatabaseServerOwnerRuleEngineService.js +340 -0
  387. package/build/dist/Server/Services/DatabaseServerOwnerRuleEngineService.js.map +1 -0
  388. package/build/dist/Server/Services/DatabaseServerOwnerRuleService.js +13 -0
  389. package/build/dist/Server/Services/DatabaseServerOwnerRuleService.js.map +1 -0
  390. package/build/dist/Server/Services/DatabaseServerOwnerTeamService.js +160 -0
  391. package/build/dist/Server/Services/DatabaseServerOwnerTeamService.js.map +1 -0
  392. package/build/dist/Server/Services/DatabaseServerOwnerUserService.js +153 -0
  393. package/build/dist/Server/Services/DatabaseServerOwnerUserService.js.map +1 -0
  394. package/build/dist/Server/Services/DatabaseServerService.js +3272 -0
  395. package/build/dist/Server/Services/DatabaseServerService.js.map +1 -0
  396. package/build/dist/Server/Services/DatabaseService.js +8 -4
  397. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  398. package/build/dist/Server/Services/DockerResourceService.js +30 -3
  399. package/build/dist/Server/Services/DockerResourceService.js.map +1 -1
  400. package/build/dist/Server/Services/IncidentReminderRuleService.js +73 -23
  401. package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
  402. package/build/dist/Server/Services/Index.js +16 -0
  403. package/build/dist/Server/Services/Index.js.map +1 -1
  404. package/build/dist/Server/Services/InventoryItemService.js +88 -5
  405. package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
  406. package/build/dist/Server/Services/IoTDeviceService.js +111 -24
  407. package/build/dist/Server/Services/IoTDeviceService.js.map +1 -1
  408. package/build/dist/Server/Services/OpenTelemetryIngestService.js +24 -9
  409. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  410. package/build/dist/Server/Services/PodmanResourceService.js +30 -3
  411. package/build/dist/Server/Services/PodmanResourceService.js.map +1 -1
  412. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +75 -23
  413. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
  414. package/build/dist/Server/Services/ServiceService.js +1 -1
  415. package/build/dist/Server/Services/ServiceService.js.map +1 -1
  416. package/build/dist/Server/Services/TelemetryUsageBillingService.js +23 -2
  417. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  418. package/build/dist/Server/Services/UserProjectSsoConsentService.js +79 -0
  419. package/build/dist/Server/Services/UserProjectSsoConsentService.js.map +1 -0
  420. package/build/dist/Server/Services/UserService.js +13 -1
  421. package/build/dist/Server/Services/UserService.js.map +1 -1
  422. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +18 -0
  423. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  424. package/build/dist/Server/Types/Database/QueryHelper.js +26 -1
  425. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  426. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js +46 -0
  427. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js.map +1 -1
  428. package/build/dist/Server/Utils/Database/AffectedResourceRelations.js +6 -0
  429. package/build/dist/Server/Utils/Database/AffectedResourceRelations.js.map +1 -1
  430. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +134 -13
  431. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
  432. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +22 -6
  433. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  434. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +1489 -524
  435. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  436. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +22 -6
  437. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  438. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +196 -6
  439. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
  440. package/build/dist/Server/Utils/Monitor/MonitorResource.js +36 -9
  441. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  442. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +1 -0
  443. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -1
  444. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +175 -17
  445. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -1
  446. package/build/dist/Server/Utils/Monitor/PerSeriesResolutionRootCause.js +29 -0
  447. package/build/dist/Server/Utils/Monitor/PerSeriesResolutionRootCause.js.map +1 -0
  448. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +211 -0
  449. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  450. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +82 -10
  451. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
  452. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +25 -0
  453. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
  454. package/build/dist/Server/Utils/StartServer.js +20 -4
  455. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  456. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +2 -0
  457. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -1
  458. package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js +442 -0
  459. package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js.map +1 -0
  460. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +5 -1
  461. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  462. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +15 -1
  463. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
  464. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +121 -5
  465. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
  466. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +12 -0
  467. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
  468. package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js +438 -36
  469. package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js.map +1 -1
  470. package/build/dist/Server/Utils/Telemetry/Telemetry.js +12 -0
  471. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  472. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +17 -18
  473. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  474. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js +16 -10
  475. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js.map +1 -1
  476. package/build/dist/Types/AI/AIResourceContext.js +7 -0
  477. package/build/dist/Types/AI/AIResourceContext.js.map +1 -1
  478. package/build/dist/Types/Dashboard/DashboardTemplates.js +2 -1
  479. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  480. package/build/dist/Types/DatabaseServer/DatabaseConnectionSpan.js +71 -0
  481. package/build/dist/Types/DatabaseServer/DatabaseConnectionSpan.js.map +1 -0
  482. package/build/dist/Types/DatabaseServer/DatabaseContainerClassifier.js +1462 -0
  483. package/build/dist/Types/DatabaseServer/DatabaseContainerClassifier.js.map +1 -0
  484. package/build/dist/Types/DatabaseServer/DatabaseContainerCommand.js +691 -0
  485. package/build/dist/Types/DatabaseServer/DatabaseContainerCommand.js.map +1 -0
  486. package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js +1407 -0
  487. package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js.map +1 -0
  488. package/build/dist/Types/DatabaseServer/DatabaseServerDiscoverySource.js +60 -0
  489. package/build/dist/Types/DatabaseServer/DatabaseServerDiscoverySource.js.map +1 -0
  490. package/build/dist/Types/DatabaseServer/DatabaseServerMetricCatalog.js +804 -0
  491. package/build/dist/Types/DatabaseServer/DatabaseServerMetricCatalog.js.map +1 -0
  492. package/build/dist/Types/DatabaseServer/DatabaseSystem.js +1860 -0
  493. package/build/dist/Types/DatabaseServer/DatabaseSystem.js.map +1 -0
  494. package/build/dist/Types/DatabaseServer/DatabaseTelemetryResolver.js +406 -0
  495. package/build/dist/Types/DatabaseServer/DatabaseTelemetryResolver.js.map +1 -0
  496. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  497. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  498. package/build/dist/Types/Monitor/CephAlertTemplates.js +18 -0
  499. package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -1
  500. package/build/dist/Types/Monitor/DatabaseAlertTemplates.js +1518 -0
  501. package/build/dist/Types/Monitor/DatabaseAlertTemplates.js.map +1 -0
  502. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +57 -24
  503. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  504. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js +104 -18
  505. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js.map +1 -1
  506. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +80 -3
  507. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  508. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +10 -3
  509. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  510. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +29 -0
  511. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
  512. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js +21 -6
  513. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js.map +1 -1
  514. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +25 -0
  515. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -1
  516. package/build/dist/Types/NetworkDevice/DiscoveredHostNamingStatus.js +136 -0
  517. package/build/dist/Types/NetworkDevice/DiscoveredHostNamingStatus.js.map +1 -0
  518. package/build/dist/Types/Permission.js +234 -0
  519. package/build/dist/Types/Permission.js.map +1 -1
  520. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +10 -0
  521. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  522. package/build/dist/Types/Rules/RuleRun.js +4 -0
  523. package/build/dist/Types/Rules/RuleRun.js.map +1 -1
  524. package/build/dist/Types/Telemetry/EntityType.js +23 -0
  525. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  526. package/build/dist/Types/Telemetry/ResourceFacetCatalog.js +14 -0
  527. package/build/dist/Types/Telemetry/ResourceFacetCatalog.js.map +1 -1
  528. package/build/dist/Types/Telemetry/ServiceType.js +8 -0
  529. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  530. package/build/dist/UI/Components/Banner/Banner.js +1 -1
  531. package/build/dist/UI/Components/Banner/Banner.js.map +1 -1
  532. package/build/dist/UI/Components/Card/Card.js +1 -1
  533. package/build/dist/UI/Components/Card/Card.js.map +1 -1
  534. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +2 -2
  535. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  536. package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
  537. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  538. package/build/dist/UI/Components/CommandPalette/CommandPalette.js +1 -1
  539. package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
  540. package/build/dist/UI/Components/Date/StartAndEndDate.js +5 -5
  541. package/build/dist/UI/Components/Date/StartAndEndDate.js.map +1 -1
  542. package/build/dist/UI/Components/Diagram/HorizontalStepChain.js +1 -1
  543. package/build/dist/UI/Components/Diagram/HorizontalStepChain.js.map +1 -1
  544. package/build/dist/UI/Components/Feed/FeedOptionsButton.js +1 -1
  545. package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -1
  546. package/build/dist/UI/Components/Forms/BasicForm.js +1 -1
  547. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  548. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -1
  549. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
  550. package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js +1 -1
  551. package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js.map +1 -1
  552. package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js +1 -1
  553. package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js.map +1 -1
  554. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +1 -1
  555. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  556. package/build/dist/UI/Components/Modal/ModalFooter.js +1 -1
  557. package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
  558. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +2 -2
  559. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
  560. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +4 -4
  561. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  562. package/build/dist/UI/Components/Navbar/NavBar.js +9 -2
  563. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  564. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +2 -2
  565. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  566. package/build/dist/UI/Components/Page/Page.js +1 -1
  567. package/build/dist/UI/Components/Page/Page.js.map +1 -1
  568. package/build/dist/UI/Components/Pagination/Pagination.js +3 -3
  569. package/build/dist/UI/Components/Pagination/Pagination.js.map +1 -1
  570. package/build/dist/UI/Components/ProgressButtons/ProgressButtonItem.js +1 -1
  571. package/build/dist/UI/Components/ProgressButtons/ProgressButtonItem.js.map +1 -1
  572. package/build/dist/UI/Components/SideMenu/SideMenu.js +4 -1
  573. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  574. package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js +3 -1
  575. package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js.map +1 -1
  576. package/build/dist/UI/Components/StatusPage/ResourceList.js +6 -6
  577. package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -1
  578. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +1 -1
  579. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
  580. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js +1 -1
  581. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js.map +1 -1
  582. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js +1 -1
  583. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js.map +1 -1
  584. package/build/dist/UI/Components/Workflow/ComponentsModal.js +2 -2
  585. package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
  586. package/build/dist/UI/Components/Workflow/StepTraceViewer.js +1 -1
  587. package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -1
  588. package/build/dist/UI/Utils/Navigation.js +66 -33
  589. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  590. package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js +7 -0
  591. package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js.map +1 -1
  592. package/build/dist/UI/Utils/TelemetryService.js +3 -2
  593. package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
  594. package/build/dist/Utils/LabelRuleImportExport.js +2 -0
  595. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  596. package/build/dist/Utils/MetricUnitUtil.js +77 -13
  597. package/build/dist/Utils/MetricUnitUtil.js.map +1 -1
  598. package/build/dist/Utils/Monitor/MetricValueFormatter.js +58 -13
  599. package/build/dist/Utils/Monitor/MetricValueFormatter.js.map +1 -1
  600. package/build/dist/Utils/Monitor/PlatformMetricUnitUtil.js +161 -0
  601. package/build/dist/Utils/Monitor/PlatformMetricUnitUtil.js.map +1 -0
  602. package/build/dist/Utils/Monitor/PlatformResourceIdentity.js +323 -0
  603. package/build/dist/Utils/Monitor/PlatformResourceIdentity.js.map +1 -0
  604. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.js +270 -0
  605. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.js.map +1 -0
  606. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +23 -0
  607. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
  608. package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js +61 -0
  609. package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js.map +1 -1
  610. package/build/dist/Utils/Telemetry/DatabaseServerEntityKeys.js +178 -0
  611. package/build/dist/Utils/Telemetry/DatabaseServerEntityKeys.js.map +1 -0
  612. package/build/dist/Utils/Telemetry/EntityKey.js +133 -0
  613. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  614. package/build/dist/Utils/ValueFormatter.js +15 -0
  615. package/build/dist/Utils/ValueFormatter.js.map +1 -1
  616. package/package.json +1 -1
  617. package/tsconfig.tests.json +7 -5
@@ -1,4 +1,8 @@
1
1
  import { DiscoveredNetworkDevice } from "../../../Models/DatabaseModels/NetworkDeviceDiscoveryScan";
2
+ import {
3
+ DiscoveredHostNetbiosStatus,
4
+ DiscoveredHostReverseDnsStatus,
5
+ } from "../../../Types/NetworkDevice/DiscoveredHostNamingStatus";
2
6
  import { normalizeDiscoveredHosts } from "../../../Utils/NetworkDiscovery/DiscoveredHostUtil";
3
7
  import {
4
8
  DiscoveredHostNaming,
@@ -642,3 +646,314 @@ describe("normalizeDiscoveredHosts — the NetBIOS name (issue #3677)", () => {
642
646
  expect(getDiscoveredHostDisplayName(normalized!, FULL_NAMES)).toBe("reg01");
643
647
  });
644
648
  });
649
+
650
+ /*
651
+ * OneUptime issue #3916 — why a host is unnamed.
652
+ *
653
+ * `dnsHostnameStatus` and `netbiosNameStatus` are short codes the probe
654
+ * stamps on a host that reverse DNS or NetBIOS left without a name. The
655
+ * Review dialog turns them into the sentence beside a bare address. Unlike
656
+ * the names above they are not chosen by the scanned network, but they come
657
+ * out of the same verbatim jsonb, so they get the same treatment: only an
658
+ * exact code survives, and anything else is DELETED, not blanked.
659
+ *
660
+ * Deleted matters for the same `in`-versus-truthiness reason as the names.
661
+ * It matters more for the explanation, because "this row carries a code" is
662
+ * what tells a still-sweeping scan's previous results apart from its fresh
663
+ * ones. A key left behind holding junk would make one reader say "a code"
664
+ * and another say "no code" about the same row.
665
+ */
666
+ describe("normalizeDiscoveredHosts — the naming status codes (issue #3916)", () => {
667
+ /*
668
+ * Values that are not a code, as the column can hold them. The other
669
+ * field's codes are added per test: a reverse-DNS code is junk in the
670
+ * NetBIOS field, and the reverse.
671
+ */
672
+ const NOT_A_CODE: Array<[string, unknown]> = [
673
+ ["an unknown string", "dnssec-bogus"],
674
+ ["an upper-case code", "TIMEOUT"],
675
+ ["a padded code", " no-reply "],
676
+ ["an underscored code", "no_record"],
677
+ ["the empty string", ""],
678
+ ["a prototype key", "constructor"],
679
+ ["another prototype key", "__proto__"],
680
+ ["markup", "<img src=x onerror=1>"],
681
+ ["a number", 3],
682
+ ["zero", 0],
683
+ ["an object", { code: "timeout" }],
684
+ ["an array holding a code", ["timeout"]],
685
+ ["true", true],
686
+ ["null", null],
687
+ ];
688
+
689
+ test.each(Object.values(DiscoveredHostReverseDnsStatus))(
690
+ "keeps the reverse-DNS code %p exactly as stored",
691
+ (code: DiscoveredHostReverseDnsStatus) => {
692
+ const [normalized] = normalizeDiscoveredHosts([
693
+ host({ dnsHostnameStatus: code }),
694
+ ]);
695
+
696
+ expect(normalized?.dnsHostnameStatus).toBe(code);
697
+ },
698
+ );
699
+
700
+ test.each(Object.values(DiscoveredHostNetbiosStatus))(
701
+ "keeps the NetBIOS code %p exactly as stored",
702
+ (code: DiscoveredHostNetbiosStatus) => {
703
+ const [normalized] = normalizeDiscoveredHosts([
704
+ host({ netbiosNameStatus: code }),
705
+ ]);
706
+
707
+ expect(normalized?.netbiosNameStatus).toBe(code);
708
+ },
709
+ );
710
+
711
+ test.each([
712
+ ...NOT_A_CODE,
713
+ ...Object.values(DiscoveredHostNetbiosStatus).map(
714
+ (code: string): [string, unknown] => {
715
+ return [`the NetBIOS code ${code}`, code];
716
+ },
717
+ ),
718
+ ])(
719
+ "deletes %s from the reverse-DNS field",
720
+ (_label: string, value: unknown) => {
721
+ const [normalized] = normalizeDiscoveredHosts([
722
+ host({
723
+ dnsHostnameStatus: value as DiscoveredHostReverseDnsStatus,
724
+ }),
725
+ ]);
726
+
727
+ expect(normalized).not.toHaveProperty("dnsHostnameStatus");
728
+ },
729
+ );
730
+
731
+ test.each([
732
+ ...NOT_A_CODE,
733
+ ...Object.values(DiscoveredHostReverseDnsStatus).map(
734
+ (code: string): [string, unknown] => {
735
+ return [`the reverse-DNS code ${code}`, code];
736
+ },
737
+ ),
738
+ ])("deletes %s from the NetBIOS field", (_label: string, value: unknown) => {
739
+ const [normalized] = normalizeDiscoveredHosts([
740
+ host({ netbiosNameStatus: value as DiscoveredHostNetbiosStatus }),
741
+ ]);
742
+
743
+ expect(normalized).not.toHaveProperty("netbiosNameStatus");
744
+ });
745
+
746
+ test("an explicitly undefined code is removed rather than kept as a key", () => {
747
+ const [normalized] = normalizeDiscoveredHosts([
748
+ host({ dnsHostnameStatus: undefined, netbiosNameStatus: undefined }),
749
+ ]);
750
+
751
+ expect(normalized).not.toHaveProperty("dnsHostnameStatus");
752
+ expect(normalized).not.toHaveProperty("netbiosNameStatus");
753
+ });
754
+
755
+ test("a host with no codes gains no keys", () => {
756
+ /*
757
+ * Named hosts, rows stored before the codes existed, and rows from an
758
+ * older probe all have neither key, and must still have neither: a
759
+ * normaliser that added them would change what `in` says about every
760
+ * row in every scan.
761
+ */
762
+ const [normalized] = normalizeDiscoveredHosts([
763
+ host({ snmpReachable: false }),
764
+ ]);
765
+
766
+ expect(normalized).toStrictEqual({
767
+ ipAddress: "10.0.0.1",
768
+ snmpReachable: false,
769
+ });
770
+ expect(Object.keys(normalized!).sort()).toEqual([
771
+ "ipAddress",
772
+ "snmpReachable",
773
+ ]);
774
+ });
775
+
776
+ test("the two codes are cleaned independently of each other", () => {
777
+ const [badDnsGoodNetbios, goodDnsBadNetbios] = normalizeDiscoveredHosts([
778
+ host({
779
+ dnsHostnameStatus: "TIMEOUT" as DiscoveredHostReverseDnsStatus,
780
+ netbiosNameStatus: DiscoveredHostNetbiosStatus.NoReply,
781
+ }),
782
+ host({
783
+ ipAddress: "10.0.0.2",
784
+ dnsHostnameStatus: DiscoveredHostReverseDnsStatus.Timeout,
785
+ netbiosNameStatus: 7 as unknown as DiscoveredHostNetbiosStatus,
786
+ }),
787
+ ]);
788
+
789
+ expect(badDnsGoodNetbios).not.toHaveProperty("dnsHostnameStatus");
790
+ expect(badDnsGoodNetbios?.netbiosNameStatus).toBe(
791
+ DiscoveredHostNetbiosStatus.NoReply,
792
+ );
793
+
794
+ expect(goodDnsBadNetbios?.dnsHostnameStatus).toBe(
795
+ DiscoveredHostReverseDnsStatus.Timeout,
796
+ );
797
+ expect(goodDnsBadNetbios).not.toHaveProperty("netbiosNameStatus");
798
+ });
799
+
800
+ test("the codes and the names are cleaned independently", () => {
801
+ /*
802
+ * A rejected PTR name must not take the code with it, and a rejected
803
+ * code must not take a good name with it. The code on the first row is
804
+ * exactly the one a probe stamps for a PTR answer that normalised away.
805
+ */
806
+ const [rejectedName, rejectedCode] = normalizeDiscoveredHosts([
807
+ host({
808
+ dnsHostname: "51.0.0.10.in-addr.arpa",
809
+ dnsHostnameStatus: DiscoveredHostReverseDnsStatus.UnusableName,
810
+ }),
811
+ host({
812
+ ipAddress: "10.0.0.2",
813
+ netbiosName: "REG01",
814
+ netbiosNameStatus: "no reply" as DiscoveredHostNetbiosStatus,
815
+ }),
816
+ ]);
817
+
818
+ expect(rejectedName).not.toHaveProperty("dnsHostname");
819
+ expect(rejectedName?.dnsHostnameStatus).toBe(
820
+ DiscoveredHostReverseDnsStatus.UnusableName,
821
+ );
822
+
823
+ expect(rejectedCode?.netbiosName).toBe("reg01");
824
+ expect(rejectedCode).not.toHaveProperty("netbiosNameStatus");
825
+ });
826
+
827
+ test("a code on a host that has a name is kept, not judged", () => {
828
+ /*
829
+ * This function whitelists values; it does not decide what a row means.
830
+ * A valid code on a named row is harmless, because the explanation is
831
+ * only ever shown for a row whose name line is its address, and deleting
832
+ * it here would be a second copy of that rule.
833
+ */
834
+ const [normalized] = normalizeDiscoveredHosts([
835
+ host({
836
+ netbiosName: "REG01",
837
+ dnsHostnameStatus: DiscoveredHostReverseDnsStatus.NoRecord,
838
+ }),
839
+ ]);
840
+
841
+ expect(normalized?.dnsHostnameStatus).toBe(
842
+ DiscoveredHostReverseDnsStatus.NoRecord,
843
+ );
844
+ });
845
+
846
+ test("normalising is stable when applied twice, key for key", () => {
847
+ /*
848
+ * toStrictEqual, so a key left behind as `undefined` would fail it, and
849
+ * the key lists too, so a failure names the key.
850
+ */
851
+ const once: Array<DiscoveredNetworkDevice> = normalizeDiscoveredHosts([
852
+ host({
853
+ dnsHostnameStatus: DiscoveredHostReverseDnsStatus.ServerFailure,
854
+ netbiosNameStatus: DiscoveredHostNetbiosStatus.SkippedGlobalProbe,
855
+ }),
856
+ host({
857
+ ipAddress: "10.0.0.2",
858
+ dnsHostnameStatus: "server_failure" as DiscoveredHostReverseDnsStatus,
859
+ netbiosNameStatus: {} as unknown as DiscoveredHostNetbiosStatus,
860
+ }),
861
+ host({ ipAddress: "10.0.0.3", dnsHostnameStatus: undefined }),
862
+ ]);
863
+ const twice: Array<DiscoveredNetworkDevice> =
864
+ normalizeDiscoveredHosts(once);
865
+
866
+ expect(twice).toStrictEqual(once);
867
+ expect(
868
+ twice.map((entry: DiscoveredNetworkDevice): Array<string> => {
869
+ return Object.keys(entry).sort();
870
+ }),
871
+ ).toEqual([
872
+ ["dnsHostnameStatus", "ipAddress", "netbiosNameStatus"],
873
+ ["ipAddress"],
874
+ ["ipAddress"],
875
+ ]);
876
+ });
877
+
878
+ test("the codes survive a JSON round trip of the normalised rows", () => {
879
+ /*
880
+ * The normalised rows are what the server's auto-import engine works
881
+ * from and what a re-serialised response carries. The codes are plain
882
+ * strings, so nothing is lost or reshaped on the way.
883
+ */
884
+ const once: Array<DiscoveredNetworkDevice> = normalizeDiscoveredHosts([
885
+ host({
886
+ dnsHostnameStatus: DiscoveredHostReverseDnsStatus.SkippedNoResolver,
887
+ netbiosNameStatus: DiscoveredHostNetbiosStatus.SkippedHostCap,
888
+ }),
889
+ ]);
890
+ const roundTripped: Array<DiscoveredNetworkDevice> = JSON.parse(
891
+ JSON.stringify(once),
892
+ ) as Array<DiscoveredNetworkDevice>;
893
+
894
+ expect(normalizeDiscoveredHosts(roundTripped)).toStrictEqual(once);
895
+ });
896
+
897
+ test("the row the caller passed in is not changed", () => {
898
+ /*
899
+ * The dialog normalises the scan's stored array on every render. If
900
+ * this deleted keys from the rows it was handed, the stored copy would
901
+ * change underneath the next reader.
902
+ */
903
+ const raw: DiscoveredNetworkDevice = host({
904
+ dnsHostnameStatus: "junk" as DiscoveredHostReverseDnsStatus,
905
+ netbiosNameStatus: DiscoveredHostNetbiosStatus.NoReply,
906
+ });
907
+
908
+ const [normalized] = normalizeDiscoveredHosts([raw]);
909
+
910
+ expect(normalized).not.toBe(raw);
911
+ expect(normalized).not.toHaveProperty("dnsHostnameStatus");
912
+ expect(raw.dnsHostnameStatus).toBe("junk");
913
+ expect(raw.netbiosNameStatus).toBe(DiscoveredHostNetbiosStatus.NoReply);
914
+ });
915
+
916
+ test("a row marked registered because of another row keeps its codes", () => {
917
+ /*
918
+ * The registered-address pass rebuilds the rows it flips. The codes on
919
+ * those rows must come through it.
920
+ */
921
+ const result: Array<DiscoveredNetworkDevice> = normalizeDiscoveredHosts([
922
+ host({
923
+ ipAddress: "10.0.0.40",
924
+ isAlreadyRegistered: false,
925
+ dnsHostnameStatus: DiscoveredHostReverseDnsStatus.Refused,
926
+ netbiosNameStatus: DiscoveredHostNetbiosStatus.NoUsableName,
927
+ }),
928
+ host({ ipAddress: "10.0.0.40", isAlreadyRegistered: true }),
929
+ ]);
930
+
931
+ expect(result[0]).toStrictEqual({
932
+ ipAddress: "10.0.0.40",
933
+ isAlreadyRegistered: true,
934
+ dnsHostnameStatus: DiscoveredHostReverseDnsStatus.Refused,
935
+ netbiosNameStatus: DiscoveredHostNetbiosStatus.NoUsableName,
936
+ });
937
+ });
938
+
939
+ test("cleaning the codes leaves the row's other fields alone", () => {
940
+ const [normalized] = normalizeDiscoveredHosts([
941
+ {
942
+ ipAddress: " 10.16.42.51 ",
943
+ snmpReachable: false,
944
+ isAlreadyRegistered: false,
945
+ sysDescr: "KDS terminal",
946
+ dnsHostnameStatus: DiscoveredHostReverseDnsStatus.Timeout,
947
+ netbiosNameStatus: "?" as DiscoveredHostNetbiosStatus,
948
+ },
949
+ ]);
950
+
951
+ expect(normalized).toStrictEqual({
952
+ ipAddress: "10.16.42.51",
953
+ snmpReachable: false,
954
+ isAlreadyRegistered: false,
955
+ sysDescr: "KDS terminal",
956
+ dnsHostnameStatus: DiscoveredHostReverseDnsStatus.Timeout,
957
+ });
958
+ });
959
+ });
@@ -7,6 +7,16 @@ import {
7
7
  getDiscoveredHostDisplayName,
8
8
  } from "../../../Utils/NetworkDiscovery/DiscoveredDeviceBuilder";
9
9
  import { normalizeDiscoveredHosts } from "../../../Utils/NetworkDiscovery/DiscoveredHostUtil";
10
+ import {
11
+ DiscoveredHostNamingExplanation,
12
+ REVERSE_DNS_NOT_RECORDED_SENTENCE,
13
+ explainUnnamedDiscoveredHost,
14
+ } from "../../../Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis";
15
+ import { DiscoveryScanStatus } from "../../../Utils/NetworkDiscovery/DiscoveryScanStatus";
16
+ import {
17
+ DiscoveredHostNetbiosStatus,
18
+ DiscoveredHostReverseDnsStatus,
19
+ } from "../../../Types/NetworkDevice/DiscoveredHostNamingStatus";
10
20
  import NetworkDevice from "../../../Models/DatabaseModels/NetworkDevice";
11
21
  import NetworkDeviceDiscoveryScan, {
12
22
  DiscoveredNetworkDevice,
@@ -521,6 +531,13 @@ describe("Reverse DNS, probe payload to created NetworkDevice", () => {
521
531
  * a root dot is stripped, a padded address is trimmed, a numeric sysName
522
532
  * is blanked, and a rejected PTR key is deleted. A payload that was
523
533
  * already clean would make this test pass no matter what.
534
+ *
535
+ * The last two rows also carry the naming status codes of issue #3916,
536
+ * one valid and one junk each, so the first pass deletes a code from
537
+ * each field and keeps one in each. Those keys decide whether a row
538
+ * reads as "the naming passes ran" in the Review dialog, so a code that
539
+ * came back as `undefined` on the second pass would be exactly the
540
+ * split reading this test exists for.
524
541
  */
525
542
  const payload: Array<unknown> = [
526
543
  {
@@ -528,11 +545,18 @@ describe("Reverse DNS, probe payload to created NetworkDevice", () => {
528
545
  snmpReachable: false,
529
546
  dnsHostname: "hq-router-01.corp.example.net.",
530
547
  },
531
- { ipAddress: " 10.18.166.53 ", sysName: 42 },
548
+ {
549
+ ipAddress: " 10.18.166.53 ",
550
+ sysName: 42,
551
+ dnsHostnameStatus: "TIMEOUT",
552
+ netbiosNameStatus: DiscoveredHostNetbiosStatus.NoReply,
553
+ },
532
554
  {
533
555
  ipAddress: "10.18.166.54",
534
556
  snmpReachable: false,
535
557
  dnsHostname: "in-addr.arpa",
558
+ dnsHostnameStatus: DiscoveredHostReverseDnsStatus.UnusableName,
559
+ netbiosNameStatus: 7,
536
560
  },
537
561
  ];
538
562
 
@@ -567,6 +591,32 @@ describe("Reverse DNS, probe payload to created NetworkDevice", () => {
567
591
  expect(once[2]).not.toHaveProperty("dnsHostname");
568
592
  expect(twice[2]).not.toHaveProperty("dnsHostname");
569
593
 
594
+ /*
595
+ * The exact keys each row ends with, the two naming status codes
596
+ * included: the junk ones gone, the valid ones kept, and no row gaining
597
+ * a key it did not arrive with.
598
+ */
599
+ expect(
600
+ once.map((host: DiscoveredNetworkDevice): Array<string> => {
601
+ return Object.keys(host).sort();
602
+ }),
603
+ ).toEqual([
604
+ ["dnsHostname", "ipAddress", "snmpReachable"],
605
+ ["ipAddress", "netbiosNameStatus", "sysName"],
606
+ ["dnsHostnameStatus", "ipAddress", "snmpReachable"],
607
+ ]);
608
+
609
+ for (const pass of [once, twice]) {
610
+ expect(pass[1]).not.toHaveProperty("dnsHostnameStatus");
611
+ expect(pass[1]?.netbiosNameStatus).toBe(
612
+ DiscoveredHostNetbiosStatus.NoReply,
613
+ );
614
+ expect(pass[2]?.dnsHostnameStatus).toBe(
615
+ DiscoveredHostReverseDnsStatus.UnusableName,
616
+ );
617
+ expect(pass[2]).not.toHaveProperty("netbiosNameStatus");
618
+ }
619
+
570
620
  const namesOnce: Array<string> = once.map(
571
621
  (host: DiscoveredNetworkDevice): string => {
572
622
  return buildDeviceName(host, FULL_NAMES);
@@ -1703,3 +1753,288 @@ describe("NetBIOS names, probe payload to created NetworkDevice", () => {
1703
1753
  expect(retry.dnsName).toBeUndefined();
1704
1754
  });
1705
1755
  });
1756
+
1757
+ /*
1758
+ * OneUptime issue #3916 — why a host is listed by its address.
1759
+ *
1760
+ * The probe now stamps a short code on each host it could not name: what
1761
+ * the reverse-DNS lookup came back with, and what NetBIOS did. The Review
1762
+ * dialog turns those into the sentence beside the address. This block runs
1763
+ * the codes down the same path the names take — payload, jsonb,
1764
+ * normalizeDiscoveredHosts, then the row's name and its explanation — and
1765
+ * pins the joints:
1766
+ *
1767
+ * - the normaliser and the explanation read the codes the same way, so a
1768
+ * junk code cannot mean "a code" to one and "no code" to the other;
1769
+ * - the explanation is shown on exactly the rows whose name is their
1770
+ * address;
1771
+ * - the codes never change what a host is called or what device is built.
1772
+ */
1773
+ describe("Naming status codes, probe payload to the Review row's explanation", () => {
1774
+ /*
1775
+ * The scan the way the dialog really hands it over: through the model's
1776
+ * serializer and back, so its status and settings are what a stored row
1777
+ * yields.
1778
+ */
1779
+ function scanThroughSerializer(settings: {
1780
+ isSnmpEnabled: boolean;
1781
+ isNetbiosLookupEnabled: boolean;
1782
+ }): NetworkDeviceDiscoveryScan {
1783
+ const scan: NetworkDeviceDiscoveryScan = new NetworkDeviceDiscoveryScan();
1784
+ scan.status = DiscoveryScanStatus.Completed;
1785
+ scan.isSnmpEnabled = settings.isSnmpEnabled;
1786
+ scan.isNetbiosLookupEnabled = settings.isNetbiosLookupEnabled;
1787
+
1788
+ const wire: JSONObject = JSON.parse(
1789
+ JSON.stringify(
1790
+ DatabaseBaseModel.toJSON(scan, NetworkDeviceDiscoveryScan),
1791
+ ),
1792
+ ) as JSONObject;
1793
+
1794
+ return DatabaseBaseModel.fromJSONObject(wire, NetworkDeviceDiscoveryScan);
1795
+ }
1796
+
1797
+ /*
1798
+ * The reporter's scan: ping only. NetBIOS names on, the wizard's default,
1799
+ * since the issue does not say.
1800
+ */
1801
+ const REPORTERS_SCAN: NetworkDeviceDiscoveryScan = scanThroughSerializer({
1802
+ isSnmpEnabled: false,
1803
+ isNetbiosLookupEnabled: true,
1804
+ });
1805
+
1806
+ /*
1807
+ * The reporter's kitchen displays as a current probe would send them,
1808
+ * plus the rows a probe of another version could leave in the column:
1809
+ *
1810
+ * .51 named by PTR: a named host carries no codes
1811
+ * .52 the DNS server answered: no PTR record
1812
+ * .53 the DNS server did not answer in time
1813
+ * .54 the DNS server answered SERVFAIL
1814
+ * .55 a PTR answer that normalised away (an older probe stored the name
1815
+ * too), so the host is unnamed, with the code that says why
1816
+ * .56 a code from a newer probe, which this build does not know
1817
+ * .57 a row from an older probe: no codes at all
1818
+ * .58 a reverse-DNS code on a host NetBIOS then named
1819
+ */
1820
+ const PAYLOAD: Array<unknown> = [
1821
+ {
1822
+ ipAddress: "10.16.42.51",
1823
+ snmpReachable: false,
1824
+ dnsHostname: "WB0024KDS02.corp.example.com",
1825
+ },
1826
+ {
1827
+ ipAddress: "10.16.42.52",
1828
+ snmpReachable: false,
1829
+ dnsHostnameStatus: "no-record",
1830
+ netbiosNameStatus: "no-reply",
1831
+ },
1832
+ {
1833
+ ipAddress: "10.16.42.53",
1834
+ snmpReachable: false,
1835
+ dnsHostnameStatus: "timeout",
1836
+ netbiosNameStatus: "no-reply",
1837
+ },
1838
+ {
1839
+ ipAddress: "10.16.42.54",
1840
+ snmpReachable: false,
1841
+ dnsHostnameStatus: "server-failure",
1842
+ netbiosNameStatus: "no-reply",
1843
+ },
1844
+ {
1845
+ ipAddress: "10.16.42.55",
1846
+ snmpReachable: false,
1847
+ dnsHostname: "55.42.16.10.in-addr.arpa",
1848
+ dnsHostnameStatus: "unusable-name",
1849
+ netbiosNameStatus: "no-usable-name",
1850
+ },
1851
+ {
1852
+ ipAddress: "10.16.42.56",
1853
+ snmpReachable: false,
1854
+ dnsHostnameStatus: "dnssec-bogus",
1855
+ netbiosNameStatus: "no-reply",
1856
+ },
1857
+ { ipAddress: "10.16.42.57", snmpReachable: false },
1858
+ {
1859
+ ipAddress: "10.16.42.58",
1860
+ snmpReachable: false,
1861
+ dnsHostnameStatus: "no-record",
1862
+ netbiosName: "WB0024KDS08",
1863
+ },
1864
+ ];
1865
+
1866
+ function explanationsOf(
1867
+ hosts: Array<DiscoveredNetworkDevice>,
1868
+ ): Array<DiscoveredHostNamingExplanation | undefined> {
1869
+ return hosts.map(
1870
+ (
1871
+ host: DiscoveredNetworkDevice,
1872
+ ): DiscoveredHostNamingExplanation | undefined => {
1873
+ return explainUnnamedDiscoveredHost({
1874
+ host: host,
1875
+ scan: REPORTERS_SCAN,
1876
+ isGlobalProbe: false,
1877
+ });
1878
+ },
1879
+ );
1880
+ }
1881
+
1882
+ it("keeps the scan's settings and status through the serializer", () => {
1883
+ expect(REPORTERS_SCAN.status).toBe(DiscoveryScanStatus.Completed);
1884
+ expect(REPORTERS_SCAN.isSnmpEnabled).toBe(false);
1885
+ expect(REPORTERS_SCAN.isNetbiosLookupEnabled).toBe(true);
1886
+ });
1887
+
1888
+ it("stores every code a current probe sends, and drops the one this build does not know", () => {
1889
+ const hosts: Array<DiscoveredNetworkDevice> = hostsFromPayload(PAYLOAD);
1890
+
1891
+ expect(
1892
+ hosts.map((host: DiscoveredNetworkDevice): Array<unknown> => {
1893
+ return [host.dnsHostnameStatus, host.netbiosNameStatus];
1894
+ }),
1895
+ ).toEqual([
1896
+ [undefined, undefined],
1897
+ [
1898
+ DiscoveredHostReverseDnsStatus.NoRecord,
1899
+ DiscoveredHostNetbiosStatus.NoReply,
1900
+ ],
1901
+ [
1902
+ DiscoveredHostReverseDnsStatus.Timeout,
1903
+ DiscoveredHostNetbiosStatus.NoReply,
1904
+ ],
1905
+ [
1906
+ DiscoveredHostReverseDnsStatus.ServerFailure,
1907
+ DiscoveredHostNetbiosStatus.NoReply,
1908
+ ],
1909
+ [
1910
+ DiscoveredHostReverseDnsStatus.UnusableName,
1911
+ DiscoveredHostNetbiosStatus.NoUsableName,
1912
+ ],
1913
+ [undefined, DiscoveredHostNetbiosStatus.NoReply],
1914
+ [undefined, undefined],
1915
+ [DiscoveredHostReverseDnsStatus.NoRecord, undefined],
1916
+ ]);
1917
+
1918
+ // Deleted, not left behind holding undefined.
1919
+ expect(hosts[5]).not.toHaveProperty("dnsHostnameStatus");
1920
+ expect(hosts[6]).not.toHaveProperty("dnsHostnameStatus");
1921
+ expect(hosts[6]).not.toHaveProperty("netbiosNameStatus");
1922
+ });
1923
+
1924
+ it("explains each unnamed display by its own lookup, and the named ones not at all", () => {
1925
+ const explanations: Array<DiscoveredHostNamingExplanation | undefined> =
1926
+ explanationsOf(hostsFromPayload(PAYLOAD));
1927
+
1928
+ // Named by PTR, and by NetBIOS: no hint.
1929
+ expect(explanations[0]).toBeUndefined();
1930
+ expect(explanations[7]).toBeUndefined();
1931
+
1932
+ /*
1933
+ * The three the issue could not tell apart. The exact sentences are
1934
+ * pinned in DiscoveredHostNamingDiagnosis.test.ts; this only checks that
1935
+ * each row reached the one for its own code.
1936
+ */
1937
+ expect(explanations[1]?.text).toContain("no PTR record");
1938
+ expect(explanations[2]?.text).toContain("did not answer in time");
1939
+ expect(explanations[3]?.text).toContain("SERVFAIL");
1940
+ expect(explanations[4]?.text).toContain("not a valid hostname");
1941
+
1942
+ for (const index of [1, 2, 3, 4]) {
1943
+ expect(explanations[index]?.text).not.toContain(
1944
+ REVERSE_DNS_NOT_RECORDED_SENTENCE,
1945
+ );
1946
+ }
1947
+
1948
+ /*
1949
+ * The unknown code and the older probe's row both say only that no name
1950
+ * was recorded, and say it the same way.
1951
+ */
1952
+ expect(explanations[5]?.text).toContain(REVERSE_DNS_NOT_RECORDED_SENTENCE);
1953
+ expect(explanations[6]?.text).toContain(REVERSE_DNS_NOT_RECORDED_SENTENCE);
1954
+ expect(explanations[5]?.text).not.toContain("PTR");
1955
+ expect(explanations[6]?.text).not.toContain("PTR");
1956
+ });
1957
+
1958
+ it("explains a row the same from the raw stored jsonb as from the normalised row", () => {
1959
+ /*
1960
+ * The explanation reads the codes through the same whitelist the
1961
+ * normaliser applies, so handing it an un-normalised row changes
1962
+ * nothing. If the two whitelists ever drifted, the unknown-code row
1963
+ * would be where it showed.
1964
+ */
1965
+ expect(explanationsOf(storedScanResults(PAYLOAD))).toStrictEqual(
1966
+ explanationsOf(hostsFromPayload(PAYLOAD)),
1967
+ );
1968
+ });
1969
+
1970
+ it("shows the explanation on exactly the rows named by their address", () => {
1971
+ const hosts: Array<DiscoveredNetworkDevice> = hostsFromPayload(PAYLOAD);
1972
+ const explanations: Array<DiscoveredHostNamingExplanation | undefined> =
1973
+ explanationsOf(hosts);
1974
+
1975
+ hosts.forEach((host: DiscoveredNetworkDevice, index: number) => {
1976
+ expect(Boolean(explanations[index])).toBe(
1977
+ buildDeviceName(host, FULL_NAMES) === host.ipAddress,
1978
+ );
1979
+ });
1980
+ });
1981
+
1982
+ it("names and builds the same devices with the codes as without them", () => {
1983
+ /*
1984
+ * The codes explain a name; they must never choose one. The same payload
1985
+ * with every code stripped has to import identically.
1986
+ */
1987
+ const withoutCodes: Array<unknown> = PAYLOAD.map(
1988
+ (entry: unknown): unknown => {
1989
+ const copy: JSONObject = { ...(entry as JSONObject) };
1990
+ delete copy["dnsHostnameStatus"];
1991
+ delete copy["netbiosNameStatus"];
1992
+ return copy;
1993
+ },
1994
+ );
1995
+
1996
+ expect(namesFromPayload(PAYLOAD)).toEqual(namesFromPayload(withoutCodes));
1997
+ expect(namesFromPayload(PAYLOAD)).toEqual([
1998
+ "WB0024KDS02.corp.example.com",
1999
+ "10.16.42.52",
2000
+ "10.16.42.53",
2001
+ "10.16.42.54",
2002
+ "10.16.42.55",
2003
+ "10.16.42.56",
2004
+ "10.16.42.57",
2005
+ "wb0024kds08",
2006
+ ]);
2007
+
2008
+ expect(deviceHostnames(devicesFromPayload(PAYLOAD))).toEqual(
2009
+ deviceHostnames(devicesFromPayload(withoutCodes)),
2010
+ );
2011
+ });
2012
+
2013
+ it("never carries a code into the created device", () => {
2014
+ /*
2015
+ * A code is a note about one scan's lookup, not a property of the
2016
+ * device. Nothing of it may reach the NetworkDevice row an import
2017
+ * creates.
2018
+ */
2019
+ for (const device of devicesFromPayload(PAYLOAD)) {
2020
+ const stored: string = JSON.stringify(
2021
+ DatabaseBaseModel.toJSON(device, NetworkDevice),
2022
+ );
2023
+
2024
+ // The serialised device is real: it carries the address it dials.
2025
+ expect(stored).toContain(`"${device.hostname}"`);
2026
+
2027
+ for (const forbidden of [
2028
+ "dnsHostnameStatus",
2029
+ "netbiosNameStatus",
2030
+ "no-record",
2031
+ "server-failure",
2032
+ "unusable-name",
2033
+ "no-reply",
2034
+ "no-usable-name",
2035
+ ]) {
2036
+ expect(stored).not.toContain(forbidden);
2037
+ }
2038
+ }
2039
+ });
2040
+ });