@dipseth/opensearch-logs 0.1.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.
Files changed (91) hide show
  1. package/.env.example +14 -0
  2. package/alerts/langfuse-usage.yaml +142 -0
  3. package/alerts/production-incidents.yaml +280 -0
  4. package/alerts/service-health.yaml +98 -0
  5. package/dashboards/langfuse-usage.yaml +57 -0
  6. package/dist/create-dashboards.d.ts +10 -0
  7. package/dist/create-dashboards.js +38 -0
  8. package/dist/create-dashboards.js.map +1 -0
  9. package/dist/interfaces/alert.interfaces.d.ts +323 -0
  10. package/dist/interfaces/alert.interfaces.js +6 -0
  11. package/dist/interfaces/alert.interfaces.js.map +1 -0
  12. package/dist/interfaces/dashboard-gen.interfaces.d.ts +33 -0
  13. package/dist/interfaces/dashboard-gen.interfaces.js +3 -0
  14. package/dist/interfaces/dashboard-gen.interfaces.js.map +1 -0
  15. package/dist/interfaces/interfaces.d.ts +312 -0
  16. package/dist/interfaces/interfaces.js +3 -0
  17. package/dist/interfaces/interfaces.js.map +1 -0
  18. package/dist/interfaces/playbook.interfaces.d.ts +140 -0
  19. package/dist/interfaces/playbook.interfaces.js +3 -0
  20. package/dist/interfaces/playbook.interfaces.js.map +1 -0
  21. package/dist/os-alert.d.ts +17 -0
  22. package/dist/os-alert.js +245 -0
  23. package/dist/os-alert.js.map +1 -0
  24. package/dist/os-dash.d.ts +9 -0
  25. package/dist/os-dash.js +53 -0
  26. package/dist/os-dash.js.map +1 -0
  27. package/dist/os-monitor.d.ts +12 -0
  28. package/dist/os-monitor.js +59 -0
  29. package/dist/os-monitor.js.map +1 -0
  30. package/dist/os-playbook.d.ts +9 -0
  31. package/dist/os-playbook.js +71 -0
  32. package/dist/os-playbook.js.map +1 -0
  33. package/dist/os-search.d.ts +11 -0
  34. package/dist/os-search.js +84 -0
  35. package/dist/os-search.js.map +1 -0
  36. package/dist/repositories/index.d.ts +1 -0
  37. package/dist/repositories/index.js +2 -0
  38. package/dist/repositories/index.js.map +1 -0
  39. package/dist/repositories/opensearch.repository.d.ts +51 -0
  40. package/dist/repositories/opensearch.repository.js +167 -0
  41. package/dist/repositories/opensearch.repository.js.map +1 -0
  42. package/dist/services/alert.service.d.ts +73 -0
  43. package/dist/services/alert.service.js +503 -0
  44. package/dist/services/alert.service.js.map +1 -0
  45. package/dist/services/dashboard-gen.service.d.ts +36 -0
  46. package/dist/services/dashboard-gen.service.js +162 -0
  47. package/dist/services/dashboard-gen.service.js.map +1 -0
  48. package/dist/services/dashboard.service.d.ts +33 -0
  49. package/dist/services/dashboard.service.js +428 -0
  50. package/dist/services/dashboard.service.js.map +1 -0
  51. package/dist/services/gchat.service.d.ts +45 -0
  52. package/dist/services/gchat.service.js +228 -0
  53. package/dist/services/gchat.service.js.map +1 -0
  54. package/dist/services/index.d.ts +8 -0
  55. package/dist/services/index.js +9 -0
  56. package/dist/services/index.js.map +1 -0
  57. package/dist/services/monitor.service.d.ts +18 -0
  58. package/dist/services/monitor.service.js +342 -0
  59. package/dist/services/monitor.service.js.map +1 -0
  60. package/dist/services/panel-layout.d.ts +21 -0
  61. package/dist/services/panel-layout.js +33 -0
  62. package/dist/services/panel-layout.js.map +1 -0
  63. package/dist/services/playbook-dashboard.service.d.ts +19 -0
  64. package/dist/services/playbook-dashboard.service.js +434 -0
  65. package/dist/services/playbook-dashboard.service.js.map +1 -0
  66. package/dist/services/playbook.service.d.ts +13 -0
  67. package/dist/services/playbook.service.js +621 -0
  68. package/dist/services/playbook.service.js.map +1 -0
  69. package/dist/services/search.service.d.ts +30 -0
  70. package/dist/services/search.service.js +885 -0
  71. package/dist/services/search.service.js.map +1 -0
  72. package/dist/utils/cli.d.ts +14 -0
  73. package/dist/utils/cli.js +90 -0
  74. package/dist/utils/cli.js.map +1 -0
  75. package/dist/utils/config.d.ts +20 -0
  76. package/dist/utils/config.js +104 -0
  77. package/dist/utils/config.js.map +1 -0
  78. package/dist/utils/index.d.ts +5 -0
  79. package/dist/utils/index.js +5 -0
  80. package/dist/utils/index.js.map +1 -0
  81. package/dist/utils/service-registry.d.ts +15 -0
  82. package/dist/utils/service-registry.js +56 -0
  83. package/dist/utils/service-registry.js.map +1 -0
  84. package/dist/utils/template.d.ts +18 -0
  85. package/dist/utils/template.js +66 -0
  86. package/dist/utils/template.js.map +1 -0
  87. package/package.json +76 -0
  88. package/playbooks/error-investigation.yaml +45 -0
  89. package/playbooks/incident-triage.yaml +32 -0
  90. package/playbooks/post-deploy-validation.yaml +24 -0
  91. package/playbooks/service-deep-dive.yaml +42 -0
@@ -0,0 +1,434 @@
1
+ /**
2
+ * Playbook dashboard generator — transforms StepResult data into an OSD
3
+ * saved dashboard that mirrors the visual style of the static production
4
+ * health dashboard: metric tile rows + paired half-width line charts.
5
+ *
6
+ * Design principles:
7
+ * - Visuals first: metric tiles for key numbers, line charts for trends
8
+ * - Markdown only for header and evidence appendix (samples that can't
9
+ * be visualized as live queries)
10
+ * - Thematic chart grouping (HTTP errors, worker lifecycle, infrastructure)
11
+ * - Same panel sizes as the reference dashboard (8×6 metrics, 24×12 charts)
12
+ */
13
+ import { visMarkdown, visMetric, visLineChart, } from "./dashboard.service.js";
14
+ import { GridLayout } from "./panel-layout.js";
15
+ // ── Report Pattern Queries ────────────────────────────────────────────
16
+ const REPORT_PATTERNS = {
17
+ "HTTP 500s": '"500 Internal Server Error"',
18
+ "HTTP 503s": 'log:"status=503"',
19
+ "HTTP 502s": 'log:"status=502"',
20
+ "Connection Refused": '"Connection refused"',
21
+ "Worker Shutdowns": '"Shutting down"',
22
+ "Worker Startups": '"Application startup complete"',
23
+ "Max Request Limit": '"Maximum request limit"',
24
+ "Playwright Failures": '"Failed to launch browser"',
25
+ "OOM / Memory": 'OOM OR "Cannot allocate memory"',
26
+ "API Key Missing": '"ENCORE_G_API_KEY: None" OR "ENCORE_G_API_KEY: NOT SET"',
27
+ "Client Timeouts (499)": 'log:"status=499"',
28
+ };
29
+ // Thematic chart groups (matching the reference static dashboard)
30
+ const CHART_GROUPS = [
31
+ {
32
+ title: "HTTP Errors Over Time",
33
+ series: {
34
+ "500 Internal Server Error": REPORT_PATTERNS["HTTP 500s"],
35
+ "503 Service Unavailable": REPORT_PATTERNS["HTTP 503s"],
36
+ "502 Bad Gateway": REPORT_PATTERNS["HTTP 502s"],
37
+ "499 Client Timeout": REPORT_PATTERNS["Client Timeouts (499)"],
38
+ },
39
+ },
40
+ {
41
+ title: "Worker Lifecycle Events",
42
+ series: {
43
+ Shutdowns: REPORT_PATTERNS["Worker Shutdowns"],
44
+ Startups: REPORT_PATTERNS["Worker Startups"],
45
+ "Max Request Limit": REPORT_PATTERNS["Max Request Limit"],
46
+ },
47
+ },
48
+ {
49
+ title: "Infrastructure Issues",
50
+ series: {
51
+ "Connection Refused": REPORT_PATTERNS["Connection Refused"],
52
+ "Playwright Failures": REPORT_PATTERNS["Playwright Failures"],
53
+ "OOM / Memory": REPORT_PATTERNS["OOM / Memory"],
54
+ },
55
+ },
56
+ ];
57
+ // ── Panel Sizes (matching reference dashboard) ────────────────────────
58
+ const GRID_W = 48;
59
+ const HALF_W = 24;
60
+ const METRIC_W = 8;
61
+ const HEADER_H = 4;
62
+ const METRIC_H = 6;
63
+ const CHART_H = 12;
64
+ const MIN_MD_H = 6;
65
+ const MAX_MD_H = 32;
66
+ // ── Content-Aware Markdown Height ─────────────────────────────────────
67
+ function markdownHeight(md) {
68
+ const lines = md.split("\n");
69
+ let px = 60; // panel chrome
70
+ for (const line of lines) {
71
+ if (line.startsWith("###"))
72
+ px += 34;
73
+ else if (line.startsWith("##"))
74
+ px += 38;
75
+ else if (line.startsWith("|"))
76
+ px += 28;
77
+ else if (line.startsWith("```"))
78
+ px += 12;
79
+ else if (line.startsWith("- "))
80
+ px += 24;
81
+ else if (line.startsWith("**"))
82
+ px += 26;
83
+ else if (line.trim() === "")
84
+ px += 10;
85
+ else
86
+ px += 22;
87
+ }
88
+ return Math.max(MIN_MD_H, Math.min(MAX_MD_H, Math.ceil(px / 20)));
89
+ }
90
+ /** Sentinel that triggers a newRow() in the grid layout. */
91
+ const ROW_BREAK = { vis: null, w: 0, h: 0 };
92
+ function md(title, id, text) {
93
+ return { vis: visMarkdown(title, id, text), w: GRID_W, h: markdownHeight(text) };
94
+ }
95
+ function metric(title, id, query, label) {
96
+ return { vis: visMetric(title, id, query, label), w: METRIC_W, h: METRIC_H };
97
+ }
98
+ function chart(title, id, queries, w = HALF_W) {
99
+ return { vis: visLineChart(title, id, queries), w, h: CHART_H };
100
+ }
101
+ // ── Dashboard ID Helpers ──────────────────────────────────────────────
102
+ function dashboardTimestamp() {
103
+ return new Date().toISOString().replace(/[-:]/g, "").replace(/\.\d+Z$/, "");
104
+ }
105
+ function slug(name) {
106
+ return name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/(^-|-$)/g, "");
107
+ }
108
+ /**
109
+ * pattern-count → thematic line chart pairs (skip markdown summary).
110
+ * Key metric tiles are emitted separately at the top by the generator.
111
+ */
112
+ function mapPatternCount(_stepId, result, prefix) {
113
+ const stepData = result.data;
114
+ const patterns = stepData.patterns;
115
+ if (!patterns)
116
+ return [];
117
+ const nonZero = new Set(Object.entries(patterns).filter(([, v]) => v > 0).map(([k]) => k));
118
+ const panels = [];
119
+ let chartIdx = 0;
120
+ for (const group of CHART_GROUPS) {
121
+ // Only include series that had non-zero counts
122
+ const activeSeries = {};
123
+ for (const [label, query] of Object.entries(group.series)) {
124
+ // Find the matching pattern name in REPORT_PATTERNS
125
+ const patternName = Object.entries(REPORT_PATTERNS).find(([, q]) => q === query)?.[0];
126
+ if (patternName && nonZero.has(patternName)) {
127
+ activeSeries[label] = query;
128
+ }
129
+ }
130
+ if (Object.keys(activeSeries).length > 0) {
131
+ panels.push(chart(group.title, `${prefix}-chart-${chartIdx}`, activeSeries));
132
+ chartIdx++;
133
+ }
134
+ }
135
+ // If there are patterns not covered by the 3 groups (e.g., API Key Missing),
136
+ // add a catch-all chart
137
+ const coveredPatterns = new Set(CHART_GROUPS.flatMap(g => Object.values(g.series).map(q => Object.entries(REPORT_PATTERNS).find(([, rq]) => rq === q)?.[0] ?? "")));
138
+ const uncovered = {};
139
+ for (const name of nonZero) {
140
+ if (!coveredPatterns.has(name) && REPORT_PATTERNS[name]) {
141
+ uncovered[name] = REPORT_PATTERNS[name];
142
+ }
143
+ }
144
+ if (Object.keys(uncovered).length > 0) {
145
+ panels.push(chart("Other Patterns", `${prefix}-chart-other`, uncovered));
146
+ }
147
+ return panels;
148
+ }
149
+ /**
150
+ * errors → per-status metric tiles + errors-by-status chart + errors-by-service chart.
151
+ * Evidence samples go to a compact markdown at the end.
152
+ */
153
+ function mapErrors(stepId, result, prefix) {
154
+ const panels = [];
155
+ const stepData = result.data;
156
+ const { total, by_status, by_service, samples } = stepData;
157
+ // Per-status-code metric tiles (live queries)
158
+ panels.push(metric("Total Errors", `${prefix}-m-total`, 'status_code:>=400 OR level:"ERROR"', "Errors"));
159
+ for (const s of (by_status ?? []).slice(0, 5)) {
160
+ panels.push(metric(`HTTP ${s.code}`, `${prefix}-m-${s.code}`, `status_code:${s.code}`, `${s.code}`));
161
+ }
162
+ // Row break before charts
163
+ panels.push(ROW_BREAK);
164
+ // Errors by status code over time (half-width)
165
+ const statusQueries = {};
166
+ for (const s of (by_status ?? []).slice(0, 5)) {
167
+ statusQueries[`HTTP ${s.code}`] = `status_code:${s.code}`;
168
+ }
169
+ if (Object.keys(statusQueries).length > 0) {
170
+ panels.push(chart(`Errors by Status Code`, `${prefix}-chart-status`, statusQueries));
171
+ }
172
+ // Errors by service over time (half-width)
173
+ const svcQueries = {};
174
+ for (const s of (by_service ?? []).slice(0, 5)) {
175
+ svcQueries[s.service] = `service.keyword:"${s.service}" AND (status_code:>=400 OR level:"ERROR")`;
176
+ }
177
+ if (Object.keys(svcQueries).length > 0) {
178
+ panels.push(chart(`Errors by Service`, `${prefix}-chart-svc`, svcQueries));
179
+ }
180
+ // Evidence samples markdown (compact, at the end)
181
+ if (samples && samples.length > 0) {
182
+ panels.push(ROW_BREAK);
183
+ const sampleLines = samples.map(s => `**${s.timestamp}** \`${s.service ?? "?"}\`\n\`\`\`\n${s.log}\n\`\`\``).join("\n\n");
184
+ panels.push(md(`${stepId} - Error Samples`, `${prefix}-samples`, `### Recent Error Samples\n\n${sampleLines}`));
185
+ }
186
+ return panels;
187
+ }
188
+ /**
189
+ * latency → metric tiles for headline numbers + compact per-service table.
190
+ * OSD vis can't run scripted_metric, so percentiles stay as snapshot markdown.
191
+ */
192
+ function mapLatency(_stepId, result, prefix) {
193
+ const panels = [];
194
+ const stepData = result.data;
195
+ const { latency, by_service } = stepData;
196
+ if (!latency)
197
+ return panels;
198
+ // Compact summary: overall stats as markdown header, per-service as table
199
+ let tableMd = `### Latency — Avg ${latency.avg}ms | P50 ${latency.p50}ms | P95 ${latency.p95}ms | P99 ${latency.p99}ms\n\n`;
200
+ if (by_service && by_service.length > 0) {
201
+ tableMd += `| Service | Reqs | Avg | P50 | P95 | P99 |\n|---------|-----:|----:|----:|----:|----:|\n`;
202
+ for (const s of by_service) {
203
+ tableMd += `| ${s.service} | ${s.count} | ${s.avg}ms | ${s.p50}ms | ${s.p95}ms | ${s.p99}ms |\n`;
204
+ }
205
+ }
206
+ panels.push(md(`Latency`, `${prefix}-table`, tableMd));
207
+ return panels;
208
+ }
209
+ /**
210
+ * services → per-service error metric tiles + error chart by service.
211
+ */
212
+ function mapServices(_stepId, result, prefix) {
213
+ const panels = [];
214
+ const stepData = result.data;
215
+ const { services } = stepData;
216
+ if (!services || services.length === 0)
217
+ return panels;
218
+ // Metric tiles for top services with errors (live count queries)
219
+ const withErrors = services.filter(s => s.errors > 0).slice(0, 6);
220
+ for (const s of withErrors) {
221
+ panels.push(metric(s.service.replace("aiaas-", ""), `${prefix}-m-${slug(s.service)}`, `service.keyword:"${s.service}" AND (status_code:>=400 OR level:"ERROR")`, `${s.service.replace("aiaas-", "")} Errors`));
222
+ }
223
+ // Row break before chart
224
+ if (withErrors.length > 0)
225
+ panels.push(ROW_BREAK);
226
+ // Error rate by service over time (full-width, more series = needs room)
227
+ const svcQueries = {};
228
+ for (const s of withErrors) {
229
+ svcQueries[s.service.replace("aiaas-", "")] =
230
+ `service.keyword:"${s.service}" AND (status_code:>=400 OR level:"ERROR")`;
231
+ }
232
+ if (Object.keys(svcQueries).length > 0) {
233
+ panels.push(chart("Errors by Service Over Time", `${prefix}-chart-svc`, svcQueries, GRID_W));
234
+ }
235
+ return panels;
236
+ }
237
+ /** search/query → compact evidence markdown. */
238
+ function mapSearch(stepId, result, prefix) {
239
+ const stepData = result.data;
240
+ const { hits, total } = stepData;
241
+ let text = `### ${stepId} (${total.toLocaleString()} total)\n\n`;
242
+ if (hits && hits.length > 0) {
243
+ text += hits.map(h => `**${h.timestamp}** \`${h.service ?? "?"}\`\n\`\`\`\n${h.log}\n\`\`\``).join("\n\n");
244
+ }
245
+ else {
246
+ text += "No results found.";
247
+ }
248
+ return [md(`${stepId} - Evidence`, `${prefix}-evidence`, text)];
249
+ }
250
+ /** count → single metric tile (live). */
251
+ function mapCount(stepId, result, prefix, ctx) {
252
+ const svc = ctx.defaults.service;
253
+ const query = svc ? `service.keyword:"${svc}"` : "*";
254
+ return [metric(stepId, `${prefix}-metric`, query, stepId)];
255
+ }
256
+ /** histogram → live line chart (full-width). */
257
+ function mapHistogram(stepId, _result, prefix, ctx) {
258
+ const svc = ctx.defaults.service;
259
+ const query = svc ? `service.keyword:"${svc}"` : "*";
260
+ return [chart(`${stepId} - Over Time`, `${prefix}-chart`, { Events: query }, GRID_W)];
261
+ }
262
+ /** timeline → evidence markdown. */
263
+ function mapTimeline(stepId, result, prefix) {
264
+ const stepData = result.data;
265
+ const { hits, total } = stepData;
266
+ let text = `### ${stepId} Timeline (${total.toLocaleString()} events)\n\n`;
267
+ if (hits && hits.length > 0) {
268
+ text += hits.map(h => `\`${h.timestamp}\` \`${h.level ?? ""}\` \`${h.service ?? "?"}\` ${h.log}`).join("\n\n");
269
+ }
270
+ else {
271
+ text += "No events found.";
272
+ }
273
+ return [md(`${stepId} - Timeline`, `${prefix}-timeline`, text)];
274
+ }
275
+ /** Fallback for dashboard/report steps. */
276
+ function mapGenericMarkdown(stepId, result, prefix) {
277
+ const text = `### ${stepId}\n\n${result.summary.join("\n\n")}`;
278
+ return [md(`${stepId}`, `${prefix}-summary`, text)];
279
+ }
280
+ // ── Registry ──────────────────────────────────────────────────────────
281
+ const STEP_MAPPERS = {
282
+ "pattern-count": mapPatternCount,
283
+ errors: mapErrors,
284
+ latency: mapLatency,
285
+ services: mapServices,
286
+ search: mapSearch,
287
+ query: mapSearch,
288
+ count: mapCount,
289
+ histogram: mapHistogram,
290
+ timeline: mapTimeline,
291
+ dashboard: mapGenericMarkdown,
292
+ report: mapGenericMarkdown,
293
+ };
294
+ // ── Topological Sort ──────────────────────────────────────────────────
295
+ function topoSort(playbook) {
296
+ const visited = new Set();
297
+ const result = [];
298
+ function visit(id) {
299
+ if (visited.has(id))
300
+ return;
301
+ visited.add(id);
302
+ for (const dep of playbook.steps[id]?.depends_on ?? [])
303
+ visit(dep);
304
+ result.push(id);
305
+ }
306
+ for (const id of Object.keys(playbook.steps))
307
+ visit(id);
308
+ return result;
309
+ }
310
+ // ── Main Generator ────────────────────────────────────────────────────
311
+ export class PlaybookDashboardService {
312
+ repo;
313
+ constructor(repo) {
314
+ this.repo = repo;
315
+ }
316
+ async generate(playbook, results, ctx) {
317
+ const ts = dashboardTimestamp();
318
+ const dashId = `playbook-${slug(playbook.name)}-${ts}`;
319
+ const dashTitle = `Playbook: ${playbook.name} (${ts})`;
320
+ const host = this.repo.config.host;
321
+ process.stderr.write(`\n Creating dashboard: ${dashTitle}\n`);
322
+ const allPanels = [];
323
+ const ordered = topoSort(playbook);
324
+ // ── 1. Header (compact markdown, full width) ──────────────────
325
+ const status = [...results.values()].every(r => r.status === "success") ? "OK" : "DEGRADED";
326
+ const scope = ctx.defaults.service ?? "all services";
327
+ const headerMd = [
328
+ `## ${playbook.name}`,
329
+ `${ctx.fromDt.toISOString()} to ${ctx.toDt.toISOString()} | ${scope} | ${status}`,
330
+ ].join("\n\n");
331
+ allPanels.push({ vis: visMarkdown("Header", `${dashId}-header`, headerMd), w: GRID_W, h: HEADER_H });
332
+ // ── 2. Key metric tiles from pattern-count (top row) ──────────
333
+ const patternStep = ordered.find(id => playbook.steps[id].type === "pattern-count" && results.get(id)?.status === "success");
334
+ if (patternStep) {
335
+ const r = results.get(patternStep);
336
+ const patData = r.data;
337
+ const patterns = patData.patterns;
338
+ if (patterns) {
339
+ const nonZero = Object.entries(patterns).filter(([, v]) => v > 0);
340
+ for (const [name] of nonZero.slice(0, 6)) {
341
+ const query = REPORT_PATTERNS[name];
342
+ if (!query)
343
+ continue;
344
+ const safe = slug(name);
345
+ allPanels.push(metric(name, `${dashId}-keym-${safe}`, query, name));
346
+ }
347
+ // Second row of metrics if > 6
348
+ if (nonZero.length > 6) {
349
+ allPanels.push(ROW_BREAK);
350
+ for (const [name] of nonZero.slice(6)) {
351
+ const query = REPORT_PATTERNS[name];
352
+ if (!query)
353
+ continue;
354
+ const safe = slug(name);
355
+ allPanels.push(metric(name, `${dashId}-keym-${safe}`, query, name));
356
+ }
357
+ }
358
+ }
359
+ }
360
+ // ── 3. Per-step visual sections ───────────────────────────────
361
+ for (const stepId of ordered) {
362
+ const result = results.get(stepId);
363
+ if (!result || result.status !== "success")
364
+ continue;
365
+ const stepType = playbook.steps[stepId].type;
366
+ const mapper = STEP_MAPPERS[stepType] ?? mapGenericMarkdown;
367
+ const prefix = `${dashId}-${slug(stepId)}`;
368
+ const stepPanels = mapper(stepId, result, prefix, ctx);
369
+ if (stepPanels.length === 0)
370
+ continue;
371
+ allPanels.push(ROW_BREAK);
372
+ allPanels.push(...stepPanels);
373
+ }
374
+ // ── 4. Layout + build dashboard in one pass ───────────────────
375
+ const grid = new GridLayout();
376
+ const visList = [];
377
+ const panels = [];
378
+ const refs = [];
379
+ let idx = 0;
380
+ for (const sp of allPanels) {
381
+ if (sp.w === 0) {
382
+ grid.newRow();
383
+ continue;
384
+ }
385
+ const pos = grid.add(sp.w, sp.h);
386
+ const pid = `panel_${idx}`;
387
+ visList.push(sp.vis);
388
+ panels.push({
389
+ version: "2.17.1",
390
+ gridData: { ...pos, i: pid },
391
+ panelIndex: pid,
392
+ embeddableConfig: {},
393
+ panelRefName: pid,
394
+ });
395
+ refs.push({ name: pid, type: "visualization", id: sp.vis[0] });
396
+ idx++;
397
+ }
398
+ // ── 5. Upsert visualizations ──────────────────────────────────
399
+ process.stderr.write(` Uploading ${visList.length} visualizations...\n`);
400
+ let ok = 0;
401
+ for (const [visId, visBody] of visList) {
402
+ const [, success] = await this.repo.upsertSavedObject("visualization", visId, visBody);
403
+ if (success)
404
+ ok++;
405
+ }
406
+ // ── 6. Create dashboard ───────────────────────────────────────
407
+ const dashBody = {
408
+ attributes: {
409
+ title: dashTitle,
410
+ hits: 0,
411
+ description: `Auto-generated from playbook: ${playbook.name}`,
412
+ panelsJSON: JSON.stringify(panels),
413
+ optionsJSON: JSON.stringify({ useMargins: true, hidePanelTitles: false }),
414
+ timeRestore: true,
415
+ timeFrom: ctx.fromDt.toISOString(),
416
+ timeTo: ctx.toDt.toISOString(),
417
+ refreshInterval: { pause: false, value: 60000 },
418
+ kibanaSavedObjectMeta: {
419
+ searchSourceJSON: JSON.stringify({ query: { query: "", language: "kuery" }, filter: [] }),
420
+ },
421
+ },
422
+ references: refs,
423
+ };
424
+ process.stderr.write(" Creating dashboard object...\n");
425
+ const [action, success] = await this.repo.upsertSavedObject("dashboard", dashId, dashBody);
426
+ const url = `https://${host}/app/dashboards?security_tenant=global#/view/${dashId}`;
427
+ process.stderr.write(` ${action} — ${ok}/${visList.length} vis, dashboard ${success ? "OK" : "FAILED"}\n`);
428
+ if (!success || ok !== visList.length) {
429
+ process.stderr.write(` WARNING: Some objects failed to save\n`);
430
+ }
431
+ return url;
432
+ }
433
+ }
434
+ //# sourceMappingURL=playbook-dashboard.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playbook-dashboard.service.js","sourceRoot":"","sources":["../../src/services/playbook-dashboard.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Playbook service — DAG-based multi-step query orchestration.
3
+ *
4
+ * Loads a YAML playbook, builds a p-graph DAG from the steps,
5
+ * executes them with dependency ordering + bounded concurrency,
6
+ * and collects structured results.
7
+ */
8
+ import type { OpenSearchRepository } from "../repositories/index.js";
9
+ import type { Playbook, StepResult, PipelineContext } from "../interfaces/playbook.interfaces.js";
10
+ export declare function loadPlaybook(name: string): Playbook;
11
+ export declare function runPlaybook(playbook: Playbook, repo: OpenSearchRepository, ctx: PipelineContext, concurrency: number): Promise<Map<string, StepResult>>;
12
+ export declare function renderResults(playbook: Playbook, results: Map<string, StepResult>, json: boolean): void;
13
+ export { type Playbook, type StepResult, type PipelineContext };