From deca03b7d5f2c4478ccc35cd1ec7bf846775cd3a Mon Sep 17 00:00:00 2001 From: Yaroslav Grishajev Date: Tue, 9 Jul 2024 15:48:29 +0200 Subject: [PATCH] feat(logging): replace contextual logger with open telemetry --- apps/api/package.json | 9 +- apps/api/src/app.ts | 3 +- .../billing/services/wallet/wallet.service.ts | 11 +- .../src/core/providers/postgres.provider.ts | 2 +- .../contextual-logger.service.ts | 32 -- .../http-logger/http-logger.service.ts | 6 +- apps/api/src/core/services/index.ts | 2 - .../postgres-logger.service.ts | 8 +- .../request-storage.service.ts | 35 -- apps/api/src/index.ts | 1 + apps/api/src/open-telemetry.ts | 10 + .../api/test/functional/create-wallet.spec.ts | 4 +- apps/api/test/setup-functional-tests.ts | 1 - docker-compose.build.yml | 8 - docker-compose.prod.yml | 5 - docker-compose.yml | 12 - package-lock.json | 447 +++++++++++++++++- package.json | 28 +- 18 files changed, 483 insertions(+), 141 deletions(-) delete mode 100644 apps/api/src/core/services/contextual-logger/contextual-logger.service.ts delete mode 100644 apps/api/src/core/services/request-storage/request-storage.service.ts create mode 100644 apps/api/src/open-telemetry.ts diff --git a/apps/api/package.json b/apps/api/package.json index 514da5272..998733175 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -11,12 +11,13 @@ "main": "server.js", "scripts": { "build": "webpack --config webpack.prod.js", + "console": "webpack --config webpack.prod.js --entry ./src/console.ts --output-filename console.js && node dist/console.js", "dev": "npm run start", "format": "prettier --write ./*.{js,json} **/*.{ts,js,json}", "lint": "eslint .", "migrate": "node-pg-migrate", + "migration:gen": "drizzle-kit generate", "start": "webpack --config webpack.dev.js --watch", - "console": "webpack --config webpack.prod.js --entry ./src/console.ts --output-filename console.js && node dist/console.js", "test": "jest --selectProjects unit functional", "test:cov": "jest --selectProjects unit functional --coverage", "test:functional": "jest --selectProjects functional", @@ -25,8 +26,7 @@ "test:unit": "jest --selectProjects unit", "test:unit:cov": "jest --selectProjects unit --coverage", "test:unit:watch": "jest --selectProjects unit --watch", - "test:watch": "jest --selectProjects unit functional --watch", - "migration:gen": "drizzle-kit generate" + "test:watch": "jest --selectProjects unit functional --watch" }, "dependencies": { "@akashnetwork/akash-api": "^1.3.0", @@ -42,6 +42,9 @@ "@hono/swagger-ui": "0.2.1", "@hono/zod-openapi": "0.9.5", "@octokit/rest": "^18.12.0", + "@opentelemetry/instrumentation-http": "^0.52.1", + "@opentelemetry/instrumentation-pino": "^0.41.0", + "@opentelemetry/sdk-node": "^0.52.1", "@sentry/node": "^7.55.2", "@supercharge/promise-pool": "^3.2.0", "axios": "^0.27.2", diff --git a/apps/api/src/app.ts b/apps/api/src/app.ts index d28739d26..d7d547f19 100644 --- a/apps/api/src/app.ts +++ b/apps/api/src/app.ts @@ -10,7 +10,7 @@ import { Hono } from "hono"; import { cors } from "hono/cors"; import { container } from "tsyringe"; -import { HttpLoggerService, LoggerService, RequestStorageService } from "@src/core"; +import { HttpLoggerService, LoggerService } from "@src/core"; import packageJson from "../package.json"; import { chainDb, syncUserSchema, userDb } from "./db/dbConnection"; import { apiRouter } from "./routers/apiRouter"; @@ -59,7 +59,6 @@ const scheduler = new Scheduler({ } }); -appHono.use(container.resolve(RequestStorageService).intercept()); appHono.use(container.resolve(HttpLoggerService).intercept()); appHono.use( "*", diff --git a/apps/api/src/billing/services/wallet/wallet.service.ts b/apps/api/src/billing/services/wallet/wallet.service.ts index 9269a98e0..cd70ad862 100644 --- a/apps/api/src/billing/services/wallet/wallet.service.ts +++ b/apps/api/src/billing/services/wallet/wallet.service.ts @@ -6,7 +6,7 @@ import { singleton } from "tsyringe"; import { BillingConfig, InjectBillingConfig } from "@src/billing/providers"; import { RpcMessageService } from "@src/billing/services/rpc-message-service/rpc-message.service"; -import { ContextualLoggerService } from "@src/core/services"; +import { LoggerService } from "@src/core"; interface SpendingAuthorizationOptions { address: string; @@ -27,13 +27,12 @@ export class WalletService { private client: SigningStargateClient; + private readonly logger = new LoggerService({ context: WalletService.name }); + constructor( @InjectBillingConfig() private readonly config: BillingConfig, - private readonly rpcMessageService: RpcMessageService, - private readonly logger: ContextualLoggerService - ) { - this.logger.setContext({ context: WalletService.name }); - } + private readonly rpcMessageService: RpcMessageService + ) {} async createAndAuthorizeTrialSpending({ addressIndex }: { addressIndex: number }) { const { address } = await this.createWallet({ addressIndex }); diff --git a/apps/api/src/core/providers/postgres.provider.ts b/apps/api/src/core/providers/postgres.provider.ts index 1f70af22e..7aee94514 100644 --- a/apps/api/src/core/providers/postgres.provider.ts +++ b/apps/api/src/core/providers/postgres.provider.ts @@ -11,7 +11,7 @@ const pool = new Pool({ connectionString: config.POSTGRES_DB_URI }); -export const pgDatabase = drizzle(pool, { logger: new DefaultLogger({ writer: container.resolve(PostgresLoggerService) }), schema: billingSchemas }); +export const pgDatabase = drizzle(pool, { logger: new DefaultLogger({ writer: new PostgresLoggerService() }), schema: billingSchemas }); export type ApiPgSchema = typeof billingSchemas; diff --git a/apps/api/src/core/services/contextual-logger/contextual-logger.service.ts b/apps/api/src/core/services/contextual-logger/contextual-logger.service.ts deleted file mode 100644 index 1e51c4b00..000000000 --- a/apps/api/src/core/services/contextual-logger/contextual-logger.service.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Bindings } from "pino"; -import { injectable } from "tsyringe"; - -import { LoggerService } from "@src/core/services/logger/logger.service"; -import { RequestStorageService } from "@src/core/services/request-storage/request-storage.service"; - -@injectable() -export class ContextualLoggerService extends LoggerService { - constructor(private readonly requestStorage: RequestStorageService) { - super(); - } - - setContext(bindings: Bindings) { - this.pino = this.pino.child(bindings); - } - - protected toLoggableInput(message: any) { - const { context } = this.requestStorage; - const requestId = context?.get("requestId"); - const loggableMessage = super.toLoggableInput(message); - - if (!requestId) { - return loggableMessage; - } - - if (typeof loggableMessage === "object" && !Array.isArray(loggableMessage)) { - return { requestId, ...loggableMessage }; - } - - return { requestId, msg: loggableMessage }; - } -} diff --git a/apps/api/src/core/services/http-logger/http-logger.service.ts b/apps/api/src/core/services/http-logger/http-logger.service.ts index 3fc7061ed..d24b5229e 100644 --- a/apps/api/src/core/services/http-logger/http-logger.service.ts +++ b/apps/api/src/core/services/http-logger/http-logger.service.ts @@ -1,14 +1,12 @@ import { Context, Next } from "hono"; import { singleton } from "tsyringe"; -import { ContextualLoggerService } from "@src/core/services"; +import { LoggerService } from "@src/core"; import type { HonoInterceptor } from "@src/core/types/hono-interceptor.type"; @singleton() export class HttpLoggerService implements HonoInterceptor { - constructor(private readonly logger: ContextualLoggerService) { - logger.setContext({ context: "HTTP" }); - } + private readonly logger = new LoggerService({ context: "HTTP" }); intercept() { return async (c: Context, next: Next) => { diff --git a/apps/api/src/core/services/index.ts b/apps/api/src/core/services/index.ts index 6412e53d5..b888f5aa1 100644 --- a/apps/api/src/core/services/index.ts +++ b/apps/api/src/core/services/index.ts @@ -1,6 +1,4 @@ export * from "@src/core/services/tx/tx.service"; export * from "./logger/logger.service"; -export * from "./contextual-logger/contextual-logger.service"; export * from "@src/core/services/http-logger/http-logger.service"; -export * from "./request-storage/request-storage.service"; export * from "./postgres-migrator/postgres-migrator.service"; diff --git a/apps/api/src/core/services/postgres-logger/postgres-logger.service.ts b/apps/api/src/core/services/postgres-logger/postgres-logger.service.ts index 88202d650..86806b0f6 100644 --- a/apps/api/src/core/services/postgres-logger/postgres-logger.service.ts +++ b/apps/api/src/core/services/postgres-logger/postgres-logger.service.ts @@ -1,14 +1,10 @@ import { LogWriter } from "drizzle-orm/logger"; import { format } from "sql-formatter"; -import { singleton } from "tsyringe"; -import { ContextualLoggerService } from "@src/core/services/contextual-logger/contextual-logger.service"; +import { LoggerService } from "@src/core/services/logger/logger.service"; -@singleton() export class PostgresLoggerService implements LogWriter { - constructor(private readonly logger: ContextualLoggerService) { - logger.setContext({ context: "POSTGRES" }); - } + private readonly logger = new LoggerService({ context: "POSTGRES" }); write(message: string) { let formatted = message.replace(/^Query: /, ""); diff --git a/apps/api/src/core/services/request-storage/request-storage.service.ts b/apps/api/src/core/services/request-storage/request-storage.service.ts deleted file mode 100644 index 19444b79b..000000000 --- a/apps/api/src/core/services/request-storage/request-storage.service.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Context, Next } from "hono"; -import { AsyncLocalStorage } from "node:async_hooks"; -import { singleton } from "tsyringe"; -import { v4 as uuid } from "uuid"; - -import type { HonoInterceptor } from "@src/core/types/hono-interceptor.type"; - -@singleton() -export class RequestStorageService implements HonoInterceptor { - private readonly CONTEXT_KEY = "CONTEXT"; - - private readonly storage = new AsyncLocalStorage>(); - - get context() { - return this.storage.getStore()?.get(this.CONTEXT_KEY); - } - - intercept() { - return async (c: Context, next: Next) => { - const requestId = c.req.header("X-Request-Id") || uuid(); - c.set("requestId", requestId); - - await this.runWithContext(c, next); - }; - } - - private async runWithContext(context: Context, cb: () => Promise) { - return await new Promise((resolve, reject) => { - this.storage.run(new Map(), () => { - this.storage.getStore().set(this.CONTEXT_KEY, context); - cb().then(resolve).catch(reject); - }); - }); - } -} diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index 041d547ea..a5ea74dcc 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -1,4 +1,5 @@ import "reflect-metadata"; +import "./open-telemetry"; import { container } from "tsyringe"; diff --git a/apps/api/src/open-telemetry.ts b/apps/api/src/open-telemetry.ts new file mode 100644 index 000000000..07ee0b6ea --- /dev/null +++ b/apps/api/src/open-telemetry.ts @@ -0,0 +1,10 @@ +import { registerInstrumentations } from "@opentelemetry/instrumentation"; +import { HttpInstrumentation } from "@opentelemetry/instrumentation-http"; +import { PinoInstrumentation } from "@opentelemetry/instrumentation-pino"; +import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node"; + +new NodeTracerProvider().register(); + +registerInstrumentations({ + instrumentations: [new HttpInstrumentation(), new PinoInstrumentation()] +}); diff --git a/apps/api/test/functional/create-wallet.spec.ts b/apps/api/test/functional/create-wallet.spec.ts index 85e2b5b3c..913cf6dd9 100644 --- a/apps/api/test/functional/create-wallet.spec.ts +++ b/apps/api/test/functional/create-wallet.spec.ts @@ -7,6 +7,8 @@ import { USER_WALLET_SCHEMA, UserWalletSchema } from "@src/billing/providers"; import { ApiPgDatabase, POSTGRES_DB } from "@src/core"; import { closeConnections } from "@src/db/dbConnection"; +jest.setTimeout(10000); + describe("wallets", () => { const schema = container.resolve(USER_WALLET_SCHEMA); const db = container.resolve(POSTGRES_DB); @@ -26,8 +28,6 @@ describe("wallets", () => { describe("POST /v1/wallets", () => { it("should create a wallet for a user", async () => { - jest.setTimeout(10000); - const userId = faker.string.uuid(); const res = await app.request("/v1/wallets", { method: "POST", diff --git a/apps/api/test/setup-functional-tests.ts b/apps/api/test/setup-functional-tests.ts index d5e7ec147..98c3d0f5f 100644 --- a/apps/api/test/setup-functional-tests.ts +++ b/apps/api/test/setup-functional-tests.ts @@ -4,7 +4,6 @@ import dotenv from "dotenv"; import { container } from "tsyringe"; import { PostgresMigratorService } from "@src/core"; - dotenv.config({ path: ".env.functional.test" }); beforeAll(async () => { diff --git a/docker-compose.build.yml b/docker-compose.build.yml index d9a525fb0..801664f7f 100644 --- a/docker-compose.build.yml +++ b/docker-compose.build.yml @@ -38,11 +38,3 @@ services: target: production args: WORKSPACE: apps/stats-web - - landing: - image: console-landing:${LANDING_TAG:-latest} - build: - dockerfile: docker/Dockerfile.nextjs - target: production - args: - WORKSPACE: apps/landing diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index db2207f4c..400af2b4d 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -41,8 +41,3 @@ services: - '3001:3000' depends_on: - api - - landing: - restart: always - ports: - - '3002:3000' diff --git a/docker-compose.yml b/docker-compose.yml index 6977d738d..c809e2584 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -40,15 +40,3 @@ services: - /app/node_modules - /app/apps/stats-web/node_modules - /app/apps/stats-web/.next - - landing: - build: - target: development - volumes: - - ./apps/landing:/app/apps/landing - - ./package.json:/app/package.json - - ./package-lock.json:/app/package-lock.json - - /app/node_modules - - /app/apps/landing/node_modules - - /app/apps/landing/.next - diff --git a/package-lock.json b/package-lock.json index 498a4fde9..89df1531f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,6 +41,9 @@ "@hono/swagger-ui": "0.2.1", "@hono/zod-openapi": "0.9.5", "@octokit/rest": "^18.12.0", + "@opentelemetry/instrumentation-http": "^0.52.1", + "@opentelemetry/instrumentation-pino": "^0.41.0", + "@opentelemetry/sdk-node": "^0.52.1", "@sentry/node": "^7.55.2", "@supercharge/promise-pool": "^3.2.0", "axios": "^0.27.2", @@ -6454,7 +6457,6 @@ "version": "1.10.8", "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.8.tgz", "integrity": "sha512-vYVqYzHicDqyKB+NQhAc54I1QWCBLCrYG6unqOIcBTHx+7x8C9lcoLj3KVJXs2VB4lUbpWY+Kk9NipcbXYWmvg==", - "peer": true, "dependencies": { "@grpc/proto-loader": "^0.7.13", "@js-sdsl/ordered-map": "^4.4.2" @@ -6467,7 +6469,6 @@ "version": "0.7.13", "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", - "peer": true, "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", @@ -6486,7 +6487,6 @@ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", "hasInstallScript": true, - "peer": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -7825,7 +7825,6 @@ "version": "4.4.2", "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/js-sdsl" @@ -10932,6 +10931,393 @@ "@octokit/openapi-types": "^12.11.0" } }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.52.1.tgz", + "integrity": "sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.25.1.tgz", + "integrity": "sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", + "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.52.1.tgz", + "integrity": "sha512-pVkSH20crBwMTqB3nIN4jpQKUEoB0Z94drIHpYyEqs7UBr+I0cpYyOR3bqjA/UasQUMROb3GX8ZX4/9cVRqGBQ==", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.25.1", + "@opentelemetry/otlp-grpc-exporter-base": "0.52.1", + "@opentelemetry/otlp-transformer": "0.52.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.52.1.tgz", + "integrity": "sha512-05HcNizx0BxcFKKnS5rwOV+2GevLTVIRA0tRgWYyw4yCgR53Ic/xk83toYKts7kbzcI+dswInUg/4s8oyA+tqg==", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/otlp-exporter-base": "0.52.1", + "@opentelemetry/otlp-transformer": "0.52.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.52.1.tgz", + "integrity": "sha512-pt6uX0noTQReHXNeEslQv7x311/F1gJzMnp1HD2qgypLRPbXDeMzzeTngRTUaUbP6hqWNtPxuLr4DEoZG+TcEQ==", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/otlp-exporter-base": "0.52.1", + "@opentelemetry/otlp-transformer": "0.52.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.25.1.tgz", + "integrity": "sha512-RmOwSvkimg7ETwJbUOPTMhJm9A9bG1U8s7Zo3ajDh4zM7eYcycQ0dM7FbLD6NXWbI2yj7UY4q8BKinKYBQksyw==", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz", + "integrity": "sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==", + "dependencies": { + "@opentelemetry/api-logs": "0.52.1", + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.52.1.tgz", + "integrity": "sha512-dG/aevWhaP+7OLv4BQQSEKMJv8GyeOp3Wxl31NHqE8xo9/fYMfEljiZphUHIfyg4gnZ9swMyWjfOQs5GUQe54Q==", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/instrumentation": "0.52.1", + "@opentelemetry/semantic-conventions": "1.25.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pino": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.41.0.tgz", + "integrity": "sha512-Kpv0fJRk/8iMzMk5Ue5BsUJfHkBJ2wQoIi/qduU1a1Wjx9GLj6J2G17PHjPK5mnZjPNzkFOXFADZMfgDioliQw==", + "dependencies": { + "@opentelemetry/api-logs": "^0.52.0", + "@opentelemetry/core": "^1.25.0", + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.52.1.tgz", + "integrity": "sha512-z175NXOtX5ihdlshtYBe5RpGeBoTXVCKPPLiQlD6FHvpM4Ch+p2B0yWKYSrBfLH24H9zjJiBdTrtD+hLlfnXEQ==", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/otlp-transformer": "0.52.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.52.1.tgz", + "integrity": "sha512-zo/YrSDmKMjG+vPeA9aBBrsQM9Q/f2zo6N04WMB3yNldJRsgpRBeLLwvAt/Ba7dpehDLOEFBd1i2JCoaFtpCoQ==", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.25.1", + "@opentelemetry/otlp-exporter-base": "0.52.1", + "@opentelemetry/otlp-transformer": "0.52.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.52.1.tgz", + "integrity": "sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg==", + "dependencies": { + "@opentelemetry/api-logs": "0.52.1", + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-logs": "0.52.1", + "@opentelemetry/sdk-metrics": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1", + "protobufjs": "^7.3.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/protobufjs": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.2.tgz", + "integrity": "sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@opentelemetry/propagator-b3": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.25.1.tgz", + "integrity": "sha512-p6HFscpjrv7//kE+7L+3Vn00VEDUJB0n6ZrjkTYHrJ58QZ8B3ajSJhRbCcY6guQ3PDjTbxWklyvIN2ojVbIb1A==", + "dependencies": { + "@opentelemetry/core": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.25.1.tgz", + "integrity": "sha512-nBprRf0+jlgxks78G/xq72PipVK+4or9Ypntw0gVZYNTCSK8rg5SeaGV19tV920CMqBD/9UIOiFr23Li/Q8tiA==", + "dependencies": { + "@opentelemetry/core": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", + "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.52.1.tgz", + "integrity": "sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA==", + "dependencies": { + "@opentelemetry/api-logs": "0.52.1", + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz", + "integrity": "sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "lodash.merge": "^4.6.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.52.1.tgz", + "integrity": "sha512-uEG+gtEr6eKd8CVWeKMhH2olcCHM9dEK68pe0qE0be32BcCRsvYURhHaD1Srngh1SQcnQzZ4TP324euxqtBOJA==", + "dependencies": { + "@opentelemetry/api-logs": "0.52.1", + "@opentelemetry/core": "1.25.1", + "@opentelemetry/exporter-trace-otlp-grpc": "0.52.1", + "@opentelemetry/exporter-trace-otlp-http": "0.52.1", + "@opentelemetry/exporter-trace-otlp-proto": "0.52.1", + "@opentelemetry/exporter-zipkin": "1.25.1", + "@opentelemetry/instrumentation": "0.52.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-logs": "0.52.1", + "@opentelemetry/sdk-metrics": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1", + "@opentelemetry/sdk-trace-node": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", + "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.25.1.tgz", + "integrity": "sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ==", + "dependencies": { + "@opentelemetry/context-async-hooks": "1.25.1", + "@opentelemetry/core": "1.25.1", + "@opentelemetry/propagator-b3": "1.25.1", + "@opentelemetry/propagator-jaeger": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "engines": { + "node": ">=14" + } + }, "node_modules/@panva/hkdf": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@panva/hkdf/-/hkdf-1.1.1.tgz", @@ -15735,6 +16121,11 @@ "@types/send": "*" } }, + "node_modules/@types/shimmer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.2.0.tgz", + "integrity": "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==" + }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -17499,6 +17890,14 @@ "acorn": "^8" } }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -19141,8 +19540,7 @@ "node_modules/cjs-module-lexer": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", - "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", - "dev": true + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==" }, "node_modules/class-utils": { "version": "0.3.6", @@ -24150,6 +24548,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-in-the-middle": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.9.0.tgz", + "integrity": "sha512-Ng1SJINJDBzyUEkx9Mj32XD8G0TQCUb5TMoL9V91CTn6F3wYZLygLuhNFrv0cNMBZaeptnL1zecV6XrIdHJ+xQ==", + "dependencies": { + "acorn": "^8.8.2", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -27903,8 +28312,7 @@ "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "peer": true + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, "node_modules/lodash.castarray": { "version": "4.4.0", @@ -29137,6 +29545,11 @@ "integrity": "sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==", "dev": true }, + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + }, "node_modules/module-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", @@ -32833,6 +33246,19 @@ "node": ">=0.10.0" } }, + "node_modules/require-in-the-middle": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.3.0.tgz", + "integrity": "sha512-nQFEv9gRw6SJAwWD2LrL0NmQvAcO7FBwJbwmr2ttPAacfy0xuiOjE5zt+zM4xDyuyvUaxBi/9gb2SoCyNEVJcw==", + "dependencies": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=8.6.0" + } + }, "node_modules/require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -33719,6 +34145,11 @@ "node": ">=8" } }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, "node_modules/side-channel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", diff --git a/package.json b/package.json index eeb7d7d45..863b3ce93 100644 --- a/package.json +++ b/package.json @@ -1,29 +1,32 @@ { "name": "@akashnetwork/console", - "packageManager": "npm@10.7.0", "workspaces": [ "./packages/*", "./apps/*" ], "scripts": { + "api:dev": "turbo dev --filter=\"./apps/api\"", + "console:dev": "turbo dev --filter=\"./apps/deploy-web/\" --filter=\"./apps/api\" --filter=\"./apps/provider-proxy/\"", + "console:dev:full-no-db": "cross-env SKIP_DC_DB=true turbo dev --filter=\"./apps/deploy-web/\" --filter=\"./apps/api\" --filter=\"./apps/indexer\" --filter=\"./apps/provider-proxy/\"", + "console:dev:no-db": "cross-env SKIP_DC_DB=true turbo dev --filter=\"./apps/deploy-web/\" --filter=\"./apps/api\" --filter=\"./apps/provider-proxy/\"", "dc:build": "docker compose -f docker-compose.build.yml build", "dc:down": "docker compose -p console down", + "dc:up:db": "cross-env-shell '[ \\\"$SKIP_DC_DB\\\" != \\\"true\\\" ] && npm run dc:up:prod -- -d db || echo \\\"Skipping DB setup\\\"'", "dc:up:dev": "docker compose -p console -f docker-compose.build.yml -f docker-compose.prod.yml -f docker-compose.prod-with-db.yml -f docker-compose.yml up", "dc:up:dev:no-db": "docker compose -p console -f docker-compose.build.yml -f docker-compose.prod.yml -f docker-compose.yml up", "dc:up:prod": "docker compose -p console -f docker-compose.build.yml -f docker-compose.prod.yml -f docker-compose.prod-with-db.yml up", - "dc:up:db": "cross-env-shell '[ \\\"$SKIP_DC_DB\\\" != \\\"true\\\" ] && npm run dc:up:prod -- -d db || echo \\\"Skipping DB setup\\\"'", "dc:up:prod:no-db": "docker compose -p console -f docker-compose.build.yml -f docker-compose.prod.yml up", - "console:dev": "turbo dev --filter=\"./apps/deploy-web/\" --filter=\"./apps/api\" --filter=\"./apps/provider-proxy/\"", - "console:dev:no-db": "cross-env SKIP_DC_DB=true turbo dev --filter=\"./apps/deploy-web/\" --filter=\"./apps/api\" --filter=\"./apps/provider-proxy/\"", - "console:dev:full-no-db": "cross-env SKIP_DC_DB=true turbo dev --filter=\"./apps/deploy-web/\" --filter=\"./apps/api\" --filter=\"./apps/indexer\" --filter=\"./apps/provider-proxy/\"", - "stats:dev": "turbo dev --filter=\"./apps/stats-web/\" --filter=\"./apps/api\"", - "stats:dev:no-db": "cross-env SKIP_DC_DB=true turbo dev --filter=\"./apps/stats-web/\" --filter=\"./apps/api\"", - "api:dev": "turbo dev --filter=\"./apps/api\"", - "indexer:dev": "turbo dev --filter=\"./apps/indexer\"", "format": "prettier --write ./*.{js,json} **/*.{ts,tsx,js,json}", + "indexer:dev": "turbo dev --filter=\"./apps/indexer\"", "lint": "eslint .", "lint:api": "eslint ./apps/api", - "pretty": "prettier --write \"./**/*.{js,jsx,mjs,cjs,ts,tsx,json}\"" + "pretty": "prettier --write \"./**/*.{js,jsx,mjs,cjs,ts,tsx,json}\"", + "stats:dev": "turbo dev --filter=\"./apps/stats-web/\" --filter=\"./apps/api\"", + "stats:dev:no-db": "cross-env SKIP_DC_DB=true turbo dev --filter=\"./apps/stats-web/\" --filter=\"./apps/api\"" + }, + "dependencies": { + "drizzle-orm": "^0.31.2", + "pg": "^8.11.6" }, "devDependencies": { "@akashnetwork/dev-config": "*", @@ -34,12 +37,9 @@ "node": "20.14.0", "npm": "10.7.0" }, + "packageManager": "npm@10.7.0", "volta": { "node": "20.14.0", "npm": "10.7.0" - }, - "dependencies": { - "drizzle-orm": "^0.31.2", - "pg": "^8.11.6" } }