@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.
- package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +32 -5
- package/Models/DatabaseModels/NetworkDevice.ts +64 -0
- package/Models/DatabaseModels/StatusPage.ts +59 -0
- package/Models/DatabaseModels/StatusPageOidc.ts +2 -0
- package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +19 -2
- package/Server/API/AIChatAPI.ts +55 -56
- package/Server/API/CommonAPI.ts +89 -0
- package/Server/API/MicrosoftTeamsAPI.ts +20 -9
- package/Server/API/SlackAPI.ts +13 -10
- package/Server/API/StatusPageAPI.ts +2197 -2128
- package/Server/API/TelemetryAPI.ts +72 -3
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.ts +30 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.ts +47 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
- package/Server/Middleware/UserAuthorization.ts +11 -2
- package/Server/Services/ApiKeyPermissionService.ts +116 -2
- package/Server/Services/DatabaseService.ts +17 -6
- package/Server/Services/LogAggregationService.ts +34 -0
- package/Server/Services/LogService.ts +21 -0
- package/Server/Services/NetworkSiteService.ts +12 -0
- package/Server/Services/SpanService.ts +21 -0
- package/Server/Services/TraceAggregationService.ts +15 -0
- package/Server/Services/WorkspaceNotificationRuleService.ts +172 -220
- package/Server/Types/AnalyticsDatabase/ModelPermission.ts +9 -0
- package/Server/Types/Database/Permissions/AccessControlPermission.ts +47 -16
- package/Server/Types/Workflow/Components/Conditions/IfElse.ts +9 -0
- package/Server/Types/Workflow/Components/JavaScript.ts +9 -0
- package/Server/Utils/APIKey/AccessPermission.ts +16 -40
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +144 -0
- package/Server/Utils/LogRedaction.ts +576 -0
- package/Server/Utils/Logger.ts +123 -46
- package/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.ts +94 -23
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +12 -0
- package/Server/Utils/Monitor/MonitorResource.ts +29 -9
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +28 -7
- package/Server/Utils/SessionReplay/SessionReplayGateCacheStore.ts +56 -10
- package/Server/Utils/StartServer.ts +30 -9
- package/Server/Utils/StatusPageSearchEngineIndexing.ts +33 -0
- package/Server/Utils/Telemetry/ResourceEntityFilter.ts +441 -0
- package/Server/Utils/VM/VMRunner.ts +693 -874
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +488 -46
- package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +300 -0
- package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +130 -0
- package/Tests/Models/DatabaseModels/DatabaseBaseModelToJSONObjectCache.test.ts +180 -0
- package/Tests/Models/StatusPageEnableSearchEngineIndexing.test.ts +157 -0
- package/Tests/Server/API/AIChatCancelAndFeedback.test.ts +23 -1
- package/Tests/Server/API/AIChatRouteAuthorization.test.ts +785 -0
- package/Tests/Server/API/BaseAPIApiKeyAuth.test.ts +21 -8
- package/Tests/Server/API/CommonAPIAuthGuard.test.ts +290 -0
- package/Tests/Server/API/MicrosoftTeamsManifest.test.ts +7 -1
- package/Tests/Server/API/StatusPageOverviewCache.test.ts +474 -0
- package/Tests/Server/API/StatusPageSeoSearchEngineIndexing.test.ts +189 -0
- package/Tests/Server/Infrastructure/InMemoryTTLCache.test.ts +158 -0
- package/Tests/Server/Infrastructure/Postgres/DeviceRoleAndDeclaredLinkParentMigration.test.ts +9 -60
- package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +24 -15
- package/Tests/Server/Middleware/UserAuthorization.test.ts +79 -0
- package/Tests/Server/Services/AddNetworkDeviceReachabilityColumnsMigration.test.ts +332 -0
- package/Tests/Server/Services/ApiKeyPermissionService.test.ts +347 -0
- package/Tests/Server/Services/DatabaseServiceUpdateDebugLogging.test.ts +282 -0
- package/Tests/Server/Services/NetworkSiteService.test.ts +56 -2
- package/Tests/Server/Services/TelemetryResourceFacetFilters.test.ts +267 -0
- package/Tests/Server/Services/WorkspaceNotificationRuleTestRuleChannels.test.ts +702 -0
- package/Tests/Server/Types/Database/Permissions/AccessControlPermission.test.ts +165 -0
- package/Tests/Server/Types/Workflow/Components/CustomCodeScriptError.test.ts +121 -0
- package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +48 -36
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +213 -0
- package/Tests/Server/Utils/LogRedaction.test.ts +415 -0
- package/Tests/Server/Utils/LoggerCredentialLeak.test.ts +245 -0
- package/Tests/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.test.ts +374 -4
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorJavascriptExpression.test.ts +92 -0
- package/Tests/Server/Utils/Monitor/MonitorResourceIngestedStepSelection.test.ts +455 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceReachabilityRoundTrip.test.ts +369 -0
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +86 -8
- package/Tests/Server/Utils/PrivacyFilterUtil.test.ts +64 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayGateCacheStore.test.ts +207 -0
- package/Tests/Server/Utils/StartServerBodyVerify.test.ts +335 -0
- package/Tests/Server/Utils/StatusPageSearchEngineIndexing.test.ts +60 -0
- package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +435 -0
- package/Tests/Server/Utils/VM/VMRunnerIsolation.test.ts +385 -0
- package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +3 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +607 -62
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsInstalledTeamIdSpace.test.ts +778 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +44 -10
- package/Tests/Types/API/HostnameFromAuthority.test.ts +164 -0
- package/Tests/Types/Database/AccessControl/ColumnAccessControlCache.test.ts +344 -0
- package/Tests/Types/Database/DatabasePropertyFindOperator.test.ts +518 -0
- package/Tests/Types/Database/TableColumnMetadataCache.test.ts +286 -0
- package/Tests/Types/Monitor/MonitorStep.test.ts +100 -0
- package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +360 -0
- package/Tests/Types/StatusPage/SearchEngineIndexing.test.ts +86 -0
- package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +254 -0
- package/Tests/UI/Components/CardSelect.test.tsx +1021 -0
- package/Tests/UI/Components/MasterPage.test.tsx +36 -1
- package/Tests/Utils/Monitor/MonitorMetricType.test.ts +66 -1
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +115 -6
- package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +610 -0
- package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +114 -45
- package/Types/API/Hostname.ts +79 -0
- package/Types/Database/AccessControl/ColumnAccessControl.ts +33 -11
- package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +33 -11
- package/Types/Database/DatabaseProperty.ts +38 -0
- package/Types/Database/TableColumn.ts +34 -7
- package/Types/Events/Recurring.ts +16 -1
- package/Types/Monitor/CustomCodeMonitor/CustomCodeMonitorResponse.ts +14 -2
- package/Types/Monitor/MonitorStep.ts +13 -1
- package/Types/Monitor/MonitorType.ts +345 -40
- package/Types/Monitor/SSLMonitor/SslMonitorResponse.ts +43 -0
- package/Types/StatusPage/SearchEngineIndexing.ts +61 -0
- package/Types/Telemetry/ResourceEntityFacet.ts +211 -0
- package/UI/Components/CardSelect/CardSelect.tsx +714 -105
- package/UI/Components/EmptyState/EmptyState.tsx +8 -1
- package/UI/Components/Footer/Footer.tsx +32 -6
- package/UI/Components/Forms/Fields/FormField.tsx +3 -0
- package/UI/Components/Forms/Types/Field.ts +8 -0
- package/UI/Components/Loader/PageLoader.tsx +29 -8
- package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +26 -4
- package/UI/Components/Markdown.tsx/LazyMarkdownViewer.tsx +17 -1
- package/UI/Components/MasterPage/MasterPage.tsx +24 -11
- package/Utils/Monitor/MonitorMetricType.ts +16 -1
- package/Utils/Monitor/NetworkTopologyUtil.ts +60 -8
- package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +262 -0
- package/Utils/NetworkSite/SiteStatusRollupUtil.ts +41 -24
- package/Utils/Telemetry/CrossSignalScope.ts +75 -4
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +20 -4
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +66 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPage.js +60 -0
- package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageOidc.js +2 -0
- package/build/dist/Models/DatabaseModels/StatusPageOidc.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
- package/build/dist/Server/API/AIChatAPI.js +48 -35
- package/build/dist/Server/API/AIChatAPI.js.map +1 -1
- package/build/dist/Server/API/CommonAPI.js +59 -0
- package/build/dist/Server/API/CommonAPI.js.map +1 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +20 -6
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/SlackAPI.js +13 -10
- package/build/dist/Server/API/SlackAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +745 -673
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +34 -3
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.js +23 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/UserAuthorization.js +6 -2
- package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
- package/build/dist/Server/Services/ApiKeyPermissionService.js +90 -1
- package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +15 -6
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +2 -0
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/LogService.js +16 -0
- package/build/dist/Server/Services/LogService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +12 -0
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/SpanService.js +16 -0
- package/build/dist/Server/Services/SpanService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +2 -0
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +137 -164
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +9 -0
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js +21 -13
- package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Conditions/IfElse.js +8 -0
- package/build/dist/Server/Types/Workflow/Components/Conditions/IfElse.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/JavaScript.js +8 -0
- package/build/dist/Server/Types/Workflow/Components/JavaScript.js.map +1 -1
- package/build/dist/Server/Utils/APIKey/AccessPermission.js +9 -32
- package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +87 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/LogRedaction.js +449 -0
- package/build/dist/Server/Utils/LogRedaction.js.map +1 -0
- package/build/dist/Server/Utils/Logger.js +98 -45
- package/build/dist/Server/Utils/Logger.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js +65 -13
- package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +12 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +20 -3
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +27 -7
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCacheStore.js +29 -10
- package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCacheStore.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +10 -7
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/StatusPageSearchEngineIndexing.js +24 -0
- package/build/dist/Server/Utils/StatusPageSearchEngineIndexing.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +311 -0
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -0
- package/build/dist/Server/Utils/VM/VMRunner.js +402 -525
- package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +366 -37
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/API/Hostname.js +63 -0
- package/build/dist/Types/API/Hostname.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +20 -6
- package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +20 -6
- package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
- package/build/dist/Types/Database/DatabaseProperty.js +38 -0
- package/build/dist/Types/Database/DatabaseProperty.js.map +1 -1
- package/build/dist/Types/Database/TableColumn.js +24 -6
- package/build/dist/Types/Database/TableColumn.js.map +1 -1
- package/build/dist/Types/Events/Recurring.js +13 -1
- package/build/dist/Types/Events/Recurring.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +9 -1
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorType.js +330 -31
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/StatusPage/SearchEngineIndexing.js +55 -0
- package/build/dist/Types/StatusPage/SearchEngineIndexing.js.map +1 -0
- package/build/dist/Types/Telemetry/ResourceEntityFacet.js +156 -0
- package/build/dist/Types/Telemetry/ResourceEntityFacet.js.map +1 -0
- package/build/dist/UI/Components/CardSelect/CardSelect.js +360 -40
- package/build/dist/UI/Components/CardSelect/CardSelect.js.map +1 -1
- package/build/dist/UI/Components/EmptyState/EmptyState.js +1 -1
- package/build/dist/UI/Components/EmptyState/EmptyState.js.map +1 -1
- package/build/dist/UI/Components/Footer/Footer.js +7 -4
- package/build/dist/UI/Components/Footer/Footer.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Loader/PageLoader.js +15 -5
- package/build/dist/UI/Components/Loader/PageLoader.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +16 -3
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js +13 -1
- package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/MasterPage/MasterPage.js +10 -2
- package/build/dist/UI/Components/MasterPage/MasterPage.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js +13 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +34 -7
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +177 -0
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +23 -27
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
- package/build/dist/Utils/Telemetry/CrossSignalScope.js +44 -4
- package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
- 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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"}
|