mirror of
https://github.com/hyperdxio/hyperdx
synced 2026-04-21 21:37:41 +00:00
## Summary The node commands to start the API server and alert task are duplicated across 4+ files, each hardcoding the build output path and node require flags. When the build process changed (esbuild introduction/revert per HDX-2690), the downstream operator and helm chart broke because their entrypoint commands were stale. This PR introduces `packages/api/bin/hyperdx`, a single shell script that is the **sole source of truth** for how to launch API and task processes. It resolves the build directory relative to its own location, applies the correct node flags (`-r @hyperdx/node-opentelemetry/build/src/tracing`), and exposes two subcommands: - `hyperdx api` -- starts the API server - `hyperdx task <name>` -- runs a named task (e.g., `check-alerts`) All Dockerfiles and entry scripts now delegate to this script instead of inlining the node command. Future build changes only need updating in one place. ### How to test locally or on Vercel 1. **Build the standalone API image** and confirm the entrypoint works: ```bash docker build . -f packages/api/Dockerfile -t hyperdx-api-test:latest --target prod docker run -d --name hdx-api-test -p 18000:8000 hyperdx-api-test:latest sleep 5 docker logs hdx-api-test 2>&1 | head -30 # Should show OpenTelemetry init + MongoStore error (expected without Mongo) # No "file not found" or "permission denied" errors docker stop hdx-api-test && docker rm hdx-api-test ``` 2. **Build and run the all-in-one image** for a full integration test: ```bash make build-local docker run -d --name hdx-aio-test -p 18080:8080 -p 18000:8000 hyperdx/hyperdx-local:2.21.0 # Wait up to 90s for startup, then: curl -sf http://localhost:18080/api/health # should return {"data":"OK",...} curl -sf http://localhost:18000/health # should return {"data":"OK",...} docker exec hdx-aio-test sh -c "ps aux" # Confirm API, APP, and ALERT-TASK processes are running via the hyperdx script docker stop hdx-aio-test && docker rm hdx-aio-test ``` 3. **Build the prod image** to confirm the entry script changes are valid: ```bash make build-app ``` **Testing performed:** All three Docker image targets were built and verified locally. The standalone API image started node via `hyperdx api` correctly (crashed on missing MongoDB as expected). The all-in-one image passed health checks on both `localhost:18080/api/health` and `localhost:18000/health`, with all three processes (API, APP, ALERT-TASK) confirmed running inside the container using the new entry point script. ### References - Linear Issue: [HDX-2712](https://linear.app/clickhouse/issue/HDX-2712/use-a-single-entry-point-script-for-both-hyperdx-api-and-alert-job) - Related PRs: HDX-2690 (root cause), HDX-2815 (downstream helm chart follow-up) - **Follow-up needed:** Update helm chart cron job template and operator template in `ClickHouse/ClickStack-helm-charts` to use `./packages/api/bin/hyperdx task check-alerts` Made with [Cursor](https://cursor.com)
101 lines
3.8 KiB
JSON
101 lines
3.8 KiB
JSON
{
|
|
"name": "@hyperdx/api",
|
|
"version": "2.21.0",
|
|
"license": "MIT",
|
|
"private": true,
|
|
"engines": {
|
|
"node": ">=22.16.0"
|
|
},
|
|
"dependencies": {
|
|
"@ai-sdk/anthropic": "^3.0.58",
|
|
"@esm2cjs/p-queue": "^7.3.0",
|
|
"@hyperdx/common-utils": "^0.16.0",
|
|
"@hyperdx/node-opentelemetry": "^0.9.0",
|
|
"@hyperdx/passport-local-mongoose": "^9.0.1",
|
|
"@opentelemetry/api": "^1.8.0",
|
|
"@opentelemetry/host-metrics": "^0.35.5",
|
|
"@opentelemetry/sdk-metrics": "^1.30.1",
|
|
"@slack/webhook": "^7.0.0",
|
|
"@types/node": "^22.15.18",
|
|
"ai": "^6.0.116",
|
|
"aws4": "^1.13.2",
|
|
"chrono-node": "^2.9.0",
|
|
"compression": "^1.7.4",
|
|
"concurrently": "^9.1.2",
|
|
"connect-mongo": "^4.6.0",
|
|
"cors": "^2.8.5",
|
|
"cron": "^4.3.1",
|
|
"date-fns": "^2.28.0",
|
|
"express": "^4.19.2",
|
|
"express-rate-limit": "^6.7.1",
|
|
"express-session": "^1.17.3",
|
|
"handlebars": "^4.7.8",
|
|
"http-graceful-shutdown": "^3.1.13",
|
|
"http-proxy-middleware": "^3.0.5",
|
|
"jsonwebtoken": "^9.0.0",
|
|
"lodash": "^4.17.23",
|
|
"minimist": "^1.2.7",
|
|
"mongodb": "^6.15.0",
|
|
"mongoose": "^6.13.8",
|
|
"ms": "^2.1.3",
|
|
"on-headers": "^1.1.0",
|
|
"passport": "^0.6.0",
|
|
"passport-local": "^1.0.0",
|
|
"pino": "^10.0.0",
|
|
"pino-http": "^11.0.0",
|
|
"promised-handlebars": "^2.0.1",
|
|
"protobufjs": "^7.5.2",
|
|
"semver": "^7.5.3",
|
|
"serialize-error": "^8.1.0",
|
|
"uuid": "^8.3.2",
|
|
"zod": "3.25",
|
|
"zod-express-middleware": "^1.4.0"
|
|
},
|
|
"devDependencies": {
|
|
"@stoplight/spectral-cli": "^6.15.0",
|
|
"@types/aws4": "^1",
|
|
"@types/compression": "^1.7.3",
|
|
"@types/cors": "^2.8.14",
|
|
"@types/express": "^4.17.13",
|
|
"@types/express-session": "^1.17.7",
|
|
"@types/jest": "^28.1.1",
|
|
"@types/lodash": "^4.14.198",
|
|
"@types/minimist": "^1.2.2",
|
|
"@types/ms": "^0.7.31",
|
|
"@types/passport-local": "^1.0.34",
|
|
"@types/semver": "^7.3.12",
|
|
"@types/supertest": "^2.0.12",
|
|
"@types/swagger-jsdoc": "^6",
|
|
"@types/uuid": "^8.3.4",
|
|
"jest": "^28.1.3",
|
|
"migrate-mongo": "^11.0.0",
|
|
"nodemon": "^2.0.20",
|
|
"pino-pretty": "^13.1.1",
|
|
"rimraf": "^4.4.1",
|
|
"supertest": "^6.3.1",
|
|
"swagger-jsdoc": "^6.2.8",
|
|
"swagger-ui-express": "^5.0.1",
|
|
"ts-jest": "^29.4.5",
|
|
"ts-node": "^10.8.1",
|
|
"tsc-alias": "^1.8.8",
|
|
"tsconfig-paths": "^4.2.0",
|
|
"typescript": "^5.9.3"
|
|
},
|
|
"scripts": {
|
|
"start": "node ./build/index.js",
|
|
"dev": "DOTENV_CONFIG_PATH=.env.development nodemon --exec 'ts-node' --transpile-only -r tsconfig-paths/register -r dotenv-expand/config -r '@hyperdx/node-opentelemetry/build/src/tracing' ./src/index.ts",
|
|
"dev-task": "DOTENV_CONFIG_PATH=.env.development nodemon --exec 'ts-node' --transpile-only -r tsconfig-paths/register -r dotenv-expand/config -r '@hyperdx/node-opentelemetry/build/src/tracing' ./src/tasks/index.ts",
|
|
"build": "rimraf ./build && tsc && tsc-alias && cp -r ./src/opamp/proto ./build/opamp/",
|
|
"lint": "npx eslint --quiet . --ext .ts",
|
|
"lint:fix": "npx eslint . --ext .ts --fix",
|
|
"ci:lint": "yarn lint && yarn tsc --noEmit && yarn lint:openapi",
|
|
"ci:int": "DOTENV_CONFIG_PATH=.env.test DOTENV_CONFIG_OVERRIDE=true jest --runInBand --ci --forceExit --coverage",
|
|
"dev:int": "DOTENV_CONFIG_PATH=.env.test DOTENV_CONFIG_OVERRIDE=true jest --runInBand --forceExit --coverage",
|
|
"dev:migrate-db-create": "ts-node node_modules/.bin/migrate-mongo create -f migrate-mongo-config.ts",
|
|
"dev:migrate-db": "ts-node node_modules/.bin/migrate-mongo up -f migrate-mongo-config.ts",
|
|
"dev:migrate-ch-create": "migrate create -ext sql -dir ./migrations/ch -seq",
|
|
"dev:migrate-ch": "migrate -database 'clickhouse://localhost:9000?database=default&x-multi-statement=true' -path ./migrations/ch up",
|
|
"docgen": "ts-node scripts/generate-api-docs.ts",
|
|
"lint:openapi": "yarn docgen && spectral lint openapi.json"
|
|
}
|
|
}
|