@miragon/pulse-analytics-client 0.0.0-bootstrap.0 → 0.21.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/LICENSE +21 -0
- package/README.md +83 -3
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/metric-names.d.ts +43 -0
- package/dist/metric-names.d.ts.map +1 -0
- package/dist/metric-names.js +53 -0
- package/dist/metric-names.js.map +1 -0
- package/dist/metrics-contract-labels.test.d.ts +2 -0
- package/dist/metrics-contract-labels.test.d.ts.map +1 -0
- package/dist/metrics-contract-labels.test.js +169 -0
- package/dist/metrics-contract-labels.test.js.map +1 -0
- package/dist/metrics-contract.test.d.ts +2 -0
- package/dist/metrics-contract.test.d.ts.map +1 -0
- package/dist/metrics-contract.test.js +247 -0
- package/dist/metrics-contract.test.js.map +1 -0
- package/dist/prometheus-client.test.d.ts +2 -0
- package/dist/prometheus-client.test.d.ts.map +1 -0
- package/dist/prometheus-client.test.js +265 -0
- package/dist/prometheus-client.test.js.map +1 -0
- package/dist/prometheus.d.ts +100 -0
- package/dist/prometheus.d.ts.map +1 -0
- package/dist/prometheus.js +295 -0
- package/dist/prometheus.js.map +1 -0
- package/dist/prometheus.test.d.ts +2 -0
- package/dist/prometheus.test.d.ts.map +1 -0
- package/dist/prometheus.test.js +54 -0
- package/dist/prometheus.test.js.map +1 -0
- package/dist/promql-labels.test-support.d.ts +53 -0
- package/dist/promql-labels.test-support.d.ts.map +1 -0
- package/dist/promql-labels.test-support.js +237 -0
- package/dist/promql-labels.test-support.js.map +1 -0
- package/dist/promql-labels.test.d.ts +2 -0
- package/dist/promql-labels.test.d.ts.map +1 -0
- package/dist/promql-labels.test.js +190 -0
- package/dist/promql-labels.test.js.map +1 -0
- package/dist/promql-parse.test-support.d.ts +57 -0
- package/dist/promql-parse.test-support.d.ts.map +1 -0
- package/dist/promql-parse.test-support.js +284 -0
- package/dist/promql-parse.test-support.js.map +1 -0
- package/dist/promql-reading-rules.test-support.d.ts +29 -0
- package/dist/promql-reading-rules.test-support.d.ts.map +1 -0
- package/dist/promql-reading-rules.test-support.js +79 -0
- package/dist/promql-reading-rules.test-support.js.map +1 -0
- package/dist/promql-reading-rules.test.d.ts +2 -0
- package/dist/promql-reading-rules.test.d.ts.map +1 -0
- package/dist/promql-reading-rules.test.js +61 -0
- package/dist/promql-reading-rules.test.js.map +1 -0
- package/dist/promql-sources.test-support.d.ts +29 -0
- package/dist/promql-sources.test-support.d.ts.map +1 -0
- package/dist/promql-sources.test-support.js +112 -0
- package/dist/promql-sources.test-support.js.map +1 -0
- package/dist/promql-sources.test.d.ts +2 -0
- package/dist/promql-sources.test.d.ts.map +1 -0
- package/dist/promql-sources.test.js +93 -0
- package/dist/promql-sources.test.js.map +1 -0
- package/dist/queries/as-of.test.d.ts +2 -0
- package/dist/queries/as-of.test.d.ts.map +1 -0
- package/dist/queries/as-of.test.js +80 -0
- package/dist/queries/as-of.test.js.map +1 -0
- package/dist/queries/cluster-compare.d.ts +62 -0
- package/dist/queries/cluster-compare.d.ts.map +1 -0
- package/dist/queries/cluster-compare.js +70 -0
- package/dist/queries/cluster-compare.js.map +1 -0
- package/dist/queries/cluster-compare.test.d.ts +2 -0
- package/dist/queries/cluster-compare.test.d.ts.map +1 -0
- package/dist/queries/cluster-compare.test.js +81 -0
- package/dist/queries/cluster-compare.test.js.map +1 -0
- package/dist/queries/dashboard.d.ts +60 -0
- package/dist/queries/dashboard.d.ts.map +1 -0
- package/dist/queries/dashboard.js +292 -0
- package/dist/queries/dashboard.js.map +1 -0
- package/dist/queries/dashboard.test.d.ts +2 -0
- package/dist/queries/dashboard.test.d.ts.map +1 -0
- package/dist/queries/dashboard.test.js +423 -0
- package/dist/queries/dashboard.test.js.map +1 -0
- package/dist/queries/element.d.ts +68 -0
- package/dist/queries/element.d.ts.map +1 -0
- package/dist/queries/element.js +98 -0
- package/dist/queries/element.js.map +1 -0
- package/dist/queries/element.test.d.ts +2 -0
- package/dist/queries/element.test.d.ts.map +1 -0
- package/dist/queries/element.test.js +105 -0
- package/dist/queries/element.test.js.map +1 -0
- package/dist/queries/engine-compare.d.ts +52 -0
- package/dist/queries/engine-compare.d.ts.map +1 -0
- package/dist/queries/engine-compare.js +57 -0
- package/dist/queries/engine-compare.js.map +1 -0
- package/dist/queries/engine-compare.test.d.ts +2 -0
- package/dist/queries/engine-compare.test.d.ts.map +1 -0
- package/dist/queries/engine-compare.test.js +159 -0
- package/dist/queries/engine-compare.test.js.map +1 -0
- package/dist/queries/engine-landscape.d.ts +92 -0
- package/dist/queries/engine-landscape.d.ts.map +1 -0
- package/dist/queries/engine-landscape.js +183 -0
- package/dist/queries/engine-landscape.js.map +1 -0
- package/dist/queries/engine-landscape.test.d.ts +2 -0
- package/dist/queries/engine-landscape.test.d.ts.map +1 -0
- package/dist/queries/engine-landscape.test.js +171 -0
- package/dist/queries/engine-landscape.test.js.map +1 -0
- package/dist/queries/failures.d.ts +33 -0
- package/dist/queries/failures.d.ts.map +1 -0
- package/dist/queries/failures.js +31 -0
- package/dist/queries/failures.js.map +1 -0
- package/dist/queries/health.d.ts +77 -0
- package/dist/queries/health.d.ts.map +1 -0
- package/dist/queries/health.js +126 -0
- package/dist/queries/health.js.map +1 -0
- package/dist/queries/health.test.d.ts +2 -0
- package/dist/queries/health.test.d.ts.map +1 -0
- package/dist/queries/health.test.js +187 -0
- package/dist/queries/health.test.js.map +1 -0
- package/dist/queries/helpers.d.ts +184 -0
- package/dist/queries/helpers.d.ts.map +1 -0
- package/dist/queries/helpers.js +219 -0
- package/dist/queries/helpers.js.map +1 -0
- package/dist/queries/helpers.test.d.ts +2 -0
- package/dist/queries/helpers.test.d.ts.map +1 -0
- package/dist/queries/helpers.test.js +53 -0
- package/dist/queries/helpers.test.js.map +1 -0
- package/dist/queries/index.d.ts +19 -0
- package/dist/queries/index.d.ts.map +1 -0
- package/dist/queries/index.js +10 -0
- package/dist/queries/index.js.map +1 -0
- package/dist/queries/performance.d.ts +103 -0
- package/dist/queries/performance.d.ts.map +1 -0
- package/dist/queries/performance.js +173 -0
- package/dist/queries/performance.js.map +1 -0
- package/dist/queries/performance.test.d.ts +2 -0
- package/dist/queries/performance.test.d.ts.map +1 -0
- package/dist/queries/performance.test.js +265 -0
- package/dist/queries/performance.test.js.map +1 -0
- package/dist/queries/version-compare.d.ts +41 -0
- package/dist/queries/version-compare.d.ts.map +1 -0
- package/dist/queries/version-compare.js +44 -0
- package/dist/queries/version-compare.js.map +1 -0
- package/dist/queries/version-compare.test.d.ts +2 -0
- package/dist/queries/version-compare.test.d.ts.map +1 -0
- package/dist/queries/version-compare.test.js +162 -0
- package/dist/queries/version-compare.test.js.map +1 -0
- package/dist/queries/windows.d.ts +40 -0
- package/dist/queries/windows.d.ts.map +1 -0
- package/dist/queries/windows.js +56 -0
- package/dist/queries/windows.js.map +1 -0
- package/dist/query-honesty.test.d.ts +2 -0
- package/dist/query-honesty.test.d.ts.map +1 -0
- package/dist/query-honesty.test.js +294 -0
- package/dist/query-honesty.test.js.map +1 -0
- package/dist/query-scenarios.test-support.d.ts +49 -0
- package/dist/query-scenarios.test-support.d.ts.map +1 -0
- package/dist/query-scenarios.test-support.js +146 -0
- package/dist/query-scenarios.test-support.js.map +1 -0
- package/dist/schemas/cluster-compare.d.ts +11 -0
- package/dist/schemas/cluster-compare.d.ts.map +1 -0
- package/dist/schemas/cluster-compare.js +35 -0
- package/dist/schemas/cluster-compare.js.map +1 -0
- package/dist/schemas/engine-compare.d.ts +10 -0
- package/dist/schemas/engine-compare.d.ts.map +1 -0
- package/dist/schemas/engine-compare.js +27 -0
- package/dist/schemas/engine-compare.js.map +1 -0
- package/dist/schemas/engine-landscape.d.ts +5 -0
- package/dist/schemas/engine-landscape.d.ts.map +1 -0
- package/dist/schemas/engine-landscape.js +8 -0
- package/dist/schemas/engine-landscape.js.map +1 -0
- package/dist/schemas/failures.d.ts +8 -0
- package/dist/schemas/failures.d.ts.map +1 -0
- package/dist/schemas/failures.js +9 -0
- package/dist/schemas/failures.js.map +1 -0
- package/dist/schemas/health.d.ts +5 -0
- package/dist/schemas/health.d.ts.map +1 -0
- package/dist/schemas/health.js +6 -0
- package/dist/schemas/health.js.map +1 -0
- package/dist/schemas/index.d.ts +10 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +10 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/path.d.ts +15 -0
- package/dist/schemas/path.d.ts.map +1 -0
- package/dist/schemas/path.js +21 -0
- package/dist/schemas/path.js.map +1 -0
- package/dist/schemas/performance.d.ts +23 -0
- package/dist/schemas/performance.d.ts.map +1 -0
- package/dist/schemas/performance.js +21 -0
- package/dist/schemas/performance.js.map +1 -0
- package/dist/schemas/shared.d.ts +34 -0
- package/dist/schemas/shared.d.ts.map +1 -0
- package/dist/schemas/shared.js +34 -0
- package/dist/schemas/shared.js.map +1 -0
- package/dist/schemas/version-compare.d.ts +10 -0
- package/dist/schemas/version-compare.d.ts.map +1 -0
- package/dist/schemas/version-compare.js +25 -0
- package/dist/schemas/version-compare.js.map +1 -0
- package/dist/widgets.d.ts +138 -0
- package/dist/widgets.d.ts.map +1 -0
- package/dist/widgets.js +2 -0
- package/dist/widgets.js.map +1 -0
- package/metrics-contract.json +174 -0
- package/package.json +72 -5
|
@@ -0,0 +1,423 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { ACTIVITY_BREAKDOWN_LIMIT, dashboardData, failureDashboardData } from "./dashboard.js";
|
|
3
|
+
const v = (value) => ({ metric: {}, value });
|
|
4
|
+
const def = (key, value) => ({
|
|
5
|
+
metric: { process_definition_key: key },
|
|
6
|
+
value,
|
|
7
|
+
});
|
|
8
|
+
const act = (key, id, value, type) => ({
|
|
9
|
+
metric: {
|
|
10
|
+
process_definition_key: key,
|
|
11
|
+
activity_id: id,
|
|
12
|
+
...(type ? { activity_type: type } : {}),
|
|
13
|
+
},
|
|
14
|
+
value,
|
|
15
|
+
});
|
|
16
|
+
const BY_KEY = "by (process_definition_key)";
|
|
17
|
+
/**
|
|
18
|
+
* Ordered dispatch table for the mock client (durations in seconds; the mock
|
|
19
|
+
* answers them in ms, the histogram's unit): first predicate match wins, so
|
|
20
|
+
* the specific rules (activity-level, then definition-level breakdowns, then
|
|
21
|
+
* the live gauges) sit before the global-KPI fallbacks.
|
|
22
|
+
*/
|
|
23
|
+
const CANNED_SAMPLES = [
|
|
24
|
+
// Activity-level breakdowns — `StartEvent_1` exists in two processes.
|
|
25
|
+
[
|
|
26
|
+
(q) => q.includes("camunda_activity_ended_total"),
|
|
27
|
+
[
|
|
28
|
+
act("order", "Task_A", 10, "serviceTask"),
|
|
29
|
+
act("order", "Task_B", 5, "userTask"),
|
|
30
|
+
act("order", "StartEvent_1", 60, "startEvent"),
|
|
31
|
+
act("invoice", "StartEvent_1", 40, "startEvent"),
|
|
32
|
+
],
|
|
33
|
+
],
|
|
34
|
+
[
|
|
35
|
+
(q) => q.includes("camunda_activity_duration_milliseconds_sum"),
|
|
36
|
+
[act("order", "Task_A", 100), act("order", "Task_B", 20), act("invoice", "StartEvent_1", 4)],
|
|
37
|
+
],
|
|
38
|
+
[(q) => q.includes("activity_id, le"), [act("order", "Task_A", 15), act("order", "Task_B", 6)]],
|
|
39
|
+
// Definition-level breakdowns
|
|
40
|
+
[(q) => q.includes(BY_KEY) && q.includes("incident_created"), [def("order", 6)]],
|
|
41
|
+
[
|
|
42
|
+
(q) => q.includes(BY_KEY) && q.includes('state="COMPLETED"'),
|
|
43
|
+
[def("order", 50), def("invoice", 20)],
|
|
44
|
+
],
|
|
45
|
+
[
|
|
46
|
+
(q) => q.includes(BY_KEY) && q.includes("started_total"),
|
|
47
|
+
[def("order", 60), def("invoice", 40)],
|
|
48
|
+
],
|
|
49
|
+
[
|
|
50
|
+
(q) => q.includes(BY_KEY) && q.includes("duration_milliseconds_sum"),
|
|
51
|
+
[def("order", 600), def("invoice", 80)],
|
|
52
|
+
],
|
|
53
|
+
[
|
|
54
|
+
(q) => q.includes(BY_KEY) && q.includes("duration_milliseconds_count"),
|
|
55
|
+
[def("order", 50), def("invoice", 20)],
|
|
56
|
+
],
|
|
57
|
+
// A long-running process with no start in the window still runs NOW.
|
|
58
|
+
[
|
|
59
|
+
(q) => q.includes(BY_KEY) && q.includes("process_instances_running"),
|
|
60
|
+
[def("order", 120), def("invoice", 30), def("longRunning", 6)],
|
|
61
|
+
],
|
|
62
|
+
// Live gauges, independent of the window
|
|
63
|
+
[(q) => q.includes("process_instances_running"), [v(156)]],
|
|
64
|
+
[(q) => q.includes("incidents_open"), [v(12)]],
|
|
65
|
+
// The engine-state presence probe: the engine in scope reports.
|
|
66
|
+
[(q) => q.includes("camunda_jobs_executable"), [{ metric: { engine_id: "prod-a" }, value: 3 }]],
|
|
67
|
+
// Global KPIs
|
|
68
|
+
[(q) => q.includes("histogram_quantile(0.5"), [v(8)]],
|
|
69
|
+
[(q) => q.includes("histogram_quantile(0.95"), [v(30)]],
|
|
70
|
+
[(q) => q.includes("incident_resolved"), [v(4)]],
|
|
71
|
+
[(q) => q.includes("incident_created"), [v(10)]],
|
|
72
|
+
[(q) => q.includes('state="COMPLETED"'), [v(70)]],
|
|
73
|
+
[(q) => q.includes("started_total"), [v(100)]],
|
|
74
|
+
[(q) => q.includes("duration_milliseconds_sum"), [v(12)]], // avg = sum/count expression
|
|
75
|
+
];
|
|
76
|
+
/** Mock Prometheus client that dispatches canned samples by the PromQL it sees. */
|
|
77
|
+
function mockClient() {
|
|
78
|
+
const instant = vi.fn(async (q) => {
|
|
79
|
+
const hit = CANNED_SAMPLES.find(([matches]) => matches(q));
|
|
80
|
+
const ms = /duration_milliseconds_sum|histogram_quantile/.test(q) ? 1000 : 1;
|
|
81
|
+
return hit ? hit[1].map((s) => ({ ...s, value: s.value * ms })) : [];
|
|
82
|
+
});
|
|
83
|
+
const ch = { instant };
|
|
84
|
+
return { ch, instant };
|
|
85
|
+
}
|
|
86
|
+
describe("dashboardData", () => {
|
|
87
|
+
it("separates window flows from the live state and echoes its scope", async () => {
|
|
88
|
+
const { ch } = mockClient();
|
|
89
|
+
const res = await dashboardData(ch, { period: "7d", engine: ["prod-a", "prod-b"] });
|
|
90
|
+
expect(res).toMatchObject({
|
|
91
|
+
processDefinitionKey: null,
|
|
92
|
+
period: "7d",
|
|
93
|
+
engines: ["prod-a", "prod-b"],
|
|
94
|
+
// Flows within the window
|
|
95
|
+
totalCount: 100,
|
|
96
|
+
completedCount: 70,
|
|
97
|
+
incidentsCreated: 10,
|
|
98
|
+
incidentsResolved: 4,
|
|
99
|
+
incidentRatePct: 10,
|
|
100
|
+
avgDurationMs: 12000,
|
|
101
|
+
medianDurationMs: 8000,
|
|
102
|
+
p95DurationMs: 30000,
|
|
103
|
+
// Live gauges — NOT started − ended (would be 30) nor created − resolved (6)
|
|
104
|
+
runningNow: 156,
|
|
105
|
+
openIncidentsNow: 12,
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
it("groups the activity breakdown by (process, activity) — ids repeat across models (N84)", async () => {
|
|
109
|
+
const { ch } = mockClient();
|
|
110
|
+
const res = await dashboardData(ch, { period: "7d" });
|
|
111
|
+
expect(res.activityBreakdown).toEqual([
|
|
112
|
+
{
|
|
113
|
+
processDefinitionKey: "order",
|
|
114
|
+
activityId: "Task_A",
|
|
115
|
+
activityType: "serviceTask",
|
|
116
|
+
executionCount: 10,
|
|
117
|
+
avgDurationMs: 10000,
|
|
118
|
+
p95DurationMs: 15000,
|
|
119
|
+
totalTimeMs: 100000,
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
processDefinitionKey: "order",
|
|
123
|
+
activityId: "Task_B",
|
|
124
|
+
activityType: "userTask",
|
|
125
|
+
executionCount: 5,
|
|
126
|
+
avgDurationMs: 4000,
|
|
127
|
+
p95DurationMs: 6000,
|
|
128
|
+
totalTimeMs: 20000,
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
processDefinitionKey: "invoice",
|
|
132
|
+
activityId: "StartEvent_1",
|
|
133
|
+
activityType: "startEvent",
|
|
134
|
+
executionCount: 40,
|
|
135
|
+
avgDurationMs: 100,
|
|
136
|
+
p95DurationMs: null,
|
|
137
|
+
totalTimeMs: 4000,
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
// Executions but no duration series: unmeasured, not 0 ms.
|
|
141
|
+
processDefinitionKey: "order",
|
|
142
|
+
activityId: "StartEvent_1",
|
|
143
|
+
activityType: "startEvent",
|
|
144
|
+
executionCount: 60,
|
|
145
|
+
avgDurationMs: null,
|
|
146
|
+
p95DurationMs: null,
|
|
147
|
+
totalTimeMs: 0,
|
|
148
|
+
},
|
|
149
|
+
]);
|
|
150
|
+
});
|
|
151
|
+
it("reads the per-definition running count from the live gauge, keeping long-running keys", async () => {
|
|
152
|
+
const { ch } = mockClient();
|
|
153
|
+
const res = await dashboardData(ch, { period: "7d" });
|
|
154
|
+
expect(res.definitionBreakdown).toEqual([
|
|
155
|
+
{
|
|
156
|
+
processDefinitionKey: "order",
|
|
157
|
+
totalInstances: 60,
|
|
158
|
+
completed: 50,
|
|
159
|
+
runningNow: 120,
|
|
160
|
+
incidentsCreated: 6,
|
|
161
|
+
avgDurationMs: 12000,
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
processDefinitionKey: "invoice",
|
|
165
|
+
totalInstances: 40,
|
|
166
|
+
completed: 20,
|
|
167
|
+
runningNow: 30,
|
|
168
|
+
incidentsCreated: 0,
|
|
169
|
+
avgDurationMs: 4000,
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
processDefinitionKey: "longRunning",
|
|
173
|
+
totalInstances: 0,
|
|
174
|
+
completed: 0,
|
|
175
|
+
runningNow: 6,
|
|
176
|
+
incidentsCreated: 0,
|
|
177
|
+
avgDurationMs: null,
|
|
178
|
+
},
|
|
179
|
+
]);
|
|
180
|
+
});
|
|
181
|
+
it("reports durations, rates and the live state as unmeasured when no samples exist", async () => {
|
|
182
|
+
const instant = vi.fn(async () => []);
|
|
183
|
+
const res = await dashboardData({ instant }, { period: "1d" });
|
|
184
|
+
expect(res).toMatchObject({
|
|
185
|
+
totalCount: 0,
|
|
186
|
+
incidentRatePct: null,
|
|
187
|
+
avgDurationMs: null,
|
|
188
|
+
medianDurationMs: null,
|
|
189
|
+
p95DurationMs: null,
|
|
190
|
+
runningNow: null,
|
|
191
|
+
openIncidentsNow: null,
|
|
192
|
+
engines: null,
|
|
193
|
+
activityBreakdown: [],
|
|
194
|
+
definitionBreakdown: [],
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
it("reads a reporting engine's missing gauge series as a measured 0, not as unreported", async () => {
|
|
198
|
+
// The metrics plugin registers an open-incident row only per (key, type)
|
|
199
|
+
// that HAS incidents, and a running row only per deployed key — so a
|
|
200
|
+
// healthy engine with nothing open sends no camunda_incidents_open series
|
|
201
|
+
// at all. Its presence probe still answers: that is a 0, the same 0 the
|
|
202
|
+
// failure dashboard and engine health report.
|
|
203
|
+
const instant = vi.fn(async (q) => q.includes("camunda_jobs_executable")
|
|
204
|
+
? [{ metric: { engine_id: "prod-a" }, value: 0 }]
|
|
205
|
+
: q ===
|
|
206
|
+
'sum(max by (process_definition_key, engine_id)(camunda_process_instances_running{engine_id="prod-a"}))'
|
|
207
|
+
? [v(156)]
|
|
208
|
+
: []);
|
|
209
|
+
const res = await dashboardData({ instant }, { period: "1d", engine: "prod-a" });
|
|
210
|
+
expect(res).toMatchObject({ runningNow: 156, openIncidentsNow: 0 });
|
|
211
|
+
// A process the engine does not run: nothing running, nothing open — both 0.
|
|
212
|
+
const scoped = await dashboardData({ instant }, { processDefinitionKey: "gone", period: "1d", engine: "prod-a" });
|
|
213
|
+
expect(scoped).toMatchObject({ runningNow: 0, openIncidentsNow: 0 });
|
|
214
|
+
});
|
|
215
|
+
it("keeps a definition's running count measured when only its gauge row is missing", async () => {
|
|
216
|
+
// A key that started work in the window but has no running row: 0
|
|
217
|
+
// running while the engine reports, never "not reported".
|
|
218
|
+
const instant = vi.fn(async (q) => q.includes("camunda_jobs_executable")
|
|
219
|
+
? [{ metric: { engine_id: "prod-a" }, value: 0 }]
|
|
220
|
+
: q.includes(BY_KEY) && q.includes("started_total")
|
|
221
|
+
? [def("order", 5)]
|
|
222
|
+
: []);
|
|
223
|
+
const res = await dashboardData({ instant }, { period: "1d", engine: "prod-a" });
|
|
224
|
+
expect(res.definitionBreakdown).toMatchObject([
|
|
225
|
+
{ processDefinitionKey: "order", runningNow: 0 },
|
|
226
|
+
]);
|
|
227
|
+
});
|
|
228
|
+
it("lets an incident rate exceed 100 % rather than capping it — incidents are not instances", async () => {
|
|
229
|
+
const instant = vi.fn(async (q) => q.includes("incident_created") ? [v(30)] : q.includes("started_total") ? [v(10)] : []);
|
|
230
|
+
const res = await dashboardData({ instant }, { period: "1d" });
|
|
231
|
+
expect(res.incidentRatePct).toBe(300);
|
|
232
|
+
});
|
|
233
|
+
it("scopes every query to the definition key and engine filter, every flow to the period", async () => {
|
|
234
|
+
const { ch, instant } = mockClient();
|
|
235
|
+
await dashboardData(ch, {
|
|
236
|
+
processDefinitionKey: "myKey",
|
|
237
|
+
period: "30d",
|
|
238
|
+
engine: "prod-a",
|
|
239
|
+
});
|
|
240
|
+
const queries = instant.mock.calls.map((c) => c[0]);
|
|
241
|
+
expect(queries.length).toBeGreaterThan(0);
|
|
242
|
+
expect(queries.every((q) => q.includes('engine_id="prod-a"'))).toBe(true);
|
|
243
|
+
// The presence probe asks whether the ENGINE reports — its gauge carries
|
|
244
|
+
// engine_id only; every other query is scoped to the process.
|
|
245
|
+
const probe = 'max by (engine_id)(camunda_jobs_executable{engine_id="prod-a"})';
|
|
246
|
+
expect(queries.filter((q) => q === probe)).toHaveLength(1);
|
|
247
|
+
expect(queries.filter((q) => q !== probe).every((q) => q.includes('process_definition_key="myKey"'))).toBe(true);
|
|
248
|
+
// The live gauges are point-in-time (no range at all), each node-folded.
|
|
249
|
+
const gauges = queries.filter((q) => !q.includes("increase("));
|
|
250
|
+
expect(gauges).toEqual([
|
|
251
|
+
'sum(max by (process_definition_key, engine_id)(camunda_process_instances_running{process_definition_key="myKey",engine_id="prod-a"}))',
|
|
252
|
+
'sum(max by (process_definition_key, incident_type, engine_id)(camunda_incidents_open{process_definition_key="myKey",engine_id="prod-a"}))',
|
|
253
|
+
'sum by (process_definition_key)(max by (process_definition_key, engine_id)(camunda_process_instances_running{process_definition_key="myKey",engine_id="prod-a"}))',
|
|
254
|
+
probe,
|
|
255
|
+
]);
|
|
256
|
+
const flows = queries.filter((q) => q.includes("increase("));
|
|
257
|
+
expect(flows.every((q) => q.includes("[30d]"))).toBe(true);
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
describe("dashboardData — the top list and the previous period", () => {
|
|
261
|
+
const NOW = Date.parse("2026-10-09T12:00:00Z");
|
|
262
|
+
const NOW_SECONDS = NOW / 1000;
|
|
263
|
+
const WEEK = 7 * 86_400;
|
|
264
|
+
beforeEach(() => {
|
|
265
|
+
vi.useFakeTimers({ toFake: ["Date"], now: NOW });
|
|
266
|
+
});
|
|
267
|
+
afterEach(() => {
|
|
268
|
+
vi.useRealTimers();
|
|
269
|
+
});
|
|
270
|
+
/** Starts and incidents per window: the period (`[7d]`) and the one before it (`@`). */
|
|
271
|
+
function windowClient(current, previous) {
|
|
272
|
+
return vi.fn((q) => {
|
|
273
|
+
const [started, incidents] = q.includes(" @ ") ? previous : current;
|
|
274
|
+
if (q.includes("by ("))
|
|
275
|
+
return Promise.resolve([]);
|
|
276
|
+
if (q.includes("incident_created"))
|
|
277
|
+
return Promise.resolve([v(incidents)]);
|
|
278
|
+
if (q.includes("started_total"))
|
|
279
|
+
return Promise.resolve([v(started)]);
|
|
280
|
+
return Promise.resolve([]);
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
it("reads the same flows over the window right before the period", async () => {
|
|
284
|
+
const instant = windowClient([200, 8], [180, 3]);
|
|
285
|
+
const res = await dashboardData({ instant }, { period: "7d" });
|
|
286
|
+
expect(res.incidentRatePct).toBe(4);
|
|
287
|
+
expect(res.previous).toEqual({
|
|
288
|
+
totalCount: 180,
|
|
289
|
+
incidentsCreated: 3,
|
|
290
|
+
incidentRatePct: 1.7,
|
|
291
|
+
partial: false,
|
|
292
|
+
suppressed: false,
|
|
293
|
+
});
|
|
294
|
+
// The previous window ends where the period starts and is just as long.
|
|
295
|
+
const previous = instant.mock.calls.map((c) => c[0]).filter((q) => q.includes(" @ "));
|
|
296
|
+
expect(previous).toHaveLength(2);
|
|
297
|
+
for (const q of previous) {
|
|
298
|
+
expect(q).toContain(`[${WEEK}s] @ ${NOW_SECONDS - WEEK}`);
|
|
299
|
+
}
|
|
300
|
+
});
|
|
301
|
+
it("does not judge a rate over fewer starts than the comparison floor", async () => {
|
|
302
|
+
const res = await dashboardData({ instant: windowClient([200, 8], [9, 3]) }, { period: "7d", minBucketSize: 10 });
|
|
303
|
+
expect(res.previous).toMatchObject({ totalCount: 9, suppressed: true });
|
|
304
|
+
const floor = await dashboardData({ instant: windowClient([200, 8], [9, 3]) }, { period: "7d", minBucketSize: 5 });
|
|
305
|
+
expect(floor.previous?.suppressed).toBe(false);
|
|
306
|
+
});
|
|
307
|
+
it("reads no previous window that lies wholly before the retention", async () => {
|
|
308
|
+
// 14 days back from 14 days ago: still inside the 30-day retention.
|
|
309
|
+
const inside = await dashboardData({ instant: windowClient([1, 0], [1, 0]) }, { period: "14d" });
|
|
310
|
+
expect(inside.previous?.partial).toBe(false);
|
|
311
|
+
// 30 days back from 30 days ago: wholly before the retention, no figures exist.
|
|
312
|
+
const instant = windowClient([1, 0], [1, 0]);
|
|
313
|
+
const outside = await dashboardData({ instant }, { period: "30d" });
|
|
314
|
+
expect(outside.previous).toBeNull();
|
|
315
|
+
expect(instant.mock.calls.some((c) => c[0].includes(" @ "))).toBe(false);
|
|
316
|
+
});
|
|
317
|
+
it("keeps the top 20 activities by total time and says how many there were", async () => {
|
|
318
|
+
const rows = Array.from({ length: 23 }, (_, i) => act("order", `Task_${i}`, 1, "serviceTask"));
|
|
319
|
+
const sums = rows.map((r, i) => ({ ...r, value: (i + 1) * 1000 }));
|
|
320
|
+
const instant = vi.fn((q) => {
|
|
321
|
+
if (q.includes("camunda_activity_ended_total"))
|
|
322
|
+
return Promise.resolve(rows);
|
|
323
|
+
if (q.includes("camunda_activity_duration_milliseconds_sum"))
|
|
324
|
+
return Promise.resolve(sums);
|
|
325
|
+
return Promise.resolve([]);
|
|
326
|
+
});
|
|
327
|
+
const res = await dashboardData({ instant }, { period: "7d" });
|
|
328
|
+
expect(ACTIVITY_BREAKDOWN_LIMIT).toBe(20);
|
|
329
|
+
expect(res.activityCount).toBe(23);
|
|
330
|
+
expect(res.activityBreakdown).toHaveLength(20);
|
|
331
|
+
expect(res.activityBreakdown[0]).toMatchObject({ activityId: "Task_22", totalTimeMs: 23_000 });
|
|
332
|
+
expect(res.activityBreakdown[19]).toMatchObject({ activityId: "Task_3" });
|
|
333
|
+
});
|
|
334
|
+
});
|
|
335
|
+
describe("failureDashboardData", () => {
|
|
336
|
+
it("builds incident groups and the per-process breakdown from the live gauges", async () => {
|
|
337
|
+
const instant = vi.fn(async (q) => {
|
|
338
|
+
if (q.includes("sum by (process_definition_key, incident_type)")) {
|
|
339
|
+
return [
|
|
340
|
+
{
|
|
341
|
+
metric: { process_definition_key: "order", incident_type: "failedJob" },
|
|
342
|
+
value: 7,
|
|
343
|
+
},
|
|
344
|
+
{
|
|
345
|
+
metric: { process_definition_key: "invoice", incident_type: "failedExternalTask" },
|
|
346
|
+
value: 2,
|
|
347
|
+
},
|
|
348
|
+
// Zero-count patterns are dropped.
|
|
349
|
+
{ metric: { process_definition_key: "order", incident_type: "noise" }, value: 0 },
|
|
350
|
+
];
|
|
351
|
+
}
|
|
352
|
+
if (q.includes("camunda_incidents_open")) {
|
|
353
|
+
return [
|
|
354
|
+
{ metric: { process_definition_key: "order" }, value: 7 },
|
|
355
|
+
{ metric: { process_definition_key: "invoice" }, value: 2 },
|
|
356
|
+
{ metric: { process_definition_key: "stuck" }, value: 1 },
|
|
357
|
+
];
|
|
358
|
+
}
|
|
359
|
+
if (q.includes("camunda_jobs_failed")) {
|
|
360
|
+
return [{ metric: { process_definition_key: "order" }, value: 3 }];
|
|
361
|
+
}
|
|
362
|
+
// camunda_process_instances_running
|
|
363
|
+
return [
|
|
364
|
+
{ metric: { process_definition_key: "order" }, value: 70 },
|
|
365
|
+
{ metric: { process_definition_key: "invoice" }, value: 10 },
|
|
366
|
+
];
|
|
367
|
+
});
|
|
368
|
+
const res = await failureDashboardData({ instant }, { engine: "prod-a" });
|
|
369
|
+
expect(res.engines).toEqual(["prod-a"]);
|
|
370
|
+
expect(res.totalIncidents).toBe(9);
|
|
371
|
+
expect(res.uniqueErrorPatterns).toBe(2);
|
|
372
|
+
expect(res.mostAffectedProcess).toBe("order");
|
|
373
|
+
// Only what the gauge carries — no activity, timestamps or sample ids.
|
|
374
|
+
expect(res.errorPatterns).toEqual([
|
|
375
|
+
{ incidentType: "failedJob", processDefinitionKey: "order", incidentCount: 7 },
|
|
376
|
+
{ incidentType: "failedExternalTask", processDefinitionKey: "invoice", incidentCount: 2 },
|
|
377
|
+
]);
|
|
378
|
+
expect(res.processBreakdown).toEqual([
|
|
379
|
+
{
|
|
380
|
+
processDefinitionKey: "order",
|
|
381
|
+
runningNow: 70,
|
|
382
|
+
deadJobs: 3,
|
|
383
|
+
openIncidents: 7,
|
|
384
|
+
incidentRatePct: 10,
|
|
385
|
+
},
|
|
386
|
+
{
|
|
387
|
+
processDefinitionKey: "invoice",
|
|
388
|
+
runningNow: 10,
|
|
389
|
+
deadJobs: 0,
|
|
390
|
+
openIncidents: 2,
|
|
391
|
+
incidentRatePct: 20,
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
// Open incidents but nothing running reported: a rate of nothing is unmeasured.
|
|
395
|
+
processDefinitionKey: "stuck",
|
|
396
|
+
runningNow: 0,
|
|
397
|
+
deadJobs: 0,
|
|
398
|
+
openIncidents: 1,
|
|
399
|
+
incidentRatePct: null,
|
|
400
|
+
},
|
|
401
|
+
]);
|
|
402
|
+
});
|
|
403
|
+
it("computes totals over ALL patterns while capping the list at the top 50", async () => {
|
|
404
|
+
// 60 distinct patterns, counts 60..1 — the KPI must not stop at the cap.
|
|
405
|
+
const instant = vi.fn(async (q) => {
|
|
406
|
+
if (q.includes("sum by (process_definition_key, incident_type)")) {
|
|
407
|
+
return Array.from({ length: 60 }, (_, i) => ({
|
|
408
|
+
metric: { process_definition_key: `proc-${i}`, incident_type: `type-${i}` },
|
|
409
|
+
value: 60 - i,
|
|
410
|
+
}));
|
|
411
|
+
}
|
|
412
|
+
return [];
|
|
413
|
+
});
|
|
414
|
+
const res = await failureDashboardData({ instant }, {});
|
|
415
|
+
expect(res.engines).toBeNull();
|
|
416
|
+
expect(res.errorPatterns).toHaveLength(50);
|
|
417
|
+
expect(res.uniqueErrorPatterns).toBe(60);
|
|
418
|
+
// 60+59+…+1 = 1830, including the 10 sliced-off tail patterns.
|
|
419
|
+
expect(res.totalIncidents).toBe(1830);
|
|
420
|
+
expect(res.errorPatterns[0].incidentCount).toBe(60);
|
|
421
|
+
});
|
|
422
|
+
});
|
|
423
|
+
//# sourceMappingURL=dashboard.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.test.js","sourceRoot":"","sources":["../../src/queries/dashboard.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { type EngineFilterInput, type Period, type PrometheusClient } from "../prometheus.js";
|
|
2
|
+
export interface ElementBottleneckRow {
|
|
3
|
+
activity_id: string;
|
|
4
|
+
activity_name: string | null;
|
|
5
|
+
activity_type: string;
|
|
6
|
+
execution_count: number;
|
|
7
|
+
/** Mean duration of the executions that ended in the window; null when none did. */
|
|
8
|
+
avg_duration_sec: number | null;
|
|
9
|
+
/** p95 from the duration histogram; null when it holds no sample. */
|
|
10
|
+
p95_duration_sec: number | null;
|
|
11
|
+
total_time_sec: number;
|
|
12
|
+
avg_wait_sec: number | null;
|
|
13
|
+
total_wait_sec: number | null;
|
|
14
|
+
/** Incidents created at this activity in the window. */
|
|
15
|
+
incident_count: number;
|
|
16
|
+
/** `incident_count` per 100 executions (may exceed 100); null without executions. */
|
|
17
|
+
incident_rate_pct: number | null;
|
|
18
|
+
bottleneck_score_sec: number;
|
|
19
|
+
}
|
|
20
|
+
export interface ElementBottleneckResult {
|
|
21
|
+
/** The engine ids covered; `null` = every engine Prometheus holds (unscoped library call). */
|
|
22
|
+
engines: string[] | null;
|
|
23
|
+
activities: ElementBottleneckRow[];
|
|
24
|
+
minBucketSize: number;
|
|
25
|
+
suppressedActivities: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Rank activities by time contribution + incident rate over a rolling window,
|
|
29
|
+
* from OTEL metrics.
|
|
30
|
+
*
|
|
31
|
+
* Reduced fidelity vs the event store: queue/wait time between activities needs
|
|
32
|
+
* per-instance event ordering, which metrics cannot reconstruct — so
|
|
33
|
+
* `avg_wait_sec`/`total_wait_sec` are null and `bottleneck_score_sec` is the
|
|
34
|
+
* execution-time contribution only. `activity_name` is not a metric label.
|
|
35
|
+
*/
|
|
36
|
+
export declare function elementBottleneck(ch: PrometheusClient, params: {
|
|
37
|
+
processDefinitionKey: string;
|
|
38
|
+
period: Period;
|
|
39
|
+
minBucketSize: number;
|
|
40
|
+
maxResults: number;
|
|
41
|
+
engine?: EngineFilterInput;
|
|
42
|
+
}): Promise<ElementBottleneckResult>;
|
|
43
|
+
export interface ElementHeatResult {
|
|
44
|
+
/** Per-element execution count over the window, keyed by activity id. */
|
|
45
|
+
frequency: Record<string, number>;
|
|
46
|
+
/** Per-element average duration in seconds over the window, keyed by activity id. */
|
|
47
|
+
durationSec: Record<string, number>;
|
|
48
|
+
/**
|
|
49
|
+
* When the figures were read from Prometheus (ISO timestamp): the "Stand"
|
|
50
|
+
* a view shows. Optional only for payloads recorded before it existed.
|
|
51
|
+
*/
|
|
52
|
+
asOf?: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Per-element heat values for the BPMN heatmap, from OTEL metrics: traversal
|
|
56
|
+
* frequency (`camunda_activity_ended_total`) and average duration
|
|
57
|
+
* (`camunda_activity_duration_milliseconds_sum` / count) per `activity_id`, for one
|
|
58
|
+
* process definition. Returns full maps (no top-N / min-bucket filtering — every
|
|
59
|
+
* element gets a value). Node-level only; metrics carry no per-instance path, so
|
|
60
|
+
* sequence-flow/edge heat is not available. Activity metrics have no version
|
|
61
|
+
* label, so this is per `processDefinitionKey`.
|
|
62
|
+
*/
|
|
63
|
+
export declare function elementHeat(ch: PrometheusClient, params: {
|
|
64
|
+
processDefinitionKey: string;
|
|
65
|
+
period: Period;
|
|
66
|
+
engine?: EngineFilterInput;
|
|
67
|
+
}): Promise<ElementHeatResult>;
|
|
68
|
+
//# sourceMappingURL=element.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../../src/queries/element.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,iBAAiB,EACtB,KAAK,MAAM,EACX,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAA;AAIzB,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;IACvB,oFAAoF;IACpF,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,qEAAqE;IACrE,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,wDAAwD;IACxD,cAAc,EAAE,MAAM,CAAA;IACtB,qFAAqF;IACrF,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,oBAAoB,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACtC,8FAA8F;IAC9F,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IACxB,UAAU,EAAE,oBAAoB,EAAE,CAAA;IAClC,aAAa,EAAE,MAAM,CAAA;IACrB,oBAAoB,EAAE,MAAM,CAAA;CAC7B;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,gBAAgB,EACpB,MAAM,EAAE;IACN,oBAAoB,EAAE,MAAM,CAAA;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAC3B,GACA,OAAO,CAAC,uBAAuB,CAAC,CA+DlC;AAED,MAAM,WAAW,iBAAiB;IAChC,yEAAyE;IACzE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,qFAAqF;IACrF,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,EAAE,EAAE,gBAAgB,EACpB,MAAM,EAAE;IAAE,oBAAoB,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAAE,GACnF,OAAO,CAAC,iBAAiB,CAAC,CA2B5B"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { engineIdsOf, engineMatcher, escapeLabelValue, selector, } from "../prometheus.js";
|
|
2
|
+
import { METRIC_NAMES as M } from "../metric-names.js";
|
|
3
|
+
import { asOfNow, byLabel, increaseIn, ratePct, secondsOf, secondsOrNull } from "./helpers.js";
|
|
4
|
+
/**
|
|
5
|
+
* Rank activities by time contribution + incident rate over a rolling window,
|
|
6
|
+
* from OTEL metrics.
|
|
7
|
+
*
|
|
8
|
+
* Reduced fidelity vs the event store: queue/wait time between activities needs
|
|
9
|
+
* per-instance event ordering, which metrics cannot reconstruct — so
|
|
10
|
+
* `avg_wait_sec`/`total_wait_sec` are null and `bottleneck_score_sec` is the
|
|
11
|
+
* execution-time contribution only. `activity_name` is not a metric label.
|
|
12
|
+
*/
|
|
13
|
+
export async function elementBottleneck(ch, params) {
|
|
14
|
+
const range = params.period;
|
|
15
|
+
const minBucket = Math.max(1, Math.floor(params.minBucketSize));
|
|
16
|
+
const limit = Math.max(1, Math.floor(params.maxResults));
|
|
17
|
+
const sel = selector(`process_definition_key="${escapeLabelValue(params.processDefinitionKey)}"`, engineMatcher(params.engine));
|
|
18
|
+
const inWindow = (series) => increaseIn(series, { range });
|
|
19
|
+
const [counts, sums, p95, incidents, types] = await Promise.all([
|
|
20
|
+
ch.instant(`sum by (activity_id)(${inWindow(`${M.activityEnded}${sel}`)})`),
|
|
21
|
+
ch.instant(`sum by (activity_id)(${inWindow(`${M.activityDuration}_sum${sel}`)})`),
|
|
22
|
+
ch.instant(`histogram_quantile(0.95, sum by (activity_id, le)(${inWindow(`${M.activityDuration}_bucket${sel}`)}))`),
|
|
23
|
+
ch.instant(`sum by (activity_id)(${inWindow(`${M.incidentCreated}${sel}`)})`),
|
|
24
|
+
ch.instant(`sum by (activity_id, activity_type)(${inWindow(`${M.activityEnded}${sel}`)})`),
|
|
25
|
+
]);
|
|
26
|
+
const sumBy = byLabel(sums, "activity_id");
|
|
27
|
+
const p95By = byLabel(p95, "activity_id");
|
|
28
|
+
const incidentBy = byLabel(incidents, "activity_id");
|
|
29
|
+
const typeBy = {};
|
|
30
|
+
for (const t of types) {
|
|
31
|
+
const id = t.metric.activity_id;
|
|
32
|
+
if (id !== undefined && typeBy[id] === undefined)
|
|
33
|
+
typeBy[id] = t.metric.activity_type ?? "";
|
|
34
|
+
}
|
|
35
|
+
const all = counts.map((c) => {
|
|
36
|
+
const id = c.metric.activity_id ?? "";
|
|
37
|
+
const count = Math.round(c.value);
|
|
38
|
+
const totalMs = sumBy[id] ?? 0;
|
|
39
|
+
const incidentCount = Math.round(incidentBy[id] ?? 0);
|
|
40
|
+
return {
|
|
41
|
+
activity_id: id,
|
|
42
|
+
activity_name: null,
|
|
43
|
+
activity_type: typeBy[id] ?? "",
|
|
44
|
+
execution_count: count,
|
|
45
|
+
avg_duration_sec: count > 0 && sumBy[id] !== undefined ? secondsOf(totalMs / count) : null,
|
|
46
|
+
p95_duration_sec: secondsOrNull(p95By[id] ?? null),
|
|
47
|
+
total_time_sec: secondsOf(totalMs),
|
|
48
|
+
avg_wait_sec: null,
|
|
49
|
+
total_wait_sec: null,
|
|
50
|
+
incident_count: incidentCount,
|
|
51
|
+
incident_rate_pct: ratePct(incidentCount, count),
|
|
52
|
+
bottleneck_score_sec: secondsOf(totalMs),
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
const kept = all
|
|
56
|
+
.filter((r) => r.execution_count >= minBucket)
|
|
57
|
+
.sort((a, b) => b.bottleneck_score_sec - a.bottleneck_score_sec)
|
|
58
|
+
.slice(0, limit);
|
|
59
|
+
const aboveThreshold = all.filter((r) => r.execution_count >= minBucket).length;
|
|
60
|
+
return {
|
|
61
|
+
engines: engineIdsOf(params.engine),
|
|
62
|
+
activities: kept,
|
|
63
|
+
minBucketSize: minBucket,
|
|
64
|
+
suppressedActivities: Math.max(0, all.length - aboveThreshold),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Per-element heat values for the BPMN heatmap, from OTEL metrics: traversal
|
|
69
|
+
* frequency (`camunda_activity_ended_total`) and average duration
|
|
70
|
+
* (`camunda_activity_duration_milliseconds_sum` / count) per `activity_id`, for one
|
|
71
|
+
* process definition. Returns full maps (no top-N / min-bucket filtering — every
|
|
72
|
+
* element gets a value). Node-level only; metrics carry no per-instance path, so
|
|
73
|
+
* sequence-flow/edge heat is not available. Activity metrics have no version
|
|
74
|
+
* label, so this is per `processDefinitionKey`.
|
|
75
|
+
*/
|
|
76
|
+
export async function elementHeat(ch, params) {
|
|
77
|
+
const asOf = asOfNow();
|
|
78
|
+
const range = params.period;
|
|
79
|
+
const sel = selector(`process_definition_key="${escapeLabelValue(params.processDefinitionKey)}"`, engineMatcher(params.engine));
|
|
80
|
+
const inWindow = (series) => increaseIn(series, { range });
|
|
81
|
+
const [counts, sums] = await Promise.all([
|
|
82
|
+
ch.instant(`sum by (activity_id)(${inWindow(`${M.activityEnded}${sel}`)})`),
|
|
83
|
+
ch.instant(`sum by (activity_id)(${inWindow(`${M.activityDuration}_sum${sel}`)})`),
|
|
84
|
+
]);
|
|
85
|
+
const countBy = byLabel(counts, "activity_id");
|
|
86
|
+
const sumBy = byLabel(sums, "activity_id");
|
|
87
|
+
const frequency = {};
|
|
88
|
+
const durationSec = {};
|
|
89
|
+
for (const [id, count] of Object.entries(countBy)) {
|
|
90
|
+
const c = Math.round(count);
|
|
91
|
+
if (c <= 0)
|
|
92
|
+
continue;
|
|
93
|
+
frequency[id] = c;
|
|
94
|
+
durationSec[id] = secondsOf((sumBy[id] ?? 0) / c);
|
|
95
|
+
}
|
|
96
|
+
return { frequency, durationSec, asOf };
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=element.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element.js","sourceRoot":"","sources":["../../src/queries/element.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element.test.d.ts","sourceRoot":"","sources":["../../src/queries/element.test.ts"],"names":[],"mappings":""}
|