@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
@@ -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(),
@@ -734,18 +734,15 @@ export default class MonitorStep extends DatabaseProperty {
734
734
  return "Port is required";
735
735
  }
736
736
 
737
+ /*
738
+ * A Network Device monitor only needs to know WHICH device to alert
739
+ * on. What gets collected (interface walks, endpoint discovery, health
740
+ * OIDs) is configured on the NetworkDevice resource itself, not here.
741
+ */
737
742
  if (monitorType === MonitorType.NetworkDevice) {
738
743
  if (!value.data.networkDeviceMonitor?.networkDeviceId) {
739
744
  return "Network Device is required";
740
745
  }
741
-
742
- if (
743
- !value.data.networkDeviceMonitor.monitorInterfaces &&
744
- (!value.data.networkDeviceMonitor.oids ||
745
- value.data.networkDeviceMonitor.oids.length === 0)
746
- ) {
747
- return "Enable interface monitoring or configure at least one OID";
748
- }
749
746
  }
750
747
 
751
748
  if (monitorType === MonitorType.DNS) {
@@ -2,15 +2,29 @@ import { JSONObject } from "../JSON";
2
2
  import SnmpOid from "./SnmpMonitor/SnmpOid";
3
3
 
4
4
  /*
5
- * Step configuration for Network Device monitors. Unlike the retired SNMP
6
- * monitor type, the step carries no connection details — it references a
7
- * NetworkDevice resource which owns the hostname, credentials, and
8
- * interface inventory. The server hydrates the device's SNMP config into
9
- * the step (as `snmpMonitor`) when handing work to probes.
5
+ * Step configuration for Network Device monitors. The step is purely a
6
+ * device reference: the NetworkDevice resource owns the hostname,
7
+ * credentials, polling schedule, interface walks, endpoint discovery, and
8
+ * health OIDs. The monitor is the alerting layer it is evaluated
9
+ * server-side against the device's walk results and traps.
10
10
  */
11
11
  export default interface MonitorStepNetworkDeviceMonitor {
12
12
  networkDeviceId: string | undefined;
13
+ /*
14
+ * DEPRECATED: interface walking is now configured on the NetworkDevice
15
+ * (walkInterfaces). Retained so steps saved before the move still parse;
16
+ * never written by the dashboard anymore.
17
+ */
13
18
  monitorInterfaces: boolean;
19
+ /*
20
+ * DEPRECATED: endpoint collection is now configured on the NetworkDevice
21
+ * (collectEndpoints). Retained for parsing legacy steps only.
22
+ */
23
+ collectEndpoints?: boolean | undefined;
24
+ /*
25
+ * DEPRECATED: health OIDs are now configured on the NetworkDevice
26
+ * (snmpOids). Retained for parsing legacy steps only.
27
+ */
14
28
  oids: Array<SnmpOid>;
15
29
  }
16
30
 
@@ -19,6 +33,8 @@ export class MonitorStepNetworkDeviceMonitorUtil {
19
33
  return {
20
34
  networkDeviceId: undefined,
21
35
  monitorInterfaces: true,
36
+ // Off by default; the form renders it as an explicit opt-in switch.
37
+ collectEndpoints: false,
22
38
  oids: [],
23
39
  };
24
40
  }
@@ -27,6 +43,11 @@ export class MonitorStepNetworkDeviceMonitorUtil {
27
43
  return {
28
44
  networkDeviceId: (json["networkDeviceId"] as string) || undefined,
29
45
  monitorInterfaces: json["monitorInterfaces"] !== false,
46
+ /*
47
+ * Unlike monitorInterfaces, this is default-FALSE: only an explicit
48
+ * true opts in, so steps saved before the flag existed stay off.
49
+ */
50
+ collectEndpoints: json["collectEndpoints"] === true,
30
51
  oids: ((json["oids"] as Array<JSONObject>) || []).map(
31
52
  (oid: JSONObject) => {
32
53
  return {
@@ -43,6 +64,7 @@ export class MonitorStepNetworkDeviceMonitorUtil {
43
64
  return {
44
65
  networkDeviceId: monitor.networkDeviceId,
45
66
  monitorInterfaces: monitor.monitorInterfaces,
67
+ collectEndpoints: monitor.collectEndpoints,
46
68
  oids: monitor.oids.map((oid: SnmpOid) => {
47
69
  return {
48
70
  oid: oid.oid,
@@ -37,9 +37,11 @@ enum MonitorType {
37
37
 
38
38
  /*
39
39
  * Network device monitoring (SNMP-based). Replaced the retired SNMP
40
- * monitor type: instead of inline SNMP config, the monitor references a
41
- * NetworkDevice resource that owns the credentials and interface
42
- * inventory.
40
+ * monitor type. The referenced NetworkDevice resource owns everything
41
+ * about data collection credentials, polling schedule, interface
42
+ * walks, endpoint discovery, and health OIDs. The monitor is purely the
43
+ * alerting layer: it picks a device and evaluates criteria against the
44
+ * device's walk results and traps, server-side.
43
45
  */
44
46
  NetworkDevice = "Network Device",
45
47
 
@@ -354,7 +356,7 @@ export class MonitorTypeHelper {
354
356
  monitorType: MonitorType.NetworkDevice,
355
357
  title: "Network Device",
356
358
  description:
357
- "This monitor type lets you monitor a registered Network Device (switch, router, firewall, or access point) via SNMP — availability, interface status, bandwidth, and traps.",
359
+ "This monitor type alerts on a registered Network Device (switch, router, firewall, or access point) — availability, interface status, bandwidth, health OIDs, and traps. The device itself is polled by its assigned probe; the monitor chooses what to alert on.",
358
360
  icon: IconProp.Signal,
359
361
  },
360
362
  {
@@ -420,6 +422,15 @@ export class MonitorTypeHelper {
420
422
  return monitorTypeProps[0].title;
421
423
  }
422
424
 
425
+ /*
426
+ * Monitor types the probe executes on a schedule via MonitorProbe rows.
427
+ *
428
+ * NetworkDevice is deliberately NOT probeable: the NetworkDevice resource
429
+ * owns its own polling (the device's assigned probe walks it on the
430
+ * device's schedule), and Network Device monitors are evaluated
431
+ * server-side against each walk result and incoming trap — like
432
+ * IncomingRequest monitors, they never appear in a probe's work list.
433
+ */
423
434
  public static isProbableMonitor(monitorType: MonitorType): boolean {
424
435
  const isProbeableMonitor: boolean =
425
436
  monitorType === MonitorType.API ||
@@ -430,7 +441,6 @@ export class MonitorTypeHelper {
430
441
  monitorType === MonitorType.SSLCertificate ||
431
442
  monitorType === MonitorType.SyntheticMonitor ||
432
443
  monitorType === MonitorType.CustomJavaScriptCode ||
433
- monitorType === MonitorType.NetworkDevice ||
434
444
  monitorType === MonitorType.DNS ||
435
445
  monitorType === MonitorType.DNSSEC ||
436
446
  monitorType === MonitorType.Domain ||
@@ -0,0 +1,14 @@
1
+ /*
2
+ * One entry from a device's ARP / IP-to-media table (IP-MIB
3
+ * ipNetToMediaTable). Captured by the probe alongside the interface walk
4
+ * when endpoint collection is enabled; the server joins these against FDB
5
+ * entries by MAC address to give discovered endpoints an IP address on the
6
+ * topology graph.
7
+ */
8
+ export default interface ArpEntry {
9
+ ipAddress: string;
10
+ macAddress: string;
11
+ interfaceIndex: number;
12
+ // ipNetToMediaType, decoded: e.g. "dynamic", "static", "invalid".
13
+ entryType?: string | undefined;
14
+ }
@@ -0,0 +1,18 @@
1
+ /*
2
+ * One entry from a switch's forwarding database (BRIDGE-MIB dot1dTpFdbTable
3
+ * or Q-BRIDGE-MIB dot1qTpFdbTable). Each row says "this MAC address was
4
+ * learned on this bridge port" — the raw material for endpoint discovery.
5
+ * The probe resolves bridgePort to an ifIndex via dot1dBasePortIfIndex when
6
+ * the device implements it; the server turns MACs learned on leaf ports
7
+ * into endpoint nodes on the topology graph.
8
+ */
9
+ export default interface FdbEntry {
10
+ macAddress: string;
11
+ bridgePort: number;
12
+ // ifIndex the bridge port maps to, when dot1dBasePortIfIndex resolved it.
13
+ interfaceIndex?: number | undefined;
14
+ // From Q-BRIDGE-MIB walks; undefined when only dot1d data was available.
15
+ vlanId?: number | undefined;
16
+ // dot1dTpFdbStatus, decoded: e.g. "learned", "self", "mgmt".
17
+ status?: string | undefined;
18
+ }
@@ -88,8 +88,9 @@ export default class NetworkDeviceAlertPackUtil {
88
88
 
89
89
  /*
90
90
  * Builds ready-to-append MonitorCriteriaInstances from the pack. Each is
91
- * enabled and set to change monitor status; severities and on-call
92
- * policies are left for the user to fill in.
91
+ * enabled; incident-creating items also change the monitor status to the
92
+ * context's down status. Severities and on-call policies are left for the
93
+ * user to fill in.
93
94
  */
94
95
  public static buildCriteriaInstances(
95
96
  context?: NetworkDeviceAlertPackContext,
@@ -105,7 +106,13 @@ export default class NetworkDeviceAlertPackUtil {
105
106
  alerts: [],
106
107
  createAlerts: item.createAlerts,
107
108
  createIncidents: item.createIncidents,
108
- changeMonitorStatus: item.createIncidents,
109
+ /*
110
+ * Never claim to change monitor status without a status to change
111
+ * to — a caller that passes no context would otherwise produce
112
+ * criteria that "change" the monitor to an undefined status.
113
+ */
114
+ changeMonitorStatus:
115
+ item.createIncidents && Boolean(context?.downMonitorStatusId),
109
116
  isEnabled: true,
110
117
  name: item.name,
111
118
  description: item.description,
@@ -1,16 +1,30 @@
1
1
  /*
2
2
  * A derived view of the network topology for one project, built server-side
3
- * from the LLDP and CDP neighbor data each device reports. Nodes are devices;
4
- * unmanaged neighbors (discovery-protocol peers with no matching
5
- * NetworkDevice) appear as lightweight nodes so the graph doesn't dead-end.
3
+ * from the LLDP and CDP neighbor data each device reports (and, when
4
+ * endpoint collection is enabled, the ARP/FDB endpoint data). Nodes are
5
+ * devices; unmanaged neighbors (discovery-protocol peers with no matching
6
+ * NetworkDevice) appear as lightweight nodes so the graph doesn't dead-end,
7
+ * and discovered endpoints appear as "endpoint" nodes attached via "fdb"
8
+ * links.
6
9
  * Edges are physical links — one per device pair even when both ends (or
7
10
  * both protocols) report it — annotated with the operational state of the
8
11
  * interface at each end when the neighbor entry identifies it.
9
12
  */
10
13
  export type NetworkTopologyNodeStatus = "up" | "down" | "unknown";
11
14
 
12
- // Which discovery protocol(s) reported a link.
13
- export type NetworkTopologyLinkProtocol = "lldp" | "cdp";
15
+ /*
16
+ * Which source(s) reported a link — a discovery protocol, or the bridge
17
+ * forwarding database (endpoint attachment).
18
+ */
19
+ export type NetworkTopologyLinkProtocol = "lldp" | "cdp" | "fdb";
20
+
21
+ /*
22
+ * What a node represents. Older payloads carry no kind — readers should
23
+ * derive it from isManaged ("device" when true, "unmanaged" otherwise).
24
+ * "endpoint" nodes are non-network hosts (POS terminals, cameras, kiosks)
25
+ * discovered from ARP/FDB data.
26
+ */
27
+ export type NetworkTopologyNodeKind = "device" | "unmanaged" | "endpoint";
14
28
 
15
29
  export interface NetworkTopologyNode {
16
30
  // Device id for managed nodes; a synthetic "unmanaged:<key>" id otherwise.
@@ -18,6 +32,8 @@ export interface NetworkTopologyNode {
18
32
  name: string;
19
33
  isManaged: boolean;
20
34
  status: NetworkTopologyNodeStatus;
35
+ // Missing on older payloads — derive from isManaged.
36
+ kind?: NetworkTopologyNodeKind | undefined;
21
37
  interfacesUp?: number | undefined;
22
38
  interfacesDown?: number | undefined;
23
39
  // Extra device identity for search and the detail panel (managed nodes).
@@ -25,6 +41,16 @@ export interface NetworkTopologyNode {
25
41
  vendor?: string | undefined;
26
42
  // For unmanaged CDP peers this carries the reported platform string.
27
43
  deviceModel?: string | undefined;
44
+ /*
45
+ * Endpoint identity (endpoint nodes only), all best-effort: MAC from the
46
+ * FDB, IP from the ARP join, classification from OUI/heuristics (e.g.
47
+ * "pos-terminal", "camera", "printer"), VLAN from the FDB entry that
48
+ * learned the MAC. Optional so older payloads stay valid.
49
+ */
50
+ macAddress?: string | undefined;
51
+ ipAddress?: string | undefined;
52
+ classification?: string | undefined;
53
+ vlanId?: number | undefined;
28
54
  }
29
55
 
30
56
  /*
@@ -3,6 +3,8 @@ import SnmpDataType from "./SnmpDataType";
3
3
  import SnmpInterface from "./SnmpInterface";
4
4
  import LldpNeighbor from "./LldpNeighbor";
5
5
  import CdpNeighbor from "./CdpNeighbor";
6
+ import ArpEntry from "./ArpEntry";
7
+ import FdbEntry from "./FdbEntry";
6
8
  import SnmpSystemInfo from "./SnmpSystemInfo";
7
9
  import SnmpEntityInfo from "./SnmpEntityInfo";
8
10
 
@@ -49,4 +51,14 @@ export default interface SnmpMonitorResponse {
49
51
  * Undefined on older probes and non-CDP devices.
50
52
  */
51
53
  cdpNeighbors?: Array<CdpNeighbor> | undefined;
54
+ /*
55
+ * ARP / IP-to-media entries, walked when endpoint collection is enabled
56
+ * on the monitor step. Undefined on older probes.
57
+ */
58
+ arpEntries?: Array<ArpEntry> | undefined;
59
+ /*
60
+ * Bridge forwarding-database entries — MAC addresses learned per bridge
61
+ * port. Undefined on older probes and non-bridge devices.
62
+ */
63
+ fdbEntries?: Array<FdbEntry> | undefined;
52
64
  }