trace-viz 0.3.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/CHANGELOG.md +42 -0
- package/LICENSE +21 -0
- package/README.md +385 -0
- package/dist/adapters/index.d.ts +32 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +83 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/agent.d.ts +66 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +329 -0
- package/dist/agent.js.map +1 -0
- package/dist/atlas/atlas.d.ts +203 -0
- package/dist/atlas/atlas.d.ts.map +1 -0
- package/dist/atlas/atlas.js +1466 -0
- package/dist/atlas/atlas.js.map +1 -0
- package/dist/atlas/index.d.ts +7 -0
- package/dist/atlas/index.d.ts.map +1 -0
- package/dist/atlas/index.js +4 -0
- package/dist/atlas/index.js.map +1 -0
- package/dist/atlas/layout.d.ts +44 -0
- package/dist/atlas/layout.d.ts.map +1 -0
- package/dist/atlas/layout.js +103 -0
- package/dist/atlas/layout.js.map +1 -0
- package/dist/atlas/model.d.ts +164 -0
- package/dist/atlas/model.d.ts.map +1 -0
- package/dist/atlas/model.js +489 -0
- package/dist/atlas/model.js.map +1 -0
- package/dist/channels.d.ts +105 -0
- package/dist/channels.d.ts.map +1 -0
- package/dist/channels.js +411 -0
- package/dist/channels.js.map +1 -0
- package/dist/components.d.ts +76 -0
- package/dist/components.d.ts.map +1 -0
- package/dist/components.js +432 -0
- package/dist/components.js.map +1 -0
- package/dist/estate.d.ts +25 -0
- package/dist/estate.d.ts.map +1 -0
- package/dist/estate.js +285 -0
- package/dist/estate.js.map +1 -0
- package/dist/failure.d.ts +36 -0
- package/dist/failure.d.ts.map +1 -0
- package/dist/failure.js +82 -0
- package/dist/failure.js.map +1 -0
- package/dist/geometry.d.ts +24 -0
- package/dist/geometry.d.ts.map +1 -0
- package/dist/geometry.js +92 -0
- package/dist/geometry.js.map +1 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/layout.d.ts +66 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +152 -0
- package/dist/layout.js.map +1 -0
- package/dist/layout3d.d.ts +98 -0
- package/dist/layout3d.d.ts.map +1 -0
- package/dist/layout3d.js +350 -0
- package/dist/layout3d.js.map +1 -0
- package/dist/mesh.d.ts +23 -0
- package/dist/mesh.d.ts.map +1 -0
- package/dist/mesh.js +263 -0
- package/dist/mesh.js.map +1 -0
- package/dist/model.d.ts +94 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +84 -0
- package/dist/model.js.map +1 -0
- package/dist/particles.d.ts +80 -0
- package/dist/particles.d.ts.map +1 -0
- package/dist/particles.js +118 -0
- package/dist/particles.js.map +1 -0
- package/dist/project.d.ts +113 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +288 -0
- package/dist/project.js.map +1 -0
- package/dist/react/index.d.ts +22 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +69 -0
- package/dist/react/index.js.map +1 -0
- package/dist/renderer.d.ts +252 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +1710 -0
- package/dist/renderer.js.map +1 -0
- package/dist/scales.d.ts +99 -0
- package/dist/scales.d.ts.map +1 -0
- package/dist/scales.js +126 -0
- package/dist/scales.js.map +1 -0
- package/dist/scene.d.ts +53 -0
- package/dist/scene.d.ts.map +1 -0
- package/dist/scene.js +44 -0
- package/dist/scene.js.map +1 -0
- package/dist/schema.d.ts +24 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +131 -0
- package/dist/schema.js.map +1 -0
- package/dist/seed.d.ts +33 -0
- package/dist/seed.d.ts.map +1 -0
- package/dist/seed.js +173 -0
- package/dist/seed.js.map +1 -0
- package/dist/theme.d.ts +35 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +83 -0
- package/dist/theme.js.map +1 -0
- package/dist/trace-viz.esm.js +15 -0
- package/dist/trace-viz.min.js +15 -0
- package/dist/types.d.ts +92 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/package.json +105 -0
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
export function buildAtlas(table, options = {}) {
|
|
2
|
+
const hierarchy = options.hierarchy ?? (table.meta?.hierarchy ?? ['domain', 'team']);
|
|
3
|
+
const leafKey = options.leafKey ?? 'service';
|
|
4
|
+
const where = options.where ?? {};
|
|
5
|
+
// Node facts: the dims that place a leaf in the tree.
|
|
6
|
+
const facts = new Map();
|
|
7
|
+
for (const n of table.nodes ?? []) {
|
|
8
|
+
const id = n.key[leafKey];
|
|
9
|
+
if (!id)
|
|
10
|
+
continue;
|
|
11
|
+
const prev = facts.get(id);
|
|
12
|
+
facts.set(id, { dims: { ...(prev?.dims ?? {}), ...(n.dims ?? {}) }, attrs: { ...(prev?.attrs ?? {}), ...(n.attrs ?? {}) } });
|
|
13
|
+
}
|
|
14
|
+
const matches = (dims) => {
|
|
15
|
+
for (const [k, v] of Object.entries(where)) {
|
|
16
|
+
const val = dims?.[k];
|
|
17
|
+
if (val === undefined)
|
|
18
|
+
continue;
|
|
19
|
+
if (Array.isArray(v) ? !v.includes(val) : v !== val)
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
return true;
|
|
23
|
+
};
|
|
24
|
+
const acc = new Map();
|
|
25
|
+
const leafIds = new Set();
|
|
26
|
+
for (const r of table.records) {
|
|
27
|
+
if (!matches(r.dims))
|
|
28
|
+
continue;
|
|
29
|
+
const from = r.from[leafKey];
|
|
30
|
+
const to = r.to[leafKey];
|
|
31
|
+
if (!from || !to || from === to)
|
|
32
|
+
continue;
|
|
33
|
+
leafIds.add(from);
|
|
34
|
+
leafIds.add(to);
|
|
35
|
+
const key = `${from}\u0000${to}`;
|
|
36
|
+
const a = acc.get(key) ?? { rps: 0, lat: 0, err: 0, bytes: 0, async: true, rigid: true, apis: new Set(), flows: 0 };
|
|
37
|
+
const rps = r.metrics.rps;
|
|
38
|
+
a.rps += rps;
|
|
39
|
+
a.lat += (r.metrics.latencyMs ?? 0) * rps;
|
|
40
|
+
a.err += (r.metrics.errorRate ?? 0) * rps;
|
|
41
|
+
a.bytes += (r.metrics.bytes ?? 0) * rps;
|
|
42
|
+
const transport = r.dims?.transport ?? r.dims?.protocol ?? '';
|
|
43
|
+
if (!/kafka|async|queue|sqs|pubsub|rabbit/i.test(transport))
|
|
44
|
+
a.async = false;
|
|
45
|
+
if (!/closed|rigid|hard|required/i.test(r.dims?.failure ?? ''))
|
|
46
|
+
a.rigid = false;
|
|
47
|
+
const api = r.dims?.group ?? r.to[`api`] ?? r.from[`api`];
|
|
48
|
+
if (api)
|
|
49
|
+
a.apis.add(api);
|
|
50
|
+
a.flows++;
|
|
51
|
+
acc.set(key, a);
|
|
52
|
+
}
|
|
53
|
+
for (const id of facts.keys())
|
|
54
|
+
leafIds.add(id);
|
|
55
|
+
const edges = [];
|
|
56
|
+
const out = new Map();
|
|
57
|
+
const inc = new Map();
|
|
58
|
+
for (const id of leafIds) {
|
|
59
|
+
out.set(id, []);
|
|
60
|
+
inc.set(id, []);
|
|
61
|
+
}
|
|
62
|
+
for (const [key, a] of acc) {
|
|
63
|
+
const [from, to] = key.split('\u0000');
|
|
64
|
+
const e = {
|
|
65
|
+
id: `${from}>${to}`,
|
|
66
|
+
from,
|
|
67
|
+
to,
|
|
68
|
+
rps: a.rps,
|
|
69
|
+
latencyMs: a.rps > 0 ? a.lat / a.rps : 0,
|
|
70
|
+
errorRate: a.rps > 0 ? a.err / a.rps : 0,
|
|
71
|
+
bytes: a.rps > 0 ? a.bytes / a.rps : 0,
|
|
72
|
+
async: a.async,
|
|
73
|
+
rigid: a.rigid,
|
|
74
|
+
back: false,
|
|
75
|
+
apis: [...a.apis].sort(),
|
|
76
|
+
flows: a.flows,
|
|
77
|
+
};
|
|
78
|
+
edges.push(e);
|
|
79
|
+
out.get(from).push(e.id);
|
|
80
|
+
inc.get(to).push(e.id);
|
|
81
|
+
}
|
|
82
|
+
const edgeById = new Map(edges.map((e) => [e.id, e]));
|
|
83
|
+
// --- depth: longest sync path from sources, DFS by traffic, cycles broken --
|
|
84
|
+
// Async hops do not count: an event consumed by a worker at the edge does
|
|
85
|
+
// not make that worker "deeper" than the store it reads. Topics sit one
|
|
86
|
+
// column past their producers, and a consume edge that goes against depth
|
|
87
|
+
// is drawn as an arc, which is exactly what it is - a feedback loop.
|
|
88
|
+
const depth = new Map();
|
|
89
|
+
const state = new Map();
|
|
90
|
+
const isTopic = (id) => /topic|queue/i.test(facts.get(id)?.dims.kind ?? '');
|
|
91
|
+
const byRps = (ids) => [...ids].sort((a, b) => edgeById.get(b).rps - edgeById.get(a).rps);
|
|
92
|
+
const visit = (id) => {
|
|
93
|
+
if (state.get(id) === 2)
|
|
94
|
+
return depth.get(id);
|
|
95
|
+
if (state.get(id) === 1)
|
|
96
|
+
return -1; // in stack: the caller's edge is a back-edge
|
|
97
|
+
state.set(id, 1);
|
|
98
|
+
let d = 0;
|
|
99
|
+
for (const eid of byRps(inc.get(id) ?? [])) {
|
|
100
|
+
const e = edgeById.get(eid);
|
|
101
|
+
if (e.async || isTopic(e.from) || isTopic(id))
|
|
102
|
+
continue;
|
|
103
|
+
const pd = visit(e.from);
|
|
104
|
+
if (pd < 0)
|
|
105
|
+
e.back = true;
|
|
106
|
+
else
|
|
107
|
+
d = Math.max(d, pd + 1);
|
|
108
|
+
}
|
|
109
|
+
depth.set(id, d);
|
|
110
|
+
state.set(id, 2);
|
|
111
|
+
return d;
|
|
112
|
+
};
|
|
113
|
+
const totalOut = (id) => (out.get(id) ?? []).reduce((s, eid) => s + edgeById.get(eid).rps, 0);
|
|
114
|
+
for (const id of [...leafIds].sort((a, b) => totalOut(b) - totalOut(a)))
|
|
115
|
+
visit(id);
|
|
116
|
+
const placeTopics = () => {
|
|
117
|
+
for (const id of leafIds) {
|
|
118
|
+
if (!isTopic(id))
|
|
119
|
+
continue;
|
|
120
|
+
let d = 0;
|
|
121
|
+
for (const eid of inc.get(id) ?? [])
|
|
122
|
+
if (!isTopic(edgeById.get(eid).from))
|
|
123
|
+
d = Math.max(d, (depth.get(edgeById.get(eid).from) ?? 0) + 1);
|
|
124
|
+
depth.set(id, d);
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
placeTopics();
|
|
128
|
+
// A pure consumer (no sync callers, only events in) belongs downstream of
|
|
129
|
+
// what it consumes, not in the ingress column. Lift it, then push the lift
|
|
130
|
+
// through its sync callees; the sync graph is a DAG so this settles.
|
|
131
|
+
for (const id of leafIds) {
|
|
132
|
+
if (isTopic(id))
|
|
133
|
+
continue;
|
|
134
|
+
const ins = (inc.get(id) ?? []).map((eid) => edgeById.get(eid));
|
|
135
|
+
if (ins.some((e) => !e.async && !e.back))
|
|
136
|
+
continue;
|
|
137
|
+
let d = depth.get(id) ?? 0;
|
|
138
|
+
for (const e of ins)
|
|
139
|
+
if (e.async)
|
|
140
|
+
d = Math.max(d, (depth.get(e.from) ?? 0) + 1);
|
|
141
|
+
depth.set(id, d);
|
|
142
|
+
}
|
|
143
|
+
for (let pass = 0; pass < 32; pass++) {
|
|
144
|
+
let changed = false;
|
|
145
|
+
for (const e of edges) {
|
|
146
|
+
if (e.async || e.back || isTopic(e.from) || isTopic(e.to))
|
|
147
|
+
continue;
|
|
148
|
+
const want = (depth.get(e.from) ?? 0) + 1;
|
|
149
|
+
if ((depth.get(e.to) ?? 0) < want) {
|
|
150
|
+
depth.set(e.to, want);
|
|
151
|
+
changed = true;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (!changed)
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
placeTopics();
|
|
158
|
+
for (const e of edges)
|
|
159
|
+
if ((depth.get(e.to) ?? 0) <= (depth.get(e.from) ?? 0))
|
|
160
|
+
e.back = true;
|
|
161
|
+
const maxDepth = Math.max(0, ...depth.values());
|
|
162
|
+
// --- leaves ---------------------------------------------------------------
|
|
163
|
+
const leaves = new Map();
|
|
164
|
+
for (const id of leafIds) {
|
|
165
|
+
const f = facts.get(id);
|
|
166
|
+
const dims = f?.dims ?? {};
|
|
167
|
+
const path = [];
|
|
168
|
+
let prefix = '';
|
|
169
|
+
for (const h of hierarchy) {
|
|
170
|
+
const v = dims[h] ?? '—';
|
|
171
|
+
prefix = prefix ? `${prefix}/${v}` : v;
|
|
172
|
+
path.push(prefix);
|
|
173
|
+
}
|
|
174
|
+
let inRps = 0;
|
|
175
|
+
let err = 0;
|
|
176
|
+
for (const eid of inc.get(id) ?? []) {
|
|
177
|
+
const e = edgeById.get(eid);
|
|
178
|
+
inRps += e.rps;
|
|
179
|
+
err += e.errorRate * e.rps;
|
|
180
|
+
}
|
|
181
|
+
const outRps = totalOut(id);
|
|
182
|
+
leaves.set(id, {
|
|
183
|
+
id,
|
|
184
|
+
label: id,
|
|
185
|
+
kind: dims.kind ?? 'service',
|
|
186
|
+
path,
|
|
187
|
+
depth: depth.get(id) ?? 0,
|
|
188
|
+
dims,
|
|
189
|
+
attrs: f?.attrs ?? {},
|
|
190
|
+
inRps,
|
|
191
|
+
outRps,
|
|
192
|
+
errorRate: inRps > 0 ? err / inRps : 0,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
// --- groups ---------------------------------------------------------------
|
|
196
|
+
const groups = new Map();
|
|
197
|
+
for (const leaf of leaves.values()) {
|
|
198
|
+
leaf.path.forEach((gid, level) => {
|
|
199
|
+
let g = groups.get(gid);
|
|
200
|
+
if (!g) {
|
|
201
|
+
g = {
|
|
202
|
+
id: gid,
|
|
203
|
+
label: gid.slice(gid.lastIndexOf('/') + 1),
|
|
204
|
+
level,
|
|
205
|
+
parent: level > 0 ? leaf.path[level - 1] : null,
|
|
206
|
+
groups: [],
|
|
207
|
+
leaves: [],
|
|
208
|
+
all: [],
|
|
209
|
+
depthMin: Infinity,
|
|
210
|
+
depthMax: -Infinity,
|
|
211
|
+
rps: 0,
|
|
212
|
+
errorRate: 0,
|
|
213
|
+
lag: 0,
|
|
214
|
+
};
|
|
215
|
+
groups.set(gid, g);
|
|
216
|
+
if (g.parent) {
|
|
217
|
+
const p = groups.get(g.parent);
|
|
218
|
+
if (!p.groups.includes(gid))
|
|
219
|
+
p.groups.push(gid);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
g.all.push(leaf.id);
|
|
223
|
+
if (level === leaf.path.length - 1)
|
|
224
|
+
g.leaves.push(leaf.id);
|
|
225
|
+
g.depthMin = Math.min(g.depthMin, leaf.depth);
|
|
226
|
+
g.depthMax = Math.max(g.depthMax, leaf.depth);
|
|
227
|
+
g.rps += leaf.inRps;
|
|
228
|
+
g.errorRate += leaf.errorRate * leaf.inRps;
|
|
229
|
+
g.lag = Math.max(g.lag, leaf.attrs.lag ?? 0);
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
for (const g of groups.values()) {
|
|
233
|
+
g.errorRate = g.rps > 0 ? g.errorRate / g.rps : 0;
|
|
234
|
+
if (!Number.isFinite(g.depthMin))
|
|
235
|
+
g.depthMin = g.depthMax = 0;
|
|
236
|
+
}
|
|
237
|
+
// Display order: shallow (edge) groups first, then by name. Stable across
|
|
238
|
+
// every view state, which is what makes positions memorable.
|
|
239
|
+
const meanDepth = (g) => g.all.reduce((s, id) => s + leaves.get(id).depth, 0) / Math.max(1, g.all.length);
|
|
240
|
+
const orderIds = (ids) => ids.sort((a, b) => meanDepth(groups.get(a)) - meanDepth(groups.get(b)) || a.localeCompare(b));
|
|
241
|
+
for (const g of groups.values())
|
|
242
|
+
orderIds(g.groups);
|
|
243
|
+
const roots = orderIds([...groups.values()].filter((g) => g.level === 0).map((g) => g.id));
|
|
244
|
+
return { leaves, groups, roots, edges, byId: edgeById, out, inc, hierarchy, leafKey, maxDepth };
|
|
245
|
+
}
|
|
246
|
+
export const emptyState = () => ({ expanded: [], focus: null, hops: 1, killed: [], pins: [] });
|
|
247
|
+
/** Leaves within `hops` of `id`, either direction. */
|
|
248
|
+
export function neighbourhood(model, id, hops) {
|
|
249
|
+
const seen = new Set([id]);
|
|
250
|
+
let frontier = [id];
|
|
251
|
+
for (let h = 0; h < hops; h++) {
|
|
252
|
+
const next = [];
|
|
253
|
+
for (const n of frontier) {
|
|
254
|
+
for (const eid of model.out.get(n) ?? []) {
|
|
255
|
+
const to = eid.slice(eid.indexOf('>') + 1);
|
|
256
|
+
if (!seen.has(to)) {
|
|
257
|
+
seen.add(to);
|
|
258
|
+
next.push(to);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
for (const eid of model.inc.get(n) ?? []) {
|
|
262
|
+
const from = eid.slice(0, eid.indexOf('>'));
|
|
263
|
+
if (!seen.has(from)) {
|
|
264
|
+
seen.add(from);
|
|
265
|
+
next.push(from);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
frontier = next;
|
|
270
|
+
}
|
|
271
|
+
return seen;
|
|
272
|
+
}
|
|
273
|
+
/** The effective expanded set: the user's, plus whatever the focus forces open. */
|
|
274
|
+
export function effectiveExpanded(model, state) {
|
|
275
|
+
const expanded = new Set(state.expanded);
|
|
276
|
+
// Expanding a group implies its ancestors are expanded too.
|
|
277
|
+
for (const id of [...expanded]) {
|
|
278
|
+
let g = model.groups.get(id);
|
|
279
|
+
while (g?.parent) {
|
|
280
|
+
expanded.add(g.parent);
|
|
281
|
+
g = model.groups.get(g.parent);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
for (const id of wanted(model, state))
|
|
285
|
+
for (const gid of model.leaves.get(id).path)
|
|
286
|
+
expanded.add(gid);
|
|
287
|
+
return expanded;
|
|
288
|
+
}
|
|
289
|
+
/** Leaves the state insists on seeing: the focus neighbourhood plus any pins. */
|
|
290
|
+
function wanted(model, state) {
|
|
291
|
+
const w = new Set();
|
|
292
|
+
if (state.focus && model.leaves.has(state.focus))
|
|
293
|
+
for (const id of neighbourhood(model, state.focus, state.hops))
|
|
294
|
+
w.add(id);
|
|
295
|
+
for (const id of state.pins ?? [])
|
|
296
|
+
if (model.leaves.has(id))
|
|
297
|
+
w.add(id);
|
|
298
|
+
return w;
|
|
299
|
+
}
|
|
300
|
+
/** The id of the "N more" tile that stands for the unfocused rest of a partially opened group. */
|
|
301
|
+
export const restOf = (gid) => `${gid}#rest`;
|
|
302
|
+
export const baseOf = (id) => (id.endsWith('#rest') ? id.slice(0, -5) : id);
|
|
303
|
+
export function visibleUnits(model, state) {
|
|
304
|
+
const expanded = effectiveExpanded(model, state);
|
|
305
|
+
// Groups the user opened (and their ancestors) show everything. Groups
|
|
306
|
+
// opened only because the focus's neighbourhood lives there show just
|
|
307
|
+
// those neighbours, and fold the rest of the team into one "N more" tile -
|
|
308
|
+
// a service's 45 teammates are context, not the thing you asked to see.
|
|
309
|
+
const user = effectiveExpanded(model, { ...state, focus: null, pins: [] });
|
|
310
|
+
const want = wanted(model, state);
|
|
311
|
+
const hood = want.size ? want : null;
|
|
312
|
+
const units = [];
|
|
313
|
+
const walk = (gid) => {
|
|
314
|
+
const g = model.groups.get(gid);
|
|
315
|
+
if (!expanded.has(gid)) {
|
|
316
|
+
units.push({ id: gid, kind: 'group', members: g.all, depthMin: g.depthMin, depthMax: g.depthMax });
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
for (const c of g.groups)
|
|
320
|
+
walk(c);
|
|
321
|
+
const partial = hood && !user.has(gid);
|
|
322
|
+
const rest = [];
|
|
323
|
+
for (const lid of g.leaves) {
|
|
324
|
+
const l = model.leaves.get(lid);
|
|
325
|
+
if (partial && !hood.has(lid)) {
|
|
326
|
+
rest.push(lid);
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
units.push({ id: lid, kind: 'leaf', members: [lid], depthMin: l.depth, depthMax: l.depth });
|
|
330
|
+
}
|
|
331
|
+
if (rest.length) {
|
|
332
|
+
const ds = rest.map((id) => model.leaves.get(id).depth);
|
|
333
|
+
units.push({ id: restOf(gid), kind: 'group', members: rest, depthMin: Math.min(...ds), depthMax: Math.max(...ds) });
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
for (const r of model.roots)
|
|
337
|
+
walk(r);
|
|
338
|
+
return { units, expanded };
|
|
339
|
+
}
|
|
340
|
+
/** Fold the leaf graph onto the visible units. Internal traffic of a unit is dropped (it is reported on the unit). */
|
|
341
|
+
export function aggregateEdges(model, units, keep = () => true) {
|
|
342
|
+
const unitOf = new Map();
|
|
343
|
+
for (const u of units)
|
|
344
|
+
for (const m of u.members)
|
|
345
|
+
unitOf.set(m, u.id);
|
|
346
|
+
const internal = new Map();
|
|
347
|
+
const acc = new Map();
|
|
348
|
+
for (const e of model.edges) {
|
|
349
|
+
if (!keep(e))
|
|
350
|
+
continue;
|
|
351
|
+
const a = unitOf.get(e.from);
|
|
352
|
+
const b = unitOf.get(e.to);
|
|
353
|
+
if (!a || !b)
|
|
354
|
+
continue;
|
|
355
|
+
if (a === b) {
|
|
356
|
+
internal.set(a, (internal.get(a) ?? 0) + e.rps);
|
|
357
|
+
continue;
|
|
358
|
+
}
|
|
359
|
+
const key = `${a}>${b}`;
|
|
360
|
+
let u = acc.get(key);
|
|
361
|
+
if (!u) {
|
|
362
|
+
u = {
|
|
363
|
+
id: key, from: a, to: b, rps: 0, latencyMs: 0, errorRate: 0, bytes: 0, async: false, mixed: false, rigid: true, back: true,
|
|
364
|
+
leafEdges: [], fromLeaves: 0, toLeaves: 0, fromDepth: 0, toDepth: 0, lat: 0, err: 0, by: 0, fd: 0, td: 0, syncSeen: false, asyncSeen: false, fl: new Set(), tl: new Set(),
|
|
365
|
+
};
|
|
366
|
+
acc.set(key, u);
|
|
367
|
+
}
|
|
368
|
+
u.rps += e.rps;
|
|
369
|
+
u.lat += e.latencyMs * e.rps;
|
|
370
|
+
u.err += e.errorRate * e.rps;
|
|
371
|
+
u.by += e.bytes * e.rps;
|
|
372
|
+
u.fd += model.leaves.get(e.from).depth * e.rps;
|
|
373
|
+
u.td += model.leaves.get(e.to).depth * e.rps;
|
|
374
|
+
if (e.async)
|
|
375
|
+
u.asyncSeen = true;
|
|
376
|
+
else
|
|
377
|
+
u.syncSeen = true;
|
|
378
|
+
if (!e.rigid)
|
|
379
|
+
u.rigid = false;
|
|
380
|
+
if (!e.back)
|
|
381
|
+
u.back = false;
|
|
382
|
+
u.leafEdges.push(e);
|
|
383
|
+
u.fl.add(e.from);
|
|
384
|
+
u.tl.add(e.to);
|
|
385
|
+
}
|
|
386
|
+
const edges = [];
|
|
387
|
+
for (const u of acc.values()) {
|
|
388
|
+
edges.push({
|
|
389
|
+
id: u.id, from: u.from, to: u.to, rps: u.rps,
|
|
390
|
+
latencyMs: u.rps > 0 ? u.lat / u.rps : 0,
|
|
391
|
+
errorRate: u.rps > 0 ? u.err / u.rps : 0,
|
|
392
|
+
bytes: u.rps > 0 ? u.by / u.rps : 0,
|
|
393
|
+
async: u.asyncSeen && !u.syncSeen,
|
|
394
|
+
mixed: u.asyncSeen && u.syncSeen,
|
|
395
|
+
rigid: u.rigid,
|
|
396
|
+
back: u.back,
|
|
397
|
+
leafEdges: u.leafEdges,
|
|
398
|
+
fromLeaves: u.fl.size,
|
|
399
|
+
toLeaves: u.tl.size,
|
|
400
|
+
fromDepth: u.rps > 0 ? u.fd / u.rps : 0,
|
|
401
|
+
toDepth: u.rps > 0 ? u.td / u.rps : 0,
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
edges.sort((a, b) => b.rps - a.rps);
|
|
405
|
+
return { edges, unitOf, internal };
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* The heaviest path from `from` to `to`: Dijkstra on -log(share), so the path
|
|
409
|
+
* that carries the most of each hop's traffic wins. Returns leaf ids, or null.
|
|
410
|
+
*/
|
|
411
|
+
export function trail(model, from, to) {
|
|
412
|
+
if (!model.leaves.has(from) || !model.leaves.has(to))
|
|
413
|
+
return null;
|
|
414
|
+
const dist = new Map([[from, 0]]);
|
|
415
|
+
const prev = new Map();
|
|
416
|
+
const done = new Set();
|
|
417
|
+
const outRps = (id) => model.leaves.get(id).outRps || 1;
|
|
418
|
+
while (true) {
|
|
419
|
+
let best = null;
|
|
420
|
+
let bd = Infinity;
|
|
421
|
+
for (const [id, d] of dist)
|
|
422
|
+
if (!done.has(id) && d < bd) {
|
|
423
|
+
bd = d;
|
|
424
|
+
best = id;
|
|
425
|
+
}
|
|
426
|
+
if (best === null)
|
|
427
|
+
return null;
|
|
428
|
+
if (best === to)
|
|
429
|
+
break;
|
|
430
|
+
done.add(best);
|
|
431
|
+
for (const eid of model.out.get(best) ?? []) {
|
|
432
|
+
const e = model.byId.get(eid);
|
|
433
|
+
const w = -Math.log(Math.max(1e-6, e.rps / outRps(best)));
|
|
434
|
+
const nd = bd + w;
|
|
435
|
+
if (nd < (dist.get(e.to) ?? Infinity)) {
|
|
436
|
+
dist.set(e.to, nd);
|
|
437
|
+
prev.set(e.to, best);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
const path = [to];
|
|
442
|
+
while (path[0] !== from)
|
|
443
|
+
path.unshift(prev.get(path[0]));
|
|
444
|
+
return path;
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* Blast radius on the leaf graph. Rigid edges carry death upstream; breakaway
|
|
448
|
+
* edges stop it (the caller is degraded). Same semantics as the flat renderer.
|
|
449
|
+
*/
|
|
450
|
+
export function propagate(model, killed) {
|
|
451
|
+
const dead = new Set(killed.filter((k) => model.leaves.has(k)));
|
|
452
|
+
const degraded = new Set();
|
|
453
|
+
let changed = true;
|
|
454
|
+
while (changed) {
|
|
455
|
+
changed = false;
|
|
456
|
+
for (const e of model.edges) {
|
|
457
|
+
if (!dead.has(e.to) || dead.has(e.from))
|
|
458
|
+
continue;
|
|
459
|
+
if (e.rigid) {
|
|
460
|
+
dead.add(e.from);
|
|
461
|
+
degraded.delete(e.from);
|
|
462
|
+
changed = true;
|
|
463
|
+
}
|
|
464
|
+
else if (!degraded.has(e.from)) {
|
|
465
|
+
degraded.add(e.from);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
return { dead, degraded };
|
|
470
|
+
}
|
|
471
|
+
/** Search leaves and groups by substring; leaves first, then groups. */
|
|
472
|
+
export function search(model, query, limit = 12) {
|
|
473
|
+
const q = query.trim().toLowerCase();
|
|
474
|
+
if (!q)
|
|
475
|
+
return [];
|
|
476
|
+
const hits = [];
|
|
477
|
+
for (const l of model.leaves.values()) {
|
|
478
|
+
const i = l.id.toLowerCase().indexOf(q);
|
|
479
|
+
if (i >= 0)
|
|
480
|
+
hits.push({ id: l.id, kind: l.kind, label: l.id, path: l.path, score: i + (l.id.length - q.length) * 0.01 });
|
|
481
|
+
}
|
|
482
|
+
for (const g of model.groups.values()) {
|
|
483
|
+
const i = g.label.toLowerCase().indexOf(q);
|
|
484
|
+
if (i >= 0)
|
|
485
|
+
hits.push({ id: g.id, kind: `group:${model.hierarchy[g.level] ?? 'group'}`, label: g.label, path: g.parent ? [g.parent] : [], score: i - 0.5 });
|
|
486
|
+
}
|
|
487
|
+
return hits.sort((a, b) => a.score - b.score).slice(0, limit);
|
|
488
|
+
}
|
|
489
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/atlas/model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { type ChannelBinding, type ViewSpec } from './project.js';
|
|
2
|
+
import type { Scene } from './scene.js';
|
|
3
|
+
import { type EncodingOptions } from './scales.js';
|
|
4
|
+
import type { Theme } from './theme.js';
|
|
5
|
+
/**
|
|
6
|
+
* The channel registry: one visualization per knob.
|
|
7
|
+
*
|
|
8
|
+
* A channel is a visual property with its own resolver. Bind any compatible
|
|
9
|
+
* field to any channel and the picture changes - that is the whole framework.
|
|
10
|
+
* Adding a channel here is the supported way to extend it; the renderer reads
|
|
11
|
+
* only the resolved values, never the bindings.
|
|
12
|
+
*/
|
|
13
|
+
export type ChannelName = 'density' | 'speed' | 'radius' | 'hue' | 'glyph' | 'dash' | 'lane' | 'coupling' | 'distance' | 'nodeFill' | 'halo' | 'column';
|
|
14
|
+
export type Glyph = 'dot' | 'ring' | 'square' | 'triangle' | 'bar' | 'diamond';
|
|
15
|
+
export type Coupling = 'plain' | 'rigid' | 'breakaway';
|
|
16
|
+
export interface ChannelDef {
|
|
17
|
+
name: ChannelName;
|
|
18
|
+
target: 'edge' | 'node';
|
|
19
|
+
accepts: 'dimension' | 'measure' | 'both';
|
|
20
|
+
/** Refuse a categorical binding above this many distinct values - it would be unreadable. */
|
|
21
|
+
maxCardinality?: number;
|
|
22
|
+
summary: string;
|
|
23
|
+
}
|
|
24
|
+
/** Error rate below which a danger halo draws nothing: every box has some errors. */
|
|
25
|
+
export declare const ERROR_FLOOR = 0.004;
|
|
26
|
+
/** Error rate at which a danger halo is at full strength. */
|
|
27
|
+
export declare const ERROR_CEIL = 0.06;
|
|
28
|
+
export declare const CHANNELS: Record<ChannelName, ChannelDef>;
|
|
29
|
+
export interface EdgeStyle {
|
|
30
|
+
density: number;
|
|
31
|
+
speed: number;
|
|
32
|
+
radius: number;
|
|
33
|
+
hue: string;
|
|
34
|
+
glyph: Glyph;
|
|
35
|
+
dash: number[] | null;
|
|
36
|
+
lane: number;
|
|
37
|
+
laneLabel: string | null;
|
|
38
|
+
coupling: Coupling;
|
|
39
|
+
/** 0..1 pull used by the world layout. Proximity is an encoding too. */
|
|
40
|
+
attraction: number;
|
|
41
|
+
}
|
|
42
|
+
export interface NodeStyle {
|
|
43
|
+
fill: string;
|
|
44
|
+
halo: number;
|
|
45
|
+
/** True when the halo encodes something bad (errors), so it is drawn in the danger colour. */
|
|
46
|
+
haloDanger: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* 0..1 strength of the halo. For error rates this is absolute, not relative
|
|
49
|
+
* to the worst node: 0.2% is barely there, 2% clearly glows, 10%+ burns.
|
|
50
|
+
*/
|
|
51
|
+
haloIntensity: number;
|
|
52
|
+
column: number | null;
|
|
53
|
+
/** The value of the column dimension, so the renderer can draw a region per group. */
|
|
54
|
+
group: string | null;
|
|
55
|
+
}
|
|
56
|
+
export interface LegendSwatch {
|
|
57
|
+
value: string;
|
|
58
|
+
/** A colour, when the channel is colour-like. */
|
|
59
|
+
color?: string;
|
|
60
|
+
/** A short textual rendering of the non-colour visual, e.g. "▲" or "rigid". */
|
|
61
|
+
mark?: string;
|
|
62
|
+
}
|
|
63
|
+
export interface LegendGroup {
|
|
64
|
+
channel: ChannelName;
|
|
65
|
+
field: string;
|
|
66
|
+
kind: 'dimension' | 'measure';
|
|
67
|
+
summary: string;
|
|
68
|
+
swatches: LegendSwatch[];
|
|
69
|
+
/** Set when a binding was refused, with the reason. */
|
|
70
|
+
warning?: string;
|
|
71
|
+
}
|
|
72
|
+
export interface StyledScene {
|
|
73
|
+
edges: Map<string, EdgeStyle>;
|
|
74
|
+
nodes: Map<string, NodeStyle>;
|
|
75
|
+
/** Set when `distance` is bound to a dimension: nodes sharing its value cluster. */
|
|
76
|
+
clusterBy: string | null;
|
|
77
|
+
legend: LegendGroup[];
|
|
78
|
+
/** Dimensions whose values were seen, for the UI to offer as filters. */
|
|
79
|
+
issues: string[];
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Categorical palette.
|
|
83
|
+
*
|
|
84
|
+
* Ordered so the first few stay distinguishable under the common forms of
|
|
85
|
+
* colour-vision deficiency, and legible on both a light and a dark ground.
|
|
86
|
+
*
|
|
87
|
+
* Red is absent and amber comes late on purpose: those two are *semantic* here.
|
|
88
|
+
* Red means an error and amber means degraded, and a category that borrows one
|
|
89
|
+
* of them makes a healthy region look like an incident. Two encodings cannot
|
|
90
|
+
* share a colour any more than they can share a channel.
|
|
91
|
+
*/
|
|
92
|
+
export declare const CATEGORICAL: string[];
|
|
93
|
+
/**
|
|
94
|
+
* Resolve every binding into concrete visual values.
|
|
95
|
+
*
|
|
96
|
+
* Unbound channels fall back to the v0.1 encoding, so a scene with no spec at
|
|
97
|
+
* all still draws the way it always did.
|
|
98
|
+
*/
|
|
99
|
+
export declare function styleScene(scene: Scene, spec: ViewSpec, theme: Theme, enc?: EncodingOptions): StyledScene;
|
|
100
|
+
/**
|
|
101
|
+
* Failure semantics are a first-party concept, not just another category, so
|
|
102
|
+
* the mapping recognises the vocabulary people actually use.
|
|
103
|
+
*/
|
|
104
|
+
export declare function couplingFor(value: string, binding?: ChannelBinding): Coupling;
|
|
105
|
+
//# sourceMappingURL=channels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channels.d.ts","sourceRoot":"","sources":["../src/channels.ts"],"names":[],"mappings":"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"}
|