@oneuptime/common 12.0.11 → 12.0.13

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 (251) hide show
  1. package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +32 -5
  2. package/Models/DatabaseModels/NetworkDevice.ts +64 -0
  3. package/Models/DatabaseModels/StatusPage.ts +59 -0
  4. package/Models/DatabaseModels/StatusPageOidc.ts +2 -0
  5. package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +19 -2
  6. package/Server/API/AIChatAPI.ts +55 -56
  7. package/Server/API/CommonAPI.ts +89 -0
  8. package/Server/API/MicrosoftTeamsAPI.ts +20 -9
  9. package/Server/API/SlackAPI.ts +13 -10
  10. package/Server/API/StatusPageAPI.ts +2197 -2128
  11. package/Server/API/TelemetryAPI.ts +72 -3
  12. package/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.ts +30 -0
  13. package/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.ts +47 -0
  14. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
  15. package/Server/Middleware/UserAuthorization.ts +11 -2
  16. package/Server/Services/ApiKeyPermissionService.ts +116 -2
  17. package/Server/Services/DatabaseService.ts +17 -6
  18. package/Server/Services/LogAggregationService.ts +34 -0
  19. package/Server/Services/LogService.ts +21 -0
  20. package/Server/Services/NetworkSiteService.ts +12 -0
  21. package/Server/Services/SpanService.ts +21 -0
  22. package/Server/Services/TraceAggregationService.ts +15 -0
  23. package/Server/Services/WorkspaceNotificationRuleService.ts +172 -220
  24. package/Server/Types/AnalyticsDatabase/ModelPermission.ts +9 -0
  25. package/Server/Types/Database/Permissions/AccessControlPermission.ts +47 -16
  26. package/Server/Types/Workflow/Components/Conditions/IfElse.ts +9 -0
  27. package/Server/Types/Workflow/Components/JavaScript.ts +9 -0
  28. package/Server/Utils/APIKey/AccessPermission.ts +16 -40
  29. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +144 -0
  30. package/Server/Utils/LogRedaction.ts +576 -0
  31. package/Server/Utils/Logger.ts +123 -46
  32. package/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.ts +94 -23
  33. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +12 -0
  34. package/Server/Utils/Monitor/MonitorResource.ts +29 -9
  35. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +28 -7
  36. package/Server/Utils/SessionReplay/SessionReplayGateCacheStore.ts +56 -10
  37. package/Server/Utils/StartServer.ts +30 -9
  38. package/Server/Utils/StatusPageSearchEngineIndexing.ts +33 -0
  39. package/Server/Utils/Telemetry/ResourceEntityFilter.ts +441 -0
  40. package/Server/Utils/VM/VMRunner.ts +693 -874
  41. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +488 -46
  42. package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +300 -0
  43. package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +130 -0
  44. package/Tests/Models/DatabaseModels/DatabaseBaseModelToJSONObjectCache.test.ts +180 -0
  45. package/Tests/Models/StatusPageEnableSearchEngineIndexing.test.ts +157 -0
  46. package/Tests/Server/API/AIChatCancelAndFeedback.test.ts +23 -1
  47. package/Tests/Server/API/AIChatRouteAuthorization.test.ts +785 -0
  48. package/Tests/Server/API/BaseAPIApiKeyAuth.test.ts +21 -8
  49. package/Tests/Server/API/CommonAPIAuthGuard.test.ts +290 -0
  50. package/Tests/Server/API/MicrosoftTeamsManifest.test.ts +7 -1
  51. package/Tests/Server/API/StatusPageOverviewCache.test.ts +474 -0
  52. package/Tests/Server/API/StatusPageSeoSearchEngineIndexing.test.ts +189 -0
  53. package/Tests/Server/Infrastructure/InMemoryTTLCache.test.ts +158 -0
  54. package/Tests/Server/Infrastructure/Postgres/DeviceRoleAndDeclaredLinkParentMigration.test.ts +9 -60
  55. package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +24 -15
  56. package/Tests/Server/Middleware/UserAuthorization.test.ts +79 -0
  57. package/Tests/Server/Services/AddNetworkDeviceReachabilityColumnsMigration.test.ts +332 -0
  58. package/Tests/Server/Services/ApiKeyPermissionService.test.ts +347 -0
  59. package/Tests/Server/Services/DatabaseServiceUpdateDebugLogging.test.ts +282 -0
  60. package/Tests/Server/Services/NetworkSiteService.test.ts +56 -2
  61. package/Tests/Server/Services/TelemetryResourceFacetFilters.test.ts +267 -0
  62. package/Tests/Server/Services/WorkspaceNotificationRuleTestRuleChannels.test.ts +702 -0
  63. package/Tests/Server/Types/Database/Permissions/AccessControlPermission.test.ts +165 -0
  64. package/Tests/Server/Types/Workflow/Components/CustomCodeScriptError.test.ts +121 -0
  65. package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +48 -36
  66. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +213 -0
  67. package/Tests/Server/Utils/LogRedaction.test.ts +415 -0
  68. package/Tests/Server/Utils/LoggerCredentialLeak.test.ts +245 -0
  69. package/Tests/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.test.ts +374 -4
  70. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorJavascriptExpression.test.ts +92 -0
  71. package/Tests/Server/Utils/Monitor/MonitorResourceIngestedStepSelection.test.ts +455 -0
  72. package/Tests/Server/Utils/Monitor/NetworkDeviceReachabilityRoundTrip.test.ts +369 -0
  73. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +86 -8
  74. package/Tests/Server/Utils/PrivacyFilterUtil.test.ts +64 -0
  75. package/Tests/Server/Utils/SessionReplay/SessionReplayGateCacheStore.test.ts +207 -0
  76. package/Tests/Server/Utils/StartServerBodyVerify.test.ts +335 -0
  77. package/Tests/Server/Utils/StatusPageSearchEngineIndexing.test.ts +60 -0
  78. package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +435 -0
  79. package/Tests/Server/Utils/VM/VMRunnerIsolation.test.ts +385 -0
  80. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +3 -0
  81. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +607 -62
  82. package/Tests/Server/Utils/Workspace/MicrosoftTeamsInstalledTeamIdSpace.test.ts +778 -0
  83. package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +44 -10
  84. package/Tests/Types/API/HostnameFromAuthority.test.ts +164 -0
  85. package/Tests/Types/Database/AccessControl/ColumnAccessControlCache.test.ts +344 -0
  86. package/Tests/Types/Database/DatabasePropertyFindOperator.test.ts +518 -0
  87. package/Tests/Types/Database/TableColumnMetadataCache.test.ts +286 -0
  88. package/Tests/Types/Monitor/MonitorStep.test.ts +100 -0
  89. package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +360 -0
  90. package/Tests/Types/StatusPage/SearchEngineIndexing.test.ts +86 -0
  91. package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +254 -0
  92. package/Tests/UI/Components/CardSelect.test.tsx +1021 -0
  93. package/Tests/UI/Components/MasterPage.test.tsx +36 -1
  94. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +66 -1
  95. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +115 -6
  96. package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +610 -0
  97. package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +114 -45
  98. package/Types/API/Hostname.ts +79 -0
  99. package/Types/Database/AccessControl/ColumnAccessControl.ts +33 -11
  100. package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +33 -11
  101. package/Types/Database/DatabaseProperty.ts +38 -0
  102. package/Types/Database/TableColumn.ts +34 -7
  103. package/Types/Events/Recurring.ts +16 -1
  104. package/Types/Monitor/CustomCodeMonitor/CustomCodeMonitorResponse.ts +14 -2
  105. package/Types/Monitor/MonitorStep.ts +13 -1
  106. package/Types/Monitor/MonitorType.ts +345 -40
  107. package/Types/Monitor/SSLMonitor/SslMonitorResponse.ts +43 -0
  108. package/Types/StatusPage/SearchEngineIndexing.ts +61 -0
  109. package/Types/Telemetry/ResourceEntityFacet.ts +211 -0
  110. package/UI/Components/CardSelect/CardSelect.tsx +714 -105
  111. package/UI/Components/EmptyState/EmptyState.tsx +8 -1
  112. package/UI/Components/Footer/Footer.tsx +32 -6
  113. package/UI/Components/Forms/Fields/FormField.tsx +3 -0
  114. package/UI/Components/Forms/Types/Field.ts +8 -0
  115. package/UI/Components/Loader/PageLoader.tsx +29 -8
  116. package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +26 -4
  117. package/UI/Components/Markdown.tsx/LazyMarkdownViewer.tsx +17 -1
  118. package/UI/Components/MasterPage/MasterPage.tsx +24 -11
  119. package/Utils/Monitor/MonitorMetricType.ts +16 -1
  120. package/Utils/Monitor/NetworkTopologyUtil.ts +60 -8
  121. package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +262 -0
  122. package/Utils/NetworkSite/SiteStatusRollupUtil.ts +41 -24
  123. package/Utils/Telemetry/CrossSignalScope.ts +75 -4
  124. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +20 -4
  125. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
  126. package/build/dist/Models/DatabaseModels/NetworkDevice.js +66 -0
  127. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  128. package/build/dist/Models/DatabaseModels/StatusPage.js +60 -0
  129. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  130. package/build/dist/Models/DatabaseModels/StatusPageOidc.js +2 -0
  131. package/build/dist/Models/DatabaseModels/StatusPageOidc.js.map +1 -1
  132. package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
  133. package/build/dist/Server/API/AIChatAPI.js +48 -35
  134. package/build/dist/Server/API/AIChatAPI.js.map +1 -1
  135. package/build/dist/Server/API/CommonAPI.js +59 -0
  136. package/build/dist/Server/API/CommonAPI.js.map +1 -1
  137. package/build/dist/Server/API/MicrosoftTeamsAPI.js +20 -6
  138. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  139. package/build/dist/Server/API/SlackAPI.js +13 -10
  140. package/build/dist/Server/API/SlackAPI.js.map +1 -1
  141. package/build/dist/Server/API/StatusPageAPI.js +745 -673
  142. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  143. package/build/dist/Server/API/TelemetryAPI.js +34 -3
  144. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  145. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.js +23 -0
  146. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.js.map +1 -0
  147. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.js +34 -0
  148. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.js.map +1 -0
  149. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
  150. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  151. package/build/dist/Server/Middleware/UserAuthorization.js +6 -2
  152. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  153. package/build/dist/Server/Services/ApiKeyPermissionService.js +90 -1
  154. package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
  155. package/build/dist/Server/Services/DatabaseService.js +15 -6
  156. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  157. package/build/dist/Server/Services/LogAggregationService.js +2 -0
  158. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  159. package/build/dist/Server/Services/LogService.js +16 -0
  160. package/build/dist/Server/Services/LogService.js.map +1 -1
  161. package/build/dist/Server/Services/NetworkSiteService.js +12 -0
  162. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
  163. package/build/dist/Server/Services/SpanService.js +16 -0
  164. package/build/dist/Server/Services/SpanService.js.map +1 -1
  165. package/build/dist/Server/Services/TraceAggregationService.js +2 -0
  166. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  167. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +137 -164
  168. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
  169. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +9 -0
  170. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
  171. package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js +21 -13
  172. package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js.map +1 -1
  173. package/build/dist/Server/Types/Workflow/Components/Conditions/IfElse.js +8 -0
  174. package/build/dist/Server/Types/Workflow/Components/Conditions/IfElse.js.map +1 -1
  175. package/build/dist/Server/Types/Workflow/Components/JavaScript.js +8 -0
  176. package/build/dist/Server/Types/Workflow/Components/JavaScript.js.map +1 -1
  177. package/build/dist/Server/Utils/APIKey/AccessPermission.js +9 -32
  178. package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
  179. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +87 -0
  180. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  181. package/build/dist/Server/Utils/LogRedaction.js +449 -0
  182. package/build/dist/Server/Utils/LogRedaction.js.map +1 -0
  183. package/build/dist/Server/Utils/Logger.js +98 -45
  184. package/build/dist/Server/Utils/Logger.js.map +1 -1
  185. package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js +65 -13
  186. package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js.map +1 -1
  187. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +12 -1
  188. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  189. package/build/dist/Server/Utils/Monitor/MonitorResource.js +20 -3
  190. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  191. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +27 -7
  192. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  193. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCacheStore.js +29 -10
  194. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCacheStore.js.map +1 -1
  195. package/build/dist/Server/Utils/StartServer.js +10 -7
  196. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  197. package/build/dist/Server/Utils/StatusPageSearchEngineIndexing.js +24 -0
  198. package/build/dist/Server/Utils/StatusPageSearchEngineIndexing.js.map +1 -0
  199. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +311 -0
  200. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -0
  201. package/build/dist/Server/Utils/VM/VMRunner.js +402 -525
  202. package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
  203. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +366 -37
  204. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  205. package/build/dist/Types/API/Hostname.js +63 -0
  206. package/build/dist/Types/API/Hostname.js.map +1 -1
  207. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +20 -6
  208. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
  209. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +20 -6
  210. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
  211. package/build/dist/Types/Database/DatabaseProperty.js +38 -0
  212. package/build/dist/Types/Database/DatabaseProperty.js.map +1 -1
  213. package/build/dist/Types/Database/TableColumn.js +24 -6
  214. package/build/dist/Types/Database/TableColumn.js.map +1 -1
  215. package/build/dist/Types/Events/Recurring.js +13 -1
  216. package/build/dist/Types/Events/Recurring.js.map +1 -1
  217. package/build/dist/Types/Monitor/MonitorStep.js +9 -1
  218. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  219. package/build/dist/Types/Monitor/MonitorType.js +330 -31
  220. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  221. package/build/dist/Types/StatusPage/SearchEngineIndexing.js +55 -0
  222. package/build/dist/Types/StatusPage/SearchEngineIndexing.js.map +1 -0
  223. package/build/dist/Types/Telemetry/ResourceEntityFacet.js +156 -0
  224. package/build/dist/Types/Telemetry/ResourceEntityFacet.js.map +1 -0
  225. package/build/dist/UI/Components/CardSelect/CardSelect.js +360 -40
  226. package/build/dist/UI/Components/CardSelect/CardSelect.js.map +1 -1
  227. package/build/dist/UI/Components/EmptyState/EmptyState.js +1 -1
  228. package/build/dist/UI/Components/EmptyState/EmptyState.js.map +1 -1
  229. package/build/dist/UI/Components/Footer/Footer.js +7 -4
  230. package/build/dist/UI/Components/Footer/Footer.js.map +1 -1
  231. package/build/dist/UI/Components/Forms/Fields/FormField.js +1 -1
  232. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  233. package/build/dist/UI/Components/Loader/PageLoader.js +15 -5
  234. package/build/dist/UI/Components/Loader/PageLoader.js.map +1 -1
  235. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +16 -3
  236. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
  237. package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js +13 -1
  238. package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js.map +1 -1
  239. package/build/dist/UI/Components/MasterPage/MasterPage.js +10 -2
  240. package/build/dist/UI/Components/MasterPage/MasterPage.js.map +1 -1
  241. package/build/dist/Utils/Monitor/MonitorMetricType.js +13 -1
  242. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  243. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +34 -7
  244. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  245. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +177 -0
  246. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -0
  247. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +23 -27
  248. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
  249. package/build/dist/Utils/Telemetry/CrossSignalScope.js +44 -4
  250. package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
  251. package/package.json +1 -1
@@ -0,0 +1,311 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import ObjectID from "../../../Types/ObjectID";
11
+ import PositiveNumber from "../../../Types/PositiveNumber";
12
+ import HostService from "../../Services/HostService";
13
+ import DockerHostService from "../../Services/DockerHostService";
14
+ import PodmanHostService from "../../Services/PodmanHostService";
15
+ import KubernetesClusterService from "../../Services/KubernetesClusterService";
16
+ import { keyForHost, keyForKubernetesCluster, } from "../../../Utils/Telemetry/EntityKey";
17
+ import { isResourceEntityFacetKey, parseResourceEntityFacetSelections, } from "../../../Types/Telemetry/ResourceEntityFacet";
18
+ import Includes from "../../../Types/BaseDatabase/Includes";
19
+ import TableColumnType from "../../../Types/AnalyticsDatabase/TableColumnType";
20
+ import { SQL } from "../AnalyticsDatabase/Statement";
21
+ import logger from "../Logger";
22
+ import CaptureSpan from "./CaptureSpan";
23
+ /*
24
+ * `Host` / `DockerHost` / `PodmanHost` all key on the canonicalized
25
+ * `host.name` (see `HostService.findOrCreateByHostIdentifier` and its
26
+ * Docker / Podman siblings), which is exactly the Host entity's identity —
27
+ * so all three resolve through `keyForHost`. A Kubernetes cluster keys on
28
+ * `k8s.cluster.name` (`InventoryItem.k8sClusterIdentity`).
29
+ *
30
+ * The Docker / Podman facets need this as much as the Kubernetes one does:
31
+ * `getServiceNameFromAttributes` synthesises a per-container service name
32
+ * for agent-collected container telemetry, so those rows are primary-keyed
33
+ * on a Service too and an id-only predicate finds almost nothing.
34
+ *
35
+ * Resolving them to the Host entity means "Docker Host web-1" also matches
36
+ * non-container telemetry from web-1 when the Infrastructure agent runs
37
+ * alongside. That is the machine the facet names, so the wider match is the
38
+ * honest reading — and it is the only identity an OTLP resource carries;
39
+ * DockerHost / PodmanHost are inventory-mirrored types that no resource
40
+ * ever declares (see EntityType).
41
+ */
42
+ const FACET_DEFINITIONS = {
43
+ hostId: {
44
+ attributeKey: "resource.host.name",
45
+ entityKeyFor: keyForHost,
46
+ findIdentifiers: async (data) => {
47
+ const rows = await HostService.findBy({
48
+ query: { projectId: data.projectId, _id: new Includes(data.ids) },
49
+ select: { hostIdentifier: true },
50
+ limit: new PositiveNumber(data.ids.length),
51
+ skip: new PositiveNumber(0),
52
+ props: { isRoot: true },
53
+ });
54
+ return rows.map((row) => {
55
+ return row.hostIdentifier || "";
56
+ });
57
+ },
58
+ },
59
+ dockerHostId: {
60
+ attributeKey: "resource.host.name",
61
+ entityKeyFor: keyForHost,
62
+ findIdentifiers: async (data) => {
63
+ const rows = await DockerHostService.findBy({
64
+ query: { projectId: data.projectId, _id: new Includes(data.ids) },
65
+ select: { hostIdentifier: true },
66
+ limit: new PositiveNumber(data.ids.length),
67
+ skip: new PositiveNumber(0),
68
+ props: { isRoot: true },
69
+ });
70
+ return rows.map((row) => {
71
+ return row.hostIdentifier || "";
72
+ });
73
+ },
74
+ },
75
+ podmanHostId: {
76
+ attributeKey: "resource.host.name",
77
+ entityKeyFor: keyForHost,
78
+ findIdentifiers: async (data) => {
79
+ const rows = await PodmanHostService.findBy({
80
+ query: { projectId: data.projectId, _id: new Includes(data.ids) },
81
+ select: { hostIdentifier: true },
82
+ limit: new PositiveNumber(data.ids.length),
83
+ skip: new PositiveNumber(0),
84
+ props: { isRoot: true },
85
+ });
86
+ return rows.map((row) => {
87
+ return row.hostIdentifier || "";
88
+ });
89
+ },
90
+ },
91
+ kubernetesClusterId: {
92
+ attributeKey: "resource.k8s.cluster.name",
93
+ entityKeyFor: keyForKubernetesCluster,
94
+ findIdentifiers: async (data) => {
95
+ const rows = await KubernetesClusterService.findBy({
96
+ query: { projectId: data.projectId, _id: new Includes(data.ids) },
97
+ select: { clusterIdentifier: true },
98
+ limit: new PositiveNumber(data.ids.length),
99
+ skip: new PositiveNumber(0),
100
+ props: { isRoot: true },
101
+ });
102
+ return rows.map((row) => {
103
+ return row.clusterIdentifier || "";
104
+ });
105
+ },
106
+ },
107
+ };
108
+ /**
109
+ * Append the resolved resource scopes to a hand-written aggregation
110
+ * statement (the Log / Trace histogram, facet and analytics queries, which
111
+ * build SQL directly rather than through StatementGenerator).
112
+ *
113
+ * Emits one `AND ( ... OR ... )` group per scope, mirroring exactly what
114
+ * StatementGenerator compiles for the list query — the chart and the list
115
+ * must agree on which rows a facet selects, or the histogram tells a
116
+ * different story than the rows underneath it.
117
+ *
118
+ * A scope with no usable branch appends nothing rather than an empty
119
+ * `IN ()`: an unresolvable filter must not silently match zero rows.
120
+ */
121
+ export function appendResourceScopeFilters(statement, scopes) {
122
+ if (!scopes || scopes.length === 0) {
123
+ return;
124
+ }
125
+ for (const scope of scopes) {
126
+ if (!scope) {
127
+ continue;
128
+ }
129
+ const branches = [];
130
+ const entityIds = (scope.entityIds || []).filter((id) => {
131
+ return typeof id === "string" && id.length > 0;
132
+ });
133
+ if (entityIds.length > 0) {
134
+ branches.push(SQL `primaryEntityId IN (${{
135
+ type: TableColumnType.ObjectID,
136
+ value: new Includes(entityIds),
137
+ }})`);
138
+ }
139
+ const entityKeys = (scope.entityKeys || []).filter((entityKey) => {
140
+ return typeof entityKey === "string" && entityKey.length > 0;
141
+ });
142
+ if (entityKeys.length > 0) {
143
+ branches.push(SQL `hasAny(entityKeys, ${{
144
+ type: TableColumnType.ArrayText,
145
+ value: entityKeys,
146
+ }})`);
147
+ }
148
+ const attributeValues = (scope.attributeValues || []).filter((attributeValue) => {
149
+ return typeof attributeValue === "string" && attributeValue.length > 0;
150
+ });
151
+ if (scope.attributeKey && attributeValues.length > 0) {
152
+ branches.push(SQL `attributes[${{
153
+ type: TableColumnType.Text,
154
+ value: scope.attributeKey,
155
+ }}] IN (${{
156
+ type: TableColumnType.Text,
157
+ value: new Includes(attributeValues),
158
+ }})`);
159
+ }
160
+ if (branches.length === 0) {
161
+ continue;
162
+ }
163
+ statement.append(SQL ` AND (`);
164
+ for (const [index, branch] of branches.entries()) {
165
+ if (index > 0) {
166
+ statement.append(SQL ` OR `);
167
+ }
168
+ statement.append(branch);
169
+ }
170
+ statement.append(SQL `)`);
171
+ }
172
+ }
173
+ class ResourceEntityFilter {
174
+ /**
175
+ * Read the `resourceFilters` field off a request body (or an analytics
176
+ * query record) into the canonical selection shape. Delegates to the
177
+ * isomorphic parser so the browser and the server agree on exactly which
178
+ * selections are well-formed.
179
+ */
180
+ static parseSelections(source) {
181
+ return parseResourceEntityFacetSelections(source);
182
+ }
183
+ /**
184
+ * Compile each facet's selected ids into a scope. One scope per facet, so
185
+ * the caller ANDs them: selecting a cluster and a host means "in that
186
+ * cluster AND on that host", which is what a reader expects of two
187
+ * independent filter groups.
188
+ *
189
+ * The identifier lookup is best-effort: if Postgres is unreachable or an
190
+ * id no longer resolves, the scope keeps its `entityIds` branch and
191
+ * simply loses the entity-key one. That degrades to today's behavior
192
+ * rather than dropping the constraint (which would silently widen the
193
+ * result set).
194
+ */
195
+ static async resolveScopes(data) {
196
+ const facetKeys = Object.keys(data.selections).filter((key) => {
197
+ return (isResourceEntityFacetKey(key) &&
198
+ (data.selections[key] || []).length > 0);
199
+ });
200
+ if (facetKeys.length === 0) {
201
+ return [];
202
+ }
203
+ return Promise.all(facetKeys.map(async (facetKey) => {
204
+ return ResourceEntityFilter.resolveOne({
205
+ projectId: data.projectId,
206
+ facetKey,
207
+ ids: data.selections[facetKey] || [],
208
+ });
209
+ }));
210
+ }
211
+ /**
212
+ * Rewrite an analytics list query in place: consume the client-sent
213
+ * `resourceFilters` ids and replace them with the resolved
214
+ * `resourceEntityScopes` that StatementGenerator compiles.
215
+ *
216
+ * The compiled key is always rebuilt from scratch — a client cannot
217
+ * hand-craft one, so the only way a scope reaches the SQL is through this
218
+ * resolver. (It could only ever narrow rows, but leaving one authoritative
219
+ * writer keeps the predicate auditable.)
220
+ *
221
+ * Without a tenant the identifier lookup cannot be project-scoped, so the
222
+ * scope keeps its id branch and drops the entity-key one: narrower than
223
+ * the request asked for, never wider.
224
+ */
225
+ static async rewriteAnalyticsQuery(data) {
226
+ const query = data.query;
227
+ if (!query || typeof query !== "object") {
228
+ return;
229
+ }
230
+ const raw = query[ResourceEntityFilter.QUERY_FILTER_KEY];
231
+ delete query[ResourceEntityFilter.QUERY_FILTER_KEY];
232
+ delete query[ResourceEntityFilter.QUERY_SCOPE_KEY];
233
+ if (raw === undefined || raw === null) {
234
+ return;
235
+ }
236
+ const selections = ResourceEntityFilter.parseSelections(raw);
237
+ if (Object.keys(selections).length === 0) {
238
+ return;
239
+ }
240
+ if (!data.projectId) {
241
+ query[ResourceEntityFilter.QUERY_SCOPE_KEY] = Object.keys(selections).map((facetKey) => {
242
+ return { entityIds: selections[facetKey] || [], entityKeys: [] };
243
+ });
244
+ return;
245
+ }
246
+ const scopes = await ResourceEntityFilter.resolveScopes({
247
+ projectId: data.projectId,
248
+ selections,
249
+ });
250
+ if (scopes.length > 0) {
251
+ query[ResourceEntityFilter.QUERY_SCOPE_KEY] = scopes;
252
+ }
253
+ }
254
+ static async resolveOne(data) {
255
+ const scope = {
256
+ entityIds: data.ids,
257
+ entityKeys: [],
258
+ };
259
+ const definition = FACET_DEFINITIONS[data.facetKey];
260
+ if (!definition) {
261
+ return scope;
262
+ }
263
+ let identifiers = [];
264
+ try {
265
+ identifiers = await definition.findIdentifiers({
266
+ projectId: data.projectId,
267
+ ids: data.ids.map((id) => {
268
+ return new ObjectID(id);
269
+ }),
270
+ });
271
+ }
272
+ catch (err) {
273
+ logger.warn(`Could not resolve ${data.facetKey} identifiers for the entity-key filter; falling back to primaryEntityId only: ${err}`);
274
+ return scope;
275
+ }
276
+ const uniqueIdentifiers = Array.from(new Set(identifiers.filter((identifier) => {
277
+ return identifier.trim().length > 0;
278
+ })));
279
+ if (uniqueIdentifiers.length === 0) {
280
+ return scope;
281
+ }
282
+ const projectIdString = data.projectId.toString();
283
+ scope.entityKeys = Array.from(new Set(uniqueIdentifiers.map((identifier) => {
284
+ return definition.entityKeyFor(projectIdString, identifier);
285
+ })));
286
+ scope.attributeKey = definition.attributeKey;
287
+ scope.attributeValues = uniqueIdentifiers;
288
+ return scope;
289
+ }
290
+ }
291
+ /**
292
+ * Query key the client puts the raw selected ids under, and the key the
293
+ * compiled scopes are written to. Kept together so the rewrite below is
294
+ * the only thing that has to know the pair.
295
+ */
296
+ ResourceEntityFilter.QUERY_FILTER_KEY = "resourceFilters";
297
+ ResourceEntityFilter.QUERY_SCOPE_KEY = "resourceEntityScopes";
298
+ export default ResourceEntityFilter;
299
+ __decorate([
300
+ CaptureSpan(),
301
+ __metadata("design:type", Function),
302
+ __metadata("design:paramtypes", [Object]),
303
+ __metadata("design:returntype", Promise)
304
+ ], ResourceEntityFilter, "resolveScopes", null);
305
+ __decorate([
306
+ CaptureSpan(),
307
+ __metadata("design:type", Function),
308
+ __metadata("design:paramtypes", [Object]),
309
+ __metadata("design:returntype", Promise)
310
+ ], ResourceEntityFilter, "rewriteAnalyticsQuery", null);
311
+ //# sourceMappingURL=ResourceEntityFilter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResourceEntityFilter.js","sourceRoot":"","sources":["../../../../../Server/Utils/Telemetry/ResourceEntityFilter.ts"],"names":[],"mappings":"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"}