@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,343 @@
1
+ import logger from "../Logger";
2
+ import TelemetryUtil from "../Telemetry/Telemetry";
3
+ import MetricService from "../../Services/MetricService";
4
+ import GlobalConfigService from "../../Services/GlobalConfigService";
5
+ import GlobalConfig from "../../../Models/DatabaseModels/GlobalConfig";
6
+ import { MetricPointType } from "../../../Models/AnalyticsModels/Metric";
7
+ import ServiceType from "../../../Types/Telemetry/ServiceType";
8
+ import MetricType from "../../../Models/DatabaseModels/MetricType";
9
+ import Dictionary from "../../../Types/Dictionary";
10
+ import { JSONObject } from "../../../Types/JSON";
11
+ import MonitorMetricType from "../../../Types/Monitor/MonitorMetricType";
12
+ import SnmpInterface from "../../../Types/Monitor/SnmpMonitor/SnmpInterface";
13
+ import SnmpMonitorResponse, {
14
+ SnmpOidResponse,
15
+ } from "../../../Types/Monitor/SnmpMonitor/SnmpMonitorResponse";
16
+ import ObjectID from "../../../Types/ObjectID";
17
+ import OneUptimeDate from "../../../Types/Date";
18
+ import CaptureSpan from "../Telemetry/CaptureSpan";
19
+
20
+ /*
21
+ * Emits device-scoped metrics from each device walk — availability,
22
+ * response time, per-interface status/bandwidth/utilization/errors, and
23
+ * polled health-OID values. Series are keyed to the NetworkDevice
24
+ * (primaryEntityId = deviceId, attributes.networkDeviceId), NOT to a
25
+ * monitor, so the device pages can chart health for every registered
26
+ * device — including devices no monitor watches. Mirrors the SNMP sections
27
+ * of MonitorMetricUtil, which continue to emit monitor-scoped series for
28
+ * monitors that alert on the device.
29
+ */
30
+ export default class NetworkDeviceMetricUtil {
31
+ /*
32
+ * Caps mirror MonitorMetricUtil: bound what a single walk can write —
33
+ * large routers can expose thousands of subinterfaces.
34
+ */
35
+ private static readonly maxInterfaceSeries: number = 200;
36
+ private static readonly maxOidSeries: number = 50;
37
+
38
+ // Retention handling mirrors MonitorMetricUtil (shared GlobalConfig knob).
39
+ private static readonly DEFAULT_RETENTION_DAYS: number = 30;
40
+ private static cachedRetentionDays: number | null = null;
41
+ private static lastCacheRefresh: Date | null = null;
42
+ private static readonly CACHE_TTL_MS: number = 5 * 60 * 1000;
43
+
44
+ private static async getRetentionDays(): Promise<number> {
45
+ const now: Date = OneUptimeDate.getCurrentDate();
46
+
47
+ if (
48
+ this.cachedRetentionDays !== null &&
49
+ this.lastCacheRefresh !== null &&
50
+ now.getTime() - this.lastCacheRefresh.getTime() < this.CACHE_TTL_MS
51
+ ) {
52
+ return this.cachedRetentionDays;
53
+ }
54
+
55
+ try {
56
+ const globalConfig: GlobalConfig | null =
57
+ await GlobalConfigService.findOneBy({
58
+ query: {
59
+ _id: ObjectID.getZeroObjectID().toString(),
60
+ },
61
+ props: {
62
+ isRoot: true,
63
+ },
64
+ select: {
65
+ monitorMetricRetentionInDays: true,
66
+ },
67
+ });
68
+
69
+ if (
70
+ globalConfig &&
71
+ globalConfig.monitorMetricRetentionInDays !== undefined &&
72
+ globalConfig.monitorMetricRetentionInDays !== null
73
+ ) {
74
+ this.cachedRetentionDays = globalConfig.monitorMetricRetentionInDays;
75
+ } else {
76
+ this.cachedRetentionDays = this.DEFAULT_RETENTION_DAYS;
77
+ }
78
+ } catch (err) {
79
+ logger.error(err);
80
+ this.cachedRetentionDays = this.DEFAULT_RETENTION_DAYS;
81
+ }
82
+
83
+ this.lastCacheRefresh = now;
84
+ return this.cachedRetentionDays;
85
+ }
86
+
87
+ @CaptureSpan()
88
+ public static async saveWalkMetrics(data: {
89
+ projectId: ObjectID;
90
+ networkDeviceId: ObjectID;
91
+ deviceName: string | undefined;
92
+ probeId: ObjectID | undefined;
93
+ snmpResponse: SnmpMonitorResponse | undefined;
94
+ responseTimeInMs: number | undefined;
95
+ isOnline: boolean | undefined;
96
+ }): Promise<void> {
97
+ const metricRows: Array<JSONObject> = [];
98
+ const metricNameServiceNameMap: Dictionary<MetricType> = {};
99
+
100
+ const retentionDays: number =
101
+ await NetworkDeviceMetricUtil.getRetentionDays();
102
+ const retentionDate: Date = OneUptimeDate.addRemoveDays(
103
+ OneUptimeDate.getCurrentDate(),
104
+ retentionDays,
105
+ );
106
+
107
+ const baseAttributes: JSONObject = {
108
+ projectId: data.projectId.toString(),
109
+ networkDeviceId: data.networkDeviceId.toString(),
110
+ };
111
+
112
+ if (data.deviceName) {
113
+ baseAttributes["deviceName"] = data.deviceName;
114
+ }
115
+
116
+ if (data.probeId) {
117
+ baseAttributes["probeId"] = data.probeId.toString();
118
+ }
119
+
120
+ const pushMetric: (metric: {
121
+ metricName: string;
122
+ value: number | null | undefined;
123
+ description: string;
124
+ unit: string;
125
+ extraAttributes?: JSONObject | undefined;
126
+ }) => void = (metric: {
127
+ metricName: string;
128
+ value: number | null | undefined;
129
+ description: string;
130
+ unit: string;
131
+ extraAttributes?: JSONObject | undefined;
132
+ }) => {
133
+ if (metric.value === undefined || metric.value === null) {
134
+ return;
135
+ }
136
+
137
+ if (typeof metric.value !== "number" || !isFinite(metric.value)) {
138
+ return;
139
+ }
140
+
141
+ metricRows.push(
142
+ NetworkDeviceMetricUtil.buildDeviceMetricRow({
143
+ projectId: data.projectId,
144
+ networkDeviceId: data.networkDeviceId,
145
+ metricName: metric.metricName,
146
+ value: metric.value,
147
+ retentionDate: retentionDate,
148
+ attributes: {
149
+ ...baseAttributes,
150
+ ...(metric.extraAttributes || {}),
151
+ },
152
+ }),
153
+ );
154
+
155
+ const metricType: MetricType = new MetricType();
156
+ metricType.name = metric.metricName;
157
+ metricType.description = metric.description;
158
+ metricType.unit = metric.unit;
159
+
160
+ metricNameServiceNameMap[metric.metricName] = metricType;
161
+ };
162
+
163
+ if (data.isOnline !== undefined) {
164
+ pushMetric({
165
+ metricName: MonitorMetricType.IsOnline,
166
+ value: data.isOnline ? 1 : 0,
167
+ description: "SNMP reachability of this network device (1 up, 0 down)",
168
+ unit: "",
169
+ });
170
+ }
171
+
172
+ if (data.responseTimeInMs !== undefined) {
173
+ pushMetric({
174
+ metricName: MonitorMetricType.ResponseTime,
175
+ value: data.responseTimeInMs,
176
+ description: "SNMP response time of this network device",
177
+ unit: "ms",
178
+ });
179
+ }
180
+
181
+ const snmpInterfaces: Array<SnmpInterface> | undefined =
182
+ data.snmpResponse?.interfaces;
183
+
184
+ if (snmpInterfaces && snmpInterfaces.length > 0) {
185
+ const interfacesToEmit: Array<SnmpInterface> = snmpInterfaces.slice(
186
+ 0,
187
+ NetworkDeviceMetricUtil.maxInterfaceSeries,
188
+ );
189
+
190
+ if (interfacesToEmit.length < snmpInterfaces.length) {
191
+ logger.warn(
192
+ `Device ${data.networkDeviceId.toString()}: emitting metrics for first ${interfacesToEmit.length} of ${snmpInterfaces.length} SNMP interfaces`,
193
+ );
194
+ }
195
+
196
+ for (const snmpInterface of interfacesToEmit) {
197
+ const interfaceAttributes: JSONObject = {
198
+ interfaceName: snmpInterface.name,
199
+ interfaceIndex: snmpInterface.interfaceIndex.toString(),
200
+ };
201
+
202
+ pushMetric({
203
+ metricName: MonitorMetricType.SnmpInterfaceOperStatus,
204
+ value: snmpInterface.isOperationallyUp ? 1 : 0,
205
+ description: "SNMP interface operational status (1 up, 0 down)",
206
+ unit: "",
207
+ extraAttributes: interfaceAttributes,
208
+ });
209
+ pushMetric({
210
+ metricName: MonitorMetricType.SnmpInterfaceInBitsPerSecond,
211
+ value: snmpInterface.inBitsPerSecond,
212
+ description: "SNMP interface inbound bandwidth",
213
+ unit: "bps",
214
+ extraAttributes: interfaceAttributes,
215
+ });
216
+ pushMetric({
217
+ metricName: MonitorMetricType.SnmpInterfaceOutBitsPerSecond,
218
+ value: snmpInterface.outBitsPerSecond,
219
+ description: "SNMP interface outbound bandwidth",
220
+ unit: "bps",
221
+ extraAttributes: interfaceAttributes,
222
+ });
223
+ pushMetric({
224
+ metricName: MonitorMetricType.SnmpInterfaceUtilizationPercent,
225
+ value: snmpInterface.utilizationPercent,
226
+ description: "SNMP interface utilization",
227
+ unit: "%",
228
+ extraAttributes: interfaceAttributes,
229
+ });
230
+ pushMetric({
231
+ metricName: MonitorMetricType.SnmpInterfaceErrorsPerSecond,
232
+ value: snmpInterface.errorsPerSecond,
233
+ description: "SNMP interface errors per second",
234
+ unit: "errors/s",
235
+ extraAttributes: interfaceAttributes,
236
+ });
237
+ }
238
+ }
239
+
240
+ /*
241
+ * Polled health-OID values (vendor-template CPU/memory/temperature and
242
+ * custom OIDs configured on the device). One series per OID, keyed by
243
+ * the oid/oidName attributes; non-numeric values (strings, OIDs, MACs)
244
+ * are skipped — they carry no chartable signal.
245
+ */
246
+ const snmpOidResponses: Array<SnmpOidResponse> | undefined =
247
+ data.snmpResponse?.oidResponses;
248
+
249
+ if (snmpOidResponses && snmpOidResponses.length > 0) {
250
+ const oidResponsesToEmit: Array<SnmpOidResponse> = snmpOidResponses.slice(
251
+ 0,
252
+ NetworkDeviceMetricUtil.maxOidSeries,
253
+ );
254
+
255
+ if (oidResponsesToEmit.length < snmpOidResponses.length) {
256
+ logger.warn(
257
+ `Device ${data.networkDeviceId.toString()}: emitting metrics for first ${oidResponsesToEmit.length} of ${snmpOidResponses.length} SNMP OID responses`,
258
+ );
259
+ }
260
+
261
+ for (const oidResponse of oidResponsesToEmit) {
262
+ const numericValue: number | undefined =
263
+ typeof oidResponse.value === "number" && isFinite(oidResponse.value)
264
+ ? oidResponse.value
265
+ : undefined;
266
+
267
+ if (numericValue === undefined) {
268
+ continue;
269
+ }
270
+
271
+ pushMetric({
272
+ metricName: MonitorMetricType.SnmpOidValue,
273
+ value: numericValue,
274
+ description: "Value of a polled SNMP OID",
275
+ unit: "",
276
+ extraAttributes: {
277
+ oid: oidResponse.oid,
278
+ oidName: oidResponse.name || oidResponse.oid,
279
+ },
280
+ });
281
+ }
282
+ }
283
+
284
+ if (metricRows.length === 0) {
285
+ return;
286
+ }
287
+
288
+ await MetricService.insertJsonRows(metricRows);
289
+
290
+ TelemetryUtil.indexMetricNameServiceNameMap({
291
+ projectId: data.projectId,
292
+ metricNameServiceNameMap: metricNameServiceNameMap,
293
+ }).catch((err: Error) => {
294
+ logger.error(err);
295
+ });
296
+ }
297
+
298
+ // Row shape must stay in lockstep with MonitorMetricUtil.buildMonitorMetricRow.
299
+ private static buildDeviceMetricRow(data: {
300
+ projectId: ObjectID;
301
+ networkDeviceId: ObjectID;
302
+ metricName: string;
303
+ value: number;
304
+ retentionDate: Date;
305
+ attributes: JSONObject;
306
+ }): JSONObject {
307
+ const ingestionDate: Date = OneUptimeDate.getCurrentDate();
308
+ const ingestionTimestamp: string =
309
+ OneUptimeDate.toClickhouseDateTime(ingestionDate);
310
+ const timeUnixNano: string =
311
+ OneUptimeDate.toUnixNano(ingestionDate).toString();
312
+
313
+ const attributes: JSONObject = { ...data.attributes };
314
+ const attributeKeys: Array<string> =
315
+ TelemetryUtil.getAttributeKeys(attributes);
316
+
317
+ return {
318
+ _id: ObjectID.generateTimeOrdered().toString(),
319
+ createdAt: ingestionTimestamp,
320
+ projectId: data.projectId.toString(),
321
+ primaryEntityId: data.networkDeviceId.toString(),
322
+ primaryEntityType: ServiceType.NetworkDevice,
323
+ name: data.metricName,
324
+ aggregationTemporality: null,
325
+ metricPointType: MetricPointType.Sum,
326
+ time: ingestionTimestamp,
327
+ startTime: null,
328
+ timeUnixNano: timeUnixNano,
329
+ startTimeUnixNano: null,
330
+ attributes: attributes,
331
+ attributeKeys: attributeKeys,
332
+ isMonotonic: null,
333
+ count: null,
334
+ sum: null,
335
+ min: null,
336
+ max: null,
337
+ bucketCounts: [],
338
+ explicitBounds: [],
339
+ value: data.value,
340
+ retentionDate: OneUptimeDate.toClickhouseDateTime(data.retentionDate),
341
+ } as JSONObject;
342
+ }
343
+ }
@@ -0,0 +1,251 @@
1
+ import Monitor from "../../../Models/DatabaseModels/Monitor";
2
+ import NetworkDevice from "../../../Models/DatabaseModels/NetworkDevice";
3
+ import MonitorService from "../../Services/MonitorService";
4
+ import NetworkDeviceService from "../../Services/NetworkDeviceService";
5
+ import MonitorResourceUtil from "./MonitorResource";
6
+ import NetworkDeviceMetricUtil from "./NetworkDeviceMetricUtil";
7
+ import NetworkInventoryUtil from "./NetworkInventoryUtil";
8
+ import SnmpInterfaceRateUtil from "./SnmpInterfaceRateUtil";
9
+ import LIMIT_MAX from "../../../Types/Database/LimitMax";
10
+ import MonitorStep from "../../../Types/Monitor/MonitorStep";
11
+ import MonitorType from "../../../Types/Monitor/MonitorType";
12
+ import SnmpMonitorResponse from "../../../Types/Monitor/SnmpMonitor/SnmpMonitorResponse";
13
+ import ProbeMonitorResponse from "../../../Types/Probe/ProbeMonitorResponse";
14
+ import { JSONObject } from "../../../Types/JSON";
15
+ import ObjectID from "../../../Types/ObjectID";
16
+ import OneUptimeDate from "../../../Types/Date";
17
+ import logger from "../Logger";
18
+
19
+ /*
20
+ * Server half of device-owned polling.
21
+ *
22
+ * The device's assigned probe walks every polling-enabled NetworkDevice on
23
+ * the device's own schedule and reports each walk here. This util then:
24
+ *
25
+ * 1. computes interface rates against the device's previous walk
26
+ * (NetworkDevice.lastWalkLog),
27
+ * 2. syncs the device/interface/endpoint inventory and lastSeenAt,
28
+ * 3. emits device-scoped metrics (so health charts work with zero
29
+ * monitors), and
30
+ * 4. fans the walk out to every Network Device monitor referencing the
31
+ * device — each gets an event-driven ProbeMonitorResponse evaluated
32
+ * through the ordinary criteria pipeline (incidents, alerts, status).
33
+ *
34
+ * Monitors are pure alerting config here: they never poll, and deleting
35
+ * every monitor leaves the device fully inventoried and charted.
36
+ */
37
+ export default class NetworkDeviceWalkUtil {
38
+ public static async processWalkResult(data: {
39
+ probeId: ObjectID;
40
+ networkDeviceId: ObjectID;
41
+ snmpResponse: SnmpMonitorResponse;
42
+ monitoredAt: Date;
43
+ }): Promise<void> {
44
+ /*
45
+ * Scope the lookup to the reporting probe (the auth middleware only
46
+ * proves the caller is SOME valid probe) — without this any probe that
47
+ * learned a foreign device id could overwrite another project's
48
+ * inventory or trigger its monitors.
49
+ */
50
+ const device: NetworkDevice | null = await NetworkDeviceService.findOneBy({
51
+ query: {
52
+ _id: data.networkDeviceId,
53
+ probeId: data.probeId,
54
+ },
55
+ select: {
56
+ _id: true,
57
+ projectId: true,
58
+ name: true,
59
+ siteId: true,
60
+ lastWalkLog: true,
61
+ },
62
+ props: {
63
+ isRoot: true,
64
+ },
65
+ });
66
+
67
+ if (!device || !device.id || !device.projectId) {
68
+ logger.warn(
69
+ `Device walk ignored: device ${data.networkDeviceId.toString()} is not assigned to probe ${data.probeId.toString()}.`,
70
+ );
71
+ return;
72
+ }
73
+
74
+ const isOnline: boolean | undefined = data.snmpResponse.isOnline;
75
+
76
+ /*
77
+ * Interface rates are counter deltas against the previous walk. Compute
78
+ * them on the FULL interface set, before inventory pruning, so muted
79
+ * ports still get fresh rates in the inventory table.
80
+ */
81
+ SnmpInterfaceRateUtil.attachInterfaceRates({
82
+ snmpResponse: data.snmpResponse,
83
+ previousWalkLog: device.lastWalkLog as JSONObject | undefined,
84
+ });
85
+
86
+ /*
87
+ * Persist this walk as the next delta baseline — but only when it
88
+ * actually walked interfaces. Keeping the last GOOD counters across
89
+ * failed polls means rates resume with a correct (longer-window) delta
90
+ * instead of losing a cycle.
91
+ */
92
+ if (
93
+ data.snmpResponse.interfaces &&
94
+ data.snmpResponse.interfaces.length > 0
95
+ ) {
96
+ await NetworkDeviceService.updateOneById({
97
+ id: device.id,
98
+ data: {
99
+ lastWalkLog: {
100
+ snmpResponse: JSON.parse(JSON.stringify(data.snmpResponse)),
101
+ monitoredAt: OneUptimeDate.getCurrentDate(),
102
+ },
103
+ } as any,
104
+ props: {
105
+ isRoot: true,
106
+ },
107
+ });
108
+ }
109
+
110
+ /*
111
+ * Inventory sync also prunes data.snmpResponse.interfaces down to
112
+ * monitored ports, so the metrics and criteria below only see ports the
113
+ * user cares about.
114
+ */
115
+ await NetworkInventoryUtil.updateFromWalk({
116
+ projectId: device.projectId,
117
+ deviceId: device.id,
118
+ snmpResponse: data.snmpResponse,
119
+ isOnline: isOnline,
120
+ });
121
+
122
+ try {
123
+ await NetworkDeviceMetricUtil.saveWalkMetrics({
124
+ projectId: device.projectId,
125
+ networkDeviceId: device.id,
126
+ deviceName: device.name,
127
+ probeId: data.probeId,
128
+ snmpResponse: data.snmpResponse,
129
+ responseTimeInMs: data.snmpResponse.responseTimeInMs,
130
+ isOnline: isOnline,
131
+ });
132
+ } catch (err) {
133
+ // Metrics must never fail the walk pipeline.
134
+ logger.error(
135
+ `Failed to save device metrics for ${device.id.toString()}:`,
136
+ );
137
+ logger.error(err);
138
+ }
139
+
140
+ // --- Fan out to the monitors alerting on this device ---
141
+ const monitors: Array<Monitor> =
142
+ await NetworkDeviceWalkUtil.findMonitorsWatchingDevices({
143
+ projectId: device.projectId,
144
+ deviceIds: [device.id.toString()],
145
+ });
146
+
147
+ for (const monitor of monitors) {
148
+ if (
149
+ monitor.disableActiveMonitoring ||
150
+ monitor.disableActiveMonitoringBecauseOfManualIncident ||
151
+ monitor.disableActiveMonitoringBecauseOfScheduledMaintenanceEvent
152
+ ) {
153
+ continue;
154
+ }
155
+
156
+ if (!monitor.id || !monitor.projectId) {
157
+ continue;
158
+ }
159
+
160
+ for (const monitorStep of monitor.monitorSteps?.data
161
+ ?.monitorStepsInstanceArray || []) {
162
+ const referencedDeviceId: string | undefined =
163
+ monitorStep.data?.networkDeviceMonitor?.networkDeviceId;
164
+
165
+ if (
166
+ !referencedDeviceId ||
167
+ referencedDeviceId !== device.id.toString()
168
+ ) {
169
+ continue;
170
+ }
171
+
172
+ const walkResponse: ProbeMonitorResponse = {
173
+ projectId: monitor.projectId,
174
+ monitorId: monitor.id,
175
+ monitorStepId: monitorStep.id,
176
+ probeId: data.probeId,
177
+ snmpResponse: data.snmpResponse,
178
+ isOnline: isOnline,
179
+ responseTimeInMs: data.snmpResponse.responseTimeInMs,
180
+ isTimeout: data.snmpResponse.isTimeout,
181
+ failureCause: data.snmpResponse.failureCause || "",
182
+ monitoredAt: data.monitoredAt,
183
+ ingestedAt: OneUptimeDate.getCurrentDate(),
184
+ };
185
+
186
+ try {
187
+ await MonitorResourceUtil.monitorResource(walkResponse);
188
+ } catch (err) {
189
+ logger.error(
190
+ `Error evaluating device walk for monitor ${monitor.id.toString()}:`,
191
+ );
192
+ logger.error(err);
193
+ }
194
+ }
195
+ }
196
+
197
+ logger.debug(
198
+ `Device walk for ${device.id.toString()} processed: evaluated ${monitors.length} watching monitor(s).`,
199
+ );
200
+ }
201
+
202
+ /*
203
+ * Every enabled Network Device monitor in the project whose steps
204
+ * reference one of the given devices. Shared by the walk fan-out above
205
+ * and the SNMP trap fan-out — the monitor↔device link lives in step JSON,
206
+ * so this fetches the project's Network Device monitors and filters
207
+ * server-side.
208
+ */
209
+ public static async findMonitorsWatchingDevices(data: {
210
+ projectId: ObjectID;
211
+ deviceIds: Array<string>;
212
+ }): Promise<Array<Monitor>> {
213
+ if (data.deviceIds.length === 0) {
214
+ return [];
215
+ }
216
+
217
+ const deviceIdSet: Set<string> = new Set(data.deviceIds);
218
+
219
+ const monitors: Array<Monitor> = await MonitorService.findBy({
220
+ query: {
221
+ projectId: data.projectId,
222
+ monitorType: MonitorType.NetworkDevice,
223
+ },
224
+ select: {
225
+ _id: true,
226
+ projectId: true,
227
+ monitorSteps: true,
228
+ disableActiveMonitoring: true,
229
+ disableActiveMonitoringBecauseOfManualIncident: true,
230
+ disableActiveMonitoringBecauseOfScheduledMaintenanceEvent: true,
231
+ },
232
+ limit: LIMIT_MAX,
233
+ skip: 0,
234
+ props: {
235
+ isRoot: true,
236
+ },
237
+ });
238
+
239
+ return monitors.filter((monitor: Monitor) => {
240
+ return (monitor.monitorSteps?.data?.monitorStepsInstanceArray || []).some(
241
+ (monitorStep: MonitorStep) => {
242
+ const referencedDeviceId: string | undefined =
243
+ monitorStep.data?.networkDeviceMonitor?.networkDeviceId;
244
+ return Boolean(
245
+ referencedDeviceId && deviceIdSet.has(referencedDeviceId),
246
+ );
247
+ },
248
+ );
249
+ });
250
+ }
251
+ }