@oneuptime/common 11.5.9 → 11.5.11

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 (379) 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/1784401962564-MigrationName.ts +101 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
  28. package/Server/Services/AnalyticsDatabaseService.ts +70 -1
  29. package/Server/Services/IncidentService.ts +13 -0
  30. package/Server/Services/Index.ts +10 -0
  31. package/Server/Services/MarketingConversionService.ts +10 -0
  32. package/Server/Services/MetricItemAggMV1mByContainerService.ts +31 -0
  33. package/Server/Services/MetricItemAggMV1mByK8sClusterService.ts +31 -0
  34. package/Server/Services/MetricItemAggMV1mByServiceService.ts +31 -0
  35. package/Server/Services/MetricService.ts +970 -122
  36. package/Server/Services/MonitorService.ts +14 -0
  37. package/Server/Services/NetworkDeviceOwnerTeamService.ts +42 -0
  38. package/Server/Services/NetworkDeviceOwnerUserService.ts +106 -0
  39. package/Server/Services/NetworkFlowService.ts +11 -0
  40. package/Server/Services/OnCallDutyPolicyService.ts +11 -1
  41. package/Server/Services/ProjectService.ts +136 -0
  42. package/Server/Services/SpanService.ts +13 -9
  43. package/Server/Services/StatusPageService.ts +10 -0
  44. package/Server/Services/TeamMemberService.ts +11 -0
  45. package/Server/Services/UserService.ts +59 -0
  46. package/Server/Types/AnalyticsDatabase/AggregateBy.ts +37 -7
  47. package/Server/Utils/Attribution.ts +99 -0
  48. package/Server/Utils/Marketing/ConversionUploadProvider.ts +103 -0
  49. package/Server/Utils/Marketing/ConversionUploadProviders.ts +22 -0
  50. package/Server/Utils/Marketing/Providers/GoogleAds.ts +270 -0
  51. package/Server/Utils/Marketing/Providers/LinkedIn.ts +147 -0
  52. package/Server/Utils/Marketing/Providers/Meta.ts +148 -0
  53. package/Server/Utils/Marketing/Providers/MicrosoftAds.ts +196 -0
  54. package/Server/Utils/Marketing/Providers/Reddit.ts +178 -0
  55. package/Server/Utils/Monitor/MonitorAlert.ts +71 -7
  56. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +31 -19
  57. package/Server/Utils/Monitor/MonitorIncident.ts +71 -7
  58. package/Server/Utils/Monitor/MonitorMetricUtil.ts +57 -0
  59. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +94 -0
  60. package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +15 -0
  61. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +125 -14
  62. package/Server/Utils/ProductAnalytics.ts +133 -0
  63. package/Server/Utils/Telemetry/Telemetry.ts +39 -0
  64. package/Server/Utils/Telemetry/TelemetryEntity.ts +21 -0
  65. package/Tests/Server/API/BaseAnalyticsAPI.test.ts +72 -0
  66. package/Tests/Server/Infrastructure/SemaphorePermit.test.ts +9 -1
  67. package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +21 -2
  68. package/Tests/Server/Services/MetricEntityMVKeyParity.test.ts +173 -0
  69. package/Tests/Server/Services/MetricServiceAggregate.test.ts +1391 -0
  70. package/Tests/Server/Services/NetworkDeviceOwnerServices.test.ts +260 -0
  71. package/Tests/Server/Utils/Monitor/MonitorTemplateUtilNetworkDevice.test.ts +389 -0
  72. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +764 -0
  73. package/Tests/Types/BaseDatabase/AggregationIntervalUtil.test.ts +111 -2
  74. package/Tests/Types/Database/EndsWith.test.ts +64 -0
  75. package/Tests/Types/Database/GreaterThan.test.ts +62 -0
  76. package/Tests/Types/Database/GreaterThanOrEqual.test.ts +65 -0
  77. package/Tests/Types/Database/GreaterThanOrNull.test.ts +63 -0
  78. package/Tests/Types/Database/Includes.test.ts +65 -0
  79. package/Tests/Types/Database/IncludesAll.test.ts +65 -0
  80. package/Tests/Types/Database/IncludesNone.test.ts +65 -0
  81. package/Tests/Types/Database/IsNull.test.ts +44 -0
  82. package/Tests/Types/Database/LessThan.test.ts +62 -0
  83. package/Tests/Types/Database/LessThanOrEqual.test.ts +62 -0
  84. package/Tests/Types/Database/LessThanOrNull.test.ts +62 -0
  85. package/Tests/Types/Database/MultiSearch.test.ts +81 -0
  86. package/Tests/Types/Database/NotContains.test.ts +64 -0
  87. package/Tests/Types/Database/NotNull.test.ts +44 -0
  88. package/Tests/Types/Database/StartsWith.test.ts +64 -0
  89. package/Tests/Types/Monitor/MonitorStepSqlMonitor.test.ts +83 -1
  90. package/Tests/Types/Monitor/SnmpV3EnumParsing.test.ts +247 -0
  91. package/Tests/Types/Monitor/SnmpVendorTemplate.test.ts +263 -0
  92. package/Tests/UI/Components/XAxis.test.ts +5 -3
  93. package/Tests/Utils/EnterpriseLicenseUsage.test.ts +76 -0
  94. package/Tests/Utils/Metrics/MetricExplorerUrl.test.ts +622 -0
  95. package/Tests/Utils/Metrics/MetricFormulaEvaluator.test.ts +474 -0
  96. package/Tests/Utils/Telemetry/HeartbeatAvailability.test.ts +52 -4
  97. package/Types/AnalyticsDatabase/AnalyticsTableName.ts +11 -0
  98. package/Types/BaseDatabase/AggregateBy.ts +31 -2
  99. package/Types/BaseDatabase/AggregatedResult.ts +22 -0
  100. package/Types/BaseDatabase/AggregationInterval.ts +11 -0
  101. package/Types/BaseDatabase/AggregationIntervalUtil.ts +30 -5
  102. package/Types/Dashboard/DashboardComponents/DashboardTraceChartComponent.ts +16 -0
  103. package/Types/Email/EmailTemplateType.ts +3 -0
  104. package/Types/Marketing/MarketingConversion.ts +11 -0
  105. package/Types/Metrics/MetricQueryConfigData.ts +21 -0
  106. package/Types/Metrics/MetricQueryData.ts +8 -0
  107. package/Types/Metrics/MetricViewData.ts +8 -0
  108. package/Types/Monitor/MonitorMetricType.ts +8 -0
  109. package/Types/Monitor/MonitorStep.ts +9 -0
  110. package/Types/Monitor/MonitorStepSqlMonitor.ts +12 -0
  111. package/Types/Monitor/MonitorType.ts +2 -1
  112. package/Types/Monitor/SSLMonitor/SslMonitorResponse.ts +17 -12
  113. package/Types/Monitor/SnmpMonitor/CdpNeighbor.ts +13 -0
  114. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +37 -3
  115. package/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.ts +46 -0
  116. package/Types/Monitor/SnmpMonitor/SnmpEntityInfo.ts +15 -0
  117. package/Types/Monitor/SnmpMonitor/SnmpInterface.ts +8 -0
  118. package/Types/Monitor/SnmpMonitor/SnmpMonitorResponse.ts +17 -8
  119. package/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.ts +53 -0
  120. package/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.ts +43 -0
  121. package/Types/Monitor/SnmpMonitor/SnmpSystemInfo.ts +16 -0
  122. package/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.ts +119 -3
  123. package/Types/NetFlow/NetworkFlowRecord.ts +25 -0
  124. package/Types/Syslog/SyslogMessage.ts +18 -0
  125. package/Types/Telemetry/TelemetrySavedViewState.ts +9 -0
  126. package/Types/Telemetry/TelemetrySavedViewType.ts +12 -0
  127. package/UI/Components/Charts/Area/AreaChart.tsx +51 -0
  128. package/UI/Components/Charts/Bar/BarChart.tsx +51 -1
  129. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +97 -26
  130. package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +328 -1
  131. package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +115 -0
  132. package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +328 -1
  133. package/UI/Components/Charts/ChartLibrary/Types/ChartDataPoint.ts +7 -0
  134. package/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.ts +15 -0
  135. package/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.ts +13 -0
  136. package/UI/Components/Charts/Line/LineChart.tsx +51 -0
  137. package/UI/Components/Charts/Types/ReferenceRegionProps.ts +12 -0
  138. package/UI/Components/Charts/Types/TimeReferenceLineProps.ts +12 -0
  139. package/UI/Components/Charts/Types/XAxis/XAxisPrecision.ts +1 -0
  140. package/UI/Components/Charts/Utils/DataPoint.ts +0 -0
  141. package/UI/Components/Charts/Utils/TimeAnnotation.ts +169 -0
  142. package/UI/Components/Charts/Utils/XAxis.ts +28 -4
  143. package/UI/Components/Icon/Icon.tsx +33 -13
  144. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +9 -0
  145. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +67 -0
  146. package/UI/Components/Page/ModelPage.tsx +6 -1
  147. package/UI/Components/TelemetryViewer/components/SavedViewsDropdown.tsx +33 -4
  148. package/UI/Styles/Theme.css +10 -0
  149. package/UI/Utils/User.ts +41 -2
  150. package/Utils/Analytics.ts +8 -6
  151. package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +74 -0
  152. package/Utils/Metrics/MetricExplorerUrl.ts +771 -0
  153. package/Utils/Metrics/MetricFormulaEvaluator.ts +410 -46
  154. package/Utils/Monitor/NetworkTopologyUtil.ts +261 -49
  155. package/Utils/ValueFormatter.ts +22 -1
  156. package/build/dist/Models/AnalyticsModels/Index.js +13 -0
  157. package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
  158. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByContainer.js +159 -0
  159. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByContainer.js.map +1 -0
  160. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.js +158 -0
  161. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.js.map +1 -0
  162. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByService.js +160 -0
  163. package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByService.js.map +1 -0
  164. package/build/dist/Models/AnalyticsModels/NetworkFlow.js +351 -0
  165. package/build/dist/Models/AnalyticsModels/NetworkFlow.js.map +1 -0
  166. package/build/dist/Models/DatabaseModels/EnterpriseLicenseInstance.js +19 -0
  167. package/build/dist/Models/DatabaseModels/EnterpriseLicenseInstance.js.map +1 -1
  168. package/build/dist/Models/DatabaseModels/GlobalConfig.js +38 -0
  169. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  170. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  171. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  172. package/build/dist/Models/DatabaseModels/MarketingConversion.js +219 -0
  173. package/build/dist/Models/DatabaseModels/MarketingConversion.js.map +1 -0
  174. package/build/dist/Models/DatabaseModels/MetricSavedView.js +35 -0
  175. package/build/dist/Models/DatabaseModels/MetricSavedView.js.map +1 -1
  176. package/build/dist/Models/DatabaseModels/MetricType.js +76 -0
  177. package/build/dist/Models/DatabaseModels/MetricType.js.map +1 -1
  178. package/build/dist/Models/DatabaseModels/NetworkDevice.js +341 -0
  179. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  180. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +116 -0
  181. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  182. package/build/dist/Models/DatabaseModels/NetworkInterface.js +60 -0
  183. package/build/dist/Models/DatabaseModels/NetworkInterface.js.map +1 -1
  184. package/build/dist/Models/DatabaseModels/Project.js +38 -0
  185. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  186. package/build/dist/Models/DatabaseModels/User.js +38 -0
  187. package/build/dist/Models/DatabaseModels/User.js.map +1 -1
  188. package/build/dist/Server/API/BaseAnalyticsAPI.js +19 -0
  189. package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
  190. package/build/dist/Server/API/EnterpriseLicenseAPI.js +8 -0
  191. package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
  192. package/build/dist/Server/EnvironmentConfig.js +51 -0
  193. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  194. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784191414522-AddCounterSemanticsToMetricType.js +27 -0
  195. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784191414522-AddCounterSemanticsToMetricType.js.map +1 -0
  196. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784191414600-AddViewTypeToMetricSavedView.js +21 -0
  197. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784191414600-AddViewTypeToMetricSavedView.js.map +1 -0
  198. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784211212164-AddNetworkDeviceInventoryAndDiscoverySchedule.js +47 -0
  199. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784211212164-AddNetworkDeviceInventoryAndDiscoverySchedule.js.map +1 -0
  200. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784218257664-AddEnterpriseLicenseNotificationColumns.js +16 -0
  201. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784218257664-AddEnterpriseLicenseNotificationColumns.js.map +1 -0
  202. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784293516000-AddAttributionColumnsToUserAndProject.js +18 -0
  203. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784293516000-AddAttributionColumnsToUserAndProject.js.map +1 -0
  204. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784298000000-AddMarketingConversionTable.js +20 -0
  205. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784298000000-AddMarketingConversionTable.js.map +1 -0
  206. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784401962564-MigrationName.js +40 -0
  207. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784401962564-MigrationName.js.map +1 -0
  208. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
  209. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  210. package/build/dist/Server/Services/AnalyticsDatabaseService.js +58 -4
  211. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  212. package/build/dist/Server/Services/IncidentService.js +12 -0
  213. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  214. package/build/dist/Server/Services/Index.js +10 -0
  215. package/build/dist/Server/Services/Index.js.map +1 -1
  216. package/build/dist/Server/Services/MarketingConversionService.js +9 -0
  217. package/build/dist/Server/Services/MarketingConversionService.js.map +1 -0
  218. package/build/dist/Server/Services/MetricItemAggMV1mByContainerService.js +29 -0
  219. package/build/dist/Server/Services/MetricItemAggMV1mByContainerService.js.map +1 -0
  220. package/build/dist/Server/Services/MetricItemAggMV1mByK8sClusterService.js +29 -0
  221. package/build/dist/Server/Services/MetricItemAggMV1mByK8sClusterService.js.map +1 -0
  222. package/build/dist/Server/Services/MetricItemAggMV1mByServiceService.js +29 -0
  223. package/build/dist/Server/Services/MetricItemAggMV1mByServiceService.js.map +1 -0
  224. package/build/dist/Server/Services/MetricService.js +761 -125
  225. package/build/dist/Server/Services/MetricService.js.map +1 -1
  226. package/build/dist/Server/Services/MonitorService.js +18 -5
  227. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  228. package/build/dist/Server/Services/NetworkDeviceOwnerTeamService.js +44 -0
  229. package/build/dist/Server/Services/NetworkDeviceOwnerTeamService.js.map +1 -1
  230. package/build/dist/Server/Services/NetworkDeviceOwnerUserService.js +88 -0
  231. package/build/dist/Server/Services/NetworkDeviceOwnerUserService.js.map +1 -1
  232. package/build/dist/Server/Services/NetworkFlowService.js +9 -0
  233. package/build/dist/Server/Services/NetworkFlowService.js.map +1 -0
  234. package/build/dist/Server/Services/OnCallDutyPolicyService.js +15 -6
  235. package/build/dist/Server/Services/OnCallDutyPolicyService.js.map +1 -1
  236. package/build/dist/Server/Services/ProjectService.js +107 -6
  237. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  238. package/build/dist/Server/Services/SpanService.js +8 -6
  239. package/build/dist/Server/Services/SpanService.js.map +1 -1
  240. package/build/dist/Server/Services/StatusPageService.js +10 -0
  241. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  242. package/build/dist/Server/Services/TeamMemberService.js +11 -0
  243. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  244. package/build/dist/Server/Services/UserService.js +52 -0
  245. package/build/dist/Server/Services/UserService.js.map +1 -1
  246. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js +33 -7
  247. package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js.map +1 -1
  248. package/build/dist/Server/Utils/Attribution.js +74 -0
  249. package/build/dist/Server/Utils/Attribution.js.map +1 -0
  250. package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js +40 -0
  251. package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js.map +1 -0
  252. package/build/dist/Server/Utils/Marketing/ConversionUploadProviders.js +20 -0
  253. package/build/dist/Server/Utils/Marketing/ConversionUploadProviders.js.map +1 -0
  254. package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js +177 -0
  255. package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js.map +1 -0
  256. package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js +113 -0
  257. package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js.map +1 -0
  258. package/build/dist/Server/Utils/Marketing/Providers/Meta.js +109 -0
  259. package/build/dist/Server/Utils/Marketing/Providers/Meta.js.map +1 -0
  260. package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js +130 -0
  261. package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js.map +1 -0
  262. package/build/dist/Server/Utils/Marketing/Providers/Reddit.js +126 -0
  263. package/build/dist/Server/Utils/Marketing/Providers/Reddit.js.map +1 -0
  264. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +53 -9
  265. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  266. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +21 -10
  267. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  268. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +54 -11
  269. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  270. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +43 -3
  271. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  272. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +68 -0
  273. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  274. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +15 -0
  275. package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
  276. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +100 -15
  277. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  278. package/build/dist/Server/Utils/ProductAnalytics.js +111 -0
  279. package/build/dist/Server/Utils/ProductAnalytics.js.map +1 -0
  280. package/build/dist/Server/Utils/Telemetry/Telemetry.js +32 -5
  281. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  282. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +17 -0
  283. package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
  284. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +11 -0
  285. package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
  286. package/build/dist/Types/BaseDatabase/AggregationInterval.js +11 -0
  287. package/build/dist/Types/BaseDatabase/AggregationInterval.js.map +1 -1
  288. package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js +33 -5
  289. package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js.map +1 -1
  290. package/build/dist/Types/Email/EmailTemplateType.js +2 -0
  291. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  292. package/build/dist/Types/Marketing/MarketingConversion.js +13 -0
  293. package/build/dist/Types/Marketing/MarketingConversion.js.map +1 -0
  294. package/build/dist/Types/Monitor/MonitorMetricType.js +7 -0
  295. package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
  296. package/build/dist/Types/Monitor/MonitorStep.js +6 -0
  297. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  298. package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js +3 -0
  299. package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -1
  300. package/build/dist/Types/Monitor/MonitorType.js +2 -1
  301. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  302. package/build/dist/Types/Monitor/SnmpMonitor/CdpNeighbor.js +2 -0
  303. package/build/dist/Types/Monitor/SnmpMonitor/CdpNeighbor.js.map +1 -0
  304. package/build/dist/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.js +41 -0
  305. package/build/dist/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.js.map +1 -1
  306. package/build/dist/Types/Monitor/SnmpMonitor/SnmpEntityInfo.js +2 -0
  307. package/build/dist/Types/Monitor/SnmpMonitor/SnmpEntityInfo.js.map +1 -0
  308. package/build/dist/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.js +48 -0
  309. package/build/dist/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.js.map +1 -1
  310. package/build/dist/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.js +38 -0
  311. package/build/dist/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.js.map +1 -1
  312. package/build/dist/Types/Monitor/SnmpMonitor/SnmpSystemInfo.js +2 -0
  313. package/build/dist/Types/Monitor/SnmpMonitor/SnmpSystemInfo.js.map +1 -0
  314. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js +96 -3
  315. package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js.map +1 -1
  316. package/build/dist/Types/NetFlow/NetworkFlowRecord.js +2 -0
  317. package/build/dist/Types/NetFlow/NetworkFlowRecord.js.map +1 -0
  318. package/build/dist/Types/Syslog/SyslogMessage.js +2 -0
  319. package/build/dist/Types/Syslog/SyslogMessage.js.map +1 -0
  320. package/build/dist/Types/Telemetry/TelemetrySavedViewState.js +0 -7
  321. package/build/dist/Types/Telemetry/TelemetrySavedViewState.js.map +1 -1
  322. package/build/dist/Types/Telemetry/TelemetrySavedViewType.js +13 -0
  323. package/build/dist/Types/Telemetry/TelemetrySavedViewType.js.map +1 -0
  324. package/build/dist/UI/Components/Charts/Area/AreaChart.js +25 -1
  325. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  326. package/build/dist/UI/Components/Charts/Bar/BarChart.js +26 -2
  327. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  328. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +36 -12
  329. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  330. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +208 -6
  331. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
  332. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +52 -3
  333. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
  334. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +208 -6
  335. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
  336. package/build/dist/UI/Components/Charts/ChartLibrary/Types/ChartDataPoint.js +6 -1
  337. package/build/dist/UI/Components/Charts/ChartLibrary/Types/ChartDataPoint.js.map +1 -1
  338. package/build/dist/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.js +2 -0
  339. package/build/dist/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.js.map +1 -0
  340. package/build/dist/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.js +2 -0
  341. package/build/dist/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.js.map +1 -0
  342. package/build/dist/UI/Components/Charts/Line/LineChart.js +25 -1
  343. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  344. package/build/dist/UI/Components/Charts/Types/ReferenceRegionProps.js +2 -0
  345. package/build/dist/UI/Components/Charts/Types/ReferenceRegionProps.js.map +1 -0
  346. package/build/dist/UI/Components/Charts/Types/TimeReferenceLineProps.js +2 -0
  347. package/build/dist/UI/Components/Charts/Types/TimeReferenceLineProps.js.map +1 -0
  348. package/build/dist/UI/Components/Charts/Types/XAxis/XAxisPrecision.js +1 -0
  349. package/build/dist/UI/Components/Charts/Types/XAxis/XAxisPrecision.js.map +1 -1
  350. package/build/dist/UI/Components/Charts/Utils/DataPoint.js +0 -0
  351. package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
  352. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +121 -0
  353. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -0
  354. package/build/dist/UI/Components/Charts/Utils/XAxis.js +27 -4
  355. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  356. package/build/dist/UI/Components/Icon/Icon.js +15 -8
  357. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  358. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  359. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +58 -0
  360. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  361. package/build/dist/UI/Components/Page/ModelPage.js +7 -1
  362. package/build/dist/UI/Components/Page/ModelPage.js.map +1 -1
  363. package/build/dist/UI/Components/TelemetryViewer/components/SavedViewsDropdown.js +10 -4
  364. package/build/dist/UI/Components/TelemetryViewer/components/SavedViewsDropdown.js.map +1 -1
  365. package/build/dist/UI/Utils/User.js +35 -2
  366. package/build/dist/UI/Utils/User.js.map +1 -1
  367. package/build/dist/Utils/Analytics.js +8 -5
  368. package/build/dist/Utils/Analytics.js.map +1 -1
  369. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +57 -0
  370. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
  371. package/build/dist/Utils/Metrics/MetricExplorerUrl.js +418 -0
  372. package/build/dist/Utils/Metrics/MetricExplorerUrl.js.map +1 -0
  373. package/build/dist/Utils/Metrics/MetricFormulaEvaluator.js +296 -37
  374. package/build/dist/Utils/Metrics/MetricFormulaEvaluator.js.map +1 -1
  375. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +176 -40
  376. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  377. package/build/dist/Utils/ValueFormatter.js +20 -1
  378. package/build/dist/Utils/ValueFormatter.js.map +1 -1
  379. package/package.json +4 -3
@@ -48,7 +48,7 @@ const MIKROTIK: SnmpVendorTemplate = {
48
48
  id: "mikrotik-routeros",
49
49
  label: "MikroTik RouterOS",
50
50
  description:
51
- "CPU load, CPU temperature, and voltage from the MikroTik health MIB, plus standard Host Resources CPU.",
51
+ "CPU load, board temperature, and voltage from the MikroTik health MIB, plus standard Host Resources CPU.",
52
52
  oids: [
53
53
  {
54
54
  oid: "1.3.6.1.2.1.25.3.3.1.2.1",
@@ -56,9 +56,10 @@ const MIKROTIK: SnmpVendorTemplate = {
56
56
  description: "hrProcessorLoad — first processor.",
57
57
  },
58
58
  {
59
+ // .10.0 is mtxrHlTemperature (board temp); processor temp is .11.0.
59
60
  oid: "1.3.6.1.4.1.14988.1.1.3.10.0",
60
- name: "CPU Temperature (C)",
61
- description: "mtxrHlProcessorTemperature.",
61
+ name: "Temperature (C)",
62
+ description: "mtxrHlTemperature — system/board temperature.",
62
63
  },
63
64
  {
64
65
  oid: "1.3.6.1.4.1.14988.1.1.3.8.0",
@@ -128,6 +129,58 @@ export const SnmpVendorTemplates: Array<SnmpVendorTemplate> = [
128
129
  UBIQUITI,
129
130
  ];
130
131
 
132
+ /*
133
+ * IANA private-enterprise numbers → vendor display names, for the vendors
134
+ * that actually show up on monitored networks. Used to derive a vendor from
135
+ * sysObjectID (1.3.6.1.4.1.<enterprise>...) when the device does not
136
+ * implement ENTITY-MIB. Not exhaustive by design — unknown enterprises just
137
+ * leave the vendor blank.
138
+ */
139
+ const ENTERPRISE_VENDOR_NAMES: Record<number, string> = {
140
+ 9: "Cisco",
141
+ 11: "HPE",
142
+ 43: "3Com",
143
+ 171: "D-Link",
144
+ 207: "Allied Telesis",
145
+ 674: "Dell",
146
+ 1588: "Brocade",
147
+ 1916: "Extreme Networks",
148
+ 2011: "Huawei",
149
+ 2021: "Net-SNMP",
150
+ 2636: "Juniper",
151
+ 3224: "NetScreen",
152
+ 3375: "F5",
153
+ 4526: "Netgear",
154
+ 6027: "Force10",
155
+ 6486: "Alcatel-Lucent",
156
+ 6574: "Synology",
157
+ 8072: "Net-SNMP",
158
+ 9303: "PacketFront",
159
+ 10002: "Frogfoot",
160
+ 11863: "TP-Link",
161
+ 12325: "pfSense",
162
+ 12356: "Fortinet",
163
+ 14823: "Aruba",
164
+ 14988: "MikroTik",
165
+ 17163: "Riverbed",
166
+ 22610: "Vyatta",
167
+ 24681: "QNAP",
168
+ 25461: "Palo Alto Networks",
169
+ 25506: "H3C",
170
+ 26543: "Yamaha",
171
+ 30065: "Arista",
172
+ 35098: "PICA8",
173
+ 41112: "Ubiquiti",
174
+ 47196: "OPNsense",
175
+ };
176
+
177
+ // sysObjectID template routing: enterprise number → vendor template id.
178
+ const ENTERPRISE_TEMPLATE_IDS: Record<number, string> = {
179
+ 9: "cisco-ios",
180
+ 14988: "mikrotik-routeros",
181
+ 41112: "ubiquiti-edgeos",
182
+ };
183
+
131
184
  export default class SnmpVendorTemplateUtil {
132
185
  public static getAll(): Array<SnmpVendorTemplate> {
133
186
  return SnmpVendorTemplates;
@@ -139,6 +192,69 @@ export default class SnmpVendorTemplateUtil {
139
192
  });
140
193
  }
141
194
 
195
+ /*
196
+ * Extracts the IANA private-enterprise number from a sysObjectID value
197
+ * ("1.3.6.1.4.1.<enterprise>...", with or without a leading dot). Returns
198
+ * undefined for OIDs outside the enterprises arc (e.g. the mib-2 values
199
+ * some appliances report).
200
+ */
201
+ public static getEnterpriseNumber(
202
+ sysObjectId: string | undefined,
203
+ ): number | undefined {
204
+ if (!sysObjectId) {
205
+ return undefined;
206
+ }
207
+
208
+ const normalized: string = sysObjectId.trim().replace(/^\./, "");
209
+ const enterprisesPrefix: string = "1.3.6.1.4.1.";
210
+
211
+ if (!normalized.startsWith(enterprisesPrefix)) {
212
+ return undefined;
213
+ }
214
+
215
+ const enterprisePart: string | undefined = normalized
216
+ .substring(enterprisesPrefix.length)
217
+ .split(".")[0];
218
+
219
+ const enterpriseNumber: number = parseInt(enterprisePart || "", 10);
220
+ return isNaN(enterpriseNumber) ? undefined : enterpriseNumber;
221
+ }
222
+
223
+ public static getVendorNameBySysObjectId(
224
+ sysObjectId: string | undefined,
225
+ ): string | undefined {
226
+ const enterpriseNumber: number | undefined =
227
+ SnmpVendorTemplateUtil.getEnterpriseNumber(sysObjectId);
228
+
229
+ if (enterpriseNumber === undefined) {
230
+ return undefined;
231
+ }
232
+
233
+ return ENTERPRISE_VENDOR_NAMES[enterpriseNumber];
234
+ }
235
+
236
+ /*
237
+ * Suggests the vendor OID template matching a device's sysObjectID.
238
+ * Returns undefined when no vendor-specific template exists — callers can
239
+ * fall back to the generic Host Resources template, which most
240
+ * Linux-based appliances answer.
241
+ */
242
+ public static matchBySysObjectId(
243
+ sysObjectId: string | undefined,
244
+ ): SnmpVendorTemplate | undefined {
245
+ const enterpriseNumber: number | undefined =
246
+ SnmpVendorTemplateUtil.getEnterpriseNumber(sysObjectId);
247
+
248
+ if (enterpriseNumber === undefined) {
249
+ return undefined;
250
+ }
251
+
252
+ const templateId: string | undefined =
253
+ ENTERPRISE_TEMPLATE_IDS[enterpriseNumber];
254
+
255
+ return templateId ? SnmpVendorTemplateUtil.getById(templateId) : undefined;
256
+ }
257
+
142
258
  /*
143
259
  * Merges a template's OIDs into an existing list, skipping any OID already
144
260
  * present so applying a template twice (or applying two overlapping ones)
@@ -0,0 +1,25 @@
1
+ /*
2
+ * One network flow parsed from a NetFlow v5 record, forwarded by a probe's
3
+ * NetFlow receiver to the server, where it is correlated to a NetworkDevice
4
+ * by the EXPORTER's IP address (the router/switch that sent the datagram)
5
+ * and written into the ClickHouse NetworkFlow table. Source/destination
6
+ * describe the traffic itself; exporterIpAddress identifies the device that
7
+ * observed it. Flow timestamps are converted to wall-clock time by the
8
+ * probe from the datagram's sysUptime/unixSecs header fields.
9
+ */
10
+ export default interface NetworkFlowRecord {
11
+ exporterIpAddress: string;
12
+ sourceIpAddress: string;
13
+ destinationIpAddress: string;
14
+ sourcePort: number;
15
+ destinationPort: number;
16
+ protocolNumber: number;
17
+ octets: number;
18
+ packets: number;
19
+ flowStartAt: Date;
20
+ flowEndAt: Date;
21
+ inputInterfaceIndex?: number | undefined;
22
+ outputInterfaceIndex?: number | undefined;
23
+ tcpFlags?: number | undefined;
24
+ tos?: number | undefined;
25
+ }
@@ -0,0 +1,18 @@
1
+ /*
2
+ * A syslog message received by a probe's syslog receiver and forwarded to
3
+ * the server, where it is correlated to a NetworkDevice by source IP and
4
+ * written into the telemetry Logs pipeline. Facility and severity are the
5
+ * RFC 5424 numerical codes decoded from the message's <PRI> prefix
6
+ * (facility 0-23, severity 0-7). The timestamp comes from the message
7
+ * itself when parseable, otherwise it equals receivedAt.
8
+ */
9
+ export default interface SyslogMessage {
10
+ sourceIpAddress: string;
11
+ facility: number;
12
+ severity: number;
13
+ timestamp: Date;
14
+ hostname?: string | undefined;
15
+ appName?: string | undefined;
16
+ message: string;
17
+ receivedAt: Date;
18
+ }
@@ -1,3 +1,5 @@
1
+ import { JSONObject } from "../JSON";
2
+
1
3
  /*
2
4
  * Serializable view state for the Metrics and Traces explorers. Stored in the
3
5
  * `query` JSONB column of MetricSavedView / TraceSavedView. This is the same
@@ -25,4 +27,11 @@ export default interface TelemetrySavedViewState {
25
27
  pageSize?: number | undefined;
26
28
  // Traces explorer: root-spans-only toggle (defaults to true when absent).
27
29
  rootOnly?: boolean | undefined;
30
+ /*
31
+ * Metrics explorer: the full chart-builder state — MetricsViewConfig-
32
+ * shaped { queryConfigs, formulaConfigs } plus a time-range token.
33
+ * Kept loosely typed like the rest of this state: the explorer owns
34
+ * serialization and must deserialize defensively.
35
+ */
36
+ explorerConfig?: JSONObject | undefined;
28
37
  }
@@ -0,0 +1,12 @@
1
+ /*
2
+ * Which explorer surface a saved telemetry view belongs to. Stored in the
3
+ * nullable `viewType` column of MetricSavedView — NULL is treated as List
4
+ * for back-compat (every row created before the column existed came from
5
+ * the list page).
6
+ */
7
+ enum TelemetrySavedViewType {
8
+ List = "list",
9
+ Explorer = "explorer",
10
+ }
11
+
12
+ export default TelemetrySavedViewType;
@@ -15,8 +15,13 @@ import YAxis from "../Types/YAxis/YAxis";
15
15
  import ChartCurve from "../Types/ChartCurve";
16
16
  import ChartDataPoint from "../ChartLibrary/Types/ChartDataPoint";
17
17
  import FormattedExemplarPoint from "../ChartLibrary/Types/FormattedExemplarPoint";
18
+ import FormattedReferenceRegion from "../ChartLibrary/Types/FormattedReferenceRegion";
19
+ import FormattedTimeReferenceLine from "../ChartLibrary/Types/FormattedTimeReferenceLine";
18
20
  import DataPointUtil from "../Utils/DataPoint";
21
+ import TimeAnnotationUtil from "../Utils/TimeAnnotation";
19
22
  import ChartReferenceLineProps from "../Types/ReferenceLineProps";
23
+ import ChartReferenceRegionProps from "../Types/ReferenceRegionProps";
24
+ import ChartTimeReferenceLineProps from "../Types/TimeReferenceLineProps";
20
25
  import ExemplarPoint from "../Types/ExemplarPoint";
21
26
  import XAxisUtil from "../Utils/XAxis";
22
27
  import NoDataMessage from "../ChartGroup/NoDataMessage";
@@ -42,8 +47,20 @@ export interface ComponentProps {
42
47
  sync: boolean;
43
48
  heightInPx?: number | undefined;
44
49
  referenceLines?: Array<ChartReferenceLineProps> | undefined;
50
+ /*
51
+ * Time-anchored annotations: vertical event markers and shaded regions.
52
+ * Dates are snapped onto the categorical x-axis buckets; annotations
53
+ * outside the charted window are dropped (regions clamp to the edge).
54
+ */
55
+ timeReferenceLines?: Array<ChartTimeReferenceLineProps> | undefined;
56
+ referenceRegions?: Array<ChartReferenceRegionProps> | undefined;
45
57
  exemplarPoints?: Array<ExemplarPoint> | undefined;
46
58
  onExemplarClick?: ((exemplar: ExemplarPoint) => void) | undefined;
59
+ /*
60
+ * When provided, the chart supports drag-to-select: dragging across
61
+ * buckets calls back with the [start, end) of the selected time range.
62
+ */
63
+ onTimeRangeSelect?: ((startTime: Date, endTime: Date) => void) | undefined;
47
64
  showLegend?: boolean | undefined;
48
65
  /**
49
66
  * Render a shaded "expected range" band underneath the plotted lines.
@@ -117,6 +134,29 @@ const AreaChartElement: FunctionComponent<AreaInternalProps> = (
117
134
  });
118
135
  }, [props.exemplarPoints, props.xAxis]);
119
136
 
137
+ // Snap time annotations onto the categorical x-axis bucket labels
138
+ const formattedTimeReferenceLines: Array<FormattedTimeReferenceLine> =
139
+ useMemo(() => {
140
+ if (!props.timeReferenceLines || props.timeReferenceLines.length === 0) {
141
+ return [];
142
+ }
143
+ return TimeAnnotationUtil.formatTimeReferenceLines({
144
+ timeReferenceLines: props.timeReferenceLines,
145
+ xAxis: props.xAxis,
146
+ });
147
+ }, [props.timeReferenceLines, props.xAxis]);
148
+
149
+ const formattedReferenceRegions: Array<FormattedReferenceRegion> =
150
+ useMemo(() => {
151
+ if (!props.referenceRegions || props.referenceRegions.length === 0) {
152
+ return [];
153
+ }
154
+ return TimeAnnotationUtil.formatReferenceRegions({
155
+ referenceRegions: props.referenceRegions,
156
+ xAxis: props.xAxis,
157
+ });
158
+ }, [props.referenceRegions, props.xAxis]);
159
+
120
160
  const hasNoData: boolean =
121
161
  !props.data ||
122
162
  props.data.length === 0 ||
@@ -164,10 +204,21 @@ const AreaChartElement: FunctionComponent<AreaInternalProps> = (
164
204
  {...maxValueProp}
165
205
  onValueChange={() => {}}
166
206
  referenceLines={props.referenceLines}
207
+ formattedTimeReferenceLines={
208
+ formattedTimeReferenceLines.length > 0
209
+ ? formattedTimeReferenceLines
210
+ : undefined
211
+ }
212
+ formattedReferenceRegions={
213
+ formattedReferenceRegions.length > 0
214
+ ? formattedReferenceRegions
215
+ : undefined
216
+ }
167
217
  formattedExemplarPoints={
168
218
  formattedExemplars.length > 0 ? formattedExemplars : undefined
169
219
  }
170
220
  onExemplarClick={props.onExemplarClick}
221
+ onTimeRangeSelect={props.onTimeRangeSelect}
171
222
  anomalyBandLowerKey={bandLower}
172
223
  anomalyBandUpperKey={bandUpper}
173
224
  />
@@ -3,13 +3,23 @@ import {
3
3
  AvailableChartColorsKeys,
4
4
  ChartColorValue,
5
5
  } from "../ChartLibrary/Utils/ChartColors";
6
- import React, { FunctionComponent, ReactElement, useEffect } from "react";
6
+ import React, {
7
+ FunctionComponent,
8
+ ReactElement,
9
+ useEffect,
10
+ useMemo,
11
+ } from "react";
7
12
  import SeriesPoint from "../Types/SeriesPoints";
8
13
  import { XAxis } from "../Types/XAxis/XAxis";
9
14
  import YAxis from "../Types/YAxis/YAxis";
10
15
  import ChartDataPoint from "../ChartLibrary/Types/ChartDataPoint";
16
+ import FormattedReferenceRegion from "../ChartLibrary/Types/FormattedReferenceRegion";
17
+ import FormattedTimeReferenceLine from "../ChartLibrary/Types/FormattedTimeReferenceLine";
11
18
  import DataPointUtil from "../Utils/DataPoint";
19
+ import TimeAnnotationUtil from "../Utils/TimeAnnotation";
12
20
  import ChartReferenceLineProps from "../Types/ReferenceLineProps";
21
+ import ChartReferenceRegionProps from "../Types/ReferenceRegionProps";
22
+ import ChartTimeReferenceLineProps from "../Types/TimeReferenceLineProps";
13
23
  import NoDataMessage from "../ChartGroup/NoDataMessage";
14
24
 
15
25
  export const BarChartPalette: Array<AvailableChartColorsKeys> = [
@@ -31,6 +41,13 @@ export interface ComponentProps {
31
41
  sync: boolean;
32
42
  heightInPx?: number | undefined;
33
43
  referenceLines?: Array<ChartReferenceLineProps> | undefined;
44
+ /*
45
+ * Time-anchored annotations: vertical event markers and shaded regions.
46
+ * Dates are snapped onto the categorical x-axis buckets; annotations
47
+ * outside the charted window are dropped (regions clamp to the edge).
48
+ */
49
+ timeReferenceLines?: Array<ChartTimeReferenceLineProps> | undefined;
50
+ referenceRegions?: Array<ChartReferenceRegionProps> | undefined;
34
51
  showLegend?: boolean | undefined;
35
52
  /*
36
53
  * Optional per-series color override. Each entry may be a named palette key
@@ -64,6 +81,29 @@ const BarChartElement: FunctionComponent<BarInternalProps> = (
64
81
  setRecords(records);
65
82
  }, [props.data]);
66
83
 
84
+ // Snap time annotations onto the categorical x-axis bucket labels
85
+ const formattedTimeReferenceLines: Array<FormattedTimeReferenceLine> =
86
+ useMemo(() => {
87
+ if (!props.timeReferenceLines || props.timeReferenceLines.length === 0) {
88
+ return [];
89
+ }
90
+ return TimeAnnotationUtil.formatTimeReferenceLines({
91
+ timeReferenceLines: props.timeReferenceLines,
92
+ xAxis: props.xAxis,
93
+ });
94
+ }, [props.timeReferenceLines, props.xAxis]);
95
+
96
+ const formattedReferenceRegions: Array<FormattedReferenceRegion> =
97
+ useMemo(() => {
98
+ if (!props.referenceRegions || props.referenceRegions.length === 0) {
99
+ return [];
100
+ }
101
+ return TimeAnnotationUtil.formatReferenceRegions({
102
+ referenceRegions: props.referenceRegions,
103
+ xAxis: props.xAxis,
104
+ });
105
+ }, [props.referenceRegions, props.xAxis]);
106
+
67
107
  const hasNoData: boolean =
68
108
  !props.data ||
69
109
  props.data.length === 0 ||
@@ -93,6 +133,16 @@ const BarChartElement: FunctionComponent<BarInternalProps> = (
93
133
  syncid={props.sync ? props.syncid : undefined}
94
134
  onValueChange={() => {}}
95
135
  referenceLines={props.referenceLines}
136
+ formattedTimeReferenceLines={
137
+ formattedTimeReferenceLines.length > 0
138
+ ? formattedTimeReferenceLines
139
+ : undefined
140
+ }
141
+ formattedReferenceRegions={
142
+ formattedReferenceRegions.length > 0
143
+ ? formattedReferenceRegions
144
+ : undefined
145
+ }
96
146
  />
97
147
  {hasNoData && <NoDataMessage />}
98
148
  </div>
@@ -37,6 +37,13 @@ export interface Chart {
37
37
  metricInfo?: ChartMetricInfo | undefined;
38
38
  exemplarPoints?: Array<ExemplarPoint> | undefined;
39
39
  onExemplarClick?: ((exemplar: ExemplarPoint) => void) | undefined;
40
+ /**
41
+ * Optional "Open in Explorer" action rendered as an icon button in the
42
+ * chart header next to the info icon. Kept as a plain callback so this
43
+ * shared component stays free of any app's routing — callers build the
44
+ * explorer URL and navigate themselves.
45
+ */
46
+ onOpenInExplorer?: (() => void) | undefined;
40
47
  /**
41
48
  * Optional control panel rendered directly below the chart body. Used by
42
49
  * per-series-grouped metric charts to surface a search box, a sort
@@ -109,6 +116,29 @@ const ChartGroup: FunctionComponent<ComponentProps> = (
109
116
  }
110
117
  };
111
118
 
119
+ type GetDragToZoomHintFunction = (chart: Chart) => ReactElement;
120
+
121
+ // Same subtle hint the log/telemetry histograms show for drag-to-zoom.
122
+ const getDragToZoomHint: GetDragToZoomHintFunction = (
123
+ chart: Chart,
124
+ ): ReactElement => {
125
+ const supportsTimeRangeSelect: boolean =
126
+ (chart.type === ChartType.LINE || chart.type === ChartType.AREA) &&
127
+ Boolean(
128
+ (chart.props as LineChartProps | AreaChartProps).onTimeRangeSelect,
129
+ );
130
+
131
+ if (!supportsTimeRangeSelect) {
132
+ return <></>;
133
+ }
134
+
135
+ return (
136
+ <span className="ml-auto shrink-0 whitespace-nowrap text-[10px] text-gray-400">
137
+ Drag to zoom
138
+ </span>
139
+ );
140
+ };
141
+
112
142
  type GetInfoIconFunction = (chart: Chart) => ReactElement;
113
143
 
114
144
  const getInfoIcon: GetInfoIconFunction = (chart: Chart): ReactElement => {
@@ -119,7 +149,7 @@ const ChartGroup: FunctionComponent<ComponentProps> = (
119
149
  return (
120
150
  <button
121
151
  type="button"
122
- className="ml-1.5 inline-flex items-center justify-center rounded-full w-5 h-5 text-gray-300 hover:text-gray-500 hover:bg-gray-100 transition-all duration-150"
152
+ className="ml-1.5 inline-flex items-center justify-center rounded-full w-5 h-5 text-gray-400 hover:text-gray-600 hover:bg-gray-100 transition-all duration-150"
123
153
  title="View metric details"
124
154
  onClick={() => {
125
155
  setMetricInfoModalChart(chart.metricInfo || null);
@@ -134,6 +164,33 @@ const ChartGroup: FunctionComponent<ComponentProps> = (
134
164
  );
135
165
  };
136
166
 
167
+ type GetExplorerIconFunction = (chart: Chart) => ReactElement;
168
+
169
+ const getExplorerIcon: GetExplorerIconFunction = (
170
+ chart: Chart,
171
+ ): ReactElement => {
172
+ if (!chart.onOpenInExplorer) {
173
+ return <></>;
174
+ }
175
+
176
+ return (
177
+ <button
178
+ type="button"
179
+ className="ml-1.5 inline-flex items-center justify-center rounded-full w-5 h-5 text-gray-400 hover:text-gray-600 hover:bg-gray-100 transition-all duration-150"
180
+ title="Open in Metric Explorer"
181
+ onClick={() => {
182
+ chart.onOpenInExplorer?.();
183
+ }}
184
+ >
185
+ <Icon
186
+ icon={IconProp.ExternalLink}
187
+ size={SizeProp.Smaller}
188
+ className="h-3.5 w-3.5"
189
+ />
190
+ </button>
191
+ );
192
+ };
193
+
137
194
  const renderMetricInfoModal: () => ReactElement = (): ReactElement => {
138
195
  if (!metricInfoModalChart) {
139
196
  return <></>;
@@ -250,10 +307,15 @@ const ChartGroup: FunctionComponent<ComponentProps> = (
250
307
  <div className="px-5 pt-4 pb-4 flex flex-col flex-1">
251
308
  <div className="mb-3 pb-3 border-b border-gray-100">
252
309
  <div className="flex items-center">
253
- <h3 className="text-sm font-semibold text-gray-800 tracking-tight">
310
+ <h3
311
+ className="min-w-0 truncate text-sm font-semibold text-gray-800 tracking-tight"
312
+ title={chart.title}
313
+ >
254
314
  {chart.title}
255
315
  </h3>
256
316
  {getInfoIcon(chart)}
317
+ {getExplorerIcon(chart)}
318
+ {getDragToZoomHint(chart)}
257
319
  </div>
258
320
  {chart.description && (
259
321
  <p className="mt-1 text-xs text-gray-500 hidden md:block">
@@ -263,7 +325,7 @@ const ChartGroup: FunctionComponent<ComponentProps> = (
263
325
  </div>
264
326
  {getChartContent(chart, index)}
265
327
  {chart.seriesControls ? (
266
- <div className="mb-3">{chart.seriesControls}</div>
328
+ <div className="mt-3">{chart.seriesControls}</div>
267
329
  ) : null}
268
330
  </div>
269
331
  </div>
@@ -281,37 +343,46 @@ const ChartGroup: FunctionComponent<ComponentProps> = (
281
343
  return (
282
344
  <>
283
345
  {renderMetricInfoModal()}
284
- <div
285
- className={`grid grid-cols-1 ${gridCols} gap-4 space-y-4 lg:space-y-0`}
286
- >
346
+ <div className={`grid grid-cols-1 ${gridCols} gap-4`}>
287
347
  {props.charts.map((chart: Chart, index: number) => {
288
348
  return (
289
349
  <div
290
350
  key={index}
291
- className={`p-5 rounded-lg border border-gray-200 bg-white shadow-sm flex flex-col gap-3 ${props.chartCssClass || ""}`}
351
+ className={`flex flex-col rounded-lg border border-gray-200 bg-white shadow-sm ${props.chartCssClass || ""}`}
292
352
  >
293
- <div className="flex items-center">
294
- <h2
295
- data-testid="card-details-heading"
296
- id="card-details-heading"
297
- className="text-base font-semibold leading-6 text-gray-900"
298
- >
299
- {chart.title}
300
- </h2>
301
- {getInfoIcon(chart)}
353
+ {/* Header strip — title, meta icons, hover-revealed zoom hint */}
354
+ <div className="border-b border-gray-100 px-4 py-2.5">
355
+ <div className="flex items-center">
356
+ <h2
357
+ data-testid="card-details-heading"
358
+ id="card-details-heading"
359
+ className="min-w-0 truncate text-sm font-semibold leading-6 text-gray-900"
360
+ title={chart.title}
361
+ >
362
+ {chart.title}
363
+ </h2>
364
+ {getInfoIcon(chart)}
365
+ {getExplorerIcon(chart)}
366
+ {getDragToZoomHint(chart)}
367
+ </div>
368
+ {chart.description && (
369
+ <p
370
+ data-testid="card-description"
371
+ className="mt-0.5 w-full truncate text-xs text-gray-500 hidden md:block"
372
+ title={chart.description}
373
+ >
374
+ {chart.description}
375
+ </p>
376
+ )}
302
377
  </div>
303
- {chart.description && (
304
- <p
305
- data-testid="card-description"
306
- className="mt-0.5 text-sm text-gray-500 w-full hidden md:block"
307
- >
308
- {chart.description}
309
- </p>
310
- )}
311
- <div className="flex-1 flex flex-col min-h-80">
378
+ <div className="flex-1 flex flex-col min-h-80 px-4 pt-3 pb-2">
312
379
  {getChartContent(chart, index)}
313
380
  </div>
314
- {chart.seriesControls ? chart.seriesControls : null}
381
+ {chart.seriesControls ? (
382
+ <div className="border-t border-gray-100 px-4 py-3">
383
+ {chart.seriesControls}
384
+ </div>
385
+ ) : null}
315
386
  </div>
316
387
  );
317
388
  })}