@quiltdata/benchling-webhook 0.8.0-20251118T071233Z → 0.8.2
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/README.md +82 -92
- package/dist/bin/cli.js +28 -19
- package/dist/bin/cli.js.map +1 -1
- package/dist/bin/commands/logs.d.ts +9 -0
- package/dist/bin/commands/logs.d.ts.map +1 -1
- package/dist/bin/commands/logs.js +308 -52
- package/dist/bin/commands/logs.js.map +1 -1
- package/dist/lib/utils/cli-helpers.d.ts +27 -0
- package/dist/lib/utils/cli-helpers.d.ts.map +1 -0
- package/dist/lib/utils/cli-helpers.js +46 -0
- package/dist/lib/utils/cli-helpers.js.map +1 -0
- package/dist/lib/utils/ecs-service-discovery.d.ts +32 -0
- package/dist/lib/utils/ecs-service-discovery.d.ts.map +1 -0
- package/dist/lib/utils/ecs-service-discovery.js +203 -0
- package/dist/lib/utils/ecs-service-discovery.js.map +1 -0
- package/dist/lib/utils/time-format.d.ts +53 -0
- package/dist/lib/utils/time-format.d.ts.map +1 -0
- package/dist/lib/utils/time-format.js +150 -0
- package/dist/lib/utils/time-format.js.map +1 -0
- package/dist/package.json +3 -2
- package/package.json +3 -2
- package/dist/scripts/check-logs.d.ts +0 -19
- package/dist/scripts/check-logs.d.ts.map +0 -1
- package/dist/scripts/check-logs.js +0 -302
- package/dist/scripts/check-logs.js.map +0 -1
|
@@ -1,302 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
/**
|
|
4
|
-
* Check CloudWatch logs for the deployed Benchling webhook ECS service
|
|
5
|
-
*
|
|
6
|
-
* @deprecated Use `npx @quiltdata/benchling-webhook logs` instead
|
|
7
|
-
*
|
|
8
|
-
* This script is deprecated and will be removed in v1.0.0.
|
|
9
|
-
* Please use the new `logs` command which provides the same functionality
|
|
10
|
-
* with better NPX compatibility and proper profile support.
|
|
11
|
-
*
|
|
12
|
-
* Migration:
|
|
13
|
-
* Old: npx ts-node scripts/check-logs.ts --profile sales --type ecs
|
|
14
|
-
* New: npx @quiltdata/benchling-webhook logs --profile sales --type ecs
|
|
15
|
-
*
|
|
16
|
-
* @module scripts/check-logs
|
|
17
|
-
* @version 0.7.0
|
|
18
|
-
*/
|
|
19
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
const child_process_1 = require("child_process");
|
|
21
|
-
const xdg_config_1 = require("../lib/xdg-config");
|
|
22
|
-
const STACK_NAME = "BenchlingWebhookStack";
|
|
23
|
-
/**
|
|
24
|
-
* Get deployment configuration from profile
|
|
25
|
-
*
|
|
26
|
-
* Reads from ~/.config/benchling-webhook/{profile}/deployments.json
|
|
27
|
-
*/
|
|
28
|
-
function getDeploymentFromProfile(profile, stage) {
|
|
29
|
-
try {
|
|
30
|
-
const xdg = new xdg_config_1.XDGConfig();
|
|
31
|
-
const deployment = xdg.getActiveDeployment(profile, stage);
|
|
32
|
-
if (deployment) {
|
|
33
|
-
return {
|
|
34
|
-
region: deployment.region,
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
catch {
|
|
39
|
-
// Deployment tracking not available, will fall back to env vars
|
|
40
|
-
}
|
|
41
|
-
return null;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Get AWS region from deployment tracking or environment
|
|
45
|
-
*/
|
|
46
|
-
function getAwsRegion(profile, stage) {
|
|
47
|
-
// Try to get region from deployment tracking
|
|
48
|
-
const deployment = getDeploymentFromProfile(profile, stage);
|
|
49
|
-
if (deployment) {
|
|
50
|
-
return deployment.region;
|
|
51
|
-
}
|
|
52
|
-
// Fall back to environment variables
|
|
53
|
-
if (process.env.CDK_DEFAULT_REGION) {
|
|
54
|
-
return process.env.CDK_DEFAULT_REGION;
|
|
55
|
-
}
|
|
56
|
-
if (process.env.AWS_REGION) {
|
|
57
|
-
return process.env.AWS_REGION;
|
|
58
|
-
}
|
|
59
|
-
// Default to us-east-1
|
|
60
|
-
console.warn("⚠️ No region found in deployment tracking or environment variables");
|
|
61
|
-
console.warn(" Defaulting to us-east-1");
|
|
62
|
-
return "us-east-1";
|
|
63
|
-
}
|
|
64
|
-
function getStackOutputs(region, profile) {
|
|
65
|
-
try {
|
|
66
|
-
const profileFlag = profile !== "default" ? `--profile ${profile}` : "";
|
|
67
|
-
const output = (0, child_process_1.execSync)(`aws cloudformation describe-stacks --stack-name ${STACK_NAME} --region ${region} ${profileFlag} --query 'Stacks[0].Outputs' --output json`, { encoding: "utf-8" });
|
|
68
|
-
return JSON.parse(output);
|
|
69
|
-
}
|
|
70
|
-
catch {
|
|
71
|
-
console.error(`Error: Could not get stack outputs for ${STACK_NAME}`);
|
|
72
|
-
console.error("Make sure the stack is deployed and AWS credentials are configured.");
|
|
73
|
-
process.exit(1);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
function getLogGroupFromOutputs(outputs, logType) {
|
|
77
|
-
let outputKey;
|
|
78
|
-
if (logType === "ecs") {
|
|
79
|
-
outputKey = "EcsLogGroup";
|
|
80
|
-
}
|
|
81
|
-
else if (logType === "api") {
|
|
82
|
-
outputKey = "ApiGatewayLogGroup";
|
|
83
|
-
}
|
|
84
|
-
else if (logType === "api-exec") {
|
|
85
|
-
outputKey = "ApiGatewayExecutionLogGroup";
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
console.error(`Error: Invalid log type '${logType}'`);
|
|
89
|
-
process.exit(1);
|
|
90
|
-
}
|
|
91
|
-
const logGroupOutput = outputs.find((o) => o.OutputKey === outputKey);
|
|
92
|
-
if (!logGroupOutput) {
|
|
93
|
-
console.error(`Error: Could not find ${outputKey} in stack outputs`);
|
|
94
|
-
console.error("Make sure the stack has been deployed with the latest changes.");
|
|
95
|
-
process.exit(1);
|
|
96
|
-
}
|
|
97
|
-
return logGroupOutput.OutputValue;
|
|
98
|
-
}
|
|
99
|
-
function printStackInfo(outputs, logGroup, logType, profile, stage) {
|
|
100
|
-
console.log("=".repeat(80));
|
|
101
|
-
console.log("Benchling Webhook Stack Information");
|
|
102
|
-
console.log("=".repeat(80));
|
|
103
|
-
const clusterName = outputs.find((o) => o.OutputKey === "FargateServiceClusterNameCD3B109F");
|
|
104
|
-
const serviceName = outputs.find((o) => o.OutputKey === "FargateServiceServiceName24CFD869");
|
|
105
|
-
const webhookEndpoint = outputs.find((o) => o.OutputKey === "WebhookEndpoint");
|
|
106
|
-
const version = outputs.find((o) => o.OutputKey === "StackVersion");
|
|
107
|
-
const ecsLogGroup = outputs.find((o) => o.OutputKey === "EcsLogGroup");
|
|
108
|
-
const apiLogGroup = outputs.find((o) => o.OutputKey === "ApiGatewayLogGroup");
|
|
109
|
-
const apiExecLogGroup = outputs.find((o) => o.OutputKey === "ApiGatewayExecutionLogGroup");
|
|
110
|
-
const albDns = outputs.find((o) => o.OutputKey === "LoadBalancerDNS");
|
|
111
|
-
console.log(`Profile: ${profile}`);
|
|
112
|
-
console.log(`Stage: ${stage}`);
|
|
113
|
-
if (clusterName)
|
|
114
|
-
console.log(`Cluster: ${clusterName.OutputValue}`);
|
|
115
|
-
if (serviceName)
|
|
116
|
-
console.log(`Service: ${serviceName.OutputValue}`);
|
|
117
|
-
if (webhookEndpoint)
|
|
118
|
-
console.log(`Endpoint: ${webhookEndpoint.OutputValue}`);
|
|
119
|
-
if (albDns)
|
|
120
|
-
console.log(`ALB DNS: ${albDns.OutputValue}`);
|
|
121
|
-
if (version)
|
|
122
|
-
console.log(`Version: ${version.OutputValue}`);
|
|
123
|
-
console.log("");
|
|
124
|
-
console.log("Log Groups:");
|
|
125
|
-
if (ecsLogGroup)
|
|
126
|
-
console.log(` ECS: ${ecsLogGroup.OutputValue}${logType === "ecs" ? " (viewing)" : ""}`);
|
|
127
|
-
if (apiLogGroup)
|
|
128
|
-
console.log(` API Access: ${apiLogGroup.OutputValue}${logType === "api" ? " (viewing)" : ""}`);
|
|
129
|
-
if (apiExecLogGroup)
|
|
130
|
-
console.log(` API Exec: ${apiExecLogGroup.OutputValue}${logType === "api-exec" ? " (viewing)" : ""}`);
|
|
131
|
-
console.log("=".repeat(80));
|
|
132
|
-
console.log("");
|
|
133
|
-
}
|
|
134
|
-
function main() {
|
|
135
|
-
// Show deprecation warning
|
|
136
|
-
console.warn("\n⚠️ DEPRECATION WARNING");
|
|
137
|
-
console.warn("═".repeat(80));
|
|
138
|
-
console.warn("This script is deprecated. Please use the new 'logs' command instead:");
|
|
139
|
-
console.warn("");
|
|
140
|
-
console.warn(" npx @quiltdata/benchling-webhook logs [options]");
|
|
141
|
-
console.warn("");
|
|
142
|
-
console.warn("The new command provides:");
|
|
143
|
-
console.warn(" - Better NPX compatibility (no ts-node required)");
|
|
144
|
-
console.warn(" - Proper profile support");
|
|
145
|
-
console.warn(" - Listed in --help output");
|
|
146
|
-
console.warn(" - Same functionality as this script");
|
|
147
|
-
console.warn("");
|
|
148
|
-
console.warn("This script will be removed in v1.0.0");
|
|
149
|
-
console.warn("═".repeat(80));
|
|
150
|
-
console.warn("");
|
|
151
|
-
const args = process.argv.slice(2);
|
|
152
|
-
const logType = args.find((arg) => arg.startsWith("--type="))?.split("=")[1] || "all";
|
|
153
|
-
const filterPattern = args.find((arg) => arg.startsWith("--filter="))?.split("=")[1];
|
|
154
|
-
const since = args.find((arg) => arg.startsWith("--since="))?.split("=")[1] || "5m";
|
|
155
|
-
const follow = args.includes("--follow") || args.includes("-f");
|
|
156
|
-
const tail = args.find((arg) => arg.startsWith("--tail="))?.split("=")[1] || "100";
|
|
157
|
-
const profile = args.find((arg) => arg.startsWith("--profile="))?.split("=")[1] || "default";
|
|
158
|
-
const stage = args.find((arg) => arg.startsWith("--stage="))?.split("=")[1] || "prod";
|
|
159
|
-
// Validate log type
|
|
160
|
-
if (!["ecs", "api", "api-exec", "all"].includes(logType)) {
|
|
161
|
-
console.error("Error: --type must be 'ecs', 'api', 'api-exec', or 'all'");
|
|
162
|
-
process.exit(1);
|
|
163
|
-
}
|
|
164
|
-
// Get AWS region
|
|
165
|
-
const AWS_REGION = getAwsRegion(profile, stage);
|
|
166
|
-
// Get stack outputs
|
|
167
|
-
const outputs = getStackOutputs(AWS_REGION, profile);
|
|
168
|
-
// Handle 'all' type - show all three log groups
|
|
169
|
-
if (logType === "all") {
|
|
170
|
-
printStackInfo(outputs, null, "all", profile, stage);
|
|
171
|
-
console.log("Showing logs from all sources (most recent first):\n");
|
|
172
|
-
const logGroupDefs = [
|
|
173
|
-
{ type: "ECS", group: outputs.find((o) => o.OutputKey === "EcsLogGroup")?.OutputValue },
|
|
174
|
-
{ type: "API-Access", group: outputs.find((o) => o.OutputKey === "ApiGatewayLogGroup")?.OutputValue },
|
|
175
|
-
{ type: "API-Exec", group: outputs.find((o) => o.OutputKey === "ApiGatewayExecutionLogGroup")?.OutputValue },
|
|
176
|
-
];
|
|
177
|
-
// Warn about missing log groups
|
|
178
|
-
const missingGroups = logGroupDefs.filter(lg => !lg.group);
|
|
179
|
-
if (missingGroups.length > 0) {
|
|
180
|
-
console.log("⚠️ WARNING: Some log groups are not available in stack outputs:");
|
|
181
|
-
missingGroups.forEach(({ type }) => {
|
|
182
|
-
console.log(` - ${type}: Stack output not found (may need to redeploy stack)`);
|
|
183
|
-
});
|
|
184
|
-
console.log("");
|
|
185
|
-
}
|
|
186
|
-
const logGroups = logGroupDefs.filter(lg => lg.group);
|
|
187
|
-
for (const { type, group } of logGroups) {
|
|
188
|
-
console.log(`\n${"=".repeat(80)}`);
|
|
189
|
-
console.log(`${type}: ${group}`);
|
|
190
|
-
console.log("=".repeat(80));
|
|
191
|
-
const profileFlag = profile !== "default" ? `--profile ${profile}` : "";
|
|
192
|
-
let command = `aws logs tail "${group}"`;
|
|
193
|
-
command += ` --region ${AWS_REGION}`;
|
|
194
|
-
if (profileFlag)
|
|
195
|
-
command += ` ${profileFlag}`;
|
|
196
|
-
command += ` --since ${since}`;
|
|
197
|
-
command += " --format short";
|
|
198
|
-
if (filterPattern) {
|
|
199
|
-
command += ` --filter-pattern "${filterPattern}"`;
|
|
200
|
-
}
|
|
201
|
-
command += ` 2>&1 | tail -${tail}`;
|
|
202
|
-
try {
|
|
203
|
-
const output = (0, child_process_1.execSync)(command, { encoding: "utf-8", shell: "/bin/bash" });
|
|
204
|
-
if (output.trim()) {
|
|
205
|
-
console.log(output);
|
|
206
|
-
}
|
|
207
|
-
else {
|
|
208
|
-
console.log(`(No logs in the last ${since})`);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
catch (error) {
|
|
212
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
213
|
-
console.log(`Error reading ${type} logs: ${errorMessage}`);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
return;
|
|
217
|
-
}
|
|
218
|
-
const logGroup = getLogGroupFromOutputs(outputs, logType);
|
|
219
|
-
printStackInfo(outputs, logGroup, logType, profile, stage);
|
|
220
|
-
// Build AWS logs command
|
|
221
|
-
const profileFlag = profile !== "default" ? `--profile ${profile}` : "";
|
|
222
|
-
let command = `aws logs tail ${logGroup}`;
|
|
223
|
-
command += ` --region ${AWS_REGION}`;
|
|
224
|
-
if (profileFlag)
|
|
225
|
-
command += ` ${profileFlag}`;
|
|
226
|
-
command += ` --since ${since}`;
|
|
227
|
-
command += " --format short";
|
|
228
|
-
if (filterPattern) {
|
|
229
|
-
command += ` --filter-pattern "${filterPattern}"`;
|
|
230
|
-
}
|
|
231
|
-
if (follow) {
|
|
232
|
-
command += " --follow";
|
|
233
|
-
console.log("Following logs (Press Ctrl+C to stop)...\n");
|
|
234
|
-
}
|
|
235
|
-
else {
|
|
236
|
-
command += ` | tail -${tail}`;
|
|
237
|
-
console.log(`Showing last ${tail} log entries from the past ${since}...\n`);
|
|
238
|
-
}
|
|
239
|
-
// Execute logs command
|
|
240
|
-
try {
|
|
241
|
-
(0, child_process_1.execSync)(command, { stdio: "inherit" });
|
|
242
|
-
}
|
|
243
|
-
catch (error) {
|
|
244
|
-
const hasStatus = error && typeof error === "object" && "status" in error;
|
|
245
|
-
if (hasStatus && error.status !== 130) {
|
|
246
|
-
// Ignore Ctrl+C exit (status 130)
|
|
247
|
-
console.error("\nError fetching logs. Make sure:");
|
|
248
|
-
console.error("1. The stack is deployed");
|
|
249
|
-
console.error("2. AWS CLI is configured with proper credentials");
|
|
250
|
-
console.error("3. You have CloudWatch Logs read permissions");
|
|
251
|
-
process.exit(1);
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
function printHelp() {
|
|
256
|
-
console.log("⚠️ DEPRECATED - Use 'npx @quiltdata/benchling-webhook logs' instead\n");
|
|
257
|
-
console.log("Usage: npm run logs [options]");
|
|
258
|
-
console.log("");
|
|
259
|
-
console.log("Options:");
|
|
260
|
-
console.log(" --profile=NAME Configuration profile to use (default: default)");
|
|
261
|
-
console.log(" --stage=STAGE Deployment stage (default: prod)");
|
|
262
|
-
console.log(" --type=TYPE Log group to view (default: all)");
|
|
263
|
-
console.log(" all = All logs (ECS, API Access, API Execution)");
|
|
264
|
-
console.log(" ecs = ECS container logs (application logs)");
|
|
265
|
-
console.log(" api = API Gateway access logs (requests/responses)");
|
|
266
|
-
console.log(" api-exec = API Gateway execution logs (detailed debugging)");
|
|
267
|
-
console.log(" --since=TIME Time period to fetch logs (default: 5m)");
|
|
268
|
-
console.log(" Examples: 1h, 30m, 2d, 5m");
|
|
269
|
-
console.log(" --filter=PATTERN Filter logs by pattern");
|
|
270
|
-
console.log(" Examples: --filter=ERROR, --filter=canvas, --filter=500");
|
|
271
|
-
console.log(" --follow, -f Follow log output (like tail -f, not available with --type=all)");
|
|
272
|
-
console.log(" --tail=N Show last N lines (default: 100, only without --follow)");
|
|
273
|
-
console.log(" --help, -h Show this help message");
|
|
274
|
-
console.log("");
|
|
275
|
-
console.log("Examples:");
|
|
276
|
-
console.log(" npm run logs # View all logs from prod deployment");
|
|
277
|
-
console.log(" npm run logs -- --stage=dev # View dev deployment logs");
|
|
278
|
-
console.log(" npm run logs -- --profile=dev --stage=dev # View dev profile, dev stage");
|
|
279
|
-
console.log(" npm run logs -- --type=ecs # View only ECS logs");
|
|
280
|
-
console.log(" npm run logs -- --type=api-exec # View API Gateway execution logs");
|
|
281
|
-
console.log(" npm run logs -- --since=1h # Last hour of all logs");
|
|
282
|
-
console.log(" npm run logs -- --filter=ERROR # Filter for errors in all logs");
|
|
283
|
-
console.log(" npm run logs -- --type=api-exec --filter=500 # API Gateway execution errors");
|
|
284
|
-
console.log(" npm run logs -- --type=ecs --follow # Follow ECS logs");
|
|
285
|
-
console.log(" npm run logs -- --type=api-exec --since=10m # Last 10 min of execution logs");
|
|
286
|
-
}
|
|
287
|
-
if (require.main === module) {
|
|
288
|
-
const args = process.argv.slice(2);
|
|
289
|
-
if (args.includes("--help") || args.includes("-h")) {
|
|
290
|
-
printHelp();
|
|
291
|
-
process.exit(0);
|
|
292
|
-
}
|
|
293
|
-
try {
|
|
294
|
-
main();
|
|
295
|
-
}
|
|
296
|
-
catch (error) {
|
|
297
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
298
|
-
console.error("Error:", errorMessage);
|
|
299
|
-
process.exit(1);
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
//# sourceMappingURL=check-logs.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"check-logs.js","sourceRoot":"","sources":["../../scripts/check-logs.ts"],"names":[],"mappings":"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"}
|