@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,365 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stack trace parser that transforms raw stack trace strings into structured frames.
|
|
3
|
+
* Supports JavaScript/Node.js, Python, Java, Go, Ruby, C#/.NET, and PHP stack traces.
|
|
4
|
+
*/
|
|
5
|
+
// Known library/framework path patterns that indicate non-app code
|
|
6
|
+
const LIBRARY_PATTERNS = [
|
|
7
|
+
// Node.js internals
|
|
8
|
+
/^node:/,
|
|
9
|
+
/^internal\//,
|
|
10
|
+
/node_modules\//,
|
|
11
|
+
/^events\.js$/,
|
|
12
|
+
/^timers\.js$/,
|
|
13
|
+
/^util\.js$/,
|
|
14
|
+
/^net\.js$/,
|
|
15
|
+
/^stream\.js$/,
|
|
16
|
+
/^buffer\.js$/,
|
|
17
|
+
// Python
|
|
18
|
+
/\/site-packages\//,
|
|
19
|
+
/\/dist-packages\//,
|
|
20
|
+
/\/lib\/python\d+\.\d+\//,
|
|
21
|
+
/\/usr\/lib\//,
|
|
22
|
+
/\/usr\/local\/lib\//,
|
|
23
|
+
/\/venv\//,
|
|
24
|
+
/\/\.venv\//,
|
|
25
|
+
/\/virtualenv\//,
|
|
26
|
+
// Java
|
|
27
|
+
/^java\./,
|
|
28
|
+
/^javax\./,
|
|
29
|
+
/^sun\./,
|
|
30
|
+
/^com\.sun\./,
|
|
31
|
+
/^org\.springframework\./,
|
|
32
|
+
/^org\.apache\./,
|
|
33
|
+
/^org\.hibernate\./,
|
|
34
|
+
/^org\.eclipse\./,
|
|
35
|
+
/^io\.netty\./,
|
|
36
|
+
/^com\.google\./,
|
|
37
|
+
/^org\.junit\./,
|
|
38
|
+
// Go
|
|
39
|
+
/^runtime\//,
|
|
40
|
+
/^net\/http\//,
|
|
41
|
+
/^testing\//,
|
|
42
|
+
/\/vendor\//,
|
|
43
|
+
/\/pkg\/mod\//,
|
|
44
|
+
// Ruby
|
|
45
|
+
/\/gems\//,
|
|
46
|
+
/\/rubygems\//,
|
|
47
|
+
/\/ruby\/\d+\.\d+\.\d+\//,
|
|
48
|
+
// C#/.NET
|
|
49
|
+
/^System\./,
|
|
50
|
+
/^Microsoft\./,
|
|
51
|
+
/^Newtonsoft\./,
|
|
52
|
+
// PHP
|
|
53
|
+
/\/vendor\//,
|
|
54
|
+
/^phar:\/\//,
|
|
55
|
+
];
|
|
56
|
+
export default class StackTraceParser {
|
|
57
|
+
/**
|
|
58
|
+
* Parse a raw stack trace string into structured frames.
|
|
59
|
+
* Auto-detects the language and applies the appropriate parser.
|
|
60
|
+
*/
|
|
61
|
+
static parse(rawStackTrace) {
|
|
62
|
+
if (!rawStackTrace || rawStackTrace.trim().length === 0) {
|
|
63
|
+
return { frames: [], raw: rawStackTrace || "" };
|
|
64
|
+
}
|
|
65
|
+
const lines = rawStackTrace.split("\n").map((l) => {
|
|
66
|
+
return l.trim();
|
|
67
|
+
});
|
|
68
|
+
// Try each parser and use the one that produces the most frames
|
|
69
|
+
const parsers = [
|
|
70
|
+
StackTraceParser.parseJavaScript,
|
|
71
|
+
StackTraceParser.parsePython,
|
|
72
|
+
StackTraceParser.parseJava,
|
|
73
|
+
StackTraceParser.parseGo,
|
|
74
|
+
StackTraceParser.parseRuby,
|
|
75
|
+
StackTraceParser.parseCSharp,
|
|
76
|
+
StackTraceParser.parsePHP,
|
|
77
|
+
];
|
|
78
|
+
let bestFrames = [];
|
|
79
|
+
for (const parser of parsers) {
|
|
80
|
+
try {
|
|
81
|
+
const frames = parser(lines);
|
|
82
|
+
if (frames.length > bestFrames.length) {
|
|
83
|
+
bestFrames = frames;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch (_a) {
|
|
87
|
+
// Skip failing parsers
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
frames: bestFrames,
|
|
92
|
+
raw: rawStackTrace,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Determine if a file path is application code (not library/framework).
|
|
97
|
+
*/
|
|
98
|
+
static isAppCode(filePath) {
|
|
99
|
+
if (!filePath) {
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
for (const pattern of LIBRARY_PATTERNS) {
|
|
103
|
+
if (pattern.test(filePath)) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Parse JavaScript/Node.js stack traces.
|
|
111
|
+
* Format: `at functionName (filePath:line:col)` or `at filePath:line:col`
|
|
112
|
+
*/
|
|
113
|
+
static parseJavaScript(lines) {
|
|
114
|
+
const frames = [];
|
|
115
|
+
// Pattern 1: at functionName (filePath:line:col)
|
|
116
|
+
const patternWithParens = /^at\s+(.+?)\s+\((.+?):(\d+):(\d+)\)$/;
|
|
117
|
+
// Pattern 2: at filePath:line:col
|
|
118
|
+
const patternWithoutParens = /^at\s+(.+?):(\d+):(\d+)$/;
|
|
119
|
+
// Pattern 3: at functionName (filePath:line)
|
|
120
|
+
const patternWithParensNoCol = /^at\s+(.+?)\s+\((.+?):(\d+)\)$/;
|
|
121
|
+
// Pattern 4: at eval (eval at functionName (filePath:line:col))
|
|
122
|
+
const patternEval = /^at\s+eval\s+\(eval\s+at\s+(.+?)\s+\((.+?):(\d+):(\d+)\)/;
|
|
123
|
+
for (const line of lines) {
|
|
124
|
+
let match = null;
|
|
125
|
+
match = line.match(patternEval);
|
|
126
|
+
if (match) {
|
|
127
|
+
frames.push({
|
|
128
|
+
functionName: `eval at ${match[1]}`,
|
|
129
|
+
fileName: match[2],
|
|
130
|
+
lineNumber: parseInt(match[3], 10),
|
|
131
|
+
columnNumber: parseInt(match[4], 10),
|
|
132
|
+
inApp: StackTraceParser.isAppCode(match[2]),
|
|
133
|
+
});
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
match = line.match(patternWithParens);
|
|
137
|
+
if (match) {
|
|
138
|
+
frames.push({
|
|
139
|
+
functionName: match[1],
|
|
140
|
+
fileName: match[2],
|
|
141
|
+
lineNumber: parseInt(match[3], 10),
|
|
142
|
+
columnNumber: parseInt(match[4], 10),
|
|
143
|
+
inApp: StackTraceParser.isAppCode(match[2]),
|
|
144
|
+
});
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
match = line.match(patternWithParensNoCol);
|
|
148
|
+
if (match) {
|
|
149
|
+
frames.push({
|
|
150
|
+
functionName: match[1],
|
|
151
|
+
fileName: match[2],
|
|
152
|
+
lineNumber: parseInt(match[3], 10),
|
|
153
|
+
inApp: StackTraceParser.isAppCode(match[2]),
|
|
154
|
+
});
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
match = line.match(patternWithoutParens);
|
|
158
|
+
if (match) {
|
|
159
|
+
frames.push({
|
|
160
|
+
functionName: "<anonymous>",
|
|
161
|
+
fileName: match[1],
|
|
162
|
+
lineNumber: parseInt(match[2], 10),
|
|
163
|
+
columnNumber: parseInt(match[3], 10),
|
|
164
|
+
inApp: StackTraceParser.isAppCode(match[1]),
|
|
165
|
+
});
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return frames;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Parse Python stack traces.
|
|
173
|
+
* Format: `File "path", line N, in function`
|
|
174
|
+
*/
|
|
175
|
+
static parsePython(lines) {
|
|
176
|
+
const frames = [];
|
|
177
|
+
const pattern = /^File\s+"(.+?)",\s+line\s+(\d+)(?:,\s+in\s+(.+))?$/;
|
|
178
|
+
for (const line of lines) {
|
|
179
|
+
const match = line.match(pattern);
|
|
180
|
+
if (match) {
|
|
181
|
+
frames.push({
|
|
182
|
+
functionName: match[3] || "<module>",
|
|
183
|
+
fileName: match[1],
|
|
184
|
+
lineNumber: parseInt(match[2], 10),
|
|
185
|
+
inApp: StackTraceParser.isAppCode(match[1]),
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return frames;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Parse Java stack traces.
|
|
193
|
+
* Format: `at package.Class.method(File.java:line)`
|
|
194
|
+
*/
|
|
195
|
+
static parseJava(lines) {
|
|
196
|
+
const frames = [];
|
|
197
|
+
// Pattern: at com.package.Class.method(File.java:123)
|
|
198
|
+
const pattern = /^at\s+([\w.$]+)\(([\w.]+):(\d+)\)$/;
|
|
199
|
+
// Pattern for native methods: at com.package.Class.method(Native Method)
|
|
200
|
+
const patternNative = /^at\s+([\w.$]+)\(Native Method\)$/;
|
|
201
|
+
// Pattern for unknown source: at com.package.Class.method(Unknown Source)
|
|
202
|
+
const patternUnknown = /^at\s+([\w.$]+)\(Unknown Source\)$/;
|
|
203
|
+
for (const line of lines) {
|
|
204
|
+
let match = null;
|
|
205
|
+
match = line.match(pattern);
|
|
206
|
+
if (match) {
|
|
207
|
+
const fullMethod = match[1];
|
|
208
|
+
frames.push({
|
|
209
|
+
functionName: fullMethod,
|
|
210
|
+
fileName: match[2],
|
|
211
|
+
lineNumber: parseInt(match[3], 10),
|
|
212
|
+
inApp: StackTraceParser.isAppCode(fullMethod),
|
|
213
|
+
});
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
match = line.match(patternNative);
|
|
217
|
+
if (match) {
|
|
218
|
+
frames.push({
|
|
219
|
+
functionName: match[1],
|
|
220
|
+
fileName: "Native Method",
|
|
221
|
+
lineNumber: 0,
|
|
222
|
+
inApp: false,
|
|
223
|
+
});
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
match = line.match(patternUnknown);
|
|
227
|
+
if (match) {
|
|
228
|
+
frames.push({
|
|
229
|
+
functionName: match[1],
|
|
230
|
+
fileName: "Unknown Source",
|
|
231
|
+
lineNumber: 0,
|
|
232
|
+
inApp: StackTraceParser.isAppCode(match[1]),
|
|
233
|
+
});
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return frames;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Parse Go stack traces.
|
|
241
|
+
* Format: `package/file.go:line +0xNN` or `goroutine N [reason]:`
|
|
242
|
+
* Go stack traces have pairs of lines:
|
|
243
|
+
* functionName(args)
|
|
244
|
+
* /path/to/file.go:line +0xNN
|
|
245
|
+
*/
|
|
246
|
+
static parseGo(lines) {
|
|
247
|
+
const frames = [];
|
|
248
|
+
const filePattern = /^(.+\.go):(\d+)\s*(?:\+0x[0-9a-f]+)?$/;
|
|
249
|
+
for (let i = 0; i < lines.length; i++) {
|
|
250
|
+
const line = lines[i];
|
|
251
|
+
// Skip goroutine headers
|
|
252
|
+
if (line.startsWith("goroutine ")) {
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
// Look for file:line pattern
|
|
256
|
+
const match = line.match(filePattern);
|
|
257
|
+
if (match) {
|
|
258
|
+
// The previous line should be the function name
|
|
259
|
+
let functionName = "<unknown>";
|
|
260
|
+
if (i > 0 && lines[i - 1]) {
|
|
261
|
+
// Remove arguments from function name
|
|
262
|
+
const funcLine = lines[i - 1];
|
|
263
|
+
const parenIndex = funcLine.indexOf("(");
|
|
264
|
+
functionName =
|
|
265
|
+
parenIndex > 0 ? funcLine.substring(0, parenIndex) : funcLine;
|
|
266
|
+
}
|
|
267
|
+
frames.push({
|
|
268
|
+
functionName: functionName,
|
|
269
|
+
fileName: match[1],
|
|
270
|
+
lineNumber: parseInt(match[2], 10),
|
|
271
|
+
inApp: StackTraceParser.isAppCode(match[1]),
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
return frames;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Parse Ruby stack traces.
|
|
279
|
+
* Format: `file:line:in 'method'` or `file:line:in \`method'`
|
|
280
|
+
*/
|
|
281
|
+
static parseRuby(lines) {
|
|
282
|
+
const frames = [];
|
|
283
|
+
const pattern = /^(.+?):(\d+):in\s+[`'](.+?)'$/;
|
|
284
|
+
for (const line of lines) {
|
|
285
|
+
const match = line.match(pattern);
|
|
286
|
+
if (match) {
|
|
287
|
+
frames.push({
|
|
288
|
+
functionName: match[3],
|
|
289
|
+
fileName: match[1],
|
|
290
|
+
lineNumber: parseInt(match[2], 10),
|
|
291
|
+
inApp: StackTraceParser.isAppCode(match[1]),
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return frames;
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Parse C#/.NET stack traces.
|
|
299
|
+
* Format: `at Namespace.Class.Method(params) in file:line N`
|
|
300
|
+
*/
|
|
301
|
+
static parseCSharp(lines) {
|
|
302
|
+
const frames = [];
|
|
303
|
+
// Pattern: at Namespace.Class.Method(params) in /path/to/file.cs:line 42
|
|
304
|
+
const patternWithFile = /^at\s+(.+?)\s+in\s+(.+?):line\s+(\d+)$/;
|
|
305
|
+
// Pattern: at Namespace.Class.Method(params)
|
|
306
|
+
const patternWithoutFile = /^at\s+([\w.<>+]+\(.*?\))$/;
|
|
307
|
+
for (const line of lines) {
|
|
308
|
+
let match = null;
|
|
309
|
+
match = line.match(patternWithFile);
|
|
310
|
+
if (match) {
|
|
311
|
+
frames.push({
|
|
312
|
+
functionName: match[1],
|
|
313
|
+
fileName: match[2],
|
|
314
|
+
lineNumber: parseInt(match[3], 10),
|
|
315
|
+
inApp: StackTraceParser.isAppCode(match[1]),
|
|
316
|
+
});
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
match = line.match(patternWithoutFile);
|
|
320
|
+
if (match) {
|
|
321
|
+
frames.push({
|
|
322
|
+
functionName: match[1],
|
|
323
|
+
fileName: "",
|
|
324
|
+
lineNumber: 0,
|
|
325
|
+
inApp: StackTraceParser.isAppCode(match[1]),
|
|
326
|
+
});
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
return frames;
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Parse PHP stack traces.
|
|
334
|
+
* Format: `#N /path/to/file.php(line): Class->method()`
|
|
335
|
+
*/
|
|
336
|
+
static parsePHP(lines) {
|
|
337
|
+
const frames = [];
|
|
338
|
+
// Pattern: #0 /path/to/file.php(42): ClassName->method()
|
|
339
|
+
const pattern = /^#\d+\s+(.+?)\((\d+)\):\s+(.+)$/;
|
|
340
|
+
// Pattern: #0 {main}
|
|
341
|
+
const patternMain = /^#\d+\s+\{main\}$/;
|
|
342
|
+
for (const line of lines) {
|
|
343
|
+
if (patternMain.test(line)) {
|
|
344
|
+
frames.push({
|
|
345
|
+
functionName: "{main}",
|
|
346
|
+
fileName: "",
|
|
347
|
+
lineNumber: 0,
|
|
348
|
+
inApp: true,
|
|
349
|
+
});
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
const match = line.match(pattern);
|
|
353
|
+
if (match) {
|
|
354
|
+
frames.push({
|
|
355
|
+
functionName: match[3].replace(/\(\)$/, ""),
|
|
356
|
+
fileName: match[1],
|
|
357
|
+
lineNumber: parseInt(match[2], 10),
|
|
358
|
+
inApp: StackTraceParser.isAppCode(match[1]),
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
return frames;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
//# sourceMappingURL=StackTraceParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StackTraceParser.js","sourceRoot":"","sources":["../../../../../Server/Utils/Telemetry/StackTraceParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { DisableTelemetry } from "../../EnvironmentConfig";
|
|
2
|
+
import { AsyncLocalStorage } from "async_hooks";
|
|
3
|
+
/**
|
|
4
|
+
* Ambient, mutable telemetry context backed by AsyncLocalStorage.
|
|
5
|
+
*
|
|
6
|
+
* Why this exists: OpenTelemetry span attributes do NOT propagate from a
|
|
7
|
+
* parent span to its children, and OneUptime sets tenant context (projectId,
|
|
8
|
+
* userId, ...) deep in middleware while the spans that matter are created much
|
|
9
|
+
* further down the call stack. Rather than thread attributes through every
|
|
10
|
+
* function or tag ~1958 `@CaptureSpan` call sites by hand, we keep a small
|
|
11
|
+
* mutable attribute bag scoped to the current unit of work. `ContextSpanProcessor`
|
|
12
|
+
* stamps it onto every span at creation, and `Logger` merges it into every log
|
|
13
|
+
* record — so context flows everywhere automatically.
|
|
14
|
+
*
|
|
15
|
+
* Seed a scope at each entry point with `runWithContext`, then enrich it as
|
|
16
|
+
* more identifiers become known with `setAttributes`.
|
|
17
|
+
*/
|
|
18
|
+
class TelemetryContext {
|
|
19
|
+
/**
|
|
20
|
+
* Run `fn` within a fresh telemetry-context scope seeded with `attributes`.
|
|
21
|
+
* Any attributes from an enclosing scope are inherited so nested units of
|
|
22
|
+
* work (e.g. a job spawned while handling a request) keep their context.
|
|
23
|
+
*/
|
|
24
|
+
static runWithContext(attributes, fn) {
|
|
25
|
+
if (DisableTelemetry) {
|
|
26
|
+
return fn();
|
|
27
|
+
}
|
|
28
|
+
const inherited = this.getAttributes();
|
|
29
|
+
const store = {
|
|
30
|
+
attributes: Object.assign({}, inherited),
|
|
31
|
+
};
|
|
32
|
+
this.mergeInto(store.attributes, attributes);
|
|
33
|
+
return this.storage.run(store, fn);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Merge `attributes` into the current scope. No-op when there is no active
|
|
37
|
+
* scope (e.g. code running outside any seeded entry point) or telemetry is
|
|
38
|
+
* disabled, so it is always safe to call.
|
|
39
|
+
*/
|
|
40
|
+
static setAttributes(attributes) {
|
|
41
|
+
if (DisableTelemetry) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const store = this.storage.getStore();
|
|
45
|
+
if (!store) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
this.mergeInto(store.attributes, attributes);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Read the attributes for the current scope. Returns an empty object when
|
|
52
|
+
* there is no active scope. The returned object is the live store — treat it
|
|
53
|
+
* as read-only (consumers copy it before mutating).
|
|
54
|
+
*/
|
|
55
|
+
static getAttributes() {
|
|
56
|
+
const store = this.storage.getStore();
|
|
57
|
+
if (!store) {
|
|
58
|
+
return {};
|
|
59
|
+
}
|
|
60
|
+
return store.attributes;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Best-effort extraction of known tenant/business identifiers from an
|
|
64
|
+
* arbitrary object (e.g. a queue job's `data` payload), so worker jobs can
|
|
65
|
+
* seed context without every job knowing about telemetry. Values are coerced
|
|
66
|
+
* to strings; unknown/empty values are skipped.
|
|
67
|
+
*/
|
|
68
|
+
static pickKnownAttributes(data) {
|
|
69
|
+
const attributes = {};
|
|
70
|
+
if (!data || typeof data !== "object") {
|
|
71
|
+
return attributes;
|
|
72
|
+
}
|
|
73
|
+
const record = data;
|
|
74
|
+
for (const key of this.KNOWN_ID_KEYS) {
|
|
75
|
+
const value = record[key];
|
|
76
|
+
if (value === undefined || value === null) {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (typeof value === "string" ||
|
|
80
|
+
typeof value === "number" ||
|
|
81
|
+
typeof value === "boolean") {
|
|
82
|
+
attributes[key] = value;
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
// ObjectID-like values expose a meaningful toString().
|
|
86
|
+
const asString = String(value);
|
|
87
|
+
if (asString && asString !== "[object Object]") {
|
|
88
|
+
attributes[key] = asString;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return attributes;
|
|
92
|
+
}
|
|
93
|
+
static mergeInto(target, attributes) {
|
|
94
|
+
for (const key in attributes) {
|
|
95
|
+
const value = attributes[key];
|
|
96
|
+
if (value !== undefined && value !== null) {
|
|
97
|
+
target[key] = value;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
TelemetryContext.storage = new AsyncLocalStorage();
|
|
103
|
+
/**
|
|
104
|
+
* Identifier keys we look for when seeding context from an arbitrary payload
|
|
105
|
+
* (see {@link pickKnownAttributes}).
|
|
106
|
+
*/
|
|
107
|
+
TelemetryContext.KNOWN_ID_KEYS = [
|
|
108
|
+
"projectId",
|
|
109
|
+
"userId",
|
|
110
|
+
"monitorId",
|
|
111
|
+
"incidentId",
|
|
112
|
+
"alertId",
|
|
113
|
+
"statusPageId",
|
|
114
|
+
"scheduledMaintenanceId",
|
|
115
|
+
"onCallDutyPolicyId",
|
|
116
|
+
"onCallDutyPolicyScheduleId",
|
|
117
|
+
"incidentEpisodeId",
|
|
118
|
+
"alertEpisodeId",
|
|
119
|
+
"workspaceType",
|
|
120
|
+
"channelId",
|
|
121
|
+
"requestId",
|
|
122
|
+
];
|
|
123
|
+
export default TelemetryContext;
|
|
124
|
+
//# sourceMappingURL=TelemetryContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TelemetryContext.js","sourceRoot":"","sources":["../../../../../Server/Utils/Telemetry/TelemetryContext.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,10 +9,13 @@ import { Resource } from "@opentelemetry/resources";
|
|
|
9
9
|
import { BatchLogRecordProcessor, LoggerProvider, } from "@opentelemetry/sdk-logs";
|
|
10
10
|
import { Aggregation, MeterProvider, PeriodicExportingMetricReader, } from "@opentelemetry/sdk-metrics";
|
|
11
11
|
import * as opentelemetry from "@opentelemetry/sdk-node";
|
|
12
|
+
import { BatchSpanProcessor, } from "@opentelemetry/sdk-trace-base";
|
|
12
13
|
import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION, } from "@opentelemetry/semantic-conventions";
|
|
13
14
|
import URL from "../../Types/API/URL";
|
|
14
15
|
import { AppVersion, Env, DisableTelemetry } from "../EnvironmentConfig";
|
|
15
16
|
import logger from "./Logger";
|
|
17
|
+
import GracefulShutdown, { ShutdownPriority } from "./GracefulShutdown";
|
|
18
|
+
import ContextSpanProcessor from "./Telemetry/ContextSpanProcessor";
|
|
16
19
|
import RuntimeMetrics from "./Telemetry/RuntimeMetrics";
|
|
17
20
|
export var SpanStatusCode;
|
|
18
21
|
(function (SpanStatusCode) {
|
|
@@ -134,9 +137,18 @@ class Telemetry {
|
|
|
134
137
|
resource: loggerProviderResource,
|
|
135
138
|
autoDetectResources: true,
|
|
136
139
|
};
|
|
140
|
+
/*
|
|
141
|
+
* Always run the ContextSpanProcessor so the ambient TelemetryContext
|
|
142
|
+
* attributes (projectId, userId, monitorId, incidentId, requestId, ...)
|
|
143
|
+
* are stamped onto every span at creation. The BatchSpanProcessor that
|
|
144
|
+
* actually exports spans is added after it, and only when an exporter is
|
|
145
|
+
* configured. (traceExporter is deprecated in favour of spanProcessors.)
|
|
146
|
+
*/
|
|
147
|
+
const spanProcessors = [new ContextSpanProcessor()];
|
|
137
148
|
if (traceExporter) {
|
|
138
|
-
|
|
149
|
+
spanProcessors.push(new BatchSpanProcessor(traceExporter));
|
|
139
150
|
}
|
|
151
|
+
nodeSdkConfiguration.spanProcessors = spanProcessors;
|
|
140
152
|
/*
|
|
141
153
|
* We will skip this becasue we're attachng this metric reader to the meter provider later.
|
|
142
154
|
* if (this.metricReader) {
|
|
@@ -149,10 +161,15 @@ class Telemetry {
|
|
|
149
161
|
const sdk = new opentelemetry.NodeSDK(nodeSdkConfiguration);
|
|
150
162
|
this.getMeterProvider();
|
|
151
163
|
this.getMeter();
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
164
|
+
/*
|
|
165
|
+
* Flush traces / metrics / logs last (Telemetry tier) so spans and logs
|
|
166
|
+
* emitted by the rest of the shutdown still get exported. GracefulShutdown
|
|
167
|
+
* owns process.exit now — this handler must NOT call it itself, or it
|
|
168
|
+
* would race the other tiers and abandon the datastore pools (the exact
|
|
169
|
+
* bug this replaced).
|
|
170
|
+
*/
|
|
171
|
+
GracefulShutdown.registerHandler("Telemetry", ShutdownPriority.Telemetry, () => {
|
|
172
|
+
return sdk.shutdown();
|
|
156
173
|
});
|
|
157
174
|
sdk.start();
|
|
158
175
|
this.sdk = sdk;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Telemetry.js","sourceRoot":"","sources":["../../../../Server/Utils/Telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,gBAcN,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAU,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAMvD,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EACL,uBAAuB,EACvB,cAAc,GAGf,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,WAAW,EACX,aAAa,EACb,6BAA6B,GAC9B,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,aAAa,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"Telemetry.js","sourceRoot":"","sources":["../../../../Server/Utils/Telemetry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { TelemetryAttributeService } from "../../../Server/Services/TelemetryAttributeService";
|
|
2
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
3
|
+
import { describe, expect, test } from "@jest/globals";
|
|
4
|
+
describe("TelemetryAttributeService.buildAttributeValuesStatement", () => {
|
|
5
|
+
/*
|
|
6
|
+
* Only the column/table names are read while building the statement, so a
|
|
7
|
+
* lightweight source literal is enough — no real AnalyticsDatabaseService.
|
|
8
|
+
*/
|
|
9
|
+
const source = {
|
|
10
|
+
tableName: "MetricItemV2",
|
|
11
|
+
attributesColumn: "attributes",
|
|
12
|
+
attributeKeysColumn: "attributeKeys",
|
|
13
|
+
timeColumn: "time",
|
|
14
|
+
};
|
|
15
|
+
const buildValuesStatement = (overrides = {}) => {
|
|
16
|
+
return TelemetryAttributeService.buildAttributeValuesStatement(Object.assign({ projectId: ObjectID.generate(), source, attributeKey: "host.name" }, overrides));
|
|
17
|
+
};
|
|
18
|
+
test("omits the ILIKE filter when no search text is provided", () => {
|
|
19
|
+
const statement = buildValuesStatement();
|
|
20
|
+
expect(statement.query).not.toContain("ILIKE");
|
|
21
|
+
expect(statement.query).toContain("ORDER BY attributeValue ASC");
|
|
22
|
+
});
|
|
23
|
+
test("omits the ILIKE filter when search text is only whitespace", () => {
|
|
24
|
+
const statement = buildValuesStatement({ searchText: " " });
|
|
25
|
+
expect(statement.query).not.toContain("ILIKE");
|
|
26
|
+
});
|
|
27
|
+
test("adds a case-insensitive substring filter when search text is provided", () => {
|
|
28
|
+
const statement = buildValuesStatement({ searchText: "web" });
|
|
29
|
+
expect(statement.query).toContain("ILIKE");
|
|
30
|
+
// The value is parameterized and wrapped with % wildcards.
|
|
31
|
+
expect(Object.values(statement.query_params)).toContain("%web%");
|
|
32
|
+
// The attribute key is always parameterized — never inlined into SQL.
|
|
33
|
+
expect(Object.values(statement.query_params)).toContain("host.name");
|
|
34
|
+
});
|
|
35
|
+
test("trims surrounding whitespace from the search text", () => {
|
|
36
|
+
const statement = buildValuesStatement({
|
|
37
|
+
searchText: " web-server ",
|
|
38
|
+
});
|
|
39
|
+
expect(Object.values(statement.query_params)).toContain("%web-server%");
|
|
40
|
+
});
|
|
41
|
+
test("scopes to a metric when metricName is provided", () => {
|
|
42
|
+
const statement = buildValuesStatement({
|
|
43
|
+
metricName: "http.server.duration",
|
|
44
|
+
searchText: "web",
|
|
45
|
+
});
|
|
46
|
+
expect(statement.query).toContain("AND name =");
|
|
47
|
+
expect(Object.values(statement.query_params)).toContain("http.server.duration");
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=TelemetryAttributeService.test.js.map
|