@oneuptime/common 11.6.0 → 11.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (427) hide show
  1. package/Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel.ts +41 -24
  2. package/Models/AnalyticsModels/Index.ts +4 -0
  3. package/Models/AnalyticsModels/KubernetesCostAllocation.ts +842 -0
  4. package/Models/AnalyticsModels/MetricBaselineHourly.ts +2 -0
  5. package/Models/AnalyticsModels/MetricItemAggMV1m.ts +5 -2
  6. package/Models/AnalyticsModels/MetricItemAggMV1mByContainer.ts +5 -2
  7. package/Models/AnalyticsModels/MetricItemAggMV1mByHostV2.ts +5 -2
  8. package/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.ts +5 -2
  9. package/Models/AnalyticsModels/MetricItemAggMV1mByService.ts +5 -2
  10. package/Models/AnalyticsModels/NetworkFlow.ts +54 -0
  11. package/Models/AnalyticsModels/SloHistory.ts +240 -0
  12. package/Models/DatabaseModels/Index.ts +20 -0
  13. package/Models/DatabaseModels/NetworkDevice.ts +453 -6
  14. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +7 -6
  15. package/Models/DatabaseModels/NetworkEndpoint.ts +753 -0
  16. package/Models/DatabaseModels/NetworkSite.ts +1155 -0
  17. package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +517 -0
  18. package/Models/DatabaseModels/NetworkSiteLink.ts +611 -0
  19. package/Models/DatabaseModels/NetworkSiteStatusTimeline.ts +520 -0
  20. package/Models/DatabaseModels/NetworkSiteType.ts +499 -0
  21. package/Models/DatabaseModels/ServiceLevelObjective.ts +1106 -0
  22. package/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.ts +762 -0
  23. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.ts +444 -0
  24. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.ts +443 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.ts +359 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.ts +48 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.ts +65 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.ts +88 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.ts +391 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  31. package/Server/Services/AnalyticsDatabaseService.ts +38 -10
  32. package/Server/Services/Index.ts +24 -0
  33. package/Server/Services/KubernetesCostAllocationService.ts +14 -0
  34. package/Server/Services/MetricService.ts +21 -2
  35. package/Server/Services/MonitorService.ts +22 -0
  36. package/Server/Services/NetworkDeviceService.ts +438 -2
  37. package/Server/Services/NetworkEndpointService.ts +414 -0
  38. package/Server/Services/NetworkSiteAssignmentRuleService.ts +98 -0
  39. package/Server/Services/NetworkSiteLinkService.ts +10 -0
  40. package/Server/Services/NetworkSiteService.ts +1254 -0
  41. package/Server/Services/NetworkSiteStatusTimelineService.ts +10 -0
  42. package/Server/Services/NetworkSiteTypeService.ts +10 -0
  43. package/Server/Services/ProjectService.ts +122 -2
  44. package/Server/Services/ServiceLevelObjectiveBurnRateRuleService.ts +457 -0
  45. package/Server/Services/ServiceLevelObjectiveOwnerTeamService.ts +10 -0
  46. package/Server/Services/ServiceLevelObjectiveOwnerUserService.ts +10 -0
  47. package/Server/Services/ServiceLevelObjectiveService.ts +677 -0
  48. package/Server/Services/SloHistoryService.ts +101 -0
  49. package/Server/Services/UserNotificationSettingService.ts +37 -0
  50. package/Server/Types/AnalyticsDatabase/AggregateBy.ts +9 -0
  51. package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +15 -0
  52. package/Server/Utils/AnalyticsDatabase/Statement.ts +39 -3
  53. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +128 -52
  54. package/Server/Utils/Memory.ts +9 -1
  55. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +190 -12
  56. package/Server/Utils/Monitor/Data/OuiVendors.json +6920 -0
  57. package/Server/Utils/Monitor/DnsResolutionCache.ts +129 -0
  58. package/Server/Utils/Monitor/MonitorResource.ts +4 -30
  59. package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +214 -39
  60. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +343 -0
  61. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +251 -0
  62. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +176 -142
  63. package/Server/Utils/Monitor/OuiLookupUtil.ts +49 -0
  64. package/Server/Utils/Monitor/SnmpInterfaceRateUtil.ts +17 -13
  65. package/Server/Utils/WhatsAppTemplateUtil.ts +7 -3
  66. package/Tests/Models/AnalyticsModels/AnalyticsBaseModel.test.ts +122 -0
  67. package/Tests/Models/AnalyticsModels/KubernetesCostAllocation.test.ts +135 -0
  68. package/Tests/Models/NetworkSiteHierarchy.test.ts +134 -0
  69. package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +239 -0
  70. package/Tests/Server/Services/KubernetesCostAllocationAggregate.test.ts +338 -0
  71. package/Tests/Server/Services/MetricServiceAggregate.test.ts +142 -0
  72. package/Tests/Server/Services/NetworkDeviceSiteAssignment.test.ts +484 -0
  73. package/Tests/Server/Services/NetworkEndpointServiceUpsert.test.ts +686 -0
  74. package/Tests/Server/Services/NetworkSiteAssignmentRuleService.test.ts +185 -0
  75. package/Tests/Server/Services/NetworkSiteService.test.ts +1354 -0
  76. package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleService.test.ts +1313 -0
  77. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +1988 -0
  78. package/Tests/Server/Utils/AnalyticsDatabase/ClusterAwareSchema.test.ts +164 -3
  79. package/Tests/Server/Utils/AnalyticsDatabase/Statement.test.ts +22 -0
  80. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +503 -0
  81. package/Tests/Server/Utils/Encryption.test.ts +70 -0
  82. package/Tests/Server/Utils/FileAttachmentMarkdownUtil.test.ts +225 -0
  83. package/Tests/Server/Utils/JsonWebToken.test.ts +175 -0
  84. package/Tests/Server/Utils/LocalFile.test.ts +258 -0
  85. package/Tests/Server/Utils/Memory.test.ts +213 -0
  86. package/Tests/Server/Utils/Monitor/Criteria/LogMonitorCriteria.test.ts +30 -0
  87. package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +385 -0
  88. package/Tests/Server/Utils/Monitor/DnsResolutionCache.test.ts +194 -0
  89. package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +155 -0
  90. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +600 -0
  91. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +151 -124
  92. package/Tests/Server/Utils/Monitor/SnmpInterfaceRateUtil.test.ts +496 -0
  93. package/Tests/Server/Utils/MonitorCriteriaDataExtractor.test.ts +175 -0
  94. package/Tests/Server/Utils/MonitorCriteriaMessageFormatter.test.ts +282 -0
  95. package/Tests/Server/Utils/OuiLookupUtil.test.ts +59 -0
  96. package/Tests/Server/Utils/SeriesResourceLabels.test.ts +117 -0
  97. package/Tests/Server/Utils/StackTraceParser.test.ts +370 -0
  98. package/Tests/Server/Utils/Stream.test.ts +87 -0
  99. package/Tests/Server/Utils/ValidateGlobalProviderProjectTeams.test.ts +221 -0
  100. package/Tests/Server/Utils/WhatsAppTemplateUtil.test.ts +199 -0
  101. package/Tests/Types/Database/CompareOperatorWireSerialization.test.ts +33 -0
  102. package/Tests/Types/Email.test.ts +198 -0
  103. package/Tests/Types/HashCode.test.ts +41 -0
  104. package/Tests/Types/Kubernetes/KubernetesObjectParser.test.ts +177 -0
  105. package/Tests/Types/Log/LogQueryParser.test.ts +186 -0
  106. package/Tests/Types/Log/LogQueryToFilter.test.ts +111 -0
  107. package/Tests/Types/Monitor/MonitorStepNetworkDeviceMonitor.test.ts +141 -1
  108. package/Tests/Types/Monitor/MonitorType.test.ts +59 -1
  109. package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +97 -0
  110. package/Tests/Types/Monitor/SnmpEndpointDiscovery.test.ts +151 -0
  111. package/Tests/Types/Monitor/SnmpVendorTemplate.test.ts +110 -6
  112. package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +129 -0
  113. package/Tests/Types/SerializableObjectDictionary.test.ts +166 -0
  114. package/Tests/Types/Time/RangeStartAndEndDateTime.test.ts +98 -0
  115. package/Tests/Types/WebsiteRequest.test.ts +230 -0
  116. package/Tests/UI/Components/EntityFilterRoundTrip.test.tsx +103 -0
  117. package/Tests/UI/Components/ModelTable/BaseModelTableUrlState.test.tsx +612 -0
  118. package/Tests/UI/Components/ModelTable/FilterDataToQuery.test.ts +275 -0
  119. package/Tests/UI/Utils/LogExport.test.ts +159 -0
  120. package/Tests/UI/Utils/Navigation.test.ts +183 -0
  121. package/Tests/UI/Utils/TableFilterUrlState.test.ts +539 -0
  122. package/Tests/UI/Utils/TableViewUrlState.test.ts +272 -0
  123. package/Tests/Utils/Base64.test.ts +51 -0
  124. package/Tests/Utils/Boolean.test.ts +76 -0
  125. package/Tests/Utils/Crypto.test.ts +48 -0
  126. package/Tests/Utils/Dashboard/DashboardSloComponent.test.ts +259 -0
  127. package/Tests/Utils/Dashboard/ModelQueryVariableInterpolation.test.ts +162 -0
  128. package/Tests/Utils/Dashboard/VariableInterpolation.test.ts +197 -0
  129. package/Tests/Utils/Enum.test.ts +54 -0
  130. package/Tests/Utils/IpCanonicalUtil.test.ts +85 -0
  131. package/Tests/Utils/Metrics/MetricSeriesFingerprint.test.ts +160 -0
  132. package/Tests/Utils/Monitor/EndpointAttachmentUtil.test.ts +836 -0
  133. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +218 -0
  134. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +447 -0
  135. package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +440 -0
  136. package/Tests/Utils/NetworkSite/MaterializedPathUtil.test.ts +205 -0
  137. package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +221 -0
  138. package/Tests/Utils/NetworkSite/SiteUptimeUtil.test.ts +283 -0
  139. package/Tests/Utils/ObjectUtil.test.ts +30 -0
  140. package/Tests/Utils/Slo/SloStatusColor.test.ts +89 -0
  141. package/Tests/Utils/Slo/SloUtil.test.ts +1980 -0
  142. package/Tests/Utils/Slo/SloWidgetFormat.test.ts +605 -0
  143. package/Tests/Utils/TechStack.test.ts +50 -0
  144. package/Tests/Utils/Traces/CriticalPath.test.ts +178 -0
  145. package/Tests/Utils/ValueFormatter.test.ts +305 -0
  146. package/Types/AnalyticsDatabase/AnalyticsTableName.ts +10 -0
  147. package/Types/AnalyticsDatabase/TableColumn.ts +23 -0
  148. package/Types/BaseDatabase/EqualTo.ts +9 -1
  149. package/Types/BaseDatabase/EqualToOrNull.ts +9 -1
  150. package/Types/BaseDatabase/NotEqual.ts +9 -1
  151. package/Types/Dashboard/DashboardComponentType.ts +1 -0
  152. package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
  153. package/Types/Dashboard/DashboardComponents/DashboardSloComponent.ts +42 -0
  154. package/Types/Dashboard/DashboardTemplates.ts +214 -0
  155. package/Types/Email/EmailTemplateType.ts +2 -0
  156. package/Types/Kubernetes/KubernetesCostIngest.ts +79 -0
  157. package/Types/Monitor/CriteriaFilter.ts +9 -0
  158. package/Types/Monitor/MonitorStep.ts +5 -8
  159. package/Types/Monitor/MonitorStepNetworkDeviceMonitor.ts +27 -5
  160. package/Types/Monitor/MonitorType.ts +15 -5
  161. package/Types/Monitor/SnmpMonitor/ArpEntry.ts +14 -0
  162. package/Types/Monitor/SnmpMonitor/FdbEntry.ts +18 -0
  163. package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +10 -3
  164. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +31 -5
  165. package/Types/Monitor/SnmpMonitor/SnmpMonitorResponse.ts +12 -0
  166. package/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.ts +231 -3
  167. package/Types/NetworkSite/DefaultNetworkSiteType.ts +20 -0
  168. package/Types/NotificationSetting/NotificationSettingEventType.ts +4 -0
  169. package/Types/Permission.ts +449 -0
  170. package/Types/ServiceLevelObjective/SliType.ts +6 -0
  171. package/Types/ServiceLevelObjective/SloMultiMonitorMode.ts +6 -0
  172. package/Types/ServiceLevelObjective/SloStatus.ts +9 -0
  173. package/Types/ServiceLevelObjective/SloWindowType.ts +6 -0
  174. package/Types/Telemetry/ServiceType.ts +1 -0
  175. package/UI/Components/Filters/EntityFilter.tsx +16 -0
  176. package/UI/Components/Filters/FilterViewer.tsx +22 -5
  177. package/UI/Components/List/List.tsx +8 -0
  178. package/UI/Components/ModelTable/BaseModelTable.tsx +309 -106
  179. package/UI/Components/ModelTable/FilterDataToQuery.ts +172 -0
  180. package/UI/Components/Navbar/NavBar.tsx +16 -2
  181. package/UI/Components/Navbar/NavBarMenuModal.tsx +3 -3
  182. package/UI/Utils/Navigation.ts +10 -0
  183. package/UI/Utils/TableFilterUrlState.ts +204 -17
  184. package/UI/Utils/TableViewUrlState.ts +165 -0
  185. package/Utils/Dashboard/Components/DashboardSloComponent.ts +114 -0
  186. package/Utils/Dashboard/Components/Index.ts +7 -0
  187. package/Utils/IpCanonicalUtil.ts +134 -0
  188. package/Utils/Monitor/EndpointAttachmentUtil.ts +508 -0
  189. package/Utils/Monitor/NetworkTopologyUtil.ts +157 -5
  190. package/Utils/NetworkSite/CidrMatchUtil.ts +296 -0
  191. package/Utils/NetworkSite/MaterializedPathUtil.ts +115 -0
  192. package/Utils/NetworkSite/SiteStatusRollupUtil.ts +97 -0
  193. package/Utils/NetworkSite/SiteUptimeUtil.ts +111 -0
  194. package/Utils/Slo/SloStatusColor.ts +54 -0
  195. package/Utils/Slo/SloUtil.ts +637 -0
  196. package/Utils/Slo/SloWidgetFormat.ts +383 -0
  197. package/build/dist/Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel.js +25 -20
  198. package/build/dist/Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel.js.map +1 -1
  199. package/build/dist/Models/AnalyticsModels/Index.js +4 -0
  200. package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
  201. package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js +713 -0
  202. package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js.map +1 -0
  203. package/build/dist/Models/AnalyticsModels/MetricBaselineHourly.js +2 -0
  204. package/build/dist/Models/AnalyticsModels/MetricBaselineHourly.js.map +1 -1
  205. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1m.js +5 -2
  206. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1m.js.map +1 -1
  207. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByContainer.js +5 -2
  208. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByContainer.js.map +1 -1
  209. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByHostV2.js +5 -2
  210. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByHostV2.js.map +1 -1
  211. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.js +5 -2
  212. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.js.map +1 -1
  213. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByService.js +5 -2
  214. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByService.js.map +1 -1
  215. package/build/dist/Models/AnalyticsModels/NetworkFlow.js +44 -0
  216. package/build/dist/Models/AnalyticsModels/NetworkFlow.js.map +1 -1
  217. package/build/dist/Models/AnalyticsModels/SloHistory.js +215 -0
  218. package/build/dist/Models/AnalyticsModels/SloHistory.js.map +1 -0
  219. package/build/dist/Models/DatabaseModels/Index.js +20 -0
  220. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  221. package/build/dist/Models/DatabaseModels/NetworkDevice.js +458 -6
  222. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  223. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +0 -6
  224. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  225. package/build/dist/Models/DatabaseModels/NetworkEndpoint.js +779 -0
  226. package/build/dist/Models/DatabaseModels/NetworkEndpoint.js.map +1 -0
  227. package/build/dist/Models/DatabaseModels/NetworkSite.js +1180 -0
  228. package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -0
  229. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +534 -0
  230. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -0
  231. package/build/dist/Models/DatabaseModels/NetworkSiteLink.js +629 -0
  232. package/build/dist/Models/DatabaseModels/NetworkSiteLink.js.map +1 -0
  233. package/build/dist/Models/DatabaseModels/NetworkSiteStatusTimeline.js +538 -0
  234. package/build/dist/Models/DatabaseModels/NetworkSiteStatusTimeline.js.map +1 -0
  235. package/build/dist/Models/DatabaseModels/NetworkSiteType.js +522 -0
  236. package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -0
  237. package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js +1124 -0
  238. package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js.map +1 -0
  239. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js +769 -0
  240. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js.map +1 -0
  241. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js +460 -0
  242. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js.map +1 -0
  243. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js +459 -0
  244. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js.map +1 -0
  245. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.js +130 -0
  246. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.js.map +1 -0
  247. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.js +31 -0
  248. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.js.map +1 -0
  249. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.js +36 -0
  250. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.js.map +1 -0
  251. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.js +49 -0
  252. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.js.map +1 -0
  253. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.js +140 -0
  254. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.js.map +1 -0
  255. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  256. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  257. package/build/dist/Server/Services/AnalyticsDatabaseService.js +32 -7
  258. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  259. package/build/dist/Server/Services/Index.js +24 -0
  260. package/build/dist/Server/Services/Index.js.map +1 -1
  261. package/build/dist/Server/Services/KubernetesCostAllocationService.js +12 -0
  262. package/build/dist/Server/Services/KubernetesCostAllocationService.js.map +1 -0
  263. package/build/dist/Server/Services/MetricService.js +21 -3
  264. package/build/dist/Server/Services/MetricService.js.map +1 -1
  265. package/build/dist/Server/Services/MonitorService.js +19 -0
  266. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  267. package/build/dist/Server/Services/NetworkDeviceService.js +351 -1
  268. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  269. package/build/dist/Server/Services/NetworkEndpointService.js +319 -0
  270. package/build/dist/Server/Services/NetworkEndpointService.js.map +1 -0
  271. package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js +90 -0
  272. package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js.map +1 -0
  273. package/build/dist/Server/Services/NetworkSiteLinkService.js +9 -0
  274. package/build/dist/Server/Services/NetworkSiteLinkService.js.map +1 -0
  275. package/build/dist/Server/Services/NetworkSiteService.js +1038 -0
  276. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -0
  277. package/build/dist/Server/Services/NetworkSiteStatusTimelineService.js +9 -0
  278. package/build/dist/Server/Services/NetworkSiteStatusTimelineService.js.map +1 -0
  279. package/build/dist/Server/Services/NetworkSiteTypeService.js +9 -0
  280. package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -0
  281. package/build/dist/Server/Services/ProjectService.js +98 -2
  282. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  283. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js +358 -0
  284. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js.map +1 -0
  285. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js +9 -0
  286. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js.map +1 -0
  287. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js +9 -0
  288. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js.map +1 -0
  289. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +582 -0
  290. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -0
  291. package/build/dist/Server/Services/SloHistoryService.js +77 -0
  292. package/build/dist/Server/Services/SloHistoryService.js.map +1 -0
  293. package/build/dist/Server/Services/UserNotificationSettingService.js +20 -0
  294. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  295. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js +9 -0
  296. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js.map +1 -1
  297. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +15 -0
  298. package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
  299. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js +31 -0
  300. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js.map +1 -1
  301. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +105 -52
  302. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  303. package/build/dist/Server/Utils/Memory.js +9 -1
  304. package/build/dist/Server/Utils/Memory.js.map +1 -1
  305. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +132 -10
  306. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  307. package/build/dist/Server/Utils/Monitor/Data/OuiVendors.json +6920 -0
  308. package/build/dist/Server/Utils/Monitor/DnsResolutionCache.js +77 -0
  309. package/build/dist/Server/Utils/Monitor/DnsResolutionCache.js.map +1 -0
  310. package/build/dist/Server/Utils/Monitor/MonitorResource.js +21 -41
  311. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  312. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +152 -40
  313. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
  314. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +262 -0
  315. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -0
  316. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +201 -0
  317. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -0
  318. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +152 -120
  319. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  320. package/build/dist/Server/Utils/Monitor/OuiLookupUtil.js +44 -0
  321. package/build/dist/Server/Utils/Monitor/OuiLookupUtil.js.map +1 -0
  322. package/build/dist/Server/Utils/Monitor/SnmpInterfaceRateUtil.js +10 -10
  323. package/build/dist/Server/Utils/Monitor/SnmpInterfaceRateUtil.js.map +1 -1
  324. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js +5 -0
  325. package/build/dist/Server/Utils/WhatsAppTemplateUtil.js.map +1 -1
  326. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +10 -0
  327. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
  328. package/build/dist/Types/AnalyticsDatabase/TableColumn.js +7 -0
  329. package/build/dist/Types/AnalyticsDatabase/TableColumn.js.map +1 -1
  330. package/build/dist/Types/BaseDatabase/EqualTo.js +9 -1
  331. package/build/dist/Types/BaseDatabase/EqualTo.js.map +1 -1
  332. package/build/dist/Types/BaseDatabase/EqualToOrNull.js +9 -1
  333. package/build/dist/Types/BaseDatabase/EqualToOrNull.js.map +1 -1
  334. package/build/dist/Types/BaseDatabase/NotEqual.js +9 -1
  335. package/build/dist/Types/BaseDatabase/NotEqual.js.map +1 -1
  336. package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
  337. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  338. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +1 -0
  339. package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
  340. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloComponent.js +23 -0
  341. package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloComponent.js.map +1 -0
  342. package/build/dist/Types/Dashboard/DashboardTemplates.js +205 -0
  343. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  344. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  345. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  346. package/build/dist/Types/Kubernetes/KubernetesCostIngest.js +21 -0
  347. package/build/dist/Types/Kubernetes/KubernetesCostIngest.js.map +1 -0
  348. package/build/dist/Types/Monitor/CriteriaFilter.js +1 -0
  349. package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
  350. package/build/dist/Types/Monitor/MonitorStep.js +5 -5
  351. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  352. package/build/dist/Types/Monitor/MonitorStepNetworkDeviceMonitor.js +8 -0
  353. package/build/dist/Types/Monitor/MonitorStepNetworkDeviceMonitor.js.map +1 -1
  354. package/build/dist/Types/Monitor/MonitorType.js +15 -5
  355. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  356. package/build/dist/Types/Monitor/SnmpMonitor/ArpEntry.js +2 -0
  357. package/build/dist/Types/Monitor/SnmpMonitor/ArpEntry.js.map +1 -0
  358. package/build/dist/Types/Monitor/SnmpMonitor/FdbEntry.js +2 -0
  359. package/build/dist/Types/Monitor/SnmpMonitor/FdbEntry.js.map +1 -0
  360. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +9 -3
  361. package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
  362. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js +217 -3
  363. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js.map +1 -1
  364. package/build/dist/Types/NetworkSite/DefaultNetworkSiteType.js +21 -0
  365. package/build/dist/Types/NetworkSite/DefaultNetworkSiteType.js.map +1 -0
  366. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +3 -0
  367. package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
  368. package/build/dist/Types/Permission.js +409 -0
  369. package/build/dist/Types/Permission.js.map +1 -1
  370. package/build/dist/Types/ServiceLevelObjective/SliType.js +7 -0
  371. package/build/dist/Types/ServiceLevelObjective/SliType.js.map +1 -0
  372. package/build/dist/Types/ServiceLevelObjective/SloMultiMonitorMode.js +7 -0
  373. package/build/dist/Types/ServiceLevelObjective/SloMultiMonitorMode.js.map +1 -0
  374. package/build/dist/Types/ServiceLevelObjective/SloStatus.js +10 -0
  375. package/build/dist/Types/ServiceLevelObjective/SloStatus.js.map +1 -0
  376. package/build/dist/Types/ServiceLevelObjective/SloWindowType.js +7 -0
  377. package/build/dist/Types/ServiceLevelObjective/SloWindowType.js.map +1 -0
  378. package/build/dist/Types/Telemetry/ServiceType.js +1 -0
  379. package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
  380. package/build/dist/UI/Components/Filters/EntityFilter.js +15 -0
  381. package/build/dist/UI/Components/Filters/EntityFilter.js.map +1 -1
  382. package/build/dist/UI/Components/Filters/FilterViewer.js +19 -4
  383. package/build/dist/UI/Components/Filters/FilterViewer.js.map +1 -1
  384. package/build/dist/UI/Components/List/List.js +1 -1
  385. package/build/dist/UI/Components/List/List.js.map +1 -1
  386. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +235 -89
  387. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  388. package/build/dist/UI/Components/ModelTable/FilterDataToQuery.js +96 -0
  389. package/build/dist/UI/Components/ModelTable/FilterDataToQuery.js.map +1 -0
  390. package/build/dist/UI/Components/Navbar/NavBar.js +14 -2
  391. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  392. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +3 -2
  393. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  394. package/build/dist/UI/Utils/Navigation.js +9 -0
  395. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  396. package/build/dist/UI/Utils/TableFilterUrlState.js +159 -15
  397. package/build/dist/UI/Utils/TableFilterUrlState.js.map +1 -1
  398. package/build/dist/UI/Utils/TableViewUrlState.js +103 -0
  399. package/build/dist/UI/Utils/TableViewUrlState.js.map +1 -0
  400. package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js +93 -0
  401. package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js.map +1 -0
  402. package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
  403. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  404. package/build/dist/Utils/IpCanonicalUtil.js +110 -0
  405. package/build/dist/Utils/IpCanonicalUtil.js.map +1 -0
  406. package/build/dist/Utils/Monitor/EndpointAttachmentUtil.js +311 -0
  407. package/build/dist/Utils/Monitor/EndpointAttachmentUtil.js.map +1 -0
  408. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +98 -5
  409. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  410. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +222 -0
  411. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -0
  412. package/build/dist/Utils/NetworkSite/MaterializedPathUtil.js +89 -0
  413. package/build/dist/Utils/NetworkSite/MaterializedPathUtil.js.map +1 -0
  414. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +60 -0
  415. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -0
  416. package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js +76 -0
  417. package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js.map +1 -0
  418. package/build/dist/Utils/Slo/SloStatusColor.js +18 -0
  419. package/build/dist/Utils/Slo/SloStatusColor.js.map +1 -0
  420. package/build/dist/Utils/Slo/SloUtil.js +393 -0
  421. package/build/dist/Utils/Slo/SloUtil.js.map +1 -0
  422. package/build/dist/Utils/Slo/SloWidgetFormat.js +174 -0
  423. package/build/dist/Utils/Slo/SloWidgetFormat.js.map +1 -0
  424. package/package.json +2 -2
  425. package/Types/Dashboard/DashboardComponents/Index.ts +0 -7
  426. package/build/dist/Types/Dashboard/DashboardComponents/Index.js +0 -8
  427. package/build/dist/Types/Dashboard/DashboardComponents/Index.js.map +0 -1
@@ -0,0 +1,186 @@
1
+ import parseLogQuery, {
2
+ FilterOperator,
3
+ ParsedToken,
4
+ TokenType,
5
+ tokensToDisplayString,
6
+ } from "../../../Types/Log/LogQueryParser";
7
+
8
+ describe("LogQueryParser", () => {
9
+ describe("parseLogQuery - empty and free text", () => {
10
+ test("returns an empty array for empty / whitespace input", () => {
11
+ expect(parseLogQuery("")).toEqual([]);
12
+ expect(parseLogQuery(" ")).toEqual([]);
13
+ });
14
+
15
+ test("combines free text words into a single Contains token", () => {
16
+ const tokens: Array<ParsedToken> = parseLogQuery("connection refused");
17
+ expect(tokens).toHaveLength(1);
18
+ expect(tokens[0]).toMatchObject({
19
+ type: TokenType.FreeText,
20
+ operator: FilterOperator.Contains,
21
+ value: "connection refused",
22
+ negated: false,
23
+ });
24
+ });
25
+
26
+ test("strips quotes from a quoted phrase", () => {
27
+ const tokens: Array<ParsedToken> = parseLogQuery('"connection refused"');
28
+ expect(tokens).toHaveLength(1);
29
+ expect(tokens[0]!.value).toBe("connection refused");
30
+ expect(tokens[0]!.type).toBe(TokenType.FreeText);
31
+ });
32
+ });
33
+
34
+ describe("parseLogQuery - field filters and aliases", () => {
35
+ test("resolves the severity alias to severityText", () => {
36
+ const tokens: Array<ParsedToken> = parseLogQuery("severity:error");
37
+ expect(tokens[0]).toMatchObject({
38
+ type: TokenType.FieldFilter,
39
+ field: "severityText",
40
+ operator: FilterOperator.Equals,
41
+ value: "error",
42
+ negated: false,
43
+ });
44
+ });
45
+
46
+ test("resolves the service alias to primaryEntityId", () => {
47
+ expect(parseLogQuery("service:api")[0]!.field).toBe("primaryEntityId");
48
+ });
49
+
50
+ test("resolves level, message, and trace aliases", () => {
51
+ expect(parseLogQuery("level:warn")[0]!.field).toBe("severityText");
52
+ expect(parseLogQuery("message:hello")[0]!.field).toBe("body");
53
+ expect(parseLogQuery("trace:abc")[0]!.field).toBe("traceId");
54
+ });
55
+
56
+ test("keeps unknown field names as-is", () => {
57
+ expect(parseLogQuery("customfield:x")[0]!.field).toBe("customfield");
58
+ });
59
+ });
60
+
61
+ describe("parseLogQuery - attribute filters", () => {
62
+ test("parses @-prefixed attribute access", () => {
63
+ const tokens: Array<ParsedToken> = parseLogQuery("@http.status_code:500");
64
+ expect(tokens[0]).toMatchObject({
65
+ type: TokenType.AttributeFilter,
66
+ field: "http.status_code",
67
+ operator: FilterOperator.Equals,
68
+ value: "500",
69
+ });
70
+ });
71
+
72
+ test("does not run aliasing on attribute field names", () => {
73
+ // "service" is an alias for field filters but must stay literal as an attribute.
74
+ expect(parseLogQuery("@service:api")[0]!.field).toBe("service");
75
+ });
76
+ });
77
+
78
+ describe("parseLogQuery - negation", () => {
79
+ test("negated equals becomes NotEquals", () => {
80
+ const tokens: Array<ParsedToken> = parseLogQuery("-severity:debug");
81
+ expect(tokens[0]).toMatchObject({
82
+ field: "severityText",
83
+ operator: FilterOperator.NotEquals,
84
+ value: "debug",
85
+ negated: true,
86
+ });
87
+ });
88
+
89
+ test("negated attribute filter", () => {
90
+ const tokens: Array<ParsedToken> = parseLogQuery("-@http.method:GET");
91
+ expect(tokens[0]).toMatchObject({
92
+ type: TokenType.AttributeFilter,
93
+ field: "http.method",
94
+ operator: FilterOperator.NotEquals,
95
+ negated: true,
96
+ });
97
+ });
98
+ });
99
+
100
+ describe("parseLogQuery - operators", () => {
101
+ test("detects wildcard values", () => {
102
+ const tokens: Array<ParsedToken> = parseLogQuery("service:api-*");
103
+ expect(tokens[0]).toMatchObject({
104
+ operator: FilterOperator.Wildcard,
105
+ value: "api-*",
106
+ });
107
+ });
108
+
109
+ test("detects numeric comparison operators", () => {
110
+ expect(parseLogQuery("@duration:>1000")[0]).toMatchObject({
111
+ operator: FilterOperator.GreaterThan,
112
+ value: "1000",
113
+ });
114
+ expect(parseLogQuery("@duration:>=1000")[0]).toMatchObject({
115
+ operator: FilterOperator.GreaterThanOrEqual,
116
+ value: "1000",
117
+ });
118
+ expect(parseLogQuery("@duration:<50")[0]).toMatchObject({
119
+ operator: FilterOperator.LessThan,
120
+ value: "50",
121
+ });
122
+ expect(parseLogQuery("@duration:<=50")[0]).toMatchObject({
123
+ operator: FilterOperator.LessThanOrEqual,
124
+ value: "50",
125
+ });
126
+ });
127
+ });
128
+
129
+ describe("parseLogQuery - boolean keywords and mixed queries", () => {
130
+ test("skips bare AND/OR/NOT keywords", () => {
131
+ const tokens: Array<ParsedToken> = parseLogQuery(
132
+ "severity:error AND service:api",
133
+ );
134
+ expect(tokens).toHaveLength(2);
135
+ expect(tokens[0]!.field).toBe("severityText");
136
+ expect(tokens[1]!.field).toBe("primaryEntityId");
137
+ });
138
+
139
+ test("splits free text around a field filter", () => {
140
+ const tokens: Array<ParsedToken> = parseLogQuery(
141
+ "connection severity:error refused",
142
+ );
143
+ expect(tokens).toHaveLength(3);
144
+ expect(tokens[0]).toMatchObject({
145
+ type: TokenType.FreeText,
146
+ value: "connection",
147
+ });
148
+ expect(tokens[1]).toMatchObject({
149
+ type: TokenType.FieldFilter,
150
+ field: "severityText",
151
+ });
152
+ expect(tokens[2]).toMatchObject({
153
+ type: TokenType.FreeText,
154
+ value: "refused",
155
+ });
156
+ });
157
+
158
+ test("does not split a quoted phrase containing spaces", () => {
159
+ const tokens: Array<ParsedToken> = parseLogQuery(
160
+ '"connection refused" severity:error',
161
+ );
162
+ expect(tokens).toHaveLength(2);
163
+ expect(tokens[0]!.value).toBe("connection refused");
164
+ expect(tokens[1]!.field).toBe("severityText");
165
+ });
166
+
167
+ test("strips quotes from field values", () => {
168
+ const tokens: Array<ParsedToken> = parseLogQuery('message:"a b c"');
169
+ expect(tokens[0]!.value).toBe("a b c");
170
+ expect(tokens[0]!.field).toBe("body");
171
+ });
172
+ });
173
+
174
+ describe("tokensToDisplayString", () => {
175
+ test("rejoins tokens using their raw representation", () => {
176
+ const tokens: Array<ParsedToken> = parseLogQuery(
177
+ "severity:error service:api",
178
+ );
179
+ expect(tokensToDisplayString(tokens)).toBe("severity:error service:api");
180
+ });
181
+
182
+ test("returns an empty string for no tokens", () => {
183
+ expect(tokensToDisplayString([])).toBe("");
184
+ });
185
+ });
186
+ });
@@ -0,0 +1,111 @@
1
+ import GreaterThan from "../../../Types/BaseDatabase/GreaterThan";
2
+ import GreaterThanOrEqual from "../../../Types/BaseDatabase/GreaterThanOrEqual";
3
+ import LessThan from "../../../Types/BaseDatabase/LessThan";
4
+ import NotEqual from "../../../Types/BaseDatabase/NotEqual";
5
+ import Search from "../../../Types/BaseDatabase/Search";
6
+ import {
7
+ LogFilter,
8
+ queryStringToFilter,
9
+ } from "../../../Types/Log/LogQueryToFilter";
10
+ import { describe, expect, test } from "@jest/globals";
11
+
12
+ /*
13
+ * queryStringToFilter turns the log search bar's query string into a
14
+ * Query<Log>-shaped filter. It sits on top of the (separately tested)
15
+ * LogQueryParser, so these tests focus on the mapping layer: operator ->
16
+ * BaseDatabase value type, top-level vs @attribute routing, severity casing
17
+ * normalization, and free-text accumulation into body Search.
18
+ */
19
+
20
+ describe("queryStringToFilter - free text", () => {
21
+ test("empty query yields an empty filter", () => {
22
+ expect(queryStringToFilter("")).toEqual({});
23
+ });
24
+
25
+ test("bare words become a body Search", () => {
26
+ const filter: LogFilter = queryStringToFilter("connection refused");
27
+ expect(filter.body).toBeInstanceOf(Search);
28
+ expect((filter.body as Search<string>).toString()).toBe(
29
+ "connection refused",
30
+ );
31
+ });
32
+ });
33
+
34
+ describe("queryStringToFilter - top-level fields", () => {
35
+ test("severity:error normalizes to title-case Error as an equals match", () => {
36
+ const filter: LogFilter = queryStringToFilter("severity:error");
37
+ expect(filter.severityText).toBe("Error");
38
+ });
39
+
40
+ test("level:warn aliases to severityText and normalizes warn -> Warning", () => {
41
+ const filter: LogFilter = queryStringToFilter("level:warn");
42
+ expect(filter.severityText).toBe("Warning");
43
+ });
44
+
45
+ test("service:api maps to primaryEntityId", () => {
46
+ const filter: LogFilter = queryStringToFilter("service:api");
47
+ expect(filter.primaryEntityId).toBe("api");
48
+ });
49
+
50
+ test("negation produces a NotEqual with normalized severity", () => {
51
+ const filter: LogFilter = queryStringToFilter("-severity:debug");
52
+ expect(filter.severityText).toBeInstanceOf(NotEqual);
53
+ expect((filter.severityText as unknown as NotEqual<string>).value).toBe(
54
+ "Debug",
55
+ );
56
+ });
57
+
58
+ test("wildcard produces a Search with the asterisks stripped", () => {
59
+ const filter: LogFilter = queryStringToFilter("service:api-*");
60
+ expect(filter.primaryEntityId).toBeInstanceOf(Search);
61
+ expect(
62
+ (filter.primaryEntityId as unknown as Search<string>).toString(),
63
+ ).toBe("api-");
64
+ });
65
+ });
66
+
67
+ describe("queryStringToFilter - attribute fields", () => {
68
+ test("@http.status_code:500 lands under attributes as an equals string", () => {
69
+ const filter: LogFilter = queryStringToFilter("@http.status_code:500");
70
+ expect(filter.attributes).toEqual({ "http.status_code": "500" });
71
+ });
72
+
73
+ test("numeric comparison operators parse the value as a number", () => {
74
+ const gt: LogFilter = queryStringToFilter("@duration:>1000");
75
+ expect(gt.attributes!["duration"]).toBeInstanceOf(GreaterThan);
76
+ expect((gt.attributes!["duration"] as GreaterThan<number>).value).toBe(
77
+ 1000,
78
+ );
79
+
80
+ const gte: LogFilter = queryStringToFilter("@duration:>=1000");
81
+ expect(gte.attributes!["duration"]).toBeInstanceOf(GreaterThanOrEqual);
82
+
83
+ const lt: LogFilter = queryStringToFilter("@duration:<50");
84
+ expect(lt.attributes!["duration"]).toBeInstanceOf(LessThan);
85
+ expect((lt.attributes!["duration"] as LessThan<number>).value).toBe(50);
86
+ });
87
+
88
+ test("a non-numeric comparison value stays a string", () => {
89
+ const filter: LogFilter = queryStringToFilter("@version:>abc");
90
+ expect((filter.attributes!["version"] as GreaterThan<string>).value).toBe(
91
+ "abc",
92
+ );
93
+ });
94
+
95
+ test("negated attribute filter produces a NotEqual", () => {
96
+ const filter: LogFilter = queryStringToFilter("-@http.method:GET");
97
+ expect(filter.attributes!["http.method"]).toBeInstanceOf(NotEqual);
98
+ expect((filter.attributes!["http.method"] as NotEqual<string>).value).toBe(
99
+ "GET",
100
+ );
101
+ });
102
+ });
103
+
104
+ describe("queryStringToFilter - combinations", () => {
105
+ test("a field filter plus trailing free text populate distinct slots", () => {
106
+ const filter: LogFilter = queryStringToFilter("severity:error timeout");
107
+ expect(filter.severityText).toBe("Error");
108
+ expect(filter.body).toBeInstanceOf(Search);
109
+ expect((filter.body as Search<string>).toString()).toBe("timeout");
110
+ });
111
+ });
@@ -1,17 +1,44 @@
1
1
  import { JSONObject } from "../../../Types/JSON";
2
+ import MonitorStep from "../../../Types/Monitor/MonitorStep";
2
3
  import MonitorStepNetworkDeviceMonitor, {
3
4
  MonitorStepNetworkDeviceMonitorUtil,
4
5
  } from "../../../Types/Monitor/MonitorStepNetworkDeviceMonitor";
6
+ import MonitorType from "../../../Types/Monitor/MonitorType";
5
7
  import SnmpOid from "../../../Types/Monitor/SnmpMonitor/SnmpOid";
8
+ import ObjectID from "../../../Types/ObjectID";
9
+
10
+ const getNetworkDeviceMonitorStep: (
11
+ overrides?: Partial<MonitorStepNetworkDeviceMonitor>,
12
+ ) => MonitorStep = (
13
+ overrides: Partial<MonitorStepNetworkDeviceMonitor> = {},
14
+ ): MonitorStep => {
15
+ const id: ObjectID = ObjectID.generate();
16
+ const monitorStep: MonitorStep = MonitorStep.getDefaultMonitorStep({
17
+ monitorName: "Network device monitor",
18
+ monitorType: MonitorType.NetworkDevice,
19
+ onlineMonitorStatusId: id,
20
+ offlineMonitorStatusId: id,
21
+ defaultIncidentSeverityId: id,
22
+ defaultAlertSeverityId: id,
23
+ });
24
+
25
+ return monitorStep.setNetworkDeviceMonitor({
26
+ ...MonitorStepNetworkDeviceMonitorUtil.getDefault(),
27
+ networkDeviceId: "device-1",
28
+ ...overrides,
29
+ });
30
+ };
6
31
 
7
32
  describe("MonitorStepNetworkDeviceMonitorUtil", () => {
8
33
  describe("getDefault", () => {
9
- test("returns no device, interface monitoring on, and no oids", () => {
34
+ test("returns no device, interface monitoring on, endpoint collection OFF, and no oids", () => {
10
35
  const def: MonitorStepNetworkDeviceMonitor =
11
36
  MonitorStepNetworkDeviceMonitorUtil.getDefault();
12
37
 
13
38
  expect(def.networkDeviceId).toBeUndefined();
14
39
  expect(def.monitorInterfaces).toBe(true);
40
+ // Endpoint collection is strictly opt-in, so a new step starts off.
41
+ expect(def.collectEndpoints).toBe(false);
15
42
  expect(def.oids).toEqual([]);
16
43
  });
17
44
  });
@@ -22,6 +49,7 @@ describe("MonitorStepNetworkDeviceMonitorUtil", () => {
22
49
  MonitorStepNetworkDeviceMonitorUtil.fromJSON({
23
50
  networkDeviceId: "device-1",
24
51
  monitorInterfaces: false,
52
+ collectEndpoints: false,
25
53
  oids: [
26
54
  {
27
55
  oid: "1.3.6.1.2.1.1.1.0",
@@ -33,6 +61,7 @@ describe("MonitorStepNetworkDeviceMonitorUtil", () => {
33
61
 
34
62
  expect(monitor.networkDeviceId).toBe("device-1");
35
63
  expect(monitor.monitorInterfaces).toBe(false);
64
+ expect(monitor.collectEndpoints).toBe(false);
36
65
  expect(monitor.oids.length).toBe(1);
37
66
  expect(monitor.oids[0]!.oid).toBe("1.3.6.1.2.1.1.1.0");
38
67
  expect(monitor.oids[0]!.name).toBe("sysDescr");
@@ -58,6 +87,37 @@ describe("MonitorStepNetworkDeviceMonitorUtil", () => {
58
87
  ).toBe(false);
59
88
  });
60
89
 
90
+ test("defaults collectEndpoints to false unless it is explicitly true", () => {
91
+ // Missing -> false: steps saved before the flag existed stay opted out.
92
+ expect(
93
+ MonitorStepNetworkDeviceMonitorUtil.fromJSON({}).collectEndpoints,
94
+ ).toBe(false);
95
+ // Explicit true -> true: the only way to opt in.
96
+ expect(
97
+ MonitorStepNetworkDeviceMonitorUtil.fromJSON({
98
+ collectEndpoints: true,
99
+ }).collectEndpoints,
100
+ ).toBe(true);
101
+ // Explicit false -> false.
102
+ expect(
103
+ MonitorStepNetworkDeviceMonitorUtil.fromJSON({
104
+ collectEndpoints: false,
105
+ }).collectEndpoints,
106
+ ).toBe(false);
107
+ // null (a JSON round trip of undefined) -> false, not "not false".
108
+ expect(
109
+ MonitorStepNetworkDeviceMonitorUtil.fromJSON({
110
+ collectEndpoints: null,
111
+ }).collectEndpoints,
112
+ ).toBe(false);
113
+ // A truthy non-true value is NOT an opt-in.
114
+ expect(
115
+ MonitorStepNetworkDeviceMonitorUtil.fromJSON({
116
+ collectEndpoints: "true",
117
+ }).collectEndpoints,
118
+ ).toBe(false);
119
+ });
120
+
61
121
  test("coerces a missing networkDeviceId to undefined and missing oids to []", () => {
62
122
  const monitor: MonitorStepNetworkDeviceMonitor =
63
123
  MonitorStepNetworkDeviceMonitorUtil.fromJSON({});
@@ -85,6 +145,7 @@ describe("MonitorStepNetworkDeviceMonitorUtil", () => {
85
145
  const monitor: MonitorStepNetworkDeviceMonitor = {
86
146
  networkDeviceId: "device-42",
87
147
  monitorInterfaces: false,
148
+ collectEndpoints: false,
88
149
  oids: [{ oid: "1.2.3", name: "n", description: "d" }],
89
150
  };
90
151
 
@@ -93,10 +154,22 @@ describe("MonitorStepNetworkDeviceMonitorUtil", () => {
93
154
 
94
155
  expect(json["networkDeviceId"]).toBe("device-42");
95
156
  expect(json["monitorInterfaces"]).toBe(false);
157
+ expect(json["collectEndpoints"]).toBe(false);
96
158
  expect(json["oids"]).toEqual([
97
159
  { oid: "1.2.3", name: "n", description: "d" },
98
160
  ]);
99
161
  });
162
+
163
+ test("passes collectEndpoints through untouched (true stays true)", () => {
164
+ const json: JSONObject = MonitorStepNetworkDeviceMonitorUtil.toJSON({
165
+ networkDeviceId: undefined,
166
+ monitorInterfaces: true,
167
+ collectEndpoints: true,
168
+ oids: [],
169
+ });
170
+
171
+ expect(json["collectEndpoints"]).toBe(true);
172
+ });
100
173
  });
101
174
 
102
175
  describe("round trip", () => {
@@ -104,6 +177,7 @@ describe("MonitorStepNetworkDeviceMonitorUtil", () => {
104
177
  const original: MonitorStepNetworkDeviceMonitor = {
105
178
  networkDeviceId: "device-7",
106
179
  monitorInterfaces: false,
180
+ collectEndpoints: false,
107
181
  oids: [
108
182
  { oid: "1.3.6.1.2.1.1.1.0", name: "sysDescr", description: "desc" },
109
183
  {
@@ -134,6 +208,26 @@ describe("MonitorStepNetworkDeviceMonitorUtil", () => {
134
208
  expect(roundTripped).toEqual(def);
135
209
  });
136
210
 
211
+ test("a legacy step without collectEndpoints round-trips to endpoint collection OFF", () => {
212
+ // Steps saved before the flag existed serialize without it…
213
+ const legacy: MonitorStepNetworkDeviceMonitor = {
214
+ networkDeviceId: "device-legacy",
215
+ monitorInterfaces: true,
216
+ oids: [],
217
+ };
218
+
219
+ const roundTripped: MonitorStepNetworkDeviceMonitor =
220
+ MonitorStepNetworkDeviceMonitorUtil.fromJSON(
221
+ MonitorStepNetworkDeviceMonitorUtil.toJSON(legacy),
222
+ );
223
+
224
+ /*
225
+ * …and must deserialize opted OUT: an upgrade cannot silently enrol
226
+ * an existing monitor into extra SNMP walks and per-MAC writes.
227
+ */
228
+ expect(roundTripped.collectEndpoints).toBe(false);
229
+ });
230
+
137
231
  test("preserves oids with only an oid string across a round trip", () => {
138
232
  const original: MonitorStepNetworkDeviceMonitor = {
139
233
  networkDeviceId: undefined,
@@ -152,4 +246,50 @@ describe("MonitorStepNetworkDeviceMonitorUtil", () => {
152
246
  expect(oid.description).toBeUndefined();
153
247
  });
154
248
  });
249
+
250
+ /*
251
+ * Under device-owned polling a Network Device monitor is a pure alerting
252
+ * layer: WHAT to collect (interface walks, endpoint discovery, OIDs) lives
253
+ * on the NetworkDevice resource itself. Step validation therefore only
254
+ * requires the device reference — the old "enable interface monitoring or
255
+ * configure at least one OID" rule is gone.
256
+ */
257
+ describe("MonitorStep validation", () => {
258
+ test("accepts a step with only a device reference (interfaces off, zero oids)", () => {
259
+ const monitorStep: MonitorStep = getNetworkDeviceMonitorStep({
260
+ monitorInterfaces: false,
261
+ oids: [],
262
+ });
263
+
264
+ expect(
265
+ MonitorStep.getValidationError(monitorStep, MonitorType.NetworkDevice),
266
+ ).toBeNull();
267
+ });
268
+
269
+ test("still rejects a step with no device reference", () => {
270
+ const monitorStep: MonitorStep = getNetworkDeviceMonitorStep({
271
+ networkDeviceId: undefined,
272
+ });
273
+
274
+ expect(
275
+ MonitorStep.getValidationError(monitorStep, MonitorType.NetworkDevice),
276
+ ).toBe("Network Device is required");
277
+ });
278
+
279
+ test("rejects a step that has no networkDeviceMonitor block at all", () => {
280
+ const id: ObjectID = ObjectID.generate();
281
+ const monitorStep: MonitorStep = MonitorStep.getDefaultMonitorStep({
282
+ monitorName: "Network device monitor",
283
+ monitorType: MonitorType.NetworkDevice,
284
+ onlineMonitorStatusId: id,
285
+ offlineMonitorStatusId: id,
286
+ defaultIncidentSeverityId: id,
287
+ defaultAlertSeverityId: id,
288
+ });
289
+
290
+ expect(
291
+ MonitorStep.getValidationError(monitorStep, MonitorType.NetworkDevice),
292
+ ).toBe("Network Device is required");
293
+ });
294
+ });
155
295
  });
@@ -120,7 +120,6 @@ describe("MonitorTypeHelper", () => {
120
120
  MonitorType.SSLCertificate,
121
121
  MonitorType.SyntheticMonitor,
122
122
  MonitorType.CustomJavaScriptCode,
123
- MonitorType.NetworkDevice,
124
123
  MonitorType.DNS,
125
124
  MonitorType.DNSSEC,
126
125
  MonitorType.Domain,
@@ -134,6 +133,8 @@ describe("MonitorTypeHelper", () => {
134
133
  MonitorType.Logs,
135
134
  MonitorType.Server,
136
135
  MonitorType.IncomingRequest,
136
+ // Device-owned polling: the NetworkDevice resource polls itself.
137
+ MonitorType.NetworkDevice,
137
138
  ])("returns false for %s", (monitorType: MonitorType) => {
138
139
  expect(MonitorTypeHelper.isProbableMonitor(monitorType)).toBe(false);
139
140
  });
@@ -195,6 +196,63 @@ describe("MonitorTypeHelper", () => {
195
196
  });
196
197
  });
197
198
 
199
+ /*
200
+ * NetworkDevice is a pure alerting layer under device-owned polling: the
201
+ * NetworkDevice resource's assigned probe walks it on the device's own
202
+ * schedule, and the monitor is evaluated server-side against each walk.
203
+ * It must therefore never appear probeable (no MonitorProbe rows, no
204
+ * interval) while keeping its full monitor surface: criteria, graphs,
205
+ * documentation, creatability, and its place in the Network category.
206
+ */
207
+ describe("NetworkDevice under device-owned polling", () => {
208
+ test("is not probeable and has no interval", () => {
209
+ expect(
210
+ MonitorTypeHelper.isProbableMonitor(MonitorType.NetworkDevice),
211
+ ).toBe(false);
212
+ expect(
213
+ MonitorTypeHelper.doesMonitorTypeHaveInterval(
214
+ MonitorType.NetworkDevice,
215
+ ),
216
+ ).toBe(false);
217
+ });
218
+
219
+ test("still has criteria, graphs, and documentation", () => {
220
+ expect(
221
+ MonitorTypeHelper.doesMonitorTypeHaveCriteria(
222
+ MonitorType.NetworkDevice,
223
+ ),
224
+ ).toBe(true);
225
+ expect(
226
+ MonitorTypeHelper.doesMonitorTypeHaveGraphs(MonitorType.NetworkDevice),
227
+ ).toBe(true);
228
+ expect(
229
+ MonitorTypeHelper.doesMonitorTypeHaveDocumentation(
230
+ MonitorType.NetworkDevice,
231
+ ),
232
+ ).toBe(true);
233
+ });
234
+
235
+ test("is still an active (creatable) monitor type", () => {
236
+ expect(MonitorTypeHelper.getActiveMonitorTypes()).toContain(
237
+ MonitorType.NetworkDevice,
238
+ );
239
+ });
240
+
241
+ test("is still listed under the Network category", () => {
242
+ const networkCategory: MonitorTypeCategory | undefined =
243
+ MonitorTypeHelper.getMonitorTypeCategories().find(
244
+ (category: MonitorTypeCategory) => {
245
+ return category.label === "Network";
246
+ },
247
+ );
248
+
249
+ expect(networkCategory).toBeDefined();
250
+ expect(networkCategory?.monitorTypes).toContain(
251
+ MonitorType.NetworkDevice,
252
+ );
253
+ });
254
+ });
255
+
198
256
  describe("doesMonitorTypeHaveGraphs", () => {
199
257
  test("returns true for graphable types and false otherwise", () => {
200
258
  expect(
@@ -0,0 +1,97 @@
1
+ import NetworkDeviceAlertPackUtil, {
2
+ NetworkDeviceAlertPackItem,
3
+ } from "../../../Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack";
4
+ import MonitorCriteriaInstance from "../../../Types/Monitor/MonitorCriteriaInstance";
5
+ import ObjectID from "../../../Types/ObjectID";
6
+
7
+ describe("NetworkDeviceAlertPackUtil.getPackItems", () => {
8
+ test("every pack item has a name, a description and at least one filter", () => {
9
+ const items: Array<NetworkDeviceAlertPackItem> =
10
+ NetworkDeviceAlertPackUtil.getPackItems();
11
+
12
+ expect(items.length).toBeGreaterThan(0);
13
+
14
+ for (const item of items) {
15
+ expect(item.name).toBeTruthy();
16
+ expect(item.description).toBeTruthy();
17
+ expect(item.filters.length).toBeGreaterThan(0);
18
+ }
19
+ });
20
+ });
21
+
22
+ describe("NetworkDeviceAlertPackUtil.buildCriteriaInstances", () => {
23
+ test("builds one enabled instance per pack item with unique ids", () => {
24
+ const instances: Array<MonitorCriteriaInstance> =
25
+ NetworkDeviceAlertPackUtil.buildCriteriaInstances();
26
+
27
+ expect(instances.length).toBe(
28
+ NetworkDeviceAlertPackUtil.getPackItems().length,
29
+ );
30
+
31
+ const ids: Set<string> = new Set<string>();
32
+ for (const instance of instances) {
33
+ expect(instance.data?.isEnabled).toBe(true);
34
+ expect(instance.data?.id).toBeTruthy();
35
+ ids.add(instance.data!.id);
36
+ }
37
+ expect(ids.size).toBe(instances.length);
38
+ });
39
+
40
+ test("with a downMonitorStatusId context, incident-creating criteria carry that status id", () => {
41
+ const downStatusId: ObjectID = ObjectID.generate();
42
+
43
+ const instances: Array<MonitorCriteriaInstance> =
44
+ NetworkDeviceAlertPackUtil.buildCriteriaInstances({
45
+ downMonitorStatusId: downStatusId,
46
+ });
47
+
48
+ for (const instance of instances) {
49
+ expect(instance.data?.monitorStatusId?.toString()).toBe(
50
+ downStatusId.toString(),
51
+ );
52
+
53
+ /*
54
+ * changeMonitorStatus must never be true while the target status id
55
+ * is missing — that combination produces a criteria that "changes"
56
+ * the monitor to no status at all.
57
+ */
58
+ if (instance.data?.changeMonitorStatus) {
59
+ expect(instance.data?.monitorStatusId).toBeTruthy();
60
+ }
61
+ }
62
+ });
63
+
64
+ test("without context, no instance claims to change monitor status to an undefined id", () => {
65
+ const instances: Array<MonitorCriteriaInstance> =
66
+ NetworkDeviceAlertPackUtil.buildCriteriaInstances();
67
+
68
+ for (const instance of instances) {
69
+ expect(instance.data?.monitorStatusId).toBeUndefined();
70
+ /*
71
+ * Legacy call sites (no context) still exist in principle; the pack
72
+ * must not produce a status change pointing at nothing.
73
+ */
74
+ expect(instance.data?.changeMonitorStatus).toBe(false);
75
+ }
76
+ });
77
+
78
+ test("only incident-creating pack items request a monitor status change", () => {
79
+ const downStatusId: ObjectID = ObjectID.generate();
80
+ const items: Array<NetworkDeviceAlertPackItem> =
81
+ NetworkDeviceAlertPackUtil.getPackItems();
82
+ const instances: Array<MonitorCriteriaInstance> =
83
+ NetworkDeviceAlertPackUtil.buildCriteriaInstances({
84
+ downMonitorStatusId: downStatusId,
85
+ });
86
+
87
+ for (let i: number = 0; i < items.length; i++) {
88
+ expect(instances[i]!.data?.createIncidents).toBe(
89
+ items[i]!.createIncidents,
90
+ );
91
+ expect(instances[i]!.data?.createAlerts).toBe(items[i]!.createAlerts);
92
+ expect(instances[i]!.data?.changeMonitorStatus).toBe(
93
+ items[i]!.createIncidents,
94
+ );
95
+ }
96
+ });
97
+ });