@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
@@ -0,0 +1,401 @@
1
+ import {
2
+ DiscoveredHostNetbiosStatus,
3
+ DiscoveredHostReverseDnsStatus,
4
+ readDiscoveredHostNetbiosStatus,
5
+ readDiscoveredHostReverseDnsStatus,
6
+ } from "../../../Types/NetworkDevice/DiscoveredHostNamingStatus";
7
+ import { describe, expect, test } from "@jest/globals";
8
+
9
+ /*
10
+ * The per-host "why is this host unnamed" codes (OneUptime issue #3916), and
11
+ * the two readers every consumer goes through.
12
+ *
13
+ * The codes are PERSISTED: the probe stamps them into the scan's
14
+ * `discoveredDevices` jsonb, and rows written today are read by every
15
+ * dashboard build from now on. So the spellings are pinned here as literals
16
+ * rather than read back out of the enum. A test that compared the enum with
17
+ * itself would stay green through a rename, and a rename is exactly the
18
+ * change that silently turns every stored code into "no code".
19
+ *
20
+ * The readers are the other half of the contract. The column is written
21
+ * verbatim from the probe's payload, so the declared type says what a probe
22
+ * SHOULD send, not what is stored. A reader that let anything else through
23
+ * would hand the dashboard a value it has no sentence for. Two cases matter
24
+ * most:
25
+ *
26
+ * - A near miss, like "No-Record" or "timeout ". It looks like a code to a
27
+ * person, but the copy table is keyed by exact strings. Accepting it would
28
+ * need a normalisation step nothing else does, and an unknown key would
29
+ * then look up `undefined` copy.
30
+ * - A prototype key, like "constructor". A reader built on `value in
31
+ * SOME_OBJECT` would accept it, and the copy lookup would then return a
32
+ * FUNCTION, which ends up in the tooltip as its source text.
33
+ *
34
+ * Everything that is not exactly a code reads as undefined, which every
35
+ * consumer already treats as "this row carries no code".
36
+ */
37
+
38
+ const REVERSE_DNS_CODES: Array<string> = [
39
+ "no-record",
40
+ "unusable-name",
41
+ "timeout",
42
+ "server-failure",
43
+ "refused",
44
+ "unreachable",
45
+ "failed",
46
+ "skipped-time-budget",
47
+ "skipped-no-resolver",
48
+ ];
49
+
50
+ const NETBIOS_CODES: Array<string> = [
51
+ "no-reply",
52
+ "no-usable-name",
53
+ "send-failed",
54
+ "skipped",
55
+ "skipped-host-cap",
56
+ "skipped-ineligible-address",
57
+ "skipped-global-probe",
58
+ ];
59
+
60
+ /*
61
+ * Every value that is not a string, as jsonb and a hand-written API call
62
+ * can deliver them, plus the JavaScript values no JSON can hold. The readers
63
+ * accept `unknown` because of these.
64
+ */
65
+ const NON_STRING_VALUES: Array<[string, unknown]> = [
66
+ ["undefined", undefined],
67
+ ["null", null],
68
+ ["zero", 0],
69
+ ["a positive number", 7],
70
+ ["a negative number", -1],
71
+ ["NaN", NaN],
72
+ ["Infinity", Infinity],
73
+ ["true", true],
74
+ ["false", false],
75
+ ["an empty object", {}],
76
+ ["an empty array", []],
77
+ ["an array holding a code", ["timeout"]],
78
+ ["an array holding a NetBIOS code", ["no-reply"]],
79
+ ["an object wrapping a code", { value: "timeout" }],
80
+ ["a String object", new String("timeout")],
81
+ [
82
+ "an object whose toString is a code",
83
+ {
84
+ toString: (): string => {
85
+ return "timeout";
86
+ },
87
+ },
88
+ ],
89
+ ["a symbol", Symbol("timeout")],
90
+ ["a bigint", BigInt(1)],
91
+ [
92
+ "a function",
93
+ (): string => {
94
+ return "timeout";
95
+ },
96
+ ],
97
+ ["a date", new Date(0)],
98
+ ];
99
+
100
+ /*
101
+ * Strings that are not codes. The prototype keys are listed separately
102
+ * below.
103
+ */
104
+ const JUNK_STRINGS: Array<[string, string]> = [
105
+ ["the empty string", ""],
106
+ ["a single space", " "],
107
+ ["a sentence", "the DNS server timed out"],
108
+ ["markup", "<img src=x onerror=1>"],
109
+ ["a raw Node error code", "ENOTFOUND"],
110
+ ["a raw DNS rcode", "SERVFAIL"],
111
+ ["a hostname", "kds-01.corp.example.com"],
112
+ ["an address", "10.16.42.51"],
113
+ ];
114
+
115
+ const PROTOTYPE_KEYS: Array<string> = [
116
+ "constructor",
117
+ "__proto__",
118
+ "toString",
119
+ "valueOf",
120
+ "hasOwnProperty",
121
+ "isPrototypeOf",
122
+ "propertyIsEnumerable",
123
+ "toLocaleString",
124
+ "prototype",
125
+ "__defineGetter__",
126
+ ];
127
+
128
+ /*
129
+ * The near misses a person would read as a code: every spelling here is one
130
+ * edit away from a real one. A one-word code has no hyphen to swap, so the
131
+ * spellings that come out identical to the code itself are dropped.
132
+ */
133
+ function nearMissesOf(code: string): Array<string> {
134
+ const camelCase: string = code.replace(
135
+ /-([a-z])/g,
136
+ (_match: string, letter: string): string => {
137
+ return letter.toUpperCase();
138
+ },
139
+ );
140
+
141
+ return [
142
+ code.toUpperCase(),
143
+ code.charAt(0).toUpperCase() + code.slice(1),
144
+ ` ${code}`,
145
+ `${code} `,
146
+ `\t${code}\n`,
147
+ `${code}\u0000`,
148
+ code.replace(/-/g, "_"),
149
+ code.replace(/-/g, " "),
150
+ camelCase,
151
+ // The enum KEY spelling, e.g. "NoRecord" for "no-record".
152
+ camelCase.charAt(0).toUpperCase() + camelCase.slice(1),
153
+ `${code}s`,
154
+ code.slice(0, -1),
155
+ `"${code}"`,
156
+ ].filter((nearMiss: string): boolean => {
157
+ return nearMiss !== code;
158
+ });
159
+ }
160
+
161
+ describe("DiscoveredHostReverseDnsStatus", () => {
162
+ test("holds exactly the persisted codes, spelled as they are stored", () => {
163
+ expect(Object.values(DiscoveredHostReverseDnsStatus).sort()).toEqual(
164
+ [...REVERSE_DNS_CODES].sort(),
165
+ );
166
+ });
167
+
168
+ test.each([
169
+ [DiscoveredHostReverseDnsStatus.NoRecord, "no-record"],
170
+ [DiscoveredHostReverseDnsStatus.UnusableName, "unusable-name"],
171
+ [DiscoveredHostReverseDnsStatus.Timeout, "timeout"],
172
+ [DiscoveredHostReverseDnsStatus.ServerFailure, "server-failure"],
173
+ [DiscoveredHostReverseDnsStatus.Refused, "refused"],
174
+ [DiscoveredHostReverseDnsStatus.Unreachable, "unreachable"],
175
+ [DiscoveredHostReverseDnsStatus.Failed, "failed"],
176
+ [DiscoveredHostReverseDnsStatus.SkippedTimeBudget, "skipped-time-budget"],
177
+ [DiscoveredHostReverseDnsStatus.SkippedNoResolver, "skipped-no-resolver"],
178
+ ])("%s is stored as %p", (member: string, stored: string) => {
179
+ expect(member).toBe(stored);
180
+ });
181
+ });
182
+
183
+ describe("DiscoveredHostNetbiosStatus", () => {
184
+ test("holds exactly the persisted codes, spelled as they are stored", () => {
185
+ expect(Object.values(DiscoveredHostNetbiosStatus).sort()).toEqual(
186
+ [...NETBIOS_CODES].sort(),
187
+ );
188
+ });
189
+
190
+ test.each([
191
+ [DiscoveredHostNetbiosStatus.NoReply, "no-reply"],
192
+ [DiscoveredHostNetbiosStatus.NoUsableName, "no-usable-name"],
193
+ [DiscoveredHostNetbiosStatus.SendFailed, "send-failed"],
194
+ [DiscoveredHostNetbiosStatus.Skipped, "skipped"],
195
+ [DiscoveredHostNetbiosStatus.SkippedHostCap, "skipped-host-cap"],
196
+ [
197
+ DiscoveredHostNetbiosStatus.SkippedIneligibleAddress,
198
+ "skipped-ineligible-address",
199
+ ],
200
+ [DiscoveredHostNetbiosStatus.SkippedGlobalProbe, "skipped-global-probe"],
201
+ ])("%s is stored as %p", (member: string, stored: string) => {
202
+ expect(member).toBe(stored);
203
+ });
204
+ });
205
+
206
+ describe("the two code sets", () => {
207
+ /*
208
+ * No code means one thing in one field and something else in the other.
209
+ * If a spelling were shared, a probe that wrote it to the wrong field would
210
+ * get a plausible but wrong sentence instead of the "no code" fallback.
211
+ */
212
+ test("share no spelling", () => {
213
+ const reverseDnsCodes: Set<string> = new Set<string>(
214
+ Object.values(DiscoveredHostReverseDnsStatus),
215
+ );
216
+
217
+ for (const code of Object.values(DiscoveredHostNetbiosStatus)) {
218
+ expect(reverseDnsCodes.has(code)).toBe(false);
219
+ }
220
+ });
221
+
222
+ /*
223
+ * Short kebab-case: the column can hold tens of thousands of hosts, and
224
+ * each code is repeated once per unnamed host. Anything longer, or with
225
+ * spaces or capitals, is a sentence that has slipped into the payload.
226
+ */
227
+ test.each([
228
+ ...Object.values(DiscoveredHostReverseDnsStatus),
229
+ ...Object.values(DiscoveredHostNetbiosStatus),
230
+ ])("%p is short lower-case kebab-case", (code: string) => {
231
+ expect(code).toMatch(/^[a-z]+(?:-[a-z]+)*$/);
232
+ expect(code.length).toBeLessThanOrEqual(32);
233
+ });
234
+ });
235
+
236
+ describe("readDiscoveredHostReverseDnsStatus", () => {
237
+ test.each(Object.values(DiscoveredHostReverseDnsStatus))(
238
+ "reads the exact code %p as itself",
239
+ (code: DiscoveredHostReverseDnsStatus) => {
240
+ expect(readDiscoveredHostReverseDnsStatus(code)).toBe(code);
241
+ },
242
+ );
243
+
244
+ test.each(REVERSE_DNS_CODES)(
245
+ "reads the literal %p as the matching enum member",
246
+ (literal: string) => {
247
+ /*
248
+ * The value comes out of JSON as a plain string, never as an enum
249
+ * member, so this is the case that happens in production.
250
+ */
251
+ const stored: unknown = JSON.parse(JSON.stringify(literal));
252
+
253
+ expect(readDiscoveredHostReverseDnsStatus(stored)).toBe(literal);
254
+ },
255
+ );
256
+
257
+ test.each(REVERSE_DNS_CODES)(
258
+ "rejects every near miss of %p",
259
+ (code: string) => {
260
+ // Enough spellings survive the filter for this to test something.
261
+ expect(nearMissesOf(code).length).toBeGreaterThanOrEqual(10);
262
+
263
+ for (const nearMiss of nearMissesOf(code)) {
264
+ expect(readDiscoveredHostReverseDnsStatus(nearMiss)).toBeUndefined();
265
+ }
266
+ },
267
+ );
268
+
269
+ test.each(NON_STRING_VALUES)(
270
+ "rejects %s",
271
+ (_label: string, value: unknown) => {
272
+ expect(readDiscoveredHostReverseDnsStatus(value)).toBeUndefined();
273
+ },
274
+ );
275
+
276
+ test.each(JUNK_STRINGS)("rejects %s", (_label: string, value: string) => {
277
+ expect(readDiscoveredHostReverseDnsStatus(value)).toBeUndefined();
278
+ });
279
+
280
+ test.each(PROTOTYPE_KEYS)("rejects the prototype key %p", (key: string) => {
281
+ expect(readDiscoveredHostReverseDnsStatus(key)).toBeUndefined();
282
+ });
283
+
284
+ test.each(Object.values(DiscoveredHostNetbiosStatus))(
285
+ "rejects the NetBIOS code %p",
286
+ (code: string) => {
287
+ /*
288
+ * A probe that stamped a NetBIOS code into the reverse-DNS field would
289
+ * otherwise have the dashboard look up a key its reverse-DNS copy
290
+ * table does not have.
291
+ */
292
+ expect(readDiscoveredHostReverseDnsStatus(code)).toBeUndefined();
293
+ },
294
+ );
295
+
296
+ test("rejects the enum's own key names", () => {
297
+ for (const key of Object.keys(DiscoveredHostReverseDnsStatus)) {
298
+ expect(readDiscoveredHostReverseDnsStatus(key)).toBeUndefined();
299
+ }
300
+ });
301
+
302
+ test("never throws, whatever it is handed", () => {
303
+ const hostile: Array<unknown> = [
304
+ Object.create(null),
305
+ new Proxy(
306
+ {},
307
+ {
308
+ get: (): never => {
309
+ throw new Error("read");
310
+ },
311
+ },
312
+ ),
313
+ ...NON_STRING_VALUES.map((entry: [string, unknown]): unknown => {
314
+ return entry[1];
315
+ }),
316
+ ];
317
+
318
+ for (const value of hostile) {
319
+ expect(() => {
320
+ return readDiscoveredHostReverseDnsStatus(value);
321
+ }).not.toThrow();
322
+ }
323
+ });
324
+ });
325
+
326
+ describe("readDiscoveredHostNetbiosStatus", () => {
327
+ test.each(Object.values(DiscoveredHostNetbiosStatus))(
328
+ "reads the exact code %p as itself",
329
+ (code: DiscoveredHostNetbiosStatus) => {
330
+ expect(readDiscoveredHostNetbiosStatus(code)).toBe(code);
331
+ },
332
+ );
333
+
334
+ test.each(NETBIOS_CODES)(
335
+ "reads the literal %p as the matching enum member",
336
+ (literal: string) => {
337
+ const stored: unknown = JSON.parse(JSON.stringify(literal));
338
+
339
+ expect(readDiscoveredHostNetbiosStatus(stored)).toBe(literal);
340
+ },
341
+ );
342
+
343
+ test.each(NETBIOS_CODES)("rejects every near miss of %p", (code: string) => {
344
+ expect(nearMissesOf(code).length).toBeGreaterThanOrEqual(10);
345
+
346
+ for (const nearMiss of nearMissesOf(code)) {
347
+ expect(readDiscoveredHostNetbiosStatus(nearMiss)).toBeUndefined();
348
+ }
349
+ });
350
+
351
+ test.each(NON_STRING_VALUES)(
352
+ "rejects %s",
353
+ (_label: string, value: unknown) => {
354
+ expect(readDiscoveredHostNetbiosStatus(value)).toBeUndefined();
355
+ },
356
+ );
357
+
358
+ test.each(JUNK_STRINGS)("rejects %s", (_label: string, value: string) => {
359
+ expect(readDiscoveredHostNetbiosStatus(value)).toBeUndefined();
360
+ });
361
+
362
+ test.each(PROTOTYPE_KEYS)("rejects the prototype key %p", (key: string) => {
363
+ expect(readDiscoveredHostNetbiosStatus(key)).toBeUndefined();
364
+ });
365
+
366
+ test.each(Object.values(DiscoveredHostReverseDnsStatus))(
367
+ "rejects the reverse-DNS code %p",
368
+ (code: string) => {
369
+ expect(readDiscoveredHostNetbiosStatus(code)).toBeUndefined();
370
+ },
371
+ );
372
+
373
+ test("rejects the enum's own key names", () => {
374
+ for (const key of Object.keys(DiscoveredHostNetbiosStatus)) {
375
+ expect(readDiscoveredHostNetbiosStatus(key)).toBeUndefined();
376
+ }
377
+ });
378
+
379
+ test("never throws, whatever it is handed", () => {
380
+ const hostile: Array<unknown> = [
381
+ Object.create(null),
382
+ new Proxy(
383
+ {},
384
+ {
385
+ get: (): never => {
386
+ throw new Error("read");
387
+ },
388
+ },
389
+ ),
390
+ ...NON_STRING_VALUES.map((entry: [string, unknown]): unknown => {
391
+ return entry[1];
392
+ }),
393
+ ];
394
+
395
+ for (const value of hostile) {
396
+ expect(() => {
397
+ return readDiscoveredHostNetbiosStatus(value);
398
+ }).not.toThrow();
399
+ }
400
+ });
401
+ });
@@ -45,6 +45,7 @@ const NEWLY_FILTERABLE_KEYS: Array<string> = [
45
45
  "cloudResourceId",
46
46
  "rumApplicationId",
47
47
  "iotFleetId",
48
+ "databaseServerId",
48
49
  ];
49
50
 
50
51
  function facetMap(
@@ -86,7 +87,7 @@ describe("ResourceEntityFacet", () => {
86
87
  expect([...RESOURCE_ENTITY_FACET_KEYS]).toEqual([
87
88
  ...RESOURCE_FACET_CATALOG_KEYS,
88
89
  ]);
89
- expect(RESOURCE_ENTITY_FACET_KEYS).toHaveLength(12);
90
+ expect(RESOURCE_ENTITY_FACET_KEYS).toHaveLength(13);
90
91
  });
91
92
 
92
93
  test("the non-Service group is a copy, not the catalog's own array", () => {
@@ -99,6 +100,8 @@ describe("ResourceEntityFacet", () => {
99
100
  "ProxmoxClusterId",
100
101
  "cephclusterid",
101
102
  " iotFleetId",
103
+ "DatabaseServerId",
104
+ "databaseId",
102
105
  "constructor",
103
106
  "__proto__",
104
107
  ]) {
@@ -107,6 +107,13 @@ const EXPECTED_CATALOG: Array<CatalogRow> = [
107
107
  "IoT Fleets",
108
108
  IconProp.IoT,
109
109
  ],
110
+ [
111
+ "databaseServerId",
112
+ ServiceType.DatabaseServer,
113
+ "Database",
114
+ "Databases",
115
+ IconProp.Database,
116
+ ],
110
117
  ];
111
118
 
112
119
  const EXPECTED_KEYS: Array<string> = EXPECTED_CATALOG.map(
@@ -117,8 +124,8 @@ const EXPECTED_KEYS: Array<string> = EXPECTED_CATALOG.map(
117
124
 
118
125
  describe("ResourceFacetCatalog", () => {
119
126
  describe("contents", () => {
120
- test("lists exactly the twelve non-Service resource types, in sidebar order", () => {
121
- expect(RESOURCE_FACET_CATALOG).toHaveLength(12);
127
+ test("lists exactly the thirteen non-Service resource types, in sidebar order", () => {
128
+ expect(RESOURCE_FACET_CATALOG).toHaveLength(13);
122
129
  expect([...RESOURCE_FACET_CATALOG_KEYS]).toEqual(EXPECTED_KEYS);
123
130
  });
124
131
 
@@ -202,6 +209,18 @@ describe("ResourceFacetCatalog", () => {
202
209
  );
203
210
  });
204
211
 
212
+ test("Databases count under DatabaseServer — the type a DB receiver batch without service.name is stamped with", () => {
213
+ expect(getResourceFacetDefinition("databaseServerId")?.serviceType).toBe(
214
+ ServiceType.DatabaseServer,
215
+ );
216
+ });
217
+
218
+ test("the Database facet is not the logical-database or monitor key", () => {
219
+ for (const reserved of ["databaseId", "dbId", "databaseMonitorId"]) {
220
+ expect(isCatalogResourceFacetKey(reserved)).toBe(false);
221
+ }
222
+ });
223
+
205
224
  test("RUM applications count under RealUserMonitor", () => {
206
225
  expect(getResourceFacetDefinition("rumApplicationId")?.serviceType).toBe(
207
226
  ServiceType.RealUserMonitor,
@@ -256,6 +275,9 @@ describe("ResourceFacetCatalog", () => {
256
275
  "toString",
257
276
  "__proto__",
258
277
  "iotDeviceId",
278
+ "databaseId",
279
+ "DatabaseServerId",
280
+ "databaseServerIdentifier",
259
281
  ])("%j is not a catalog key", (facetKey: string) => {
260
282
  expect(isCatalogResourceFacetKey(facetKey)).toBe(false);
261
283
  expect(getResourceFacetDefinition(facetKey)).toBeUndefined();
@@ -9,6 +9,15 @@ import IconProp from "../../../Types/Icon/IconProp";
9
9
  import React, { ReactElement } from "react";
10
10
  import { describe, expect, jest } from "@jest/globals";
11
11
  import getJestMockFunction, { MockFunction } from "../../MockType";
12
+ import {
13
+ LAPTOP_WIDTH_IN_PX,
14
+ PHONE_WIDTH_IN_PX,
15
+ TABLET_WIDTH_IN_PX,
16
+ WIDE_DESKTOP_WIDTH_IN_PX,
17
+ describeVisibility,
18
+ isVisibleAtWidth,
19
+ resolveDisplay,
20
+ } from "../../ResponsiveVisibility";
12
21
 
13
22
  describe("Card", () => {
14
23
  const props: ComponentProps = {
@@ -164,12 +173,18 @@ describe("Card header layout", () => {
164
173
  /*
165
174
  * Captured from Card before headerLayout existed. Every card in the app
166
175
  * that does not opt in must keep rendering exactly this.
176
+ *
177
+ * One token has moved on purpose since: the description was `hidden
178
+ * md:block` and is now `max-md:hidden md:block`. The two paint the same
179
+ * at every width, but only the second survives a foreign
180
+ * `.hidden { display: none !important }` rule, which took the old
181
+ * description off desktops as well (see "Card description" below).
167
182
  */
168
183
  const GOLDEN_WITH_ACTIONS: string =
169
- '<div data-testid="card" class="mb-5 extra"><div class="bg-white border border-gray-200 rounded-xl shadow-sm overflow-visible"><div class="py-6 px-5 md:px-6"><div class="flex flex-col md:flex-row md:justify-between md:items-start"><div class="flex-1 min-w-0"><h2 data-testid="card-details-heading" id="card-details-heading" class="text-lg font-semibold leading-6 text-gray-900">Title</h2><p data-testid="card-description" class="mt-1.5 text-sm text-gray-500 w-full hidden md:block leading-relaxed">Desc</p></div><div class="flex flex-col md:flex-row md:items-center md:w-fit mt-4 md:mt-0 md:ml-4 gap-2 md:gap-0 flex-shrink-0 items-center"><div class="mb-2 md:mb-0 md:mr-3"><span>right</span></div><div class="flex flex-wrap items-center gap-1.5"><div class="flex items-center"><a href="/docs">Docs</a></div></div></div></div><div class="mt-0"><div>body</div></div></div></div></div>';
184
+ '<div data-testid="card" class="mb-5 extra"><div class="bg-white border border-gray-200 rounded-xl shadow-sm overflow-visible"><div class="py-6 px-5 md:px-6"><div class="flex flex-col md:flex-row md:justify-between md:items-start"><div class="flex-1 min-w-0"><h2 data-testid="card-details-heading" id="card-details-heading" class="text-lg font-semibold leading-6 text-gray-900">Title</h2><p data-testid="card-description" class="mt-1.5 text-sm text-gray-500 w-full max-md:hidden md:block leading-relaxed">Desc</p></div><div class="flex flex-col md:flex-row md:items-center md:w-fit mt-4 md:mt-0 md:ml-4 gap-2 md:gap-0 flex-shrink-0 items-center"><div class="mb-2 md:mb-0 md:mr-3"><span>right</span></div><div class="flex flex-wrap items-center gap-1.5"><div class="flex items-center"><a href="/docs">Docs</a></div></div></div></div><div class="mt-0"><div>body</div></div></div></div></div>';
170
185
 
171
186
  const GOLDEN_WITHOUT_ACTIONS: string =
172
- '<div data-testid="card" class="mb-5 "><div class="bg-white border border-gray-200 rounded-xl shadow-sm overflow-visible"><div class="py-6 px-5 md:px-6"><div class="flex flex-col md:flex-row md:justify-between md:items-start"><div class="w-full"><h2 data-testid="card-details-heading" id="card-details-heading" class="text-lg font-semibold leading-6 text-gray-900">Title</h2><p data-testid="card-description" class="mt-1.5 text-sm text-gray-500 w-full hidden md:block leading-relaxed">Desc</p></div></div></div></div></div>';
187
+ '<div data-testid="card" class="mb-5 "><div class="bg-white border border-gray-200 rounded-xl shadow-sm overflow-visible"><div class="py-6 px-5 md:px-6"><div class="flex flex-col md:flex-row md:justify-between md:items-start"><div class="w-full"><h2 data-testid="card-details-heading" id="card-details-heading" class="text-lg font-semibold leading-6 text-gray-900">Title</h2><p data-testid="card-description" class="mt-1.5 text-sm text-gray-500 w-full max-md:hidden md:block leading-relaxed">Desc</p></div></div></div></div></div>';
173
188
 
174
189
  test.each([
175
190
  ["left out", undefined],
@@ -418,3 +433,79 @@ describe("Card header layout", () => {
418
433
  });
419
434
  });
420
435
  });
436
+
437
+ /*
438
+ * The description is a phone-width casualty on purpose: it is secondary copy,
439
+ * and a phone header has no room for it. What it must never be is a desktop
440
+ * casualty. It used to carry the bare `hidden` class and lean on `md:block`
441
+ * to come back, and a page carrying a foreign `.hidden { display: none
442
+ * !important }` rule (Bootstrap 3, HTML5 Boilerplate, a browser extension)
443
+ * beats `md:block` at every width — so every card in the product lost its
444
+ * description, on the widest screen as well as the narrowest.
445
+ */
446
+ describe("Card description", () => {
447
+ const OLD_DESCRIPTION_CLASS_NAME: string =
448
+ "mt-1.5 text-sm text-gray-500 w-full hidden md:block leading-relaxed";
449
+
450
+ test.each([
451
+ ["default", "default"],
452
+ ["stacked", "stacked"],
453
+ ] as Array<[string, "default" | "stacked"]>)(
454
+ "the %s layout holds it back on a phone and shows it from md up",
455
+ (_label: string, headerLayout: "default" | "stacked") => {
456
+ render(
457
+ <Card title="Title" description="Desc" headerLayout={headerLayout} />,
458
+ );
459
+
460
+ const description: HTMLElement = screen.getByTestId("card-description");
461
+
462
+ expect(isVisibleAtWidth(description, PHONE_WIDTH_IN_PX)).toBe(false);
463
+
464
+ for (const width of [
465
+ TABLET_WIDTH_IN_PX,
466
+ LAPTOP_WIDTH_IN_PX,
467
+ WIDE_DESKTOP_WIDTH_IN_PX,
468
+ ]) {
469
+ expect(describeVisibility(description, width)).toBe(
470
+ `visible at ${width}px`,
471
+ );
472
+ }
473
+ },
474
+ );
475
+
476
+ test("a foreign .hidden rule cannot take it off a tablet or a desktop", () => {
477
+ render(<Card title="Title" description="Desc" />);
478
+
479
+ const description: HTMLElement = screen.getByTestId("card-description");
480
+
481
+ expect(description).not.toHaveClass("hidden");
482
+
483
+ for (const width of [
484
+ TABLET_WIDTH_IN_PX,
485
+ LAPTOP_WIDTH_IN_PX,
486
+ WIDE_DESKTOP_WIDTH_IN_PX,
487
+ ]) {
488
+ expect(
489
+ describeVisibility(description, width, { withForeignHiddenRule: true }),
490
+ ).toBe(`visible at ${width}px with a foreign .hidden rule on the page`);
491
+ }
492
+
493
+ /*
494
+ * The control: the class string the description shipped with before
495
+ * paints at these widths on a clean page, and on the customer's page it
496
+ * is gone at every one of them.
497
+ */
498
+ for (const width of [
499
+ TABLET_WIDTH_IN_PX,
500
+ LAPTOP_WIDTH_IN_PX,
501
+ WIDE_DESKTOP_WIDTH_IN_PX,
502
+ ]) {
503
+ expect(resolveDisplay(OLD_DESCRIPTION_CLASS_NAME, width)).toBe("block");
504
+ expect(
505
+ resolveDisplay(OLD_DESCRIPTION_CLASS_NAME, width, {
506
+ withForeignHiddenRule: true,
507
+ }),
508
+ ).toBe("hidden");
509
+ }
510
+ });
511
+ });
@@ -23,6 +23,7 @@ import { AlertEpisodeFeedEventType } from "../../../Models/DatabaseModels/AlertE
23
23
  import { AlertFeedEventType } from "../../../Models/DatabaseModels/AlertFeed";
24
24
  import { CephClusterFeedEventType } from "../../../Models/DatabaseModels/CephClusterFeed";
25
25
  import { CloudResourceFeedEventType } from "../../../Models/DatabaseModels/CloudResourceFeed";
26
+ import { DatabaseServerFeedEventType } from "../../../Models/DatabaseModels/DatabaseServerFeed";
26
27
  import { DockerHostFeedEventType } from "../../../Models/DatabaseModels/DockerHostFeed";
27
28
  import { DockerSwarmClusterFeedEventType } from "../../../Models/DatabaseModels/DockerSwarmClusterFeed";
28
29
  import { HostFeedEventType } from "../../../Models/DatabaseModels/HostFeed";
@@ -86,6 +87,11 @@ const FEEDS: Array<FeedEventTypeSpec> = [
86
87
  enumName: "CloudResourceFeedEventType",
87
88
  eventTypes: Object.values(CloudResourceFeedEventType),
88
89
  },
90
+ {
91
+ name: "DatabaseServerFeed",
92
+ enumName: "DatabaseServerFeedEventType",
93
+ eventTypes: Object.values(DatabaseServerFeedEventType),
94
+ },
89
95
  {
90
96
  name: "DockerHostFeed",
91
97
  enumName: "DockerHostFeedEventType",
@@ -303,8 +303,15 @@ describe("FeedOptionsButton", () => {
303
303
  * that would drop it from the accessibility tree and leave the button
304
304
  * with no name at all on phones and tablets. jsdom applies no CSS, so
305
305
  * the class is the only place this can be seen.
306
+ *
307
+ * `max-xl:sr-only`, not a bare `sr-only` undone by `xl:not-sr-only`:
308
+ * Bootstrap 3 and HTML5 Boilerplate both ship a `.sr-only` rule, and a
309
+ * browser extension or user stylesheet that injects one after Tailwind
310
+ * would otherwise collapse the visible label on a wide screen too.
306
311
  */
307
- expect(label).toHaveClass("sr-only");
312
+ expect(label).toHaveClass("max-xl:sr-only");
313
+ expect(label).toHaveClass("xl:not-sr-only");
314
+ expect(label).not.toHaveClass("sr-only");
308
315
  expect(label).not.toHaveClass("hidden");
309
316
  });
310
317