@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
@@ -4,8 +4,13 @@ import {
4
4
  getAllKubernetesAlertTemplates,
5
5
  getKubernetesAlertTemplateById,
6
6
  } from "../../../Types/Monitor/KubernetesAlertTemplates";
7
+ import {
8
+ KubernetesMetricDefinition,
9
+ getKubernetesMetricByMetricName,
10
+ } from "../../../Types/Monitor/KubernetesMetricCatalog";
7
11
  import MonitorStep from "../../../Types/Monitor/MonitorStep";
8
12
  import { hasRecoveryDeadBand } from "./Utils/RecommendationCriteriaAssertions";
13
+ import { AGENT_EMITTED_METRIC_NAMES } from "./Utils/KubernetesAgentEmittedMetrics";
9
14
  import MonitorStepKubernetesMonitor from "../../../Types/Monitor/MonitorStepKubernetesMonitor";
10
15
  import MetricsAggregationType from "../../../Types/Metrics/MetricsAggregationType";
11
16
  import { FilterType } from "../../../Types/Monitor/CriteriaFilter";
@@ -953,3 +958,296 @@ describe("KubernetesAlertTemplates - grouped alerts point at the right field", (
953
958
  }
954
959
  });
955
960
  });
961
+
962
+ /*
963
+ * BUG: a k8s-high-memory incident email listed each node with a value of
964
+ * `257760964608` — bytes of `k8s.node.allocatable_memory`, with no unit.
965
+ * The "Affected Resources" list takes its unit (and friendly name) from
966
+ * KubernetesMetricCatalog by metric name, and that metric — like seven
967
+ * others the templates query — had no catalog entry, so the value went
968
+ * out bare.
969
+ *
970
+ * Enumerated over every template and every query, so a template added or
971
+ * rewired later against a metric the catalog does not know fails here
972
+ * rather than in an on-call engineer's inbox.
973
+ */
974
+ describe("KubernetesAlertTemplates - references only catalog metrics", () => {
975
+ /*
976
+ * k8s.node.cpu.usage (the High Node CPU Utilization numerator) is not a
977
+ * metric the kubeletstats receiver the agent pins (0.96.0) emits — see
978
+ * Utils/KubernetesAgentEmittedMetrics — so the catalog, which only
979
+ * offers what the agent sends, deliberately leaves it out. The template
980
+ * querying it is a separate defect; until it is fixed it is the one
981
+ * exception here.
982
+ */
983
+ const NOT_EMITTED_BY_THE_PINNED_AGENT: ReadonlySet<string> = new Set<string>([
984
+ "k8s.node.cpu.usage",
985
+ ]);
986
+
987
+ function getMetricNames(template: KubernetesAlertTemplate): Array<string> {
988
+ return (
989
+ getKubernetesMonitor(template.getMonitorStep(buildArgs()))
990
+ .metricViewConfig.queryConfigs as Array<any>
991
+ ).map((query: any) => {
992
+ return query.metricQueryData.filterData.metricName as string;
993
+ });
994
+ }
995
+
996
+ test("every template queries at least one metric (guards the guard)", () => {
997
+ for (const template of getAllKubernetesAlertTemplates()) {
998
+ expect(getMetricNames(template).length).toBeGreaterThan(0);
999
+ }
1000
+ });
1001
+
1002
+ test.each(
1003
+ getAllKubernetesAlertTemplates().map((t: KubernetesAlertTemplate) => {
1004
+ return [t.id, t];
1005
+ }),
1006
+ )("%s references only catalog metrics", (_id: unknown, template: unknown) => {
1007
+ for (const metricName of getMetricNames(
1008
+ template as KubernetesAlertTemplate,
1009
+ )) {
1010
+ if (NOT_EMITTED_BY_THE_PINNED_AGENT.has(metricName)) {
1011
+ continue;
1012
+ }
1013
+
1014
+ const entry: KubernetesMetricDefinition | undefined =
1015
+ getKubernetesMetricByMetricName(metricName);
1016
+
1017
+ expect({ metricName, inCatalog: entry !== undefined }).toEqual({
1018
+ metricName,
1019
+ inCatalog: true,
1020
+ });
1021
+ }
1022
+ });
1023
+
1024
+ test("the metrics that were missing now resolve, with a unit", () => {
1025
+ const expectedUnits: Record<string, string> = {
1026
+ "k8s.node.allocatable_memory": "bytes",
1027
+ "k8s.node.allocatable_cpu": "cores",
1028
+ "k8s.pod.memory_limit_utilization": "ratio",
1029
+ "k8s.pod.cpu_limit_utilization": "ratio",
1030
+ // A 0/1 flag: no dimension to print, deliberately.
1031
+ etcd_server_has_leader: "",
1032
+ apiserver_current_inflight_requests: "count",
1033
+ scheduler_pending_pods: "count",
1034
+ };
1035
+
1036
+ for (const [metricName, unit] of Object.entries(expectedUnits)) {
1037
+ expect(getKubernetesMetricByMetricName(metricName)?.unit).toBe(unit);
1038
+ }
1039
+ });
1040
+ });
1041
+
1042
+ /*
1043
+ * BUG: k8s-deployment-replica-mismatch queried
1044
+ * `k8s.deployment.unavailable_replicas`. The agent's k8s_cluster receiver
1045
+ * has no such series — it reports a Deployment as `k8s.deployment.desired`
1046
+ * and `k8s.deployment.available` — and the chart renames nothing, so the
1047
+ * query matched zero rows and the monitor could never fire. The shortfall
1048
+ * is now computed per deployment as desired - available.
1049
+ */
1050
+ describe("KubernetesAlertTemplates - deployment replica mismatch", () => {
1051
+ const ID: string = "k8s-deployment-replica-mismatch";
1052
+
1053
+ test("queries only metrics the shipped agent emits", () => {
1054
+ const queryConfigs: Array<any> = getQueryConfigs(ID);
1055
+
1056
+ expect(queryConfigs.length).toBeGreaterThan(0);
1057
+
1058
+ for (const query of queryConfigs) {
1059
+ const metricName: string = query.metricQueryData.filterData.metricName;
1060
+
1061
+ expect(
1062
+ `${metricName} emitted: ${AGENT_EMITTED_METRIC_NAMES.has(metricName)}`,
1063
+ ).toBe(`${metricName} emitted: true`);
1064
+ }
1065
+ });
1066
+
1067
+ test("computes desired - available, per namespace + deployment, on both queries", () => {
1068
+ const monitor: MonitorStepKubernetesMonitor = getKubernetesMonitor(
1069
+ getStep(ID),
1070
+ );
1071
+ const queryConfigs: Array<any> = monitor.metricViewConfig
1072
+ .queryConfigs as Array<any>;
1073
+ const formulaConfigs: Array<any> = monitor.metricViewConfig
1074
+ .formulaConfigs as Array<any>;
1075
+
1076
+ expect(queryConfigs).toHaveLength(2);
1077
+ expect(formulaConfigs).toHaveLength(1);
1078
+
1079
+ const [desired, available] = queryConfigs;
1080
+
1081
+ expect(desired.metricQueryData.filterData.metricName).toBe(
1082
+ "k8s.deployment.desired",
1083
+ );
1084
+ expect(desired.metricAliasData.metricVariable).toBe("desired_replicas");
1085
+ expect(available.metricQueryData.filterData.metricName).toBe(
1086
+ "k8s.deployment.available",
1087
+ );
1088
+ expect(available.metricAliasData.metricVariable).toBe("available_replicas");
1089
+
1090
+ expect(formulaConfigs[0].metricFormulaData.metricFormula).toBe(
1091
+ "desired_replicas - available_replicas",
1092
+ );
1093
+ // A pod count. "%" would render a shortfall of 2 replicas as "2%".
1094
+ expect(formulaConfigs[0].metricAliasData.legendUnit).toBe("");
1095
+
1096
+ for (const query of queryConfigs) {
1097
+ /*
1098
+ * Both sides carry exactly this key set, or the formula's
1099
+ * fingerprint join finds nothing and the monitor goes silent.
1100
+ */
1101
+ expect(query.metricQueryData.groupByAttributeKeys).toEqual([
1102
+ "resource.k8s.namespace.name",
1103
+ "resource.k8s.deployment.name",
1104
+ ]);
1105
+ /*
1106
+ * One series per deployment per side, from one scrape: Avg is the
1107
+ * per-minute count. Sum would scale the shortfall by scrape count.
1108
+ */
1109
+ expect(query.metricQueryData.filterData.aggegationType).toBe(
1110
+ MetricsAggregationType.Avg,
1111
+ );
1112
+ // An attribute filter nothing stamps would match zero rows.
1113
+ expect(query.metricQueryData.filterData.attributes).toEqual({});
1114
+ }
1115
+ });
1116
+
1117
+ test("fires on any shortfall and recovers at or below zero", () => {
1118
+ const [offline, online] = getCriteriaInstances(ID);
1119
+ const offlineFilter: any = offline.data.filters[0];
1120
+ const onlineFilter: any = online.data.filters[0];
1121
+
1122
+ // Both compare the FORMULA, never a raw operand.
1123
+ expect(offlineFilter.metricMonitorOptions.metricAlias).toBe(
1124
+ "replica_shortfall",
1125
+ );
1126
+ expect(onlineFilter.metricMonitorOptions.metricAlias).toBe(
1127
+ "replica_shortfall",
1128
+ );
1129
+
1130
+ expect(offlineFilter.filterType).toBe(FilterType.GreaterThan);
1131
+ expect(offlineFilter.value).toBe(0);
1132
+
1133
+ /*
1134
+ * `<= 0`, not `= 0`: a surge rollout makes available exceed desired,
1135
+ * and a negative shortfall that matched neither criteria would leave
1136
+ * the monitor stuck in whatever status it last had.
1137
+ */
1138
+ expect(onlineFilter.filterType).toBe(FilterType.LessThanOrEqualTo);
1139
+ expect(onlineFilter.value).toBe(0);
1140
+
1141
+ expect(offline.data.createIncidents).toBe(true);
1142
+ expect(online.data.createIncidents).toBe(false);
1143
+ });
1144
+
1145
+ test("names no metric the receiver does not have", () => {
1146
+ const template: KubernetesAlertTemplate | undefined =
1147
+ getKubernetesAlertTemplateById(ID);
1148
+ const [offline] = getCriteriaInstances(ID);
1149
+
1150
+ for (const text of [
1151
+ template!.description,
1152
+ offline.data.name as string,
1153
+ offline.data.description as string,
1154
+ offline.data.incidents[0].description as string,
1155
+ ]) {
1156
+ expect(text).not.toContain("unavailable_replicas");
1157
+ }
1158
+
1159
+ expect(template!.description).toContain("k8s.deployment.desired");
1160
+ expect(template!.description).toContain("k8s.deployment.available");
1161
+ });
1162
+
1163
+ /*
1164
+ * The same bug, generalised: any template reading a k8s_cluster or
1165
+ * kubeletstats series must read one the agent actually sends. That
1166
+ * covers node, pod and container metrics too, including the kubeletstats
1167
+ * ones that are off upstream and on only because the chart enables them
1168
+ * (see the high node CPU block below). Undotted names come from the
1169
+ * chart's Prometheus scrapes (control plane, cAdvisor, kube-state-metrics),
1170
+ * which this list does not cover.
1171
+ */
1172
+ test("no template queries a k8s_cluster or kubeletstats metric the agent does not emit", () => {
1173
+ const receiverMetric: RegExp = /^(k8s|container)\./;
1174
+
1175
+ for (const template of getAllKubernetesAlertTemplates()) {
1176
+ for (const query of getQueryConfigs(template.id)) {
1177
+ const metricName: string = query.metricQueryData.filterData.metricName;
1178
+
1179
+ if (!receiverMetric.test(metricName)) {
1180
+ continue;
1181
+ }
1182
+
1183
+ expect(`${template.id}: ${metricName}`).toBe(
1184
+ AGENT_EMITTED_METRIC_NAMES.has(metricName)
1185
+ ? `${template.id}: ${metricName}`
1186
+ : "a metric the agent emits",
1187
+ );
1188
+ }
1189
+ }
1190
+ });
1191
+ });
1192
+
1193
+ /*
1194
+ * BUG: k8s-high-cpu divides `k8s.node.cpu.usage` by
1195
+ * `k8s.node.allocatable_cpu`. The kubeletstats receiver in the collector the
1196
+ * agent chart ships (0.96.0) defines `k8s.node.cpu.usage` but leaves it
1197
+ * `enabled: false`, and the chart only switched on the
1198
+ * *_limit/_request_utilization family, so the numerator never arrived: the
1199
+ * formula had no operand and the monitor could never fire. The chart now
1200
+ * enables it unconditionally (HelmChart/Public/kubernetes-agent/tests/
1201
+ * kubeletstats-cpu-usage_test.yaml pins that), and these tests pin the
1202
+ * template to the names the agent sends.
1203
+ */
1204
+ describe("KubernetesAlertTemplates - high node CPU", () => {
1205
+ const ID: string = "k8s-high-cpu";
1206
+
1207
+ test("queries only metrics the shipped agent emits", () => {
1208
+ const queryConfigs: Array<any> = getQueryConfigs(ID);
1209
+
1210
+ expect(queryConfigs.length).toBeGreaterThan(0);
1211
+
1212
+ for (const query of queryConfigs) {
1213
+ const metricName: string = query.metricQueryData.filterData.metricName;
1214
+
1215
+ expect(
1216
+ `${metricName} emitted: ${AGENT_EMITTED_METRIC_NAMES.has(metricName)}`,
1217
+ ).toBe(`${metricName} emitted: true`);
1218
+ }
1219
+ });
1220
+
1221
+ test("divides node CPU usage by node allocatable CPU, both in cores", () => {
1222
+ const monitor: MonitorStepKubernetesMonitor = getKubernetesMonitor(
1223
+ getStep(ID),
1224
+ );
1225
+ const queryConfigs: Array<any> = monitor.metricViewConfig
1226
+ .queryConfigs as Array<any>;
1227
+ const formulaConfigs: Array<any> = monitor.metricViewConfig
1228
+ .formulaConfigs as Array<any>;
1229
+
1230
+ /*
1231
+ * Not `k8s.node.cpu.utilization`, although the receiver sends it by
1232
+ * default with the same value (cores, despite the name). It is
1233
+ * deprecated upstream in favour of `k8s.node.cpu.usage`, and later
1234
+ * collectors switch it off and then drop it, so reading it would put
1235
+ * this monitor back where it started on the next collector bump.
1236
+ */
1237
+ expect(
1238
+ queryConfigs.map((query: any) => {
1239
+ return query.metricQueryData.filterData.metricName;
1240
+ }),
1241
+ ).toEqual(["k8s.node.cpu.usage", "k8s.node.allocatable_cpu"]);
1242
+ expect(
1243
+ queryConfigs.map((query: any) => {
1244
+ return query.metricAliasData.metricVariable;
1245
+ }),
1246
+ ).toEqual(["used_cpu", "alloc_cpu"]);
1247
+
1248
+ expect(formulaConfigs).toHaveLength(1);
1249
+ expect(formulaConfigs[0].metricFormulaData.metricFormula).toBe(
1250
+ "(used_cpu / alloc_cpu) * 100",
1251
+ );
1252
+ });
1253
+ });
@@ -5,9 +5,17 @@ import {
5
5
  getAllKubernetesMetrics,
6
6
  getKubernetesMetricById,
7
7
  getKubernetesMetricByMetricName,
8
+ getKubernetesMetricCategoryLabel,
8
9
  getKubernetesMetricsByCategory,
9
10
  } from "../../../Types/Monitor/KubernetesMetricCatalog";
11
+ import { KubernetesResourceScope } from "../../../Types/Monitor/MonitorStepKubernetesMonitor";
10
12
  import AggregationType from "../../../Types/BaseDatabase/AggregationType";
13
+ import MetricValueFormatter from "../../../Utils/Monitor/MetricValueFormatter";
14
+ import {
15
+ AGENT_COLLECTOR_IMAGE_TAG,
16
+ AGENT_EMITTED_METRIC_NAMES,
17
+ readAgentChartValues,
18
+ } from "./Utils/KubernetesAgentEmittedMetrics";
11
19
  import { describe, expect, test } from "@jest/globals";
12
20
 
13
21
  describe("KubernetesMetricCatalog", () => {
@@ -304,4 +312,267 @@ describe("KubernetesMetricCatalog", () => {
304
312
  }
305
313
  });
306
314
  });
315
+
316
+ /*
317
+ * The catalog's `unit` is what an incident email prints next to a value
318
+ * in its "Affected Resources" list. An entry that carries a physical
319
+ * quantity without declaring it sends the reader a bare
320
+ * `257760964608` where "258 GB" was meant. These rules are keyed on the
321
+ * metric NAME, so an entry added later is held to them automatically.
322
+ *
323
+ * The one exception on both rules is a kubeletstats `*_utilization`
324
+ * (underscore) metric: usage divided by a limit or request, a 0-1 ratio
325
+ * that renders as a percentage. The dot-spelled `*.cpu.utilization`
326
+ * gauges are NOT ratios — they are misnamed cores gauges — and are held
327
+ * to the cores rule like any other CPU metric.
328
+ */
329
+ describe("physical quantities carry their unit", () => {
330
+ const utilizationRatioName: RegExp = /_utilization$/;
331
+ const byteQuantityName: RegExp = /memory|filesystem|_bytes$/;
332
+ const cpuQuantityName: RegExp = /cpu/;
333
+
334
+ const isUtilizationRatio: (metricName: string) => boolean = (
335
+ metricName: string,
336
+ ): boolean => {
337
+ return utilizationRatioName.test(metricName);
338
+ };
339
+
340
+ const isByteQuantity: (metricName: string) => boolean = (
341
+ metricName: string,
342
+ ): boolean => {
343
+ return byteQuantityName.test(metricName);
344
+ };
345
+
346
+ const isCpuQuantity: (metricName: string) => boolean = (
347
+ metricName: string,
348
+ ): boolean => {
349
+ return cpuQuantityName.test(metricName);
350
+ };
351
+
352
+ test("the rules below match real entries (guards the guard)", () => {
353
+ const names: Array<string> = allMetrics.map(
354
+ (m: KubernetesMetricDefinition) => {
355
+ return m.metricName;
356
+ },
357
+ );
358
+
359
+ expect(names.filter(isByteQuantity).length).toBeGreaterThanOrEqual(8);
360
+ expect(names.filter(isCpuQuantity).length).toBeGreaterThanOrEqual(6);
361
+ expect(names.filter(isUtilizationRatio).length).toBeGreaterThanOrEqual(2);
362
+ });
363
+
364
+ test("every memory / filesystem / *_bytes metric is in bytes", () => {
365
+ for (const metric of allMetrics) {
366
+ if (
367
+ !isByteQuantity(metric.metricName) ||
368
+ isUtilizationRatio(metric.metricName)
369
+ ) {
370
+ continue;
371
+ }
372
+
373
+ expect({ metricName: metric.metricName, unit: metric.unit }).toEqual({
374
+ metricName: metric.metricName,
375
+ unit: "bytes",
376
+ });
377
+ }
378
+ });
379
+
380
+ test("every CPU usage / allocatable / request / limit metric is in cores", () => {
381
+ for (const metric of allMetrics) {
382
+ if (
383
+ !isCpuQuantity(metric.metricName) ||
384
+ isUtilizationRatio(metric.metricName)
385
+ ) {
386
+ continue;
387
+ }
388
+
389
+ expect({ metricName: metric.metricName, unit: metric.unit }).toEqual({
390
+ metricName: metric.metricName,
391
+ unit: "cores",
392
+ });
393
+ }
394
+ });
395
+
396
+ test("every *_utilization metric is a ratio, never a percent", () => {
397
+ for (const metric of allMetrics) {
398
+ if (!isUtilizationRatio(metric.metricName)) {
399
+ continue;
400
+ }
401
+
402
+ /*
403
+ * "ratio" is what MetricValueFormatter turns into a percentage on a
404
+ * `_utilization` name. "%" would print 0.93 as "0.93%".
405
+ */
406
+ expect({ metricName: metric.metricName, unit: metric.unit }).toEqual({
407
+ metricName: metric.metricName,
408
+ unit: "ratio",
409
+ });
410
+ }
411
+ });
412
+ });
413
+
414
+ /*
415
+ * etcd, the API server and the scheduler are scraped as Prometheus
416
+ * metrics and are one cluster-wide signal each, so they get a category
417
+ * of their own and the Cluster scope.
418
+ */
419
+ describe("control-plane metrics", () => {
420
+ test("have a category of their own", () => {
421
+ expect(allCategories).toContain("ControlPlane");
422
+ expect(
423
+ getKubernetesMetricsByCategory("ControlPlane")
424
+ .map((m: KubernetesMetricDefinition) => {
425
+ return m.metricName;
426
+ })
427
+ .sort(),
428
+ ).toEqual([
429
+ "apiserver_current_inflight_requests",
430
+ "etcd_server_has_leader",
431
+ "scheduler_pending_pods",
432
+ ]);
433
+ });
434
+
435
+ /*
436
+ * The category value matches the alert templates' "ControlPlane"; the
437
+ * metric picker titles its group with the label, not the identifier.
438
+ */
439
+ test("are titled 'Control Plane' in a picker, other categories as-is", () => {
440
+ expect(getKubernetesMetricCategoryLabel("ControlPlane")).toBe(
441
+ "Control Plane",
442
+ );
443
+
444
+ for (const category of allCategories) {
445
+ if (category !== "ControlPlane") {
446
+ expect(getKubernetesMetricCategoryLabel(category)).toBe(category);
447
+ }
448
+ }
449
+ });
450
+
451
+ test("are scoped to the whole cluster", () => {
452
+ for (const metric of getKubernetesMetricsByCategory("ControlPlane")) {
453
+ expect(metric.defaultResourceScope).toBe(
454
+ KubernetesResourceScope.Cluster,
455
+ );
456
+ }
457
+ });
458
+
459
+ test("etcd leadership is a flag with no unit, watched at its minimum", () => {
460
+ const hasLeader: KubernetesMetricDefinition | undefined =
461
+ getKubernetesMetricByMetricName("etcd_server_has_leader");
462
+
463
+ expect(hasLeader?.unit).toBe("");
464
+ expect(hasLeader?.defaultAggregation).toBe(AggregationType.Min);
465
+ });
466
+ });
467
+
468
+ /*
469
+ * What the entries the alert templates were missing look like in a
470
+ * notification, through the same formatter the incident email uses.
471
+ */
472
+ describe("the entries the alert templates needed render human-readable", () => {
473
+ function formatFor(metricName: string, value: number): string {
474
+ const entry: KubernetesMetricDefinition | undefined =
475
+ getKubernetesMetricByMetricName(metricName);
476
+
477
+ expect(entry).toBeDefined();
478
+
479
+ return MetricValueFormatter.format({
480
+ value: value,
481
+ unit: entry!.unit,
482
+ metricName: entry!.metricName,
483
+ });
484
+ }
485
+
486
+ test("allocatable memory reads in GB, not as twelve digits", () => {
487
+ expect(formatFor("k8s.node.allocatable_memory", 257760964608)).toBe(
488
+ "258 GB",
489
+ );
490
+ expect(formatFor("k8s.node.allocatable_memory", 8235155456)).toBe(
491
+ "8.24 GB",
492
+ );
493
+ });
494
+
495
+ test("allocatable CPU reads in cores", () => {
496
+ expect(formatFor("k8s.node.allocatable_cpu", 31.85)).toBe("31.85 cores");
497
+ expect(formatFor("k8s.node.allocatable_cpu", 4)).toBe("4 cores");
498
+ });
499
+
500
+ test("the pod limit utilizations read as a percentage of the limit", () => {
501
+ expect(formatFor("k8s.pod.memory_limit_utilization", 0.93)).toBe(
502
+ "93.00%",
503
+ );
504
+ expect(formatFor("k8s.pod.cpu_limit_utilization", 0.5)).toBe("50.00%");
505
+ });
506
+
507
+ test("the control-plane flag and counts stay bare numbers", () => {
508
+ expect(formatFor("etcd_server_has_leader", 0)).toBe("0");
509
+ expect(formatFor("etcd_server_has_leader", 1)).toBe("1");
510
+ expect(formatFor("apiserver_current_inflight_requests", 212)).toBe("212");
511
+ expect(formatFor("scheduler_pending_pods", 3)).toBe("3");
512
+ });
513
+ });
514
+
515
+ /*
516
+ * BUG: the Workload entries were named for the Deployment/StatefulSet
517
+ * STATUS fields — `k8s.deployment.available_replicas`,
518
+ * `.desired_replicas`, `.unavailable_replicas`,
519
+ * `k8s.statefulset.ready_replicas` — but the agent's k8s_cluster receiver
520
+ * emits `k8s.deployment.available`, `k8s.deployment.desired` and
521
+ * `k8s.statefulset.ready_pods`, and no "unavailable" series at all. The
522
+ * chart renames nothing, so every one of those entries charted and
523
+ * alerted on a metric that never arrives: an empty chart, and a monitor
524
+ * that is never Met, with no error anywhere.
525
+ */
526
+ describe("every entry names a metric the shipped agent emits", () => {
527
+ test("the agent chart still pins the collector these names were read from", () => {
528
+ /*
529
+ * AGENT_EMITTED_METRIC_NAMES is the receivers' metadata.yaml at this
530
+ * collector version. Bumping the image fails here until that list is
531
+ * re-read — receivers rename metrics between versions.
532
+ */
533
+ const values: Record<string, any> = readAgentChartValues();
534
+
535
+ expect(values["image"]["repository"]).toBe(
536
+ "otel/opentelemetry-collector-contrib",
537
+ );
538
+ expect(String(values["image"]["tag"])).toBe(AGENT_COLLECTOR_IMAGE_TAG);
539
+ // The kubeletstats *_utilization names in the list assume this default.
540
+ expect(values["kubeletstats"]["utilizationMetrics"]["enabled"]).toBe(
541
+ true,
542
+ );
543
+ });
544
+
545
+ test.each(
546
+ allMetrics.map((m: KubernetesMetricDefinition) => {
547
+ return [m.id, m.metricName];
548
+ }),
549
+ )("%s queries %s, which the agent emits", (_id: string, name: string) => {
550
+ expect(AGENT_EMITTED_METRIC_NAMES.has(name)).toBe(true);
551
+ });
552
+
553
+ test("deployment replica entries use the receiver's names", () => {
554
+ expect(getKubernetesMetricById("deployment-available-replicas")).toEqual(
555
+ expect.objectContaining({ metricName: "k8s.deployment.available" }),
556
+ );
557
+ expect(getKubernetesMetricById("deployment-desired-replicas")).toEqual(
558
+ expect.objectContaining({ metricName: "k8s.deployment.desired" }),
559
+ );
560
+ });
561
+
562
+ test("the StatefulSet ready entry uses the receiver's name", () => {
563
+ expect(getKubernetesMetricById("statefulset-ready-replicas")).toEqual(
564
+ expect.objectContaining({ metricName: "k8s.statefulset.ready_pods" }),
565
+ );
566
+ });
567
+
568
+ test("no entry offers an unavailable-replicas series the receiver does not have", () => {
569
+ expect(
570
+ getKubernetesMetricById("deployment-unavailable-replicas"),
571
+ ).toBeUndefined();
572
+
573
+ for (const metric of allMetrics) {
574
+ expect(metric.metricName).not.toMatch(/unavailable/);
575
+ }
576
+ });
577
+ });
307
578
  });