@oneuptime/common 10.0.11 → 10.0.14
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 +98 -0
- package/Models/DatabaseModels/TelemetryException.ts +105 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1772111896988-MigrationName.ts +41 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
- package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +3 -15
- package/Server/Utils/Telemetry.ts +7 -2
- package/Server/Utils/VM/VMAPI.ts +204 -0
- package/Tests/Server/Utils/VM/VMAPI.test.ts +310 -0
- package/build/dist/Models/AnalyticsModels/ExceptionInstance.js +87 -0
- package/build/dist/Models/AnalyticsModels/ExceptionInstance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryException.js +108 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1772111896988-MigrationName.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1772111896988-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +3 -9
- package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry.js +4 -2
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- package/build/dist/Server/Utils/VM/VMAPI.js +153 -0
- package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
- package/build/dist/Tests/Server/Utils/VM/VMAPI.test.js +214 -0
- package/build/dist/Tests/Server/Utils/VM/VMAPI.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
// Mock all heavy dependencies so the test focuses on template logic only
|
|
2
|
+
jest.mock("../../../../Server/EnvironmentConfig", () => {
|
|
3
|
+
return {
|
|
4
|
+
IsolatedVMHostname: "localhost",
|
|
5
|
+
};
|
|
6
|
+
});
|
|
7
|
+
jest.mock("../../../../Server/Middleware/ClusterKeyAuthorization", () => {
|
|
8
|
+
return {
|
|
9
|
+
default: {
|
|
10
|
+
getClusterKeyHeaders: () => {
|
|
11
|
+
return {};
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
jest.mock("../../../../Utils/API", () => {
|
|
17
|
+
return {
|
|
18
|
+
default: { post: jest.fn() },
|
|
19
|
+
};
|
|
20
|
+
});
|
|
21
|
+
jest.mock("../../../../Server/Utils/Logger", () => {
|
|
22
|
+
return {
|
|
23
|
+
default: {
|
|
24
|
+
error: jest.fn(),
|
|
25
|
+
debug: jest.fn(),
|
|
26
|
+
info: jest.fn(),
|
|
27
|
+
warn: jest.fn(),
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
jest.mock("../../../../Server/Utils/Telemetry/CaptureSpan", () => {
|
|
32
|
+
return {
|
|
33
|
+
default: () => {
|
|
34
|
+
return (_target, _propertyKey, descriptor) => {
|
|
35
|
+
return descriptor;
|
|
36
|
+
};
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
});
|
|
40
|
+
import VMUtil from "../../../../Server/Utils/VM/VMAPI";
|
|
41
|
+
import { describe, expect, it } from "@jest/globals";
|
|
42
|
+
describe("VMUtil", () => {
|
|
43
|
+
describe("deepFind", () => {
|
|
44
|
+
it("should find top-level keys", () => {
|
|
45
|
+
const obj = { status: "firing", receiver: "test" };
|
|
46
|
+
expect(VMUtil.deepFind(obj, "status")).toBe("firing");
|
|
47
|
+
});
|
|
48
|
+
it("should find nested keys with dot notation", () => {
|
|
49
|
+
const obj = { data: { nested: { value: 42 } } };
|
|
50
|
+
expect(VMUtil.deepFind(obj, "data.nested.value")).toBe(42);
|
|
51
|
+
});
|
|
52
|
+
it("should find array elements with bracket notation", () => {
|
|
53
|
+
const obj = { items: ["a", "b", "c"] };
|
|
54
|
+
expect(VMUtil.deepFind(obj, "items[0]")).toBe("a");
|
|
55
|
+
expect(VMUtil.deepFind(obj, "items[2]")).toBe("c");
|
|
56
|
+
});
|
|
57
|
+
it("should find last array element with [last]", () => {
|
|
58
|
+
const obj = { items: [1, 2, 3] };
|
|
59
|
+
expect(VMUtil.deepFind(obj, "items[last]")).toBe(3);
|
|
60
|
+
});
|
|
61
|
+
it("should return undefined for missing paths", () => {
|
|
62
|
+
const obj = { a: { b: 1 } };
|
|
63
|
+
expect(VMUtil.deepFind(obj, "a.c")).toBeUndefined();
|
|
64
|
+
expect(VMUtil.deepFind(obj, "x.y.z")).toBeUndefined();
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe("replaceValueInPlace", () => {
|
|
68
|
+
it("should replace simple variables", () => {
|
|
69
|
+
const storageMap = { name: "test", status: "firing" };
|
|
70
|
+
const result = VMUtil.replaceValueInPlace(storageMap, "Alert: {{name}} is {{status}}", false);
|
|
71
|
+
expect(result).toBe("Alert: test is firing");
|
|
72
|
+
});
|
|
73
|
+
it("should replace nested dotted path variables", () => {
|
|
74
|
+
const storageMap = {
|
|
75
|
+
requestBody: { title: "My Alert", data: { severity: "high" } },
|
|
76
|
+
};
|
|
77
|
+
const result = VMUtil.replaceValueInPlace(storageMap, "Title: {{requestBody.title}}, Severity: {{requestBody.data.severity}}", false);
|
|
78
|
+
expect(result).toBe("Title: My Alert, Severity: high");
|
|
79
|
+
});
|
|
80
|
+
it("should leave unresolved variables as-is", () => {
|
|
81
|
+
const storageMap = { name: "test" };
|
|
82
|
+
const result = VMUtil.replaceValueInPlace(storageMap, "{{name}} {{unknown}}", false);
|
|
83
|
+
expect(result).toBe("test {{unknown}}");
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
describe("expandEachLoops", () => {
|
|
87
|
+
it("should expand a simple each loop over an array of objects", () => {
|
|
88
|
+
const storageMap = {
|
|
89
|
+
requestBody: {
|
|
90
|
+
alerts: [
|
|
91
|
+
{ labels: { label: "Coralpay" }, status: "firing" },
|
|
92
|
+
{ labels: { label: "capitecpay" }, status: "resolved" },
|
|
93
|
+
],
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
const template = "Alerts:{{#each requestBody.alerts}} {{labels.label}}({{status}}){{/each}}";
|
|
97
|
+
const result = VMUtil.expandEachLoops(storageMap, template, false);
|
|
98
|
+
expect(result).toBe("Alerts: Coralpay(firing) capitecpay(resolved)");
|
|
99
|
+
});
|
|
100
|
+
it("should support {{@index}} in loops", () => {
|
|
101
|
+
const storageMap = {
|
|
102
|
+
items: [{ name: "a" }, { name: "b" }, { name: "c" }],
|
|
103
|
+
};
|
|
104
|
+
const template = "{{#each items}}{{@index}}: {{name}} {{/each}}";
|
|
105
|
+
const result = VMUtil.expandEachLoops(storageMap, template, false);
|
|
106
|
+
expect(result).toBe("0: a 1: b 2: c ");
|
|
107
|
+
});
|
|
108
|
+
it("should support {{this}} for primitive arrays", () => {
|
|
109
|
+
const storageMap = {
|
|
110
|
+
tags: ["critical", "production", "api"],
|
|
111
|
+
};
|
|
112
|
+
const template = "Tags:{{#each tags}} {{this}}{{/each}}";
|
|
113
|
+
const result = VMUtil.expandEachLoops(storageMap, template, false);
|
|
114
|
+
expect(result).toBe("Tags: critical production api");
|
|
115
|
+
});
|
|
116
|
+
it("should remove the block if the path is not an array", () => {
|
|
117
|
+
const storageMap = { notAnArray: "hello" };
|
|
118
|
+
const template = "Before {{#each notAnArray}}body{{/each}} After";
|
|
119
|
+
const result = VMUtil.expandEachLoops(storageMap, template, false);
|
|
120
|
+
expect(result).toBe("Before After");
|
|
121
|
+
});
|
|
122
|
+
it("should remove the block if the path does not exist", () => {
|
|
123
|
+
const storageMap = {};
|
|
124
|
+
const template = "Before {{#each missing.path}}body{{/each}} After";
|
|
125
|
+
const result = VMUtil.expandEachLoops(storageMap, template, false);
|
|
126
|
+
expect(result).toBe("Before After");
|
|
127
|
+
});
|
|
128
|
+
it("should handle empty arrays", () => {
|
|
129
|
+
const storageMap = { items: [] };
|
|
130
|
+
const template = "Before {{#each items}}item{{/each}} After";
|
|
131
|
+
const result = VMUtil.expandEachLoops(storageMap, template, false);
|
|
132
|
+
expect(result).toBe("Before After");
|
|
133
|
+
});
|
|
134
|
+
it("should support nested each loops", () => {
|
|
135
|
+
const storageMap = {
|
|
136
|
+
groups: [
|
|
137
|
+
{ name: "G1", members: [{ id: 1 }, { id: 2 }] },
|
|
138
|
+
{ name: "G2", members: [{ id: 3 }] },
|
|
139
|
+
],
|
|
140
|
+
};
|
|
141
|
+
const template = "{{#each groups}}Group {{name}}: {{#each members}}{{id}} {{/each}}| {{/each}}";
|
|
142
|
+
const result = VMUtil.expandEachLoops(storageMap, template, false);
|
|
143
|
+
expect(result).toBe("Group G1: 1 2 | Group G2: 3 | ");
|
|
144
|
+
});
|
|
145
|
+
it("should allow fallback to parent variables inside loops", () => {
|
|
146
|
+
const storageMap = {
|
|
147
|
+
globalTitle: "My Dashboard",
|
|
148
|
+
items: [{ name: "item1" }, { name: "item2" }],
|
|
149
|
+
};
|
|
150
|
+
const template = "{{#each items}}{{name}} in {{globalTitle}} {{/each}}";
|
|
151
|
+
const result = VMUtil.expandEachLoops(storageMap, template, false);
|
|
152
|
+
expect(result).toBe("item1 in My Dashboard item2 in My Dashboard ");
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
describe("replaceValueInPlace with each loops (end-to-end)", () => {
|
|
156
|
+
it("should expand loops and then replace remaining variables", () => {
|
|
157
|
+
const storageMap = {
|
|
158
|
+
requestBody: {
|
|
159
|
+
receiver: "Fundsflow",
|
|
160
|
+
alerts: [
|
|
161
|
+
{
|
|
162
|
+
status: "firing",
|
|
163
|
+
labels: { label: "Coralpay", alertname: "File Drop" },
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
status: "firing",
|
|
167
|
+
labels: { label: "capitecpay", alertname: "File Drop" },
|
|
168
|
+
},
|
|
169
|
+
],
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
const template = "Receiver: {{requestBody.receiver}}\n{{#each requestBody.alerts}}- {{labels.label}}: {{status}}\n{{/each}}";
|
|
173
|
+
const result = VMUtil.replaceValueInPlace(storageMap, template, false);
|
|
174
|
+
expect(result).toBe("Receiver: Fundsflow\n- Coralpay: firing\n- capitecpay: firing\n");
|
|
175
|
+
});
|
|
176
|
+
it("should handle the Grafana alerts use case", () => {
|
|
177
|
+
const storageMap = {
|
|
178
|
+
requestBody: {
|
|
179
|
+
status: "firing",
|
|
180
|
+
alerts: [
|
|
181
|
+
{
|
|
182
|
+
status: "firing",
|
|
183
|
+
labels: {
|
|
184
|
+
alertname: "Fundsflow File Drop Update",
|
|
185
|
+
label: "Coralpay",
|
|
186
|
+
},
|
|
187
|
+
valueString: "A=0, C=1",
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
status: "firing",
|
|
191
|
+
labels: {
|
|
192
|
+
alertname: "Fundsflow File Drop Update",
|
|
193
|
+
label: "capitecpay",
|
|
194
|
+
},
|
|
195
|
+
valueString: "A=0, C=1",
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
status: "firing",
|
|
199
|
+
labels: {
|
|
200
|
+
alertname: "Fundsflow File Drop Update",
|
|
201
|
+
label: "capricorn",
|
|
202
|
+
},
|
|
203
|
+
valueString: "A=0, C=1",
|
|
204
|
+
},
|
|
205
|
+
],
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
const template = "Alert Labels:\n{{#each requestBody.alerts}}- {{labels.label}}\n{{/each}}";
|
|
209
|
+
const result = VMUtil.replaceValueInPlace(storageMap, template, false);
|
|
210
|
+
expect(result).toBe("Alert Labels:\n- Coralpay\n- capitecpay\n- capricorn\n");
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
//# sourceMappingURL=VMAPI.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VMAPI.test.js","sourceRoot":"","sources":["../../../../../../Tests/Server/Utils/VM/VMAPI.test.ts"],"names":[],"mappings":"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"}
|