@oneuptime/common 10.7.2 → 10.8.0
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/CloudResource.ts +846 -0
- package/Models/DatabaseModels/CloudResourceInstance.ts +276 -0
- package/Models/DatabaseModels/CloudResourceLabelRule.ts +510 -0
- package/Models/DatabaseModels/CloudResourceOwnerRule.ts +592 -0
- package/Models/DatabaseModels/CloudResourceOwnerTeam.ts +487 -0
- package/Models/DatabaseModels/CloudResourceOwnerUser.ts +486 -0
- package/Models/DatabaseModels/Host.ts +209 -0
- package/Models/DatabaseModels/Index.ts +36 -0
- package/Models/DatabaseModels/RumApplication.ts +731 -0
- package/Models/DatabaseModels/RumApplicationClient.ts +229 -0
- package/Models/DatabaseModels/RumApplicationLabelRule.ts +510 -0
- package/Models/DatabaseModels/RumApplicationOwnerRule.ts +592 -0
- package/Models/DatabaseModels/RumApplicationOwnerTeam.ts +486 -0
- package/Models/DatabaseModels/RumApplicationOwnerUser.ts +485 -0
- package/Models/DatabaseModels/ServerlessFunction.ts +881 -0
- package/Models/DatabaseModels/ServerlessFunctionInstance.ts +212 -0
- package/Models/DatabaseModels/ServerlessFunctionLabelRule.ts +510 -0
- package/Models/DatabaseModels/ServerlessFunctionOwnerRule.ts +592 -0
- package/Models/DatabaseModels/ServerlessFunctionOwnerTeam.ts +487 -0
- package/Models/DatabaseModels/ServerlessFunctionOwnerUser.ts +486 -0
- package/Models/DatabaseModels/Service.ts +268 -0
- package/Models/DatabaseModels/TelemetryException.ts +15 -1
- package/Models/DatabaseModels/WorkflowLog.ts +52 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780931746908-AddResumeStateToWorkflowLog.ts +21 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780931863719-AddTelemetryResourceMetadataColumns.ts +108 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780933132562-AddServerlessFunctionTables.ts +205 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780935387827-AddCloudResourceTables.ts +195 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780936579718-AddRumApplicationTables.ts +202 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780938407319-AddServerlessFunctionRuleTables.ts +156 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780940721814-AddCloudResourceRuleTables.ts +149 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780940998002-AddRumApplicationRuleTables.ts +149 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780941762204-AddTelemetryResourceInventoryTables.ts +95 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780985763463-AddRumApplicationSdkLanguage.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780987192743-RecastCloudResourcesByEnvironment.ts +30 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +22 -0
- package/Server/Infrastructure/Queue.ts +11 -0
- package/Server/Services/CloudResourceInstanceService.ts +76 -0
- package/Server/Services/CloudResourceLabelRuleEngineService.ts +175 -0
- package/Server/Services/CloudResourceLabelRuleService.ts +14 -0
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +192 -0
- package/Server/Services/CloudResourceOwnerRuleService.ts +14 -0
- package/Server/Services/CloudResourceOwnerTeamService.ts +10 -0
- package/Server/Services/CloudResourceOwnerUserService.ts +10 -0
- package/Server/Services/CloudResourceService.ts +342 -0
- package/Server/Services/ExceptionAggregationService.ts +3 -0
- package/Server/Services/HostService.ts +42 -0
- package/Server/Services/LogAggregationService.ts +3 -0
- package/Server/Services/MetricAggregationService.ts +3 -0
- package/Server/Services/OpenTelemetryIngestService.ts +148 -1
- package/Server/Services/RumApplicationClientService.ts +69 -0
- package/Server/Services/RumApplicationLabelRuleEngineService.ts +175 -0
- package/Server/Services/RumApplicationLabelRuleService.ts +14 -0
- package/Server/Services/RumApplicationOwnerRuleEngineService.ts +192 -0
- package/Server/Services/RumApplicationOwnerRuleService.ts +14 -0
- package/Server/Services/RumApplicationOwnerTeamService.ts +10 -0
- package/Server/Services/RumApplicationOwnerUserService.ts +10 -0
- package/Server/Services/RumApplicationService.ts +301 -0
- package/Server/Services/ServerlessFunctionInstanceService.ts +61 -0
- package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +182 -0
- package/Server/Services/ServerlessFunctionLabelRuleService.ts +14 -0
- package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +199 -0
- package/Server/Services/ServerlessFunctionOwnerRuleService.ts +14 -0
- package/Server/Services/ServerlessFunctionOwnerTeamService.ts +10 -0
- package/Server/Services/ServerlessFunctionOwnerUserService.ts +10 -0
- package/Server/Services/ServerlessFunctionService.ts +351 -0
- package/Server/Services/ServiceService.ts +95 -8
- package/Server/Services/TraceAggregationService.ts +3 -0
- package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +39 -0
- package/Server/Types/Workflow/ComponentCode.ts +9 -0
- package/Server/Types/Workflow/Components/Index.ts +2 -0
- package/Server/Types/Workflow/Components/Sleep.ts +105 -0
- package/Server/Types/Workflow/Workflow.ts +6 -0
- package/Server/Utils/Telemetry/ResourceFacetResolver.ts +150 -0
- package/Types/Permission.ts +692 -1
- package/Types/Telemetry/ServiceType.ts +3 -0
- package/Types/Workflow/ComponentID.ts +1 -0
- package/Types/Workflow/Components/Sleep.ts +71 -0
- package/Types/Workflow/Components.ts +2 -0
- package/Types/Workflow/WorkflowStatus.ts +1 -0
- package/UI/Components/BulkUpdate/BulkLabelActions.tsx +159 -32
- package/UI/Components/Navbar/NavBar.tsx +72 -123
- package/UI/Components/Navbar/NavBarMenuModal.tsx +642 -0
- package/UI/Components/Workflow/WorkflowStatus.tsx +3 -0
- package/build/dist/Models/DatabaseModels/CloudResource.js +871 -0
- package/build/dist/Models/DatabaseModels/CloudResource.js.map +1 -0
- package/build/dist/Models/DatabaseModels/CloudResourceInstance.js +300 -0
- package/build/dist/Models/DatabaseModels/CloudResourceInstance.js.map +1 -0
- package/build/dist/Models/DatabaseModels/CloudResourceLabelRule.js +520 -0
- package/build/dist/Models/DatabaseModels/CloudResourceLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerRule.js +601 -0
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerTeam.js +503 -0
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerUser.js +502 -0
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Host.js +215 -0
- package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +36 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplication.js +751 -0
- package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -0
- package/build/dist/Models/DatabaseModels/RumApplicationClient.js +252 -0
- package/build/dist/Models/DatabaseModels/RumApplicationClient.js.map +1 -0
- package/build/dist/Models/DatabaseModels/RumApplicationLabelRule.js +520 -0
- package/build/dist/Models/DatabaseModels/RumApplicationLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerRule.js +601 -0
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerTeam.js +503 -0
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerUser.js +502 -0
- package/build/dist/Models/DatabaseModels/RumApplicationOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunction.js +908 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunction.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunctionInstance.js +234 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunctionInstance.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunctionLabelRule.js +520 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunctionLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerRule.js +601 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerTeam.js +503 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerUser.js +502 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Service.js +276 -0
- package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryException.js +12 -1
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowLog.js +53 -0
- package/build/dist/Models/DatabaseModels/WorkflowLog.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780931746908-AddResumeStateToWorkflowLog.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780931746908-AddResumeStateToWorkflowLog.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780931863719-AddTelemetryResourceMetadataColumns.js +53 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780931863719-AddTelemetryResourceMetadataColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780933132562-AddServerlessFunctionTables.js +82 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780933132562-AddServerlessFunctionTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780935387827-AddCloudResourceTables.js +82 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780935387827-AddCloudResourceTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780936579718-AddRumApplicationTables.js +83 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780936579718-AddRumApplicationTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780938407319-AddServerlessFunctionRuleTables.js +67 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780938407319-AddServerlessFunctionRuleTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780940721814-AddCloudResourceRuleTables.js +60 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780940721814-AddCloudResourceRuleTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780940998002-AddRumApplicationRuleTables.js +60 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780940998002-AddRumApplicationRuleTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780941762204-AddTelemetryResourceInventoryTables.js +45 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780941762204-AddTelemetryResourceInventoryTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780985763463-AddRumApplicationSdkLanguage.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780985763463-AddRumApplicationSdkLanguage.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780987192743-RecastCloudResourcesByEnvironment.js +27 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780987192743-RecastCloudResourcesByEnvironment.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Queue.js +3 -0
- package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceInstanceService.js +76 -0
- package/build/dist/Server/Services/CloudResourceInstanceService.js.map +1 -0
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +160 -0
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/CloudResourceLabelRuleService.js +13 -0
- package/build/dist/Server/Services/CloudResourceLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +179 -0
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/CloudResourceOwnerRuleService.js +13 -0
- package/build/dist/Server/Services/CloudResourceOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/CloudResourceOwnerTeamService.js +9 -0
- package/build/dist/Server/Services/CloudResourceOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/CloudResourceOwnerUserService.js +9 -0
- package/build/dist/Server/Services/CloudResourceOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/CloudResourceService.js +287 -0
- package/build/dist/Server/Services/CloudResourceService.js.map +1 -0
- package/build/dist/Server/Services/ExceptionAggregationService.js +3 -0
- package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
- package/build/dist/Server/Services/HostService.js +29 -1
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +3 -0
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +3 -0
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +98 -2
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationClientService.js +70 -0
- package/build/dist/Server/Services/RumApplicationClientService.js.map +1 -0
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +160 -0
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/RumApplicationLabelRuleService.js +13 -0
- package/build/dist/Server/Services/RumApplicationLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +179 -0
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/RumApplicationOwnerRuleService.js +13 -0
- package/build/dist/Server/Services/RumApplicationOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/RumApplicationOwnerTeamService.js +9 -0
- package/build/dist/Server/Services/RumApplicationOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/RumApplicationOwnerUserService.js +9 -0
- package/build/dist/Server/Services/RumApplicationOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/RumApplicationService.js +259 -0
- package/build/dist/Server/Services/RumApplicationService.js.map +1 -0
- package/build/dist/Server/Services/ServerlessFunctionInstanceService.js +64 -0
- package/build/dist/Server/Services/ServerlessFunctionInstanceService.js.map +1 -0
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +160 -0
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleService.js +13 -0
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +179 -0
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleService.js +13 -0
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/ServerlessFunctionOwnerTeamService.js +9 -0
- package/build/dist/Server/Services/ServerlessFunctionOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/ServerlessFunctionOwnerUserService.js +9 -0
- package/build/dist/Server/Services/ServerlessFunctionOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/ServerlessFunctionService.js +299 -0
- package/build/dist/Server/Services/ServerlessFunctionService.js.map +1 -0
- package/build/dist/Server/Services/ServiceService.js +63 -7
- package/build/dist/Server/Services/ServiceService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +3 -0
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +39 -0
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
- package/build/dist/Server/Types/Workflow/ComponentCode.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Index.js +2 -0
- package/build/dist/Server/Types/Workflow/Components/Index.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Sleep.js +85 -0
- package/build/dist/Server/Types/Workflow/Components/Sleep.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +90 -0
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
- package/build/dist/Types/Permission.js +609 -1
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Telemetry/ServiceType.js +3 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/Types/Workflow/ComponentID.js +1 -0
- package/build/dist/Types/Workflow/ComponentID.js.map +1 -1
- package/build/dist/Types/Workflow/Components/Sleep.js +64 -0
- package/build/dist/Types/Workflow/Components/Sleep.js.map +1 -0
- package/build/dist/Types/Workflow/Components.js +2 -0
- package/build/dist/Types/Workflow/Components.js.map +1 -1
- package/build/dist/Types/Workflow/WorkflowStatus.js +1 -0
- package/build/dist/Types/Workflow/WorkflowStatus.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js +113 -19
- package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +34 -66
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +412 -0
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -0
- package/build/dist/UI/Components/Workflow/WorkflowStatus.js +3 -0
- package/build/dist/UI/Components/Workflow/WorkflowStatus.js.map +1 -1
- package/package.json +1 -1
- package/UI/Components/Navbar/NavBarMenu.tsx +0 -183
- package/UI/Components/Navbar/NavBarMenuItem.tsx +0 -146
- package/build/dist/UI/Components/Navbar/NavBarMenu.js +0 -82
- package/build/dist/UI/Components/Navbar/NavBarMenu.js.map +0 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuItem.js +0 -109
- package/build/dist/UI/Components/Navbar/NavBarMenuItem.js.map +0 -1
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
import DatabaseService from "./DatabaseService";
|
|
2
|
+
import Model from "../../Models/DatabaseModels/CloudResource";
|
|
3
|
+
import Label from "../../Models/DatabaseModels/Label";
|
|
4
|
+
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
5
|
+
import ObjectID from "../../Types/ObjectID";
|
|
6
|
+
import QueryHelper from "../Types/Database/QueryHelper";
|
|
7
|
+
import OneUptimeDate from "../../Types/Date";
|
|
8
|
+
import LIMIT_MAX from "../../Types/Database/LimitMax";
|
|
9
|
+
import GlobalCache from "../Infrastructure/GlobalCache";
|
|
10
|
+
import logger, { LogAttributes } from "../Utils/Logger";
|
|
11
|
+
import crypto from "crypto";
|
|
12
|
+
import { OnCreate } from "../Types/Database/Hooks";
|
|
13
|
+
import CloudResourceLabelRuleEngineService from "./CloudResourceLabelRuleEngineService";
|
|
14
|
+
import CloudResourceOwnerRuleEngineService from "./CloudResourceOwnerRuleEngineService";
|
|
15
|
+
|
|
16
|
+
const LAST_SEEN_CACHE_NAMESPACE: string = "cloud-resource-last-seen";
|
|
17
|
+
const LAST_SEEN_THROTTLE_SECONDS: number = 60;
|
|
18
|
+
|
|
19
|
+
const LABELS_APPLIED_CACHE_NAMESPACE: string = "cloud-resource-labels-applied";
|
|
20
|
+
const LABELS_APPLIED_CACHE_TTL_SECONDS: number = 60;
|
|
21
|
+
|
|
22
|
+
export class Service extends DatabaseService<Model> {
|
|
23
|
+
public constructor() {
|
|
24
|
+
super(Model);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
@CaptureSpan()
|
|
28
|
+
protected override async onCreateSuccess(
|
|
29
|
+
_onCreate: OnCreate<Model>,
|
|
30
|
+
createdItem: Model,
|
|
31
|
+
): Promise<Model> {
|
|
32
|
+
if (createdItem.projectId && createdItem.id) {
|
|
33
|
+
Promise.resolve()
|
|
34
|
+
.then(async () => {
|
|
35
|
+
await CloudResourceLabelRuleEngineService.applyRulesToCloudResource(
|
|
36
|
+
createdItem,
|
|
37
|
+
);
|
|
38
|
+
})
|
|
39
|
+
.then(async () => {
|
|
40
|
+
await CloudResourceOwnerRuleEngineService.applyRulesToCloudResource(
|
|
41
|
+
createdItem,
|
|
42
|
+
);
|
|
43
|
+
})
|
|
44
|
+
.catch((error: Error) => {
|
|
45
|
+
logger.error(
|
|
46
|
+
`Error applying cloud resource rules in CloudResourceService.onCreateSuccess: ${error}`,
|
|
47
|
+
{
|
|
48
|
+
projectId: createdItem.projectId?.toString(),
|
|
49
|
+
cloudResourceId: createdItem.id?.toString(),
|
|
50
|
+
} as LogAttributes,
|
|
51
|
+
);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return createdItem;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
@CaptureSpan()
|
|
58
|
+
public async findOrCreateByResourceIdentifier(data: {
|
|
59
|
+
projectId: ObjectID;
|
|
60
|
+
resourceIdentifier: string;
|
|
61
|
+
name?: string | undefined;
|
|
62
|
+
cloudPlatform?: string | undefined;
|
|
63
|
+
cloudProvider?: string | undefined;
|
|
64
|
+
cloudRegion?: string | undefined;
|
|
65
|
+
cloudAccountId?: string | undefined;
|
|
66
|
+
}): Promise<Model> {
|
|
67
|
+
const existingResource: Model | null = await this.findOneBy({
|
|
68
|
+
query: {
|
|
69
|
+
projectId: data.projectId,
|
|
70
|
+
resourceIdentifier: QueryHelper.findWithSameText(
|
|
71
|
+
data.resourceIdentifier,
|
|
72
|
+
),
|
|
73
|
+
},
|
|
74
|
+
select: {
|
|
75
|
+
_id: true,
|
|
76
|
+
projectId: true,
|
|
77
|
+
resourceIdentifier: true,
|
|
78
|
+
},
|
|
79
|
+
props: {
|
|
80
|
+
isRoot: true,
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
if (existingResource) {
|
|
85
|
+
return existingResource;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
try {
|
|
89
|
+
const newResource: Model = new Model();
|
|
90
|
+
newResource.projectId = data.projectId;
|
|
91
|
+
newResource.name = data.name || data.resourceIdentifier;
|
|
92
|
+
newResource.resourceIdentifier = data.resourceIdentifier;
|
|
93
|
+
newResource.otelCollectorStatus = "connected";
|
|
94
|
+
newResource.lastSeenAt = OneUptimeDate.getCurrentDate();
|
|
95
|
+
if (data.cloudPlatform) {
|
|
96
|
+
newResource.cloudPlatform = data.cloudPlatform;
|
|
97
|
+
}
|
|
98
|
+
if (data.cloudProvider) {
|
|
99
|
+
newResource.cloudProvider = data.cloudProvider;
|
|
100
|
+
}
|
|
101
|
+
if (data.cloudRegion) {
|
|
102
|
+
newResource.cloudRegion = data.cloudRegion;
|
|
103
|
+
}
|
|
104
|
+
if (data.cloudAccountId) {
|
|
105
|
+
newResource.cloudAccountId = data.cloudAccountId;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const createdResource: Model = await this.create({
|
|
109
|
+
data: newResource,
|
|
110
|
+
props: {
|
|
111
|
+
isRoot: true,
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
return createdResource;
|
|
116
|
+
} catch {
|
|
117
|
+
const reFetchedResource: Model | null = await this.findOneBy({
|
|
118
|
+
query: {
|
|
119
|
+
projectId: data.projectId,
|
|
120
|
+
resourceIdentifier: QueryHelper.findWithSameText(
|
|
121
|
+
data.resourceIdentifier,
|
|
122
|
+
),
|
|
123
|
+
},
|
|
124
|
+
select: {
|
|
125
|
+
_id: true,
|
|
126
|
+
projectId: true,
|
|
127
|
+
resourceIdentifier: true,
|
|
128
|
+
},
|
|
129
|
+
props: {
|
|
130
|
+
isRoot: true,
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
if (reFetchedResource) {
|
|
135
|
+
return reFetchedResource;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
throw new Error(
|
|
139
|
+
"Failed to create or find cloud resource: " + data.resourceIdentifier,
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
@CaptureSpan()
|
|
145
|
+
public async updateLastSeen(
|
|
146
|
+
cloudResourceId: ObjectID,
|
|
147
|
+
extra?: {
|
|
148
|
+
agentVersion?: string | undefined;
|
|
149
|
+
cloudPlatform?: string | undefined;
|
|
150
|
+
cloudProvider?: string | undefined;
|
|
151
|
+
cloudRegion?: string | undefined;
|
|
152
|
+
cloudAccountId?: string | undefined;
|
|
153
|
+
runtimeName?: string | undefined;
|
|
154
|
+
runtimeVersion?: string | undefined;
|
|
155
|
+
},
|
|
156
|
+
): Promise<void> {
|
|
157
|
+
const cacheKey: string = cloudResourceId.toString();
|
|
158
|
+
const extrasFingerprint: string = crypto
|
|
159
|
+
.createHash("sha1")
|
|
160
|
+
.update(
|
|
161
|
+
JSON.stringify({
|
|
162
|
+
agentVersion: extra?.agentVersion ?? null,
|
|
163
|
+
cloudPlatform: extra?.cloudPlatform ?? null,
|
|
164
|
+
cloudProvider: extra?.cloudProvider ?? null,
|
|
165
|
+
cloudRegion: extra?.cloudRegion ?? null,
|
|
166
|
+
cloudAccountId: extra?.cloudAccountId ?? null,
|
|
167
|
+
runtimeName: extra?.runtimeName ?? null,
|
|
168
|
+
runtimeVersion: extra?.runtimeVersion ?? null,
|
|
169
|
+
}),
|
|
170
|
+
)
|
|
171
|
+
.digest("hex");
|
|
172
|
+
|
|
173
|
+
const cached: string | null = await GlobalCache.getString(
|
|
174
|
+
LAST_SEEN_CACHE_NAMESPACE,
|
|
175
|
+
cacheKey,
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
if (cached === extrasFingerprint) {
|
|
179
|
+
return; // same data was written recently
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
await GlobalCache.setString(
|
|
183
|
+
LAST_SEEN_CACHE_NAMESPACE,
|
|
184
|
+
cacheKey,
|
|
185
|
+
extrasFingerprint,
|
|
186
|
+
{ expiresInSeconds: LAST_SEEN_THROTTLE_SECONDS },
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
190
|
+
const data: any = {
|
|
191
|
+
lastSeenAt: OneUptimeDate.getCurrentDate(),
|
|
192
|
+
otelCollectorStatus: "connected",
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
if (extra?.agentVersion) {
|
|
196
|
+
data.agentVersion = extra.agentVersion;
|
|
197
|
+
}
|
|
198
|
+
if (extra?.cloudPlatform) {
|
|
199
|
+
data.cloudPlatform = extra.cloudPlatform;
|
|
200
|
+
}
|
|
201
|
+
if (extra?.cloudProvider) {
|
|
202
|
+
data.cloudProvider = extra.cloudProvider;
|
|
203
|
+
}
|
|
204
|
+
if (extra?.cloudRegion) {
|
|
205
|
+
data.cloudRegion = extra.cloudRegion;
|
|
206
|
+
}
|
|
207
|
+
if (extra?.cloudAccountId) {
|
|
208
|
+
data.cloudAccountId = extra.cloudAccountId;
|
|
209
|
+
}
|
|
210
|
+
if (extra?.runtimeName) {
|
|
211
|
+
data.runtimeName = extra.runtimeName;
|
|
212
|
+
}
|
|
213
|
+
if (extra?.runtimeVersion) {
|
|
214
|
+
data.runtimeVersion = extra.runtimeVersion;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
await this.updateOneById({
|
|
218
|
+
id: cloudResourceId,
|
|
219
|
+
data: data,
|
|
220
|
+
props: {
|
|
221
|
+
isRoot: true,
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
@CaptureSpan()
|
|
227
|
+
public async attachLabels(data: {
|
|
228
|
+
cloudResourceId: ObjectID;
|
|
229
|
+
labelIds: Array<ObjectID>;
|
|
230
|
+
}): Promise<void> {
|
|
231
|
+
if (!data.labelIds || data.labelIds.length === 0) {
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
const cacheKey: string = data.cloudResourceId.toString();
|
|
236
|
+
const fingerprint: string = fingerprintLabelIds(data.labelIds);
|
|
237
|
+
const cached: string | null = await GlobalCache.getString(
|
|
238
|
+
LABELS_APPLIED_CACHE_NAMESPACE,
|
|
239
|
+
cacheKey,
|
|
240
|
+
);
|
|
241
|
+
if (cached === fingerprint) {
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
try {
|
|
246
|
+
const resourceIdStr: string = data.cloudResourceId.toString();
|
|
247
|
+
const existingLabels: Array<Label> = await this.getRepository()
|
|
248
|
+
.createQueryBuilder()
|
|
249
|
+
.relation(Model, "labels")
|
|
250
|
+
.of(resourceIdStr)
|
|
251
|
+
.loadMany();
|
|
252
|
+
|
|
253
|
+
const existingIds: Set<string> = new Set();
|
|
254
|
+
for (const lbl of existingLabels) {
|
|
255
|
+
const idStr: string | undefined = lbl._id?.toString();
|
|
256
|
+
if (idStr) {
|
|
257
|
+
existingIds.add(idStr);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
const toAddIds: Array<string> = [];
|
|
262
|
+
const seen: Set<string> = new Set();
|
|
263
|
+
for (const id of data.labelIds) {
|
|
264
|
+
const idStr: string = id.toString();
|
|
265
|
+
if (existingIds.has(idStr) || seen.has(idStr)) {
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
seen.add(idStr);
|
|
269
|
+
toAddIds.push(idStr);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
if (toAddIds.length > 0) {
|
|
273
|
+
await this.getRepository()
|
|
274
|
+
.createQueryBuilder()
|
|
275
|
+
.relation(Model, "labels")
|
|
276
|
+
.of(resourceIdStr)
|
|
277
|
+
.add(toAddIds);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
await GlobalCache.setString(
|
|
281
|
+
LABELS_APPLIED_CACHE_NAMESPACE,
|
|
282
|
+
cacheKey,
|
|
283
|
+
fingerprint,
|
|
284
|
+
{ expiresInSeconds: LABELS_APPLIED_CACHE_TTL_SECONDS },
|
|
285
|
+
);
|
|
286
|
+
} catch (err) {
|
|
287
|
+
logger.warn(
|
|
288
|
+
`CloudResourceService.attachLabels failed for resource ${data.cloudResourceId.toString()}: ${
|
|
289
|
+
err instanceof Error ? err.message : String(err)
|
|
290
|
+
}`,
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
@CaptureSpan()
|
|
296
|
+
public async markDisconnectedResources(): Promise<void> {
|
|
297
|
+
const fiveMinutesAgo: Date = OneUptimeDate.addRemoveMinutes(
|
|
298
|
+
OneUptimeDate.getCurrentDate(),
|
|
299
|
+
-5,
|
|
300
|
+
);
|
|
301
|
+
|
|
302
|
+
const connectedResources: Array<Model> = await this.findBy({
|
|
303
|
+
query: {
|
|
304
|
+
otelCollectorStatus: "connected",
|
|
305
|
+
lastSeenAt: QueryHelper.lessThan(fiveMinutesAgo),
|
|
306
|
+
},
|
|
307
|
+
select: {
|
|
308
|
+
_id: true,
|
|
309
|
+
},
|
|
310
|
+
limit: LIMIT_MAX,
|
|
311
|
+
skip: 0,
|
|
312
|
+
props: {
|
|
313
|
+
isRoot: true,
|
|
314
|
+
},
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
for (const cloudResource of connectedResources) {
|
|
318
|
+
if (cloudResource._id) {
|
|
319
|
+
await this.updateOneById({
|
|
320
|
+
id: new ObjectID(cloudResource._id.toString()),
|
|
321
|
+
data: {
|
|
322
|
+
otelCollectorStatus: "disconnected",
|
|
323
|
+
},
|
|
324
|
+
props: {
|
|
325
|
+
isRoot: true,
|
|
326
|
+
},
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
function fingerprintLabelIds(labelIds: Array<ObjectID>): string {
|
|
334
|
+
const sorted: Array<string> = labelIds
|
|
335
|
+
.map((id: ObjectID) => {
|
|
336
|
+
return id.toString();
|
|
337
|
+
})
|
|
338
|
+
.sort();
|
|
339
|
+
return crypto.createHash("sha1").update(sorted.join(",")).digest("hex");
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
export default new Service();
|
|
@@ -72,6 +72,9 @@ export class ExceptionAggregationService {
|
|
|
72
72
|
["hostId", ServiceType.Host],
|
|
73
73
|
["dockerHostId", ServiceType.DockerHost],
|
|
74
74
|
["kubernetesClusterId", ServiceType.KubernetesCluster],
|
|
75
|
+
["serverlessFunctionId", ServiceType.ServerlessFunction],
|
|
76
|
+
["cloudResourceId", ServiceType.CloudResource],
|
|
77
|
+
["rumApplicationId", ServiceType.RealUserMonitor],
|
|
75
78
|
]);
|
|
76
79
|
private static readonly ATTRIBUTE_KEY_PATTERN: RegExp = /^[a-zA-Z0-9._:/-]+$/;
|
|
77
80
|
private static readonly MAX_FACET_KEY_LENGTH: number = 256;
|
|
@@ -195,6 +195,13 @@ export class Service extends DatabaseService<Model> {
|
|
|
195
195
|
dockerHostId?: ObjectID | undefined;
|
|
196
196
|
kubernetesClusterId?: ObjectID | undefined;
|
|
197
197
|
agentVersion?: string | undefined;
|
|
198
|
+
deploymentEnvironment?: string | undefined;
|
|
199
|
+
runtimeName?: string | undefined;
|
|
200
|
+
runtimeVersion?: string | undefined;
|
|
201
|
+
cloudProvider?: string | undefined;
|
|
202
|
+
cloudPlatform?: string | undefined;
|
|
203
|
+
cloudRegion?: string | undefined;
|
|
204
|
+
cloudAccountId?: string | undefined;
|
|
198
205
|
},
|
|
199
206
|
): Promise<void> {
|
|
200
207
|
/*
|
|
@@ -267,6 +274,27 @@ export class Service extends DatabaseService<Model> {
|
|
|
267
274
|
if (extra?.agentVersion) {
|
|
268
275
|
data.agentVersion = extra.agentVersion;
|
|
269
276
|
}
|
|
277
|
+
if (extra?.deploymentEnvironment) {
|
|
278
|
+
data.deploymentEnvironment = extra.deploymentEnvironment;
|
|
279
|
+
}
|
|
280
|
+
if (extra?.runtimeName) {
|
|
281
|
+
data.runtimeName = extra.runtimeName;
|
|
282
|
+
}
|
|
283
|
+
if (extra?.runtimeVersion) {
|
|
284
|
+
data.runtimeVersion = extra.runtimeVersion;
|
|
285
|
+
}
|
|
286
|
+
if (extra?.cloudProvider) {
|
|
287
|
+
data.cloudProvider = extra.cloudProvider;
|
|
288
|
+
}
|
|
289
|
+
if (extra?.cloudPlatform) {
|
|
290
|
+
data.cloudPlatform = extra.cloudPlatform;
|
|
291
|
+
}
|
|
292
|
+
if (extra?.cloudRegion) {
|
|
293
|
+
data.cloudRegion = extra.cloudRegion;
|
|
294
|
+
}
|
|
295
|
+
if (extra?.cloudAccountId) {
|
|
296
|
+
data.cloudAccountId = extra.cloudAccountId;
|
|
297
|
+
}
|
|
270
298
|
|
|
271
299
|
await this.updateOneById({
|
|
272
300
|
id: hostId,
|
|
@@ -291,6 +319,13 @@ export class Service extends DatabaseService<Model> {
|
|
|
291
319
|
dockerHostId?: ObjectID | undefined;
|
|
292
320
|
kubernetesClusterId?: ObjectID | undefined;
|
|
293
321
|
agentVersion?: string | undefined;
|
|
322
|
+
deploymentEnvironment?: string | undefined;
|
|
323
|
+
runtimeName?: string | undefined;
|
|
324
|
+
runtimeVersion?: string | undefined;
|
|
325
|
+
cloudProvider?: string | undefined;
|
|
326
|
+
cloudPlatform?: string | undefined;
|
|
327
|
+
cloudRegion?: string | undefined;
|
|
328
|
+
cloudAccountId?: string | undefined;
|
|
294
329
|
}): string {
|
|
295
330
|
const normalized: Record<string, string | number | null> = {
|
|
296
331
|
osType: extra?.osType ?? null,
|
|
@@ -306,6 +341,13 @@ export class Service extends DatabaseService<Model> {
|
|
|
306
341
|
dockerHostId: extra?.dockerHostId?.toString() ?? null,
|
|
307
342
|
kubernetesClusterId: extra?.kubernetesClusterId?.toString() ?? null,
|
|
308
343
|
agentVersion: extra?.agentVersion ?? null,
|
|
344
|
+
deploymentEnvironment: extra?.deploymentEnvironment ?? null,
|
|
345
|
+
runtimeName: extra?.runtimeName ?? null,
|
|
346
|
+
runtimeVersion: extra?.runtimeVersion ?? null,
|
|
347
|
+
cloudProvider: extra?.cloudProvider ?? null,
|
|
348
|
+
cloudPlatform: extra?.cloudPlatform ?? null,
|
|
349
|
+
cloudRegion: extra?.cloudRegion ?? null,
|
|
350
|
+
cloudAccountId: extra?.cloudAccountId ?? null,
|
|
309
351
|
};
|
|
310
352
|
|
|
311
353
|
return crypto
|
|
@@ -106,6 +106,9 @@ export class LogAggregationService {
|
|
|
106
106
|
["hostId", ServiceType.Host],
|
|
107
107
|
["dockerHostId", ServiceType.DockerHost],
|
|
108
108
|
["kubernetesClusterId", ServiceType.KubernetesCluster],
|
|
109
|
+
["serverlessFunctionId", ServiceType.ServerlessFunction],
|
|
110
|
+
["cloudResourceId", ServiceType.CloudResource],
|
|
111
|
+
["rumApplicationId", ServiceType.RealUserMonitor],
|
|
109
112
|
]);
|
|
110
113
|
private static readonly ATTRIBUTE_KEY_PATTERN: RegExp = /^[a-zA-Z0-9._:/-]+$/;
|
|
111
114
|
private static readonly MAX_FACET_KEY_LENGTH: number = 256;
|
|
@@ -48,6 +48,9 @@ export class MetricAggregationService {
|
|
|
48
48
|
["hostId", ServiceType.Host],
|
|
49
49
|
["dockerHostId", ServiceType.DockerHost],
|
|
50
50
|
["kubernetesClusterId", ServiceType.KubernetesCluster],
|
|
51
|
+
["serverlessFunctionId", ServiceType.ServerlessFunction],
|
|
52
|
+
["cloudResourceId", ServiceType.CloudResource],
|
|
53
|
+
["rumApplicationId", ServiceType.RealUserMonitor],
|
|
51
54
|
]);
|
|
52
55
|
private static readonly ATTRIBUTE_KEY_PATTERN: RegExp = /^[a-zA-Z0-9._:/-]+$/;
|
|
53
56
|
private static readonly MAX_FACET_KEY_LENGTH: number = 256;
|
|
@@ -21,9 +21,15 @@ import ServiceType from "../../Types/Telemetry/ServiceType";
|
|
|
21
21
|
import Host from "../../Models/DatabaseModels/Host";
|
|
22
22
|
import DockerHost from "../../Models/DatabaseModels/DockerHost";
|
|
23
23
|
import KubernetesCluster from "../../Models/DatabaseModels/KubernetesCluster";
|
|
24
|
+
import ServerlessFunction from "../../Models/DatabaseModels/ServerlessFunction";
|
|
25
|
+
import CloudResource from "../../Models/DatabaseModels/CloudResource";
|
|
26
|
+
import RumApplication from "../../Models/DatabaseModels/RumApplication";
|
|
24
27
|
import HostService from "./HostService";
|
|
25
28
|
import DockerHostService from "./DockerHostService";
|
|
26
29
|
import KubernetesClusterService from "./KubernetesClusterService";
|
|
30
|
+
import ServerlessFunctionService from "./ServerlessFunctionService";
|
|
31
|
+
import CloudResourceService from "./CloudResourceService";
|
|
32
|
+
import RumApplicationService from "./RumApplicationService";
|
|
27
33
|
import GlobalCache from "../Infrastructure/GlobalCache";
|
|
28
34
|
|
|
29
35
|
export enum OtelAggregationTemporality {
|
|
@@ -85,6 +91,93 @@ const projectRetentionInProcessCache: Map<string, CachedRetentionContext> =
|
|
|
85
91
|
new Map();
|
|
86
92
|
|
|
87
93
|
export default class OTelIngestService {
|
|
94
|
+
/*
|
|
95
|
+
* Read a single string-valued OTel resource attribute out of the raw
|
|
96
|
+
* OTLP attribute array (shape: [{ key, value: { stringValue } }]).
|
|
97
|
+
* Mirrors OtelIngestBaseService.getStringAttribute — duplicated here
|
|
98
|
+
* because that one is on the ingest-side base class and this read path
|
|
99
|
+
* (Service resolution) lives in Common.
|
|
100
|
+
*/
|
|
101
|
+
private static getResourceStringAttribute(
|
|
102
|
+
attributes: JSONArray,
|
|
103
|
+
key: string,
|
|
104
|
+
): string | null {
|
|
105
|
+
for (const attribute of attributes) {
|
|
106
|
+
if (
|
|
107
|
+
attribute["key"] === key &&
|
|
108
|
+
attribute["value"] &&
|
|
109
|
+
(attribute["value"] as JSONObject)["stringValue"]
|
|
110
|
+
) {
|
|
111
|
+
const value: unknown = (attribute["value"] as JSONObject)["stringValue"];
|
|
112
|
+
if (typeof value === "string" && value.trim()) {
|
|
113
|
+
return value.trim();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/*
|
|
121
|
+
* Build the metadata captured onto the Service row from OTel resource
|
|
122
|
+
* attributes (service.version, deployment.environment, cloud.*, runtime.*).
|
|
123
|
+
* Returns undefined when no resource attributes are available so the
|
|
124
|
+
* caller falls back to a plain lastSeenAt touch.
|
|
125
|
+
*/
|
|
126
|
+
private static buildServiceMetadataFromAttributes(
|
|
127
|
+
attributes: JSONArray | undefined,
|
|
128
|
+
):
|
|
129
|
+
| {
|
|
130
|
+
serviceVersion?: string | undefined;
|
|
131
|
+
deploymentEnvironment?: string | undefined;
|
|
132
|
+
serviceNamespace?: string | undefined;
|
|
133
|
+
runtimeName?: string | undefined;
|
|
134
|
+
runtimeVersion?: string | undefined;
|
|
135
|
+
cloudProvider?: string | undefined;
|
|
136
|
+
cloudPlatform?: string | undefined;
|
|
137
|
+
cloudRegion?: string | undefined;
|
|
138
|
+
cloudAccountId?: string | undefined;
|
|
139
|
+
}
|
|
140
|
+
| undefined {
|
|
141
|
+
if (!attributes) {
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
serviceVersion:
|
|
146
|
+
this.getResourceStringAttribute(attributes, "service.version") ||
|
|
147
|
+
undefined,
|
|
148
|
+
deploymentEnvironment:
|
|
149
|
+
this.getResourceStringAttribute(
|
|
150
|
+
attributes,
|
|
151
|
+
"deployment.environment.name",
|
|
152
|
+
) ||
|
|
153
|
+
this.getResourceStringAttribute(attributes, "deployment.environment") ||
|
|
154
|
+
undefined,
|
|
155
|
+
serviceNamespace:
|
|
156
|
+
this.getResourceStringAttribute(attributes, "service.namespace") ||
|
|
157
|
+
undefined,
|
|
158
|
+
runtimeName:
|
|
159
|
+
this.getResourceStringAttribute(attributes, "process.runtime.name") ||
|
|
160
|
+
undefined,
|
|
161
|
+
runtimeVersion:
|
|
162
|
+
this.getResourceStringAttribute(
|
|
163
|
+
attributes,
|
|
164
|
+
"process.runtime.version",
|
|
165
|
+
) || undefined,
|
|
166
|
+
cloudProvider:
|
|
167
|
+
this.getResourceStringAttribute(attributes, "cloud.provider") ||
|
|
168
|
+
undefined,
|
|
169
|
+
cloudPlatform:
|
|
170
|
+
this.getResourceStringAttribute(attributes, "cloud.platform") ||
|
|
171
|
+
undefined,
|
|
172
|
+
cloudRegion:
|
|
173
|
+
this.getResourceStringAttribute(attributes, "cloud.region") ||
|
|
174
|
+
undefined,
|
|
175
|
+
cloudAccountId:
|
|
176
|
+
this.getResourceStringAttribute(attributes, "cloud.account.id") ||
|
|
177
|
+
undefined,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
|
|
88
181
|
@CaptureSpan()
|
|
89
182
|
private static async getProjectRetentionContext(
|
|
90
183
|
projectId: ObjectID,
|
|
@@ -194,7 +287,10 @@ export default class OTelIngestService {
|
|
|
194
287
|
* one in-memory cache lookup per batch.
|
|
195
288
|
*/
|
|
196
289
|
try {
|
|
197
|
-
await ServiceService.updateLastSeen(
|
|
290
|
+
await ServiceService.updateLastSeen(
|
|
291
|
+
result.serviceId,
|
|
292
|
+
this.buildServiceMetadataFromAttributes(data.resourceAttributes),
|
|
293
|
+
);
|
|
198
294
|
} catch (err) {
|
|
199
295
|
logger.warn(
|
|
200
296
|
`telemetryServiceFromName lastSeen update failed for "${data.serviceName}": ${
|
|
@@ -453,6 +549,57 @@ export default class OTelIngestService {
|
|
|
453
549
|
telemetryRetentionConfig: cluster?.telemetryRetentionConfig ?? null,
|
|
454
550
|
};
|
|
455
551
|
}
|
|
552
|
+
if (serviceType === ServiceType.ServerlessFunction) {
|
|
553
|
+
const serverlessFunction: ServerlessFunction | null =
|
|
554
|
+
await ServerlessFunctionService.findOneById({
|
|
555
|
+
id: resourceId,
|
|
556
|
+
select: {
|
|
557
|
+
retainTelemetryDataForDays: true,
|
|
558
|
+
telemetryRetentionConfig: true,
|
|
559
|
+
},
|
|
560
|
+
props: { isRoot: true },
|
|
561
|
+
});
|
|
562
|
+
return {
|
|
563
|
+
retainTelemetryDataForDays:
|
|
564
|
+
serverlessFunction?.retainTelemetryDataForDays ?? null,
|
|
565
|
+
telemetryRetentionConfig:
|
|
566
|
+
serverlessFunction?.telemetryRetentionConfig ?? null,
|
|
567
|
+
};
|
|
568
|
+
}
|
|
569
|
+
if (serviceType === ServiceType.CloudResource) {
|
|
570
|
+
const cloudResource: CloudResource | null =
|
|
571
|
+
await CloudResourceService.findOneById({
|
|
572
|
+
id: resourceId,
|
|
573
|
+
select: {
|
|
574
|
+
retainTelemetryDataForDays: true,
|
|
575
|
+
telemetryRetentionConfig: true,
|
|
576
|
+
},
|
|
577
|
+
props: { isRoot: true },
|
|
578
|
+
});
|
|
579
|
+
return {
|
|
580
|
+
retainTelemetryDataForDays:
|
|
581
|
+
cloudResource?.retainTelemetryDataForDays ?? null,
|
|
582
|
+
telemetryRetentionConfig:
|
|
583
|
+
cloudResource?.telemetryRetentionConfig ?? null,
|
|
584
|
+
};
|
|
585
|
+
}
|
|
586
|
+
if (serviceType === ServiceType.RealUserMonitor) {
|
|
587
|
+
const rumApplication: RumApplication | null =
|
|
588
|
+
await RumApplicationService.findOneById({
|
|
589
|
+
id: resourceId,
|
|
590
|
+
select: {
|
|
591
|
+
retainTelemetryDataForDays: true,
|
|
592
|
+
telemetryRetentionConfig: true,
|
|
593
|
+
},
|
|
594
|
+
props: { isRoot: true },
|
|
595
|
+
});
|
|
596
|
+
return {
|
|
597
|
+
retainTelemetryDataForDays:
|
|
598
|
+
rumApplication?.retainTelemetryDataForDays ?? null,
|
|
599
|
+
telemetryRetentionConfig:
|
|
600
|
+
rumApplication?.telemetryRetentionConfig ?? null,
|
|
601
|
+
};
|
|
602
|
+
}
|
|
456
603
|
} catch (err) {
|
|
457
604
|
logger.warn(
|
|
458
605
|
`Per-resource retention lookup failed for ${serviceType} ${resourceId.toString()}: ${
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import DatabaseService from "./DatabaseService";
|
|
2
|
+
import Model from "../../Models/DatabaseModels/RumApplicationClient";
|
|
3
|
+
import ObjectID from "../../Types/ObjectID";
|
|
4
|
+
import OneUptimeDate from "../../Types/Date";
|
|
5
|
+
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
6
|
+
import logger from "../Utils/Logger";
|
|
7
|
+
|
|
8
|
+
export class Service extends DatabaseService<Model> {
|
|
9
|
+
public constructor() {
|
|
10
|
+
super(Model);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Upsert a RUM client platform (browser.platform / device.model) from
|
|
15
|
+
* ingest. Refreshes lastSeenAt if it already exists.
|
|
16
|
+
*/
|
|
17
|
+
@CaptureSpan()
|
|
18
|
+
public async recordClient(data: {
|
|
19
|
+
projectId: ObjectID;
|
|
20
|
+
rumApplicationId: ObjectID;
|
|
21
|
+
clientName: string;
|
|
22
|
+
clientType?: string | undefined;
|
|
23
|
+
}): Promise<void> {
|
|
24
|
+
try {
|
|
25
|
+
const existing: Model | null = await this.findOneBy({
|
|
26
|
+
query: {
|
|
27
|
+
projectId: data.projectId,
|
|
28
|
+
rumApplicationId: data.rumApplicationId,
|
|
29
|
+
clientName: data.clientName,
|
|
30
|
+
},
|
|
31
|
+
select: { _id: true },
|
|
32
|
+
props: { isRoot: true },
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
36
|
+
const fields: any = { lastSeenAt: OneUptimeDate.getCurrentDate() };
|
|
37
|
+
if (data.clientType) {
|
|
38
|
+
fields.clientType = data.clientType;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (existing && existing._id) {
|
|
42
|
+
await this.updateOneById({
|
|
43
|
+
id: new ObjectID(existing._id.toString()),
|
|
44
|
+
data: fields,
|
|
45
|
+
props: { isRoot: true },
|
|
46
|
+
});
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const item: Model = new Model();
|
|
51
|
+
item.projectId = data.projectId;
|
|
52
|
+
item.rumApplicationId = data.rumApplicationId;
|
|
53
|
+
item.clientName = data.clientName;
|
|
54
|
+
item.lastSeenAt = OneUptimeDate.getCurrentDate();
|
|
55
|
+
if (data.clientType) {
|
|
56
|
+
item.clientType = data.clientType;
|
|
57
|
+
}
|
|
58
|
+
await this.create({ data: item, props: { isRoot: true } });
|
|
59
|
+
} catch (err) {
|
|
60
|
+
logger.warn(
|
|
61
|
+
`RumApplicationClientService.recordClient failed: ${
|
|
62
|
+
err instanceof Error ? err.message : String(err)
|
|
63
|
+
}`,
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export default new Service();
|