@oneuptime/common 11.6.1 → 11.7.0

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 (420) hide show
  1. package/Models/AnalyticsModels/Index.ts +4 -0
  2. package/Models/AnalyticsModels/KubernetesCostAllocation.ts +842 -0
  3. package/Models/AnalyticsModels/NetworkFlow.ts +54 -0
  4. package/Models/AnalyticsModels/SloHistory.ts +243 -0
  5. package/Models/DatabaseModels/Index.ts +20 -0
  6. package/Models/DatabaseModels/NetworkDevice.ts +453 -6
  7. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +7 -6
  8. package/Models/DatabaseModels/NetworkEndpoint.ts +753 -0
  9. package/Models/DatabaseModels/NetworkSite.ts +1155 -0
  10. package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +517 -0
  11. package/Models/DatabaseModels/NetworkSiteLink.ts +611 -0
  12. package/Models/DatabaseModels/NetworkSiteStatusTimeline.ts +520 -0
  13. package/Models/DatabaseModels/NetworkSiteType.ts +499 -0
  14. package/Models/DatabaseModels/ServiceLevelObjective.ts +1115 -0
  15. package/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.ts +762 -0
  16. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.ts +444 -0
  17. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.ts +443 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.ts +359 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.ts +48 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.ts +65 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.ts +88 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.ts +391 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1785066759532-MigrationName.ts +30 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
  25. package/Server/Services/AnalyticsDatabaseService.ts +25 -9
  26. package/Server/Services/Index.ts +24 -0
  27. package/Server/Services/KubernetesCostAllocationService.ts +14 -0
  28. package/Server/Services/MetricService.ts +21 -2
  29. package/Server/Services/MonitorService.ts +22 -0
  30. package/Server/Services/NetworkDeviceService.ts +438 -2
  31. package/Server/Services/NetworkEndpointService.ts +414 -0
  32. package/Server/Services/NetworkSiteAssignmentRuleService.ts +98 -0
  33. package/Server/Services/NetworkSiteLinkService.ts +10 -0
  34. package/Server/Services/NetworkSiteService.ts +1254 -0
  35. package/Server/Services/NetworkSiteStatusTimelineService.ts +10 -0
  36. package/Server/Services/NetworkSiteTypeService.ts +10 -0
  37. package/Server/Services/ProjectService.ts +122 -2
  38. package/Server/Services/ServiceLevelObjectiveBurnRateRuleService.ts +457 -0
  39. package/Server/Services/ServiceLevelObjectiveOwnerTeamService.ts +10 -0
  40. package/Server/Services/ServiceLevelObjectiveOwnerUserService.ts +10 -0
  41. package/Server/Services/ServiceLevelObjectiveService.ts +685 -0
  42. package/Server/Services/SloHistoryService.ts +101 -0
  43. package/Server/Services/UserNotificationSettingService.ts +37 -0
  44. package/Server/Types/AnalyticsDatabase/AggregateBy.ts +9 -0
  45. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +15 -0
  46. package/Server/Utils/AnalyticsDatabase/Statement.ts +39 -3
  47. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +87 -48
  48. package/Server/Utils/Memory.ts +9 -1
  49. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +190 -12
  50. package/Server/Utils/Monitor/Data/OuiVendors.json +6920 -0
  51. package/Server/Utils/Monitor/DnsResolutionCache.ts +129 -0
  52. package/Server/Utils/Monitor/MonitorResource.ts +4 -30
  53. package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +214 -39
  54. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +343 -0
  55. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +251 -0
  56. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +176 -142
  57. package/Server/Utils/Monitor/OuiLookupUtil.ts +49 -0
  58. package/Server/Utils/Monitor/SnmpInterfaceRateUtil.ts +17 -13
  59. package/Server/Utils/WhatsAppTemplateUtil.ts +7 -3
  60. package/Tests/Models/AnalyticsModels/KubernetesCostAllocation.test.ts +135 -0
  61. package/Tests/Models/NetworkSiteHierarchy.test.ts +134 -0
  62. package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +239 -0
  63. package/Tests/Server/Services/KubernetesCostAllocationAggregate.test.ts +338 -0
  64. package/Tests/Server/Services/MetricServiceAggregate.test.ts +142 -0
  65. package/Tests/Server/Services/NetworkDeviceSiteAssignment.test.ts +484 -0
  66. package/Tests/Server/Services/NetworkEndpointServiceUpsert.test.ts +686 -0
  67. package/Tests/Server/Services/NetworkSiteAssignmentRuleService.test.ts +185 -0
  68. package/Tests/Server/Services/NetworkSiteService.test.ts +1354 -0
  69. package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleService.test.ts +1313 -0
  70. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +1988 -0
  71. package/Tests/Server/Utils/AnalyticsDatabase/Statement.test.ts +22 -0
  72. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +404 -0
  73. package/Tests/Server/Utils/Encryption.test.ts +70 -0
  74. package/Tests/Server/Utils/FileAttachmentMarkdownUtil.test.ts +225 -0
  75. package/Tests/Server/Utils/JsonWebToken.test.ts +175 -0
  76. package/Tests/Server/Utils/LocalFile.test.ts +258 -0
  77. package/Tests/Server/Utils/Memory.test.ts +213 -0
  78. package/Tests/Server/Utils/Monitor/Criteria/LogMonitorCriteria.test.ts +30 -0
  79. package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +385 -0
  80. package/Tests/Server/Utils/Monitor/DnsResolutionCache.test.ts +194 -0
  81. package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +155 -0
  82. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +600 -0
  83. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +151 -124
  84. package/Tests/Server/Utils/Monitor/SnmpInterfaceRateUtil.test.ts +496 -0
  85. package/Tests/Server/Utils/MonitorCriteriaDataExtractor.test.ts +175 -0
  86. package/Tests/Server/Utils/MonitorCriteriaMessageFormatter.test.ts +282 -0
  87. package/Tests/Server/Utils/OuiLookupUtil.test.ts +59 -0
  88. package/Tests/Server/Utils/SeriesResourceLabels.test.ts +117 -0
  89. package/Tests/Server/Utils/StackTraceParser.test.ts +370 -0
  90. package/Tests/Server/Utils/Stream.test.ts +87 -0
  91. package/Tests/Server/Utils/ValidateGlobalProviderProjectTeams.test.ts +221 -0
  92. package/Tests/Server/Utils/WhatsAppTemplateUtil.test.ts +199 -0
  93. package/Tests/Types/Database/CompareOperatorWireSerialization.test.ts +33 -0
  94. package/Tests/Types/Email.test.ts +198 -0
  95. package/Tests/Types/Kubernetes/KubernetesObjectParser.test.ts +177 -0
  96. package/Tests/Types/Log/LogQueryToFilter.test.ts +111 -0
  97. package/Tests/Types/Monitor/MonitorCriteria.test.ts +155 -0
  98. package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +465 -0
  99. package/Tests/Types/Monitor/MonitorStep.test.ts +183 -0
  100. package/Tests/Types/Monitor/MonitorStepNetworkDeviceMonitor.test.ts +141 -1
  101. package/Tests/Types/Monitor/MonitorSteps.test.ts +183 -0
  102. package/Tests/Types/Monitor/MonitorType.test.ts +59 -1
  103. package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +97 -0
  104. package/Tests/Types/Monitor/SnmpEndpointDiscovery.test.ts +151 -0
  105. package/Tests/Types/Monitor/SnmpVendorTemplate.test.ts +110 -6
  106. package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +129 -0
  107. package/Tests/Types/SerializableObjectDictionary.test.ts +166 -0
  108. package/Tests/Types/Time/RangeStartAndEndDateTime.test.ts +98 -0
  109. package/Tests/Types/WebsiteRequest.test.ts +230 -0
  110. package/Tests/UI/Components/EntityFilterRoundTrip.test.tsx +103 -0
  111. package/Tests/UI/Components/ModelTable/BaseModelTableUrlState.test.tsx +612 -0
  112. package/Tests/UI/Components/ModelTable/FilterDataToQuery.test.ts +275 -0
  113. package/Tests/UI/Utils/LogExport.test.ts +159 -0
  114. package/Tests/UI/Utils/Navigation.test.ts +183 -0
  115. package/Tests/UI/Utils/TableFilterUrlState.test.ts +539 -0
  116. package/Tests/UI/Utils/TableViewUrlState.test.ts +272 -0
  117. package/Tests/Utils/Base64.test.ts +51 -0
  118. package/Tests/Utils/Boolean.test.ts +76 -0
  119. package/Tests/Utils/Crypto.test.ts +48 -0
  120. package/Tests/Utils/Dashboard/DashboardSloComponent.test.ts +259 -0
  121. package/Tests/Utils/Dashboard/ModelQueryVariableInterpolation.test.ts +162 -0
  122. package/Tests/Utils/Enum.test.ts +54 -0
  123. package/Tests/Utils/IpCanonicalUtil.test.ts +85 -0
  124. package/Tests/Utils/Memory.test.ts +44 -0
  125. package/Tests/Utils/Metrics/MetricSeriesFingerprint.test.ts +160 -0
  126. package/Tests/Utils/Monitor/EndpointAttachmentUtil.test.ts +836 -0
  127. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +218 -0
  128. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +447 -0
  129. package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +440 -0
  130. package/Tests/Utils/NetworkSite/MaterializedPathUtil.test.ts +205 -0
  131. package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +221 -0
  132. package/Tests/Utils/NetworkSite/SiteUptimeUtil.test.ts +283 -0
  133. package/Tests/Utils/ObjectUtil.test.ts +30 -0
  134. package/Tests/Utils/Slo/SloBurnRateRuleState.test.ts +124 -0
  135. package/Tests/Utils/Slo/SloDuration.test.ts +148 -0
  136. package/Tests/Utils/Slo/SloHealth.test.ts +334 -0
  137. package/Tests/Utils/Slo/SloStatusColor.test.ts +89 -0
  138. package/Tests/Utils/Slo/SloUtil.test.ts +1980 -0
  139. package/Tests/Utils/Slo/SloWidgetFormat.test.ts +605 -0
  140. package/Tests/Utils/TechStack.test.ts +50 -0
  141. package/Tests/Utils/Traces/CriticalPath.test.ts +178 -0
  142. package/Types/AnalyticsDatabase/AnalyticsTableName.ts +10 -0
  143. package/Types/BaseDatabase/EqualTo.ts +9 -1
  144. package/Types/BaseDatabase/EqualToOrNull.ts +9 -1
  145. package/Types/BaseDatabase/NotEqual.ts +9 -1
  146. package/Types/Dashboard/DashboardComponentType.ts +1 -0
  147. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
  148. package/Types/Dashboard/DashboardComponents/DashboardSloComponent.ts +42 -0
  149. package/Types/Dashboard/DashboardTemplates.ts +214 -0
  150. package/Types/Email/EmailTemplateType.ts +2 -0
  151. package/Types/Kubernetes/KubernetesCostIngest.ts +79 -0
  152. package/Types/Monitor/CriteriaFilter.ts +9 -0
  153. package/Types/Monitor/MonitorStep.ts +5 -8
  154. package/Types/Monitor/MonitorStepNetworkDeviceMonitor.ts +27 -5
  155. package/Types/Monitor/MonitorType.ts +15 -5
  156. package/Types/Monitor/SnmpMonitor/ArpEntry.ts +14 -0
  157. package/Types/Monitor/SnmpMonitor/FdbEntry.ts +18 -0
  158. package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +10 -3
  159. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +31 -5
  160. package/Types/Monitor/SnmpMonitor/SnmpMonitorResponse.ts +12 -0
  161. package/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.ts +231 -3
  162. package/Types/NetworkSite/DefaultNetworkSiteType.ts +20 -0
  163. package/Types/NotificationSetting/NotificationSettingEventType.ts +4 -0
  164. package/Types/Permission.ts +449 -0
  165. package/Types/ServiceLevelObjective/SliType.ts +6 -0
  166. package/Types/ServiceLevelObjective/SloMultiMonitorMode.ts +6 -0
  167. package/Types/ServiceLevelObjective/SloStatus.ts +9 -0
  168. package/Types/ServiceLevelObjective/SloWindowType.ts +6 -0
  169. package/Types/Telemetry/ServiceType.ts +1 -0
  170. package/UI/Components/Filters/EntityFilter.tsx +16 -0
  171. package/UI/Components/Filters/FilterViewer.tsx +22 -5
  172. package/UI/Components/List/List.tsx +8 -0
  173. package/UI/Components/ModelTable/BaseModelTable.tsx +309 -106
  174. package/UI/Components/ModelTable/FilterDataToQuery.ts +172 -0
  175. package/UI/Components/Navbar/NavBar.tsx +16 -2
  176. package/UI/Components/Navbar/NavBarMenuModal.tsx +3 -3
  177. package/UI/Utils/Navigation.ts +10 -0
  178. package/UI/Utils/TableFilterUrlState.ts +204 -17
  179. package/UI/Utils/TableViewUrlState.ts +165 -0
  180. package/Utils/Dashboard/Components/DashboardSloComponent.ts +114 -0
  181. package/Utils/Dashboard/Components/Index.ts +7 -0
  182. package/Utils/IpCanonicalUtil.ts +134 -0
  183. package/Utils/Monitor/EndpointAttachmentUtil.ts +508 -0
  184. package/Utils/Monitor/NetworkTopologyUtil.ts +157 -5
  185. package/Utils/NetworkSite/CidrMatchUtil.ts +296 -0
  186. package/Utils/NetworkSite/MaterializedPathUtil.ts +115 -0
  187. package/Utils/NetworkSite/SiteStatusRollupUtil.ts +97 -0
  188. package/Utils/NetworkSite/SiteUptimeUtil.ts +111 -0
  189. package/Utils/Slo/SloBurnRateRuleState.ts +91 -0
  190. package/Utils/Slo/SloDuration.ts +165 -0
  191. package/Utils/Slo/SloEvaluation.ts +22 -0
  192. package/Utils/Slo/SloHealth.ts +302 -0
  193. package/Utils/Slo/SloStatusColor.ts +54 -0
  194. package/Utils/Slo/SloUtil.ts +637 -0
  195. package/Utils/Slo/SloWidgetFormat.ts +383 -0
  196. package/build/dist/Models/AnalyticsModels/Index.js +4 -0
  197. package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
  198. package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js +713 -0
  199. package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js.map +1 -0
  200. package/build/dist/Models/AnalyticsModels/NetworkFlow.js +44 -0
  201. package/build/dist/Models/AnalyticsModels/NetworkFlow.js.map +1 -1
  202. package/build/dist/Models/AnalyticsModels/SloHistory.js +218 -0
  203. package/build/dist/Models/AnalyticsModels/SloHistory.js.map +1 -0
  204. package/build/dist/Models/DatabaseModels/Index.js +20 -0
  205. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  206. package/build/dist/Models/DatabaseModels/NetworkDevice.js +458 -6
  207. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  208. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +0 -6
  209. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  210. package/build/dist/Models/DatabaseModels/NetworkEndpoint.js +779 -0
  211. package/build/dist/Models/DatabaseModels/NetworkEndpoint.js.map +1 -0
  212. package/build/dist/Models/DatabaseModels/NetworkSite.js +1180 -0
  213. package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -0
  214. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +534 -0
  215. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -0
  216. package/build/dist/Models/DatabaseModels/NetworkSiteLink.js +629 -0
  217. package/build/dist/Models/DatabaseModels/NetworkSiteLink.js.map +1 -0
  218. package/build/dist/Models/DatabaseModels/NetworkSiteStatusTimeline.js +538 -0
  219. package/build/dist/Models/DatabaseModels/NetworkSiteStatusTimeline.js.map +1 -0
  220. package/build/dist/Models/DatabaseModels/NetworkSiteType.js +522 -0
  221. package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -0
  222. package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js +1134 -0
  223. package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js.map +1 -0
  224. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js +769 -0
  225. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js.map +1 -0
  226. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js +460 -0
  227. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js.map +1 -0
  228. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js +459 -0
  229. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js.map +1 -0
  230. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.js +130 -0
  231. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.js.map +1 -0
  232. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.js +31 -0
  233. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.js.map +1 -0
  234. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.js +36 -0
  235. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.js.map +1 -0
  236. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.js +49 -0
  237. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.js.map +1 -0
  238. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.js +140 -0
  239. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.js.map +1 -0
  240. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785066759532-MigrationName.js +21 -0
  241. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785066759532-MigrationName.js.map +1 -0
  242. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
  243. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  244. package/build/dist/Server/Services/AnalyticsDatabaseService.js +23 -6
  245. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  246. package/build/dist/Server/Services/Index.js +24 -0
  247. package/build/dist/Server/Services/Index.js.map +1 -1
  248. package/build/dist/Server/Services/KubernetesCostAllocationService.js +12 -0
  249. package/build/dist/Server/Services/KubernetesCostAllocationService.js.map +1 -0
  250. package/build/dist/Server/Services/MetricService.js +21 -3
  251. package/build/dist/Server/Services/MetricService.js.map +1 -1
  252. package/build/dist/Server/Services/MonitorService.js +19 -0
  253. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  254. package/build/dist/Server/Services/NetworkDeviceService.js +351 -1
  255. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  256. package/build/dist/Server/Services/NetworkEndpointService.js +319 -0
  257. package/build/dist/Server/Services/NetworkEndpointService.js.map +1 -0
  258. package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js +90 -0
  259. package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js.map +1 -0
  260. package/build/dist/Server/Services/NetworkSiteLinkService.js +9 -0
  261. package/build/dist/Server/Services/NetworkSiteLinkService.js.map +1 -0
  262. package/build/dist/Server/Services/NetworkSiteService.js +1038 -0
  263. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -0
  264. package/build/dist/Server/Services/NetworkSiteStatusTimelineService.js +9 -0
  265. package/build/dist/Server/Services/NetworkSiteStatusTimelineService.js.map +1 -0
  266. package/build/dist/Server/Services/NetworkSiteTypeService.js +9 -0
  267. package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -0
  268. package/build/dist/Server/Services/ProjectService.js +98 -2
  269. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  270. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js +358 -0
  271. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js.map +1 -0
  272. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js +9 -0
  273. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js.map +1 -0
  274. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js +9 -0
  275. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js.map +1 -0
  276. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +588 -0
  277. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -0
  278. package/build/dist/Server/Services/SloHistoryService.js +77 -0
  279. package/build/dist/Server/Services/SloHistoryService.js.map +1 -0
  280. package/build/dist/Server/Services/UserNotificationSettingService.js +20 -0
  281. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  282. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js +9 -0
  283. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js.map +1 -1
  284. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +15 -0
  285. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  286. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js +31 -0
  287. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js.map +1 -1
  288. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +76 -48
  289. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  290. package/build/dist/Server/Utils/Memory.js +9 -1
  291. package/build/dist/Server/Utils/Memory.js.map +1 -1
  292. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +132 -10
  293. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  294. package/build/dist/Server/Utils/Monitor/Data/OuiVendors.json +6920 -0
  295. package/build/dist/Server/Utils/Monitor/DnsResolutionCache.js +77 -0
  296. package/build/dist/Server/Utils/Monitor/DnsResolutionCache.js.map +1 -0
  297. package/build/dist/Server/Utils/Monitor/MonitorResource.js +21 -41
  298. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  299. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +152 -40
  300. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
  301. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +262 -0
  302. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -0
  303. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +201 -0
  304. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -0
  305. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +152 -120
  306. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  307. package/build/dist/Server/Utils/Monitor/OuiLookupUtil.js +44 -0
  308. package/build/dist/Server/Utils/Monitor/OuiLookupUtil.js.map +1 -0
  309. package/build/dist/Server/Utils/Monitor/SnmpInterfaceRateUtil.js +10 -10
  310. package/build/dist/Server/Utils/Monitor/SnmpInterfaceRateUtil.js.map +1 -1
  311. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js +5 -0
  312. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js.map +1 -1
  313. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +10 -0
  314. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
  315. package/build/dist/Types/BaseDatabase/EqualTo.js +9 -1
  316. package/build/dist/Types/BaseDatabase/EqualTo.js.map +1 -1
  317. package/build/dist/Types/BaseDatabase/EqualToOrNull.js +9 -1
  318. package/build/dist/Types/BaseDatabase/EqualToOrNull.js.map +1 -1
  319. package/build/dist/Types/BaseDatabase/NotEqual.js +9 -1
  320. package/build/dist/Types/BaseDatabase/NotEqual.js.map +1 -1
  321. package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
  322. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  323. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
  324. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  325. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloComponent.js +23 -0
  326. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloComponent.js.map +1 -0
  327. package/build/dist/Types/Dashboard/DashboardTemplates.js +205 -0
  328. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  329. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  330. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  331. package/build/dist/Types/Kubernetes/KubernetesCostIngest.js +21 -0
  332. package/build/dist/Types/Kubernetes/KubernetesCostIngest.js.map +1 -0
  333. package/build/dist/Types/Monitor/CriteriaFilter.js +1 -0
  334. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  335. package/build/dist/Types/Monitor/MonitorStep.js +5 -5
  336. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  337. package/build/dist/Types/Monitor/MonitorStepNetworkDeviceMonitor.js +8 -0
  338. package/build/dist/Types/Monitor/MonitorStepNetworkDeviceMonitor.js.map +1 -1
  339. package/build/dist/Types/Monitor/MonitorType.js +15 -5
  340. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  341. package/build/dist/Types/Monitor/SnmpMonitor/ArpEntry.js +2 -0
  342. package/build/dist/Types/Monitor/SnmpMonitor/ArpEntry.js.map +1 -0
  343. package/build/dist/Types/Monitor/SnmpMonitor/FdbEntry.js +2 -0
  344. package/build/dist/Types/Monitor/SnmpMonitor/FdbEntry.js.map +1 -0
  345. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +9 -3
  346. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
  347. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js +217 -3
  348. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js.map +1 -1
  349. package/build/dist/Types/NetworkSite/DefaultNetworkSiteType.js +21 -0
  350. package/build/dist/Types/NetworkSite/DefaultNetworkSiteType.js.map +1 -0
  351. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +3 -0
  352. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
  353. package/build/dist/Types/Permission.js +409 -0
  354. package/build/dist/Types/Permission.js.map +1 -1
  355. package/build/dist/Types/ServiceLevelObjective/SliType.js +7 -0
  356. package/build/dist/Types/ServiceLevelObjective/SliType.js.map +1 -0
  357. package/build/dist/Types/ServiceLevelObjective/SloMultiMonitorMode.js +7 -0
  358. package/build/dist/Types/ServiceLevelObjective/SloMultiMonitorMode.js.map +1 -0
  359. package/build/dist/Types/ServiceLevelObjective/SloStatus.js +10 -0
  360. package/build/dist/Types/ServiceLevelObjective/SloStatus.js.map +1 -0
  361. package/build/dist/Types/ServiceLevelObjective/SloWindowType.js +7 -0
  362. package/build/dist/Types/ServiceLevelObjective/SloWindowType.js.map +1 -0
  363. package/build/dist/Types/Telemetry/ServiceType.js +1 -0
  364. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  365. package/build/dist/UI/Components/Filters/EntityFilter.js +15 -0
  366. package/build/dist/UI/Components/Filters/EntityFilter.js.map +1 -1
  367. package/build/dist/UI/Components/Filters/FilterViewer.js +19 -4
  368. package/build/dist/UI/Components/Filters/FilterViewer.js.map +1 -1
  369. package/build/dist/UI/Components/List/List.js +1 -1
  370. package/build/dist/UI/Components/List/List.js.map +1 -1
  371. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +235 -89
  372. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  373. package/build/dist/UI/Components/ModelTable/FilterDataToQuery.js +96 -0
  374. package/build/dist/UI/Components/ModelTable/FilterDataToQuery.js.map +1 -0
  375. package/build/dist/UI/Components/Navbar/NavBar.js +14 -2
  376. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  377. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +3 -2
  378. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  379. package/build/dist/UI/Utils/Navigation.js +9 -0
  380. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  381. package/build/dist/UI/Utils/TableFilterUrlState.js +159 -15
  382. package/build/dist/UI/Utils/TableFilterUrlState.js.map +1 -1
  383. package/build/dist/UI/Utils/TableViewUrlState.js +103 -0
  384. package/build/dist/UI/Utils/TableViewUrlState.js.map +1 -0
  385. package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js +93 -0
  386. package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js.map +1 -0
  387. package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
  388. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  389. package/build/dist/Utils/IpCanonicalUtil.js +110 -0
  390. package/build/dist/Utils/IpCanonicalUtil.js.map +1 -0
  391. package/build/dist/Utils/Monitor/EndpointAttachmentUtil.js +311 -0
  392. package/build/dist/Utils/Monitor/EndpointAttachmentUtil.js.map +1 -0
  393. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +98 -5
  394. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  395. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +222 -0
  396. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -0
  397. package/build/dist/Utils/NetworkSite/MaterializedPathUtil.js +89 -0
  398. package/build/dist/Utils/NetworkSite/MaterializedPathUtil.js.map +1 -0
  399. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +60 -0
  400. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -0
  401. package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js +76 -0
  402. package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js.map +1 -0
  403. package/build/dist/Utils/Slo/SloBurnRateRuleState.js +35 -0
  404. package/build/dist/Utils/Slo/SloBurnRateRuleState.js.map +1 -0
  405. package/build/dist/Utils/Slo/SloDuration.js +87 -0
  406. package/build/dist/Utils/Slo/SloDuration.js.map +1 -0
  407. package/build/dist/Utils/Slo/SloEvaluation.js +21 -0
  408. package/build/dist/Utils/Slo/SloEvaluation.js.map +1 -0
  409. package/build/dist/Utils/Slo/SloHealth.js +179 -0
  410. package/build/dist/Utils/Slo/SloHealth.js.map +1 -0
  411. package/build/dist/Utils/Slo/SloStatusColor.js +18 -0
  412. package/build/dist/Utils/Slo/SloStatusColor.js.map +1 -0
  413. package/build/dist/Utils/Slo/SloUtil.js +393 -0
  414. package/build/dist/Utils/Slo/SloUtil.js.map +1 -0
  415. package/build/dist/Utils/Slo/SloWidgetFormat.js +174 -0
  416. package/build/dist/Utils/Slo/SloWidgetFormat.js.map +1 -0
  417. package/package.json +2 -2
  418. package/Types/Dashboard/DashboardComponents/Index.ts +0 -7
  419. package/build/dist/Types/Dashboard/DashboardComponents/Index.js +0 -8
  420. 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
+ });
@@ -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;
@@ -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
+ }
@@ -27,6 +27,7 @@ export enum DashboardTemplateType {
27
27
  Incident = "Incident",
28
28
  Alert = "Alert",
29
29
  Kubernetes = "Kubernetes",
30
+ KubernetesCost = "KubernetesCost",
30
31
  Host = "Host",
31
32
  Proxmox = "Proxmox",
32
33
  Ceph = "Ceph",
@@ -110,6 +111,14 @@ export const DashboardTemplates: Array<DashboardTemplate> = [
110
111
  icon: IconProp.Kubernetes,
111
112
  category: DashboardTemplateCategory.Infrastructure,
112
113
  },
114
+ {
115
+ type: DashboardTemplateType.KubernetesCost,
116
+ name: "Kubernetes Cost Dashboard",
117
+ description:
118
+ "Node hourly cost trends, CPU/RAM unit costs, persistent volume and load balancer spend from your in-cluster cost engine (OpenCost / Kubecost).",
119
+ icon: IconProp.Billing,
120
+ category: DashboardTemplateCategory.Infrastructure,
121
+ },
113
122
  {
114
123
  type: DashboardTemplateType.Host,
115
124
  name: "Hosts Dashboard",
@@ -1639,6 +1648,209 @@ function createKubernetesDashboardConfig(): DashboardViewConfig {
1639
1648
  };
1640
1649
  }
1641
1650
 
1651
+ function createKubernetesCostDashboardConfig(): DashboardViewConfig {
1652
+ /*
1653
+ * Built on the cost metrics the kubernetes-agent chart scrapes from an
1654
+ * in-cluster cost engine (OpenCost / Kubecost cost-model) when
1655
+ * `cost.metrics` is enabled — node_total_hourly_cost,
1656
+ * node_cpu_hourly_cost, node_ram_hourly_cost, pv_hourly_cost,
1657
+ * kubecost_load_balancer_cost. Per-workload allocation (namespace /
1658
+ * controller spend, idle, efficiency) is NOT charted here — those come
1659
+ * from the Allocation API poller and live on the cluster's Costs page.
1660
+ *
1661
+ * Layout notes:
1662
+ *
1663
+ * - Every cost metric here is a per-resource gauge (one series per
1664
+ * node / volume / load balancer) re-emitted on every scrape, so a
1665
+ * `Sum` aggregation would multiply by the scrape count over the
1666
+ * window — the same trap the Kubernetes template documents for
1667
+ * k8s.pod.phase. All widgets therefore use `Avg`, and the charts fan
1668
+ * out per resource via groupByAttributeKeys so a stacked area still
1669
+ * reads as the cluster total per bucket.
1670
+ *
1671
+ * - The engine's metric labels are plain Prometheus labels ("node",
1672
+ * "persistentvolume", "service_name"), not OTel resource attributes,
1673
+ * so group keys have no `resource.` prefix.
1674
+ */
1675
+ const components: Array<DashboardBaseComponent> = [
1676
+ // Row 0: Title
1677
+ createTextComponent({
1678
+ text: "Kubernetes Cost Dashboard",
1679
+ top: 0,
1680
+ left: 0,
1681
+ width: 12,
1682
+ height: 1,
1683
+ isBold: true,
1684
+ }),
1685
+
1686
+ // Row 1: Unit-cost stat tiles. Rising cost is "worse" for all four.
1687
+ createValueComponent({
1688
+ title: "Node Cost $/hr (avg per node)",
1689
+ top: 1,
1690
+ left: 0,
1691
+ width: 3,
1692
+ metricConfig: {
1693
+ metricName: "node_total_hourly_cost",
1694
+ aggregationType: MetricsAggregationType.Avg,
1695
+ },
1696
+ trendDirection: DashboardValueTrendDirection.HigherIsWorse,
1697
+ }),
1698
+ createValueComponent({
1699
+ title: "CPU Cost $/core-hr (avg)",
1700
+ top: 1,
1701
+ left: 3,
1702
+ width: 3,
1703
+ metricConfig: {
1704
+ metricName: "node_cpu_hourly_cost",
1705
+ aggregationType: MetricsAggregationType.Avg,
1706
+ },
1707
+ trendDirection: DashboardValueTrendDirection.HigherIsWorse,
1708
+ }),
1709
+ createValueComponent({
1710
+ title: "RAM Cost $/GiB-hr (avg)",
1711
+ top: 1,
1712
+ left: 6,
1713
+ width: 3,
1714
+ metricConfig: {
1715
+ metricName: "node_ram_hourly_cost",
1716
+ aggregationType: MetricsAggregationType.Avg,
1717
+ },
1718
+ trendDirection: DashboardValueTrendDirection.HigherIsWorse,
1719
+ }),
1720
+ createValueComponent({
1721
+ title: "PV Cost $/hr (avg per volume)",
1722
+ top: 1,
1723
+ left: 9,
1724
+ width: 3,
1725
+ metricConfig: {
1726
+ metricName: "pv_hourly_cost",
1727
+ aggregationType: MetricsAggregationType.Avg,
1728
+ },
1729
+ trendDirection: DashboardValueTrendDirection.HigherIsWorse,
1730
+ }),
1731
+
1732
+ /*
1733
+ * Row 2-5: Hourly cost per node, stacked — the stack height is the
1734
+ * cluster's total node $/hr per bucket.
1735
+ */
1736
+ createChartComponent({
1737
+ title: "Node Hourly Cost ($/hr, stacked by node)",
1738
+ chartType: DashboardChartType.StackedArea,
1739
+ top: 2,
1740
+ left: 0,
1741
+ width: 12,
1742
+ height: 3,
1743
+ metricConfig: {
1744
+ metricName: "node_total_hourly_cost",
1745
+ aggregationType: MetricsAggregationType.Avg,
1746
+ legend: "Node",
1747
+ legendUnit: "$/hr",
1748
+ groupByAttributeKeys: ["node"],
1749
+ },
1750
+ }),
1751
+
1752
+ // Row 5-8: Unit-cost trends per node — catches spot/instance-type churn.
1753
+ createChartComponent({
1754
+ title: "CPU Cost per Core Hour by Node",
1755
+ chartType: DashboardChartType.Line,
1756
+ top: 5,
1757
+ left: 0,
1758
+ width: 6,
1759
+ height: 3,
1760
+ metricConfig: {
1761
+ metricName: "node_cpu_hourly_cost",
1762
+ aggregationType: MetricsAggregationType.Avg,
1763
+ legend: "Node",
1764
+ legendUnit: "$/core-hr",
1765
+ groupByAttributeKeys: ["node"],
1766
+ },
1767
+ }),
1768
+ createChartComponent({
1769
+ title: "RAM Cost per GiB Hour by Node",
1770
+ chartType: DashboardChartType.Line,
1771
+ top: 5,
1772
+ left: 6,
1773
+ width: 6,
1774
+ height: 3,
1775
+ metricConfig: {
1776
+ metricName: "node_ram_hourly_cost",
1777
+ aggregationType: MetricsAggregationType.Avg,
1778
+ legend: "Node",
1779
+ legendUnit: "$/GiB-hr",
1780
+ groupByAttributeKeys: ["node"],
1781
+ },
1782
+ }),
1783
+
1784
+ // Row 8-11: Storage and load balancer spend.
1785
+ createChartComponent({
1786
+ title: "Persistent Volume Hourly Cost (stacked by volume)",
1787
+ chartType: DashboardChartType.StackedArea,
1788
+ top: 8,
1789
+ left: 0,
1790
+ width: 6,
1791
+ height: 3,
1792
+ metricConfig: {
1793
+ metricName: "pv_hourly_cost",
1794
+ aggregationType: MetricsAggregationType.Avg,
1795
+ legend: "Volume",
1796
+ legendUnit: "$/hr",
1797
+ groupByAttributeKeys: ["persistentvolume"],
1798
+ },
1799
+ }),
1800
+ createChartComponent({
1801
+ title: "Load Balancer Hourly Cost (stacked by service)",
1802
+ chartType: DashboardChartType.StackedArea,
1803
+ top: 8,
1804
+ left: 6,
1805
+ width: 6,
1806
+ height: 3,
1807
+ metricConfig: {
1808
+ metricName: "kubecost_load_balancer_cost",
1809
+ aggregationType: MetricsAggregationType.Avg,
1810
+ legend: "Service",
1811
+ legendUnit: "$/hr",
1812
+ groupByAttributeKeys: ["service_name"],
1813
+ },
1814
+ }),
1815
+
1816
+ // Row 11-14: Per-node cost table for quick ranking.
1817
+ createTableComponent({
1818
+ title: "Cost by Node ($/hr)",
1819
+ top: 11,
1820
+ left: 0,
1821
+ width: 12,
1822
+ height: 3,
1823
+ maxRows: 20,
1824
+ metricConfig: {
1825
+ metricName: "node_total_hourly_cost",
1826
+ aggregationType: MetricsAggregationType.Avg,
1827
+ groupByAttributeKeys: ["node"],
1828
+ },
1829
+ }),
1830
+ ];
1831
+
1832
+ /*
1833
+ * Cluster picker so multi-cluster projects can scope every widget from
1834
+ * the toolbar. The deployment collector stamps k8s.cluster.name on the
1835
+ * scraped cost metrics, so the binding key matches the other
1836
+ * Kubernetes dashboards.
1837
+ */
1838
+ const variables: Array<DashboardVariable> = [
1839
+ createTelemetryAttributeVariable({
1840
+ name: "cluster",
1841
+ label: "Cluster",
1842
+ attributeKey: "resource.k8s.cluster.name",
1843
+ }),
1844
+ ];
1845
+
1846
+ return {
1847
+ _type: ObjectType.DashboardViewConfig,
1848
+ components,
1849
+ variables,
1850
+ heightInDashboardUnits: Math.max(DashboardSize.heightInDashboardUnits, 14),
1851
+ };
1852
+ }
1853
+
1642
1854
  function createMetricsDashboardConfig(): DashboardViewConfig {
1643
1855
  /*
1644
1856
  * Layout notes:
@@ -2697,6 +2909,8 @@ export function getTemplateConfig(
2697
2909
  return createAlertDashboardConfig();
2698
2910
  case DashboardTemplateType.Kubernetes:
2699
2911
  return createKubernetesDashboardConfig();
2912
+ case DashboardTemplateType.KubernetesCost:
2913
+ return createKubernetesCostDashboardConfig();
2700
2914
  case DashboardTemplateType.Host:
2701
2915
  return createHostDashboardConfig();
2702
2916
  case DashboardTemplateType.Proxmox:
@@ -32,6 +32,8 @@ enum EmailTemplateType {
32
32
  MonitorProbesStatus = "MonitorProbesStatus.hbs",
33
33
  MonitorOwnerStatusChanged = "MonitorOwnerStatusChanged.hbs",
34
34
 
35
+ SloOwnerStatusChanged = "SloOwnerStatusChanged.hbs",
36
+
35
37
  IncidentOwnerAdded = "IncidentOwnerAdded.hbs",
36
38
  IncidentOwnerStateChanged = "IncidentOwnerStateChanged.hbs",
37
39
  IncidentOwnerNotePosted = "IncidentOwnerNotePosted.hbs",
@@ -0,0 +1,79 @@
1
+ /*
2
+ * Wire contract for POST /kubernetes-cost/ingest — the payload the
3
+ * Kubernetes agent's cost poller ships after querying an in-cluster cost
4
+ * engine's Allocation API (OpenCost `/allocation/compute`, Kubecost
5
+ * `/model/allocation`). One request carries one cluster's allocation rows
6
+ * for one or more closed time windows.
7
+ *
8
+ * The route is mounted under both "/telemetry" and "/" (TELEMETRY_PREFIXES).
9
+ * The agent posts to the "/telemetry" prefix — see the note in
10
+ * KubernetesCostAgent/Shipper.ts for why.
11
+ *
12
+ * The agent projects are standalone (no dependency on Common), so the
13
+ * poller carries its own mirror of these interfaces
14
+ * (KubernetesCostAgent/Types.ts) — keep the two in sync.
15
+ */
16
+
17
+ export interface KubernetesCostAllocationIngestRow {
18
+ /** ISO-8601 start of the allocation window. Required. */
19
+ windowStart: string;
20
+ /** ISO-8601 end of the allocation window. Required. */
21
+ windowEnd: string;
22
+
23
+ /*
24
+ * Workload identity. All optional — idle / unallocated rows carry the
25
+ * engine's sentinel in `namespace` ("__idle__" / "__unallocated__") and
26
+ * nothing else.
27
+ */
28
+ namespace?: string | undefined;
29
+ controllerKind?: string | undefined;
30
+ controllerName?: string | undefined;
31
+ podName?: string | undefined;
32
+ containerName?: string | undefined;
33
+ nodeName?: string | undefined;
34
+ providerId?: string | undefined;
35
+ labels?: Record<string, string> | undefined;
36
+
37
+ // Usage / request measures.
38
+ cpuCoreHours?: number | undefined;
39
+ cpuCoreRequestAverage?: number | undefined;
40
+ cpuCoreUsageAverage?: number | undefined;
41
+ gpuHours?: number | undefined;
42
+ ramByteHours?: number | undefined;
43
+ ramBytesRequestAverage?: number | undefined;
44
+ ramBytesUsageAverage?: number | undefined;
45
+ pvByteHours?: number | undefined;
46
+
47
+ // Pre-priced cost components (in `currency` of the payload).
48
+ cpuCost?: number | undefined;
49
+ gpuCost?: number | undefined;
50
+ ramCost?: number | undefined;
51
+ pvCost?: number | undefined;
52
+ networkCost?: number | undefined;
53
+ loadBalancerCost?: number | undefined;
54
+ sharedCost?: number | undefined;
55
+ externalCost?: number | undefined;
56
+ totalCost?: number | undefined;
57
+
58
+ // Efficiency ratios (usage / request, 0..1+).
59
+ cpuEfficiency?: number | undefined;
60
+ ramEfficiency?: number | undefined;
61
+ totalEfficiency?: number | undefined;
62
+ }
63
+
64
+ export interface KubernetesCostIngestPayload {
65
+ /**
66
+ * Cluster identifier — must match the k8s.cluster.name the agent stamps
67
+ * on metrics so cost rows land on the same KubernetesCluster resource.
68
+ */
69
+ clusterName: string;
70
+ /** Currency code of all cost figures (e.g. "USD"). Optional. */
71
+ currency?: string | undefined;
72
+ allocations: Array<KubernetesCostAllocationIngestRow>;
73
+ }
74
+
75
+ /**
76
+ * Upper bound on `allocations.length` per request. The poller chunks its
77
+ * output to stay under this; the ingest endpoint rejects anything larger.
78
+ */
79
+ export const MAX_KUBERNETES_COST_ALLOCATIONS_PER_REQUEST: number = 5000;
@@ -119,6 +119,14 @@ export interface ServerMonitorOptions {
119
119
 
120
120
  export interface SnmpMonitorOptions {
121
121
  oid?: string | undefined;
122
+ /*
123
+ * Optional interface scope for the interface CheckOns (down /
124
+ * utilization / errors). When set, only interfaces whose name or alias
125
+ * equals this value (case-insensitive) are evaluated — so "uplink Gi0/1
126
+ * above 80%" does not fire because an access port got busy. Empty =
127
+ * every monitored interface, the historical behavior.
128
+ */
129
+ interfaceName?: string | undefined;
122
130
  }
123
131
 
124
132
  export enum EvaluateOverTimeType {
@@ -429,6 +437,7 @@ export const CriteriaFilterSchema: ZodSchema = Zod.object({
429
437
  }).optional(),
430
438
  snmpMonitorOptions: Zod.object({
431
439
  oid: Zod.string().optional(),
440
+ interfaceName: Zod.string().optional(),
432
441
  }).optional(),
433
442
  filterType: Zod.string().optional(),
434
443
  value: Zod.union([Zod.string(), Zod.number()]).optional(),