@prism-d1/cli 1.0.67 → 1.0.69
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/dist/assets/infra/lib/constructs/otel-collector-construct.ts +7 -2
- package/dist/assets/infra/lib/dashboard-stack.ts +11 -7
- package/dist/assets/infra/package.json +1 -0
- package/dist/src/commands/bootstrapper/setup-otel-sync.d.ts +15 -0
- package/dist/src/commands/bootstrapper/setup-otel-sync.d.ts.map +1 -0
- package/dist/src/commands/bootstrapper/setup-otel-sync.js +345 -0
- package/dist/src/commands/bootstrapper/setup-otel-sync.js.map +1 -0
- package/package.json +1 -1
|
@@ -287,16 +287,21 @@ export class OtelCollectorConstruct extends Construct {
|
|
|
287
287
|
|
|
288
288
|
// -------------------------------------------------------
|
|
289
289
|
// Outputs — everything needed to run `codeburn sync setup <url>`
|
|
290
|
+
// Logical IDs are overridden so the deploy output keys match the
|
|
291
|
+
// README verbatim (construct nesting would otherwise mangle them to
|
|
292
|
+
// OtelCollectorOtelCollectorUrl<hash>).
|
|
290
293
|
// -------------------------------------------------------
|
|
291
|
-
new cdk.CfnOutput(this, 'OtelCollectorUrl', {
|
|
294
|
+
const urlOutput = new cdk.CfnOutput(this, 'OtelCollectorUrl', {
|
|
292
295
|
value: this.httpApi.apiEndpoint,
|
|
293
296
|
description: 'Run: codeburn sync setup <this URL>',
|
|
294
297
|
});
|
|
298
|
+
urlOutput.overrideLogicalId('OtelCollectorUrl');
|
|
295
299
|
if (this.userPool) {
|
|
296
|
-
new cdk.CfnOutput(this, 'OtelUserPoolId', {
|
|
300
|
+
const poolOutput = new cdk.CfnOutput(this, 'OtelUserPoolId', {
|
|
297
301
|
value: this.userPool.userPoolId,
|
|
298
302
|
description: 'Create users: aws cognito-idp admin-create-user --user-pool-id <this> --username <email>',
|
|
299
303
|
});
|
|
304
|
+
poolOutput.overrideLogicalId('OtelUserPoolId');
|
|
300
305
|
}
|
|
301
306
|
}
|
|
302
307
|
}
|
|
@@ -193,7 +193,7 @@ export class DashboardStack extends cdk.Stack {
|
|
|
193
193
|
namespace: METRIC_NAMESPACE,
|
|
194
194
|
metricName: 'AIInputTokens',
|
|
195
195
|
statistic: 'Sum',
|
|
196
|
-
period:
|
|
196
|
+
period: cdk.Duration.days(1),
|
|
197
197
|
label: 'Input Tokens',
|
|
198
198
|
}),
|
|
199
199
|
],
|
|
@@ -208,7 +208,7 @@ export class DashboardStack extends cdk.Stack {
|
|
|
208
208
|
namespace: METRIC_NAMESPACE,
|
|
209
209
|
metricName: 'AIOutputTokens',
|
|
210
210
|
statistic: 'Sum',
|
|
211
|
-
period:
|
|
211
|
+
period: cdk.Duration.days(1),
|
|
212
212
|
label: 'Output Tokens',
|
|
213
213
|
}),
|
|
214
214
|
],
|
|
@@ -223,7 +223,7 @@ export class DashboardStack extends cdk.Stack {
|
|
|
223
223
|
namespace: METRIC_NAMESPACE,
|
|
224
224
|
metricName: 'AICostUSD',
|
|
225
225
|
statistic: 'Sum',
|
|
226
|
-
period:
|
|
226
|
+
period: cdk.Duration.days(1),
|
|
227
227
|
label: 'Cost (USD)',
|
|
228
228
|
}),
|
|
229
229
|
],
|
|
@@ -245,8 +245,10 @@ export class DashboardStack extends cdk.Stack {
|
|
|
245
245
|
new cloudwatch.MathExpression({
|
|
246
246
|
expression: `SEARCH('{${METRIC_NAMESPACE},Tool} MetricName="AICostUSD"', 'Sum')`,
|
|
247
247
|
usingMetrics: {},
|
|
248
|
-
label:
|
|
249
|
-
|
|
248
|
+
// Dynamic label: each discovered series is legend-labeled with
|
|
249
|
+
// its Tool dimension value (e.g. "claude-code").
|
|
250
|
+
label: "${PROP('Dim.Tool')}",
|
|
251
|
+
period: cdk.Duration.days(1),
|
|
250
252
|
}),
|
|
251
253
|
],
|
|
252
254
|
width: 12,
|
|
@@ -260,8 +262,10 @@ export class DashboardStack extends cdk.Stack {
|
|
|
260
262
|
new cloudwatch.MathExpression({
|
|
261
263
|
expression: `SEARCH('{${METRIC_NAMESPACE},Model} MetricName="AICostUSD"', 'Sum')`,
|
|
262
264
|
usingMetrics: {},
|
|
263
|
-
label:
|
|
264
|
-
|
|
265
|
+
// Dynamic label: each discovered series is legend-labeled with
|
|
266
|
+
// its Model dimension value (e.g. "claude-sonnet-4-5-20250929").
|
|
267
|
+
label: "${PROP('Dim.Model')}",
|
|
268
|
+
period: cdk.Duration.days(1),
|
|
265
269
|
}),
|
|
266
270
|
],
|
|
267
271
|
width: 12,
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
declare const _default: {
|
|
2
|
+
description: string;
|
|
3
|
+
options: {
|
|
4
|
+
flags: string;
|
|
5
|
+
description: string;
|
|
6
|
+
}[];
|
|
7
|
+
action(opts: {
|
|
8
|
+
url?: string;
|
|
9
|
+
interval?: string;
|
|
10
|
+
status?: boolean;
|
|
11
|
+
remove?: boolean;
|
|
12
|
+
}): Promise<void>;
|
|
13
|
+
};
|
|
14
|
+
export default _default;
|
|
15
|
+
//# sourceMappingURL=setup-otel-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-otel-sync.d.ts","sourceRoot":"","sources":["../../../../src/commands/bootstrapper/setup-otel-sync.ts"],"names":[],"mappings":";;;;;;iBA4PqB;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE;;AAR5F,wBAiIE"}
|
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { createInterface } from 'node:readline';
|
|
3
|
+
import { platform, homedir } from 'node:os';
|
|
4
|
+
import { existsSync, mkdirSync, writeFileSync, readFileSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
function prompt(question, defaultValue) {
|
|
7
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
8
|
+
const suffix = defaultValue ? ` [${defaultValue}]` : '';
|
|
9
|
+
return new Promise((resolve) => {
|
|
10
|
+
rl.question(`${question}${suffix}: `, (answer) => {
|
|
11
|
+
rl.close();
|
|
12
|
+
resolve(answer.trim() || defaultValue || '');
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
function run(cmd) {
|
|
17
|
+
try {
|
|
18
|
+
const stdout = execSync(cmd, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
19
|
+
return { ok: true, stdout, stderr: '' };
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
return { ok: false, stdout: '', stderr: (err.stderr || err.message || '').trim() };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// ---- Constants ----
|
|
26
|
+
const CRON_MARKER = '# prism-otel-sync';
|
|
27
|
+
const PLIST_LABEL = 'com.prism.otel-sync';
|
|
28
|
+
const SCHTASK_NAME = 'PrismOtelSync';
|
|
29
|
+
const LOG_DIR = join(homedir(), '.prism', 'logs');
|
|
30
|
+
// ---- Scheduler helpers per OS ----
|
|
31
|
+
function getCodeburnPath() {
|
|
32
|
+
const which = platform() === 'win32' ? 'where codeburn' : 'which codeburn';
|
|
33
|
+
const result = run(which);
|
|
34
|
+
return result.ok ? result.stdout.split('\n')[0] : null;
|
|
35
|
+
}
|
|
36
|
+
function buildSyncCommand(codeburnPath, since) {
|
|
37
|
+
return `${codeburnPath} sync push --since ${since}`;
|
|
38
|
+
}
|
|
39
|
+
// ---- Linux: user crontab ----
|
|
40
|
+
function linuxScheduleExists() {
|
|
41
|
+
if (!linuxCrontabAvailable())
|
|
42
|
+
return false;
|
|
43
|
+
const result = run('crontab -l');
|
|
44
|
+
return result.ok && result.stdout.includes(CRON_MARKER);
|
|
45
|
+
}
|
|
46
|
+
function linuxCrontabAvailable() {
|
|
47
|
+
return run('which crontab').ok;
|
|
48
|
+
}
|
|
49
|
+
function linuxInstallSchedule(codeburnPath, intervalHours) {
|
|
50
|
+
if (!linuxCrontabAvailable()) {
|
|
51
|
+
console.warn('\n⚠️ crontab not found — skipping automatic schedule installation.');
|
|
52
|
+
console.warn(' Run "codeburn sync push --since 7d" manually, or install cronie:');
|
|
53
|
+
console.warn(' sudo yum install cronie -y # then re-run this command\n');
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const existing = run('crontab -l');
|
|
57
|
+
const lines = existing.ok ? existing.stdout.split('\n').filter(l => !l.includes(CRON_MARKER)) : [];
|
|
58
|
+
const logFile = join(LOG_DIR, 'otel-sync.log');
|
|
59
|
+
const cronExpr = `0 */${intervalHours} * * *`;
|
|
60
|
+
lines.push(`${CRON_MARKER}`);
|
|
61
|
+
lines.push(`${cronExpr} ${buildSyncCommand(codeburnPath, '7d')} >> ${logFile} 2>&1`);
|
|
62
|
+
const tmpFile = '/tmp/prism-crontab.tmp';
|
|
63
|
+
writeFileSync(tmpFile, lines.join('\n') + '\n');
|
|
64
|
+
const result = run(`crontab ${tmpFile}`);
|
|
65
|
+
if (!result.ok)
|
|
66
|
+
throw new Error(`Failed to install crontab: ${result.stderr}`);
|
|
67
|
+
}
|
|
68
|
+
function linuxRemoveSchedule() {
|
|
69
|
+
if (!linuxCrontabAvailable())
|
|
70
|
+
return;
|
|
71
|
+
const existing = run('crontab -l');
|
|
72
|
+
if (!existing.ok)
|
|
73
|
+
return;
|
|
74
|
+
const lines = existing.stdout.split('\n').filter(l => !l.includes(CRON_MARKER) && !l.includes('codeburn sync push'));
|
|
75
|
+
const tmpFile = '/tmp/prism-crontab.tmp';
|
|
76
|
+
writeFileSync(tmpFile, lines.join('\n') + '\n');
|
|
77
|
+
run(`crontab ${tmpFile}`);
|
|
78
|
+
}
|
|
79
|
+
// ---- macOS: LaunchAgent ----
|
|
80
|
+
function darwinPlistPath() {
|
|
81
|
+
return join(homedir(), 'Library', 'LaunchAgents', `${PLIST_LABEL}.plist`);
|
|
82
|
+
}
|
|
83
|
+
function darwinScheduleExists() {
|
|
84
|
+
return existsSync(darwinPlistPath());
|
|
85
|
+
}
|
|
86
|
+
function darwinInstallSchedule(codeburnPath, intervalHours) {
|
|
87
|
+
const logFile = join(LOG_DIR, 'otel-sync.log');
|
|
88
|
+
const plist = `<?xml version="1.0" encoding="UTF-8"?>
|
|
89
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
90
|
+
<plist version="1.0">
|
|
91
|
+
<dict>
|
|
92
|
+
<key>Label</key>
|
|
93
|
+
<string>${PLIST_LABEL}</string>
|
|
94
|
+
<key>ProgramArguments</key>
|
|
95
|
+
<array>
|
|
96
|
+
<string>${codeburnPath}</string>
|
|
97
|
+
<string>sync</string>
|
|
98
|
+
<string>push</string>
|
|
99
|
+
<string>--since</string>
|
|
100
|
+
<string>7d</string>
|
|
101
|
+
</array>
|
|
102
|
+
<key>StartInterval</key>
|
|
103
|
+
<integer>${intervalHours * 3600}</integer>
|
|
104
|
+
<key>StandardOutPath</key>
|
|
105
|
+
<string>${logFile}</string>
|
|
106
|
+
<key>StandardErrorPath</key>
|
|
107
|
+
<string>${logFile}</string>
|
|
108
|
+
<key>RunAtLoad</key>
|
|
109
|
+
<true/>
|
|
110
|
+
</dict>
|
|
111
|
+
</plist>`;
|
|
112
|
+
const plistPath = darwinPlistPath();
|
|
113
|
+
mkdirSync(join(homedir(), 'Library', 'LaunchAgents'), { recursive: true });
|
|
114
|
+
writeFileSync(plistPath, plist);
|
|
115
|
+
run(`launchctl unload ${plistPath} 2>/dev/null`);
|
|
116
|
+
const result = run(`launchctl load ${plistPath}`);
|
|
117
|
+
if (!result.ok)
|
|
118
|
+
throw new Error(`Failed to load LaunchAgent: ${result.stderr}`);
|
|
119
|
+
}
|
|
120
|
+
function darwinRemoveSchedule() {
|
|
121
|
+
const plistPath = darwinPlistPath();
|
|
122
|
+
if (existsSync(plistPath)) {
|
|
123
|
+
run(`launchctl unload ${plistPath}`);
|
|
124
|
+
run(`rm ${plistPath}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// ---- Windows: schtasks ----
|
|
128
|
+
function windowsScheduleExists() {
|
|
129
|
+
const result = run(`schtasks /query /tn ${SCHTASK_NAME} /fo CSV`);
|
|
130
|
+
return result.ok;
|
|
131
|
+
}
|
|
132
|
+
function windowsInstallSchedule(codeburnPath, intervalHours) {
|
|
133
|
+
const logFile = join(LOG_DIR, 'otel-sync.log');
|
|
134
|
+
const cmd = `${codeburnPath} sync push --since 7d >> "${logFile}" 2>&1`;
|
|
135
|
+
const result = run(`schtasks /create /tn ${SCHTASK_NAME} /sc hourly /mo ${intervalHours} ` +
|
|
136
|
+
`/tr "cmd /c ${cmd.replace(/"/g, '\\"')}" /f`);
|
|
137
|
+
if (!result.ok)
|
|
138
|
+
throw new Error(`Failed to create scheduled task: ${result.stderr}`);
|
|
139
|
+
}
|
|
140
|
+
function windowsRemoveSchedule() {
|
|
141
|
+
run(`schtasks /delete /tn ${SCHTASK_NAME} /f`);
|
|
142
|
+
}
|
|
143
|
+
// ---- Unified scheduler interface ----
|
|
144
|
+
function scheduleExists() {
|
|
145
|
+
switch (platform()) {
|
|
146
|
+
case 'darwin': return darwinScheduleExists();
|
|
147
|
+
case 'win32': return windowsScheduleExists();
|
|
148
|
+
default: return linuxScheduleExists();
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
function installSchedule(codeburnPath, intervalHours) {
|
|
152
|
+
mkdirSync(LOG_DIR, { recursive: true });
|
|
153
|
+
switch (platform()) {
|
|
154
|
+
case 'darwin': return darwinInstallSchedule(codeburnPath, intervalHours);
|
|
155
|
+
case 'win32': return windowsInstallSchedule(codeburnPath, intervalHours);
|
|
156
|
+
default: return linuxInstallSchedule(codeburnPath, intervalHours);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function removeSchedule() {
|
|
160
|
+
switch (platform()) {
|
|
161
|
+
case 'darwin': return darwinRemoveSchedule();
|
|
162
|
+
case 'win32': return windowsRemoveSchedule();
|
|
163
|
+
default: return linuxRemoveSchedule();
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function schedulerName() {
|
|
167
|
+
switch (platform()) {
|
|
168
|
+
case 'darwin': return 'LaunchAgent';
|
|
169
|
+
case 'win32': return 'Scheduled Task';
|
|
170
|
+
default: return 'crontab';
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// ---- Status ----
|
|
174
|
+
function showStatus(codeburnPath) {
|
|
175
|
+
console.log('\n📊 OTEL Sync Status\n');
|
|
176
|
+
// Codeburn installed?
|
|
177
|
+
if (codeburnPath) {
|
|
178
|
+
console.log(` ✓ codeburn found: ${codeburnPath}`);
|
|
179
|
+
const ver = run(`${codeburnPath} --version`);
|
|
180
|
+
if (ver.ok)
|
|
181
|
+
console.log(` version: ${ver.stdout}`);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
console.log(' ✗ codeburn not found in PATH');
|
|
185
|
+
}
|
|
186
|
+
// Sync configured?
|
|
187
|
+
const configPath = join(homedir(), '.config', 'codeburn', 'sync.json');
|
|
188
|
+
if (existsSync(configPath)) {
|
|
189
|
+
try {
|
|
190
|
+
const cfg = JSON.parse(readFileSync(configPath, 'utf8'));
|
|
191
|
+
console.log(` ✓ sync configured: ${cfg.baseUrl || cfg.endpoint || cfg.url || '(configured)'}`);
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
console.log(` ✓ sync config exists: ${configPath}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
console.log(' ✗ sync not configured (run setup first)');
|
|
199
|
+
}
|
|
200
|
+
// Schedule exists?
|
|
201
|
+
if (scheduleExists()) {
|
|
202
|
+
console.log(` ✓ ${schedulerName()} schedule active`);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
console.log(` ✗ no ${schedulerName()} schedule found`);
|
|
206
|
+
}
|
|
207
|
+
// Last log?
|
|
208
|
+
const logFile = join(LOG_DIR, 'otel-sync.log');
|
|
209
|
+
if (existsSync(logFile)) {
|
|
210
|
+
const lastLines = run(`tail -5 "${logFile}"`);
|
|
211
|
+
if (lastLines.ok && lastLines.stdout) {
|
|
212
|
+
console.log(` Last sync output (${logFile}):`);
|
|
213
|
+
for (const line of lastLines.stdout.split('\n')) {
|
|
214
|
+
console.log(` ${line}`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
console.log('');
|
|
219
|
+
}
|
|
220
|
+
// ---- Main ----
|
|
221
|
+
export default {
|
|
222
|
+
description: 'Set up automated codeburn OTEL sync (pushes AI usage telemetry every 12h)',
|
|
223
|
+
options: [
|
|
224
|
+
{ flags: '--url <url>', description: 'OTEL collector URL (from CDK deploy output OtelCollectorUrl)' },
|
|
225
|
+
{ flags: '--interval <hours>', description: 'Sync interval in hours (default: 12)' },
|
|
226
|
+
{ flags: '--status', description: 'Show current sync schedule status' },
|
|
227
|
+
{ flags: '--remove', description: 'Remove the sync schedule' },
|
|
228
|
+
],
|
|
229
|
+
async action(opts) {
|
|
230
|
+
const codeburnPath = getCodeburnPath();
|
|
231
|
+
// --status
|
|
232
|
+
if (opts.status) {
|
|
233
|
+
showStatus(codeburnPath);
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
// --remove
|
|
237
|
+
if (opts.remove) {
|
|
238
|
+
if (scheduleExists()) {
|
|
239
|
+
removeSchedule();
|
|
240
|
+
console.log(`\n ✓ ${schedulerName()} schedule removed.\n`);
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
console.log(`\n No ${schedulerName()} schedule found — nothing to remove.\n`);
|
|
244
|
+
}
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
// ---- Setup flow ----
|
|
248
|
+
console.log('\n🔄 OTEL Sync Setup\n');
|
|
249
|
+
console.log('This will configure automated codeburn telemetry sync to your PRISM');
|
|
250
|
+
console.log('OTEL collector. Runs every 12 hours to keep dashboards fresh.\n');
|
|
251
|
+
// 1. Check codeburn version
|
|
252
|
+
if (!codeburnPath) {
|
|
253
|
+
console.error('Error: codeburn not found. Install with: npm install -g codeburn');
|
|
254
|
+
process.exit(1);
|
|
255
|
+
}
|
|
256
|
+
const verResult = run(`${codeburnPath} --version`);
|
|
257
|
+
if (verResult.ok) {
|
|
258
|
+
const ver = verResult.stdout.replace(/[^0-9.]/g, '');
|
|
259
|
+
const parts = ver.split('.').map(Number);
|
|
260
|
+
if (parts[0] === 0 && parts[1] < 9 || (parts[1] === 9 && parts[2] < 16)) {
|
|
261
|
+
console.error(`Error: codeburn >= 0.9.16 required (found ${ver}). Run: npm update -g codeburn`);
|
|
262
|
+
process.exit(1);
|
|
263
|
+
}
|
|
264
|
+
console.log(` ✓ codeburn ${ver}`);
|
|
265
|
+
}
|
|
266
|
+
// 2. Get the OTEL collector URL
|
|
267
|
+
const otelUrl = opts.url || await prompt('OTEL collector URL (from CDK deploy output OtelCollectorUrl)');
|
|
268
|
+
if (!otelUrl) {
|
|
269
|
+
console.error('Error: OTEL collector URL is required.');
|
|
270
|
+
process.exit(1);
|
|
271
|
+
}
|
|
272
|
+
// 3. Check if codeburn sync is already configured for this URL
|
|
273
|
+
const configPath = join(homedir(), '.config', 'codeburn', 'sync.json');
|
|
274
|
+
let needsSetup = true;
|
|
275
|
+
if (existsSync(configPath)) {
|
|
276
|
+
try {
|
|
277
|
+
const cfg = JSON.parse(readFileSync(configPath, 'utf8'));
|
|
278
|
+
const existingUrl = cfg.baseUrl || cfg.endpoint || cfg.url || '';
|
|
279
|
+
if (existingUrl === otelUrl || existingUrl.startsWith(otelUrl)) {
|
|
280
|
+
console.log(` ✓ codeburn sync already configured for this endpoint.`);
|
|
281
|
+
needsSetup = false;
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
console.log(` ⚠ codeburn sync configured for different endpoint: ${existingUrl}`);
|
|
285
|
+
const override = await prompt('Reconfigure for the new URL? (y/N)', 'N');
|
|
286
|
+
if (override.toLowerCase() !== 'y') {
|
|
287
|
+
console.log(' Keeping existing configuration.');
|
|
288
|
+
needsSetup = false;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
catch {
|
|
293
|
+
// Corrupt config — re-setup
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// 4. Run codeburn sync setup (opens browser for OIDC)
|
|
297
|
+
if (needsSetup) {
|
|
298
|
+
console.log('\n Running: codeburn sync setup ' + otelUrl);
|
|
299
|
+
console.log(' (This will open a browser for OIDC authentication)\n');
|
|
300
|
+
try {
|
|
301
|
+
execSync(`${codeburnPath} sync setup ${otelUrl}`, { stdio: 'inherit' });
|
|
302
|
+
console.log('\n ✓ codeburn sync configured.');
|
|
303
|
+
}
|
|
304
|
+
catch (err) {
|
|
305
|
+
console.error(`\n ✗ codeburn sync setup failed. Ensure Cognito user exists and try again.`);
|
|
306
|
+
process.exit(1);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
// 5. Initial backfill push (30d — server drops >14d from CloudWatch, keeps in DDB/S3)
|
|
310
|
+
console.log('\n Pushing initial backfill (last 30 days of telemetry)...');
|
|
311
|
+
const backfill = run(`${codeburnPath} sync push --since 30d`);
|
|
312
|
+
if (backfill.ok) {
|
|
313
|
+
console.log(' ✓ Backfill push complete.');
|
|
314
|
+
if (backfill.stdout)
|
|
315
|
+
console.log(` ${backfill.stdout.split('\n').slice(-1)[0]}`);
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
console.log(` ⚠ Backfill push failed (non-fatal): ${backfill.stderr.split('\n')[0]}`);
|
|
319
|
+
console.log(' The schedule will retry. Check ~/.prism/logs/otel-sync.log');
|
|
320
|
+
}
|
|
321
|
+
// 6. Install OS schedule
|
|
322
|
+
const intervalHours = opts.interval ? parseInt(opts.interval, 10) : 12;
|
|
323
|
+
if (isNaN(intervalHours) || intervalHours < 1) {
|
|
324
|
+
console.error('Error: --interval must be a positive integer (hours).');
|
|
325
|
+
process.exit(1);
|
|
326
|
+
}
|
|
327
|
+
if (scheduleExists()) {
|
|
328
|
+
console.log(`\n ✓ ${schedulerName()} schedule already exists — updating.`);
|
|
329
|
+
removeSchedule();
|
|
330
|
+
}
|
|
331
|
+
installSchedule(codeburnPath, intervalHours);
|
|
332
|
+
console.log(` ✓ ${schedulerName()} schedule installed (every ${intervalHours}h).`);
|
|
333
|
+
// Summary
|
|
334
|
+
console.log('\n════════════════════════════════════════════════');
|
|
335
|
+
console.log(' ✅ OTEL sync setup complete!');
|
|
336
|
+
console.log('════════════════════════════════════════════════');
|
|
337
|
+
console.log(`\n Endpoint: ${otelUrl}`);
|
|
338
|
+
console.log(` Schedule: every ${intervalHours}h via ${schedulerName()}`);
|
|
339
|
+
console.log(` Backfill: last 30d pushed (dashboard shows last 14d)`);
|
|
340
|
+
console.log(` Logs: ${join(LOG_DIR, 'otel-sync.log')}`);
|
|
341
|
+
console.log(`\n Run \`prism-cli bootstrapper setup-otel-sync --status\` to check health.`);
|
|
342
|
+
console.log(` Run \`prism-cli bootstrapper setup-otel-sync --remove\` to uninstall.\n`);
|
|
343
|
+
},
|
|
344
|
+
};
|
|
345
|
+
//# sourceMappingURL=setup-otel-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-otel-sync.js","sourceRoot":"","sources":["../../../../src/commands/bootstrapper/setup-otel-sync.ts"],"names":[],"mappings":"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"}
|