@oneuptime/common 11.5.9 → 11.5.10

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 (376) hide show
  1. package/Models/AnalyticsModels/Index.ts +13 -0
  2. package/Models/AnalyticsModels/MetricItemAggMV1mByContainer.ts +178 -0
  3. package/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.ts +179 -0
  4. package/Models/AnalyticsModels/MetricItemAggMV1mByService.ts +179 -0
  5. package/Models/AnalyticsModels/NetworkFlow.ts +397 -0
  6. package/Models/DatabaseModels/EnterpriseLicenseInstance.ts +18 -0
  7. package/Models/DatabaseModels/GlobalConfig.ts +36 -0
  8. package/Models/DatabaseModels/Index.ts +2 -0
  9. package/Models/DatabaseModels/MarketingConversion.ts +198 -0
  10. package/Models/DatabaseModels/MetricSavedView.ts +34 -0
  11. package/Models/DatabaseModels/MetricType.ts +74 -0
  12. package/Models/DatabaseModels/NetworkDevice.ts +332 -0
  13. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +113 -0
  14. package/Models/DatabaseModels/NetworkInterface.ts +58 -0
  15. package/Models/DatabaseModels/Project.ts +37 -0
  16. package/Models/DatabaseModels/User.ts +37 -0
  17. package/Server/API/BaseAnalyticsAPI.ts +23 -0
  18. package/Server/API/EnterpriseLicenseAPI.ts +14 -0
  19. package/Server/EnvironmentConfig.ts +84 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1784191414522-AddCounterSemanticsToMetricType.ts +38 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/1784191414600-AddViewTypeToMetricSavedView.ts +28 -0
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1784211212164-AddNetworkDeviceInventoryAndDiscoverySchedule.ts +108 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1784218257664-AddEnterpriseLicenseNotificationColumns.ts +31 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1784293516000-AddAttributionColumnsToUserAndProject.ts +29 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/1784298000000-AddMarketingConversionTable.ts +35 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
  27. package/Server/Services/AnalyticsDatabaseService.ts +70 -1
  28. package/Server/Services/IncidentService.ts +13 -0
  29. package/Server/Services/Index.ts +10 -0
  30. package/Server/Services/MarketingConversionService.ts +10 -0
  31. package/Server/Services/MetricItemAggMV1mByContainerService.ts +31 -0
  32. package/Server/Services/MetricItemAggMV1mByK8sClusterService.ts +31 -0
  33. package/Server/Services/MetricItemAggMV1mByServiceService.ts +31 -0
  34. package/Server/Services/MetricService.ts +970 -122
  35. package/Server/Services/MonitorService.ts +14 -0
  36. package/Server/Services/NetworkDeviceOwnerTeamService.ts +42 -0
  37. package/Server/Services/NetworkDeviceOwnerUserService.ts +106 -0
  38. package/Server/Services/NetworkFlowService.ts +11 -0
  39. package/Server/Services/OnCallDutyPolicyService.ts +11 -1
  40. package/Server/Services/ProjectService.ts +136 -0
  41. package/Server/Services/SpanService.ts +13 -9
  42. package/Server/Services/StatusPageService.ts +10 -0
  43. package/Server/Services/TeamMemberService.ts +11 -0
  44. package/Server/Services/UserService.ts +59 -0
  45. package/Server/Types/AnalyticsDatabase/AggregateBy.ts +37 -7
  46. package/Server/Utils/Attribution.ts +99 -0
  47. package/Server/Utils/Marketing/ConversionUploadProvider.ts +103 -0
  48. package/Server/Utils/Marketing/ConversionUploadProviders.ts +22 -0
  49. package/Server/Utils/Marketing/Providers/GoogleAds.ts +270 -0
  50. package/Server/Utils/Marketing/Providers/LinkedIn.ts +147 -0
  51. package/Server/Utils/Marketing/Providers/Meta.ts +148 -0
  52. package/Server/Utils/Marketing/Providers/MicrosoftAds.ts +196 -0
  53. package/Server/Utils/Marketing/Providers/Reddit.ts +178 -0
  54. package/Server/Utils/Monitor/MonitorAlert.ts +71 -7
  55. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +31 -19
  56. package/Server/Utils/Monitor/MonitorIncident.ts +71 -7
  57. package/Server/Utils/Monitor/MonitorMetricUtil.ts +57 -0
  58. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +94 -0
  59. package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +15 -0
  60. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +125 -14
  61. package/Server/Utils/ProductAnalytics.ts +133 -0
  62. package/Server/Utils/Telemetry/Telemetry.ts +39 -0
  63. package/Server/Utils/Telemetry/TelemetryEntity.ts +21 -0
  64. package/Tests/Server/API/BaseAnalyticsAPI.test.ts +72 -0
  65. package/Tests/Server/Infrastructure/SemaphorePermit.test.ts +9 -1
  66. package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +21 -2
  67. package/Tests/Server/Services/MetricEntityMVKeyParity.test.ts +173 -0
  68. package/Tests/Server/Services/MetricServiceAggregate.test.ts +1391 -0
  69. package/Tests/Server/Services/NetworkDeviceOwnerServices.test.ts +260 -0
  70. package/Tests/Server/Utils/Monitor/MonitorTemplateUtilNetworkDevice.test.ts +389 -0
  71. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +764 -0
  72. package/Tests/Types/BaseDatabase/AggregationIntervalUtil.test.ts +111 -2
  73. package/Tests/Types/Database/EndsWith.test.ts +64 -0
  74. package/Tests/Types/Database/GreaterThan.test.ts +62 -0
  75. package/Tests/Types/Database/GreaterThanOrEqual.test.ts +65 -0
  76. package/Tests/Types/Database/GreaterThanOrNull.test.ts +63 -0
  77. package/Tests/Types/Database/Includes.test.ts +65 -0
  78. package/Tests/Types/Database/IncludesAll.test.ts +65 -0
  79. package/Tests/Types/Database/IncludesNone.test.ts +65 -0
  80. package/Tests/Types/Database/IsNull.test.ts +44 -0
  81. package/Tests/Types/Database/LessThan.test.ts +62 -0
  82. package/Tests/Types/Database/LessThanOrEqual.test.ts +62 -0
  83. package/Tests/Types/Database/LessThanOrNull.test.ts +62 -0
  84. package/Tests/Types/Database/MultiSearch.test.ts +81 -0
  85. package/Tests/Types/Database/NotContains.test.ts +64 -0
  86. package/Tests/Types/Database/NotNull.test.ts +44 -0
  87. package/Tests/Types/Database/StartsWith.test.ts +64 -0
  88. package/Tests/Types/Monitor/MonitorStepSqlMonitor.test.ts +83 -1
  89. package/Tests/Types/Monitor/SnmpV3EnumParsing.test.ts +247 -0
  90. package/Tests/Types/Monitor/SnmpVendorTemplate.test.ts +263 -0
  91. package/Tests/UI/Components/XAxis.test.ts +5 -3
  92. package/Tests/Utils/EnterpriseLicenseUsage.test.ts +76 -0
  93. package/Tests/Utils/Metrics/MetricExplorerUrl.test.ts +622 -0
  94. package/Tests/Utils/Metrics/MetricFormulaEvaluator.test.ts +474 -0
  95. package/Tests/Utils/Telemetry/HeartbeatAvailability.test.ts +52 -4
  96. package/Types/AnalyticsDatabase/AnalyticsTableName.ts +11 -0
  97. package/Types/BaseDatabase/AggregateBy.ts +31 -2
  98. package/Types/BaseDatabase/AggregatedResult.ts +22 -0
  99. package/Types/BaseDatabase/AggregationInterval.ts +11 -0
  100. package/Types/BaseDatabase/AggregationIntervalUtil.ts +30 -5
  101. package/Types/Dashboard/DashboardComponents/DashboardTraceChartComponent.ts +16 -0
  102. package/Types/Email/EmailTemplateType.ts +3 -0
  103. package/Types/Marketing/MarketingConversion.ts +11 -0
  104. package/Types/Metrics/MetricQueryConfigData.ts +21 -0
  105. package/Types/Metrics/MetricQueryData.ts +8 -0
  106. package/Types/Metrics/MetricViewData.ts +8 -0
  107. package/Types/Monitor/MonitorMetricType.ts +8 -0
  108. package/Types/Monitor/MonitorStep.ts +9 -0
  109. package/Types/Monitor/MonitorStepSqlMonitor.ts +12 -0
  110. package/Types/Monitor/MonitorType.ts +2 -1
  111. package/Types/Monitor/SSLMonitor/SslMonitorResponse.ts +17 -12
  112. package/Types/Monitor/SnmpMonitor/CdpNeighbor.ts +13 -0
  113. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +37 -3
  114. package/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.ts +46 -0
  115. package/Types/Monitor/SnmpMonitor/SnmpEntityInfo.ts +15 -0
  116. package/Types/Monitor/SnmpMonitor/SnmpInterface.ts +8 -0
  117. package/Types/Monitor/SnmpMonitor/SnmpMonitorResponse.ts +17 -8
  118. package/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.ts +53 -0
  119. package/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.ts +43 -0
  120. package/Types/Monitor/SnmpMonitor/SnmpSystemInfo.ts +16 -0
  121. package/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.ts +119 -3
  122. package/Types/NetFlow/NetworkFlowRecord.ts +25 -0
  123. package/Types/Syslog/SyslogMessage.ts +18 -0
  124. package/Types/Telemetry/TelemetrySavedViewState.ts +9 -0
  125. package/Types/Telemetry/TelemetrySavedViewType.ts +12 -0
  126. package/UI/Components/Charts/Area/AreaChart.tsx +51 -0
  127. package/UI/Components/Charts/Bar/BarChart.tsx +51 -1
  128. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +97 -26
  129. package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +328 -1
  130. package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +115 -0
  131. package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +328 -1
  132. package/UI/Components/Charts/ChartLibrary/Types/ChartDataPoint.ts +7 -0
  133. package/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.ts +15 -0
  134. package/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.ts +13 -0
  135. package/UI/Components/Charts/Line/LineChart.tsx +51 -0
  136. package/UI/Components/Charts/Types/ReferenceRegionProps.ts +12 -0
  137. package/UI/Components/Charts/Types/TimeReferenceLineProps.ts +12 -0
  138. package/UI/Components/Charts/Types/XAxis/XAxisPrecision.ts +1 -0
  139. package/UI/Components/Charts/Utils/DataPoint.ts +0 -0
  140. package/UI/Components/Charts/Utils/TimeAnnotation.ts +169 -0
  141. package/UI/Components/Charts/Utils/XAxis.ts +28 -4
  142. package/UI/Components/Icon/Icon.tsx +33 -13
  143. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +9 -0
  144. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +67 -0
  145. package/UI/Components/Page/ModelPage.tsx +6 -1
  146. package/UI/Components/TelemetryViewer/components/SavedViewsDropdown.tsx +33 -4
  147. package/UI/Styles/Theme.css +10 -0
  148. package/UI/Utils/User.ts +41 -2
  149. package/Utils/Analytics.ts +8 -6
  150. package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +74 -0
  151. package/Utils/Metrics/MetricExplorerUrl.ts +771 -0
  152. package/Utils/Metrics/MetricFormulaEvaluator.ts +410 -46
  153. package/Utils/Monitor/NetworkTopologyUtil.ts +261 -49
  154. package/Utils/ValueFormatter.ts +22 -1
  155. package/build/dist/Models/AnalyticsModels/Index.js +13 -0
  156. package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
  157. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByContainer.js +159 -0
  158. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByContainer.js.map +1 -0
  159. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.js +158 -0
  160. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.js.map +1 -0
  161. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByService.js +160 -0
  162. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByService.js.map +1 -0
  163. package/build/dist/Models/AnalyticsModels/NetworkFlow.js +351 -0
  164. package/build/dist/Models/AnalyticsModels/NetworkFlow.js.map +1 -0
  165. package/build/dist/Models/DatabaseModels/EnterpriseLicenseInstance.js +19 -0
  166. package/build/dist/Models/DatabaseModels/EnterpriseLicenseInstance.js.map +1 -1
  167. package/build/dist/Models/DatabaseModels/GlobalConfig.js +38 -0
  168. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  169. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  170. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  171. package/build/dist/Models/DatabaseModels/MarketingConversion.js +219 -0
  172. package/build/dist/Models/DatabaseModels/MarketingConversion.js.map +1 -0
  173. package/build/dist/Models/DatabaseModels/MetricSavedView.js +35 -0
  174. package/build/dist/Models/DatabaseModels/MetricSavedView.js.map +1 -1
  175. package/build/dist/Models/DatabaseModels/MetricType.js +76 -0
  176. package/build/dist/Models/DatabaseModels/MetricType.js.map +1 -1
  177. package/build/dist/Models/DatabaseModels/NetworkDevice.js +341 -0
  178. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  179. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +116 -0
  180. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  181. package/build/dist/Models/DatabaseModels/NetworkInterface.js +60 -0
  182. package/build/dist/Models/DatabaseModels/NetworkInterface.js.map +1 -1
  183. package/build/dist/Models/DatabaseModels/Project.js +38 -0
  184. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  185. package/build/dist/Models/DatabaseModels/User.js +38 -0
  186. package/build/dist/Models/DatabaseModels/User.js.map +1 -1
  187. package/build/dist/Server/API/BaseAnalyticsAPI.js +19 -0
  188. package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
  189. package/build/dist/Server/API/EnterpriseLicenseAPI.js +8 -0
  190. package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
  191. package/build/dist/Server/EnvironmentConfig.js +51 -0
  192. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  193. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784191414522-AddCounterSemanticsToMetricType.js +27 -0
  194. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784191414522-AddCounterSemanticsToMetricType.js.map +1 -0
  195. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784191414600-AddViewTypeToMetricSavedView.js +21 -0
  196. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784191414600-AddViewTypeToMetricSavedView.js.map +1 -0
  197. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784211212164-AddNetworkDeviceInventoryAndDiscoverySchedule.js +47 -0
  198. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784211212164-AddNetworkDeviceInventoryAndDiscoverySchedule.js.map +1 -0
  199. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784218257664-AddEnterpriseLicenseNotificationColumns.js +16 -0
  200. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784218257664-AddEnterpriseLicenseNotificationColumns.js.map +1 -0
  201. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784293516000-AddAttributionColumnsToUserAndProject.js +18 -0
  202. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784293516000-AddAttributionColumnsToUserAndProject.js.map +1 -0
  203. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784298000000-AddMarketingConversionTable.js +20 -0
  204. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784298000000-AddMarketingConversionTable.js.map +1 -0
  205. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
  206. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  207. package/build/dist/Server/Services/AnalyticsDatabaseService.js +58 -4
  208. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  209. package/build/dist/Server/Services/IncidentService.js +12 -0
  210. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  211. package/build/dist/Server/Services/Index.js +10 -0
  212. package/build/dist/Server/Services/Index.js.map +1 -1
  213. package/build/dist/Server/Services/MarketingConversionService.js +9 -0
  214. package/build/dist/Server/Services/MarketingConversionService.js.map +1 -0
  215. package/build/dist/Server/Services/MetricItemAggMV1mByContainerService.js +29 -0
  216. package/build/dist/Server/Services/MetricItemAggMV1mByContainerService.js.map +1 -0
  217. package/build/dist/Server/Services/MetricItemAggMV1mByK8sClusterService.js +29 -0
  218. package/build/dist/Server/Services/MetricItemAggMV1mByK8sClusterService.js.map +1 -0
  219. package/build/dist/Server/Services/MetricItemAggMV1mByServiceService.js +29 -0
  220. package/build/dist/Server/Services/MetricItemAggMV1mByServiceService.js.map +1 -0
  221. package/build/dist/Server/Services/MetricService.js +761 -125
  222. package/build/dist/Server/Services/MetricService.js.map +1 -1
  223. package/build/dist/Server/Services/MonitorService.js +18 -5
  224. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  225. package/build/dist/Server/Services/NetworkDeviceOwnerTeamService.js +44 -0
  226. package/build/dist/Server/Services/NetworkDeviceOwnerTeamService.js.map +1 -1
  227. package/build/dist/Server/Services/NetworkDeviceOwnerUserService.js +88 -0
  228. package/build/dist/Server/Services/NetworkDeviceOwnerUserService.js.map +1 -1
  229. package/build/dist/Server/Services/NetworkFlowService.js +9 -0
  230. package/build/dist/Server/Services/NetworkFlowService.js.map +1 -0
  231. package/build/dist/Server/Services/OnCallDutyPolicyService.js +15 -6
  232. package/build/dist/Server/Services/OnCallDutyPolicyService.js.map +1 -1
  233. package/build/dist/Server/Services/ProjectService.js +107 -6
  234. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  235. package/build/dist/Server/Services/SpanService.js +8 -6
  236. package/build/dist/Server/Services/SpanService.js.map +1 -1
  237. package/build/dist/Server/Services/StatusPageService.js +10 -0
  238. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  239. package/build/dist/Server/Services/TeamMemberService.js +11 -0
  240. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  241. package/build/dist/Server/Services/UserService.js +52 -0
  242. package/build/dist/Server/Services/UserService.js.map +1 -1
  243. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js +33 -7
  244. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js.map +1 -1
  245. package/build/dist/Server/Utils/Attribution.js +74 -0
  246. package/build/dist/Server/Utils/Attribution.js.map +1 -0
  247. package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js +40 -0
  248. package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js.map +1 -0
  249. package/build/dist/Server/Utils/Marketing/ConversionUploadProviders.js +20 -0
  250. package/build/dist/Server/Utils/Marketing/ConversionUploadProviders.js.map +1 -0
  251. package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js +177 -0
  252. package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js.map +1 -0
  253. package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js +113 -0
  254. package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js.map +1 -0
  255. package/build/dist/Server/Utils/Marketing/Providers/Meta.js +109 -0
  256. package/build/dist/Server/Utils/Marketing/Providers/Meta.js.map +1 -0
  257. package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js +130 -0
  258. package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js.map +1 -0
  259. package/build/dist/Server/Utils/Marketing/Providers/Reddit.js +126 -0
  260. package/build/dist/Server/Utils/Marketing/Providers/Reddit.js.map +1 -0
  261. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +53 -9
  262. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  263. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +21 -10
  264. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  265. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +54 -11
  266. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  267. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +43 -3
  268. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  269. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +68 -0
  270. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  271. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +15 -0
  272. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
  273. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +100 -15
  274. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  275. package/build/dist/Server/Utils/ProductAnalytics.js +111 -0
  276. package/build/dist/Server/Utils/ProductAnalytics.js.map +1 -0
  277. package/build/dist/Server/Utils/Telemetry/Telemetry.js +32 -5
  278. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  279. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +17 -0
  280. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  281. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +11 -0
  282. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
  283. package/build/dist/Types/BaseDatabase/AggregationInterval.js +11 -0
  284. package/build/dist/Types/BaseDatabase/AggregationInterval.js.map +1 -1
  285. package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js +33 -5
  286. package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js.map +1 -1
  287. package/build/dist/Types/Email/EmailTemplateType.js +2 -0
  288. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  289. package/build/dist/Types/Marketing/MarketingConversion.js +13 -0
  290. package/build/dist/Types/Marketing/MarketingConversion.js.map +1 -0
  291. package/build/dist/Types/Monitor/MonitorMetricType.js +7 -0
  292. package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
  293. package/build/dist/Types/Monitor/MonitorStep.js +6 -0
  294. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  295. package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js +3 -0
  296. package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -1
  297. package/build/dist/Types/Monitor/MonitorType.js +2 -1
  298. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  299. package/build/dist/Types/Monitor/SnmpMonitor/CdpNeighbor.js +2 -0
  300. package/build/dist/Types/Monitor/SnmpMonitor/CdpNeighbor.js.map +1 -0
  301. package/build/dist/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.js +41 -0
  302. package/build/dist/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.js.map +1 -1
  303. package/build/dist/Types/Monitor/SnmpMonitor/SnmpEntityInfo.js +2 -0
  304. package/build/dist/Types/Monitor/SnmpMonitor/SnmpEntityInfo.js.map +1 -0
  305. package/build/dist/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.js +48 -0
  306. package/build/dist/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.js.map +1 -1
  307. package/build/dist/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.js +38 -0
  308. package/build/dist/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.js.map +1 -1
  309. package/build/dist/Types/Monitor/SnmpMonitor/SnmpSystemInfo.js +2 -0
  310. package/build/dist/Types/Monitor/SnmpMonitor/SnmpSystemInfo.js.map +1 -0
  311. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js +96 -3
  312. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js.map +1 -1
  313. package/build/dist/Types/NetFlow/NetworkFlowRecord.js +2 -0
  314. package/build/dist/Types/NetFlow/NetworkFlowRecord.js.map +1 -0
  315. package/build/dist/Types/Syslog/SyslogMessage.js +2 -0
  316. package/build/dist/Types/Syslog/SyslogMessage.js.map +1 -0
  317. package/build/dist/Types/Telemetry/TelemetrySavedViewState.js +0 -7
  318. package/build/dist/Types/Telemetry/TelemetrySavedViewState.js.map +1 -1
  319. package/build/dist/Types/Telemetry/TelemetrySavedViewType.js +13 -0
  320. package/build/dist/Types/Telemetry/TelemetrySavedViewType.js.map +1 -0
  321. package/build/dist/UI/Components/Charts/Area/AreaChart.js +25 -1
  322. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  323. package/build/dist/UI/Components/Charts/Bar/BarChart.js +26 -2
  324. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  325. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +36 -12
  326. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  327. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +208 -6
  328. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
  329. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +52 -3
  330. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
  331. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +208 -6
  332. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
  333. package/build/dist/UI/Components/Charts/ChartLibrary/Types/ChartDataPoint.js +6 -1
  334. package/build/dist/UI/Components/Charts/ChartLibrary/Types/ChartDataPoint.js.map +1 -1
  335. package/build/dist/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.js +2 -0
  336. package/build/dist/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.js.map +1 -0
  337. package/build/dist/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.js +2 -0
  338. package/build/dist/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.js.map +1 -0
  339. package/build/dist/UI/Components/Charts/Line/LineChart.js +25 -1
  340. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  341. package/build/dist/UI/Components/Charts/Types/ReferenceRegionProps.js +2 -0
  342. package/build/dist/UI/Components/Charts/Types/ReferenceRegionProps.js.map +1 -0
  343. package/build/dist/UI/Components/Charts/Types/TimeReferenceLineProps.js +2 -0
  344. package/build/dist/UI/Components/Charts/Types/TimeReferenceLineProps.js.map +1 -0
  345. package/build/dist/UI/Components/Charts/Types/XAxis/XAxisPrecision.js +1 -0
  346. package/build/dist/UI/Components/Charts/Types/XAxis/XAxisPrecision.js.map +1 -1
  347. package/build/dist/UI/Components/Charts/Utils/DataPoint.js +0 -0
  348. package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
  349. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +121 -0
  350. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -0
  351. package/build/dist/UI/Components/Charts/Utils/XAxis.js +27 -4
  352. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  353. package/build/dist/UI/Components/Icon/Icon.js +15 -8
  354. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  355. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  356. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +58 -0
  357. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  358. package/build/dist/UI/Components/Page/ModelPage.js +7 -1
  359. package/build/dist/UI/Components/Page/ModelPage.js.map +1 -1
  360. package/build/dist/UI/Components/TelemetryViewer/components/SavedViewsDropdown.js +10 -4
  361. package/build/dist/UI/Components/TelemetryViewer/components/SavedViewsDropdown.js.map +1 -1
  362. package/build/dist/UI/Utils/User.js +35 -2
  363. package/build/dist/UI/Utils/User.js.map +1 -1
  364. package/build/dist/Utils/Analytics.js +8 -5
  365. package/build/dist/Utils/Analytics.js.map +1 -1
  366. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +57 -0
  367. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
  368. package/build/dist/Utils/Metrics/MetricExplorerUrl.js +418 -0
  369. package/build/dist/Utils/Metrics/MetricExplorerUrl.js.map +1 -0
  370. package/build/dist/Utils/Metrics/MetricFormulaEvaluator.js +296 -37
  371. package/build/dist/Utils/Metrics/MetricFormulaEvaluator.js.map +1 -1
  372. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +176 -40
  373. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  374. package/build/dist/Utils/ValueFormatter.js +20 -1
  375. package/build/dist/Utils/ValueFormatter.js.map +1 -1
  376. package/package.json +2 -2
@@ -47,6 +47,10 @@ import MonitorType from "../../../Types/Monitor/MonitorType";
47
47
  import { CheckOn, CriteriaFilter } from "../../../Types/Monitor/CriteriaFilter";
48
48
  import OneUptimeDate from "../../../Types/Date";
49
49
  import { JSONObject } from "../../../Types/JSON";
50
+ import Dictionary from "../../../Types/Dictionary";
51
+ import InBetween from "../../../Types/BaseDatabase/InBetween";
52
+ import MetricQueryConfigData from "../../../Types/Metrics/MetricQueryConfigData";
53
+ import MetricExplorerUrl from "../../../Utils/Metrics/MetricExplorerUrl";
50
54
  import Typeof from "../../../Types/Typeof";
51
55
  import ReturnResult from "../../../Types/IsolatedVM/ReturnResult";
52
56
  import URL from "../../../Types/API/URL";
@@ -1330,23 +1334,23 @@ ${contextBlock}
1330
1334
  }
1331
1335
 
1332
1336
  /*
1333
- * Metric explorer expects a JSON-encoded `metricQueries` param plus
1334
- * optional start/end times. The shape is documented by
1335
- * MetricExplorer.getMetricQueriesFromQuery(): it reads metricName,
1336
- * attributes, and aggregationType (correctly spelled, unlike the
1337
- * internal persisted field).
1337
+ * The explorer URL schema (metricQueries/startTime/endTime params)
1338
+ * is owned by MetricExplorerUrl the same module the explorer uses
1339
+ * for its own URL round-trip — so this deep link can never drift
1340
+ * from what the explorer parses.
1338
1341
  */
1339
- const aggregationType: string | undefined =
1340
- input.ctx.aggregationType || undefined;
1341
-
1342
- const query: {
1343
- metricName: string;
1344
- attributes: JSONObject;
1345
- aggregationType?: string;
1346
- } = {
1347
- metricName: input.ctx.metricName,
1348
- attributes: input.ctx.filterAttributes || {},
1349
- ...(aggregationType ? { aggregationType } : {}),
1342
+ const queryConfig: MetricQueryConfigData = {
1343
+ metricQueryData: {
1344
+ filterData: {
1345
+ metricName: input.ctx.metricName,
1346
+ attributes: MetricExplorerUrl.sanitizeAttributes(
1347
+ input.ctx.filterAttributes,
1348
+ ),
1349
+ ...(input.ctx.aggregationType
1350
+ ? { aggegationType: input.ctx.aggregationType }
1351
+ : {}),
1352
+ },
1353
+ },
1350
1354
  };
1351
1355
 
1352
1356
  // Time window: breach moment +- 15 minutes (or fall back to last hour).
@@ -1359,10 +1363,18 @@ ${contextBlock}
1359
1363
  ? OneUptimeDate.addRemoveMinutes(breachTime, 15)
1360
1364
  : now;
1361
1365
 
1366
+ const urlParams: Dictionary<string> =
1367
+ MetricExplorerUrl.buildQueryParamsFromMetricViewData({
1368
+ queryConfigs: [queryConfig],
1369
+ formulaConfigs: [],
1370
+ startAndEndDate: new InBetween(startTime, endTime),
1371
+ });
1372
+
1362
1373
  const params: URLSearchParams = new URLSearchParams();
1363
- params.set("metricQueries", JSON.stringify([query]));
1364
- params.set("startTime", OneUptimeDate.toString(startTime));
1365
- params.set("endTime", OneUptimeDate.toString(endTime));
1374
+
1375
+ for (const paramName in urlParams) {
1376
+ params.set(paramName, urlParams[paramName] as string);
1377
+ }
1366
1378
 
1367
1379
  /*
1368
1380
  * The route that actually reads these URL params is the metric
@@ -36,6 +36,9 @@ import ServiceService from "../../Services/ServiceService";
36
36
  import IncidentSeverityService from "../../Services/IncidentSeverityService";
37
37
  import IncidentStateTimelineService from "../../Services/IncidentStateTimelineService";
38
38
  import IncidentMemberService from "../../Services/IncidentMemberService";
39
+ import NetworkDeviceOwnerUserService, {
40
+ NetworkDeviceOwners,
41
+ } from "../../Services/NetworkDeviceOwnerUserService";
39
42
  import logger, { LogAttributes } from "../Logger";
40
43
  import CaptureSpan from "../Telemetry/CaptureSpan";
41
44
  import DataToProcess from "./DataToProcess";
@@ -358,6 +361,15 @@ export default class MonitorIncident {
358
361
  ? input.matchesPerSeries
359
362
  : [undefined];
360
363
 
364
+ /*
365
+ * Owners of the network device this monitor watches (if any), resolved
366
+ * lazily on first incident creation and reused for the rest of the
367
+ * evaluation — the device is configured per monitor step, so it is
368
+ * constant across the criteria/series loops below. Merged into every
369
+ * created incident's owners alongside the criteria-configured ones.
370
+ */
371
+ let networkDeviceOwners: NetworkDeviceOwners | null = null;
372
+
361
373
  for (const criteriaIncident of input.criteriaInstance.data?.incidents ||
362
374
  []) {
363
375
  for (const seriesMatch of seriesToProcess) {
@@ -654,16 +666,38 @@ export default class MonitorIncident {
654
666
  },
655
667
  });
656
668
 
657
- // Add owner teams and users after incident creation
658
- if (
659
- criteriaIncident.ownerTeamIds?.length ||
660
- criteriaIncident.ownerUserIds?.length
661
- ) {
669
+ /*
670
+ * Add owner teams and users after incident creation. Owners
671
+ * configured on the criteria template are merged (deduped) with the
672
+ * owners of the network device this monitor watches, so device
673
+ * ownership flows into the incidents its monitor raises.
674
+ */
675
+ if (networkDeviceOwners === null) {
676
+ networkDeviceOwners =
677
+ await NetworkDeviceOwnerUserService.getDeviceOwnersForMonitor({
678
+ monitor: input.monitor,
679
+ monitorStepId: (
680
+ input.dataToProcess as ProbeMonitorResponse
681
+ ).monitorStepId?.toString(),
682
+ });
683
+ }
684
+
685
+ const ownerUserIds: Array<ObjectID> = this.mergeOwnerIds(
686
+ criteriaIncident.ownerUserIds || [],
687
+ networkDeviceOwners.ownerUserIds,
688
+ );
689
+
690
+ const ownerTeamIds: Array<ObjectID> = this.mergeOwnerIds(
691
+ criteriaIncident.ownerTeamIds || [],
692
+ networkDeviceOwners.ownerTeamIds,
693
+ );
694
+
695
+ if (ownerTeamIds.length || ownerUserIds.length) {
662
696
  await IncidentService.addOwners(
663
697
  input.monitor.projectId!,
664
698
  createdIncident.id!,
665
- criteriaIncident.ownerUserIds || [],
666
- criteriaIncident.ownerTeamIds || [],
699
+ ownerUserIds,
700
+ ownerTeamIds,
667
701
  true, // notify owners
668
702
  {
669
703
  isRoot: true,
@@ -728,6 +762,36 @@ export default class MonitorIncident {
728
762
  }
729
763
  }
730
764
 
765
+ /*
766
+ * Merges two owner id lists, deduping by string value. Criteria-authored
767
+ * ids can arrive as plain strings from stored JSON, so normalise through
768
+ * toString() for both the comparison and the returned ObjectIDs.
769
+ */
770
+ private static mergeOwnerIds(
771
+ primary: Array<ObjectID>,
772
+ additional: Array<ObjectID>,
773
+ ): Array<ObjectID> {
774
+ const seenIds: Set<string> = new Set<string>();
775
+ const mergedIds: Array<ObjectID> = [];
776
+
777
+ for (const ownerId of [...primary, ...additional]) {
778
+ if (!ownerId) {
779
+ continue;
780
+ }
781
+
782
+ const ownerIdAsString: string = ownerId.toString();
783
+
784
+ if (!ownerIdAsString || seenIds.has(ownerIdAsString)) {
785
+ continue;
786
+ }
787
+
788
+ seenIds.add(ownerIdAsString);
789
+ mergedIds.push(new ObjectID(ownerIdAsString));
790
+ }
791
+
792
+ return mergedIds;
793
+ }
794
+
731
795
  /*
732
796
  * Pull every host / docker-host / k8s-cluster / proxmox-cluster /
733
797
  * ceph-cluster / service identifier out of the series labels and
@@ -18,6 +18,7 @@ import HttpPhaseTimings from "../../../Types/Monitor/HttpPhaseTimings";
18
18
  import MonitorMetricType from "../../../Types/Monitor/MonitorMetricType";
19
19
  import PingMonitorResponse from "../../../Types/Monitor/PingMonitor/PingMonitorResponse";
20
20
  import SnmpInterface from "../../../Types/Monitor/SnmpMonitor/SnmpInterface";
21
+ import { SnmpOidResponse } from "../../../Types/Monitor/SnmpMonitor/SnmpMonitorResponse";
21
22
  import ProbeMonitorResponse from "../../../Types/Probe/ProbeMonitorResponse";
22
23
  import ServerMonitorResponse from "../../../Types/Monitor/ServerMonitor/ServerMonitorResponse";
23
24
  import SyntheticMonitorResponse from "../../../Types/Monitor/SyntheticMonitors/SyntheticMonitorResponse";
@@ -976,6 +977,62 @@ export default class MonitorMetricUtil {
976
977
  }
977
978
  }
978
979
 
980
+ /*
981
+ * Polled OID values (vendor-template CPU/memory/temperature and custom
982
+ * OIDs). Without this the values users poll every check can gate
983
+ * criteria but can never be charted or evaluated over time. One series
984
+ * per OID, keyed by the oid/oidName attributes; non-numeric values
985
+ * (strings, OIDs, MACs) are skipped — they carry no chartable signal.
986
+ */
987
+ const snmpOidResponses: Array<SnmpOidResponse> | undefined = (
988
+ data.dataToProcess as ProbeMonitorResponse
989
+ ).snmpResponse?.oidResponses;
990
+
991
+ if (snmpOidResponses && snmpOidResponses.length > 0) {
992
+ // Same unbounded-write cap rationale as the interface block above.
993
+ const oidResponsesToEmit: Array<SnmpOidResponse> = snmpOidResponses.slice(
994
+ 0,
995
+ 50,
996
+ );
997
+
998
+ if (oidResponsesToEmit.length < snmpOidResponses.length) {
999
+ logger.warn(
1000
+ `Monitor ${data.monitorId.toString()}: emitting metrics for first ${oidResponsesToEmit.length} of ${snmpOidResponses.length} SNMP OID responses`,
1001
+ );
1002
+ }
1003
+
1004
+ for (const oidResponse of oidResponsesToEmit) {
1005
+ const numericValue: number | undefined =
1006
+ typeof oidResponse.value === "number" && isFinite(oidResponse.value)
1007
+ ? oidResponse.value
1008
+ : undefined;
1009
+
1010
+ if (numericValue === undefined) {
1011
+ continue;
1012
+ }
1013
+
1014
+ await this.pushMonitorMetric({
1015
+ projectId: data.projectId,
1016
+ monitorId: data.monitorId,
1017
+ monitorName: data.monitorName,
1018
+ probeName: data.probeName,
1019
+ metricName: MonitorMetricType.SnmpOidValue,
1020
+ value: numericValue,
1021
+ description: "Value of a polled SNMP OID",
1022
+ unit: "",
1023
+ extraAttributes: {
1024
+ probeId: (
1025
+ data.dataToProcess as ProbeMonitorResponse
1026
+ ).probeId.toString(),
1027
+ oid: oidResponse.oid,
1028
+ oidName: oidResponse.name || oidResponse.oid,
1029
+ },
1030
+ metricRows: metricRows,
1031
+ metricNameServiceNameMap: metricNameServiceNameMap,
1032
+ });
1033
+ }
1034
+ }
1035
+
979
1036
  if ((data.dataToProcess as ProbeMonitorResponse).httpTimings) {
980
1037
  const httpTimings: HttpPhaseTimings = (
981
1038
  data.dataToProcess as ProbeMonitorResponse
@@ -15,6 +15,10 @@ import SyntheticMonitorResponse from "../../../Types/Monitor/SyntheticMonitors/S
15
15
  import SnmpMonitorResponse, {
16
16
  SnmpOidResponse,
17
17
  } from "../../../Types/Monitor/SnmpMonitor/SnmpMonitorResponse";
18
+ import SnmpInterface from "../../../Types/Monitor/SnmpMonitor/SnmpInterface";
19
+ import SnmpTrap, {
20
+ SnmpTrapVarbind,
21
+ } from "../../../Types/Monitor/SnmpMonitor/SnmpTrap";
18
22
  import DnsMonitorResponse, {
19
23
  DnsRecordResponse,
20
24
  } from "../../../Types/Monitor/DnsMonitor/DnsMonitorResponse";
@@ -277,6 +281,96 @@ export default class MonitorTemplateUtil {
277
281
  }
278
282
  }
279
283
  }
284
+
285
+ /*
286
+ * Interface walk results (populated when interface monitoring is
287
+ * enabled on the monitor step). Counts follow the same semantics as
288
+ * NetworkInventoryUtil: administratively disabled interfaces are
289
+ * intentionally down and never count as failures, so
290
+ * `interfacesDown` / `downInterfaces` only cover interfaces that are
291
+ * admin-up but oper-down. Lets templates say
292
+ * "{{downInterfaces.0.name}} on {{sysName}} is down".
293
+ */
294
+ if (snmpResponse?.interfaces && snmpResponse.interfaces.length > 0) {
295
+ const interfaces: Array<SnmpInterface> = snmpResponse.interfaces;
296
+
297
+ const downInterfaces: Array<SnmpInterface> = interfaces.filter(
298
+ (snmpInterface: SnmpInterface) => {
299
+ return (
300
+ snmpInterface.isAdministrativelyUp &&
301
+ !snmpInterface.isOperationallyUp
302
+ );
303
+ },
304
+ );
305
+
306
+ storageMap["interfacesTotal"] = interfaces.length;
307
+ storageMap["interfacesUp"] = interfaces.filter(
308
+ (snmpInterface: SnmpInterface) => {
309
+ return (
310
+ snmpInterface.isAdministrativelyUp &&
311
+ snmpInterface.isOperationallyUp
312
+ );
313
+ },
314
+ ).length;
315
+ storageMap["interfacesDown"] = downInterfaces.length;
316
+ storageMap["downInterfaces"] = downInterfaces.map(
317
+ (snmpInterface: SnmpInterface) => {
318
+ return {
319
+ name: snmpInterface.name,
320
+ alias: snmpInterface.alias || "",
321
+ interfaceIndex: snmpInterface.interfaceIndex,
322
+ };
323
+ },
324
+ );
325
+ }
326
+
327
+ if (snmpResponse?.interfaceWalkFailure) {
328
+ storageMap["interfaceWalkFailure"] =
329
+ snmpResponse.interfaceWalkFailure;
330
+ }
331
+
332
+ /*
333
+ * Device system identity (SNMPv2 system group), when collected.
334
+ * Missing fields default to "" so templates render blank instead of
335
+ * a raw {{placeholder}} — but never clobber a value the user already
336
+ * exposed via a custom OID named sysName/sysDescr/etc. above.
337
+ */
338
+ if (snmpResponse?.systemInfo) {
339
+ const systemInfoFields: Array<[string, string | undefined]> = [
340
+ ["sysName", snmpResponse.systemInfo.sysName],
341
+ ["sysDescr", snmpResponse.systemInfo.sysDescr],
342
+ ["sysObjectId", snmpResponse.systemInfo.sysObjectId],
343
+ ["sysLocation", snmpResponse.systemInfo.sysLocation],
344
+ ];
345
+
346
+ for (const [fieldName, fieldValue] of systemInfoFields) {
347
+ if (fieldValue || storageMap[fieldName] === undefined) {
348
+ storageMap[fieldName] = fieldValue || "";
349
+ }
350
+ }
351
+ }
352
+
353
+ /*
354
+ * Trap payload — only present when this check was triggered by an
355
+ * SNMP trap received by a probe's trap receiver (rather than a
356
+ * scheduled poll).
357
+ */
358
+ const snmpTrapResponse: SnmpTrap | undefined = (
359
+ data.dataToProcess as ProbeMonitorResponse
360
+ ).snmpTrapResponse;
361
+
362
+ if (snmpTrapResponse) {
363
+ storageMap["trapOid"] = snmpTrapResponse.trapOid;
364
+ storageMap["trapSourceIp"] = snmpTrapResponse.sourceIpAddress;
365
+ storageMap["trapVarbinds"] = snmpTrapResponse.varbinds.map(
366
+ (varbind: SnmpTrapVarbind) => {
367
+ return {
368
+ oid: varbind.oid,
369
+ value: varbind.value,
370
+ };
371
+ },
372
+ );
373
+ }
280
374
  }
281
375
 
282
376
  if (data.monitorType === MonitorType.DNS) {
@@ -130,6 +130,21 @@ export default class NetworkDeviceHydrationUtil {
130
130
  * snmpV3* columns (the current storage), falling back to the deprecated
131
131
  * snmpV3Auth JSON column so devices created before the columns existed keep
132
132
  * working. Returns undefined when no v3 username is configured.
133
+ *
134
+ * The protocol columns are passed through as stored, on purpose. It is
135
+ * tempting to validate them here with SnmpSecurityLevelUtil /
136
+ * SnmpAuthProtocolUtil / SnmpPrivProtocolUtil, but this runs server-side
137
+ * inside the probe's monitor-list request, and that request claims its
138
+ * monitors — advancing nextPingAt — before hydration runs. A throw here
139
+ * would 500 the whole batch, so one malformed row would stall up to a
140
+ * hundred unrelated monitors of every type, every cycle, with nothing
141
+ * recorded against them.
142
+ *
143
+ * The probe validates instead, in SnmpMonitor.buildV3User, where a bad value
144
+ * fails exactly one monitor and shows up as its failure cause. Parsing here
145
+ * would defeat that by folding an unreadable value into undefined, which the
146
+ * probe cannot tell from "never configured" — and would therefore poll with
147
+ * a silently defaulted algorithm.
133
148
  */
134
149
  private static buildSnmpV3Auth(
135
150
  device: NetworkDevice,
@@ -1,4 +1,5 @@
1
1
  import Monitor from "../../../Models/DatabaseModels/Monitor";
2
+ import NetworkDevice from "../../../Models/DatabaseModels/NetworkDevice";
2
3
  import NetworkInterface from "../../../Models/DatabaseModels/NetworkInterface";
3
4
  import NetworkDeviceService from "../../Services/NetworkDeviceService";
4
5
  import NetworkInterfaceService from "../../Services/NetworkInterfaceService";
@@ -6,6 +7,10 @@ import LIMIT_MAX from "../../../Types/Database/LimitMax";
6
7
  import MonitorStep from "../../../Types/Monitor/MonitorStep";
7
8
  import SnmpInterface from "../../../Types/Monitor/SnmpMonitor/SnmpInterface";
8
9
  import LldpNeighbor from "../../../Types/Monitor/SnmpMonitor/LldpNeighbor";
10
+ import CdpNeighbor from "../../../Types/Monitor/SnmpMonitor/CdpNeighbor";
11
+ import SnmpSystemInfo from "../../../Types/Monitor/SnmpMonitor/SnmpSystemInfo";
12
+ import SnmpEntityInfo from "../../../Types/Monitor/SnmpMonitor/SnmpEntityInfo";
13
+ import SnmpVendorTemplateUtil from "../../../Types/Monitor/SnmpMonitor/SnmpVendorTemplate";
9
14
  import ProbeMonitorResponse from "../../../Types/Probe/ProbeMonitorResponse";
10
15
  import ObjectID from "../../../Types/ObjectID";
11
16
  import OneUptimeDate from "../../../Types/Date";
@@ -41,21 +46,63 @@ export default class NetworkInventoryUtil {
41
46
  }
42
47
 
43
48
  const deviceId: ObjectID = new ObjectID(deviceIdAsString);
49
+
50
+ /*
51
+ * The device id is read from the monitor's step JSON, which a user can
52
+ * set to any UUID through the Monitor API (the dashboard dropdown is
53
+ * scoped, but the API is not). Confirm the device actually belongs to
54
+ * this monitor's project before writing anything with isRoot — without
55
+ * this guard a crafted step could point at another project's device and
56
+ * overwrite its inventory (or spawn interfaces under it).
57
+ */
58
+ const ownedDevice: NetworkDevice | null =
59
+ await NetworkDeviceService.findOneBy({
60
+ query: {
61
+ _id: deviceId,
62
+ projectId: data.monitor.projectId,
63
+ },
64
+ select: {
65
+ _id: true,
66
+ },
67
+ props: {
68
+ isRoot: true,
69
+ },
70
+ });
71
+
72
+ if (!ownedDevice) {
73
+ return;
74
+ }
75
+
44
76
  const walkedInterfaces: Array<SnmpInterface> =
45
77
  data.dataToProcess.snmpResponse?.interfaces || [];
46
- const systemInfo:
47
- | { sysDescr?: string | undefined; sysName?: string | undefined }
48
- | undefined = data.dataToProcess.snmpResponse?.systemInfo;
78
+ const systemInfo: SnmpSystemInfo | undefined =
79
+ data.dataToProcess.snmpResponse?.systemInfo;
80
+ const entityInfo: SnmpEntityInfo | undefined =
81
+ data.dataToProcess.snmpResponse?.entityInfo;
49
82
  const lldpNeighbors: Array<LldpNeighbor> | undefined =
50
83
  data.dataToProcess.snmpResponse?.lldpNeighbors;
84
+ const cdpNeighbors: Array<CdpNeighbor> | undefined =
85
+ data.dataToProcess.snmpResponse?.cdpNeighbors;
51
86
 
52
87
  const now: Date = OneUptimeDate.getCurrentDate();
53
88
 
89
+ /*
90
+ * lastSeenAt is "last time the device actually answered", not "last time
91
+ * we tried": the device list's status pill and the topology map both
92
+ * derive up/down from its freshness, so bumping it on a failed poll
93
+ * would paint an unreachable device green. A poll where the probe could
94
+ * not reach the device reports isOnline === false; treat anything else
95
+ * (reachable, or a monitor type that reports no reachability) as seen.
96
+ */
97
+ const isDeviceReachable: boolean = data.dataToProcess.isOnline !== false;
98
+
54
99
  try {
55
100
  // --- Device enrichment + cached counts ---
56
- const deviceUpdate: Record<string, unknown> = {
57
- lastSeenAt: now,
58
- };
101
+ const deviceUpdate: Record<string, unknown> = {};
102
+
103
+ if (isDeviceReachable) {
104
+ deviceUpdate["lastSeenAt"] = now;
105
+ }
59
106
 
60
107
  if (systemInfo?.sysDescr) {
61
108
  deviceUpdate["sysDescr"] = systemInfo.sysDescr.substring(0, 500);
@@ -63,15 +110,66 @@ export default class NetworkInventoryUtil {
63
110
  if (systemInfo?.sysName) {
64
111
  deviceUpdate["sysName"] = systemInfo.sysName.substring(0, 100);
65
112
  }
113
+ if (systemInfo?.sysObjectId) {
114
+ deviceUpdate["sysObjectId"] = systemInfo.sysObjectId.substring(0, 100);
115
+ }
116
+ if (systemInfo?.sysLocation) {
117
+ deviceUpdate["sysLocation"] = systemInfo.sysLocation.substring(0, 100);
118
+ }
119
+ if (systemInfo?.sysContact) {
120
+ deviceUpdate["sysContact"] = systemInfo.sysContact.substring(0, 100);
121
+ }
122
+ if (systemInfo?.sysUpTimeSeconds !== undefined) {
123
+ deviceUpdate["lastRebootedAt"] = new Date(
124
+ now.getTime() - systemInfo.sysUpTimeSeconds * 1000,
125
+ );
126
+ }
127
+
128
+ /*
129
+ * Vendor: ENTITY-MIB manufacturer when the device implements it,
130
+ * otherwise fingerprinted from the sysObjectID enterprise arc.
131
+ */
132
+ const vendor: string | undefined =
133
+ entityInfo?.manufacturer ||
134
+ SnmpVendorTemplateUtil.getVendorNameBySysObjectId(
135
+ systemInfo?.sysObjectId,
136
+ );
137
+ if (vendor) {
138
+ deviceUpdate["vendor"] = vendor.substring(0, 100);
139
+ }
140
+ if (entityInfo?.model) {
141
+ deviceUpdate["deviceModel"] = entityInfo.model.substring(0, 100);
142
+ }
143
+ if (entityInfo?.serialNumber) {
144
+ deviceUpdate["serialNumber"] = entityInfo.serialNumber.substring(
145
+ 0,
146
+ 100,
147
+ );
148
+ }
149
+ if (entityInfo?.firmwareVersion) {
150
+ deviceUpdate["firmwareVersion"] = entityInfo.firmwareVersion.substring(
151
+ 0,
152
+ 100,
153
+ );
154
+ }
155
+ if (entityInfo?.softwareVersion) {
156
+ deviceUpdate["softwareVersion"] = entityInfo.softwareVersion.substring(
157
+ 0,
158
+ 100,
159
+ );
160
+ }
66
161
 
67
162
  /*
68
163
  * Store the LLDP snapshot (capped) whenever the walk ran, even if it
69
164
  * found nothing — clearing stale neighbors is as important as adding
70
- * new ones for keeping the topology accurate.
165
+ * new ones for keeping the topology accurate. Same for CDP.
71
166
  */
72
167
  if (lldpNeighbors !== undefined) {
73
168
  deviceUpdate["lldpNeighbors"] = lldpNeighbors.slice(0, 256);
74
169
  }
170
+ if (cdpNeighbors !== undefined) {
171
+ deviceUpdate["cdpNeighbors"] = cdpNeighbors.slice(0, 256);
172
+ }
75
173
 
76
174
  if (walkedInterfaces.length > 0) {
77
175
  deviceUpdate["interfacesTotal"] = walkedInterfaces.length;
@@ -87,13 +185,16 @@ export default class NetworkInventoryUtil {
87
185
  ).length;
88
186
  }
89
187
 
90
- await NetworkDeviceService.updateOneById({
91
- id: deviceId,
92
- data: deviceUpdate as any,
93
- props: {
94
- isRoot: true,
95
- },
96
- });
188
+ // An unreachable poll with no walk data leaves nothing worth writing.
189
+ if (Object.keys(deviceUpdate).length > 0) {
190
+ await NetworkDeviceService.updateOneById({
191
+ id: deviceId,
192
+ data: deviceUpdate as any,
193
+ props: {
194
+ isRoot: true,
195
+ },
196
+ });
197
+ }
97
198
 
98
199
  if (walkedInterfaces.length === 0) {
99
200
  return;
@@ -138,6 +239,10 @@ export default class NetworkInventoryUtil {
138
239
  const interfaceData: Record<string, unknown> = {
139
240
  name: (walked.name || "").substring(0, 100),
140
241
  alias: walked.alias ? walked.alias.substring(0, 100) : null,
242
+ macAddress: walked.macAddress
243
+ ? walked.macAddress.substring(0, 100)
244
+ : null,
245
+ interfaceType: walked.interfaceType ?? null,
141
246
  isOperationallyUp: walked.isOperationallyUp,
142
247
  isAdministrativelyUp: walked.isAdministrativelyUp,
143
248
  speedInMbps:
@@ -174,6 +279,12 @@ export default class NetworkInventoryUtil {
174
279
  if (walked.alias) {
175
280
  newInterface.alias = walked.alias.substring(0, 100);
176
281
  }
282
+ if (walked.macAddress) {
283
+ newInterface.macAddress = walked.macAddress.substring(0, 100);
284
+ }
285
+ if (walked.interfaceType !== undefined) {
286
+ newInterface.interfaceType = walked.interfaceType;
287
+ }
177
288
  newInterface.isMonitored = true;
178
289
  newInterface.isOperationallyUp = walked.isOperationallyUp;
179
290
  newInterface.isAdministrativelyUp = walked.isAdministrativelyUp;