@oneuptime/common 14.0.3 → 14.0.6

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 (663) 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/MetricService.ts +1 -1
  37. package/Server/Services/OpenTelemetryIngestService.ts +19 -0
  38. package/Server/Services/PodmanResourceService.ts +43 -2
  39. package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +107 -23
  40. package/Server/Services/ServiceService.ts +1 -1
  41. package/Server/Services/TelemetryUsageBillingService.ts +29 -2
  42. package/Server/Services/UserProjectSsoConsentService.ts +74 -0
  43. package/Server/Services/UserService.ts +14 -1
  44. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +18 -0
  45. package/Server/Types/Database/QueryHelper.ts +84 -2
  46. package/Server/Utils/AI/Toolbox/MetricTools.ts +13 -2
  47. package/Server/Utils/AI/Toolbox/ResourceTools.ts +81 -2
  48. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +1 -1
  49. package/Server/Utils/Database/AffectedResourceRelations.ts +6 -0
  50. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +33 -0
  51. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +192 -9
  52. package/Server/Utils/Monitor/MonitorAlert.ts +28 -1
  53. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +2264 -755
  54. package/Server/Utils/Monitor/MonitorIncident.ts +28 -1
  55. package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +268 -6
  56. package/Server/Utils/Monitor/MonitorResource.ts +47 -11
  57. package/Server/Utils/Monitor/MonitorResourceContext.ts +1 -0
  58. package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +239 -21
  59. package/Server/Utils/Monitor/PerSeriesResolutionRootCause.ts +43 -0
  60. package/Server/Utils/Monitor/SeriesResourceLabels.ts +291 -0
  61. package/Server/Utils/Monitor/SeriesResourceLinker.ts +111 -12
  62. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +25 -0
  63. package/Server/Utils/StartServer.ts +26 -6
  64. package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +2 -0
  65. package/Server/Utils/Telemetry/DatabaseEndpointDiscovery.ts +688 -0
  66. package/Server/Utils/Telemetry/EntityRegistry.ts +5 -1
  67. package/Server/Utils/Telemetry/LogExceptionExtractor.ts +18 -1
  68. package/Server/Utils/Telemetry/ResourceEntityFilter.ts +175 -12
  69. package/Server/Utils/Telemetry/ResourceFacetResolver.ts +12 -0
  70. package/Server/Utils/Telemetry/ServiceDependencyDiscovery.ts +606 -36
  71. package/Server/Utils/Telemetry/Telemetry.ts +16 -0
  72. package/Server/Utils/Telemetry/TelemetryEntity.ts +22 -22
  73. package/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.ts +16 -10
  74. package/Tests/App/Accounts/SignedInRedirect.test.tsx +241 -0
  75. package/Tests/App/AdminDashboard/AdminHeaderSmallScreens.test.tsx +221 -4
  76. package/Tests/App/Dashboard/AIInsightsResourcePageContext.test.ts +42 -0
  77. package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +100 -0
  78. package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +86 -0
  79. package/Tests/App/Dashboard/AffectedResourcesPickerHiddenTypes.test.tsx +2 -0
  80. package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +19 -0
  81. package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +14 -0
  82. package/Tests/App/Dashboard/CorrelateFilterBuilder.test.tsx +26 -1
  83. package/Tests/App/Dashboard/DashboardAppSsoError.test.tsx +501 -0
  84. package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +64 -1
  85. package/Tests/App/Dashboard/DashboardHeaderSmallScreens.test.tsx +178 -18
  86. package/Tests/App/Dashboard/DashboardMasterPageSsoRedirect.test.tsx +444 -0
  87. package/Tests/App/Dashboard/DashboardNavBarForeignHiddenRule.test.tsx +573 -0
  88. package/Tests/App/Dashboard/DatabaseChartAxes.test.tsx +431 -0
  89. package/Tests/App/Dashboard/DatabaseContainerDetailBadge.test.tsx +249 -0
  90. package/Tests/App/Dashboard/DatabaseDashboardE2EFixes.test.ts +681 -0
  91. package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +1801 -0
  92. package/Tests/App/Dashboard/DatabaseFleetSummaryRefresh.test.tsx +280 -0
  93. package/Tests/App/Dashboard/DatabaseFormHelpers.test.tsx +321 -0
  94. package/Tests/App/Dashboard/DatabaseMetricMonitorLink.test.tsx +795 -0
  95. package/Tests/App/Dashboard/DatabaseOverviewHeader.test.tsx +580 -0
  96. package/Tests/App/Dashboard/DatabaseRecommendationsEngineMetrics.test.ts +270 -0
  97. package/Tests/App/Dashboard/DatabaseServerComponents.test.tsx +1486 -0
  98. package/Tests/App/Dashboard/DatabaseServerEngineMetricsFilter.test.ts +223 -0
  99. package/Tests/App/Dashboard/DatabaseServerPresentation.test.ts +435 -0
  100. package/Tests/App/Dashboard/DatabaseServerSummary.test.ts +186 -0
  101. package/Tests/App/Dashboard/DatabaseServerTelemetryQueries.test.ts +1553 -0
  102. package/Tests/App/Dashboard/DatabaseTableTruncation.test.tsx +326 -0
  103. package/Tests/App/Dashboard/DatabaseTelemetryScope.test.ts +512 -0
  104. package/Tests/App/Dashboard/DatabaseTelemetryTabs.test.tsx +774 -0
  105. package/Tests/App/Dashboard/DatabaseViewLayout.test.tsx +233 -0
  106. package/Tests/App/Dashboard/DatabaseWorkloadBadge.test.tsx +972 -0
  107. package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +5 -0
  108. package/Tests/App/Dashboard/DiscoveryReviewUnnamedHostHint.test.tsx +1061 -0
  109. package/Tests/App/Dashboard/EventOverlayScope.test.ts +147 -0
  110. package/Tests/App/Dashboard/EventOverlayScopeHook.test.tsx +1 -0
  111. package/Tests/App/Dashboard/LogsResourceFacetChips.test.tsx +1 -0
  112. package/Tests/App/Dashboard/MetricsViewerDrillDown.test.tsx +310 -0
  113. package/Tests/App/Dashboard/MetricsViewerEntityScopedRows.test.tsx +495 -0
  114. package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +132 -1
  115. package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +5 -0
  116. package/Tests/App/Dashboard/NetworkTopologyExplorerSearch.test.tsx +1267 -0
  117. package/Tests/App/Dashboard/ProductOrientation.test.tsx +4 -3
  118. package/Tests/App/Dashboard/RecommendationsLoadedContext.test.tsx +349 -0
  119. package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +62 -0
  120. package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
  121. package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +14 -0
  122. package/Tests/App/Dashboard/ResourceOverviewTileTooltips.test.tsx +4 -1
  123. package/Tests/App/Dashboard/RumOverviewPage.test.tsx +127 -0
  124. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +2 -0
  125. package/Tests/App/Dashboard/ServiceMapDatabaseLink.test.tsx +1085 -0
  126. package/Tests/App/Dashboard/SiteSearchBox.test.tsx +2110 -0
  127. package/Tests/App/Dashboard/TelemetryMetricsSignals.test.ts +168 -8
  128. package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +10 -0
  129. package/Tests/App/Dashboard/TracesResourceFacets.test.tsx +2 -1
  130. package/Tests/App/StatusPage/StatusPageHeaderForeignHiddenRule.test.tsx +284 -0
  131. package/Tests/ClassStrings.ts +178 -0
  132. package/Tests/Fixtures/MobilePasskeyUser.json +1 -2
  133. package/Tests/ForeignHiddenRuleGuard.ts +2152 -0
  134. package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +2250 -0
  135. package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +24 -5
  136. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
  137. package/Tests/RenderedMarkup.ts +518 -0
  138. package/Tests/ResponsiveVisibility.test.ts +490 -4
  139. package/Tests/ResponsiveVisibility.ts +505 -52
  140. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
  141. package/Tests/Server/Infrastructure/Postgres/AddDatabaseServerTablesMigration.test.ts +541 -0
  142. package/Tests/Server/Infrastructure/Postgres/AddUserProjectSsoConsentMigration.test.ts +234 -0
  143. package/Tests/Server/Services/ContainerSnapshotUpsertPostgres.test.ts +319 -0
  144. package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +13 -0
  145. package/Tests/Server/Services/DatabaseServerEndpointService.test.ts +2033 -0
  146. package/Tests/Server/Services/DatabaseServerFeedAndOwnerServices.test.ts +529 -0
  147. package/Tests/Server/Services/DatabaseServerLifecycle.test.ts +3302 -0
  148. package/Tests/Server/Services/DatabaseServerRegistries.test.ts +603 -0
  149. package/Tests/Server/Services/DatabaseServerRuleEngines.test.ts +754 -0
  150. package/Tests/Server/Services/DatabaseServerService.test.ts +3558 -0
  151. package/Tests/Server/Services/DatabaseServerSqlPostgres.test.ts +2045 -0
  152. package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlockedPostgres.test.ts +362 -0
  153. package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlockedReply.test.ts +210 -0
  154. package/Tests/Server/Services/HookFreeWriteLengthClamp.test.ts +18 -0
  155. package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +2 -0
  156. package/Tests/Server/Services/IncomingCallPolicyEscalationRuleTarget.test.ts +225 -0
  157. package/Tests/Server/Services/InventoryItemDisplayName.test.ts +280 -2
  158. package/Tests/Server/Services/InventoryUpsertSchemaParity.test.ts +8 -2
  159. package/Tests/Server/Services/IoTDeviceLatestMetricsPostgres.test.ts +689 -0
  160. package/Tests/Server/Services/IoTDeviceService.test.ts +379 -0
  161. package/Tests/Server/Services/LatestMetricsValuesShape.test.ts +360 -0
  162. package/Tests/Server/Services/LlmModelPriceService.test.ts +402 -0
  163. package/Tests/Server/Services/MetricServiceAggregate.test.ts +12 -0
  164. package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +7 -1
  165. package/Tests/Server/Services/OwnerRowUniqueness.test.ts +61 -9
  166. package/Tests/Server/Services/ReminderRuleLookupPostgres.test.ts +2250 -0
  167. package/Tests/Server/Services/ReminderRuleRefreshOpenSubjectsPaging.test.ts +653 -0
  168. package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +68 -20
  169. package/Tests/Server/Services/SavedViewDefaults.test.ts +325 -0
  170. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +3 -3
  171. package/Tests/Server/Services/StatusPageCertificateService.test.ts +169 -0
  172. package/Tests/Server/Services/TeamComplianceSettingService.test.ts +191 -0
  173. package/Tests/Server/Services/TelemetryResourceFacetCounting.test.ts +9 -0
  174. package/Tests/Server/Services/UserProjectSsoConsentPostgres.test.ts +153 -0
  175. package/Tests/Server/Services/UserProjectSsoConsentService.test.ts +192 -0
  176. package/Tests/Server/Services/UserServiceFirstMasterAdminElection.test.ts +71 -0
  177. package/Tests/Server/Services/UserSignupIdTakeoverPostgres.test.ts +238 -0
  178. package/Tests/Server/Services/WorkspaceNotificationSummaryHelpers.test.ts +592 -0
  179. package/Tests/Server/Types/Billing/PayAsYouGoMeteredAuthorization.test.ts +3 -0
  180. package/Tests/Server/Types/Database/EventOverlayScopePostgres.test.ts +1 -0
  181. package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +11 -0
  182. package/Tests/Server/Types/Database/Permissions/InfrastructureOwnershipScope.test.ts +8 -0
  183. package/Tests/Server/Types/Database/QueryHelperBooleanForCriteriaBackedRule.test.ts +1094 -0
  184. package/Tests/Server/Types/Database/QueryHelperSearchAllWords.test.ts +651 -0
  185. package/Tests/Server/Utils/AI/AlertWriteTools.test.ts +256 -0
  186. package/Tests/Server/Utils/AI/IncidentWriteTools.test.ts +482 -0
  187. package/Tests/Server/Utils/AI/ResourceTools.test.ts +134 -0
  188. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteria.test.ts +54 -0
  189. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +41 -0
  190. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +279 -9
  191. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaDisplayContext.test.ts +933 -0
  192. package/Tests/Server/Utils/Monitor/DatabaseMaintenanceSuppression.test.ts +582 -0
  193. package/Tests/Server/Utils/Monitor/DatabaseServerMonitorLinking.test.ts +753 -0
  194. package/Tests/Server/Utils/Monitor/MetricDecimalThreshold.test.ts +417 -0
  195. package/Tests/Server/Utils/Monitor/MonitorActionTimestamps.test.ts +1 -0
  196. package/Tests/Server/Utils/Monitor/MonitorAlertCriteriaReferences.test.ts +1 -0
  197. package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +119 -0
  198. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +60 -25
  199. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorAffectedResourceEdgeCases.test.ts +1815 -0
  200. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorKubernetesAffectedResources.test.ts +1447 -0
  201. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorKubernetesRatioEmail.test.ts +352 -0
  202. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformMetricUnits.test.ts +717 -0
  203. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformRawScan.test.ts +2125 -0
  204. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformSeriesAffectedResources.test.ts +1288 -0
  205. package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +1 -0
  206. package/Tests/Server/Utils/Monitor/MonitorIncidentCriteriaReferences.test.ts +1 -0
  207. package/Tests/Server/Utils/Monitor/MonitorIncidentMemberRoleMembership.test.ts +1 -0
  208. package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +88 -0
  209. package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +205 -0
  210. package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +62 -0
  211. package/Tests/Server/Utils/Monitor/MonitorResourceDatabaseMaintenance.test.ts +803 -0
  212. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +133 -3
  213. package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +1 -0
  214. package/Tests/Server/Utils/Monitor/PerSeriesRecoveryResolution.test.ts +472 -1
  215. package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1 -0
  216. package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +236 -2
  217. package/Tests/Server/Utils/SeriesResourceLabels.test.ts +70 -0
  218. package/Tests/Server/Utils/StartServerProtobufContentType.test.ts +54 -0
  219. package/Tests/Server/Utils/Telemetry/DatabaseEndpointDiscovery.test.ts +1895 -0
  220. package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +7 -0
  221. package/Tests/Server/Utils/Telemetry/LogExceptionExtractorSeverityGate.test.ts +90 -0
  222. package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +570 -0
  223. package/Tests/Server/Utils/Telemetry/ResourceFacetResolver.test.ts +97 -2
  224. package/Tests/Server/Utils/Telemetry/ServiceDependencyDiscovery.test.ts +1337 -0
  225. package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +295 -0
  226. package/Tests/Types/AI/AIResourceContext.test.ts +30 -0
  227. package/Tests/Types/BaseDatabase/AggregationType.test.ts +5 -1
  228. package/Tests/Types/Dashboard/KubernetesDashboardTemplate.test.ts +184 -0
  229. package/Tests/Types/Dashboard/KubernetesDashboardTemplates.test.ts +107 -0
  230. package/Tests/Types/DatabaseServer/DatabaseContainerClassifier.test.ts +3644 -0
  231. package/Tests/Types/DatabaseServer/DatabaseContainerCommand.test.ts +340 -0
  232. package/Tests/Types/DatabaseServer/DatabaseContainerCommandCorpus.ts +826 -0
  233. package/Tests/Types/DatabaseServer/DatabaseContainerCommandPostgres.test.ts +150 -0
  234. package/Tests/Types/DatabaseServer/DatabaseEndpoint.test.ts +2657 -0
  235. package/Tests/Types/DatabaseServer/DatabaseServerDiscoverySource.test.ts +64 -0
  236. package/Tests/Types/DatabaseServer/DatabaseServerEntityKeys.test.ts +952 -0
  237. package/Tests/Types/DatabaseServer/DatabaseServerMetricCatalog.test.ts +1161 -0
  238. package/Tests/Types/DatabaseServer/DatabaseSystem.test.ts +1514 -0
  239. package/Tests/Types/DatabaseServer/DatabaseTelemetryResolver.test.ts +1558 -0
  240. package/Tests/Types/Monitor/CephAlertTemplates.test.ts +255 -6
  241. package/Tests/Types/Monitor/DatabaseAlertTemplates.test.ts +2254 -0
  242. package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +292 -0
  243. package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +272 -0
  244. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +253 -9
  245. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +13 -5
  246. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +4 -2
  247. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +111 -2
  248. package/Tests/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.test.ts +61 -0
  249. package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +114 -0
  250. package/Tests/Types/Monitor/Utils/KubernetesAgentEmittedMetrics.ts +202 -0
  251. package/Tests/Types/NetworkDevice/DiscoveredHostNamingStatus.test.ts +401 -0
  252. package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +4 -1
  253. package/Tests/Types/Telemetry/ResourceFacetCatalog.test.ts +24 -2
  254. package/Tests/UI/Components/Card.test.tsx +93 -2
  255. package/Tests/UI/Components/FeedOptions.test.ts +6 -0
  256. package/Tests/UI/Components/FeedOptionsButton.test.tsx +8 -1
  257. package/Tests/UI/Components/ForeignHiddenRuleResilience.test.tsx +1147 -0
  258. package/Tests/UI/Components/HeaderRightRail.test.tsx +41 -1
  259. package/Tests/UI/Components/LogsEntityNames.test.ts +16 -1
  260. package/Tests/UI/Components/LogsFacetSidebarHiddenFacets.test.tsx +7 -3
  261. package/Tests/UI/Components/ResourceFacetConfigs.test.ts +2 -1
  262. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  263. package/Tests/UI/Components/SrOnlyForeignRule.test.tsx +994 -0
  264. package/Tests/UI/Components/StatusPage/ResourceListSelection.test.tsx +34 -1
  265. package/Tests/UI/Components/TelemetryFacetSidebarHiddenFacets.test.tsx +4 -1
  266. package/Tests/UI/ForeignHiddenRuleGuard.test.ts +1951 -0
  267. package/Tests/UI/Rum/ChunkLoader.test.ts +76 -0
  268. package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +19 -1
  269. package/Tests/UI/Rum/ReplayRailDetail.test.tsx +53 -0
  270. package/Tests/UI/Rum/ReplaySignals.test.ts +54 -0
  271. package/Tests/UI/Rum/ReplayTabSwitcher.test.tsx +19 -1
  272. package/Tests/UI/TailwindPlayCdnForeignHiddenRule.test.ts +1005 -0
  273. package/Tests/UI/ThemeGroupHoverReveal.test.ts +847 -0
  274. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +70 -0
  275. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +21 -0
  276. package/Tests/UI/Utils/ModelAPISsoRedirect.test.ts +127 -0
  277. package/Tests/UI/Utils/Navigation.test.ts +102 -0
  278. package/Tests/UI/Utils/Telemetry/TelemetryEntityNames.test.ts +23 -0
  279. package/Tests/Utils/Dashboard/KubernetesClusterCpuTileRepair.test.ts +370 -0
  280. package/Tests/Utils/LabelRuleImportExport.test.ts +5 -0
  281. package/Tests/Utils/MetricUnitUtil.test.ts +227 -2
  282. package/Tests/Utils/Monitor/MetricValueFormatter.test.ts +288 -2
  283. package/Tests/Utils/Monitor/PlatformResourceIdentityAndUnits.test.ts +1559 -0
  284. package/Tests/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.test.ts +2546 -0
  285. package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +315 -0
  286. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +336 -1
  287. package/Tests/Utils/NetworkDiscovery/NetbiosNameUtil.test.ts +244 -0
  288. package/Tests/Utils/Rules/MonitorTypeRuleCriteria.test.ts +181 -0
  289. package/Tests/Utils/ValueFormatter.test.ts +50 -0
  290. package/Tests/tsconfig.json +16 -0
  291. package/Types/AI/AIResourceContext.ts +7 -0
  292. package/Types/BaseDatabase/AggregationType.ts +7 -0
  293. package/Types/Dashboard/DashboardTemplates.ts +22 -8
  294. package/Types/DatabaseServer/DatabaseConnectionSpan.ts +77 -0
  295. package/Types/DatabaseServer/DatabaseContainerClassifier.ts +2068 -0
  296. package/Types/DatabaseServer/DatabaseContainerCommand.ts +801 -0
  297. package/Types/DatabaseServer/DatabaseEndpoint.ts +1943 -0
  298. package/Types/DatabaseServer/DatabaseServerDiscoverySource.ts +68 -0
  299. package/Types/DatabaseServer/DatabaseServerMetricCatalog.ts +966 -0
  300. package/Types/DatabaseServer/DatabaseSystem.ts +2124 -0
  301. package/Types/DatabaseServer/DatabaseTelemetryResolver.ts +555 -0
  302. package/Types/Email/EmailTemplateType.ts +1 -0
  303. package/Types/Monitor/CephAlertTemplates.ts +18 -0
  304. package/Types/Monitor/DatabaseAlertTemplates.ts +2020 -0
  305. package/Types/Monitor/KubernetesAlertTemplates.ts +64 -24
  306. package/Types/Monitor/KubernetesMetricCatalog.ts +118 -19
  307. package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +14 -0
  308. package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +93 -10
  309. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +109 -8
  310. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +36 -7
  311. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +43 -2
  312. package/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.ts +41 -6
  313. package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +26 -0
  314. package/Types/NetworkDevice/DiscoveredHostNamingStatus.ts +147 -0
  315. package/Types/Permission.ts +267 -0
  316. package/Types/Probe/ProbeApiIngestResponse.ts +8 -0
  317. package/Types/Rules/RuleCriteriaFieldRegistry.ts +10 -0
  318. package/Types/Rules/RuleRun.ts +12 -0
  319. package/Types/Rum/SessionReplayCustomEvents.ts +29 -3
  320. package/Types/Rum/WebVitals.ts +13 -0
  321. package/Types/Telemetry/EntityType.ts +23 -0
  322. package/Types/Telemetry/ResourceFacetCatalog.ts +14 -0
  323. package/Types/Telemetry/ServiceType.ts +8 -0
  324. package/UI/Components/Banner/Banner.tsx +1 -1
  325. package/UI/Components/Card/Card.tsx +1 -1
  326. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +2 -2
  327. package/UI/Components/Charts/Line/LineChart.tsx +7 -0
  328. package/UI/Components/CommandPalette/CommandPalette.tsx +1 -1
  329. package/UI/Components/Date/StartAndEndDate.tsx +5 -5
  330. package/UI/Components/Diagram/HorizontalStepChain.tsx +1 -1
  331. package/UI/Components/Feed/FeedOptionsButton.tsx +1 -1
  332. package/UI/Components/Forms/BasicForm.tsx +1 -1
  333. package/UI/Components/Header/Header.tsx +1 -1
  334. package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -1
  335. package/UI/Components/HeaderAlert/HeaderAlert.tsx +1 -1
  336. package/UI/Components/Input/Input.tsx +11 -0
  337. package/UI/Components/LogsViewer/components/FacetValueRow.tsx +1 -1
  338. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +1 -1
  339. package/UI/Components/Modal/ModalFooter.tsx +1 -1
  340. package/UI/Components/ModelDetail/CardModelDetail.tsx +2 -2
  341. package/UI/Components/ModelTable/BaseModelTable.tsx +4 -4
  342. package/UI/Components/Navbar/NavBar.tsx +9 -2
  343. package/UI/Components/Navbar/NavBarMenuModal.tsx +2 -2
  344. package/UI/Components/Page/Page.tsx +1 -1
  345. package/UI/Components/Pagination/Pagination.tsx +3 -3
  346. package/UI/Components/ProgressButtons/ProgressButtonItem.tsx +1 -1
  347. package/UI/Components/SideMenu/SideMenu.tsx +4 -1
  348. package/UI/Components/StatusPage/ResourceGroupNavigator.tsx +4 -2
  349. package/UI/Components/StatusPage/ResourceList.tsx +6 -6
  350. package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +1 -1
  351. package/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.tsx +1 -1
  352. package/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.tsx +1 -1
  353. package/UI/Components/Workflow/ComponentsModal.tsx +2 -2
  354. package/UI/Components/Workflow/StepTraceViewer.tsx +1 -1
  355. package/UI/Styles/Theme.css +8 -1
  356. package/UI/Utils/Navigation.ts +89 -42
  357. package/UI/Utils/Telemetry/TelemetryEntityNames.ts +7 -0
  358. package/UI/Utils/TelemetryService.ts +4 -3
  359. package/Utils/Dashboard/KubernetesClusterCpuTileRepair.ts +147 -0
  360. package/Utils/LabelRuleImportExport.ts +2 -0
  361. package/Utils/MetricUnitUtil.ts +103 -11
  362. package/Utils/Monitor/MetricValueFormatter.ts +66 -13
  363. package/Utils/Monitor/PlatformMetricUnitUtil.ts +215 -0
  364. package/Utils/Monitor/PlatformResourceIdentity.ts +514 -0
  365. package/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.ts +425 -0
  366. package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +32 -0
  367. package/Utils/NetworkDiscovery/NetbiosNameUtil.ts +73 -0
  368. package/Utils/Telemetry/DatabaseServerEntityKeys.ts +275 -0
  369. package/Utils/Telemetry/EntityKey.ts +176 -0
  370. package/Utils/ValueFormatter.ts +16 -0
  371. package/build/dist/Models/DatabaseModels/Alert.js +54 -0
  372. package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
  373. package/build/dist/Models/DatabaseModels/DatabaseServer.js +1683 -0
  374. package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -0
  375. package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js +559 -0
  376. package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js.map +1 -0
  377. package/build/dist/Models/DatabaseModels/DatabaseServerFeed.js +648 -0
  378. package/build/dist/Models/DatabaseModels/DatabaseServerFeed.js.map +1 -0
  379. package/build/dist/Models/DatabaseModels/DatabaseServerLabelRule.js +522 -0
  380. package/build/dist/Models/DatabaseModels/DatabaseServerLabelRule.js.map +1 -0
  381. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerRule.js +603 -0
  382. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerRule.js.map +1 -0
  383. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerTeam.js +506 -0
  384. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerTeam.js.map +1 -0
  385. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerUser.js +505 -0
  386. package/build/dist/Models/DatabaseModels/DatabaseServerOwnerUser.js.map +1 -0
  387. package/build/dist/Models/DatabaseModels/Incident.js +54 -0
  388. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  389. package/build/dist/Models/DatabaseModels/Index.js +16 -0
  390. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  391. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  392. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +54 -0
  393. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  394. package/build/dist/Models/DatabaseModels/TelemetryException.js +2 -0
  395. package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
  396. package/build/dist/Models/DatabaseModels/UserProjectSsoConsent.js +162 -0
  397. package/build/dist/Models/DatabaseModels/UserProjectSsoConsent.js.map +1 -0
  398. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.js +240 -0
  399. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.js.map +1 -0
  400. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.js +26 -0
  401. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.js.map +1 -0
  402. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
  403. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  404. package/build/dist/Server/Middleware/MultipartFormData.js +1 -1
  405. package/build/dist/Server/Middleware/TelemetryIngest.js +15 -8
  406. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  407. package/build/dist/Server/Services/AlertReminderRuleService.js +72 -23
  408. package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
  409. package/build/dist/Server/Services/DatabaseServerEndpointService.js +694 -0
  410. package/build/dist/Server/Services/DatabaseServerEndpointService.js.map +1 -0
  411. package/build/dist/Server/Services/DatabaseServerFeedService.js +110 -0
  412. package/build/dist/Server/Services/DatabaseServerFeedService.js.map +1 -0
  413. package/build/dist/Server/Services/DatabaseServerLabelRuleEngineService.js +272 -0
  414. package/build/dist/Server/Services/DatabaseServerLabelRuleEngineService.js.map +1 -0
  415. package/build/dist/Server/Services/DatabaseServerLabelRuleService.js +13 -0
  416. package/build/dist/Server/Services/DatabaseServerLabelRuleService.js.map +1 -0
  417. package/build/dist/Server/Services/DatabaseServerOwnerRuleEngineService.js +340 -0
  418. package/build/dist/Server/Services/DatabaseServerOwnerRuleEngineService.js.map +1 -0
  419. package/build/dist/Server/Services/DatabaseServerOwnerRuleService.js +13 -0
  420. package/build/dist/Server/Services/DatabaseServerOwnerRuleService.js.map +1 -0
  421. package/build/dist/Server/Services/DatabaseServerOwnerTeamService.js +160 -0
  422. package/build/dist/Server/Services/DatabaseServerOwnerTeamService.js.map +1 -0
  423. package/build/dist/Server/Services/DatabaseServerOwnerUserService.js +153 -0
  424. package/build/dist/Server/Services/DatabaseServerOwnerUserService.js.map +1 -0
  425. package/build/dist/Server/Services/DatabaseServerService.js +3272 -0
  426. package/build/dist/Server/Services/DatabaseServerService.js.map +1 -0
  427. package/build/dist/Server/Services/DatabaseService.js +8 -4
  428. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  429. package/build/dist/Server/Services/DockerResourceService.js +30 -3
  430. package/build/dist/Server/Services/DockerResourceService.js.map +1 -1
  431. package/build/dist/Server/Services/IncidentReminderRuleService.js +73 -23
  432. package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
  433. package/build/dist/Server/Services/Index.js +16 -0
  434. package/build/dist/Server/Services/Index.js.map +1 -1
  435. package/build/dist/Server/Services/InventoryItemService.js +88 -5
  436. package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
  437. package/build/dist/Server/Services/IoTDeviceService.js +111 -24
  438. package/build/dist/Server/Services/IoTDeviceService.js.map +1 -1
  439. package/build/dist/Server/Services/MetricService.js +1 -1
  440. package/build/dist/Server/Services/OpenTelemetryIngestService.js +24 -9
  441. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  442. package/build/dist/Server/Services/PodmanResourceService.js +30 -3
  443. package/build/dist/Server/Services/PodmanResourceService.js.map +1 -1
  444. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +75 -23
  445. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
  446. package/build/dist/Server/Services/ServiceService.js +1 -1
  447. package/build/dist/Server/Services/ServiceService.js.map +1 -1
  448. package/build/dist/Server/Services/TelemetryUsageBillingService.js +23 -2
  449. package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
  450. package/build/dist/Server/Services/UserProjectSsoConsentService.js +79 -0
  451. package/build/dist/Server/Services/UserProjectSsoConsentService.js.map +1 -0
  452. package/build/dist/Server/Services/UserService.js +13 -1
  453. package/build/dist/Server/Services/UserService.js.map +1 -1
  454. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +18 -0
  455. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  456. package/build/dist/Server/Types/Database/QueryHelper.js +73 -2
  457. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  458. package/build/dist/Server/Utils/AI/Toolbox/MetricTools.js +13 -2
  459. package/build/dist/Server/Utils/AI/Toolbox/MetricTools.js.map +1 -1
  460. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js +58 -1
  461. package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js.map +1 -1
  462. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +1 -1
  463. package/build/dist/Server/Utils/Database/AffectedResourceRelations.js +6 -0
  464. package/build/dist/Server/Utils/Database/AffectedResourceRelations.js.map +1 -1
  465. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +31 -0
  466. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
  467. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +135 -14
  468. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
  469. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +22 -6
  470. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  471. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +1489 -524
  472. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  473. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +22 -6
  474. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  475. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +196 -6
  476. package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
  477. package/build/dist/Server/Utils/Monitor/MonitorResource.js +36 -9
  478. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  479. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +1 -0
  480. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -1
  481. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +175 -17
  482. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -1
  483. package/build/dist/Server/Utils/Monitor/PerSeriesResolutionRootCause.js +29 -0
  484. package/build/dist/Server/Utils/Monitor/PerSeriesResolutionRootCause.js.map +1 -0
  485. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +211 -0
  486. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  487. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +82 -10
  488. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
  489. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +25 -0
  490. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
  491. package/build/dist/Server/Utils/StartServer.js +20 -4
  492. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  493. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +2 -0
  494. package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -1
  495. package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js +442 -0
  496. package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js.map +1 -0
  497. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +5 -1
  498. package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
  499. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +15 -1
  500. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
  501. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +121 -5
  502. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
  503. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +12 -0
  504. package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
  505. package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js +438 -36
  506. package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js.map +1 -1
  507. package/build/dist/Server/Utils/Telemetry/Telemetry.js +12 -0
  508. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  509. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +17 -18
  510. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  511. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js +16 -10
  512. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js.map +1 -1
  513. package/build/dist/Types/AI/AIResourceContext.js +7 -0
  514. package/build/dist/Types/AI/AIResourceContext.js.map +1 -1
  515. package/build/dist/Types/BaseDatabase/AggregationType.js +7 -0
  516. package/build/dist/Types/BaseDatabase/AggregationType.js.map +1 -1
  517. package/build/dist/Types/Dashboard/DashboardTemplates.js +22 -8
  518. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  519. package/build/dist/Types/DatabaseServer/DatabaseConnectionSpan.js +71 -0
  520. package/build/dist/Types/DatabaseServer/DatabaseConnectionSpan.js.map +1 -0
  521. package/build/dist/Types/DatabaseServer/DatabaseContainerClassifier.js +1462 -0
  522. package/build/dist/Types/DatabaseServer/DatabaseContainerClassifier.js.map +1 -0
  523. package/build/dist/Types/DatabaseServer/DatabaseContainerCommand.js +691 -0
  524. package/build/dist/Types/DatabaseServer/DatabaseContainerCommand.js.map +1 -0
  525. package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js +1407 -0
  526. package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js.map +1 -0
  527. package/build/dist/Types/DatabaseServer/DatabaseServerDiscoverySource.js +60 -0
  528. package/build/dist/Types/DatabaseServer/DatabaseServerDiscoverySource.js.map +1 -0
  529. package/build/dist/Types/DatabaseServer/DatabaseServerMetricCatalog.js +804 -0
  530. package/build/dist/Types/DatabaseServer/DatabaseServerMetricCatalog.js.map +1 -0
  531. package/build/dist/Types/DatabaseServer/DatabaseSystem.js +1860 -0
  532. package/build/dist/Types/DatabaseServer/DatabaseSystem.js.map +1 -0
  533. package/build/dist/Types/DatabaseServer/DatabaseTelemetryResolver.js +406 -0
  534. package/build/dist/Types/DatabaseServer/DatabaseTelemetryResolver.js.map +1 -0
  535. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  536. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  537. package/build/dist/Types/Monitor/CephAlertTemplates.js +18 -0
  538. package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -1
  539. package/build/dist/Types/Monitor/DatabaseAlertTemplates.js +1518 -0
  540. package/build/dist/Types/Monitor/DatabaseAlertTemplates.js.map +1 -0
  541. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +57 -24
  542. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  543. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js +104 -18
  544. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js.map +1 -1
  545. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +80 -3
  546. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  547. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +10 -3
  548. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  549. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +29 -0
  550. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
  551. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js +21 -6
  552. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js.map +1 -1
  553. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +25 -0
  554. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -1
  555. package/build/dist/Types/NetworkDevice/DiscoveredHostNamingStatus.js +136 -0
  556. package/build/dist/Types/NetworkDevice/DiscoveredHostNamingStatus.js.map +1 -0
  557. package/build/dist/Types/Permission.js +234 -0
  558. package/build/dist/Types/Permission.js.map +1 -1
  559. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +10 -0
  560. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  561. package/build/dist/Types/Rules/RuleRun.js +4 -0
  562. package/build/dist/Types/Rules/RuleRun.js.map +1 -1
  563. package/build/dist/Types/Rum/SessionReplayCustomEvents.js.map +1 -1
  564. package/build/dist/Types/Rum/WebVitals.js +12 -0
  565. package/build/dist/Types/Rum/WebVitals.js.map +1 -1
  566. package/build/dist/Types/Telemetry/EntityType.js +23 -0
  567. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  568. package/build/dist/Types/Telemetry/ResourceFacetCatalog.js +14 -0
  569. package/build/dist/Types/Telemetry/ResourceFacetCatalog.js.map +1 -1
  570. package/build/dist/Types/Telemetry/ServiceType.js +8 -0
  571. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  572. package/build/dist/UI/Components/Banner/Banner.js +1 -1
  573. package/build/dist/UI/Components/Banner/Banner.js.map +1 -1
  574. package/build/dist/UI/Components/Card/Card.js +1 -1
  575. package/build/dist/UI/Components/Card/Card.js.map +1 -1
  576. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +2 -2
  577. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  578. package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
  579. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  580. package/build/dist/UI/Components/CommandPalette/CommandPalette.js +1 -1
  581. package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
  582. package/build/dist/UI/Components/Date/StartAndEndDate.js +5 -5
  583. package/build/dist/UI/Components/Date/StartAndEndDate.js.map +1 -1
  584. package/build/dist/UI/Components/Diagram/HorizontalStepChain.js +1 -1
  585. package/build/dist/UI/Components/Diagram/HorizontalStepChain.js.map +1 -1
  586. package/build/dist/UI/Components/Feed/FeedOptionsButton.js +1 -1
  587. package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -1
  588. package/build/dist/UI/Components/Forms/BasicForm.js +1 -1
  589. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  590. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -1
  591. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
  592. package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js +1 -1
  593. package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js.map +1 -1
  594. package/build/dist/UI/Components/Input/Input.js +1 -1
  595. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  596. package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js +1 -1
  597. package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js.map +1 -1
  598. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +1 -1
  599. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  600. package/build/dist/UI/Components/Modal/ModalFooter.js +1 -1
  601. package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
  602. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +2 -2
  603. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
  604. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +4 -4
  605. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  606. package/build/dist/UI/Components/Navbar/NavBar.js +9 -2
  607. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  608. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +2 -2
  609. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  610. package/build/dist/UI/Components/Page/Page.js +1 -1
  611. package/build/dist/UI/Components/Page/Page.js.map +1 -1
  612. package/build/dist/UI/Components/Pagination/Pagination.js +3 -3
  613. package/build/dist/UI/Components/Pagination/Pagination.js.map +1 -1
  614. package/build/dist/UI/Components/ProgressButtons/ProgressButtonItem.js +1 -1
  615. package/build/dist/UI/Components/ProgressButtons/ProgressButtonItem.js.map +1 -1
  616. package/build/dist/UI/Components/SideMenu/SideMenu.js +4 -1
  617. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  618. package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js +3 -1
  619. package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js.map +1 -1
  620. package/build/dist/UI/Components/StatusPage/ResourceList.js +6 -6
  621. package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -1
  622. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +1 -1
  623. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
  624. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js +1 -1
  625. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js.map +1 -1
  626. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js +1 -1
  627. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js.map +1 -1
  628. package/build/dist/UI/Components/Workflow/ComponentsModal.js +2 -2
  629. package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
  630. package/build/dist/UI/Components/Workflow/StepTraceViewer.js +1 -1
  631. package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -1
  632. package/build/dist/UI/Utils/Navigation.js +66 -33
  633. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  634. package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js +7 -0
  635. package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js.map +1 -1
  636. package/build/dist/UI/Utils/TelemetryService.js +3 -2
  637. package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
  638. package/build/dist/Utils/Dashboard/KubernetesClusterCpuTileRepair.js +110 -0
  639. package/build/dist/Utils/Dashboard/KubernetesClusterCpuTileRepair.js.map +1 -0
  640. package/build/dist/Utils/LabelRuleImportExport.js +2 -0
  641. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  642. package/build/dist/Utils/MetricUnitUtil.js +77 -13
  643. package/build/dist/Utils/MetricUnitUtil.js.map +1 -1
  644. package/build/dist/Utils/Monitor/MetricValueFormatter.js +58 -13
  645. package/build/dist/Utils/Monitor/MetricValueFormatter.js.map +1 -1
  646. package/build/dist/Utils/Monitor/PlatformMetricUnitUtil.js +161 -0
  647. package/build/dist/Utils/Monitor/PlatformMetricUnitUtil.js.map +1 -0
  648. package/build/dist/Utils/Monitor/PlatformResourceIdentity.js +323 -0
  649. package/build/dist/Utils/Monitor/PlatformResourceIdentity.js.map +1 -0
  650. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.js +270 -0
  651. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.js.map +1 -0
  652. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +23 -0
  653. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
  654. package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js +61 -0
  655. package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js.map +1 -1
  656. package/build/dist/Utils/Telemetry/DatabaseServerEntityKeys.js +178 -0
  657. package/build/dist/Utils/Telemetry/DatabaseServerEntityKeys.js.map +1 -0
  658. package/build/dist/Utils/Telemetry/EntityKey.js +133 -0
  659. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  660. package/build/dist/Utils/ValueFormatter.js +15 -0
  661. package/build/dist/Utils/ValueFormatter.js.map +1 -1
  662. package/package.json +1 -1
  663. package/tsconfig.tests.json +7 -5
@@ -20,6 +20,7 @@ jest.mock("../../../Server/Utils/PasswordHash", () => {
20
20
 
21
21
  import CephClusterService from "../../../Server/Services/CephClusterService";
22
22
  import CloudResourceService from "../../../Server/Services/CloudResourceService";
23
+ import DatabaseServerService from "../../../Server/Services/DatabaseServerService";
23
24
  import DockerHostService from "../../../Server/Services/DockerHostService";
24
25
  import DockerSwarmClusterService from "../../../Server/Services/DockerSwarmClusterService";
25
26
  import GlobalCache from "../../../Server/Infrastructure/GlobalCache";
@@ -46,9 +47,10 @@ import {
46
47
  /*
47
48
  * Every resource type's liveness heartbeat, pinned together.
48
49
  *
49
- * Twelve services write the same two liveness columns (lastSeenAt +
50
- * otelCollectorStatus) alongside optional columns harvested from
51
- * OpenTelemetry resource attributes, and each has its own markDisconnected*
50
+ * Thirteen services write the same two liveness columns (lastSeenAt +
51
+ * otelCollectorStatus; a database adds collectorLastSeenAt) alongside
52
+ * optional columns harvested from OpenTelemetry resource attributes, and
53
+ * each has its own markDisconnected*
52
54
  * job that flips the resource to "disconnected" 15 minutes after lastSeenAt
53
55
  * stops advancing. They now share one implementation — ResourceHeartbeat —
54
56
  * because eleven hand-copied versions meant eleven copies of the same defect
@@ -109,11 +111,49 @@ type ServiceCase = {
109
111
  * These are what defeated the old throttle — see the header.
110
112
  */
111
113
  churningExtras?: Array<Record<string, unknown>>;
114
+ /**
115
+ * The columns every heartbeat writes, when not just lastSeenAt +
116
+ * otelCollectorStatus. A database also stamps collectorLastSeenAt: an
117
+ * application querying it moves lastSeenAt too, so only that column says
118
+ * the COLLECTOR is alive.
119
+ */
120
+ livenessColumns?: Array<string>;
112
121
  };
113
122
 
114
123
  /** Longer than any bounded column on any of these models. */
115
124
  const OVERSIZED: string = "x".repeat(5000);
116
125
 
126
+ const DEFAULT_LIVENESS_COLUMNS: Array<string> = [
127
+ "lastSeenAt",
128
+ "otelCollectorStatus",
129
+ ];
130
+
131
+ /*
132
+ * The database heartbeat is recordCollectorHeartbeat (a CLIENT span calling
133
+ * the database is a separate, sighting-only heartbeat). This view of the real
134
+ * service gives it the updateLastSeen shape the table drives - `this` stays
135
+ * the view, so the write spies below still see every UPDATE - and answers
136
+ * the one read the heartbeat makes afterwards (the auto-archive restore
137
+ * check) with "no row", so the suite still never reaches Postgres.
138
+ */
139
+ /* eslint-disable @typescript-eslint/no-explicit-any */
140
+ const databaseServerHeartbeat: any = Object.assign(
141
+ Object.create(DatabaseServerService),
142
+ {
143
+ updateLastSeen: function (
144
+ this: typeof DatabaseServerService,
145
+ id: ObjectID,
146
+ extra?: { agentVersion?: string; dbVersion?: string },
147
+ ): Promise<void> {
148
+ return this.recordCollectorHeartbeat(id, extra);
149
+ },
150
+ findOneById: async (): Promise<null> => {
151
+ return null;
152
+ },
153
+ },
154
+ );
155
+ /* eslint-enable @typescript-eslint/no-explicit-any */
156
+
117
157
  /* eslint-disable @typescript-eslint/no-explicit-any */
118
158
  const SERVICE_CASES: Array<ServiceCase> = [
119
159
  {
@@ -257,6 +297,19 @@ const SERVICE_CASES: Array<ServiceCase> = [
257
297
  { osType: "linux", processCount: 413, totalMemoryBytes: 17179869184 },
258
298
  ],
259
299
  },
300
+ {
301
+ name: "DatabaseServerService",
302
+ service: databaseServerHeartbeat,
303
+ namespace: "database-server-last-seen",
304
+ extra: { agentVersion: "0.118.0" },
305
+ otherExtra: { agentVersion: "0.119.0" },
306
+ oversizedExtra: { dbVersion: OVERSIZED },
307
+ livenessColumns: [
308
+ "collectorLastSeenAt",
309
+ "lastSeenAt",
310
+ "otelCollectorStatus",
311
+ ],
312
+ },
260
313
  ];
261
314
  /* eslint-enable @typescript-eslint/no-explicit-any */
262
315
 
@@ -269,7 +322,11 @@ describe.each(SERVICE_CASES)(
269
322
  otherExtra,
270
323
  oversizedExtra,
271
324
  churningExtras,
325
+ livenessColumns,
272
326
  }: ServiceCase) => {
327
+ const liveness: Array<string> = [
328
+ ...(livenessColumns || DEFAULT_LIVENESS_COLUMNS),
329
+ ].sort();
273
330
  let writes: Array<WriteCall>;
274
331
  let cache: Map<string, string>;
275
332
  let deletedCacheKeys: Array<string>;
@@ -329,8 +386,8 @@ describe.each(SERVICE_CASES)(
329
386
  }
330
387
 
331
388
  /**
332
- * Fails any write carrying more than the two liveness columns — the
333
- * shape of a Postgres rejection caused by one bad optional column.
389
+ * Fails any write carrying more than the liveness columns — the shape
390
+ * of a Postgres rejection caused by one bad optional column.
334
391
  */
335
392
  function mockEnrichedWriteFailing(): void {
336
393
  jest
@@ -340,7 +397,7 @@ describe.each(SERVICE_CASES)(
340
397
  ...(input.data as Record<string, unknown>),
341
398
  };
342
399
  writes.push({ id: input.id, data: data });
343
- if (Object.keys(data).length > 2) {
400
+ if (Object.keys(data).length > liveness.length) {
344
401
  throw new Error("value too long for type character varying(100)");
345
402
  }
346
403
  return true;
@@ -505,10 +562,7 @@ describe.each(SERVICE_CASES)(
505
562
  await service.updateLastSeen(RESOURCE_ID, oversizedExtra as never);
506
563
 
507
564
  expect(writes).toHaveLength(2);
508
- expect(Object.keys(lastWrite()).sort()).toEqual([
509
- "lastSeenAt",
510
- "otelCollectorStatus",
511
- ]);
565
+ expect(Object.keys(lastWrite()).sort()).toEqual(liveness);
512
566
  expect(lastWrite()["otelCollectorStatus"]).toBe("connected");
513
567
  expect(lastWrite()["lastSeenAt"]).toBeInstanceOf(Date);
514
568
  });
@@ -553,10 +607,7 @@ describe.each(SERVICE_CASES)(
553
607
 
554
608
  await service.updateLastSeen(RESOURCE_ID, oversizedExtra as never);
555
609
 
556
- expect(Object.keys(lastWrite()).sort()).toEqual([
557
- "lastSeenAt",
558
- "otelCollectorStatus",
559
- ]);
610
+ expect(Object.keys(lastWrite()).sort()).toEqual(liveness);
560
611
  });
561
612
 
562
613
  test("surfaces a genuinely broken database instead of hiding it", async () => {
@@ -617,10 +668,7 @@ describe.each(SERVICE_CASES)(
617
668
  await service.updateLastSeen(RESOURCE_ID, extra as never);
618
669
 
619
670
  expect(writes).toHaveLength(1);
620
- expect(Object.keys(lastWrite()).sort()).toEqual([
621
- "lastSeenAt",
622
- "otelCollectorStatus",
623
- ]);
671
+ expect(Object.keys(lastWrite()).sort()).toEqual(liveness);
624
672
  });
625
673
  });
626
674
 
@@ -668,11 +716,11 @@ describe.each(SERVICE_CASES)(
668
716
  describe("liveness fallback coverage", () => {
669
717
  test("covers every service that writes liveness on the hook-free path", () => {
670
718
  /*
671
- * If a thirteenth resource type grows an updateLastSeen, it belongs in
719
+ * If a fourteenth resource type grows an updateLastSeen, it belongs in
672
720
  * SERVICE_CASES — that is the whole point of this suite. Bumping this
673
721
  * number without adding the case defeats it.
674
722
  */
675
- expect(SERVICE_CASES).toHaveLength(12);
723
+ expect(SERVICE_CASES).toHaveLength(13);
676
724
  });
677
725
 
678
726
  test("no service is listed twice", () => {
@@ -0,0 +1,325 @@
1
+ import LogSavedViewService from "../../../Server/Services/LogSavedViewService";
2
+ import MetricSavedViewService from "../../../Server/Services/MetricSavedViewService";
3
+ import TraceSavedViewService from "../../../Server/Services/TraceSavedViewService";
4
+ import CreateBy from "../../../Server/Types/Database/CreateBy";
5
+ import UpdateBy from "../../../Server/Types/Database/UpdateBy";
6
+ import { OnCreate, OnUpdate } from "../../../Server/Types/Database/Hooks";
7
+ import LogSavedView from "../../../Models/DatabaseModels/LogSavedView";
8
+ import MetricSavedView from "../../../Models/DatabaseModels/MetricSavedView";
9
+ import TraceSavedView from "../../../Models/DatabaseModels/TraceSavedView";
10
+ import BaseModel from "../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
11
+ import ObjectID from "../../../Types/ObjectID";
12
+ import { afterEach, describe, expect, test } from "@jest/globals";
13
+
14
+ /*
15
+ * Telemetry saved views (logs, traces and metrics) each promise a project
16
+ * exactly one default: the first view a project saves becomes its default, and
17
+ * marking another one default clears whichever view held it. Three services
18
+ * carry the same hooks, so the suite runs against all three -- a change made
19
+ * to one of them and not the others shows up here rather than as a project
20
+ * whose telemetry page opens two default views, or none.
21
+ */
22
+
23
+ type SavedViewModel = LogSavedView | MetricSavedView | TraceSavedView;
24
+
25
+ /*
26
+ * The two hooks under test, reached past `protected`. Typed over the union of
27
+ * the three models so one set of cases can drive all three services.
28
+ */
29
+ type SavedViewService = {
30
+ onBeforeCreate: (
31
+ createBy: CreateBy<SavedViewModel>,
32
+ ) => Promise<OnCreate<SavedViewModel>>;
33
+ onBeforeUpdate: (
34
+ updateBy: UpdateBy<SavedViewModel>,
35
+ ) => Promise<OnUpdate<SavedViewModel>>;
36
+ };
37
+
38
+ type ServiceCase = {
39
+ label: string;
40
+ service: SavedViewService;
41
+ buildModel: () => SavedViewModel;
42
+ };
43
+
44
+ const PROJECT_ID: ObjectID = new ObjectID(
45
+ "11111111-1111-4111-8111-111111111111",
46
+ );
47
+ const VIEW_ID: ObjectID = new ObjectID("22222222-2222-4222-8222-222222222222");
48
+
49
+ const cases: Array<ServiceCase> = [
50
+ {
51
+ label: "LogSavedViewService",
52
+ service: LogSavedViewService as unknown as SavedViewService,
53
+ buildModel: (): SavedViewModel => {
54
+ return new LogSavedView();
55
+ },
56
+ },
57
+ {
58
+ label: "TraceSavedViewService",
59
+ service: TraceSavedViewService as unknown as SavedViewService,
60
+ buildModel: (): SavedViewModel => {
61
+ return new TraceSavedView();
62
+ },
63
+ },
64
+ {
65
+ label: "MetricSavedViewService",
66
+ service: MetricSavedViewService as unknown as SavedViewService,
67
+ buildModel: (): SavedViewModel => {
68
+ return new MetricSavedView();
69
+ },
70
+ },
71
+ ];
72
+
73
+ afterEach(() => {
74
+ jest.restoreAllMocks();
75
+ });
76
+
77
+ describe.each(cases)(
78
+ "$label default-view hooks",
79
+ ({ service, buildModel }: ServiceCase) => {
80
+ function mockFindOneBy(existing: SavedViewModel | null): jest.SpyInstance {
81
+ return jest
82
+ .spyOn(service as never, "findOneBy")
83
+ .mockResolvedValue(existing as never);
84
+ }
85
+
86
+ function mockFindBy(items: Array<SavedViewModel>): jest.SpyInstance {
87
+ return jest
88
+ .spyOn(service as never, "findBy")
89
+ .mockResolvedValue(items as never);
90
+ }
91
+
92
+ function mockUpdateBy(): jest.SpyInstance {
93
+ return jest
94
+ .spyOn(service as never, "updateBy")
95
+ .mockResolvedValue(undefined as never);
96
+ }
97
+
98
+ describe("onBeforeCreate", () => {
99
+ test("the first view a project saves becomes its default", async () => {
100
+ mockFindOneBy(null);
101
+ const updateSpy: jest.SpyInstance = mockUpdateBy();
102
+
103
+ const view: SavedViewModel = buildModel();
104
+ view.projectId = PROJECT_ID;
105
+
106
+ const result: OnCreate<SavedViewModel> = await service.onBeforeCreate({
107
+ data: view,
108
+ } as CreateBy<SavedViewModel>);
109
+
110
+ expect(result.createBy.data.isDefault).toBe(true);
111
+ /*
112
+ * Nothing else held the default, but the sweep still runs and is a no-op
113
+ * against an empty project.
114
+ */
115
+ expect(updateSpy).toHaveBeenCalledTimes(1);
116
+ });
117
+
118
+ test("a later view is not made default while one already exists", async () => {
119
+ const existing: SavedViewModel = buildModel();
120
+ existing._id = VIEW_ID.toString();
121
+ mockFindOneBy(existing);
122
+ const updateSpy: jest.SpyInstance = mockUpdateBy();
123
+
124
+ const view: SavedViewModel = buildModel();
125
+ view.projectId = PROJECT_ID;
126
+
127
+ const result: OnCreate<SavedViewModel> = await service.onBeforeCreate({
128
+ data: view,
129
+ } as CreateBy<SavedViewModel>);
130
+
131
+ expect(result.createBy.data.isDefault).toBe(false);
132
+ // Not default, so nothing is unset.
133
+ expect(updateSpy).not.toHaveBeenCalled();
134
+ });
135
+
136
+ test("an explicit isDefault=true clears whichever view held it", async () => {
137
+ const findOneSpy: jest.SpyInstance = mockFindOneBy(null);
138
+ const updateSpy: jest.SpyInstance = mockUpdateBy();
139
+
140
+ const view: SavedViewModel = buildModel();
141
+ view.projectId = PROJECT_ID;
142
+ view.isDefault = true;
143
+
144
+ await service.onBeforeCreate({
145
+ data: view,
146
+ } as CreateBy<SavedViewModel>);
147
+
148
+ // The caller said so, so the service does not go looking.
149
+ expect(findOneSpy).not.toHaveBeenCalled();
150
+ expect(updateSpy).toHaveBeenCalledTimes(1);
151
+ const updateArgs: Record<string, unknown> = updateSpy.mock
152
+ .calls[0]?.[0] as Record<string, unknown>;
153
+ const query: Record<string, unknown> = updateArgs["query"] as Record<
154
+ string,
155
+ unknown
156
+ >;
157
+ expect(query["projectId"]).toBe(PROJECT_ID);
158
+ expect(query["isDefault"]).toBe(true);
159
+ expect(updateArgs["data"]).toEqual({ isDefault: false });
160
+ /*
161
+ * The sweep runs as root: a member may only see their own views, and
162
+ * leaving the others default would break the one-default promise.
163
+ */
164
+ expect(updateArgs["props"]).toEqual({ isRoot: true });
165
+ });
166
+
167
+ test("an explicit isDefault=false is kept, and unsets nothing", async () => {
168
+ const findOneSpy: jest.SpyInstance = mockFindOneBy(null);
169
+ const updateSpy: jest.SpyInstance = mockUpdateBy();
170
+
171
+ const view: SavedViewModel = buildModel();
172
+ view.projectId = PROJECT_ID;
173
+ view.isDefault = false;
174
+
175
+ const result: OnCreate<SavedViewModel> = await service.onBeforeCreate({
176
+ data: view,
177
+ } as CreateBy<SavedViewModel>);
178
+
179
+ expect(result.createBy.data.isDefault).toBe(false);
180
+ expect(findOneSpy).not.toHaveBeenCalled();
181
+ expect(updateSpy).not.toHaveBeenCalled();
182
+ });
183
+
184
+ test("a view with no project is left alone", async () => {
185
+ const findOneSpy: jest.SpyInstance = mockFindOneBy(null);
186
+ const updateSpy: jest.SpyInstance = mockUpdateBy();
187
+
188
+ const view: SavedViewModel = buildModel();
189
+
190
+ const result: OnCreate<SavedViewModel> = await service.onBeforeCreate({
191
+ data: view,
192
+ } as CreateBy<SavedViewModel>);
193
+
194
+ expect(result.createBy.data.isDefault).toBeUndefined();
195
+ expect(findOneSpy).not.toHaveBeenCalled();
196
+ expect(updateSpy).not.toHaveBeenCalled();
197
+ });
198
+
199
+ test("the lookup for an existing default is scoped to the same project", async () => {
200
+ const findOneSpy: jest.SpyInstance = mockFindOneBy(null);
201
+ mockUpdateBy();
202
+
203
+ const view: SavedViewModel = buildModel();
204
+ view.projectId = PROJECT_ID;
205
+
206
+ await service.onBeforeCreate({
207
+ data: view,
208
+ } as CreateBy<SavedViewModel>);
209
+
210
+ const findArgs: Record<string, unknown> = findOneSpy.mock
211
+ .calls[0]?.[0] as Record<string, unknown>;
212
+ expect(findArgs["query"]).toEqual({
213
+ projectId: PROJECT_ID,
214
+ isDefault: true,
215
+ });
216
+ });
217
+ });
218
+
219
+ describe("onBeforeUpdate", () => {
220
+ test("promoting a view to default demotes the others, but not itself", async () => {
221
+ const item: SavedViewModel = buildModel();
222
+ item._id = VIEW_ID.toString();
223
+ item.projectId = PROJECT_ID;
224
+ mockFindBy([item]);
225
+ const updateSpy: jest.SpyInstance = mockUpdateBy();
226
+
227
+ await service.onBeforeUpdate({
228
+ query: { _id: VIEW_ID.toString() },
229
+ data: { isDefault: true },
230
+ } as unknown as UpdateBy<SavedViewModel>);
231
+
232
+ expect(updateSpy).toHaveBeenCalledTimes(1);
233
+ const query: Record<string, unknown> = (
234
+ updateSpy.mock.calls[0]?.[0] as Record<string, unknown>
235
+ )["query"] as Record<string, unknown>;
236
+ expect(query["projectId"]).toBe(PROJECT_ID);
237
+ expect(query["isDefault"]).toBe(true);
238
+ /*
239
+ * The view being promoted is excluded, so the same statement cannot
240
+ * demote it again.
241
+ */
242
+ expect(query["_id"]).toBeDefined();
243
+ });
244
+
245
+ test("an update that does not set isDefault=true touches nothing", async () => {
246
+ const findSpy: jest.SpyInstance = mockFindBy([]);
247
+ const updateSpy: jest.SpyInstance = mockUpdateBy();
248
+
249
+ for (const data of [{ name: "Renamed" }, { isDefault: false }] as Array<
250
+ Partial<SavedViewModel>
251
+ >) {
252
+ await service.onBeforeUpdate({
253
+ query: { _id: VIEW_ID.toString() },
254
+ data: data,
255
+ } as unknown as UpdateBy<SavedViewModel>);
256
+ }
257
+
258
+ expect(findSpy).not.toHaveBeenCalled();
259
+ expect(updateSpy).not.toHaveBeenCalled();
260
+ });
261
+
262
+ test("a bulk promotion demotes the others in each affected project", async () => {
263
+ const otherProjectId: ObjectID = new ObjectID(
264
+ "33333333-3333-4333-8333-333333333333",
265
+ );
266
+ const first: SavedViewModel = buildModel();
267
+ first._id = VIEW_ID.toString();
268
+ first.projectId = PROJECT_ID;
269
+ const second: SavedViewModel = buildModel();
270
+ second._id = "44444444-4444-4444-8444-444444444444";
271
+ second.projectId = otherProjectId;
272
+ mockFindBy([first, second]);
273
+ const updateSpy: jest.SpyInstance = mockUpdateBy();
274
+
275
+ await service.onBeforeUpdate({
276
+ query: { isDefault: false },
277
+ data: { isDefault: true },
278
+ } as unknown as UpdateBy<SavedViewModel>);
279
+
280
+ expect(updateSpy).toHaveBeenCalledTimes(2);
281
+ const projectIds: Array<unknown> = updateSpy.mock.calls.map(
282
+ (call: Array<unknown>) => {
283
+ return (
284
+ (call[0] as Record<string, unknown>)["query"] as Record<
285
+ string,
286
+ unknown
287
+ >
288
+ )["projectId"];
289
+ },
290
+ );
291
+ expect(projectIds).toEqual([PROJECT_ID, otherProjectId]);
292
+ });
293
+
294
+ test("a matched view with no project is skipped rather than swept globally", async () => {
295
+ const orphan: SavedViewModel = buildModel();
296
+ orphan._id = VIEW_ID.toString();
297
+ mockFindBy([orphan]);
298
+ const updateSpy: jest.SpyInstance = mockUpdateBy();
299
+
300
+ await service.onBeforeUpdate({
301
+ query: { _id: VIEW_ID.toString() },
302
+ data: { isDefault: true },
303
+ } as unknown as UpdateBy<SavedViewModel>);
304
+
305
+ expect(updateSpy).not.toHaveBeenCalled();
306
+ });
307
+ });
308
+ },
309
+ );
310
+
311
+ describe("the three saved-view services", () => {
312
+ test("are distinct services over distinct models", () => {
313
+ const models: Array<string> = cases.map(({ buildModel }: ServiceCase) => {
314
+ return (buildModel() as BaseModel).tableName as string;
315
+ });
316
+ expect(new Set(models).size).toBe(3);
317
+ expect(
318
+ new Set([
319
+ LogSavedViewService,
320
+ TraceSavedViewService,
321
+ MetricSavedViewService,
322
+ ]).size,
323
+ ).toBe(3);
324
+ });
325
+ });
@@ -196,9 +196,9 @@ describe("static rule criteria runtime coverage", () => {
196
196
  discoverStaticRuleForms();
197
197
  const inheritedRuleModelNames: Array<string> = getInheritedRuleModelNames();
198
198
 
199
- test("all 64 static match-criteria forms route their 76 rule models through ModelForm", () => {
200
- expect(formFiles).toHaveLength(64);
201
- expect(formsByModel.size).toBe(76);
199
+ test("all 66 static match-criteria forms route their 78 rule models through ModelForm", () => {
200
+ expect(formFiles).toHaveLength(66);
201
+ expect(formsByModel.size).toBe(78);
202
202
  expect([...formsByModel.keys()].sort()).toEqual(inheritedRuleModelNames);
203
203
  expect(Object.keys(RULE_CRITERIA_FIELDS_BY_MODEL).sort()).toEqual(
204
204
  inheritedRuleModelNames,
@@ -0,0 +1,169 @@
1
+ import StatusPageCertificateService from "../../../Server/Services/StatusPageCertificateService";
2
+ import DatabaseConfig from "../../../Server/DatabaseConfig";
3
+ import { AppApiHostname } from "../../../Server/EnvironmentConfig";
4
+ import API from "../../../Utils/API";
5
+ import Protocol from "../../../Types/API/Protocol";
6
+ import URL from "../../../Types/API/URL";
7
+ import { afterEach, describe, expect, test } from "@jest/globals";
8
+
9
+ /*
10
+ * Custom status page domains get their TLS certificate from the cert worker,
11
+ * and this service is the only caller. Nothing about it is visible until a
12
+ * customer's domain fails to serve HTTPS, so what these tests hold is the
13
+ * request itself: the verb, the worker route, the domain in the body, and the
14
+ * protocol taken from the instance's own configuration rather than assumed.
15
+ */
16
+
17
+ const WORKER_ROUTE: string = "/api/workers/cert";
18
+ const DOMAIN: string = "status.example.com";
19
+
20
+ type ApiCall = { url: URL; data: Record<string, unknown> };
21
+
22
+ function lastCall(spy: jest.SpyInstance): ApiCall {
23
+ return spy.mock.calls[spy.mock.calls.length - 1]?.[0] as ApiCall;
24
+ }
25
+
26
+ afterEach(() => {
27
+ jest.restoreAllMocks();
28
+ });
29
+
30
+ describe.each([
31
+ { label: "https", protocol: Protocol.HTTPS },
32
+ { label: "http", protocol: Protocol.HTTP },
33
+ ])(
34
+ "StatusPageCertificateService over $label",
35
+ ({ protocol }: { protocol: Protocol }) => {
36
+ function mockProtocol(): jest.SpyInstance {
37
+ return jest
38
+ .spyOn(DatabaseConfig, "getHttpProtocol")
39
+ .mockResolvedValue(protocol as never);
40
+ }
41
+
42
+ test("add posts the domain to the cert worker", async () => {
43
+ mockProtocol();
44
+ const postSpy: jest.SpyInstance = jest
45
+ .spyOn(API, "post")
46
+ .mockResolvedValue({} as never);
47
+
48
+ await StatusPageCertificateService.add(DOMAIN);
49
+
50
+ expect(postSpy).toHaveBeenCalledTimes(1);
51
+ const call: ApiCall = lastCall(postSpy);
52
+ expect(call.data).toEqual({ domain: DOMAIN });
53
+ expect(call.url.protocol).toBe(protocol);
54
+ expect(call.url.hostname.toString()).toBe(AppApiHostname.toString());
55
+ expect(call.url.route.toString()).toBe(WORKER_ROUTE);
56
+ });
57
+
58
+ test("remove deletes the domain at the same route", async () => {
59
+ mockProtocol();
60
+ const deleteSpy: jest.SpyInstance = jest
61
+ .spyOn(API, "delete")
62
+ .mockResolvedValue({} as never);
63
+
64
+ await StatusPageCertificateService.remove(DOMAIN);
65
+
66
+ expect(deleteSpy).toHaveBeenCalledTimes(1);
67
+ const call: ApiCall = lastCall(deleteSpy);
68
+ expect(call.data).toEqual({ domain: DOMAIN });
69
+ expect(call.url.protocol).toBe(protocol);
70
+ expect(call.url.route.toString()).toBe(WORKER_ROUTE);
71
+ });
72
+
73
+ test("get reads the domain's certificate from the same route", async () => {
74
+ mockProtocol();
75
+ const getSpy: jest.SpyInstance = jest
76
+ .spyOn(API, "get")
77
+ .mockResolvedValue({} as never);
78
+
79
+ await StatusPageCertificateService.get(DOMAIN);
80
+
81
+ expect(getSpy).toHaveBeenCalledTimes(1);
82
+ const call: ApiCall = lastCall(getSpy);
83
+ expect(call.data).toEqual({ domain: DOMAIN });
84
+ expect(call.url.protocol).toBe(protocol);
85
+ expect(call.url.route.toString()).toBe(WORKER_ROUTE);
86
+ });
87
+ },
88
+ );
89
+
90
+ describe("StatusPageCertificateService", () => {
91
+ test("each verb reads the protocol fresh rather than caching the first answer", async () => {
92
+ const protocolSpy: jest.SpyInstance = jest
93
+ .spyOn(DatabaseConfig, "getHttpProtocol")
94
+ .mockResolvedValueOnce(Protocol.HTTP as never)
95
+ .mockResolvedValueOnce(Protocol.HTTPS as never);
96
+ const postSpy: jest.SpyInstance = jest
97
+ .spyOn(API, "post")
98
+ .mockResolvedValue({} as never);
99
+
100
+ await StatusPageCertificateService.add(DOMAIN);
101
+ await StatusPageCertificateService.add(DOMAIN);
102
+
103
+ expect(protocolSpy).toHaveBeenCalledTimes(2);
104
+ expect((postSpy.mock.calls[0]?.[0] as ApiCall).url.protocol).toBe(
105
+ Protocol.HTTP,
106
+ );
107
+ expect((postSpy.mock.calls[1]?.[0] as ApiCall).url.protocol).toBe(
108
+ Protocol.HTTPS,
109
+ );
110
+ });
111
+
112
+ test("the three verbs do not call one another", async () => {
113
+ jest
114
+ .spyOn(DatabaseConfig, "getHttpProtocol")
115
+ .mockResolvedValue(Protocol.HTTPS as never);
116
+ const postSpy: jest.SpyInstance = jest
117
+ .spyOn(API, "post")
118
+ .mockResolvedValue({} as never);
119
+ const deleteSpy: jest.SpyInstance = jest
120
+ .spyOn(API, "delete")
121
+ .mockResolvedValue({} as never);
122
+ const getSpy: jest.SpyInstance = jest
123
+ .spyOn(API, "get")
124
+ .mockResolvedValue({} as never);
125
+
126
+ await StatusPageCertificateService.get(DOMAIN);
127
+
128
+ expect(getSpy).toHaveBeenCalledTimes(1);
129
+ expect(postSpy).not.toHaveBeenCalled();
130
+ expect(deleteSpy).not.toHaveBeenCalled();
131
+
132
+ await StatusPageCertificateService.remove(DOMAIN);
133
+
134
+ expect(deleteSpy).toHaveBeenCalledTimes(1);
135
+ expect(postSpy).not.toHaveBeenCalled();
136
+ });
137
+
138
+ test("the domain is passed through untouched, punycode and all", async () => {
139
+ jest
140
+ .spyOn(DatabaseConfig, "getHttpProtocol")
141
+ .mockResolvedValue(Protocol.HTTPS as never);
142
+ const postSpy: jest.SpyInstance = jest
143
+ .spyOn(API, "post")
144
+ .mockResolvedValue({} as never);
145
+
146
+ for (const domain of [
147
+ "status.example.com",
148
+ "xn--80ak6aa92e.example.com",
149
+ "STATUS.EXAMPLE.COM",
150
+ "status.example.co.uk",
151
+ ]) {
152
+ await StatusPageCertificateService.add(domain);
153
+ expect(lastCall(postSpy).data).toEqual({ domain: domain });
154
+ }
155
+ });
156
+
157
+ test("a failing worker call is surfaced, not swallowed", async () => {
158
+ jest
159
+ .spyOn(DatabaseConfig, "getHttpProtocol")
160
+ .mockResolvedValue(Protocol.HTTPS as never);
161
+ jest
162
+ .spyOn(API, "post")
163
+ .mockRejectedValue(new Error("cert worker unreachable") as never);
164
+
165
+ await expect(StatusPageCertificateService.add(DOMAIN)).rejects.toThrow(
166
+ "cert worker unreachable",
167
+ );
168
+ });
169
+ });