@oneuptime/common 10.5.9 → 10.5.18
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/AnalyticsModels/ExceptionInstance.ts +1 -1
- package/Models/AnalyticsModels/Log.ts +1 -1
- package/Models/AnalyticsModels/Metric.ts +1 -1
- package/Models/AnalyticsModels/Profile.ts +1 -1
- package/Models/AnalyticsModels/ProfileSample.ts +1 -1
- package/Models/AnalyticsModels/Span.ts +1 -1
- package/Models/DatabaseModels/TelemetryException.ts +46 -34
- package/Models/DatabaseModels/TelemetryUsageBilling.ts +35 -2
- package/Server/API/AIAgentDataAPI.ts +25 -7
- package/Server/API/TelemetryAPI.ts +6 -0
- package/Server/API/TelemetryExceptionAPI.ts +6 -2
- package/Server/EnvironmentConfig.ts +27 -0
- package/Server/Infrastructure/ClickhouseDatabase.ts +21 -1
- package/Server/Infrastructure/Postgres/DataSourceOptions.ts +19 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780381124553-MigrationName.ts +28 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780382837019-MigrationName.ts +24 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780387560604-MigrationName.ts +47 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780388219225-MigrationName.ts +34 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
- package/Server/Infrastructure/PostgresDatabase.ts +27 -1
- package/Server/Infrastructure/QueueWorker.ts +54 -4
- package/Server/Infrastructure/Redis.ts +11 -0
- package/Server/Services/AnalyticsDatabaseService.ts +87 -0
- package/Server/Services/DatabaseService.ts +73 -0
- package/Server/Services/TelemetryAttributeService.ts +38 -2
- package/Server/Services/TelemetryExceptionService.ts +24 -49
- package/Server/Services/TelemetryUsageBillingService.ts +289 -166
- package/Server/Types/AnalyticsDatabase/ModelPermission.ts +102 -72
- package/Server/Types/Database/Permissions/OwnedScopePermission.ts +81 -60
- package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +67 -0
- package/Server/Utils/Express.ts +32 -0
- package/Server/Utils/GracefulShutdown.ts +194 -0
- package/Server/Utils/Logger.ts +12 -1
- package/Server/Utils/Monitor/MonitorLogUtil.ts +22 -17
- package/Server/Utils/Profiling.ts +14 -6
- package/Server/Utils/StartServer.ts +13 -5
- package/Server/Utils/Telemetry/ContextSpanProcessor.ts +48 -0
- package/Server/Utils/Telemetry/LogExceptionExtractor.ts +289 -0
- package/Server/Utils/Telemetry/SpanUtil.ts +16 -35
- package/Server/Utils/Telemetry/StackTraceParser.ts +423 -0
- package/Server/Utils/Telemetry/TelemetryContext.ts +190 -0
- package/Server/Utils/Telemetry.ts +33 -7
- package/Tests/Server/Services/TelemetryAttributeService.test.ts +83 -0
- package/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.ts +0 -0
- package/Types/Database/AccessControl/OwnedThrough.ts +31 -3
- package/Types/Telemetry/ServiceType.ts +10 -0
- package/UI/Components/AutocompleteTextInput/AutocompleteTextInput.tsx +7 -1
- package/UI/Components/Dictionary/Dictionary.tsx +19 -0
- package/UI/Components/Filters/FiltersForm.tsx +1 -0
- package/UI/Components/Filters/JSONFilter.tsx +2 -0
- package/UI/Components/Filters/Types/Filter.ts +1 -0
- package/UI/Components/LogsViewer/LogsViewer.tsx +16 -0
- package/UI/Utils/Project.ts +6 -0
- package/UI/Utils/Telemetry/Telemetry.ts +65 -0
- package/UI/Utils/TelemetryService.ts +150 -0
- package/build/dist/Models/AnalyticsModels/ExceptionInstance.js +1 -1
- package/build/dist/Models/AnalyticsModels/ExceptionInstance.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Log.js +1 -1
- package/build/dist/Models/AnalyticsModels/Log.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Metric.js +1 -1
- package/build/dist/Models/AnalyticsModels/Metric.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Profile.js +1 -1
- package/build/dist/Models/AnalyticsModels/Profile.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/ProfileSample.js +1 -1
- package/build/dist/Models/AnalyticsModels/ProfileSample.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Span.js +1 -1
- package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryException.js +47 -33
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryUsageBilling.js +36 -2
- package/build/dist/Models/DatabaseModels/TelemetryUsageBilling.js.map +1 -1
- package/build/dist/Server/API/AIAgentDataAPI.js +24 -8
- package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +4 -0
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryExceptionAPI.js +6 -2
- package/build/dist/Server/API/TelemetryExceptionAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +19 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/ClickhouseDatabase.js +16 -2
- package/build/dist/Server/Infrastructure/ClickhouseDatabase.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js +10 -9
- package/build/dist/Server/Infrastructure/Postgres/DataSourceOptions.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780381124553-MigrationName.js +23 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780381124553-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780382837019-MigrationName.js +19 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780382837019-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780387560604-MigrationName.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780387560604-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780388219225-MigrationName.js +25 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780388219225-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/PostgresDatabase.js +20 -1
- package/build/dist/Server/Infrastructure/PostgresDatabase.js.map +1 -1
- package/build/dist/Server/Infrastructure/QueueWorker.js +40 -3
- package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
- package/build/dist/Server/Infrastructure/Redis.js +5 -0
- package/build/dist/Server/Infrastructure/Redis.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +59 -0
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +62 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryAttributeService.js +23 -1
- package/build/dist/Server/Services/TelemetryAttributeService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryExceptionService.js +16 -41
- package/build/dist/Server/Services/TelemetryExceptionService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +211 -147
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +84 -63
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnedScopePermission.js +67 -49
- package/build/dist/Server/Types/Database/Permissions/OwnedScopePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +51 -0
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Express.js +23 -0
- package/build/dist/Server/Utils/Express.js.map +1 -1
- package/build/dist/Server/Utils/GracefulShutdown.js +145 -0
- package/build/dist/Server/Utils/GracefulShutdown.js.map +1 -0
- package/build/dist/Server/Utils/Logger.js +8 -1
- package/build/dist/Server/Utils/Logger.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorLogUtil.js +12 -10
- package/build/dist/Server/Utils/Monitor/MonitorLogUtil.js.map +1 -1
- package/build/dist/Server/Utils/Profiling.js +8 -3
- package/build/dist/Server/Utils/Profiling.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +12 -4
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ContextSpanProcessor.js +37 -0
- package/build/dist/Server/Utils/Telemetry/ContextSpanProcessor.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +214 -0
- package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/SpanUtil.js +15 -24
- package/build/dist/Server/Utils/Telemetry/SpanUtil.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/StackTraceParser.js +365 -0
- package/build/dist/Server/Utils/Telemetry/StackTraceParser.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryContext.js +124 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryContext.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry.js +22 -5
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- package/build/dist/Tests/Server/Services/TelemetryAttributeService.test.js +50 -0
- package/build/dist/Tests/Server/Services/TelemetryAttributeService.test.js.map +1 -0
- package/build/dist/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.js +0 -0
- package/build/dist/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.js.map +1 -0
- package/build/dist/Types/Database/AccessControl/OwnedThrough.js +7 -2
- package/build/dist/Types/Database/AccessControl/OwnedThrough.js.map +1 -1
- package/build/dist/Types/Telemetry/ServiceType.js +10 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/UI/Components/AutocompleteTextInput/AutocompleteTextInput.js +7 -1
- package/build/dist/UI/Components/AutocompleteTextInput/AutocompleteTextInput.js.map +1 -1
- package/build/dist/UI/Components/Dictionary/Dictionary.js +10 -0
- package/build/dist/UI/Components/Dictionary/Dictionary.js.map +1 -1
- package/build/dist/UI/Components/Filters/FiltersForm.js +1 -1
- package/build/dist/UI/Components/Filters/FiltersForm.js.map +1 -1
- package/build/dist/UI/Components/Filters/JSONFilter.js +1 -1
- package/build/dist/UI/Components/Filters/JSONFilter.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +15 -0
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Utils/Project.js +5 -0
- package/build/dist/UI/Utils/Project.js.map +1 -1
- package/build/dist/UI/Utils/Telemetry/Telemetry.js +44 -0
- package/build/dist/UI/Utils/Telemetry/Telemetry.js.map +1 -1
- package/build/dist/UI/Utils/TelemetryService.js +113 -0
- package/build/dist/UI/Utils/TelemetryService.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import Service from "../../Models/DatabaseModels/Service";
|
|
2
|
+
import { Gray500 } from "../../Types/BrandColors";
|
|
3
|
+
import ServiceType from "../../Types/Telemetry/ServiceType";
|
|
4
|
+
/*
|
|
5
|
+
* Telemetry that arrives without an OTel service.name (and with no
|
|
6
|
+
* host / docker / k8s resource signal) is not backed by a Service row.
|
|
7
|
+
* The ingest path tags those analytics rows with the projectId in the
|
|
8
|
+
* `serviceId` column under ServiceType.Unknown (see
|
|
9
|
+
* OtelIngestBaseService.resolveTelemetryResource). The read side has no
|
|
10
|
+
* Service to resolve, so we represent that telemetry with a synthetic,
|
|
11
|
+
* non-persisted Service whose id is the projectId — that way the
|
|
12
|
+
* existing serviceId -> Service lookups in the telemetry views resolve
|
|
13
|
+
* it to a labelled "Unknown Service" entry without any per-view special
|
|
14
|
+
* casing. A real Service._id is never equal to a projectId, so this
|
|
15
|
+
* never collides with a genuine service.
|
|
16
|
+
*/
|
|
17
|
+
export const UNKNOWN_SERVICE_NAME = "Unknown Service";
|
|
18
|
+
export default class TelemetryServiceUtil {
|
|
19
|
+
/*
|
|
20
|
+
* True when a telemetry row's serviceId is the synthetic "Unknown
|
|
21
|
+
* Service" — i.e. it equals the projectId (ServiceType.Unknown). Used
|
|
22
|
+
* to suppress navigation to a per-service detail page that does not
|
|
23
|
+
* exist for unattributed telemetry.
|
|
24
|
+
*/
|
|
25
|
+
static isUnknownServiceId(serviceId, projectId) {
|
|
26
|
+
if (!serviceId || !projectId) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
return serviceId.toString() === projectId.toString();
|
|
30
|
+
}
|
|
31
|
+
/*
|
|
32
|
+
* Build the synthetic Service used to render unattributed telemetry.
|
|
33
|
+
* Not persisted — id is the projectId so that serviceId -> Service
|
|
34
|
+
* lookups (which key on the analytics row's serviceId) resolve to it.
|
|
35
|
+
*/
|
|
36
|
+
static getUnknownService(projectId) {
|
|
37
|
+
const service = new Service();
|
|
38
|
+
service.id = projectId;
|
|
39
|
+
service.name = UNKNOWN_SERVICE_NAME;
|
|
40
|
+
service.serviceColor = Gray500;
|
|
41
|
+
return service;
|
|
42
|
+
}
|
|
43
|
+
/*
|
|
44
|
+
* Resolve a telemetry row's polymorphic (serviceId, serviceType) to a
|
|
45
|
+
* renderable resource, given the project's loaded Services. Replaces the
|
|
46
|
+
* old server-side `service` ORM relation on TelemetryException: a real
|
|
47
|
+
* Service resolves from the loaded list, the unattributed bucket resolves
|
|
48
|
+
* to the synthetic "Unknown Service", and Host / DockerHost /
|
|
49
|
+
* KubernetesCluster resolve to a type label (no Service row exists for
|
|
50
|
+
* them). Mirrors how the ClickHouse analytics rows are resolved.
|
|
51
|
+
*/
|
|
52
|
+
static resolveTelemetryResource(data) {
|
|
53
|
+
var _a;
|
|
54
|
+
const serviceIdStr = (_a = data.serviceId) === null || _a === void 0 ? void 0 : _a.toString();
|
|
55
|
+
// Real Service (OpenTelemetry) — resolve from the loaded list.
|
|
56
|
+
if (serviceIdStr) {
|
|
57
|
+
const found = data.services.find((s) => {
|
|
58
|
+
var _a;
|
|
59
|
+
return ((_a = s.id) === null || _a === void 0 ? void 0 : _a.toString()) === serviceIdStr;
|
|
60
|
+
});
|
|
61
|
+
if (found) {
|
|
62
|
+
return { service: found };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Unattributed (Unknown) bucket — serviceId is the projectId.
|
|
66
|
+
if (data.projectId &&
|
|
67
|
+
(data.serviceType === ServiceType.Unknown ||
|
|
68
|
+
this.isUnknownServiceId(data.serviceId, data.projectId))) {
|
|
69
|
+
return { service: this.getUnknownService(data.projectId) };
|
|
70
|
+
}
|
|
71
|
+
// Infrastructure resource types — no Service row; render a type label.
|
|
72
|
+
const typeLabels = {
|
|
73
|
+
[ServiceType.Host]: "Host telemetry",
|
|
74
|
+
[ServiceType.DockerHost]: "Docker host telemetry",
|
|
75
|
+
[ServiceType.KubernetesCluster]: "Kubernetes telemetry",
|
|
76
|
+
};
|
|
77
|
+
const label = data.serviceType
|
|
78
|
+
? typeLabels[data.serviceType.toString()]
|
|
79
|
+
: undefined;
|
|
80
|
+
if (label) {
|
|
81
|
+
return { label: label };
|
|
82
|
+
}
|
|
83
|
+
return { label: "Unknown" };
|
|
84
|
+
}
|
|
85
|
+
/*
|
|
86
|
+
* Append the synthetic "Unknown Service" to a loaded service list, but
|
|
87
|
+
* only when the telemetry in view actually references it (some
|
|
88
|
+
* serviceId equals the projectId). Avoids showing an empty "Unknown
|
|
89
|
+
* Service" entry for projects that always set service.name. Idempotent.
|
|
90
|
+
*/
|
|
91
|
+
static withUnknownServiceIfReferenced(data) {
|
|
92
|
+
const projectIdStr = data.projectId.toString();
|
|
93
|
+
let isReferenced = false;
|
|
94
|
+
for (const id of data.referencedServiceIds) {
|
|
95
|
+
if (id === projectIdStr) {
|
|
96
|
+
isReferenced = true;
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (!isReferenced) {
|
|
101
|
+
return data.services;
|
|
102
|
+
}
|
|
103
|
+
const alreadyPresent = data.services.some((service) => {
|
|
104
|
+
var _a;
|
|
105
|
+
return ((_a = service.id) === null || _a === void 0 ? void 0 : _a.toString()) === projectIdStr;
|
|
106
|
+
});
|
|
107
|
+
if (alreadyPresent) {
|
|
108
|
+
return data.services;
|
|
109
|
+
}
|
|
110
|
+
return [...data.services, this.getUnknownService(data.projectId)];
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=TelemetryService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TelemetryService.js","sourceRoot":"","sources":["../../../../UI/Utils/TelemetryService.ts"],"names":[],"mappings":"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"}
|