@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,140 @@
1
+ /** Playbook runner types — DAG-based multi-step query orchestration. */
2
+ export type StepType = "search" | "count" | "histogram" | "timeline" | "errors" | "latency" | "services" | "dashboard" | "report" | "query" | "pattern-count";
3
+ export interface PlaybookDefaults {
4
+ env?: string;
5
+ hours?: number;
6
+ service?: string;
7
+ limit?: number;
8
+ interval?: string;
9
+ }
10
+ export interface StepRetry {
11
+ retries?: number;
12
+ minTimeout?: number;
13
+ }
14
+ export interface StepDef {
15
+ type: StepType;
16
+ description?: string;
17
+ depends_on?: string[];
18
+ args?: Record<string, unknown>;
19
+ retry?: StepRetry;
20
+ timeout?: number;
21
+ optional?: boolean;
22
+ }
23
+ export interface Playbook {
24
+ name: string;
25
+ description?: string;
26
+ defaults?: PlaybookDefaults;
27
+ steps: Record<string, StepDef>;
28
+ }
29
+ /** Data returned by search/query step handlers. */
30
+ export interface SearchStepData {
31
+ total: number;
32
+ hits: Array<{
33
+ id?: string;
34
+ timestamp?: string;
35
+ service?: string;
36
+ level?: string;
37
+ log: string;
38
+ }>;
39
+ }
40
+ /** Data returned by count step handler. */
41
+ export interface CountStepData {
42
+ total: number;
43
+ }
44
+ /** Data returned by histogram step handler. */
45
+ export interface HistogramStepData {
46
+ total: number;
47
+ buckets: Array<{
48
+ time: string;
49
+ count: number;
50
+ }>;
51
+ }
52
+ /** Data returned by errors step handler. */
53
+ export interface ErrorsStepData {
54
+ total: number;
55
+ by_status: Array<{
56
+ code: number;
57
+ count: number;
58
+ }>;
59
+ by_service: Array<{
60
+ service: string;
61
+ count: number;
62
+ }>;
63
+ by_endpoint: Array<{
64
+ endpoint: string;
65
+ count: number;
66
+ }>;
67
+ samples: Array<{
68
+ timestamp?: string;
69
+ service?: string;
70
+ level?: string;
71
+ status_code?: number;
72
+ log: string;
73
+ }>;
74
+ }
75
+ /** Data returned by latency step handler. */
76
+ export interface LatencyStepData {
77
+ latency: {
78
+ avg: number;
79
+ p50: number;
80
+ p95: number;
81
+ p99: number;
82
+ };
83
+ by_service: Array<{
84
+ service: string;
85
+ count: number;
86
+ avg: number;
87
+ p50: number;
88
+ p95: number;
89
+ p99: number;
90
+ }>;
91
+ }
92
+ /** Data returned by services step handler. */
93
+ export interface ServicesStepData {
94
+ services: Array<{
95
+ service: string;
96
+ total: number;
97
+ errors: number;
98
+ avg_ms: number;
99
+ p95_ms: number;
100
+ error_pct: number;
101
+ }>;
102
+ }
103
+ /** Data returned by dashboard step handler. */
104
+ export interface DashboardStepData {
105
+ total: number;
106
+ patterns: Record<string, number>;
107
+ }
108
+ /** Data returned by pattern-count step handler. */
109
+ export interface PatternCountStepData {
110
+ patterns: Record<string, number>;
111
+ total: number;
112
+ }
113
+ /** Union of all possible step data shapes. */
114
+ export type StepData = SearchStepData | CountStepData | HistogramStepData | ErrorsStepData | LatencyStepData | ServicesStepData | DashboardStepData | PatternCountStepData | Record<string, unknown>;
115
+ export interface StepResult {
116
+ stepId: string;
117
+ type: StepType;
118
+ status: "success" | "failed" | "skipped";
119
+ durationMs: number;
120
+ data: StepData;
121
+ summary: string[];
122
+ error?: string;
123
+ }
124
+ export interface PipelineContext {
125
+ results: Map<string, StepResult>;
126
+ index: string;
127
+ fromDt: Date;
128
+ toDt: Date;
129
+ defaults: PlaybookDefaults;
130
+ }
131
+ export interface PlaybookArgs {
132
+ playbook: string;
133
+ env: string;
134
+ hours: number;
135
+ service?: string;
136
+ limit: number;
137
+ concurrency: number;
138
+ json: boolean;
139
+ dashboard: boolean;
140
+ }
@@ -0,0 +1,3 @@
1
+ /** Playbook runner types — DAG-based multi-step query orchestration. */
2
+ export {};
3
+ //# sourceMappingURL=playbook.interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playbook.interfaces.js","sourceRoot":"","sources":["../../src/interfaces/playbook.interfaces.ts"],"names":[],"mappings":"AAAA,wEAAwE"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * CLI entry point — OSD alerting monitor management + health report cards.
3
+ *
4
+ * Usage:
5
+ * node dist/os-alert.js --mode create --profile production-incidents
6
+ * node dist/os-alert.js --mode create --profile production-incidents --dry-run
7
+ * node dist/os-alert.js --mode create --profile service-health --service deal_structure
8
+ * node dist/os-alert.js --mode create --profile production-incidents --monitor high_500_rate
9
+ * node dist/os-alert.js --mode list
10
+ * node dist/os-alert.js --mode list --profile production-incidents
11
+ * node dist/os-alert.js --mode test --profile production-incidents --monitor high_500_rate
12
+ * node dist/os-alert.js --mode test --profile production-incidents
13
+ * node dist/os-alert.js --mode delete --profile production-incidents
14
+ * node dist/os-alert.js --mode report --webhook-url "https://..." --hours 1
15
+ * node dist/os-alert.js --mode report --webhook-url "https://..." --service deal_structure
16
+ */
17
+ export {};
@@ -0,0 +1,245 @@
1
+ /**
2
+ * CLI entry point — OSD alerting monitor management + health report cards.
3
+ *
4
+ * Usage:
5
+ * node dist/os-alert.js --mode create --profile production-incidents
6
+ * node dist/os-alert.js --mode create --profile production-incidents --dry-run
7
+ * node dist/os-alert.js --mode create --profile service-health --service deal_structure
8
+ * node dist/os-alert.js --mode create --profile production-incidents --monitor high_500_rate
9
+ * node dist/os-alert.js --mode list
10
+ * node dist/os-alert.js --mode list --profile production-incidents
11
+ * node dist/os-alert.js --mode test --profile production-incidents --monitor high_500_rate
12
+ * node dist/os-alert.js --mode test --profile production-incidents
13
+ * node dist/os-alert.js --mode delete --profile production-incidents
14
+ * node dist/os-alert.js --mode report --webhook-url "https://..." --hours 1
15
+ * node dist/os-alert.js --mode report --webhook-url "https://..." --service deal_structure
16
+ */
17
+ import { loadConfig, loadAlertConfig, resolveIndex, parseTimeRange, parseArgs } from "./utils/index.js";
18
+ import { createOpenSearchRepository } from "./repositories/index.js";
19
+ import { AlertService } from "./services/alert.service.js";
20
+ import { GChatService } from "./services/gchat.service.js";
21
+ async function main() {
22
+ const args = parseArgs({
23
+ mode: { short: "m", type: "string", required: true, choices: ["create", "list", "test", "delete", "report"] },
24
+ profile: { short: "p", type: "string" },
25
+ monitor: { type: "string" },
26
+ service: { short: "s", type: "string" },
27
+ dashboardUrl: { type: "string" },
28
+ webhookUrl: { short: "w", type: "string" },
29
+ env: { short: "e", type: "string", default: "production", choices: ["production", "staging"] },
30
+ hours: { short: "h", type: "number", default: 1 },
31
+ dryRun: { type: "boolean" },
32
+ json: { type: "boolean" },
33
+ });
34
+ const config = loadConfig();
35
+ const alertConfig = loadAlertConfig();
36
+ const repo = createOpenSearchRepository(config);
37
+ const alertService = new AlertService(repo);
38
+ // Webhook URL: CLI flag > env var
39
+ const webhookUrl = args.webhookUrl ?? alertConfig.gchatWebhookUrl;
40
+ switch (args.mode) {
41
+ case "create":
42
+ await modeCreate(alertService, webhookUrl, args);
43
+ break;
44
+ case "list":
45
+ await modeList(alertService, args);
46
+ break;
47
+ case "test":
48
+ await modeTest(alertService, webhookUrl, args);
49
+ break;
50
+ case "delete":
51
+ await modeDelete(alertService, args);
52
+ break;
53
+ case "report":
54
+ await modeReport(alertService, webhookUrl, args);
55
+ break;
56
+ }
57
+ }
58
+ // ── Mode: Create ────────────────────────────────────────────────────────
59
+ async function modeCreate(svc, webhookUrl, args) {
60
+ if (!args.profile) {
61
+ console.error("ERROR: --profile is required for create mode");
62
+ process.exit(1);
63
+ }
64
+ const profile = svc.loadProfile(args.profile);
65
+ const context = svc.buildContext(profile, {
66
+ service: args.service,
67
+ dashboardUrl: args.dashboardUrl,
68
+ env: args.env,
69
+ });
70
+ if (args.dryRun) {
71
+ const effectiveUrl = webhookUrl ?? "https://chat.googleapis.com/v1/spaces/EXAMPLE/messages?key=KEY&token=TOKEN";
72
+ const payloads = svc.dryRunMonitors(profile, effectiveUrl, context, args.env, args.monitor);
73
+ if (args.json) {
74
+ console.log(JSON.stringify(payloads.map(([key, payload]) => ({ key, payload })), null, 2));
75
+ }
76
+ else {
77
+ console.log(`\n Dry Run — Profile: ${profile.name}`);
78
+ console.log(` Monitors: ${payloads.length}\n`);
79
+ for (const [key, payload] of payloads) {
80
+ console.log(` --- ${key} ---`);
81
+ console.log(` Name: ${payload.name}`);
82
+ console.log(` Schedule: every ${payload.schedule.period.interval} ${payload.schedule.period.unit}`);
83
+ console.log(` Index: ${payload.inputs[0].search.indices[0]}`);
84
+ console.log(` Trigger: ${payload.triggers[0].name} (severity ${payload.triggers[0].severity})`);
85
+ console.log(` Condition: ${payload.triggers[0].condition.script.source}`);
86
+ console.log(` Throttle: ${payload.triggers[0].actions[0].throttle_enabled ? `${payload.triggers[0].actions[0].throttle?.value} ${payload.triggers[0].actions[0].throttle?.unit}` : "disabled"}`);
87
+ console.log("");
88
+ }
89
+ }
90
+ return;
91
+ }
92
+ if (!webhookUrl) {
93
+ console.error("ERROR: GCHAT_WEBHOOK_URL or --webhook-url is required for create mode");
94
+ process.exit(1);
95
+ }
96
+ const results = await svc.createMonitors(profile, webhookUrl, context, args.env, args.monitor);
97
+ if (args.json) {
98
+ console.log(JSON.stringify(results.map(([key, id, ok]) => ({ key, id, success: ok })), null, 2));
99
+ }
100
+ else {
101
+ console.log(`\n Profile: ${profile.name}`);
102
+ for (const [key, id, ok] of results) {
103
+ const status = ok ? "OK" : "FAILED";
104
+ console.log(` ${status.padEnd(8)} ${key.padEnd(30)} ${id}`);
105
+ }
106
+ console.log("");
107
+ }
108
+ }
109
+ // ── Mode: List ──────────────────────────────────────────────────────────
110
+ async function modeList(svc, args) {
111
+ const monitors = await svc.listMonitors(args.profile);
112
+ if (args.json) {
113
+ console.log(JSON.stringify(monitors, null, 2));
114
+ return;
115
+ }
116
+ if (monitors.length === 0) {
117
+ console.log("\n No monitors found.\n");
118
+ return;
119
+ }
120
+ console.log(`\n Monitors${args.profile ? ` (profile: ${args.profile})` : ""}:`);
121
+ console.log(` ${"Name".padEnd(50)} ${"ID".padEnd(24)} Enabled`);
122
+ console.log(` ${"─".repeat(50)} ${"─".repeat(24)} ${"─".repeat(7)}`);
123
+ for (const mon of monitors) {
124
+ const enabled = mon.enabled ? "yes" : "no";
125
+ console.log(` ${mon.name.padEnd(50)} ${mon.id.padEnd(24)} ${enabled}`);
126
+ }
127
+ console.log("");
128
+ }
129
+ // ── Mode: Test ──────────────────────────────────────────────────────────
130
+ async function modeTest(svc, webhookUrl, args) {
131
+ if (!args.profile) {
132
+ console.error("ERROR: --profile is required for test mode");
133
+ process.exit(1);
134
+ }
135
+ // If a specific monitor is given, dry-run execute it on OSD
136
+ if (args.monitor) {
137
+ console.log(`\n Executing monitor: oslog-${args.profile}-${args.monitor}`);
138
+ try {
139
+ const result = await svc.executeMonitor(args.profile, args.monitor);
140
+ if (args.json) {
141
+ console.log(JSON.stringify(result, null, 2));
142
+ }
143
+ else {
144
+ if (!result) {
145
+ console.log(" Execute returned no result.\n");
146
+ return;
147
+ }
148
+ const triggered = Object.values(result.trigger_results).some(t => t.triggered);
149
+ console.log(` Triggered: ${triggered ? "YES" : "no"}`);
150
+ const hits = result.input_results?.results?.[0]?.query;
151
+ if (hits) {
152
+ console.log(` Query result: ${JSON.stringify(hits).slice(0, 200)}`);
153
+ }
154
+ console.log("");
155
+ }
156
+ }
157
+ catch (err) {
158
+ const msg = err instanceof Error ? err.message : String(err);
159
+ console.error(` ERROR: ${msg}\n`);
160
+ process.exit(1);
161
+ }
162
+ return;
163
+ }
164
+ // No specific monitor — test webhook delivery
165
+ if (!webhookUrl) {
166
+ console.error("ERROR: GCHAT_WEBHOOK_URL or --webhook-url is required for webhook test");
167
+ process.exit(1);
168
+ }
169
+ console.log(`\n Testing webhook for profile: ${args.profile}`);
170
+ const ok = await GChatService.testWebhook(webhookUrl, args.profile);
171
+ console.log(` Result: ${ok ? "OK — card delivered" : "FAILED — check webhook URL"}\n`);
172
+ if (!ok)
173
+ process.exit(1);
174
+ }
175
+ // ── Mode: Delete ────────────────────────────────────────────────────────
176
+ async function modeDelete(svc, args) {
177
+ if (!args.profile) {
178
+ console.error("ERROR: --profile is required for delete mode");
179
+ process.exit(1);
180
+ }
181
+ const results = await svc.deleteMonitors(args.profile);
182
+ if (args.json) {
183
+ console.log(JSON.stringify(results.map(([name, ok]) => ({ name, deleted: ok })), null, 2));
184
+ return;
185
+ }
186
+ if (results.length === 0) {
187
+ console.log(`\n No monitors found for profile: ${args.profile}\n`);
188
+ return;
189
+ }
190
+ console.log(`\n Deleting monitors for profile: ${args.profile}`);
191
+ for (const [name, ok] of results) {
192
+ console.log(` ${ok ? "DELETED" : "FAILED "} ${name}`);
193
+ }
194
+ console.log("");
195
+ }
196
+ // ── Mode: Report ────────────────────────────────────────────────────────
197
+ async function modeReport(svc, webhookUrl, args) {
198
+ if (!webhookUrl) {
199
+ console.error("ERROR: GCHAT_WEBHOOK_URL or --webhook-url is required for report mode");
200
+ process.exit(1);
201
+ }
202
+ const [fromDt, toDt] = parseTimeRange({ hours: args.hours });
203
+ const index = resolveIndex(args.env, fromDt, toDt);
204
+ process.stderr.write(`\n Gathering health report...\n`);
205
+ process.stderr.write(` Environment: ${args.env}\n`);
206
+ process.stderr.write(` Index: ${index}\n`);
207
+ process.stderr.write(` Window: ${fromDt.toISOString()} → ${toDt.toISOString()}\n`);
208
+ if (args.service)
209
+ process.stderr.write(` Service filter: ${args.service}\n`);
210
+ process.stderr.write("\n");
211
+ const report = await svc.gatherHealthReport(index, fromDt, toDt, args.env, args.service);
212
+ if (args.json) {
213
+ console.log(JSON.stringify(report, null, 2));
214
+ return;
215
+ }
216
+ if (args.dryRun) {
217
+ const card = GChatService.buildHealthReportCard(report);
218
+ console.log(JSON.stringify(card, null, 2));
219
+ return;
220
+ }
221
+ // Print summary to stderr
222
+ process.stderr.write(` Status: ${report.status}\n`);
223
+ process.stderr.write(` Total logs: ${report.totalLogs.toLocaleString()}\n`);
224
+ process.stderr.write(` Total errors: ${report.totalErrors.toLocaleString()}\n`);
225
+ if (report.serviceErrors.length > 0) {
226
+ process.stderr.write(` Top offender: ${report.serviceErrors[0].service} (${report.serviceErrors[0].count} errors)\n`);
227
+ }
228
+ if (report.latency) {
229
+ process.stderr.write(` Latency P95: ${report.latency.p95.toLocaleString()} ms\n`);
230
+ }
231
+ process.stderr.write("\n Sending card to Google Chat...\n");
232
+ const ok = await GChatService.sendHealthReport(webhookUrl, report);
233
+ if (ok) {
234
+ process.stderr.write(" Card delivered successfully!\n\n");
235
+ }
236
+ else {
237
+ console.error(" FAILED — check webhook URL\n");
238
+ process.exit(1);
239
+ }
240
+ }
241
+ // ── Entry ───────────────────────────────────────────────────────────────
242
+ if (import.meta.url === `file://${process.argv[1]}`) {
243
+ main();
244
+ }
245
+ //# sourceMappingURL=os-alert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"os-alert.js","sourceRoot":"","sources":["../src/os-alert.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * CLI entry point — YAML-driven OSD dashboard generator.
3
+ *
4
+ * Usage:
5
+ * node dist/os-dash.js --mode create --config langfuse-usage
6
+ * node dist/os-dash.js --mode create --config langfuse-usage --dry-run
7
+ * node dist/os-dash.js --mode delete --config langfuse-usage
8
+ */
9
+ export {};
@@ -0,0 +1,53 @@
1
+ /**
2
+ * CLI entry point — YAML-driven OSD dashboard generator.
3
+ *
4
+ * Usage:
5
+ * node dist/os-dash.js --mode create --config langfuse-usage
6
+ * node dist/os-dash.js --mode create --config langfuse-usage --dry-run
7
+ * node dist/os-dash.js --mode delete --config langfuse-usage
8
+ */
9
+ import { loadConfig, parseArgs } from "./utils/index.js";
10
+ import { createOpenSearchRepository } from "./repositories/index.js";
11
+ import { DashboardGenService } from "./services/dashboard-gen.service.js";
12
+ async function main() {
13
+ const args = parseArgs({
14
+ mode: { short: "m", type: "string", required: true, choices: ["create", "delete"] },
15
+ config: { short: "c", type: "string", required: true },
16
+ dryRun: { type: "boolean" },
17
+ });
18
+ const config = loadConfig();
19
+ const repo = createOpenSearchRepository(config);
20
+ const svc = new DashboardGenService(repo);
21
+ const dashConfig = svc.loadConfig(args.config);
22
+ if (args.mode === "create") {
23
+ if (args.dryRun) {
24
+ const { vizList, panels, dashId } = svc.build(dashConfig);
25
+ console.log(`\n Dry Run — Dashboard: ${dashConfig.title}`);
26
+ console.log(` ID: ${dashId}`);
27
+ console.log(` Visualizations: ${vizList.length}`);
28
+ console.log(` Panels: ${panels.length}\n`);
29
+ for (const [visId, visBody] of vizList) {
30
+ const title = String(visBody.attributes.title ?? visId);
31
+ console.log(` ${visId.padEnd(40)} ${title}`);
32
+ }
33
+ console.log("");
34
+ return;
35
+ }
36
+ process.stderr.write(`\n Creating dashboard: ${dashConfig.title}\n`);
37
+ const result = await svc.create(dashConfig);
38
+ process.stderr.write(` Visualizations: ${result.vizOk}/${result.vizTotal}\n`);
39
+ process.stderr.write(` Dashboard: ${result.dashOk ? "OK" : "FAILED"}\n`);
40
+ process.stderr.write(`\n URL: ${result.url}\n\n`);
41
+ if (!result.dashOk)
42
+ process.exit(1);
43
+ }
44
+ else if (args.mode === "delete") {
45
+ process.stderr.write(`\n Deleting dashboard: ${dashConfig.title}\n`);
46
+ const count = await svc.delete(dashConfig);
47
+ process.stderr.write(` Deleted ${count} objects\n\n`);
48
+ }
49
+ }
50
+ if (import.meta.url === `file://${process.argv[1]}`) {
51
+ main();
52
+ }
53
+ //# sourceMappingURL=os-dash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"os-dash.js","sourceRoot":"","sources":["../src/os-dash.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * CLI entry point — production monitoring dashboards.
3
+ *
4
+ * 4 modes: post-deploy, incident-watch, spotlight, compare
5
+ *
6
+ * Usage:
7
+ * node dist/os-monitor.js --mode post-deploy --minutes 15
8
+ * node dist/os-monitor.js --mode incident-watch --hours 1
9
+ * node dist/os-monitor.js --mode spotlight --service deal_structure --hours 1
10
+ * node dist/os-monitor.js --mode compare --from1 ... --to1 ... --from2 ... --to2 ...
11
+ */
12
+ export {};
@@ -0,0 +1,59 @@
1
+ /**
2
+ * CLI entry point — production monitoring dashboards.
3
+ *
4
+ * 4 modes: post-deploy, incident-watch, spotlight, compare
5
+ *
6
+ * Usage:
7
+ * node dist/os-monitor.js --mode post-deploy --minutes 15
8
+ * node dist/os-monitor.js --mode incident-watch --hours 1
9
+ * node dist/os-monitor.js --mode spotlight --service deal_structure --hours 1
10
+ * node dist/os-monitor.js --mode compare --from1 ... --to1 ... --from2 ... --to2 ...
11
+ */
12
+ import { loadConfig, parseArgs } from "./utils/index.js";
13
+ import { createOpenSearchRepository } from "./repositories/index.js";
14
+ import { MonitorService } from "./services/index.js";
15
+ async function main() {
16
+ const args = parseArgs({
17
+ mode: { short: "m", type: "string", required: true, choices: ["post-deploy", "incident-watch", "spotlight", "compare"] },
18
+ service: { short: "s", type: "string" },
19
+ hours: { type: "number" },
20
+ minutes: { type: "number" },
21
+ watch: { type: "number" },
22
+ from1: { type: "string" },
23
+ to1: { type: "string" },
24
+ from2: { type: "string" },
25
+ to2: { type: "string" },
26
+ });
27
+ const config = loadConfig();
28
+ const repo = createOpenSearchRepository(config);
29
+ const service = new MonitorService(repo);
30
+ const runOnce = async () => {
31
+ switch (args.mode) {
32
+ case "post-deploy": return service.modePostDeploy(args);
33
+ case "incident-watch": return service.modeIncidentWatch(args);
34
+ case "spotlight": return service.modeSpotlight(args);
35
+ case "compare": return service.modeCompare(args);
36
+ }
37
+ };
38
+ if (args.watch) {
39
+ const sleep = (ms) => new Promise(r => setTimeout(r, ms));
40
+ try {
41
+ while (true) {
42
+ process.stdout.write("\x1B[2J\x1B[H");
43
+ await runOnce();
44
+ console.log(` [Refreshing every ${args.watch}s — Ctrl+C to stop]`);
45
+ await sleep(args.watch * 1000);
46
+ }
47
+ }
48
+ catch {
49
+ console.log("\n Monitoring stopped.");
50
+ }
51
+ }
52
+ else {
53
+ await runOnce();
54
+ }
55
+ }
56
+ if (import.meta.url === `file://${process.argv[1]}`) {
57
+ main();
58
+ }
59
+ //# sourceMappingURL=os-monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"os-monitor.js","sourceRoot":"","sources":["../src/os-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,SAAS,CAAc;QAClC,IAAI,EAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE;QAC3H,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE;QACvC,KAAK,EAAI,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC3B,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC3B,KAAK,EAAI,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC3B,KAAK,EAAI,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC3B,GAAG,EAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC3B,KAAK,EAAI,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC3B,GAAG,EAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC5B,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,IAAI,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;IAEzC,MAAM,OAAO,GAAG,KAAK,IAAmB,EAAE;QACxC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,aAAa,CAAC,CAAC,OAAO,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YACxD,KAAK,gBAAgB,CAAC,CAAC,OAAO,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAC9D,KAAK,WAAW,CAAC,CAAC,OAAO,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YACrD,KAAK,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC;YACH,OAAO,IAAI,EAAE,CAAC;gBACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;gBACtC,MAAM,OAAO,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,CAAC,KAAK,qBAAqB,CAAC,CAAC;gBACpE,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACpD,IAAI,EAAE,CAAC;AACT,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * CLI entry point — DAG-based playbook runner for OpenSearch queries.
3
+ *
4
+ * Usage:
5
+ * node dist/os-playbook.js --playbook incident-triage --hours 1
6
+ * node dist/os-playbook.js --playbook service-deep-dive --service deal_structure --hours 2
7
+ * node dist/os-playbook.js --playbook post-deploy-validation --json
8
+ */
9
+ export {};