@oneuptime/common 11.4.0 → 11.5.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 (473) hide show
  1. package/Models/DatabaseModels/AIRun.ts +50 -0
  2. package/Models/DatabaseModels/AlertSeverity.ts +6 -0
  3. package/Models/DatabaseModels/IncidentSeverity.ts +6 -0
  4. package/Models/DatabaseModels/Index.ts +16 -0
  5. package/Models/DatabaseModels/IoTDeviceCredential.ts +471 -0
  6. package/Models/DatabaseModels/LlmLog.ts +56 -0
  7. package/Models/DatabaseModels/LlmProvider.ts +33 -0
  8. package/Models/DatabaseModels/NetworkDevice.ts +1385 -0
  9. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +717 -0
  10. package/Models/DatabaseModels/NetworkDeviceLabelRule.ts +514 -0
  11. package/Models/DatabaseModels/NetworkDeviceOwnerRule.ts +596 -0
  12. package/Models/DatabaseModels/NetworkDeviceOwnerTeam.ts +487 -0
  13. package/Models/DatabaseModels/NetworkDeviceOwnerUser.ts +486 -0
  14. package/Models/DatabaseModels/NetworkInterface.ts +563 -0
  15. package/Models/DatabaseModels/Project.ts +145 -0
  16. package/Models/DatabaseModels/TelemetryEntityRelationship.ts +54 -0
  17. package/Server/API/AIAgentTaskAPI.ts +10 -24
  18. package/Server/API/AIInvestigationAPI.ts +131 -63
  19. package/Server/API/AlertAPI.ts +5 -0
  20. package/Server/API/IncidentAPI.ts +10 -0
  21. package/Server/API/IncidentEpisodeAPI.ts +5 -0
  22. package/Server/API/LlmProviderAPI.ts +4 -0
  23. package/Server/API/ScheduledMaintenanceAPI.ts +5 -0
  24. package/Server/API/TelemetryAPI.ts +4 -3
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/1783650000000-AddAdditionalParamsToLlmProvider.ts +19 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1783695782697-AddCacheTokenColumnsToLlmLog.ts +25 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1783701585317-AddAlertInvestigationGating.ts +31 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1783702431535-AddAiDailyAutonomousTokenLimitToProject.ts +19 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1783720000000-AddNetworkDeviceTables.ts +105 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1783721121260-AddAttemptCountToAIRun.ts +15 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1783730000000-AddNetworkDeviceOwnersAndRules.ts +192 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/1783740000000-AddNetworkDeviceDiscoveryScan.ts +37 -0
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/1783750000000-AddLldpNeighborsToNetworkDevice.ts +19 -0
  34. package/Server/Infrastructure/Postgres/SchemaMigrations/1783760576655-AddInvestigationTuningToProject.ts +25 -0
  35. package/Server/Infrastructure/Postgres/SchemaMigrations/1783762505482-AddTelemetryEntityRelationshipMetrics.ts +31 -0
  36. package/Server/Infrastructure/Postgres/SchemaMigrations/1783780000000-AddIoTDeviceCredentialTable.ts +79 -0
  37. package/Server/Infrastructure/Postgres/SchemaMigrations/1783790000000-AddSnmpV3AuthColumnsToNetworkDevice.ts +49 -0
  38. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +24 -0
  39. package/Server/Services/AIAgentTaskService.ts +62 -0
  40. package/Server/Services/AIRunService.ts +58 -0
  41. package/Server/Services/AIService.ts +101 -0
  42. package/Server/Services/AnalyticsDatabaseService.ts +27 -0
  43. package/Server/Services/IncidentService.ts +14 -41
  44. package/Server/Services/Index.ts +14 -0
  45. package/Server/Services/IoTDeviceCredentialService.ts +351 -0
  46. package/Server/Services/IoTDeviceService.ts +64 -21
  47. package/Server/Services/LlmLogService.ts +26 -0
  48. package/Server/Services/LlmProviderService.ts +3 -0
  49. package/Server/Services/LogAggregationService.ts +29 -11
  50. package/Server/Services/MetricService.ts +603 -13
  51. package/Server/Services/MonitorService.ts +4 -1
  52. package/Server/Services/NetworkDeviceDiscoveryScanService.ts +10 -0
  53. package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +204 -0
  54. package/Server/Services/NetworkDeviceLabelRuleService.ts +14 -0
  55. package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +222 -0
  56. package/Server/Services/NetworkDeviceOwnerRuleService.ts +14 -0
  57. package/Server/Services/NetworkDeviceOwnerTeamService.ts +10 -0
  58. package/Server/Services/NetworkDeviceOwnerUserService.ts +10 -0
  59. package/Server/Services/NetworkDeviceService.ts +50 -0
  60. package/Server/Services/NetworkInterfaceService.ts +10 -0
  61. package/Server/Services/TelemetryEntityRelationshipService.ts +23 -0
  62. package/Server/Services/TelemetryEntityService.ts +72 -2
  63. package/Server/Utils/AI/Sentinel/AlertInvestigationRunner.ts +244 -12
  64. package/Server/Utils/AI/Sentinel/IncidentInvestigationRunner.ts +92 -19
  65. package/Server/Utils/AI/Sentinel/InvestigationQueue.ts +493 -0
  66. package/Server/Utils/AI/Sentinel/README.md +10 -0
  67. package/Server/Utils/AI/Sentinel/SentinelInvestigationEngine.ts +88 -68
  68. package/Server/Utils/AI/Toolbox/Index.ts +2 -1
  69. package/Server/Utils/AI/Toolbox/MetricTools.ts +391 -0
  70. package/Server/Utils/LLM/LLMService.ts +21 -0
  71. package/Server/Utils/Monitor/Criteria/APIRequestCriteria.ts +44 -0
  72. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +170 -2
  73. package/Server/Utils/Monitor/IoTDeviceAbsenceSeries.ts +101 -0
  74. package/Server/Utils/Monitor/MonitorAlert.ts +15 -3
  75. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +1 -1
  76. package/Server/Utils/Monitor/MonitorIncident.ts +19 -3
  77. package/Server/Utils/Monitor/MonitorMetricUtil.ts +195 -2
  78. package/Server/Utils/Monitor/MonitorResource.ts +77 -21
  79. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +1 -1
  80. package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +201 -0
  81. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +215 -0
  82. package/Server/Utils/Monitor/SnmpInterfaceRateUtil.ts +169 -0
  83. package/Tests/Server/Services/AIAgentTaskServiceClaim.test.ts +146 -0
  84. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +173 -0
  85. package/Tests/Server/Services/IncidentInternalNoteAnnouncement.test.ts +97 -0
  86. package/Tests/Server/Services/IoTDeviceService.test.ts +54 -0
  87. package/Tests/Server/Services/LogAggregationService.test.ts +22 -0
  88. package/Tests/Server/Services/MetricServiceAggregate.test.ts +194 -0
  89. package/Tests/Server/Utils/AI/BaselineAnomalyTool.test.ts +253 -0
  90. package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +44 -0
  91. package/Tests/Server/Utils/AI/SentinelAlertGating.test.ts +360 -0
  92. package/Tests/Server/Utils/AI/SentinelInvestigationQueue.test.ts +295 -0
  93. package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +59 -0
  94. package/Tests/Server/Utils/Monitor/IoTDeviceAbsenceSeries.test.ts +113 -0
  95. package/Tests/Server/Utils/Monitor/PerSeriesRecoveryResolution.test.ts +198 -0
  96. package/Tests/Types/AI/AIAgentTaskStatus.test.ts +86 -0
  97. package/Tests/Types/BaseDatabase/AggregationIntervalUtil.test.ts +127 -0
  98. package/Tests/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.test.ts +152 -0
  99. package/Tests/Types/Monitor/MonitorType.test.ts +1 -1
  100. package/Tests/Types/Trace/TraceRecordingRuleDefinition.test.ts +308 -0
  101. package/Tests/UI/Components/Dropdown.test.tsx +17 -0
  102. package/Tests/UI/Components/EntityDropdown.test.tsx +130 -0
  103. package/Tests/UI/Components/Modal.test.tsx +144 -2
  104. package/Tests/UI/Components/TelemetrySearchBar.test.tsx +90 -0
  105. package/Tests/UI/Utils/Theme.test.ts +161 -0
  106. package/Tests/Utils/Monitor/LatencyMatrixUtil.test.ts +111 -0
  107. package/Types/AI/AIRunStatus.ts +9 -0
  108. package/Types/BaseDatabase/AggregateBy.ts +12 -0
  109. package/Types/Dashboard/DashboardComponentType.ts +1 -0
  110. package/Types/Dashboard/DashboardComponents/DashboardLogChartComponent.ts +24 -0
  111. package/Types/Dashboard/DashboardTemplates.ts +9 -1
  112. package/Types/LlmLogStatus.ts +1 -0
  113. package/Types/Monitor/CriteriaFilter.ts +9 -0
  114. package/Types/Monitor/HttpPhaseTimings.ts +16 -0
  115. package/Types/Monitor/IotAlertTemplates.ts +22 -3
  116. package/Types/Monitor/LatencyMatrix.ts +27 -0
  117. package/Types/Monitor/MonitorCriteriaInstance.ts +2 -2
  118. package/Types/Monitor/MonitorMetricType.ts +27 -0
  119. package/Types/Monitor/MonitorStep.ts +36 -11
  120. package/Types/Monitor/MonitorStepNetworkDeviceMonitor.ts +55 -0
  121. package/Types/Monitor/MonitorStepSnmpMonitor.ts +8 -0
  122. package/Types/Monitor/MonitorType.ts +14 -9
  123. package/Types/Monitor/PingMonitor/PingMonitorResponse.ts +20 -0
  124. package/Types/Monitor/SnmpMonitor/LldpNeighbor.ts +12 -0
  125. package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +116 -0
  126. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +29 -0
  127. package/Types/Monitor/SnmpMonitor/SnmpInterface.ts +31 -0
  128. package/Types/Monitor/SnmpMonitor/SnmpMonitorResponse.ts +24 -0
  129. package/Types/Monitor/SnmpMonitor/SnmpTrap.ts +20 -0
  130. package/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.ts +173 -0
  131. package/Types/Permission.ts +314 -0
  132. package/Types/Probe/ProbeMonitorResponse.ts +22 -0
  133. package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +8 -5
  134. package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +4 -1
  135. package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +6 -3
  136. package/UI/Components/CodeBlock/CodeBlock.tsx +2 -1
  137. package/UI/Components/CodeEditor/CodeEditor.tsx +3 -0
  138. package/UI/Components/Divider/Divider.tsx +1 -1
  139. package/UI/Components/Dropdown/Dropdown.tsx +13 -4
  140. package/UI/Components/EntityDropdown/EntityDropdown.tsx +110 -2
  141. package/UI/Components/ErrorBoundary.tsx +2 -1
  142. package/UI/Components/EventItem/EventItem.tsx +2 -2
  143. package/UI/Components/GanttChart/Bar/Index.tsx +1 -1
  144. package/UI/Components/Graphs/UptimeBarTooltip.tsx +30 -23
  145. package/UI/Components/Header/Header.tsx +7 -0
  146. package/UI/Components/Header/HeaderIconDropdownButton.tsx +2 -0
  147. package/UI/Components/Icon/Icon.tsx +8 -6
  148. package/UI/Components/Label/Label.tsx +2 -2
  149. package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +22 -10
  150. package/UI/Components/LogsViewer/components/LogsHistogram.tsx +9 -3
  151. package/UI/Components/Markdown.tsx/MarkdownEditor.tsx +8 -8
  152. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +44 -20
  153. package/UI/Components/Modal/ConfirmModal.tsx +1 -1
  154. package/UI/Components/Modal/Modal.tsx +213 -121
  155. package/UI/Components/Modal/ModalFooter.tsx +33 -22
  156. package/UI/Components/ModelTable/TableView.tsx +1 -1
  157. package/UI/Components/MonitorGraphs/UptimeBarDayModal.tsx +20 -12
  158. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +2 -2
  159. package/UI/Components/Pill/Pill.tsx +21 -13
  160. package/UI/Components/StatusBubble/StatusBubble.tsx +3 -3
  161. package/UI/Components/Tabs/Tabs.tsx +10 -1
  162. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +7 -1
  163. package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +9 -3
  164. package/UI/Components/TelemetryViewer/components/TelemetrySearchBar.tsx +62 -4
  165. package/UI/Components/Workflow/Component.tsx +53 -33
  166. package/UI/Components/Workflow/ComponentPortViewer.tsx +6 -6
  167. package/UI/Components/Workflow/ComponentReturnValueViewer.tsx +8 -8
  168. package/UI/Components/Workflow/ComponentsModal.tsx +16 -9
  169. package/UI/Components/Workflow/Workflow.tsx +13 -11
  170. package/UI/Utils/Navigation.ts +10 -1
  171. package/UI/Utils/Theme.ts +140 -0
  172. package/Utils/Dashboard/Components/DashboardLogChartComponent.ts +99 -0
  173. package/Utils/Dashboard/Components/Index.ts +7 -0
  174. package/Utils/Monitor/LatencyMatrixUtil.ts +162 -0
  175. package/Utils/Monitor/MonitorMetricType.ts +141 -3
  176. package/Utils/Monitor/NetworkTopologyUtil.ts +159 -0
  177. package/Utils/Telemetry/EntityRelationship.ts +11 -0
  178. package/build/dist/Models/DatabaseModels/AIRun.js +52 -0
  179. package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
  180. package/build/dist/Models/DatabaseModels/AlertSeverity.js +6 -0
  181. package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
  182. package/build/dist/Models/DatabaseModels/IncidentSeverity.js +6 -0
  183. package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
  184. package/build/dist/Models/DatabaseModels/Index.js +16 -0
  185. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  186. package/build/dist/Models/DatabaseModels/IoTDeviceCredential.js +493 -0
  187. package/build/dist/Models/DatabaseModels/IoTDeviceCredential.js.map +1 -0
  188. package/build/dist/Models/DatabaseModels/LlmLog.js +58 -0
  189. package/build/dist/Models/DatabaseModels/LlmLog.js.map +1 -1
  190. package/build/dist/Models/DatabaseModels/LlmProvider.js +33 -0
  191. package/build/dist/Models/DatabaseModels/LlmProvider.js.map +1 -1
  192. package/build/dist/Models/DatabaseModels/NetworkDevice.js +1426 -0
  193. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -0
  194. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +738 -0
  195. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -0
  196. package/build/dist/Models/DatabaseModels/NetworkDeviceLabelRule.js +522 -0
  197. package/build/dist/Models/DatabaseModels/NetworkDeviceLabelRule.js.map +1 -0
  198. package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerRule.js +603 -0
  199. package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerRule.js.map +1 -0
  200. package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerTeam.js +503 -0
  201. package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerTeam.js.map +1 -0
  202. package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerUser.js +502 -0
  203. package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerUser.js.map +1 -0
  204. package/build/dist/Models/DatabaseModels/NetworkInterface.js +589 -0
  205. package/build/dist/Models/DatabaseModels/NetworkInterface.js.map +1 -0
  206. package/build/dist/Models/DatabaseModels/Project.js +147 -0
  207. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  208. package/build/dist/Models/DatabaseModels/TelemetryEntityRelationship.js +57 -0
  209. package/build/dist/Models/DatabaseModels/TelemetryEntityRelationship.js.map +1 -1
  210. package/build/dist/Server/API/AIAgentTaskAPI.js +8 -23
  211. package/build/dist/Server/API/AIAgentTaskAPI.js.map +1 -1
  212. package/build/dist/Server/API/AIInvestigationAPI.js +95 -55
  213. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  214. package/build/dist/Server/API/AlertAPI.js +5 -0
  215. package/build/dist/Server/API/AlertAPI.js.map +1 -1
  216. package/build/dist/Server/API/IncidentAPI.js +10 -0
  217. package/build/dist/Server/API/IncidentAPI.js.map +1 -1
  218. package/build/dist/Server/API/IncidentEpisodeAPI.js +5 -0
  219. package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
  220. package/build/dist/Server/API/LlmProviderAPI.js +5 -7
  221. package/build/dist/Server/API/LlmProviderAPI.js.map +1 -1
  222. package/build/dist/Server/API/ScheduledMaintenanceAPI.js +5 -0
  223. package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
  224. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  225. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783650000000-AddAdditionalParamsToLlmProvider.js +12 -0
  226. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783650000000-AddAdditionalParamsToLlmProvider.js.map +1 -0
  227. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783695782697-AddCacheTokenColumnsToLlmLog.js +14 -0
  228. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783695782697-AddCacheTokenColumnsToLlmLog.js.map +1 -0
  229. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783701585317-AddAlertInvestigationGating.js +18 -0
  230. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783701585317-AddAlertInvestigationGating.js.map +1 -0
  231. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783702431535-AddAiDailyAutonomousTokenLimitToProject.js +12 -0
  232. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783702431535-AddAiDailyAutonomousTokenLimitToProject.js.map +1 -0
  233. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783720000000-AddNetworkDeviceTables.js +51 -0
  234. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783720000000-AddNetworkDeviceTables.js.map +1 -0
  235. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783721121260-AddAttemptCountToAIRun.js +12 -0
  236. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783721121260-AddAttemptCountToAIRun.js.map +1 -0
  237. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783730000000-AddNetworkDeviceOwnersAndRules.js +101 -0
  238. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783730000000-AddNetworkDeviceOwnersAndRules.js.map +1 -0
  239. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783740000000-AddNetworkDeviceDiscoveryScan.js +18 -0
  240. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783740000000-AddNetworkDeviceDiscoveryScan.js.map +1 -0
  241. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783750000000-AddLldpNeighborsToNetworkDevice.js +12 -0
  242. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783750000000-AddLldpNeighborsToNetworkDevice.js.map +1 -0
  243. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783760576655-AddInvestigationTuningToProject.js +14 -0
  244. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783760576655-AddInvestigationTuningToProject.js.map +1 -0
  245. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783762505482-AddTelemetryEntityRelationshipMetrics.js +16 -0
  246. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783762505482-AddTelemetryEntityRelationshipMetrics.js.map +1 -0
  247. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783780000000-AddIoTDeviceCredentialTable.js +38 -0
  248. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783780000000-AddIoTDeviceCredentialTable.js.map +1 -0
  249. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783790000000-AddSnmpV3AuthColumnsToNetworkDevice.js +22 -0
  250. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1783790000000-AddSnmpV3AuthColumnsToNetworkDevice.js.map +1 -0
  251. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +24 -0
  252. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  253. package/build/dist/Server/Services/AIAgentTaskService.js +59 -0
  254. package/build/dist/Server/Services/AIAgentTaskService.js.map +1 -1
  255. package/build/dist/Server/Services/AIRunService.js +33 -0
  256. package/build/dist/Server/Services/AIRunService.js.map +1 -1
  257. package/build/dist/Server/Services/AIService.js +82 -9
  258. package/build/dist/Server/Services/AIService.js.map +1 -1
  259. package/build/dist/Server/Services/AnalyticsDatabaseService.js +19 -0
  260. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  261. package/build/dist/Server/Services/IncidentService.js +14 -25
  262. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  263. package/build/dist/Server/Services/Index.js +14 -0
  264. package/build/dist/Server/Services/Index.js.map +1 -1
  265. package/build/dist/Server/Services/IoTDeviceCredentialService.js +321 -0
  266. package/build/dist/Server/Services/IoTDeviceCredentialService.js.map +1 -0
  267. package/build/dist/Server/Services/IoTDeviceService.js +49 -15
  268. package/build/dist/Server/Services/IoTDeviceService.js.map +1 -1
  269. package/build/dist/Server/Services/LlmLogService.js +29 -0
  270. package/build/dist/Server/Services/LlmLogService.js.map +1 -1
  271. package/build/dist/Server/Services/LlmProviderService.js +3 -0
  272. package/build/dist/Server/Services/LlmProviderService.js.map +1 -1
  273. package/build/dist/Server/Services/LogAggregationService.js +21 -7
  274. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  275. package/build/dist/Server/Services/MetricService.js +449 -7
  276. package/build/dist/Server/Services/MetricService.js.map +1 -1
  277. package/build/dist/Server/Services/MonitorService.js +2 -1
  278. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  279. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +9 -0
  280. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -0
  281. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +166 -0
  282. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -0
  283. package/build/dist/Server/Services/NetworkDeviceLabelRuleService.js +13 -0
  284. package/build/dist/Server/Services/NetworkDeviceLabelRuleService.js.map +1 -0
  285. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +186 -0
  286. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -0
  287. package/build/dist/Server/Services/NetworkDeviceOwnerRuleService.js +13 -0
  288. package/build/dist/Server/Services/NetworkDeviceOwnerRuleService.js.map +1 -0
  289. package/build/dist/Server/Services/NetworkDeviceOwnerTeamService.js +9 -0
  290. package/build/dist/Server/Services/NetworkDeviceOwnerTeamService.js.map +1 -0
  291. package/build/dist/Server/Services/NetworkDeviceOwnerUserService.js +9 -0
  292. package/build/dist/Server/Services/NetworkDeviceOwnerUserService.js.map +1 -0
  293. package/build/dist/Server/Services/NetworkDeviceService.js +52 -0
  294. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -0
  295. package/build/dist/Server/Services/NetworkInterfaceService.js +9 -0
  296. package/build/dist/Server/Services/NetworkInterfaceService.js.map +1 -0
  297. package/build/dist/Server/Services/TelemetryEntityRelationshipService.js +22 -0
  298. package/build/dist/Server/Services/TelemetryEntityRelationshipService.js.map +1 -1
  299. package/build/dist/Server/Services/TelemetryEntityService.js +64 -2
  300. package/build/dist/Server/Services/TelemetryEntityService.js.map +1 -1
  301. package/build/dist/Server/Utils/AI/Sentinel/AlertInvestigationRunner.js +189 -9
  302. package/build/dist/Server/Utils/AI/Sentinel/AlertInvestigationRunner.js.map +1 -1
  303. package/build/dist/Server/Utils/AI/Sentinel/IncidentInvestigationRunner.js +84 -17
  304. package/build/dist/Server/Utils/AI/Sentinel/IncidentInvestigationRunner.js.map +1 -1
  305. package/build/dist/Server/Utils/AI/Sentinel/InvestigationQueue.js +428 -0
  306. package/build/dist/Server/Utils/AI/Sentinel/InvestigationQueue.js.map +1 -0
  307. package/build/dist/Server/Utils/AI/Sentinel/SentinelInvestigationEngine.js +63 -47
  308. package/build/dist/Server/Utils/AI/Sentinel/SentinelInvestigationEngine.js.map +1 -1
  309. package/build/dist/Server/Utils/AI/Toolbox/Index.js +2 -1
  310. package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
  311. package/build/dist/Server/Utils/AI/Toolbox/MetricTools.js +300 -0
  312. package/build/dist/Server/Utils/AI/Toolbox/MetricTools.js.map +1 -1
  313. package/build/dist/Server/Utils/LLM/LLMService.js +16 -0
  314. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  315. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js +29 -0
  316. package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js.map +1 -1
  317. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +130 -2
  318. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  319. package/build/dist/Server/Utils/Monitor/IoTDeviceAbsenceSeries.js +81 -0
  320. package/build/dist/Server/Utils/Monitor/IoTDeviceAbsenceSeries.js.map +1 -0
  321. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +18 -7
  322. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  323. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +1 -1
  324. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  325. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +25 -10
  326. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  327. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +155 -5
  328. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  329. package/build/dist/Server/Utils/Monitor/MonitorResource.js +76 -30
  330. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  331. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +1 -1
  332. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  333. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +147 -0
  334. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -0
  335. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +167 -0
  336. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -0
  337. package/build/dist/Server/Utils/Monitor/SnmpInterfaceRateUtil.js +93 -0
  338. package/build/dist/Server/Utils/Monitor/SnmpInterfaceRateUtil.js.map +1 -0
  339. package/build/dist/Types/AI/AIRunStatus.js +9 -0
  340. package/build/dist/Types/AI/AIRunStatus.js.map +1 -1
  341. package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
  342. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  343. package/build/dist/Types/Dashboard/DashboardComponents/DashboardLogChartComponent.js +2 -0
  344. package/build/dist/Types/Dashboard/DashboardComponents/DashboardLogChartComponent.js.map +1 -0
  345. package/build/dist/Types/Dashboard/DashboardTemplates.js +9 -1
  346. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  347. package/build/dist/Types/LlmLogStatus.js +1 -0
  348. package/build/dist/Types/LlmLogStatus.js.map +1 -1
  349. package/build/dist/Types/Monitor/CriteriaFilter.js +9 -0
  350. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  351. package/build/dist/Types/Monitor/HttpPhaseTimings.js +2 -0
  352. package/build/dist/Types/Monitor/HttpPhaseTimings.js.map +1 -0
  353. package/build/dist/Types/Monitor/IotAlertTemplates.js +7 -7
  354. package/build/dist/Types/Monitor/IotAlertTemplates.js.map +1 -1
  355. package/build/dist/Types/Monitor/LatencyMatrix.js +2 -0
  356. package/build/dist/Types/Monitor/LatencyMatrix.js.map +1 -0
  357. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +2 -2
  358. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  359. package/build/dist/Types/Monitor/MonitorMetricType.js +24 -0
  360. package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
  361. package/build/dist/Types/Monitor/MonitorStep.js +22 -9
  362. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  363. package/build/dist/Types/Monitor/MonitorStepNetworkDeviceMonitor.js +36 -0
  364. package/build/dist/Types/Monitor/MonitorStepNetworkDeviceMonitor.js.map +1 -0
  365. package/build/dist/Types/Monitor/MonitorStepSnmpMonitor.js +3 -0
  366. package/build/dist/Types/Monitor/MonitorStepSnmpMonitor.js.map +1 -1
  367. package/build/dist/Types/Monitor/MonitorType.js +14 -9
  368. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  369. package/build/dist/Types/Monitor/PingMonitor/PingMonitorResponse.js +2 -0
  370. package/build/dist/Types/Monitor/PingMonitor/PingMonitorResponse.js.map +1 -0
  371. package/build/dist/Types/Monitor/SnmpMonitor/LldpNeighbor.js +2 -0
  372. package/build/dist/Types/Monitor/SnmpMonitor/LldpNeighbor.js.map +1 -0
  373. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +89 -0
  374. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -0
  375. package/build/dist/Types/Monitor/SnmpMonitor/NetworkTopology.js +2 -0
  376. package/build/dist/Types/Monitor/SnmpMonitor/NetworkTopology.js.map +1 -0
  377. package/build/dist/Types/Monitor/SnmpMonitor/SnmpInterface.js +2 -0
  378. package/build/dist/Types/Monitor/SnmpMonitor/SnmpInterface.js.map +1 -0
  379. package/build/dist/Types/Monitor/SnmpMonitor/SnmpTrap.js +2 -0
  380. package/build/dist/Types/Monitor/SnmpMonitor/SnmpTrap.js.map +1 -0
  381. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js +137 -0
  382. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js.map +1 -0
  383. package/build/dist/Types/Permission.js +280 -0
  384. package/build/dist/Types/Permission.js.map +1 -1
  385. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +7 -4
  386. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
  387. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +4 -1
  388. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
  389. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +6 -3
  390. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
  391. package/build/dist/UI/Components/CodeBlock/CodeBlock.js +1 -1
  392. package/build/dist/UI/Components/CodeBlock/CodeBlock.js.map +1 -1
  393. package/build/dist/UI/Components/CodeEditor/CodeEditor.js +3 -1
  394. package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
  395. package/build/dist/UI/Components/Divider/Divider.js +1 -1
  396. package/build/dist/UI/Components/Divider/Divider.js.map +1 -1
  397. package/build/dist/UI/Components/Dropdown/Dropdown.js +10 -4
  398. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  399. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +76 -3
  400. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -1
  401. package/build/dist/UI/Components/ErrorBoundary.js +2 -1
  402. package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
  403. package/build/dist/UI/Components/EventItem/EventItem.js +2 -2
  404. package/build/dist/UI/Components/EventItem/EventItem.js.map +1 -1
  405. package/build/dist/UI/Components/GanttChart/Bar/Index.js +1 -1
  406. package/build/dist/UI/Components/GanttChart/Bar/Index.js.map +1 -1
  407. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js +29 -23
  408. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js.map +1 -1
  409. package/build/dist/UI/Components/Header/Header.js +1 -0
  410. package/build/dist/UI/Components/Header/Header.js.map +1 -1
  411. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -1
  412. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
  413. package/build/dist/UI/Components/Icon/Icon.js +8 -6
  414. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  415. package/build/dist/UI/Components/Label/Label.js +2 -2
  416. package/build/dist/UI/Components/Label/Label.js.map +1 -1
  417. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +20 -8
  418. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
  419. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js +8 -2
  420. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js.map +1 -1
  421. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js +8 -8
  422. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +40 -20
  423. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  424. package/build/dist/UI/Components/Modal/ConfirmModal.js +1 -1
  425. package/build/dist/UI/Components/Modal/ConfirmModal.js.map +1 -1
  426. package/build/dist/UI/Components/Modal/Modal.js +109 -51
  427. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  428. package/build/dist/UI/Components/Modal/ModalFooter.js +13 -10
  429. package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
  430. package/build/dist/UI/Components/ModelTable/TableView.js +1 -1
  431. package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
  432. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js +17 -12
  433. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js.map +1 -1
  434. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +2 -2
  435. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  436. package/build/dist/UI/Components/Pill/Pill.js +12 -13
  437. package/build/dist/UI/Components/Pill/Pill.js.map +1 -1
  438. package/build/dist/UI/Components/StatusBubble/StatusBubble.js +3 -3
  439. package/build/dist/UI/Components/StatusBubble/StatusBubble.js.map +1 -1
  440. package/build/dist/UI/Components/Tabs/Tabs.js +3 -1
  441. package/build/dist/UI/Components/Tabs/Tabs.js.map +1 -1
  442. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +1 -1
  443. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  444. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +8 -2
  445. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
  446. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js +36 -6
  447. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js.map +1 -1
  448. package/build/dist/UI/Components/Workflow/Component.js +43 -33
  449. package/build/dist/UI/Components/Workflow/Component.js.map +1 -1
  450. package/build/dist/UI/Components/Workflow/ComponentPortViewer.js +6 -6
  451. package/build/dist/UI/Components/Workflow/ComponentPortViewer.js.map +1 -1
  452. package/build/dist/UI/Components/Workflow/ComponentReturnValueViewer.js +8 -8
  453. package/build/dist/UI/Components/Workflow/ComponentReturnValueViewer.js.map +1 -1
  454. package/build/dist/UI/Components/Workflow/ComponentsModal.js +15 -9
  455. package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
  456. package/build/dist/UI/Components/Workflow/Workflow.js +13 -11
  457. package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
  458. package/build/dist/UI/Utils/Navigation.js +11 -1
  459. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  460. package/build/dist/UI/Utils/Theme.js +106 -0
  461. package/build/dist/UI/Utils/Theme.js.map +1 -0
  462. package/build/dist/Utils/Dashboard/Components/DashboardLogChartComponent.js +89 -0
  463. package/build/dist/Utils/Dashboard/Components/DashboardLogChartComponent.js.map +1 -0
  464. package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
  465. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  466. package/build/dist/Utils/Monitor/LatencyMatrixUtil.js +89 -0
  467. package/build/dist/Utils/Monitor/LatencyMatrixUtil.js.map +1 -0
  468. package/build/dist/Utils/Monitor/MonitorMetricType.js +138 -4
  469. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  470. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +112 -0
  471. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -0
  472. package/build/dist/Utils/Telemetry/EntityRelationship.js.map +1 -1
  473. package/package.json +1 -1
@@ -5,10 +5,13 @@ import logger from "../Logger";
5
5
  import MonitorCriteriaEvaluator from "./MonitorCriteriaEvaluator";
6
6
  import MonitorLogUtil from "./MonitorLogUtil";
7
7
  import MonitorMetricUtil from "./MonitorMetricUtil";
8
+ import NetworkInventoryUtil from "./NetworkInventoryUtil";
9
+ import SnmpInterfaceRateUtil from "./SnmpInterfaceRateUtil";
8
10
  import DataToProcess from "./DataToProcess";
9
11
  import SortOrder from "../../../Types/BaseDatabase/SortOrder";
10
12
  import Dictionary from "../../../Types/Dictionary";
11
13
  import BadDataException from "../../../Types/Exception/BadDataException";
14
+ import { JSONObject } from "../../../Types/JSON";
12
15
  import Semaphore, { SemaphoreMutex } from "../../Infrastructure/Semaphore";
13
16
  import IncomingMonitorRequest from "../../../Types/Monitor/IncomingMonitor/IncomingMonitorRequest";
14
17
  import MonitorCriteria from "../../../Types/Monitor/MonitorCriteria";
@@ -237,6 +240,16 @@ export default class MonitorResourceUtil {
237
240
  let probeName: string | undefined = undefined;
238
241
  const monitorName: string | undefined = monitor.name || undefined;
239
242
 
243
+ /*
244
+ * SNMP trap responses are event-driven, not check results. They are
245
+ * evaluated ONLY against trap criteria; they must not overwrite the
246
+ * last check's counters, participate in probe agreement, or reset the
247
+ * monitor to its default status when no criteria matches.
248
+ */
249
+ const isSnmpTrapEvent: boolean = Boolean(
250
+ (dataToProcess as ProbeMonitorResponse).snmpTrapResponse,
251
+ );
252
+
240
253
  // save the last log to MonitorProbe.
241
254
 
242
255
  // get last log. We do this because there are many monitoring steps and we need to store those.
@@ -275,26 +288,58 @@ export default class MonitorResourceUtil {
275
288
 
276
289
  probeName = monitorProbe.probe?.name || undefined;
277
290
 
278
- await MonitorProbeService.updateOneBy({
279
- query: {
280
- monitorId: monitor.id!,
281
- probeId: (dataToProcess as ProbeMonitorResponse).probeId!,
282
- },
283
- data: {
284
- lastMonitoringLog: {
285
- ...(monitorProbe.lastMonitoringLog || {}),
286
- [(
287
- dataToProcess as ProbeMonitorResponse
288
- ).monitorStepId.toString()]: {
289
- ...JSON.parse(JSON.stringify(dataToProcess)),
290
- monitoredAt: OneUptimeDate.getCurrentDate(),
291
- },
292
- } as any,
293
- },
294
- props: {
295
- isRoot: true,
296
- },
297
- });
291
+ /*
292
+ * SNMP interface rates (bandwidth, utilization, errors/sec) are
293
+ * deltas against the previous check's counters — computed here,
294
+ * while the previous log is still available, so the computed
295
+ * values flow into metrics, criteria, and the stored log below.
296
+ */
297
+ if (monitor.monitorType === MonitorType.NetworkDevice) {
298
+ SnmpInterfaceRateUtil.attachInterfaceRates({
299
+ probeMonitorResponse: dataToProcess as ProbeMonitorResponse,
300
+ previousStepLog: (
301
+ monitorProbe.lastMonitoringLog as JSONObject | undefined
302
+ )?.[
303
+ (dataToProcess as ProbeMonitorResponse).monitorStepId.toString()
304
+ ] as JSONObject | undefined,
305
+ });
306
+
307
+ /*
308
+ * Sync the NetworkDevice/NetworkInterface inventory from the
309
+ * walk, then prune the response to monitored interfaces so
310
+ * criteria and metrics ignore muted ports. Trap events carry
311
+ * no walk data — nothing to sync.
312
+ */
313
+ if (!isSnmpTrapEvent) {
314
+ await NetworkInventoryUtil.updateFromWalk({
315
+ monitor: monitor,
316
+ dataToProcess: dataToProcess as ProbeMonitorResponse,
317
+ });
318
+ }
319
+ }
320
+
321
+ if (!isSnmpTrapEvent) {
322
+ await MonitorProbeService.updateOneBy({
323
+ query: {
324
+ monitorId: monitor.id!,
325
+ probeId: (dataToProcess as ProbeMonitorResponse).probeId!,
326
+ },
327
+ data: {
328
+ lastMonitoringLog: {
329
+ ...(monitorProbe.lastMonitoringLog || {}),
330
+ [(
331
+ dataToProcess as ProbeMonitorResponse
332
+ ).monitorStepId.toString()]: {
333
+ ...JSON.parse(JSON.stringify(dataToProcess)),
334
+ monitoredAt: OneUptimeDate.getCurrentDate(),
335
+ },
336
+ } as any,
337
+ },
338
+ props: {
339
+ isRoot: true,
340
+ },
341
+ });
342
+ }
298
343
  }
299
344
  }
300
345
 
@@ -603,7 +648,12 @@ export default class MonitorResourceUtil {
603
648
  // Check probe agreement for probe-based monitors
604
649
  if (
605
650
  monitor.monitorType &&
606
- MonitorTypeHelper.isProbableMonitor(monitor.monitorType)
651
+ MonitorTypeHelper.isProbableMonitor(monitor.monitorType) &&
652
+ /*
653
+ * Traps arrive on exactly one probe — other probes' polled state
654
+ * cannot corroborate them, so agreement would always veto the trap.
655
+ */
656
+ !isSnmpTrapEvent
607
657
  ) {
608
658
  const probeAgreementResult: ProbeAgreementResult =
609
659
  await MonitorResourceUtil.checkProbeAgreement({
@@ -874,6 +924,12 @@ export default class MonitorResourceUtil {
874
924
  });
875
925
  } else if (
876
926
  !response.criteriaMetId &&
927
+ /*
928
+ * A trap that matches no criteria is simply ignored — it must not
929
+ * reset the monitor to its default status (the polled checks own
930
+ * the monitor's state).
931
+ */
932
+ !isSnmpTrapEvent &&
877
933
  monitorSteps.data.defaultMonitorStatusId &&
878
934
  monitor.currentMonitorStatusId?.toString() !==
879
935
  monitorSteps.data.defaultMonitorStatusId.toString()
@@ -245,7 +245,7 @@ export default class MonitorTemplateUtil {
245
245
  } as JSONObject;
246
246
  }
247
247
 
248
- if (data.monitorType === MonitorType.SNMP) {
248
+ if (data.monitorType === MonitorType.NetworkDevice) {
249
249
  const snmpResponse: SnmpMonitorResponse | undefined = (
250
250
  data.dataToProcess as ProbeMonitorResponse
251
251
  ).snmpResponse;
@@ -0,0 +1,201 @@
1
+ import NetworkDevice from "../../../Models/DatabaseModels/NetworkDevice";
2
+ import NetworkDeviceService from "../../Services/NetworkDeviceService";
3
+ import MonitorSteps from "../../../Types/Monitor/MonitorSteps";
4
+ import QueryHelper from "../../Types/Database/QueryHelper";
5
+ import LIMIT_MAX from "../../../Types/Database/LimitMax";
6
+ import MonitorType from "../../../Types/Monitor/MonitorType";
7
+ import SnmpVersion from "../../../Types/Monitor/SnmpMonitor/SnmpVersion";
8
+ import SnmpV3Auth from "../../../Types/Monitor/SnmpMonitor/SnmpV3Auth";
9
+ import SnmpSecurityLevel from "../../../Types/Monitor/SnmpMonitor/SnmpSecurityLevel";
10
+ import SnmpAuthProtocol from "../../../Types/Monitor/SnmpMonitor/SnmpAuthProtocol";
11
+ import SnmpPrivProtocol from "../../../Types/Monitor/SnmpMonitor/SnmpPrivProtocol";
12
+ import ObjectID from "../../../Types/ObjectID";
13
+ import logger from "../Logger";
14
+
15
+ /*
16
+ * Network Device monitor steps reference a NetworkDevice resource instead of
17
+ * carrying SNMP connection details. Probes are stateless and only understand
18
+ * concrete SNMP config, so before work is handed out the referenced device's
19
+ * hostname/credentials are hydrated into each step's `snmpMonitor` field.
20
+ */
21
+ export interface HydratableMonitor {
22
+ id?: ObjectID | null | undefined;
23
+ monitorType?: MonitorType | undefined;
24
+ monitorSteps?: MonitorSteps | undefined;
25
+ }
26
+
27
+ export default class NetworkDeviceHydrationUtil {
28
+ // Accepts Monitor and MonitorTest alike (structural: monitorType + monitorSteps).
29
+ public static async hydrateNetworkDeviceMonitors(
30
+ monitors: Array<HydratableMonitor>,
31
+ ): Promise<void> {
32
+ const deviceIds: Set<string> = new Set();
33
+
34
+ for (const monitor of monitors) {
35
+ if (monitor.monitorType !== MonitorType.NetworkDevice) {
36
+ continue;
37
+ }
38
+
39
+ for (const step of monitor.monitorSteps?.data
40
+ ?.monitorStepsInstanceArray || []) {
41
+ const deviceId: string | undefined =
42
+ step.data?.networkDeviceMonitor?.networkDeviceId;
43
+ if (deviceId) {
44
+ deviceIds.add(deviceId);
45
+ }
46
+ }
47
+ }
48
+
49
+ if (deviceIds.size === 0) {
50
+ return;
51
+ }
52
+
53
+ const devices: Array<NetworkDevice> = await NetworkDeviceService.findBy({
54
+ query: {
55
+ _id: QueryHelper.any(Array.from(deviceIds)),
56
+ },
57
+ select: {
58
+ _id: true,
59
+ hostname: true,
60
+ snmpVersion: true,
61
+ snmpCommunityString: true,
62
+ snmpPort: true,
63
+ snmpV3Auth: true,
64
+ snmpV3SecurityLevel: true,
65
+ snmpV3Username: true,
66
+ snmpV3AuthProtocol: true,
67
+ snmpV3AuthKey: true,
68
+ snmpV3PrivProtocol: true,
69
+ snmpV3PrivKey: true,
70
+ },
71
+ limit: LIMIT_MAX,
72
+ skip: 0,
73
+ props: {
74
+ isRoot: true,
75
+ },
76
+ });
77
+
78
+ const devicesById: Map<string, NetworkDevice> = new Map();
79
+ for (const device of devices) {
80
+ if (device.id) {
81
+ devicesById.set(device.id.toString(), device);
82
+ }
83
+ }
84
+
85
+ for (const monitor of monitors) {
86
+ if (monitor.monitorType !== MonitorType.NetworkDevice) {
87
+ continue;
88
+ }
89
+
90
+ for (const step of monitor.monitorSteps?.data
91
+ ?.monitorStepsInstanceArray || []) {
92
+ const deviceId: string | undefined =
93
+ step.data?.networkDeviceMonitor?.networkDeviceId;
94
+
95
+ if (!deviceId || !step.data) {
96
+ continue;
97
+ }
98
+
99
+ const device: NetworkDevice | undefined = devicesById.get(deviceId);
100
+
101
+ if (!device || !device.hostname) {
102
+ logger.warn(
103
+ `Network Device monitor ${monitor.id?.toString()} references missing device ${deviceId}. Step will not be executable.`,
104
+ );
105
+ continue;
106
+ }
107
+
108
+ step.data.snmpMonitor = {
109
+ snmpVersion: NetworkDeviceHydrationUtil.parseSnmpVersion(
110
+ device.snmpVersion,
111
+ ),
112
+ hostname: device.hostname,
113
+ port: device.snmpPort || 161,
114
+ communityString: device.snmpCommunityString || undefined,
115
+ snmpV3Auth: NetworkDeviceHydrationUtil.buildSnmpV3Auth(device),
116
+ oids: step.data.networkDeviceMonitor?.oids || [],
117
+ timeout: 5000,
118
+ retries: 3,
119
+ monitorInterfaces:
120
+ step.data.networkDeviceMonitor?.monitorInterfaces !== false,
121
+ };
122
+ }
123
+ }
124
+ }
125
+
126
+ /*
127
+ * Assembles the SnmpV3Auth object the probe expects. Prefers the flattened
128
+ * snmpV3* columns (the current storage), falling back to the deprecated
129
+ * snmpV3Auth JSON column so devices created before the columns existed keep
130
+ * working. Returns undefined when no v3 username is configured.
131
+ */
132
+ private static buildSnmpV3Auth(
133
+ device: NetworkDevice,
134
+ ): SnmpV3Auth | undefined {
135
+ if (device.snmpV3Username) {
136
+ return {
137
+ securityLevel:
138
+ (device.snmpV3SecurityLevel as SnmpSecurityLevel) ||
139
+ SnmpSecurityLevel.NoAuthNoPriv,
140
+ username: device.snmpV3Username,
141
+ authProtocol:
142
+ (device.snmpV3AuthProtocol as SnmpAuthProtocol | undefined) ||
143
+ undefined,
144
+ authKey: device.snmpV3AuthKey || undefined,
145
+ privProtocol:
146
+ (device.snmpV3PrivProtocol as SnmpPrivProtocol | undefined) ||
147
+ undefined,
148
+ privKey: device.snmpV3PrivKey || undefined,
149
+ };
150
+ }
151
+
152
+ // Legacy devices stored the whole object in the snmpV3Auth JSON column.
153
+ const legacy: SnmpV3Auth | undefined = device.snmpV3Auth as
154
+ | SnmpV3Auth
155
+ | undefined;
156
+ if (legacy && legacy.username) {
157
+ return legacy;
158
+ }
159
+
160
+ return undefined;
161
+ }
162
+
163
+ // Tolerates both enum values ("2c") and enum keys ("V2c") in stored config.
164
+ private static parseSnmpVersion(value: string | undefined): SnmpVersion {
165
+ switch ((value || "").toLowerCase()) {
166
+ case "1":
167
+ case "v1":
168
+ return SnmpVersion.V1;
169
+ case "3":
170
+ case "v3":
171
+ return SnmpVersion.V3;
172
+ default:
173
+ return SnmpVersion.V2c;
174
+ }
175
+ }
176
+
177
+ /*
178
+ * Resolves which NetworkDevices (polled by the given probe) match a trap
179
+ * source IP. Used by the trap ingest to fan traps out to device monitors.
180
+ */
181
+ public static async findDevicesByProbeAndSource(data: {
182
+ probeId: ObjectID;
183
+ sourceIpAddress: string;
184
+ }): Promise<Array<NetworkDevice>> {
185
+ return NetworkDeviceService.findBy({
186
+ query: {
187
+ probeId: data.probeId,
188
+ hostname: data.sourceIpAddress,
189
+ },
190
+ select: {
191
+ _id: true,
192
+ projectId: true,
193
+ },
194
+ limit: LIMIT_MAX,
195
+ skip: 0,
196
+ props: {
197
+ isRoot: true,
198
+ },
199
+ });
200
+ }
201
+ }
@@ -0,0 +1,215 @@
1
+ import Monitor from "../../../Models/DatabaseModels/Monitor";
2
+ import NetworkInterface from "../../../Models/DatabaseModels/NetworkInterface";
3
+ import NetworkDeviceService from "../../Services/NetworkDeviceService";
4
+ import NetworkInterfaceService from "../../Services/NetworkInterfaceService";
5
+ import LIMIT_MAX from "../../../Types/Database/LimitMax";
6
+ import MonitorStep from "../../../Types/Monitor/MonitorStep";
7
+ import SnmpInterface from "../../../Types/Monitor/SnmpMonitor/SnmpInterface";
8
+ import LldpNeighbor from "../../../Types/Monitor/SnmpMonitor/LldpNeighbor";
9
+ import ProbeMonitorResponse from "../../../Types/Probe/ProbeMonitorResponse";
10
+ import ObjectID from "../../../Types/ObjectID";
11
+ import OneUptimeDate from "../../../Types/Date";
12
+ import logger from "../Logger";
13
+
14
+ /*
15
+ * Keeps the NetworkDevice / NetworkInterface inventory in sync with each
16
+ * interface walk, then prunes the in-flight response down to MONITORED
17
+ * interfaces so criteria and metrics only consider ports the user cares
18
+ * about. Inventory rows always reflect every walked interface; the
19
+ * isMonitored flag is user-owned and never overwritten here.
20
+ */
21
+ export default class NetworkInventoryUtil {
22
+ public static async updateFromWalk(data: {
23
+ monitor: Monitor;
24
+ dataToProcess: ProbeMonitorResponse;
25
+ }): Promise<void> {
26
+ const step: MonitorStep | undefined =
27
+ data.monitor.monitorSteps?.data?.monitorStepsInstanceArray?.find(
28
+ (monitorStep: MonitorStep) => {
29
+ return (
30
+ monitorStep.id.toString() ===
31
+ data.dataToProcess.monitorStepId.toString()
32
+ );
33
+ },
34
+ );
35
+
36
+ const deviceIdAsString: string | undefined =
37
+ step?.data?.networkDeviceMonitor?.networkDeviceId;
38
+
39
+ if (!deviceIdAsString || !data.monitor.projectId) {
40
+ return;
41
+ }
42
+
43
+ const deviceId: ObjectID = new ObjectID(deviceIdAsString);
44
+ const walkedInterfaces: Array<SnmpInterface> =
45
+ data.dataToProcess.snmpResponse?.interfaces || [];
46
+ const systemInfo:
47
+ | { sysDescr?: string | undefined; sysName?: string | undefined }
48
+ | undefined = data.dataToProcess.snmpResponse?.systemInfo;
49
+ const lldpNeighbors: Array<LldpNeighbor> | undefined =
50
+ data.dataToProcess.snmpResponse?.lldpNeighbors;
51
+
52
+ const now: Date = OneUptimeDate.getCurrentDate();
53
+
54
+ try {
55
+ // --- Device enrichment + cached counts ---
56
+ const deviceUpdate: Record<string, unknown> = {
57
+ lastSeenAt: now,
58
+ };
59
+
60
+ if (systemInfo?.sysDescr) {
61
+ deviceUpdate["sysDescr"] = systemInfo.sysDescr.substring(0, 500);
62
+ }
63
+ if (systemInfo?.sysName) {
64
+ deviceUpdate["sysName"] = systemInfo.sysName.substring(0, 100);
65
+ }
66
+
67
+ /*
68
+ * Store the LLDP snapshot (capped) whenever the walk ran, even if it
69
+ * found nothing — clearing stale neighbors is as important as adding
70
+ * new ones for keeping the topology accurate.
71
+ */
72
+ if (lldpNeighbors !== undefined) {
73
+ deviceUpdate["lldpNeighbors"] = lldpNeighbors.slice(0, 256);
74
+ }
75
+
76
+ if (walkedInterfaces.length > 0) {
77
+ deviceUpdate["interfacesTotal"] = walkedInterfaces.length;
78
+ deviceUpdate["interfacesUp"] = walkedInterfaces.filter(
79
+ (walked: SnmpInterface) => {
80
+ return walked.isAdministrativelyUp && walked.isOperationallyUp;
81
+ },
82
+ ).length;
83
+ deviceUpdate["interfacesDown"] = walkedInterfaces.filter(
84
+ (walked: SnmpInterface) => {
85
+ return walked.isAdministrativelyUp && !walked.isOperationallyUp;
86
+ },
87
+ ).length;
88
+ }
89
+
90
+ await NetworkDeviceService.updateOneById({
91
+ id: deviceId,
92
+ data: deviceUpdate as any,
93
+ props: {
94
+ isRoot: true,
95
+ },
96
+ });
97
+
98
+ if (walkedInterfaces.length === 0) {
99
+ return;
100
+ }
101
+
102
+ // --- Interface upsert ---
103
+ const existingInterfaces: Array<NetworkInterface> =
104
+ await NetworkInterfaceService.findBy({
105
+ query: {
106
+ networkDeviceId: deviceId,
107
+ },
108
+ select: {
109
+ _id: true,
110
+ interfaceIndex: true,
111
+ isMonitored: true,
112
+ },
113
+ limit: LIMIT_MAX,
114
+ skip: 0,
115
+ props: {
116
+ isRoot: true,
117
+ },
118
+ });
119
+
120
+ const existingByIndex: Map<number, NetworkInterface> = new Map();
121
+ for (const existing of existingInterfaces) {
122
+ if (existing.interfaceIndex !== undefined) {
123
+ existingByIndex.set(existing.interfaceIndex, existing);
124
+ }
125
+ }
126
+
127
+ const unmonitoredIndexes: Set<number> = new Set();
128
+
129
+ for (const walked of walkedInterfaces) {
130
+ const existing: NetworkInterface | undefined = existingByIndex.get(
131
+ walked.interfaceIndex,
132
+ );
133
+
134
+ if (existing && existing.isMonitored === false) {
135
+ unmonitoredIndexes.add(walked.interfaceIndex);
136
+ }
137
+
138
+ const interfaceData: Record<string, unknown> = {
139
+ name: (walked.name || "").substring(0, 100),
140
+ alias: walked.alias ? walked.alias.substring(0, 100) : null,
141
+ isOperationallyUp: walked.isOperationallyUp,
142
+ isAdministrativelyUp: walked.isAdministrativelyUp,
143
+ speedInMbps:
144
+ walked.speedInBitsPerSecond !== undefined
145
+ ? walked.speedInBitsPerSecond / 1000000
146
+ : null,
147
+ inRateMbps:
148
+ walked.inBitsPerSecond !== undefined
149
+ ? Math.round((walked.inBitsPerSecond / 1000000) * 1000) / 1000
150
+ : null,
151
+ outRateMbps:
152
+ walked.outBitsPerSecond !== undefined
153
+ ? Math.round((walked.outBitsPerSecond / 1000000) * 1000) / 1000
154
+ : null,
155
+ utilizationPercent: walked.utilizationPercent ?? null,
156
+ errorsPerSecond: walked.errorsPerSecond ?? null,
157
+ lastSeenAt: now,
158
+ };
159
+
160
+ if (existing && existing.id) {
161
+ await NetworkInterfaceService.updateOneById({
162
+ id: existing.id,
163
+ data: interfaceData as any,
164
+ props: {
165
+ isRoot: true,
166
+ },
167
+ });
168
+ } else {
169
+ const newInterface: NetworkInterface = new NetworkInterface();
170
+ newInterface.projectId = data.monitor.projectId;
171
+ newInterface.networkDeviceId = deviceId;
172
+ newInterface.interfaceIndex = walked.interfaceIndex;
173
+ newInterface.name = (walked.name || "").substring(0, 100);
174
+ if (walked.alias) {
175
+ newInterface.alias = walked.alias.substring(0, 100);
176
+ }
177
+ newInterface.isMonitored = true;
178
+ newInterface.isOperationallyUp = walked.isOperationallyUp;
179
+ newInterface.isAdministrativelyUp = walked.isAdministrativelyUp;
180
+ if (walked.speedInBitsPerSecond !== undefined) {
181
+ newInterface.speedInMbps = walked.speedInBitsPerSecond / 1000000;
182
+ }
183
+ newInterface.lastSeenAt = now;
184
+
185
+ await NetworkInterfaceService.create({
186
+ data: newInterface,
187
+ props: {
188
+ isRoot: true,
189
+ },
190
+ });
191
+ }
192
+ }
193
+
194
+ /*
195
+ * Prune the in-flight response to monitored interfaces only, so
196
+ * criteria (interface down / utilization / errors) and per-interface
197
+ * metrics ignore ports the user muted. The inventory above keeps the
198
+ * full picture.
199
+ */
200
+ if (unmonitoredIndexes.size > 0 && data.dataToProcess.snmpResponse) {
201
+ data.dataToProcess.snmpResponse.interfaces = walkedInterfaces.filter(
202
+ (walked: SnmpInterface) => {
203
+ return !unmonitoredIndexes.has(walked.interfaceIndex);
204
+ },
205
+ );
206
+ }
207
+ } catch (err) {
208
+ // Inventory bookkeeping must never fail the check pipeline.
209
+ logger.error(
210
+ `Failed to update network inventory for device ${deviceIdAsString}:`,
211
+ );
212
+ logger.error(err);
213
+ }
214
+ }
215
+ }