@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
@@ -0,0 +1,622 @@
1
+ import MetricExplorerUrl, {
2
+ MetricExplorerUrlParam,
3
+ SerializedMetricFormula,
4
+ SerializedMetricQuery,
5
+ } from "../../../Utils/Metrics/MetricExplorerUrl";
6
+ import AggregatedModel from "../../../Types/BaseDatabase/AggregatedModel";
7
+ import InBetween from "../../../Types/BaseDatabase/InBetween";
8
+ import Dictionary from "../../../Types/Dictionary";
9
+ import OneUptimeDate from "../../../Types/Date";
10
+ import MetricFormulaConfigData from "../../../Types/Metrics/MetricFormulaConfigData";
11
+ import MetricQueryConfigData, {
12
+ ChartSeries,
13
+ MetricChartType,
14
+ } from "../../../Types/Metrics/MetricQueryConfigData";
15
+ import MetricViewData from "../../../Types/Metrics/MetricViewData";
16
+ import MetricsAggregationType from "../../../Types/Metrics/MetricsAggregationType";
17
+ import TimeRange from "../../../Types/Time/TimeRange";
18
+
19
+ type BuildFullQueryConfigFunction = () => MetricQueryConfigData;
20
+
21
+ const buildFullQueryConfig: BuildFullQueryConfigFunction =
22
+ (): MetricQueryConfigData => {
23
+ return {
24
+ metricAliasData: {
25
+ metricVariable: "a",
26
+ title: "CPU Usage",
27
+ description: "Node CPU usage",
28
+ legend: "cpu",
29
+ legendUnit: "%",
30
+ },
31
+ metricQueryData: {
32
+ filterData: {
33
+ metricName: "system.cpu.utilization",
34
+ attributes: {
35
+ "host.name": "node-1",
36
+ "is.prod": true,
37
+ replicas: 3,
38
+ },
39
+ aggegationType: MetricsAggregationType.P95,
40
+ },
41
+ groupByAttributeKeys: ["host.name", "service.name"],
42
+ topN: 25,
43
+ },
44
+ getSeries: (_data: AggregatedModel): ChartSeries => {
45
+ return { title: "should never serialize" };
46
+ },
47
+ yAxisValueFormatter: (value: number): string => {
48
+ return value.toString();
49
+ },
50
+ transformValue: (value: number, _dataPoint: AggregatedModel): number => {
51
+ return value;
52
+ },
53
+ chartType: MetricChartType.BAR,
54
+ color: "#6366f1",
55
+ colorsByGroup: {
56
+ "host.name=node-1": "#f59e0b",
57
+ "(unset)": "#ef4444",
58
+ },
59
+ warningThreshold: 70,
60
+ criticalThreshold: 90.5,
61
+ transformAsRate: true,
62
+ overlayWithPreviousQuery: true,
63
+ };
64
+ };
65
+
66
+ type BuildViewDataFunction = (input: {
67
+ queryConfigs: Array<MetricQueryConfigData>;
68
+ formulaConfigs?: Array<MetricFormulaConfigData>;
69
+ startAndEndDate?: InBetween<Date> | null;
70
+ }) => MetricViewData;
71
+
72
+ const buildViewData: BuildViewDataFunction = (input: {
73
+ queryConfigs: Array<MetricQueryConfigData>;
74
+ formulaConfigs?: Array<MetricFormulaConfigData>;
75
+ startAndEndDate?: InBetween<Date> | null;
76
+ }): MetricViewData => {
77
+ return {
78
+ queryConfigs: input.queryConfigs,
79
+ formulaConfigs: input.formulaConfigs || [],
80
+ startAndEndDate:
81
+ input.startAndEndDate === undefined ? null : input.startAndEndDate,
82
+ };
83
+ };
84
+
85
+ describe("MetricExplorerUrl", () => {
86
+ describe("buildQueryParamsFromMetricViewData", () => {
87
+ test("round-trips every persisted query field through the URL param", () => {
88
+ const params: Dictionary<string> =
89
+ MetricExplorerUrl.buildQueryParamsFromMetricViewData(
90
+ buildViewData({ queryConfigs: [buildFullQueryConfig()] }),
91
+ );
92
+
93
+ const rawQueries: string | undefined =
94
+ params[MetricExplorerUrlParam.MetricQueries];
95
+
96
+ expect(rawQueries).toBeDefined();
97
+
98
+ const parsed: Array<SerializedMetricQuery> =
99
+ MetricExplorerUrl.parseMetricQueriesParam(rawQueries as string);
100
+
101
+ expect(parsed).toHaveLength(1);
102
+ expect(parsed[0]).toEqual({
103
+ metricName: "system.cpu.utilization",
104
+ variable: "a",
105
+ attributes: {
106
+ "host.name": "node-1",
107
+ "is.prod": true,
108
+ replicas: 3,
109
+ },
110
+ aggregationType: MetricsAggregationType.P95,
111
+ alias: {
112
+ title: "CPU Usage",
113
+ description: "Node CPU usage",
114
+ legend: "cpu",
115
+ legendUnit: "%",
116
+ },
117
+ groupByAttributeKeys: ["host.name", "service.name"],
118
+ chartType: MetricChartType.BAR,
119
+ color: "#6366f1",
120
+ colorsByGroup: {
121
+ "host.name=node-1": "#f59e0b",
122
+ "(unset)": "#ef4444",
123
+ },
124
+ warningThreshold: 70,
125
+ criticalThreshold: 90.5,
126
+ transformAsRate: true,
127
+ overlayWithPreviousQuery: true,
128
+ topN: 25,
129
+ });
130
+ });
131
+
132
+ test("never serializes runtime-injected function fields", () => {
133
+ const params: Dictionary<string> =
134
+ MetricExplorerUrl.buildQueryParamsFromMetricViewData(
135
+ buildViewData({ queryConfigs: [buildFullQueryConfig()] }),
136
+ );
137
+
138
+ const rawQueries: string = params[
139
+ MetricExplorerUrlParam.MetricQueries
140
+ ] as string;
141
+
142
+ expect(rawQueries).not.toContain("getSeries");
143
+ expect(rawQueries).not.toContain("yAxisValueFormatter");
144
+ expect(rawQueries).not.toContain("transformValue");
145
+ expect(rawQueries).not.toContain("should never serialize");
146
+ });
147
+
148
+ test("round-trips formulas with variable, alias and display fields", () => {
149
+ const formulaConfig: MetricFormulaConfigData = {
150
+ metricAliasData: {
151
+ metricVariable: "c",
152
+ title: "Error Rate",
153
+ description: "",
154
+ legend: "errors",
155
+ legendUnit: "",
156
+ },
157
+ metricFormulaData: {
158
+ metricFormula: "a / b * 100",
159
+ },
160
+ chartType: MetricChartType.BAR,
161
+ color: "#ef4444",
162
+ warningThreshold: 5,
163
+ criticalThreshold: 12.5,
164
+ };
165
+
166
+ const params: Dictionary<string> =
167
+ MetricExplorerUrl.buildQueryParamsFromMetricViewData(
168
+ buildViewData({
169
+ queryConfigs: [],
170
+ formulaConfigs: [formulaConfig],
171
+ }),
172
+ );
173
+
174
+ const rawFormulas: string | undefined =
175
+ params[MetricExplorerUrlParam.MetricFormulas];
176
+
177
+ expect(rawFormulas).toBeDefined();
178
+
179
+ const parsed: Array<SerializedMetricFormula> =
180
+ MetricExplorerUrl.parseMetricFormulasParam(rawFormulas as string);
181
+
182
+ expect(parsed).toEqual([
183
+ {
184
+ formula: "a / b * 100",
185
+ variable: "c",
186
+ alias: {
187
+ title: "Error Rate",
188
+ legend: "errors",
189
+ },
190
+ chartType: MetricChartType.BAR,
191
+ color: "#ef4444",
192
+ warningThreshold: 5,
193
+ criticalThreshold: 12.5,
194
+ },
195
+ ]);
196
+ });
197
+
198
+ test("preserves a non-positional query variable so formulas keep resolving", () => {
199
+ /*
200
+ * A lone query left named "b" (its "a" sibling was deleted in the
201
+ * live view) must serialize its variable — reconstruction would
202
+ * otherwise re-letter it to "a" positionally and break formulas
203
+ * that reference $b.
204
+ */
205
+ const queryConfig: MetricQueryConfigData = {
206
+ metricAliasData: {
207
+ metricVariable: "b",
208
+ title: "",
209
+ description: "",
210
+ legend: "",
211
+ legendUnit: "",
212
+ },
213
+ metricQueryData: {
214
+ filterData: {
215
+ metricName: "system.memory.usage",
216
+ attributes: {},
217
+ aggegationType: MetricsAggregationType.Avg,
218
+ },
219
+ },
220
+ };
221
+
222
+ const params: Dictionary<string> =
223
+ MetricExplorerUrl.buildQueryParamsFromMetricViewData(
224
+ buildViewData({ queryConfigs: [queryConfig] }),
225
+ );
226
+
227
+ const parsed: Array<SerializedMetricQuery> =
228
+ MetricExplorerUrl.parseMetricQueriesParam(
229
+ params[MetricExplorerUrlParam.MetricQueries] as string,
230
+ );
231
+
232
+ expect(parsed[0]?.variable).toBe("b");
233
+ });
234
+
235
+ test("emits startTime/endTime only when both ends of the window exist", () => {
236
+ const startTime: Date = OneUptimeDate.fromString(
237
+ "2026-07-16T10:00:00.000Z",
238
+ );
239
+ const endTime: Date = OneUptimeDate.fromString(
240
+ "2026-07-16T11:00:00.000Z",
241
+ );
242
+
243
+ const paramsWithWindow: Dictionary<string> =
244
+ MetricExplorerUrl.buildQueryParamsFromMetricViewData(
245
+ buildViewData({
246
+ queryConfigs: [buildFullQueryConfig()],
247
+ startAndEndDate: new InBetween(startTime, endTime),
248
+ }),
249
+ );
250
+
251
+ expect(paramsWithWindow[MetricExplorerUrlParam.StartTime]).toBe(
252
+ OneUptimeDate.toString(startTime),
253
+ );
254
+ expect(paramsWithWindow[MetricExplorerUrlParam.EndTime]).toBe(
255
+ OneUptimeDate.toString(endTime),
256
+ );
257
+
258
+ const paramsWithoutWindow: Dictionary<string> =
259
+ MetricExplorerUrl.buildQueryParamsFromMetricViewData(
260
+ buildViewData({ queryConfigs: [buildFullQueryConfig()] }),
261
+ );
262
+
263
+ expect(
264
+ paramsWithoutWindow[MetricExplorerUrlParam.StartTime],
265
+ ).toBeUndefined();
266
+ expect(
267
+ paramsWithoutWindow[MetricExplorerUrlParam.EndTime],
268
+ ).toBeUndefined();
269
+ });
270
+
271
+ test("skips empty queries and formulas entirely", () => {
272
+ const emptyQueryConfig: MetricQueryConfigData = {
273
+ metricAliasData: {
274
+ metricVariable: "a",
275
+ title: "",
276
+ description: "",
277
+ legend: "",
278
+ legendUnit: "",
279
+ },
280
+ metricQueryData: {
281
+ filterData: {
282
+ metricName: "",
283
+ attributes: {},
284
+ aggegationType: MetricsAggregationType.Avg,
285
+ },
286
+ },
287
+ };
288
+
289
+ const emptyFormulaConfig: MetricFormulaConfigData = {
290
+ metricAliasData: {
291
+ metricVariable: "b",
292
+ title: "",
293
+ description: "",
294
+ legend: "",
295
+ legendUnit: "",
296
+ },
297
+ metricFormulaData: {
298
+ metricFormula: " ",
299
+ },
300
+ };
301
+
302
+ const params: Dictionary<string> =
303
+ MetricExplorerUrl.buildQueryParamsFromMetricViewData(
304
+ buildViewData({
305
+ queryConfigs: [emptyQueryConfig],
306
+ formulaConfigs: [emptyFormulaConfig],
307
+ }),
308
+ );
309
+
310
+ expect(params[MetricExplorerUrlParam.MetricQueries]).toBeUndefined();
311
+ expect(params[MetricExplorerUrlParam.MetricFormulas]).toBeUndefined();
312
+ expect(Object.keys(params)).toHaveLength(0);
313
+ });
314
+
315
+ test("emits the range param for every relative token, including the default hour", () => {
316
+ const startTime: Date = OneUptimeDate.fromString(
317
+ "2026-07-16T10:00:00.000Z",
318
+ );
319
+ const endTime: Date = OneUptimeDate.fromString(
320
+ "2026-07-16T11:00:00.000Z",
321
+ );
322
+
323
+ const buildParamsForToken: (
324
+ rangeToken: string | undefined,
325
+ ) => Dictionary<string> = (
326
+ rangeToken: string | undefined,
327
+ ): Dictionary<string> => {
328
+ return MetricExplorerUrl.buildQueryParamsFromMetricViewData({
329
+ ...buildViewData({
330
+ queryConfigs: [buildFullQueryConfig()],
331
+ startAndEndDate: new InBetween(startTime, endTime),
332
+ }),
333
+ rangeToken,
334
+ });
335
+ };
336
+
337
+ // Relative token → range param plus absolute back-compat window.
338
+ expect(buildParamsForToken(TimeRange.PAST_ONE_DAY)).toMatchObject({
339
+ [MetricExplorerUrlParam.Range]: TimeRange.PAST_ONE_DAY,
340
+ [MetricExplorerUrlParam.StartTime]: OneUptimeDate.toString(startTime),
341
+ [MetricExplorerUrlParam.EndTime]: OneUptimeDate.toString(endTime),
342
+ });
343
+
344
+ /*
345
+ * The default Past 1 Hour is emitted explicitly too: parsing treats
346
+ * absolute-only params as a pinned Custom window, so an implicit
347
+ * default would silently stop rolling on reload / Copy Link.
348
+ */
349
+ expect(
350
+ buildParamsForToken(TimeRange.PAST_ONE_HOUR)[
351
+ MetricExplorerUrlParam.Range
352
+ ],
353
+ ).toBe(TimeRange.PAST_ONE_HOUR);
354
+
355
+ // Custom, no token, garbage → omitted (pinned absolute window).
356
+ for (const omittedToken of [TimeRange.CUSTOM, undefined, "Not A Range"]) {
357
+ expect(
358
+ buildParamsForToken(omittedToken)[MetricExplorerUrlParam.Range],
359
+ ).toBeUndefined();
360
+ }
361
+ });
362
+
363
+ test("keeps a query whose only content is a display customization", () => {
364
+ const colorOnlyConfig: MetricQueryConfigData = {
365
+ metricQueryData: {
366
+ filterData: {
367
+ metricName: "",
368
+ attributes: {},
369
+ aggegationType: MetricsAggregationType.Avg,
370
+ },
371
+ },
372
+ color: "#6366f1",
373
+ };
374
+
375
+ const params: Dictionary<string> =
376
+ MetricExplorerUrl.buildQueryParamsFromMetricViewData(
377
+ buildViewData({ queryConfigs: [colorOnlyConfig] }),
378
+ );
379
+
380
+ const parsed: Array<SerializedMetricQuery> =
381
+ MetricExplorerUrl.parseMetricQueriesParam(
382
+ params[MetricExplorerUrlParam.MetricQueries] as string,
383
+ );
384
+
385
+ expect(parsed).toHaveLength(1);
386
+ expect(parsed[0]?.color).toBe("#6366f1");
387
+ });
388
+ });
389
+
390
+ describe("isMeaningfulMetricQuery", () => {
391
+ test("treats each display-only customization as meaningful", () => {
392
+ const base: SerializedMetricQuery = { metricName: "", attributes: {} };
393
+
394
+ expect(MetricExplorerUrl.isMeaningfulMetricQuery(base)).toBe(false);
395
+ expect(
396
+ MetricExplorerUrl.isMeaningfulMetricQuery({
397
+ ...base,
398
+ aggregationType: MetricsAggregationType.Avg,
399
+ }),
400
+ ).toBe(false);
401
+
402
+ const meaningfulVariants: Array<SerializedMetricQuery> = [
403
+ { ...base, metricName: "cpu" },
404
+ { ...base, attributes: { "host.name": "node-1" } },
405
+ { ...base, aggregationType: MetricsAggregationType.Sum },
406
+ { ...base, alias: { title: "CPU" } },
407
+ { ...base, groupByAttributeKeys: ["host.name"] },
408
+ { ...base, chartType: MetricChartType.AREA },
409
+ { ...base, color: "#6366f1" },
410
+ { ...base, colorsByGroup: { "host.name=node-1": "#f59e0b" } },
411
+ { ...base, warningThreshold: 10 },
412
+ { ...base, criticalThreshold: 20 },
413
+ { ...base, transformAsRate: true },
414
+ { ...base, overlayWithPreviousQuery: true },
415
+ { ...base, topN: 25 },
416
+ ];
417
+
418
+ for (const variant of meaningfulVariants) {
419
+ expect(MetricExplorerUrl.isMeaningfulMetricQuery(variant)).toBe(true);
420
+ }
421
+ });
422
+ });
423
+
424
+ describe("parseMetricQueriesParam", () => {
425
+ test("parses old-format links that carry only the original field subset", () => {
426
+ const oldFormatParam: string = JSON.stringify([
427
+ {
428
+ metricName: "http.server.request.duration",
429
+ attributes: { "service.name": "api" },
430
+ aggregationType: "P95",
431
+ alias: { title: "Latency" },
432
+ },
433
+ ]);
434
+
435
+ expect(MetricExplorerUrl.parseMetricQueriesParam(oldFormatParam)).toEqual(
436
+ [
437
+ {
438
+ metricName: "http.server.request.duration",
439
+ attributes: { "service.name": "api" },
440
+ aggregationType: MetricsAggregationType.P95,
441
+ alias: { title: "Latency" },
442
+ },
443
+ ],
444
+ );
445
+ });
446
+
447
+ test("supports flat alias keys on the query record for backward compatibility", () => {
448
+ const flatAliasParam: string = JSON.stringify([
449
+ {
450
+ metricName: "cpu",
451
+ legend: "cpu legend",
452
+ legendUnit: "%",
453
+ },
454
+ ]);
455
+
456
+ const parsed: Array<SerializedMetricQuery> =
457
+ MetricExplorerUrl.parseMetricQueriesParam(flatAliasParam);
458
+
459
+ expect(parsed[0]?.alias).toEqual({
460
+ legend: "cpu legend",
461
+ legendUnit: "%",
462
+ });
463
+ });
464
+
465
+ test("returns [] on malformed JSON or a non-array payload", () => {
466
+ expect(MetricExplorerUrl.parseMetricQueriesParam("{not json")).toEqual(
467
+ [],
468
+ );
469
+ expect(
470
+ MetricExplorerUrl.parseMetricQueriesParam('{"metricName":"cpu"}'),
471
+ ).toEqual([]);
472
+ });
473
+
474
+ test("salvages valid entries and drops wrong-typed fields instead of throwing", () => {
475
+ const mixedParam: string = JSON.stringify([
476
+ null,
477
+ "garbage",
478
+ ["also garbage"],
479
+ {
480
+ metricName: "cpu",
481
+ variable: 42,
482
+ attributes: "not an object",
483
+ aggregationType: "NotAnAggregation",
484
+ chartType: "pie",
485
+ color: 42,
486
+ colorsByGroup: { good: "#fff", bad: 7 },
487
+ groupByAttributeKeys: ["host.name", 3, ""],
488
+ warningThreshold: "high",
489
+ criticalThreshold: 90,
490
+ transformAsRate: "yes",
491
+ overlayWithPreviousQuery: 1,
492
+ topN: "5",
493
+ unknownField: "ignored",
494
+ },
495
+ ]);
496
+
497
+ expect(MetricExplorerUrl.parseMetricQueriesParam(mixedParam)).toEqual([
498
+ {
499
+ metricName: "cpu",
500
+ attributes: {},
501
+ colorsByGroup: { good: "#fff" },
502
+ groupByAttributeKeys: ["host.name"],
503
+ criticalThreshold: 90,
504
+ },
505
+ ]);
506
+ });
507
+
508
+ test("drops non-finite threshold numbers", () => {
509
+ // JSON5 (the parser behind JSONFunctions.parse) accepts Infinity.
510
+ const parsed: Array<SerializedMetricQuery> =
511
+ MetricExplorerUrl.parseMetricQueriesParam(
512
+ '[{"metricName":"cpu","warningThreshold":Infinity,"criticalThreshold":80}]',
513
+ );
514
+
515
+ expect(parsed[0]?.warningThreshold).toBeUndefined();
516
+ expect(parsed[0]?.criticalThreshold).toBe(80);
517
+ });
518
+ });
519
+
520
+ describe("parseMetricFormulasParam", () => {
521
+ test("skips entries without a formula and returns [] on malformed input", () => {
522
+ expect(MetricExplorerUrl.parseMetricFormulasParam("not json")).toEqual(
523
+ [],
524
+ );
525
+
526
+ const parsed: Array<SerializedMetricFormula> =
527
+ MetricExplorerUrl.parseMetricFormulasParam(
528
+ JSON.stringify([
529
+ { variable: "a" },
530
+ { formula: "a + b", variable: "c" },
531
+ ]),
532
+ );
533
+
534
+ expect(parsed).toEqual([{ formula: "a + b", variable: "c" }]);
535
+ });
536
+
537
+ test("parses old-format formulas without display fields and drops wrong-typed ones", () => {
538
+ const parsed: Array<SerializedMetricFormula> =
539
+ MetricExplorerUrl.parseMetricFormulasParam(
540
+ JSON.stringify([
541
+ // Old-format entry: no display fields at all.
542
+ { formula: "a * 2", variable: "b" },
543
+ // New-format entry with a mix of valid and garbage fields.
544
+ {
545
+ formula: "a / b",
546
+ chartType: "pie",
547
+ color: " ",
548
+ warningThreshold: "high",
549
+ criticalThreshold: 95,
550
+ },
551
+ ]),
552
+ );
553
+
554
+ expect(parsed).toEqual([
555
+ { formula: "a * 2", variable: "b" },
556
+ { formula: "a / b", criticalThreshold: 95 },
557
+ ]);
558
+ });
559
+ });
560
+
561
+ describe("monitor deep-link parity", () => {
562
+ test("round-trips exactly what MonitorCriteriaEvaluator.buildMetricExplorerDeepLink produces", () => {
563
+ /*
564
+ * Mirrors the construction in
565
+ * Common/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts
566
+ * (buildMetricExplorerDeepLink): a single query config from the
567
+ * criteria context plus a breach-centered time window.
568
+ */
569
+ const breachTime: Date = OneUptimeDate.fromString(
570
+ "2026-07-16T09:30:00.000Z",
571
+ );
572
+ const startTime: Date = OneUptimeDate.addRemoveMinutes(breachTime, -30);
573
+ const endTime: Date = OneUptimeDate.addRemoveMinutes(breachTime, 15);
574
+
575
+ const queryConfig: MetricQueryConfigData = {
576
+ metricQueryData: {
577
+ filterData: {
578
+ metricName: "k8s.pod.cpu.usage",
579
+ attributes: MetricExplorerUrl.sanitizeAttributes({
580
+ "k8s.namespace.name": "prod",
581
+ nested: { dropped: true },
582
+ }),
583
+ aggegationType: MetricsAggregationType.Avg,
584
+ },
585
+ },
586
+ };
587
+
588
+ const urlParams: Dictionary<string> =
589
+ MetricExplorerUrl.buildQueryParamsFromMetricViewData({
590
+ queryConfigs: [queryConfig],
591
+ formulaConfigs: [],
592
+ startAndEndDate: new InBetween(startTime, endTime),
593
+ });
594
+
595
+ expect(Object.keys(urlParams).sort()).toEqual([
596
+ "endTime",
597
+ "metricQueries",
598
+ "startTime",
599
+ ]);
600
+ expect(urlParams[MetricExplorerUrlParam.StartTime]).toBe(
601
+ OneUptimeDate.toString(startTime),
602
+ );
603
+ expect(urlParams[MetricExplorerUrlParam.EndTime]).toBe(
604
+ OneUptimeDate.toString(endTime),
605
+ );
606
+
607
+ // The explorer must accept the deep link's metricQueries payload.
608
+ const parsed: Array<SerializedMetricQuery> =
609
+ MetricExplorerUrl.parseMetricQueriesParam(
610
+ urlParams[MetricExplorerUrlParam.MetricQueries] as string,
611
+ );
612
+
613
+ expect(parsed).toEqual([
614
+ {
615
+ metricName: "k8s.pod.cpu.usage",
616
+ attributes: { "k8s.namespace.name": "prod" },
617
+ aggregationType: MetricsAggregationType.Avg,
618
+ },
619
+ ]);
620
+ });
621
+ });
622
+ });