@oneuptime/common 11.6.0 → 11.6.2

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 (427) hide show
  1. package/Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel.ts +41 -24
  2. package/Models/AnalyticsModels/Index.ts +4 -0
  3. package/Models/AnalyticsModels/KubernetesCostAllocation.ts +842 -0
  4. package/Models/AnalyticsModels/MetricBaselineHourly.ts +2 -0
  5. package/Models/AnalyticsModels/MetricItemAggMV1m.ts +5 -2
  6. package/Models/AnalyticsModels/MetricItemAggMV1mByContainer.ts +5 -2
  7. package/Models/AnalyticsModels/MetricItemAggMV1mByHostV2.ts +5 -2
  8. package/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.ts +5 -2
  9. package/Models/AnalyticsModels/MetricItemAggMV1mByService.ts +5 -2
  10. package/Models/AnalyticsModels/NetworkFlow.ts +54 -0
  11. package/Models/AnalyticsModels/SloHistory.ts +240 -0
  12. package/Models/DatabaseModels/Index.ts +20 -0
  13. package/Models/DatabaseModels/NetworkDevice.ts +453 -6
  14. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +7 -6
  15. package/Models/DatabaseModels/NetworkEndpoint.ts +753 -0
  16. package/Models/DatabaseModels/NetworkSite.ts +1155 -0
  17. package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +517 -0
  18. package/Models/DatabaseModels/NetworkSiteLink.ts +611 -0
  19. package/Models/DatabaseModels/NetworkSiteStatusTimeline.ts +520 -0
  20. package/Models/DatabaseModels/NetworkSiteType.ts +499 -0
  21. package/Models/DatabaseModels/ServiceLevelObjective.ts +1106 -0
  22. package/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.ts +762 -0
  23. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.ts +444 -0
  24. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.ts +443 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.ts +359 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.ts +48 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.ts +65 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.ts +88 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.ts +391 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  31. package/Server/Services/AnalyticsDatabaseService.ts +38 -10
  32. package/Server/Services/Index.ts +24 -0
  33. package/Server/Services/KubernetesCostAllocationService.ts +14 -0
  34. package/Server/Services/MetricService.ts +21 -2
  35. package/Server/Services/MonitorService.ts +22 -0
  36. package/Server/Services/NetworkDeviceService.ts +438 -2
  37. package/Server/Services/NetworkEndpointService.ts +414 -0
  38. package/Server/Services/NetworkSiteAssignmentRuleService.ts +98 -0
  39. package/Server/Services/NetworkSiteLinkService.ts +10 -0
  40. package/Server/Services/NetworkSiteService.ts +1254 -0
  41. package/Server/Services/NetworkSiteStatusTimelineService.ts +10 -0
  42. package/Server/Services/NetworkSiteTypeService.ts +10 -0
  43. package/Server/Services/ProjectService.ts +122 -2
  44. package/Server/Services/ServiceLevelObjectiveBurnRateRuleService.ts +457 -0
  45. package/Server/Services/ServiceLevelObjectiveOwnerTeamService.ts +10 -0
  46. package/Server/Services/ServiceLevelObjectiveOwnerUserService.ts +10 -0
  47. package/Server/Services/ServiceLevelObjectiveService.ts +677 -0
  48. package/Server/Services/SloHistoryService.ts +101 -0
  49. package/Server/Services/UserNotificationSettingService.ts +37 -0
  50. package/Server/Types/AnalyticsDatabase/AggregateBy.ts +9 -0
  51. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +15 -0
  52. package/Server/Utils/AnalyticsDatabase/Statement.ts +39 -3
  53. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +128 -52
  54. package/Server/Utils/Memory.ts +9 -1
  55. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +190 -12
  56. package/Server/Utils/Monitor/Data/OuiVendors.json +6920 -0
  57. package/Server/Utils/Monitor/DnsResolutionCache.ts +129 -0
  58. package/Server/Utils/Monitor/MonitorResource.ts +4 -30
  59. package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +214 -39
  60. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +343 -0
  61. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +251 -0
  62. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +176 -142
  63. package/Server/Utils/Monitor/OuiLookupUtil.ts +49 -0
  64. package/Server/Utils/Monitor/SnmpInterfaceRateUtil.ts +17 -13
  65. package/Server/Utils/WhatsAppTemplateUtil.ts +7 -3
  66. package/Tests/Models/AnalyticsModels/AnalyticsBaseModel.test.ts +122 -0
  67. package/Tests/Models/AnalyticsModels/KubernetesCostAllocation.test.ts +135 -0
  68. package/Tests/Models/NetworkSiteHierarchy.test.ts +134 -0
  69. package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +239 -0
  70. package/Tests/Server/Services/KubernetesCostAllocationAggregate.test.ts +338 -0
  71. package/Tests/Server/Services/MetricServiceAggregate.test.ts +142 -0
  72. package/Tests/Server/Services/NetworkDeviceSiteAssignment.test.ts +484 -0
  73. package/Tests/Server/Services/NetworkEndpointServiceUpsert.test.ts +686 -0
  74. package/Tests/Server/Services/NetworkSiteAssignmentRuleService.test.ts +185 -0
  75. package/Tests/Server/Services/NetworkSiteService.test.ts +1354 -0
  76. package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleService.test.ts +1313 -0
  77. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +1988 -0
  78. package/Tests/Server/Utils/AnalyticsDatabase/ClusterAwareSchema.test.ts +164 -3
  79. package/Tests/Server/Utils/AnalyticsDatabase/Statement.test.ts +22 -0
  80. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +503 -0
  81. package/Tests/Server/Utils/Encryption.test.ts +70 -0
  82. package/Tests/Server/Utils/FileAttachmentMarkdownUtil.test.ts +225 -0
  83. package/Tests/Server/Utils/JsonWebToken.test.ts +175 -0
  84. package/Tests/Server/Utils/LocalFile.test.ts +258 -0
  85. package/Tests/Server/Utils/Memory.test.ts +213 -0
  86. package/Tests/Server/Utils/Monitor/Criteria/LogMonitorCriteria.test.ts +30 -0
  87. package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +385 -0
  88. package/Tests/Server/Utils/Monitor/DnsResolutionCache.test.ts +194 -0
  89. package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +155 -0
  90. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +600 -0
  91. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +151 -124
  92. package/Tests/Server/Utils/Monitor/SnmpInterfaceRateUtil.test.ts +496 -0
  93. package/Tests/Server/Utils/MonitorCriteriaDataExtractor.test.ts +175 -0
  94. package/Tests/Server/Utils/MonitorCriteriaMessageFormatter.test.ts +282 -0
  95. package/Tests/Server/Utils/OuiLookupUtil.test.ts +59 -0
  96. package/Tests/Server/Utils/SeriesResourceLabels.test.ts +117 -0
  97. package/Tests/Server/Utils/StackTraceParser.test.ts +370 -0
  98. package/Tests/Server/Utils/Stream.test.ts +87 -0
  99. package/Tests/Server/Utils/ValidateGlobalProviderProjectTeams.test.ts +221 -0
  100. package/Tests/Server/Utils/WhatsAppTemplateUtil.test.ts +199 -0
  101. package/Tests/Types/Database/CompareOperatorWireSerialization.test.ts +33 -0
  102. package/Tests/Types/Email.test.ts +198 -0
  103. package/Tests/Types/HashCode.test.ts +41 -0
  104. package/Tests/Types/Kubernetes/KubernetesObjectParser.test.ts +177 -0
  105. package/Tests/Types/Log/LogQueryParser.test.ts +186 -0
  106. package/Tests/Types/Log/LogQueryToFilter.test.ts +111 -0
  107. package/Tests/Types/Monitor/MonitorStepNetworkDeviceMonitor.test.ts +141 -1
  108. package/Tests/Types/Monitor/MonitorType.test.ts +59 -1
  109. package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +97 -0
  110. package/Tests/Types/Monitor/SnmpEndpointDiscovery.test.ts +151 -0
  111. package/Tests/Types/Monitor/SnmpVendorTemplate.test.ts +110 -6
  112. package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +129 -0
  113. package/Tests/Types/SerializableObjectDictionary.test.ts +166 -0
  114. package/Tests/Types/Time/RangeStartAndEndDateTime.test.ts +98 -0
  115. package/Tests/Types/WebsiteRequest.test.ts +230 -0
  116. package/Tests/UI/Components/EntityFilterRoundTrip.test.tsx +103 -0
  117. package/Tests/UI/Components/ModelTable/BaseModelTableUrlState.test.tsx +612 -0
  118. package/Tests/UI/Components/ModelTable/FilterDataToQuery.test.ts +275 -0
  119. package/Tests/UI/Utils/LogExport.test.ts +159 -0
  120. package/Tests/UI/Utils/Navigation.test.ts +183 -0
  121. package/Tests/UI/Utils/TableFilterUrlState.test.ts +539 -0
  122. package/Tests/UI/Utils/TableViewUrlState.test.ts +272 -0
  123. package/Tests/Utils/Base64.test.ts +51 -0
  124. package/Tests/Utils/Boolean.test.ts +76 -0
  125. package/Tests/Utils/Crypto.test.ts +48 -0
  126. package/Tests/Utils/Dashboard/DashboardSloComponent.test.ts +259 -0
  127. package/Tests/Utils/Dashboard/ModelQueryVariableInterpolation.test.ts +162 -0
  128. package/Tests/Utils/Dashboard/VariableInterpolation.test.ts +197 -0
  129. package/Tests/Utils/Enum.test.ts +54 -0
  130. package/Tests/Utils/IpCanonicalUtil.test.ts +85 -0
  131. package/Tests/Utils/Metrics/MetricSeriesFingerprint.test.ts +160 -0
  132. package/Tests/Utils/Monitor/EndpointAttachmentUtil.test.ts +836 -0
  133. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +218 -0
  134. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +447 -0
  135. package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +440 -0
  136. package/Tests/Utils/NetworkSite/MaterializedPathUtil.test.ts +205 -0
  137. package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +221 -0
  138. package/Tests/Utils/NetworkSite/SiteUptimeUtil.test.ts +283 -0
  139. package/Tests/Utils/ObjectUtil.test.ts +30 -0
  140. package/Tests/Utils/Slo/SloStatusColor.test.ts +89 -0
  141. package/Tests/Utils/Slo/SloUtil.test.ts +1980 -0
  142. package/Tests/Utils/Slo/SloWidgetFormat.test.ts +605 -0
  143. package/Tests/Utils/TechStack.test.ts +50 -0
  144. package/Tests/Utils/Traces/CriticalPath.test.ts +178 -0
  145. package/Tests/Utils/ValueFormatter.test.ts +305 -0
  146. package/Types/AnalyticsDatabase/AnalyticsTableName.ts +10 -0
  147. package/Types/AnalyticsDatabase/TableColumn.ts +23 -0
  148. package/Types/BaseDatabase/EqualTo.ts +9 -1
  149. package/Types/BaseDatabase/EqualToOrNull.ts +9 -1
  150. package/Types/BaseDatabase/NotEqual.ts +9 -1
  151. package/Types/Dashboard/DashboardComponentType.ts +1 -0
  152. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
  153. package/Types/Dashboard/DashboardComponents/DashboardSloComponent.ts +42 -0
  154. package/Types/Dashboard/DashboardTemplates.ts +214 -0
  155. package/Types/Email/EmailTemplateType.ts +2 -0
  156. package/Types/Kubernetes/KubernetesCostIngest.ts +79 -0
  157. package/Types/Monitor/CriteriaFilter.ts +9 -0
  158. package/Types/Monitor/MonitorStep.ts +5 -8
  159. package/Types/Monitor/MonitorStepNetworkDeviceMonitor.ts +27 -5
  160. package/Types/Monitor/MonitorType.ts +15 -5
  161. package/Types/Monitor/SnmpMonitor/ArpEntry.ts +14 -0
  162. package/Types/Monitor/SnmpMonitor/FdbEntry.ts +18 -0
  163. package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +10 -3
  164. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +31 -5
  165. package/Types/Monitor/SnmpMonitor/SnmpMonitorResponse.ts +12 -0
  166. package/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.ts +231 -3
  167. package/Types/NetworkSite/DefaultNetworkSiteType.ts +20 -0
  168. package/Types/NotificationSetting/NotificationSettingEventType.ts +4 -0
  169. package/Types/Permission.ts +449 -0
  170. package/Types/ServiceLevelObjective/SliType.ts +6 -0
  171. package/Types/ServiceLevelObjective/SloMultiMonitorMode.ts +6 -0
  172. package/Types/ServiceLevelObjective/SloStatus.ts +9 -0
  173. package/Types/ServiceLevelObjective/SloWindowType.ts +6 -0
  174. package/Types/Telemetry/ServiceType.ts +1 -0
  175. package/UI/Components/Filters/EntityFilter.tsx +16 -0
  176. package/UI/Components/Filters/FilterViewer.tsx +22 -5
  177. package/UI/Components/List/List.tsx +8 -0
  178. package/UI/Components/ModelTable/BaseModelTable.tsx +309 -106
  179. package/UI/Components/ModelTable/FilterDataToQuery.ts +172 -0
  180. package/UI/Components/Navbar/NavBar.tsx +16 -2
  181. package/UI/Components/Navbar/NavBarMenuModal.tsx +3 -3
  182. package/UI/Utils/Navigation.ts +10 -0
  183. package/UI/Utils/TableFilterUrlState.ts +204 -17
  184. package/UI/Utils/TableViewUrlState.ts +165 -0
  185. package/Utils/Dashboard/Components/DashboardSloComponent.ts +114 -0
  186. package/Utils/Dashboard/Components/Index.ts +7 -0
  187. package/Utils/IpCanonicalUtil.ts +134 -0
  188. package/Utils/Monitor/EndpointAttachmentUtil.ts +508 -0
  189. package/Utils/Monitor/NetworkTopologyUtil.ts +157 -5
  190. package/Utils/NetworkSite/CidrMatchUtil.ts +296 -0
  191. package/Utils/NetworkSite/MaterializedPathUtil.ts +115 -0
  192. package/Utils/NetworkSite/SiteStatusRollupUtil.ts +97 -0
  193. package/Utils/NetworkSite/SiteUptimeUtil.ts +111 -0
  194. package/Utils/Slo/SloStatusColor.ts +54 -0
  195. package/Utils/Slo/SloUtil.ts +637 -0
  196. package/Utils/Slo/SloWidgetFormat.ts +383 -0
  197. package/build/dist/Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel.js +25 -20
  198. package/build/dist/Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel.js.map +1 -1
  199. package/build/dist/Models/AnalyticsModels/Index.js +4 -0
  200. package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
  201. package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js +713 -0
  202. package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js.map +1 -0
  203. package/build/dist/Models/AnalyticsModels/MetricBaselineHourly.js +2 -0
  204. package/build/dist/Models/AnalyticsModels/MetricBaselineHourly.js.map +1 -1
  205. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1m.js +5 -2
  206. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1m.js.map +1 -1
  207. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByContainer.js +5 -2
  208. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByContainer.js.map +1 -1
  209. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByHostV2.js +5 -2
  210. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByHostV2.js.map +1 -1
  211. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.js +5 -2
  212. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.js.map +1 -1
  213. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByService.js +5 -2
  214. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByService.js.map +1 -1
  215. package/build/dist/Models/AnalyticsModels/NetworkFlow.js +44 -0
  216. package/build/dist/Models/AnalyticsModels/NetworkFlow.js.map +1 -1
  217. package/build/dist/Models/AnalyticsModels/SloHistory.js +215 -0
  218. package/build/dist/Models/AnalyticsModels/SloHistory.js.map +1 -0
  219. package/build/dist/Models/DatabaseModels/Index.js +20 -0
  220. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  221. package/build/dist/Models/DatabaseModels/NetworkDevice.js +458 -6
  222. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  223. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +0 -6
  224. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  225. package/build/dist/Models/DatabaseModels/NetworkEndpoint.js +779 -0
  226. package/build/dist/Models/DatabaseModels/NetworkEndpoint.js.map +1 -0
  227. package/build/dist/Models/DatabaseModels/NetworkSite.js +1180 -0
  228. package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -0
  229. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +534 -0
  230. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -0
  231. package/build/dist/Models/DatabaseModels/NetworkSiteLink.js +629 -0
  232. package/build/dist/Models/DatabaseModels/NetworkSiteLink.js.map +1 -0
  233. package/build/dist/Models/DatabaseModels/NetworkSiteStatusTimeline.js +538 -0
  234. package/build/dist/Models/DatabaseModels/NetworkSiteStatusTimeline.js.map +1 -0
  235. package/build/dist/Models/DatabaseModels/NetworkSiteType.js +522 -0
  236. package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -0
  237. package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js +1124 -0
  238. package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js.map +1 -0
  239. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js +769 -0
  240. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js.map +1 -0
  241. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js +460 -0
  242. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js.map +1 -0
  243. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js +459 -0
  244. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js.map +1 -0
  245. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.js +130 -0
  246. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.js.map +1 -0
  247. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.js +31 -0
  248. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.js.map +1 -0
  249. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.js +36 -0
  250. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.js.map +1 -0
  251. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.js +49 -0
  252. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.js.map +1 -0
  253. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.js +140 -0
  254. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.js.map +1 -0
  255. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  256. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  257. package/build/dist/Server/Services/AnalyticsDatabaseService.js +32 -7
  258. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  259. package/build/dist/Server/Services/Index.js +24 -0
  260. package/build/dist/Server/Services/Index.js.map +1 -1
  261. package/build/dist/Server/Services/KubernetesCostAllocationService.js +12 -0
  262. package/build/dist/Server/Services/KubernetesCostAllocationService.js.map +1 -0
  263. package/build/dist/Server/Services/MetricService.js +21 -3
  264. package/build/dist/Server/Services/MetricService.js.map +1 -1
  265. package/build/dist/Server/Services/MonitorService.js +19 -0
  266. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  267. package/build/dist/Server/Services/NetworkDeviceService.js +351 -1
  268. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  269. package/build/dist/Server/Services/NetworkEndpointService.js +319 -0
  270. package/build/dist/Server/Services/NetworkEndpointService.js.map +1 -0
  271. package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js +90 -0
  272. package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js.map +1 -0
  273. package/build/dist/Server/Services/NetworkSiteLinkService.js +9 -0
  274. package/build/dist/Server/Services/NetworkSiteLinkService.js.map +1 -0
  275. package/build/dist/Server/Services/NetworkSiteService.js +1038 -0
  276. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -0
  277. package/build/dist/Server/Services/NetworkSiteStatusTimelineService.js +9 -0
  278. package/build/dist/Server/Services/NetworkSiteStatusTimelineService.js.map +1 -0
  279. package/build/dist/Server/Services/NetworkSiteTypeService.js +9 -0
  280. package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -0
  281. package/build/dist/Server/Services/ProjectService.js +98 -2
  282. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  283. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js +358 -0
  284. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js.map +1 -0
  285. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js +9 -0
  286. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js.map +1 -0
  287. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js +9 -0
  288. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js.map +1 -0
  289. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +582 -0
  290. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -0
  291. package/build/dist/Server/Services/SloHistoryService.js +77 -0
  292. package/build/dist/Server/Services/SloHistoryService.js.map +1 -0
  293. package/build/dist/Server/Services/UserNotificationSettingService.js +20 -0
  294. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  295. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js +9 -0
  296. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js.map +1 -1
  297. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +15 -0
  298. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  299. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js +31 -0
  300. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js.map +1 -1
  301. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +105 -52
  302. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  303. package/build/dist/Server/Utils/Memory.js +9 -1
  304. package/build/dist/Server/Utils/Memory.js.map +1 -1
  305. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +132 -10
  306. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  307. package/build/dist/Server/Utils/Monitor/Data/OuiVendors.json +6920 -0
  308. package/build/dist/Server/Utils/Monitor/DnsResolutionCache.js +77 -0
  309. package/build/dist/Server/Utils/Monitor/DnsResolutionCache.js.map +1 -0
  310. package/build/dist/Server/Utils/Monitor/MonitorResource.js +21 -41
  311. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  312. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +152 -40
  313. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
  314. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +262 -0
  315. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -0
  316. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +201 -0
  317. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -0
  318. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +152 -120
  319. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  320. package/build/dist/Server/Utils/Monitor/OuiLookupUtil.js +44 -0
  321. package/build/dist/Server/Utils/Monitor/OuiLookupUtil.js.map +1 -0
  322. package/build/dist/Server/Utils/Monitor/SnmpInterfaceRateUtil.js +10 -10
  323. package/build/dist/Server/Utils/Monitor/SnmpInterfaceRateUtil.js.map +1 -1
  324. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js +5 -0
  325. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js.map +1 -1
  326. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +10 -0
  327. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
  328. package/build/dist/Types/AnalyticsDatabase/TableColumn.js +7 -0
  329. package/build/dist/Types/AnalyticsDatabase/TableColumn.js.map +1 -1
  330. package/build/dist/Types/BaseDatabase/EqualTo.js +9 -1
  331. package/build/dist/Types/BaseDatabase/EqualTo.js.map +1 -1
  332. package/build/dist/Types/BaseDatabase/EqualToOrNull.js +9 -1
  333. package/build/dist/Types/BaseDatabase/EqualToOrNull.js.map +1 -1
  334. package/build/dist/Types/BaseDatabase/NotEqual.js +9 -1
  335. package/build/dist/Types/BaseDatabase/NotEqual.js.map +1 -1
  336. package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
  337. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  338. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
  339. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  340. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloComponent.js +23 -0
  341. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloComponent.js.map +1 -0
  342. package/build/dist/Types/Dashboard/DashboardTemplates.js +205 -0
  343. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  344. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  345. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  346. package/build/dist/Types/Kubernetes/KubernetesCostIngest.js +21 -0
  347. package/build/dist/Types/Kubernetes/KubernetesCostIngest.js.map +1 -0
  348. package/build/dist/Types/Monitor/CriteriaFilter.js +1 -0
  349. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  350. package/build/dist/Types/Monitor/MonitorStep.js +5 -5
  351. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  352. package/build/dist/Types/Monitor/MonitorStepNetworkDeviceMonitor.js +8 -0
  353. package/build/dist/Types/Monitor/MonitorStepNetworkDeviceMonitor.js.map +1 -1
  354. package/build/dist/Types/Monitor/MonitorType.js +15 -5
  355. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  356. package/build/dist/Types/Monitor/SnmpMonitor/ArpEntry.js +2 -0
  357. package/build/dist/Types/Monitor/SnmpMonitor/ArpEntry.js.map +1 -0
  358. package/build/dist/Types/Monitor/SnmpMonitor/FdbEntry.js +2 -0
  359. package/build/dist/Types/Monitor/SnmpMonitor/FdbEntry.js.map +1 -0
  360. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +9 -3
  361. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
  362. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js +217 -3
  363. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js.map +1 -1
  364. package/build/dist/Types/NetworkSite/DefaultNetworkSiteType.js +21 -0
  365. package/build/dist/Types/NetworkSite/DefaultNetworkSiteType.js.map +1 -0
  366. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +3 -0
  367. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
  368. package/build/dist/Types/Permission.js +409 -0
  369. package/build/dist/Types/Permission.js.map +1 -1
  370. package/build/dist/Types/ServiceLevelObjective/SliType.js +7 -0
  371. package/build/dist/Types/ServiceLevelObjective/SliType.js.map +1 -0
  372. package/build/dist/Types/ServiceLevelObjective/SloMultiMonitorMode.js +7 -0
  373. package/build/dist/Types/ServiceLevelObjective/SloMultiMonitorMode.js.map +1 -0
  374. package/build/dist/Types/ServiceLevelObjective/SloStatus.js +10 -0
  375. package/build/dist/Types/ServiceLevelObjective/SloStatus.js.map +1 -0
  376. package/build/dist/Types/ServiceLevelObjective/SloWindowType.js +7 -0
  377. package/build/dist/Types/ServiceLevelObjective/SloWindowType.js.map +1 -0
  378. package/build/dist/Types/Telemetry/ServiceType.js +1 -0
  379. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  380. package/build/dist/UI/Components/Filters/EntityFilter.js +15 -0
  381. package/build/dist/UI/Components/Filters/EntityFilter.js.map +1 -1
  382. package/build/dist/UI/Components/Filters/FilterViewer.js +19 -4
  383. package/build/dist/UI/Components/Filters/FilterViewer.js.map +1 -1
  384. package/build/dist/UI/Components/List/List.js +1 -1
  385. package/build/dist/UI/Components/List/List.js.map +1 -1
  386. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +235 -89
  387. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  388. package/build/dist/UI/Components/ModelTable/FilterDataToQuery.js +96 -0
  389. package/build/dist/UI/Components/ModelTable/FilterDataToQuery.js.map +1 -0
  390. package/build/dist/UI/Components/Navbar/NavBar.js +14 -2
  391. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  392. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +3 -2
  393. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  394. package/build/dist/UI/Utils/Navigation.js +9 -0
  395. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  396. package/build/dist/UI/Utils/TableFilterUrlState.js +159 -15
  397. package/build/dist/UI/Utils/TableFilterUrlState.js.map +1 -1
  398. package/build/dist/UI/Utils/TableViewUrlState.js +103 -0
  399. package/build/dist/UI/Utils/TableViewUrlState.js.map +1 -0
  400. package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js +93 -0
  401. package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js.map +1 -0
  402. package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
  403. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  404. package/build/dist/Utils/IpCanonicalUtil.js +110 -0
  405. package/build/dist/Utils/IpCanonicalUtil.js.map +1 -0
  406. package/build/dist/Utils/Monitor/EndpointAttachmentUtil.js +311 -0
  407. package/build/dist/Utils/Monitor/EndpointAttachmentUtil.js.map +1 -0
  408. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +98 -5
  409. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  410. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +222 -0
  411. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -0
  412. package/build/dist/Utils/NetworkSite/MaterializedPathUtil.js +89 -0
  413. package/build/dist/Utils/NetworkSite/MaterializedPathUtil.js.map +1 -0
  414. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +60 -0
  415. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -0
  416. package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js +76 -0
  417. package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js.map +1 -0
  418. package/build/dist/Utils/Slo/SloStatusColor.js +18 -0
  419. package/build/dist/Utils/Slo/SloStatusColor.js.map +1 -0
  420. package/build/dist/Utils/Slo/SloUtil.js +393 -0
  421. package/build/dist/Utils/Slo/SloUtil.js.map +1 -0
  422. package/build/dist/Utils/Slo/SloWidgetFormat.js +174 -0
  423. package/build/dist/Utils/Slo/SloWidgetFormat.js.map +1 -0
  424. package/package.json +2 -2
  425. package/Types/Dashboard/DashboardComponents/Index.ts +0 -7
  426. package/build/dist/Types/Dashboard/DashboardComponents/Index.js +0 -8
  427. package/build/dist/Types/Dashboard/DashboardComponents/Index.js.map +0 -1
@@ -0,0 +1,178 @@
1
+ import CriticalPathUtil, {
2
+ CriticalPathResult,
3
+ ServiceBreakdown,
4
+ SpanData,
5
+ SpanSelfTime,
6
+ } from "../../../Utils/Traces/CriticalPath";
7
+ import { describe, expect, test } from "@jest/globals";
8
+
9
+ /*
10
+ * CriticalPathUtil is a zero-dependency interval/graph engine over trace spans.
11
+ * The math is subtle (overlapping-child interval merge, longest-weighted path
12
+ * with self-time), and its output drives the "where did the latency go" views,
13
+ * so these tests pin the numeric behavior with hand-computed fixtures.
14
+ */
15
+
16
+ function span(
17
+ spanId: string,
18
+ parentSpanId: string | undefined,
19
+ start: number,
20
+ end: number,
21
+ primaryEntityId?: string,
22
+ ): SpanData {
23
+ return {
24
+ spanId,
25
+ parentSpanId,
26
+ startTimeUnixNano: start,
27
+ endTimeUnixNano: end,
28
+ durationUnixNano: end - start,
29
+ primaryEntityId,
30
+ name: spanId,
31
+ };
32
+ }
33
+
34
+ describe("CriticalPathUtil.computeSelfTimes", () => {
35
+ test("a leaf span's self-time equals its whole duration", () => {
36
+ const times: Map<string, SpanSelfTime> = CriticalPathUtil.computeSelfTimes([
37
+ span("a", undefined, 0, 100),
38
+ ]);
39
+
40
+ const a: SpanSelfTime = times.get("a")!;
41
+ expect(a.selfTimeUnixNano).toBe(100);
42
+ expect(a.childTimeUnixNano).toBe(0);
43
+ expect(a.selfTimePercent).toBe(100);
44
+ });
45
+
46
+ test("subtracts a single child's covered time", () => {
47
+ const times: Map<string, SpanSelfTime> = CriticalPathUtil.computeSelfTimes([
48
+ span("root", undefined, 0, 100),
49
+ span("child", "root", 10, 40),
50
+ ]);
51
+
52
+ expect(times.get("root")!.selfTimeUnixNano).toBe(70);
53
+ expect(times.get("root")!.childTimeUnixNano).toBe(30);
54
+ expect(times.get("root")!.selfTimePercent).toBe(70);
55
+ });
56
+
57
+ test("sums two non-overlapping children", () => {
58
+ const times: Map<string, SpanSelfTime> = CriticalPathUtil.computeSelfTimes([
59
+ span("root", undefined, 0, 100),
60
+ span("c1", "root", 10, 30),
61
+ span("c2", "root", 50, 80),
62
+ ]);
63
+ // covered = 20 + 30 = 50 -> self = 50
64
+ expect(times.get("root")!.childTimeUnixNano).toBe(50);
65
+ expect(times.get("root")!.selfTimeUnixNano).toBe(50);
66
+ });
67
+
68
+ test("merges overlapping children into one interval", () => {
69
+ const times: Map<string, SpanSelfTime> = CriticalPathUtil.computeSelfTimes([
70
+ span("root", undefined, 0, 100),
71
+ span("c1", "root", 10, 50),
72
+ span("c2", "root", 30, 70),
73
+ ]);
74
+ // merged interval [10,70] = 60 -> self = 40
75
+ expect(times.get("root")!.childTimeUnixNano).toBe(60);
76
+ expect(times.get("root")!.selfTimeUnixNano).toBe(40);
77
+ });
78
+
79
+ test("clamps children that spill past the parent window", () => {
80
+ const times: Map<string, SpanSelfTime> = CriticalPathUtil.computeSelfTimes([
81
+ span("root", undefined, 0, 100),
82
+ span("c1", "root", -50, 150),
83
+ ]);
84
+ // clamped to [0,100] = 100 -> self = 0
85
+ expect(times.get("root")!.childTimeUnixNano).toBe(100);
86
+ expect(times.get("root")!.selfTimeUnixNano).toBe(0);
87
+ });
88
+
89
+ test("self-time is floored at zero and percent is zero for a zero-duration span", () => {
90
+ const zero: SpanData = span("z", undefined, 5, 5);
91
+ const times: Map<string, SpanSelfTime> = CriticalPathUtil.computeSelfTimes([
92
+ zero,
93
+ ]);
94
+ expect(times.get("z")!.selfTimeUnixNano).toBe(0);
95
+ expect(times.get("z")!.selfTimePercent).toBe(0);
96
+ });
97
+ });
98
+
99
+ describe("CriticalPathUtil.computeCriticalPath", () => {
100
+ test("returns all-zero result for an empty trace", () => {
101
+ const result: CriticalPathResult = CriticalPathUtil.computeCriticalPath([]);
102
+ expect(result).toEqual({
103
+ criticalPathSpanIds: [],
104
+ totalTraceDurationUnixNano: 0,
105
+ criticalPathDurationUnixNano: 0,
106
+ });
107
+ });
108
+
109
+ test("a single span is its own critical path", () => {
110
+ const result: CriticalPathResult = CriticalPathUtil.computeCriticalPath([
111
+ span("only", undefined, 0, 100),
112
+ ]);
113
+ expect(result.criticalPathSpanIds).toEqual(["only"]);
114
+ expect(result.totalTraceDurationUnixNano).toBe(100);
115
+ expect(result.criticalPathDurationUnixNano).toBe(100);
116
+ });
117
+
118
+ test("follows the heavier of two parallel children", () => {
119
+ const result: CriticalPathResult = CriticalPathUtil.computeCriticalPath([
120
+ span("root", undefined, 0, 100),
121
+ span("fast", "root", 10, 40), // duration 30
122
+ span("slow", "root", 10, 90), // duration 80
123
+ ]);
124
+
125
+ expect(result.criticalPathSpanIds).toEqual(["root", "slow"]);
126
+ expect(result.totalTraceDurationUnixNano).toBe(100);
127
+ // root self-time (100 - merged[10,90]=80 => 20) + slow weight 80 = 100
128
+ expect(result.criticalPathDurationUnixNano).toBe(100);
129
+ });
130
+
131
+ test("treats a span whose parent is absent from the set as a root", () => {
132
+ const result: CriticalPathResult = CriticalPathUtil.computeCriticalPath([
133
+ span("orphan", "missing-parent", 0, 50),
134
+ ]);
135
+ expect(result.criticalPathSpanIds).toEqual(["orphan"]);
136
+ expect(result.criticalPathDurationUnixNano).toBe(50);
137
+ });
138
+ });
139
+
140
+ describe("CriticalPathUtil.computeServiceBreakdown", () => {
141
+ test("aggregates self-time per service and sorts descending", () => {
142
+ const breakdown: Array<ServiceBreakdown> =
143
+ CriticalPathUtil.computeServiceBreakdown([
144
+ span("root", undefined, 0, 100, "A"),
145
+ span("child", "root", 20, 60, "B"),
146
+ ]);
147
+
148
+ // root self = 100 - 40 = 60 (service A); child self = 40 (service B)
149
+ expect(breakdown).toHaveLength(2);
150
+ expect(breakdown[0]!.primaryEntityId).toBe("A");
151
+ expect(breakdown[0]!.selfTimeUnixNano).toBe(60);
152
+ expect(breakdown[0]!.percentOfTrace).toBe(60);
153
+ expect(breakdown[1]!.primaryEntityId).toBe("B");
154
+ expect(breakdown[1]!.selfTimeUnixNano).toBe(40);
155
+ expect(breakdown[1]!.percentOfTrace).toBe(40);
156
+ });
157
+
158
+ test("groups spans without a service id under 'unknown'", () => {
159
+ const breakdown: Array<ServiceBreakdown> =
160
+ CriticalPathUtil.computeServiceBreakdown([span("a", undefined, 0, 10)]);
161
+
162
+ expect(breakdown).toHaveLength(1);
163
+ expect(breakdown[0]!.primaryEntityId).toBe("unknown");
164
+ expect(breakdown[0]!.spanCount).toBe(1);
165
+ });
166
+
167
+ test("accumulates span counts and durations per service", () => {
168
+ const breakdown: Array<ServiceBreakdown> =
169
+ CriticalPathUtil.computeServiceBreakdown([
170
+ span("s1", undefined, 0, 100, "A"),
171
+ span("s2", undefined, 100, 150, "A"),
172
+ ]);
173
+
174
+ expect(breakdown).toHaveLength(1);
175
+ expect(breakdown[0]!.spanCount).toBe(2);
176
+ expect(breakdown[0]!.totalDurationUnixNano).toBe(150);
177
+ });
178
+ });
@@ -0,0 +1,305 @@
1
+ import ValueFormatter from "../../Utils/ValueFormatter";
2
+
3
+ describe("ValueFormatter", () => {
4
+ describe("formatValue - bytes", () => {
5
+ test("scales bytes up to the right unit", () => {
6
+ expect(ValueFormatter.formatValue(1048576, "bytes")).toBe("1.05 MB");
7
+ expect(ValueFormatter.formatValue(1e6, "bytes")).toBe("1 MB");
8
+ expect(ValueFormatter.formatValue(1e9, "bytes")).toBe("1 GB");
9
+ expect(ValueFormatter.formatValue(1e12, "bytes")).toBe("1 TB");
10
+ expect(ValueFormatter.formatValue(1e15, "bytes")).toBe("1 PB");
11
+ });
12
+
13
+ test("keeps small byte values in B", () => {
14
+ expect(ValueFormatter.formatValue(512, "bytes")).toBe("512 B");
15
+ expect(ValueFormatter.formatValue(1, "bytes")).toBe("1 B");
16
+ });
17
+
18
+ test("recognizes UCUM byte aliases", () => {
19
+ expect(ValueFormatter.formatValue(2000, "By")).toBe("2 KB");
20
+ expect(ValueFormatter.formatValue(2000, "b")).toBe("2 KB");
21
+ expect(ValueFormatter.formatValue(2000, "byte")).toBe("2 KB");
22
+ });
23
+
24
+ test("renders 0 bytes with the natural byte unit", () => {
25
+ expect(ValueFormatter.formatValue(0, "bytes")).toBe("0 B");
26
+ });
27
+
28
+ test("handles negative byte values", () => {
29
+ expect(ValueFormatter.formatValue(-2000, "bytes")).toBe("-2 KB");
30
+ });
31
+ });
32
+
33
+ describe("formatValue - seconds", () => {
34
+ test("scales seconds into larger units", () => {
35
+ expect(ValueFormatter.formatValue(60, "seconds")).toBe("1 min");
36
+ expect(ValueFormatter.formatValue(3600, "seconds")).toBe("1 hours");
37
+ expect(ValueFormatter.formatValue(86400, "seconds")).toBe("1 days");
38
+ });
39
+
40
+ test("scales sub-second values down", () => {
41
+ expect(ValueFormatter.formatValue(0.5, "seconds")).toBe("500 ms");
42
+ expect(ValueFormatter.formatValue(0.0005, "seconds")).toBe("500 µs");
43
+ });
44
+
45
+ test("renders 0 seconds with the natural second unit, not ns", () => {
46
+ expect(ValueFormatter.formatValue(0, "seconds")).toBe("0 sec");
47
+ });
48
+
49
+ test("recognizes second aliases", () => {
50
+ expect(ValueFormatter.formatValue(120, "s")).toBe("2 min");
51
+ expect(ValueFormatter.formatValue(120, "sec")).toBe("2 min");
52
+ });
53
+ });
54
+
55
+ describe("formatValue - milliseconds", () => {
56
+ test("scales milliseconds into seconds and beyond", () => {
57
+ expect(ValueFormatter.formatValue(1000, "ms")).toBe("1 sec");
58
+ expect(ValueFormatter.formatValue(60000, "ms")).toBe("1 min");
59
+ });
60
+
61
+ test("keeps small ms values", () => {
62
+ expect(ValueFormatter.formatValue(5, "ms")).toBe("5 ms");
63
+ });
64
+
65
+ test("renders 0 ms with the natural ms unit", () => {
66
+ expect(ValueFormatter.formatValue(0, "ms")).toBe("0 ms");
67
+ });
68
+ });
69
+
70
+ describe("formatValue - percent", () => {
71
+ test("renders percent inline with two decimals", () => {
72
+ expect(ValueFormatter.formatValue(42, "%")).toBe("42.00%");
73
+ expect(ValueFormatter.formatValue(100, "%")).toBe("100.00%");
74
+ expect(ValueFormatter.formatValue(2.04, "%")).toBe("2.04%");
75
+ });
76
+
77
+ test("treats spelled-out percent variants the same", () => {
78
+ expect(ValueFormatter.formatValue(50, "percent")).toBe("50.00%");
79
+ expect(ValueFormatter.formatValue(50, "percentage")).toBe("50.00%");
80
+ expect(ValueFormatter.formatValue(50, "pct")).toBe("50.00%");
81
+ });
82
+
83
+ test("non-finite percent falls back to 0.00", () => {
84
+ expect(ValueFormatter.formatValue(Infinity, "%")).toBe("0.00%");
85
+ expect(ValueFormatter.formatValue(NaN, "%")).toBe("0.00%");
86
+ });
87
+ });
88
+
89
+ describe("formatValue - dimensionless and fraction metrics", () => {
90
+ test("dimensionless unit '1' renders a bare number", () => {
91
+ expect(ValueFormatter.formatValue(1234, "1")).toBe("1.23K");
92
+ expect(ValueFormatter.formatValue(5, "1")).toBe("5");
93
+ });
94
+
95
+ test("empty unit renders a bare number", () => {
96
+ expect(ValueFormatter.formatValue(5, "")).toBe("5");
97
+ });
98
+
99
+ test("fraction metric with unit '1' renders as a percentage", () => {
100
+ expect(
101
+ ValueFormatter.formatValue(0.25, "1", {
102
+ metricName: "system.cpu.utilization",
103
+ }),
104
+ ).toBe("25.00%");
105
+ expect(
106
+ ValueFormatter.formatValue(0.5, "1", {
107
+ metricName: "db.client.connection.usage_ratio",
108
+ }),
109
+ ).toBe("50.00%");
110
+ });
111
+
112
+ test("non-fraction metric with unit '1' stays a bare number", () => {
113
+ expect(
114
+ ValueFormatter.formatValue(0.25, "1", {
115
+ metricName: "http.server.request.count",
116
+ }),
117
+ ).toBe("0.25");
118
+ });
119
+ });
120
+
121
+ describe("formatValue - annotation-only units", () => {
122
+ test("renders bare number for UCUM annotation units", () => {
123
+ expect(ValueFormatter.formatValue(42, "{thread}")).toBe("42");
124
+ expect(ValueFormatter.formatValue(1500, "{packets}")).toBe("1.5K");
125
+ });
126
+ });
127
+
128
+ describe("formatValue - compound rate units", () => {
129
+ test("scales the numerator and keeps a compact denominator", () => {
130
+ expect(ValueFormatter.formatValue(1500000, "By/s")).toBe("1.5 MB/s");
131
+ expect(ValueFormatter.formatValue(2000, "bytes/s")).toBe("2 KB/s");
132
+ });
133
+
134
+ test("falls back to readable form for unknown numerator", () => {
135
+ expect(ValueFormatter.formatValue(5, "requests/s")).toBe(
136
+ "5 requests per Second",
137
+ );
138
+ });
139
+ });
140
+
141
+ describe("formatValue - unknown units", () => {
142
+ test("formats number and appends a readable unit name", () => {
143
+ expect(ValueFormatter.formatValue(10, "hz")).toBe("10 Hertz");
144
+ expect(ValueFormatter.formatValue(5, "v")).toBe("5 Volts");
145
+ });
146
+
147
+ test("keeps the original unit when unrecognized", () => {
148
+ expect(ValueFormatter.formatValue(5, "widgets")).toBe("5 widgets");
149
+ });
150
+ });
151
+
152
+ describe("formatValue - large number abbreviation", () => {
153
+ test("abbreviates thousands, millions, billions", () => {
154
+ expect(ValueFormatter.formatValue(5000, "widgets")).toBe("5K widgets");
155
+ expect(ValueFormatter.formatValue(1500000, "widgets")).toBe(
156
+ "1.5M widgets",
157
+ );
158
+ expect(ValueFormatter.formatValue(2000000000, "widgets")).toBe(
159
+ "2B widgets",
160
+ );
161
+ });
162
+
163
+ test("trims trailing zeros but keeps distinguishing decimals", () => {
164
+ expect(ValueFormatter.formatValue(119250000000, "widgets")).toBe(
165
+ "119.25B widgets",
166
+ );
167
+ });
168
+ });
169
+
170
+ describe("formatValue - small number precision", () => {
171
+ test("keeps two significant digits below 1", () => {
172
+ expect(ValueFormatter.formatValue(0.004, "widgets")).toBe(
173
+ "0.004 widgets",
174
+ );
175
+ expect(ValueFormatter.formatValue(0.006, "widgets")).toBe(
176
+ "0.006 widgets",
177
+ );
178
+ });
179
+
180
+ test("expands very small numbers out of exponential notation", () => {
181
+ const result: string = ValueFormatter.formatValue(0.00000012, "widgets");
182
+ // Should not fall back to exponential notation like "1.2e-7".
183
+ expect(result).not.toMatch(/e[+-]/i);
184
+ expect(result).toContain("0.00000012");
185
+ });
186
+ });
187
+
188
+ describe("isPercentUnit", () => {
189
+ test("returns true for percent variants", () => {
190
+ expect(ValueFormatter.isPercentUnit("%")).toBe(true);
191
+ expect(ValueFormatter.isPercentUnit("percent")).toBe(true);
192
+ expect(ValueFormatter.isPercentUnit("PERCENTAGE")).toBe(true);
193
+ expect(ValueFormatter.isPercentUnit(" pct ")).toBe(true);
194
+ });
195
+
196
+ test("returns false otherwise", () => {
197
+ expect(ValueFormatter.isPercentUnit("bytes")).toBe(false);
198
+ expect(ValueFormatter.isPercentUnit(undefined)).toBe(false);
199
+ expect(ValueFormatter.isPercentUnit("")).toBe(false);
200
+ });
201
+ });
202
+
203
+ describe("isFractionMetric", () => {
204
+ test("matches utilization/ratio/fraction/percent suffixes", () => {
205
+ expect(ValueFormatter.isFractionMetric("system.cpu.utilization")).toBe(
206
+ true,
207
+ );
208
+ expect(ValueFormatter.isFractionMetric("some_ratio")).toBe(true);
209
+ expect(ValueFormatter.isFractionMetric("mem.fraction")).toBe(true);
210
+ expect(ValueFormatter.isFractionMetric("disk_percentage")).toBe(true);
211
+ });
212
+
213
+ test("does not match unrelated names", () => {
214
+ expect(ValueFormatter.isFractionMetric("request.count")).toBe(false);
215
+ expect(ValueFormatter.isFractionMetric(undefined)).toBe(false);
216
+ expect(ValueFormatter.isFractionMetric("")).toBe(false);
217
+ });
218
+ });
219
+
220
+ describe("isHigherWorseMetric", () => {
221
+ test("returns false for higher-is-better metrics", () => {
222
+ expect(
223
+ ValueFormatter.isHigherWorseMetric("oneuptime.monitor.online"),
224
+ ).toBe(false);
225
+ expect(ValueFormatter.isHigherWorseMetric("service.uptime")).toBe(false);
226
+ expect(ValueFormatter.isHigherWorseMetric("availability_percent")).toBe(
227
+ false,
228
+ );
229
+ });
230
+
231
+ test("returns true for higher-is-worse metrics", () => {
232
+ expect(ValueFormatter.isHigherWorseMetric("http.error.count")).toBe(true);
233
+ expect(ValueFormatter.isHigherWorseMetric("incident.count")).toBe(true);
234
+ expect(ValueFormatter.isHigherWorseMetric("request.latency")).toBe(true);
235
+ expect(ValueFormatter.isHigherWorseMetric("cpu.utilization")).toBe(true);
236
+ expect(ValueFormatter.isHigherWorseMetric("pod.restart")).toBe(true);
237
+ });
238
+
239
+ test("returns false for neutral counters and undefined", () => {
240
+ expect(ValueFormatter.isHigherWorseMetric("network.bytes")).toBe(false);
241
+ expect(ValueFormatter.isHigherWorseMetric(undefined)).toBe(false);
242
+ });
243
+
244
+ test("higher-is-better token wins over higher-is-worse token", () => {
245
+ // Contains both "uptime" (better) and would otherwise be neutral.
246
+ expect(ValueFormatter.isHigherWorseMetric("system.uptime.seconds")).toBe(
247
+ false,
248
+ );
249
+ });
250
+ });
251
+
252
+ describe("isScalableUnit", () => {
253
+ test("true for known scalable units", () => {
254
+ expect(ValueFormatter.isScalableUnit("bytes")).toBe(true);
255
+ expect(ValueFormatter.isScalableUnit("ms")).toBe(true);
256
+ expect(ValueFormatter.isScalableUnit("By")).toBe(true);
257
+ });
258
+
259
+ test("false for empty or unknown units", () => {
260
+ expect(ValueFormatter.isScalableUnit("")).toBe(false);
261
+ expect(ValueFormatter.isScalableUnit(" ")).toBe(false);
262
+ expect(ValueFormatter.isScalableUnit("%")).toBe(false);
263
+ expect(ValueFormatter.isScalableUnit("widgets")).toBe(false);
264
+ });
265
+ });
266
+
267
+ describe("getReadableUnit", () => {
268
+ test("maps UCUM codes to readable names", () => {
269
+ expect(ValueFormatter.getReadableUnit("By")).toBe("Bytes");
270
+ expect(ValueFormatter.getReadableUnit("s")).toBe("Seconds");
271
+ expect(ValueFormatter.getReadableUnit("ms")).toBe("Milliseconds");
272
+ });
273
+
274
+ test("dimensionless returns empty string", () => {
275
+ expect(ValueFormatter.getReadableUnit("1")).toBe("");
276
+ expect(ValueFormatter.getReadableUnit("")).toBe("");
277
+ });
278
+
279
+ test("fraction metric with '1' returns Percent", () => {
280
+ expect(
281
+ ValueFormatter.getReadableUnit("1", {
282
+ metricName: "cpu.utilization",
283
+ }),
284
+ ).toBe("Percent");
285
+ });
286
+
287
+ test("percent variants return Percent", () => {
288
+ expect(ValueFormatter.getReadableUnit("%")).toBe("Percent");
289
+ expect(ValueFormatter.getReadableUnit("pct")).toBe("Percent");
290
+ });
291
+
292
+ test("annotation-only unit is capitalized", () => {
293
+ expect(ValueFormatter.getReadableUnit("{thread}")).toBe("Thread");
294
+ expect(ValueFormatter.getReadableUnit("{packets}")).toBe("Packets");
295
+ });
296
+
297
+ test("compound rate unit reads as 'X per Y' with singular denominator", () => {
298
+ expect(ValueFormatter.getReadableUnit("By/s")).toBe("Bytes per Second");
299
+ });
300
+
301
+ test("unknown unit is returned unchanged", () => {
302
+ expect(ValueFormatter.getReadableUnit("widgets")).toBe("widgets");
303
+ });
304
+ });
305
+ });
@@ -8,6 +8,7 @@ enum AnalyticsTableName {
8
8
  Profile = "ProfileItemV3",
9
9
  ProfileSample = "ProfileSampleItemV3",
10
10
  AuditLog = "AuditLogV2",
11
+ KubernetesCostAllocation = "KubernetesCostAllocationV1",
11
12
  /*
12
13
  * Materialized-view target tables. These hold AggregateFunction
13
14
  * states populated by attached MVs on the source `Metric` table.
@@ -33,6 +34,15 @@ enum AnalyticsTableName {
33
34
  MetricItemAggMV1mByContainer = "MetricItemAggMV1mByContainer",
34
35
  MetricBaselineHourly = "MetricBaselineHourly",
35
36
  MutableMetric = "MutableMetricItem",
37
+ /*
38
+ * SLO / Error Budget history rollup. ReplacingMergeTree keyed by
39
+ * (projectId, sloId, metricName, bucketStart) with a `version` column
40
+ * so at-least-once evaluator writes and trailing re-writes dedupe to
41
+ * the latest value. Deliberately NOT MetricItemV3: its own monthly
42
+ * partitions + 400-day TTL keep long-lived SLO rows from pinning the
43
+ * daily raw-telemetry partitions (ttl_only_drop_parts hazard).
44
+ */
45
+ SloHistory = "SloHistory",
36
46
  }
37
47
 
38
48
  export default AnalyticsTableName;
@@ -213,6 +213,27 @@ export default class AnalyticsTableColumn {
213
213
  this._aggregateFunctionDefinition = v;
214
214
  }
215
215
 
216
+ /*
217
+ * Optional ClickHouse SimpleAggregateFunction wrapper for scalar columns.
218
+ *
219
+ * Unlike AggregateFunction, a SimpleAggregateFunction keeps the scalar's
220
+ * ordinary wire/query type (for example DateTime) while teaching
221
+ * AggregatingMergeTree how to combine values during background merges.
222
+ * `max` on a DateTime retention column is the canonical use: reads and TTLs
223
+ * still see a DateTime, but rows sharing the sort key retain the latest
224
+ * expiry instead of an arbitrary one.
225
+ *
226
+ * The underlying type comes from `type`; this field contains only the
227
+ * function name, e.g. "max".
228
+ */
229
+ private _simpleAggregateFunction: string | undefined;
230
+ public get simpleAggregateFunction(): string | undefined {
231
+ return this._simpleAggregateFunction;
232
+ }
233
+ public set simpleAggregateFunction(v: string | undefined) {
234
+ this._simpleAggregateFunction = v;
235
+ }
236
+
216
237
  public constructor(data: {
217
238
  key: string;
218
239
  title: string;
@@ -232,6 +253,7 @@ export default class AnalyticsTableColumn {
232
253
  isLowCardinality?: boolean | undefined;
233
254
  mapKeysColumn?: string | undefined;
234
255
  aggregateFunctionDefinition?: string | undefined;
256
+ simpleAggregateFunction?: string | undefined;
235
257
  }) {
236
258
  this.accessControl = data.accessControl;
237
259
  this.key = data.key;
@@ -250,5 +272,6 @@ export default class AnalyticsTableColumn {
250
272
  this.isLowCardinality = data.isLowCardinality || false;
251
273
  this.mapKeysColumn = data.mapKeysColumn;
252
274
  this.aggregateFunctionDefinition = data.aggregateFunctionDefinition;
275
+ this.simpleAggregateFunction = data.simpleAggregateFunction;
253
276
  }
254
277
  }
@@ -15,7 +15,15 @@ export default class EqualTo<T extends CompareType> extends CompareBase<T> {
15
15
  public override toJSON(): JSONObject {
16
16
  return {
17
17
  _type: ObjectType.EqualTo,
18
- value: (this as EqualTo<T>).toString(),
18
+ /*
19
+ * The RAW value is serialized (like GreaterThan / InBetween), not
20
+ * toString(): toString() stringifies a Date into a locale- and
21
+ * timezone-dependent form that loses milliseconds, and coerces a number
22
+ * into a string. JSON.stringify emits a raw Date as its full ISO
23
+ * timestamp, which the server binds at full precision — and which is
24
+ * what lets an equality filter survive a round trip through the URL.
25
+ */
26
+ value: (this as EqualTo<T>).value,
19
27
  };
20
28
  }
21
29
 
@@ -17,7 +17,15 @@ export default class EqualToOrNull<
17
17
  public override toJSON(): JSONObject {
18
18
  return {
19
19
  _type: ObjectType.EqualToOrNull,
20
- value: (this as EqualToOrNull<T>).toString(),
20
+ /*
21
+ * The RAW value is serialized (like GreaterThan / InBetween), not
22
+ * toString(): toString() stringifies a Date into a locale- and
23
+ * timezone-dependent form that loses milliseconds, and coerces a number
24
+ * into a string. JSON.stringify emits a raw Date as its full ISO
25
+ * timestamp, which the server binds at full precision — and which is
26
+ * what lets an equality filter survive a round trip through the URL.
27
+ */
28
+ value: (this as EqualToOrNull<T>).value,
21
29
  };
22
30
  }
23
31
 
@@ -14,7 +14,15 @@ export default class NotEqual<T extends CompareType> extends CompareBase<T> {
14
14
  public override toJSON(): JSONObject {
15
15
  return {
16
16
  _type: ObjectType.NotEqual,
17
- value: (this as NotEqual<T>).toString(),
17
+ /*
18
+ * The RAW value is serialized (like GreaterThan / InBetween), not
19
+ * toString(): toString() stringifies a Date into a locale- and
20
+ * timezone-dependent form that loses milliseconds, and coerces a number
21
+ * into a string. JSON.stringify emits a raw Date as its full ISO
22
+ * timestamp, which the server binds at full precision — and which is
23
+ * what lets an equality filter survive a round trip through the URL.
24
+ */
25
+ value: (this as NotEqual<T>).value,
18
26
  };
19
27
  }
20
28
 
@@ -12,6 +12,7 @@ enum DashboardComponentType {
12
12
  IncidentList = `IncidentList`,
13
13
  AlertList = `AlertList`,
14
14
  MonitorList = `MonitorList`,
15
+ Slo = `Slo`,
15
16
  KubernetesPodList = `KubernetesPodList`,
16
17
  KubernetesNodeList = `KubernetesNodeList`,
17
18
  KubernetesNamespaceList = `KubernetesNamespaceList`,
@@ -27,6 +27,7 @@ export enum EntityFilterModelType {
27
27
  AlertState = "AlertState",
28
28
  MonitorStatus = "MonitorStatus",
29
29
  Monitor = "Monitor",
30
+ ServiceLevelObjective = "ServiceLevelObjective",
30
31
  Label = "Label",
31
32
  KubernetesCluster = "KubernetesCluster",
32
33
  DockerHost = "DockerHost",
@@ -0,0 +1,42 @@
1
+ import ObjectID from "../../ObjectID";
2
+ import DashboardComponentType from "../DashboardComponentType";
3
+ import BaseComponent from "./DashboardBaseComponent";
4
+
5
+ /**
6
+ * Which of the SLO's three tracked numbers the widget renders.
7
+ *
8
+ * These values are persisted inside the dashboard's JSON config, so they
9
+ * must never be renamed — only added to.
10
+ */
11
+ export enum SloWidgetMetric {
12
+ Sli = "Sli",
13
+ ErrorBudgetRemaining = "ErrorBudgetRemaining",
14
+ BurnRate = "BurnRate",
15
+ }
16
+
17
+ /**
18
+ * Tile renders the single current number (read from the SLO row that the
19
+ * evaluation worker keeps up to date). Chart renders the SloHistory
20
+ * series for the same metric over the dashboard's selected time range.
21
+ */
22
+ export enum SloWidgetDisplayType {
23
+ Tile = "Tile",
24
+ Chart = "Chart",
25
+ }
26
+
27
+ export default interface DashboardSloComponent extends BaseComponent {
28
+ componentType: DashboardComponentType.Slo;
29
+ componentId: ObjectID;
30
+ arguments: {
31
+ /*
32
+ * ObjectID of the ServiceLevelObjective, held as a string because the
33
+ * EntityDropdown argument editor writes the raw `_id` and the whole
34
+ * component tree round-trips through the dashboard's JSON config.
35
+ * The renderer wraps it in `new ObjectID(...)` before querying.
36
+ */
37
+ serviceLevelObjectiveId?: string | undefined;
38
+ sloMetric?: SloWidgetMetric | undefined;
39
+ displayType?: SloWidgetDisplayType | undefined;
40
+ widgetTitle?: string | undefined;
41
+ };
42
+ }