mega-framework 0.1.5 โ 0.1.7
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/bin/mega-ws-hub.js +2 -2
- package/package.json +32 -8
- package/sample/crud/.env +156 -8
- package/sample/crud/.env.example +153 -28
- package/sample/crud/.mega/journal/history/20260612092543-create-users.json +261 -0
- package/sample/crud/.mega/journal/snapshot.json +261 -0
- package/sample/crud/apps/main/controllers/auth-controller.js +22 -14
- package/sample/crud/apps/main/controllers/web-controller.js +7 -5
- package/sample/crud/apps/main/migrations/20260606000001-create-users.js +91 -13
- package/sample/crud/apps/main/migrations/20260606000002-create-boards.js +165 -0
- package/sample/crud/apps/main/migrations/20260606000003-create-logs.js +107 -0
- package/sample/crud/apps/main/models/log-partition-model.js +105 -0
- package/sample/crud/apps/main/models/note-model.js +79 -0
- package/sample/crud/apps/main/models/user-level-model.js +24 -0
- package/sample/crud/apps/main/models/user-model.js +146 -0
- package/sample/crud/apps/main/models/user-type-model.js +21 -0
- package/sample/crud/apps/main/models/wallet-model.js +24 -0
- package/sample/crud/apps/main/routes/users.js +55 -10
- package/sample/crud/apps/main/schedules/log-partition-schedule.js +33 -0
- package/sample/crud/apps/main/services/auth-service.js +39 -24
- package/sample/crud/apps/main/services/log-partition-service.js +101 -0
- package/sample/crud/apps/main/services/note-service.js +6 -6
- package/sample/crud/apps/main/services/redis-demo-service.js +3 -3
- package/sample/crud/apps/main/services/user-service.js +62 -21
- package/sample/crud/apps/main/views/auth/login.ejs +6 -6
- package/sample/crud/apps/main/views/auth/register.ejs +46 -5
- package/sample/crud/apps/main/views/users/edit.ejs +42 -5
- package/sample/crud/apps/main/views/users/list.ejs +6 -2
- package/sample/crud/apps/main/views/users/new.ejs +56 -4
- package/sample/crud/docs/log_partition_design.mm.md +23 -0
- package/sample/crud/mega.config.js +63 -3
- package/sample/crud/package.json +3 -3
- package/sample/crud/scripts/start-ws-hub.sh +2 -2
- package/sample/simple/package.json +2 -2
- package/src/adapters/adapter-manager.js +2 -1
- package/src/adapters/adapter-options.js +30 -0
- package/src/adapters/maria-adapter.js +26 -3
- package/src/adapters/mega-db-adapter.js +7 -1
- package/src/adapters/mongo-adapter.js +19 -1
- package/src/adapters/postgres-adapter.js +25 -2
- package/src/adapters/sqlite-adapter.js +20 -1
- package/src/cli/commands/new.js +13 -3
- package/src/cli/commands/scaffold.js +137 -33
- package/src/cli/generators/index.js +82 -2
- package/src/cli/index.js +478 -104
- package/src/core/ajv-mapper.js +27 -2
- package/src/core/boot.js +485 -237
- package/src/core/cluster-metrics.js +13 -4
- package/src/core/config-validator.js +25 -0
- package/src/core/ctx-builder.js +6 -2
- package/src/core/envelope.js +112 -12
- package/src/core/hub-link.js +65 -4
- package/src/core/i18n.js +11 -1
- package/src/core/index.js +6 -2
- package/src/core/mega-app.js +223 -481
- package/src/core/mega-cluster.js +54 -13
- package/src/core/mega-server.js +40 -9
- package/src/core/migration/dialect-registry.js +107 -0
- package/src/core/migration/dialects/README.md +62 -0
- package/src/core/migration/dialects/maria.js +496 -0
- package/src/core/migration/dialects/mongo.js +824 -0
- package/src/core/migration/dialects/postgres.js +563 -0
- package/src/core/migration/dialects/sqlite.js +476 -0
- package/src/core/migration/differ.js +456 -0
- package/src/core/migration/generate.js +508 -0
- package/src/core/migration/journal.js +167 -0
- package/src/core/migration/model-scan.js +84 -0
- package/src/core/migration/mongo-migration-db.js +97 -0
- package/src/core/migration/schema-builder.js +400 -0
- package/src/core/migration/schema-validator.js +315 -0
- package/src/core/migration-lock.js +205 -0
- package/src/core/migration-runner.js +166 -38
- package/src/core/multipart.js +28 -5
- package/src/core/pipeline.js +129 -0
- package/src/core/router.js +70 -65
- package/src/core/scope-registry.js +0 -1
- package/src/core/security.js +67 -9
- package/src/core/workers-manager.js +12 -1
- package/src/core/ws-cluster.js +10 -3
- package/src/core/ws-message.js +48 -4
- package/src/core/ws-presence.js +624 -0
- package/src/core/ws-roster.js +4 -1
- package/src/core/ws-upgrade.js +118 -12
- package/src/index.js +1 -1
- package/src/lib/hub-protocol.js +29 -0
- package/src/lib/mega-health.js +25 -4
- package/src/lib/mega-job-queue.js +98 -21
- package/src/lib/mega-job.js +29 -0
- package/src/lib/mega-logger.js +1 -1
- package/src/lib/mega-metrics.js +3 -12
- package/src/lib/mega-plugin.js +34 -3
- package/src/lib/mega-schedule.js +40 -22
- package/src/lib/mega-shutdown.js +162 -49
- package/src/lib/mega-tracing.js +66 -19
- package/src/lib/mega-worker.js +5 -1
- package/src/lib/otel-resource.js +36 -0
- package/src/{cli โ lib}/ws-hub.js +51 -8
- package/src/models/crud-sql-builder.js +133 -0
- package/src/models/mega-model.js +82 -2
- package/src/models/model-crud.js +483 -0
- package/src/models/mongo-crud.js +285 -0
- package/templates/model/code-mongo.tpl +35 -0
- package/templates/model/code.tpl +15 -1
- package/templates/model/test-mongo.tpl +38 -0
- package/templates/model/test.tpl +4 -0
- package/types/adapters/adapter-manager.d.ts +95 -0
- package/types/adapters/adapter-options.d.ts +91 -0
- package/types/adapters/file-adapter.d.ts +94 -0
- package/types/adapters/file-session-adapter.d.ts +101 -0
- package/types/adapters/index.d.ts +20 -0
- package/types/adapters/maria-adapter.d.ts +115 -0
- package/types/adapters/mega-adapter.d.ts +215 -0
- package/types/adapters/mega-bus-adapter.d.ts +45 -0
- package/types/adapters/mega-cache-adapter.d.ts +47 -0
- package/types/adapters/mega-db-adapter.d.ts +47 -0
- package/types/adapters/mega-lock-adapter.d.ts +62 -0
- package/types/adapters/mega-log-sink-adapter.d.ts +15 -0
- package/types/adapters/mega-session-adapter.d.ts +32 -0
- package/types/adapters/mongo-adapter.d.ts +139 -0
- package/types/adapters/nats-adapter.d.ts +108 -0
- package/types/adapters/postgres-adapter.d.ts +139 -0
- package/types/adapters/redis-adapter.d.ts +70 -0
- package/types/adapters/redis-session-adapter.d.ts +82 -0
- package/types/adapters/redlock-adapter.d.ts +149 -0
- package/types/adapters/registry.d.ts +46 -0
- package/types/adapters/sqlite-adapter.d.ts +106 -0
- package/types/auth/index.d.ts +24 -0
- package/types/cli/commands/console-cmd.d.ts +37 -0
- package/types/cli/commands/new.d.ts +16 -0
- package/types/cli/commands/routes.d.ts +36 -0
- package/types/cli/commands/scaffold.d.ts +78 -0
- package/types/cli/commands/test-cmd.d.ts +14 -0
- package/types/cli/generators/index.d.ts +112 -0
- package/types/cli/index.d.ts +249 -0
- package/types/cli/template-engine.d.ts +40 -0
- package/types/core/ajv-mapper.d.ts +27 -0
- package/types/core/boot.d.ts +233 -0
- package/types/core/cluster-metrics.d.ts +52 -0
- package/types/core/config-loader.d.ts +13 -0
- package/types/core/config-validator.d.ts +30 -0
- package/types/core/ctx-builder.d.ts +80 -0
- package/types/core/envelope.d.ts +79 -0
- package/types/core/error-mapper.d.ts +17 -0
- package/types/core/formbody.d.ts +41 -0
- package/types/core/hub-link.d.ts +264 -0
- package/types/core/i18n.d.ts +178 -0
- package/types/core/index.d.ts +28 -0
- package/types/core/mega-app.d.ts +529 -0
- package/types/core/mega-cluster.d.ts +104 -0
- package/types/core/mega-server.d.ts +91 -0
- package/types/core/mega-service.d.ts +31 -0
- package/types/core/migration/dialect-registry.d.ts +22 -0
- package/types/core/migration/dialects/maria.d.ts +99 -0
- package/types/core/migration/dialects/mongo.d.ts +89 -0
- package/types/core/migration/dialects/postgres.d.ts +117 -0
- package/types/core/migration/dialects/sqlite.d.ts +111 -0
- package/types/core/migration/differ.d.ts +47 -0
- package/types/core/migration/generate.d.ts +56 -0
- package/types/core/migration/journal.d.ts +52 -0
- package/types/core/migration/model-scan.d.ts +19 -0
- package/types/core/migration/mongo-migration-db.d.ts +7 -0
- package/types/core/migration/schema-builder.d.ts +197 -0
- package/types/core/migration/schema-validator.d.ts +20 -0
- package/types/core/migration-lock.d.ts +33 -0
- package/types/core/migration-runner.d.ts +101 -0
- package/types/core/multipart.d.ts +86 -0
- package/types/core/openapi.d.ts +62 -0
- package/types/core/pipeline.d.ts +92 -0
- package/types/core/router.d.ts +159 -0
- package/types/core/routes-loader.d.ts +21 -0
- package/types/core/scope-registry.d.ts +14 -0
- package/types/core/security.d.ts +77 -0
- package/types/core/services-loader.d.ts +27 -0
- package/types/core/session-cleanup-schedule.d.ts +19 -0
- package/types/core/session-store.d.ts +18 -0
- package/types/core/session.d.ts +77 -0
- package/types/core/static-assets.d.ts +73 -0
- package/types/core/template.d.ts +106 -0
- package/types/core/workers-manager.d.ts +79 -0
- package/types/core/ws-cluster.d.ts +208 -0
- package/types/core/ws-compression.d.ts +112 -0
- package/types/core/ws-controller.d.ts +65 -0
- package/types/core/ws-message.d.ts +106 -0
- package/types/core/ws-presence.d.ts +273 -0
- package/types/core/ws-roster.d.ts +96 -0
- package/types/core/ws-upgrade.d.ts +231 -0
- package/types/errors/config-error.d.ts +10 -0
- package/types/errors/http-errors.d.ts +120 -0
- package/types/errors/index.d.ts +3 -0
- package/types/errors/mega-error.d.ts +32 -0
- package/types/index.d.ts +39 -0
- package/types/lib/asp/config.d.ts +49 -0
- package/types/lib/asp/crypto.d.ts +43 -0
- package/types/lib/asp/errors.d.ts +30 -0
- package/types/lib/asp/nonce-cache.d.ts +52 -0
- package/types/lib/asp/plugin.d.ts +30 -0
- package/types/lib/asp/ws-terminator.d.ts +45 -0
- package/types/lib/env-mapper.d.ts +14 -0
- package/types/lib/hub-protocol.d.ts +106 -0
- package/types/lib/index.d.ts +22 -0
- package/types/lib/logger/telegram-core.d.ts +104 -0
- package/types/lib/logger/telegram-transport.d.ts +45 -0
- package/types/lib/mega-brute-force.d.ts +66 -0
- package/types/lib/mega-circuit-breaker.d.ts +241 -0
- package/types/lib/mega-cron.d.ts +66 -0
- package/types/lib/mega-hash.d.ts +32 -0
- package/types/lib/mega-health.d.ts +41 -0
- package/types/lib/mega-job-queue.d.ts +176 -0
- package/types/lib/mega-job-worker.d.ts +130 -0
- package/types/lib/mega-job.d.ts +138 -0
- package/types/lib/mega-logger.d.ts +45 -0
- package/types/lib/mega-metrics.d.ts +285 -0
- package/types/lib/mega-plugin.d.ts +245 -0
- package/types/lib/mega-retry.d.ts +85 -0
- package/types/lib/mega-schedule.d.ts +260 -0
- package/types/lib/mega-shutdown.d.ts +135 -0
- package/types/lib/mega-tracing.d.ts +224 -0
- package/types/lib/mega-worker.d.ts +127 -0
- package/types/lib/otel-resource.d.ts +16 -0
- package/types/lib/worker-runner/process-entry.d.ts +1 -0
- package/types/lib/worker-runner/task-dispatch.d.ts +28 -0
- package/types/lib/worker-runner/thread-entry.d.ts +1 -0
- package/types/lib/ws-hub.d.ts +234 -0
- package/types/models/crud-sql-builder.d.ts +48 -0
- package/types/models/index.d.ts +1 -0
- package/types/models/mega-model.d.ts +138 -0
- package/types/models/model-crud.d.ts +82 -0
- package/types/models/mongo-crud.d.ts +59 -0
- package/types/test/index.d.ts +84 -0
- package/.env +0 -127
- package/sample/crud/apps/main/migrations/20260606000002-add-auth-to-users.js +0 -30
- package/sample/crud/apps/main/models/note.js +0 -71
- package/sample/crud/apps/main/models/user.js +0 -86
- package/sample/crud/package-lock.json +0 -5665
- package/sample/crud/yarn.lock +0 -2142
- package/sample/simple/package-lock.json +0 -1851
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ์ค์ผ์ค ๋ถ์ฐ ๋ฝ ์ค์ . **lock ๋๋ฉ์ธ์ cache ์ ๋ณ๊ฐ**(ADR-113) โ `ctx.lock(alias)`.
|
|
3
|
+
*
|
|
4
|
+
* @typedef {Object} MegaScheduleLock
|
|
5
|
+
* @property {string} lock - lock ์ด๋ํฐ ๋ณ๋ช
(`ctx.lock(alias)` ๋ก ํด์). 03-api-spec ์ ์ `cache` ํ๋๋ฅผ
|
|
6
|
+
* ๋์ฒดํ๋ค(lock ์ด ๋
๋ฆฝ ๋๋ฉ์ธ์ด ๋ ๋ค ์ ํฉ โ ADR-118).
|
|
7
|
+
* @property {number} ttl - ๋ฝ ๋ณด์ ์๊ฐ(**๋ฐ๋ฆฌ์ด**, ์์ ์ ์). ์๊ณ๊ตฌ์ญ ๋์ **์๋ ์ฐ์ฅ**๋๋ฏ๋ก
|
|
8
|
+
* (redlock `using`) ์์
์ด ttl ์ ๋๊ฒจ๋ ์ค๋ณต ์คํ๋์ง ์๋๋ค โ ttl ์ "์ฐ์ฅ 1ํ๋ถ ์๋์ฐ"๋ค.
|
|
9
|
+
* โ ๏ธ redlock ์ `ttl โฅ automaticExtensionThreshold(๊ธฐ๋ณธ 500ms) + 100ms` ๋ฅผ ์๊ตฌํ๋ค(๊ธฐ๋ณธ ์ค์ ๊ธฐ์ค
|
|
10
|
+
* **600ms ์ด์**) โ ๋ฏธ๋ฌ์ด๋ฉด fire ์ skip(error ๋๋ด)์ผ๋ก ํ๋ฉดํ๋๋ค.
|
|
11
|
+
* @property {string} [key] - ๋ฝ ์์ ํค. ๋ฏธ์ง์ ์ `mega:schedule:<ํด๋์ค๋ช
>`.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* ์ค์ผ์ค ์์
๋ฒ ์ด์ค ํด๋์ค. ์๋ธํด๋์ค๊ฐ static ์ค์ ๊ณผ `run(ctx)` ๋ฅผ ์ ์ํ๋ค.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* export class DailyCleanup extends MegaSchedule {
|
|
18
|
+
* static cron = '0 3 * * *'
|
|
19
|
+
* static timezone = 'Asia/Seoul'
|
|
20
|
+
* static lock = { lock: 'main', ttl: 60_000 } // ๋ถ์ฐ ์ค๋ณต๋ฐฉ์ง (ms!)
|
|
21
|
+
* async run(ctx) {
|
|
22
|
+
* await ctx.db('main').native.query('DELETE FROM tmp WHERE ...')
|
|
23
|
+
* }
|
|
24
|
+
* }
|
|
25
|
+
*/
|
|
26
|
+
export class MegaSchedule {
|
|
27
|
+
/** @type {string|undefined} cron ํํ์(ํ์ โ ๋ฏธ์ ์ ์ register ์์ throw). */
|
|
28
|
+
static cron: string | undefined;
|
|
29
|
+
/** @type {string|undefined} IANA ํ์์กด(์: 'Asia/Seoul'). ๋ฏธ์ง์ ์ ํธ์คํธ ๋ก์ปฌ. */
|
|
30
|
+
static timezone: string | undefined;
|
|
31
|
+
/** @type {MegaScheduleLock|undefined} ๋ถ์ฐ ์ค๋ณต๋ฐฉ์ง ๋ฝ ์ค์ . ๋ฏธ์ง์ ์ ์ค๋ณต๋ฐฉ์ง ์์ด ์คํ. */
|
|
32
|
+
static lock: MegaScheduleLock | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* ์ค์ผ์ค ์๊ฐ๋ง๋ค ์คํ๋๋ ๋ณธ๋ฌธ. ์๋ธํด๋์ค๊ฐ **๋ฐ๋์** ๊ตฌํํ๋ค.
|
|
35
|
+
* @param {Record<string, any>} _ctx - ์คํ ์ปจํ
์คํธ(`db/cache/bus/lock` ์ ๊ทผ์ ๋ฑ, ctx-builder ์ฐธ์กฐ).
|
|
36
|
+
* @returns {Promise<any>}
|
|
37
|
+
* @throws {Error} ์๋ธํด๋์ค๊ฐ ๊ตฌํํ์ง ์์ผ๋ฉด.
|
|
38
|
+
*/
|
|
39
|
+
run(_ctx: Record<string, any>): Promise<any>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* @typedef {Object} MegaScheduleFireResult - {@link MegaScheduler#runNow} / ๋ด๋ถ fire ์ ๊ฒฐ๊ณผ.
|
|
43
|
+
* @property {string} name - ์ค์ผ์ค ํด๋์ค๋ช
.
|
|
44
|
+
* @property {boolean} ran - ์ค์ ๋ก run(ctx) ๊ฐ ํธ์ถ๋๋์ง(skip ์ด๋ฉด false).
|
|
45
|
+
* @property {boolean} skipped - ๋ฝ ๋ฏธํ๋์ผ๋ก ๊ฑด๋๋ฐ์๋์ง.
|
|
46
|
+
* @property {boolean} ok - run(ctx) ๊ฐ ์๋ฌ ์์ด ๋๋ฌ๋์ง(skip ์ด๋ฉด false).
|
|
47
|
+
* @property {any} [result] - run(ctx) ๋ฐํ๊ฐ(์ฑ๊ณต ์).
|
|
48
|
+
* @property {Error} [error] - ์คํจ/skip ์ฌ์ .
|
|
49
|
+
*/
|
|
50
|
+
/**
|
|
51
|
+
* @typedef {Object} ScheduleEntry - ๋ฑ๋ก๋ ์ค์ผ์ค 1๊ฑด์ ๋ด๋ถ ๋ฉํ๋ฐ์ดํฐ.
|
|
52
|
+
* @property {string} name - ์ค์ผ์ค ํด๋์ค๋ช
(= ๋ฑ๋ก ํค).
|
|
53
|
+
* @property {typeof MegaSchedule} ScheduleClass - ๋ฑ๋ก๋ ํด๋์ค.
|
|
54
|
+
* @property {MegaSchedule} instance - ์ธ์คํด์ค(run ํธ์ถ ๋์).
|
|
55
|
+
* @property {string} cron - cron ํํ์.
|
|
56
|
+
* @property {string|undefined} timezone - IANA ํ์์กด.
|
|
57
|
+
* @property {MegaScheduleLock|undefined} lock - ๋ถ์ฐ ๋ฝ ์ค์ .
|
|
58
|
+
* @property {Cron|null} job - start() ๊ฐ ๋ง๋ croner ํธ๋ค(๋ฏธ start ๋ฉด null).
|
|
59
|
+
*/
|
|
60
|
+
/**
|
|
61
|
+
* ๋ฑ๋ก๋ ์ค์ผ์ค๋ค์ cron ์๊ฐ์ ์คํํ๋ ๋ฐํ์. ์๊ฐ/ํ์ด๋จธ๋ croner, ๋ถ์ฐ ์ค๋ณต๋ฐฉ์ง๋ lock ์ด๋ํฐ์ ์์.
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* const scheduler = new MegaScheduler({ ctx }) // ctx ๋ lock ์ฌ์ฉ ์ ctx.lock(alias) ํ์
|
|
65
|
+
* scheduler.on('skip', (e) => log.debug(e, 'schedule skipped'))
|
|
66
|
+
* scheduler.on('fail', (e) => log.error(e, 'schedule failed'))
|
|
67
|
+
* scheduler.register(DailyCleanup).start()
|
|
68
|
+
* // graceful shutdown
|
|
69
|
+
* scheduler.stop()
|
|
70
|
+
*/
|
|
71
|
+
export class MegaScheduler extends EventEmitter<any> {
|
|
72
|
+
/**
|
|
73
|
+
* @param {object} [args]
|
|
74
|
+
* @param {Record<string, any>} [args.ctx] - ์คํ ์ปจํ
์คํธ. ์ค์ผ์ค์ด `static lock` ์ ์ฐ๋ฉด `ctx.lock`
|
|
75
|
+
* (ํจ์)์ด ์์ด์ผ ํ๋ค(์์ผ๋ฉด fire ์ throw). lock ๋ฏธ์ฌ์ฉ์ด๋ฉด ์๋ต ๊ฐ๋ฅ.
|
|
76
|
+
*/
|
|
77
|
+
constructor({ ctx }?: {
|
|
78
|
+
ctx?: Record<string, any>;
|
|
79
|
+
});
|
|
80
|
+
/**
|
|
81
|
+
* ์ด๋ฒคํธ ๊ตฌ๋
. ์ ์ ์๋ ์ด๋ฒคํธ๋ช
์ ์คํ๋ก ๋ณด๊ณ throw(MegaCircuitBreaker ์ ๋์ผ).
|
|
82
|
+
* @param {'run'|'skip'|'done'|'fail'} event @param {(payload: any) => void} listener @returns {this}
|
|
83
|
+
* @throws {RangeError} ์ ์ ์๋ ์ด๋ฒคํธ๋ช
์ผ ๋.
|
|
84
|
+
*/
|
|
85
|
+
on(event: "run" | "skip" | "done" | "fail", listener: (payload: any) => void): this;
|
|
86
|
+
/**
|
|
87
|
+
* {@link MegaScheduler#on} ์ผ๋ก ๋ฑ๋กํ ๋ฆฌ์ค๋ ํด์ . ๋์ผ ํ์ดํธ๋ฆฌ์คํธ ๊ฒ์ฆ. (`removeListener` ๋ณ์นญ๋ ๋ณดํธ.)
|
|
88
|
+
* @param {'run'|'skip'|'done'|'fail'} event @param {(payload: any) => void} listener @returns {this}
|
|
89
|
+
* @throws {RangeError} ์ ์ ์๋ ์ด๋ฒคํธ๋ช
์ผ ๋.
|
|
90
|
+
*/
|
|
91
|
+
off(event: "run" | "skip" | "done" | "fail", listener: (payload: any) => void): this;
|
|
92
|
+
/**
|
|
93
|
+
* 1ํ์ฑ ๊ตฌ๋
(EventEmitter `once`). on() ๊ณผ ๋์ผ ํ์ดํธ๋ฆฌ์คํธ(L-1).
|
|
94
|
+
* @param {'run'|'skip'|'done'|'fail'} event @param {(payload: any) => void} listener @returns {this}
|
|
95
|
+
* @throws {RangeError} ์ ์ ์๋ ์ด๋ฒคํธ๋ช
์ผ ๋.
|
|
96
|
+
*/
|
|
97
|
+
once(event: "run" | "skip" | "done" | "fail", listener: (payload: any) => void): this;
|
|
98
|
+
/**
|
|
99
|
+
* `on` ์ EventEmitter ๋ณ์นญ. ์ฐํ๋ก ํ์ดํธ๋ฆฌ์คํธ๋ฅผ ๋น๊ปด๊ฐ์ง ์๋๋ก ๋์ผ ๊ฒ์ฆ(L-1).
|
|
100
|
+
* @param {'run'|'skip'|'done'|'fail'} event @param {(payload: any) => void} listener @returns {this}
|
|
101
|
+
* @throws {RangeError} ์ ์ ์๋ ์ด๋ฒคํธ๋ช
์ผ ๋.
|
|
102
|
+
*/
|
|
103
|
+
addListener(event: "run" | "skip" | "done" | "fail", listener: (payload: any) => void): this;
|
|
104
|
+
/**
|
|
105
|
+
* `off` ์ EventEmitter ๋ณ์นญ. ๋์ผ ํ์ดํธ๋ฆฌ์คํธ ๊ฒ์ฆ(L-1).
|
|
106
|
+
* @param {'run'|'skip'|'done'|'fail'} event @param {(payload: any) => void} listener @returns {this}
|
|
107
|
+
* @throws {RangeError} ์ ์ ์๋ ์ด๋ฒคํธ๋ช
์ผ ๋.
|
|
108
|
+
*/
|
|
109
|
+
removeListener(event: "run" | "skip" | "done" | "fail", listener: (payload: any) => void): this;
|
|
110
|
+
/**
|
|
111
|
+
* ๋ฆฌ์ค๋๋ฅผ ํ ์์ ์ถ๊ฐ(EventEmitter `prependListener`). ๋์ผ ํ์ดํธ๋ฆฌ์คํธ ๊ฒ์ฆ(L-1).
|
|
112
|
+
* @param {'run'|'skip'|'done'|'fail'} event @param {(payload: any) => void} listener @returns {this}
|
|
113
|
+
* @throws {RangeError} ์ ์ ์๋ ์ด๋ฒคํธ๋ช
์ผ ๋.
|
|
114
|
+
*/
|
|
115
|
+
prependListener(event: "run" | "skip" | "done" | "fail", listener: (payload: any) => void): this;
|
|
116
|
+
/**
|
|
117
|
+
* 1ํ์ฑ ๋ฆฌ์ค๋๋ฅผ ํ ์์ ์ถ๊ฐ(EventEmitter `prependOnceListener`). ๋์ผ ํ์ดํธ๋ฆฌ์คํธ ๊ฒ์ฆ(L-1).
|
|
118
|
+
* @param {'run'|'skip'|'done'|'fail'} event @param {(payload: any) => void} listener @returns {this}
|
|
119
|
+
* @throws {RangeError} ์ ์ ์๋ ์ด๋ฒคํธ๋ช
์ผ ๋.
|
|
120
|
+
*/
|
|
121
|
+
prependOnceListener(event: "run" | "skip" | "done" | "fail", listener: (payload: any) => void): this;
|
|
122
|
+
/**
|
|
123
|
+
* ์ค์ผ์ค ํด๋์ค๋ฅผ ๋ฑ๋กํ๋ค(์์ง ์คํ ์ ํจ โ {@link MegaScheduler#start} ๊ฐ ํ์ด๋จธ๋ฅผ ๊ฑด๋ค).
|
|
124
|
+
* cron ํํ์ยทlock ์ค์ ์ ์ฆ์ ๊ฒ์ฆํด ์๋ชป๋ ๋ฑ๋ก์ ๋ถํ
์์ ์ ๋๋ฌ๋ธ๋ค(์ถ์ธก ์งํ ๊ธ์ง).
|
|
125
|
+
*
|
|
126
|
+
* @param {typeof MegaSchedule} ScheduleClass - `MegaSchedule` ๋ฅผ ์์ํ ํด๋์ค.
|
|
127
|
+
* @returns {this} ์ฒด์ด๋์ฉ.
|
|
128
|
+
* @throws {TypeError} MegaSchedule ์๋ธํด๋์ค๊ฐ ์๋๊ฑฐ๋ cron ์ด ๋น์์ ๋.
|
|
129
|
+
* @throws {Error} cron ํํ์ ๋ฌดํจ, ์ด๋ฆ ์ค๋ณต, lock ์ค์ ํ์ ์ค๋ฅ ์.
|
|
130
|
+
*/
|
|
131
|
+
register(ScheduleClass: typeof MegaSchedule): this;
|
|
132
|
+
/**
|
|
133
|
+
* ๋ฑ๋ก๋ ๋ชจ๋ ์ค์ผ์ค์ croner ํ์ด๋จธ๋ฅผ ๊ฑธ์ด cron ์๊ฐ๋ง๋ค ์๋ ์คํํ๋ค. ์ด๋ฏธ start ๋ ์ค์ผ์ค์ ๊ฑด๋๋ด๋ค.
|
|
134
|
+
*
|
|
135
|
+
* croner ์ต์
: `protect`(๊ฐ์ ์ธ์คํด์ค์์ ์ด์ ์คํ์ด ์ ๋๋ฌ์ผ๋ฉด ์ ํธ๋ฆฌ๊ฑฐ ์ฐจ๋จ โ ๋จ์ผ ํ๋ก์ธ์ค overrun
|
|
136
|
+
* ๋ฐฉ์ง), `unref`(ํ์ด๋จธ๊ฐ ํ๋ก์ธ์ค ์ข
๋ฃ๋ฅผ ๋ง์ง ์์ โ graceful/ํ
์คํธ), `catch`(ํ์ด๋จธ ์ฝ๋ฐฑ์ ๋ฏธ์ฒ๋ฆฌ
|
|
137
|
+
* ์๋ฌ๋ฅผ `fail` ์ด๋ฒคํธ๋ก ๋ผ์ฐํ
โ unhandled rejection ๋ฐฉ์ง).
|
|
138
|
+
*
|
|
139
|
+
* @returns {this} ์ฒด์ด๋์ฉ.
|
|
140
|
+
*/
|
|
141
|
+
start(): this;
|
|
142
|
+
/**
|
|
143
|
+
* ๋ชจ๋ ์ค์ผ์ค ํ์ด๋จธ๋ฅผ ์๊ตฌ ์ค๋จํ๋ค(graceful shutdown ํ์ โ ์ ๋ถ๋ฅด๋ฉด ํ์ด๋จธ๊ฐ ํ๋ก์ธ์ค ์ข
๋ฃ๋ฅผ
|
|
144
|
+
* ๋ฆ์ถ ์ ์๋ค). croner `stop()` ํ์ ๊ฐ์ ์ธ์คํด์ค๋ฅผ resume ํ ์ ์์ด, job ํธ๋ค์ ๋น์ฐ๊ณ ์ฌ start ์
|
|
145
|
+
* ์๋ก ๋ง๋ ๋ค. ์งํ ์ค์ธ run(ctx) ์ ์ค๋จํ์ง ์๋๋ค(์๋ฃ๊น์ง ๋๊ธฐ๋ ํธ์ถ๋ถ ์ฑ
์).
|
|
146
|
+
* @returns {this} ์ฒด์ด๋์ฉ.
|
|
147
|
+
*/
|
|
148
|
+
stop(): this;
|
|
149
|
+
/**
|
|
150
|
+
* ์ค์ผ์ค์ **์ง๊ธ ์ฆ์** ํ ๋ฒ ์คํํ๋ค(cron ์๊ฐ ๋ฌด์). ๋ถ์ฐ ์ค๋ณต๋ฐฉ์ง ๋ก์ง์ ๊ทธ๋๋ก ์ ์ฉ๋๋ค โ
|
|
151
|
+
* ํ
์คํธยท์ด์ ์๋ ํธ๋ฆฌ๊ฑฐยทCLI ์ฉ.
|
|
152
|
+
*
|
|
153
|
+
* โ ๏ธ overlap: lock ๋ฏธ์ฌ์ฉ ์ค์ผ์ค์ `runNow` ํธ์ถ ์ croner ์ ์๋ ํธ๋ฆฌ๊ฑฐ์ **๋์ผ ํ๋ก์ธ์ค ๋ด์์
|
|
154
|
+
* overlap** ํ ์ ์๋ค(croner `protect` ๋ ํ์ด๋จธ ํธ๋ฆฌ๊ฑฐ๋ผ๋ฆฌ๋ง ๋ง๊ณ ์๋ `runNow` ๋ ๋ง์ง ์๋๋ค).
|
|
155
|
+
* ๋ถ์ฐ/๋์ผํ๋ก์ธ์ค ์ค๋ณต๋ฐฉ์ง๊ฐ ํ์ํ ์์
์ `static lock` ์ ์ ์ธํ๋ผ(L-2).
|
|
156
|
+
* @param {string} name - ๋ฑ๋ก๋ ์ค์ผ์ค ํด๋์ค๋ช
.
|
|
157
|
+
* @returns {Promise<MegaScheduleFireResult>}
|
|
158
|
+
* @throws {Error} ๋ฑ๋ก๋์ง ์์ name ์ผ ๋.
|
|
159
|
+
*/
|
|
160
|
+
runNow(name: string): Promise<MegaScheduleFireResult>;
|
|
161
|
+
/**
|
|
162
|
+
* ๋ฑ๋ก๋ ์ค์ผ์ค ๋ฉํ๋ฐ์ดํฐ ๋ชฉ๋ก. ๋ชจ๋ํฐ๋ง/CLI ์ฉ.
|
|
163
|
+
* @returns {Array<{ name: string, cron: string, timezone: string|undefined, hasLock: boolean, nextRun: Date }>}
|
|
164
|
+
*/
|
|
165
|
+
list(): Array<{
|
|
166
|
+
name: string;
|
|
167
|
+
cron: string;
|
|
168
|
+
timezone: string | undefined;
|
|
169
|
+
hasLock: boolean;
|
|
170
|
+
nextRun: Date;
|
|
171
|
+
}>;
|
|
172
|
+
/** @returns {boolean} start() ๋ ์ํ๋ฉด true. */
|
|
173
|
+
get isStarted(): boolean;
|
|
174
|
+
#private;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* ์ค์ผ์ค ๋ถ์ฐ ๋ฝ ์ค์ . **lock ๋๋ฉ์ธ์ cache ์ ๋ณ๊ฐ**(ADR-113) โ `ctx.lock(alias)`.
|
|
178
|
+
*/
|
|
179
|
+
export type MegaScheduleLock = {
|
|
180
|
+
/**
|
|
181
|
+
* - lock ์ด๋ํฐ ๋ณ๋ช
(`ctx.lock(alias)` ๋ก ํด์). 03-api-spec ์ ์ `cache` ํ๋๋ฅผ
|
|
182
|
+
* ๋์ฒดํ๋ค(lock ์ด ๋
๋ฆฝ ๋๋ฉ์ธ์ด ๋ ๋ค ์ ํฉ โ ADR-118).
|
|
183
|
+
*/
|
|
184
|
+
lock: string;
|
|
185
|
+
/**
|
|
186
|
+
* - ๋ฝ ๋ณด์ ์๊ฐ(**๋ฐ๋ฆฌ์ด**, ์์ ์ ์). ์๊ณ๊ตฌ์ญ ๋์ **์๋ ์ฐ์ฅ**๋๋ฏ๋ก
|
|
187
|
+
* (redlock `using`) ์์
์ด ttl ์ ๋๊ฒจ๋ ์ค๋ณต ์คํ๋์ง ์๋๋ค โ ttl ์ "์ฐ์ฅ 1ํ๋ถ ์๋์ฐ"๋ค.
|
|
188
|
+
* โ ๏ธ redlock ์ `ttl โฅ automaticExtensionThreshold(๊ธฐ๋ณธ 500ms) + 100ms` ๋ฅผ ์๊ตฌํ๋ค(๊ธฐ๋ณธ ์ค์ ๊ธฐ์ค
|
|
189
|
+
* **600ms ์ด์**) โ ๋ฏธ๋ฌ์ด๋ฉด fire ์ skip(error ๋๋ด)์ผ๋ก ํ๋ฉดํ๋๋ค.
|
|
190
|
+
*/
|
|
191
|
+
ttl: number;
|
|
192
|
+
/**
|
|
193
|
+
* - ๋ฝ ์์ ํค. ๋ฏธ์ง์ ์ `mega:schedule:<ํด๋์ค๋ช
>`.
|
|
194
|
+
*/
|
|
195
|
+
key?: string;
|
|
196
|
+
};
|
|
197
|
+
/**
|
|
198
|
+
* - {@link MegaScheduler#runNow} / ๋ด๋ถ fire ์ ๊ฒฐ๊ณผ.
|
|
199
|
+
*/
|
|
200
|
+
export type MegaScheduleFireResult = {
|
|
201
|
+
/**
|
|
202
|
+
* - ์ค์ผ์ค ํด๋์ค๋ช
.
|
|
203
|
+
*/
|
|
204
|
+
name: string;
|
|
205
|
+
/**
|
|
206
|
+
* - ์ค์ ๋ก run(ctx) ๊ฐ ํธ์ถ๋๋์ง(skip ์ด๋ฉด false).
|
|
207
|
+
*/
|
|
208
|
+
ran: boolean;
|
|
209
|
+
/**
|
|
210
|
+
* - ๋ฝ ๋ฏธํ๋์ผ๋ก ๊ฑด๋๋ฐ์๋์ง.
|
|
211
|
+
*/
|
|
212
|
+
skipped: boolean;
|
|
213
|
+
/**
|
|
214
|
+
* - run(ctx) ๊ฐ ์๋ฌ ์์ด ๋๋ฌ๋์ง(skip ์ด๋ฉด false).
|
|
215
|
+
*/
|
|
216
|
+
ok: boolean;
|
|
217
|
+
/**
|
|
218
|
+
* - run(ctx) ๋ฐํ๊ฐ(์ฑ๊ณต ์).
|
|
219
|
+
*/
|
|
220
|
+
result?: any;
|
|
221
|
+
/**
|
|
222
|
+
* - ์คํจ/skip ์ฌ์ .
|
|
223
|
+
*/
|
|
224
|
+
error?: Error;
|
|
225
|
+
};
|
|
226
|
+
/**
|
|
227
|
+
* - ๋ฑ๋ก๋ ์ค์ผ์ค 1๊ฑด์ ๋ด๋ถ ๋ฉํ๋ฐ์ดํฐ.
|
|
228
|
+
*/
|
|
229
|
+
export type ScheduleEntry = {
|
|
230
|
+
/**
|
|
231
|
+
* - ์ค์ผ์ค ํด๋์ค๋ช
(= ๋ฑ๋ก ํค).
|
|
232
|
+
*/
|
|
233
|
+
name: string;
|
|
234
|
+
/**
|
|
235
|
+
* - ๋ฑ๋ก๋ ํด๋์ค.
|
|
236
|
+
*/
|
|
237
|
+
ScheduleClass: typeof MegaSchedule;
|
|
238
|
+
/**
|
|
239
|
+
* - ์ธ์คํด์ค(run ํธ์ถ ๋์).
|
|
240
|
+
*/
|
|
241
|
+
instance: MegaSchedule;
|
|
242
|
+
/**
|
|
243
|
+
* - cron ํํ์.
|
|
244
|
+
*/
|
|
245
|
+
cron: string;
|
|
246
|
+
/**
|
|
247
|
+
* - IANA ํ์์กด.
|
|
248
|
+
*/
|
|
249
|
+
timezone: string | undefined;
|
|
250
|
+
/**
|
|
251
|
+
* - ๋ถ์ฐ ๋ฝ ์ค์ .
|
|
252
|
+
*/
|
|
253
|
+
lock: MegaScheduleLock | undefined;
|
|
254
|
+
/**
|
|
255
|
+
* - start() ๊ฐ ๋ง๋ croner ํธ๋ค(๋ฏธ start ๋ฉด null).
|
|
256
|
+
*/
|
|
257
|
+
job: Cron | null;
|
|
258
|
+
};
|
|
259
|
+
import { EventEmitter } from 'node:events';
|
|
260
|
+
import { Cron } from 'croner';
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MegaShutdown โ graceful shutdown ์ํ์ค + ์ฌ์ฉ์ cleanup hook ๋ฌถ์.
|
|
3
|
+
*
|
|
4
|
+
* ์ํ์ค (docs/10 ยง3) โ ๋ช
์ stage ๋ก ์ฝ๋ํ({@link SHUTDOWN_STAGES}):
|
|
5
|
+
* Running โ [server โ jobs โ app โ workers โ adapters โ telemetry โ logs] โ Exited (process.exit)
|
|
6
|
+
*
|
|
7
|
+
* SIGTERM/SIGINT ์บ์น + stage ์์ ์คํ(stage ์์ ๋ฑ๋ก ์ญ์ LIFO) + hook ๋ณ grace + hardKill ๋ฐ๋๋ผ์ธ.
|
|
8
|
+
* readiness 503 ์ ํ(DrainingReady)์ isShuttingDown() ์ MegaHealth.checkAll ์ด ์ฝ์ด ์ฆ์ ๋ฐ์๋๋ค.
|
|
9
|
+
*
|
|
10
|
+
* API ๋ docs/10ยท07 ์ํ์ค์ ๋ง์ถฐ `MegaShutdown` ๊ฐ์ฒด๋ก ํต์ผ (ADR โ M-4).
|
|
11
|
+
*
|
|
12
|
+
* ์ฌ์ฉ ์:
|
|
13
|
+
* MegaShutdown.register('my-queue', async () => consumer.stop()) // ๊ธฐ๋ณธ stage 'app'
|
|
14
|
+
* MegaShutdown.register('db', async () => pool.end(), { stage: 'adapters' }) // ๋ช
์ stage
|
|
15
|
+
* MegaShutdown.setupSignals({ gracePeriodMs: 30_000, hardKillMs: 60_000 })
|
|
16
|
+
* await MegaShutdown.now() // ์๋ ํธ๋ฆฌ๊ฑฐ
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* ์ข
๋ฃ stage ์ ๋ณธ ์์ (docs/10 ยง3 ์ ๋จ๊ณ๋ฅผ ์ฝ๋๋ก ๋ช
์) โ `register(name, fn, { stage })` ๊ฐ ์ด ์ค
|
|
20
|
+
* ํ๋๋ฅผ ์ง์ ํ๊ณ , `now()` ๋ ์ด ๋ฐฐ์ด ์์๋๋ก stage ๋ฅผ ์คํํ๋ค(stage ์์์๋ ๋ฑ๋ก ์ญ์ LIFO).
|
|
21
|
+
*
|
|
22
|
+
* server โ HTTP/WS ์์ฉ ์ข
๋ฃ(์๋ฒ close, ์งํ ์ค ์์ฒญ drain). ClosingHttp/ClosingWs.
|
|
23
|
+
* jobs โ ์ก ์ปจ์๋จธยท์ค์ผ์ค๋ฌ ์ ์ง(์ ์ก ์์ ์ค๋จ, ์งํ ์ค ์ก ์๋ฃ). ClosingJobs/ClosingScheduler.
|
|
24
|
+
* app โ ์ฑ ๋ ๋ฒจ ์ ๋ฆฌ(ํ๋ฌ๊ทธ์ธ beforeShutdownยท์ธ์
storeยทWS cluster/roster ๋ฑ ์ด๋ํฐ๋ฅผ **์ฐ๋** ์ ๋ฆฌ).
|
|
25
|
+
* `stage` ๋ฏธ์ง์ ๊ธฐ๋ณธ๊ฐ โ ์ฌ์ฉ์ cleanup ์ ์ด๋ํฐ๊ฐ ์ด์ ์๋ ์ด ๋จ๊ณ์์ ๋๋ค.
|
|
26
|
+
* workers โ CPU ์์ปค ํยทembedded wsHub ๋ฑ ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ๊ธฐ ์ ์ง.
|
|
27
|
+
* adapters โ ๊ณต์ ์ด๋ํฐ disconnect(DisconnectingAdapters, stage ์ LIFO = connect ์ญ์).
|
|
28
|
+
* telemetry โ ๋ฉํธ๋ฆญยทํธ๋ ์ด์ฑ SDK flush/shutdown. ์ด๋ํฐ **๋ค** โ disconnect ๊น์ง์ span/๋ฉํธ๋ฆญ์ ๋ด๋ณด๋ธ๋ค.
|
|
29
|
+
* logs โ ๋ก๊ฑฐ flush(FlushingLogs). ํญ์ ๋ง์ง๋ง โ ์ข
๋ฃ ์ํ์ค ์์ฒด์ ๋ก๊ทธ๊ฐ ์ ์ค๋์ง ์๊ฒ.
|
|
30
|
+
*/
|
|
31
|
+
export const SHUTDOWN_STAGES: readonly string[];
|
|
32
|
+
/** hook 1๊ฐ๋น grace ๊ธฐ๋ณธ๊ฐ(ms) โ 30์ด. `setupSignals({ gracePeriodMs })` ๋ก ์กฐ์ . */
|
|
33
|
+
export const DEFAULT_GRACE_PERIOD_MS: 30000;
|
|
34
|
+
/**
|
|
35
|
+
* graceful shutdown ์ ์ฒด ์ํ ๊ธฐ๋ณธ๊ฐ(ms) โ 60์ด. ์ด๊ณผ ์ hardKill(exit 1). ์์ปค ํ๋ก์ธ์ค์ ์ข
๋ฃ ์์ฐ
|
|
36
|
+
* ์ํ์ด๋ฏ๋ก, ํด๋ฌ์คํฐ ๋ง์คํฐ์ grace(`MegaCluster.gracePeriodMs`)๋ **์ด ๊ฐ + ๋ง์ง ์ด์**์ด์ด์ผ
|
|
37
|
+
* ์์ปค๊ฐ drain ์ ๋๋ด๊ธฐ ์ ์ ๋ง์คํฐ๊ฐ SIGKILL ํ๋ ์์ฐ ์ญ์ ์ด ์๋ค(CLI ๊ฐ ์ด ์์๋ก ์๊ณํ).
|
|
38
|
+
*/
|
|
39
|
+
export const DEFAULT_HARD_KILL_MS: 60000;
|
|
40
|
+
export namespace MegaShutdown {
|
|
41
|
+
export { SHUTDOWN_STAGES as STAGES };
|
|
42
|
+
export { register };
|
|
43
|
+
export { unregister };
|
|
44
|
+
export { isShuttingDown };
|
|
45
|
+
export { setupSignals };
|
|
46
|
+
export { setupGlobalErrorHandlers };
|
|
47
|
+
export { setLogger };
|
|
48
|
+
export { now };
|
|
49
|
+
export { registeredCount };
|
|
50
|
+
export { _reset };
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* ์ ์ญ ์๋ฌ ํธ๋ค๋ฌ๊ฐ fatal ๋ก๊ทธ์ ์ธ ๋ก๊ฑฐ. boot ์ด pino ๊ณต์ ์ธ์คํด์ค(appLogger)๋ฅผ ์ฃผ์
ํ๋ค(setLogger).
|
|
54
|
+
* ๋ฏธ์ค์ (๋ถํ
์ ์กฐ๊ธฐ ํฌ๋์ยท๋ก๊ฑฐ ๋นํ์ฑ ํ๋ก์ธ์ค)์ด๋ฉด console.error ๋ก ํด๋ฐฑํ๋ค. process ๋ ๋ฒจ ํธ๋ค๋ฌ๋
|
|
55
|
+
* bootApp ์ DI ๊ทธ๋ํ ๋ฐ์ด๋ผ ๋ชจ๋ ์ค์ฝํ ๋ณ์๋ก ๋ฐ์ ๋๋ค(์ ์ญ ์ค์ผ ํํผ, ADR-178).
|
|
56
|
+
*/
|
|
57
|
+
export type ShutdownLogger = {
|
|
58
|
+
info?: (...args: any[]) => void;
|
|
59
|
+
warn?: (...args: any[]) => void;
|
|
60
|
+
error?: (...args: any[]) => void;
|
|
61
|
+
fatal?: (...args: any[]) => void;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* cleanup hook ๋ฑ๋ก. ์คํ ์์ = {@link SHUTDOWN_STAGES} ์์ โ ๊ฐ์ stage ์์์๋ ๋ฑ๋ก ์ญ์(LIFO).
|
|
65
|
+
* `stage` ๋ฏธ์ง์ ์ด๋ฉด `'app'`(์ด๋ํฐ ์ข
๋ฃ ์ , ์ฌ์ฉ์ cleanup ํ์ค ์์น) โ ๊ธฐ์กด 2-์ธ์ ํธ์ถ๊ณผ ํธํ.
|
|
66
|
+
* @param {string} name - ์๋ณ์ (๋ก๊ทธยทunregister ์ฉ)
|
|
67
|
+
* @param {() => Promise<void> | void} fn
|
|
68
|
+
* @param {{ stage?: string }} [opts] - ์ข
๋ฃ stage({@link SHUTDOWN_STAGES} ์ค ํ๋).
|
|
69
|
+
*/
|
|
70
|
+
declare function register(name: string, fn: () => Promise<void> | void, opts?: {
|
|
71
|
+
stage?: string;
|
|
72
|
+
}): void;
|
|
73
|
+
/**
|
|
74
|
+
* ๋ฑ๋ก๋ cleanup hook ์ ๊ฑฐ (๊ฐ์ name ์ ๋ถ). ๋ฐํ์ ์ค ๋์ ์ผ๋ก ๋ถ์๋ค ๋ผ๋ hook(์: hub link)
|
|
75
|
+
* ์ ๋์๋ฅผ ๋ง๋๋ค(L1). shutdown ์งํ ์ค์๋ ์คํ ์ถ์ (exitedHandlers)๊ณผ ์ถฉ๋ํ๋ฏ๋ก ๋ฌด์ํ๋ค.
|
|
76
|
+
* @param {string} name - register ์ ์ด ์๋ณ์.
|
|
77
|
+
* @returns {number} ์ ๊ฑฐ๋ hook ์.
|
|
78
|
+
*/
|
|
79
|
+
declare function unregister(name: string): number;
|
|
80
|
+
/**
|
|
81
|
+
* ํ์ฌ shutdown ์งํ ์ค์ธ์ง.
|
|
82
|
+
* @returns {boolean}
|
|
83
|
+
*/
|
|
84
|
+
declare function isShuttingDown(): boolean;
|
|
85
|
+
/**
|
|
86
|
+
* SIGTERM/SIGINT ์๊ทธ๋ ๋ฑ๋ก (ํ ๋ฒ๋ง ๋ฑ๋ก๋จ). ์ ์ญ ์๋ฌ ํธ๋ค๋ฌ(unhandledRejection/uncaughtException)๋
|
|
87
|
+
* ๊ธฐ๋ณธ ๋ฑ๋กํ๋ค โ `globalErrorHandlers: false` ๋ก ๋ ์ ์๋ค(REPL ๋ฑ).
|
|
88
|
+
* @param {{ gracePeriodMs?: number, hardKillMs?: number, signals?: string[], globalErrorHandlers?: boolean }} [opts]
|
|
89
|
+
*/
|
|
90
|
+
declare function setupSignals(opts?: {
|
|
91
|
+
gracePeriodMs?: number;
|
|
92
|
+
hardKillMs?: number;
|
|
93
|
+
signals?: string[];
|
|
94
|
+
globalErrorHandlers?: boolean;
|
|
95
|
+
}): void;
|
|
96
|
+
/**
|
|
97
|
+
* ์ ์ญ `unhandledRejection`/`uncaughtException` ํธ๋ค๋ฌ ๋ฑ๋ก (ADR-178, ๋ฉฑ๋ฑ). floating promise reject ๋
|
|
98
|
+
* ๋ฏธ์ฒ๋ฆฌ ์์ธ๋ก ํ๋ก์ธ์ค๊ฐ **graceful ์์ด ์ฆ์ฌ**(์ด๋ํฐ disconnectยท๋๋ ์ธ ๋ฏธ์คํ โ ์ปค๋ฅ์
/๋ฝ ๋์, ์งํ ์ค
|
|
99
|
+
* ์ก ์ ์ค)ํ๋ ๊ฒ์ ๋ง๋๋ค. ๋ ๋ค fatal ๋ก๊น
ํ graceful shutdown(exit 1)์ ํธ๋ฆฌ๊ฑฐํ๋ค โ uncaughtException
|
|
100
|
+
* ์ดํ์ ํ๋ก์ธ์ค ์ํ๋ ์ ๋ขฐ ๋ถ๊ฐ๋ผ ๋ณต๊ตฌํ์ง ์๊ณ ์ ๋ฆฌ ํ ์ข
๋ฃ๊ฐ ํ์ค.
|
|
101
|
+
* @param {{ exitCode?: number }} [opts]
|
|
102
|
+
* @returns {void}
|
|
103
|
+
*/
|
|
104
|
+
declare function setupGlobalErrorHandlers({ exitCode }?: {
|
|
105
|
+
exitCode?: number;
|
|
106
|
+
}): void;
|
|
107
|
+
/**
|
|
108
|
+
* ์ ์ญ ์๋ฌ ํธ๋ค๋ฌ(unhandledRejection/uncaughtException)๊ฐ fatal ๋ก๊ทธ์ ์ธ ๋ก๊ฑฐ๋ฅผ ์ฃผ์
ํ๋ค(ADR-178).
|
|
109
|
+
* boot ์ด pino ๊ณต์ ์ธ์คํด์ค(appLogger)๋ฅผ ๋ง๋ค ๋ ํธ์ถํ๋ค. ๋ฏธํธ์ถ์ด๋ฉด ํธ๋ค๋ฌ๋ console.error ๋ก ํด๋ฐฑํ๋ค.
|
|
110
|
+
* @param {ShutdownLogger | null | undefined} logger - pino ํธํ ๋ก๊ฑฐ(info/warn/error/fatal ์ฌ์ฉ) ๋๋ null.
|
|
111
|
+
* @returns {void}
|
|
112
|
+
*/
|
|
113
|
+
declare function setLogger(logger: ShutdownLogger | null | undefined): void;
|
|
114
|
+
/**
|
|
115
|
+
* ์ฆ์ graceful shutdown ํธ๋ฆฌ๊ฑฐ.
|
|
116
|
+
*
|
|
117
|
+
* ๋ ๋ฒ์งธ ํธ์ถ(์ด๋ฏธ shutdown ์งํ ์ค)์ "์ฌ์ฉ์๊ฐ ๋นจ๋ฆฌ ์ฃฝ์ด๊ณ ์ถ๋ค" ๋ ์ ํธ๋ก ๋ณด๊ณ
|
|
118
|
+
* ์ฆ์ ๊ฐ์ ์ข
๋ฃํ๋ค (docs/10 ยง3 Invariant โ M-3).
|
|
119
|
+
*
|
|
120
|
+
* @param {{ signal?: string, exitCode?: number }} [opts]
|
|
121
|
+
*/
|
|
122
|
+
declare function now({ signal, exitCode }?: {
|
|
123
|
+
signal?: string;
|
|
124
|
+
exitCode?: number;
|
|
125
|
+
}): Promise<void>;
|
|
126
|
+
/**
|
|
127
|
+
* ํ
์คํธ์ฉ โ ๋ฑ๋ก๋ hook ์ (๋๋ฒ๊ทธ).
|
|
128
|
+
* @returns {number}
|
|
129
|
+
*/
|
|
130
|
+
declare function registeredCount(): number;
|
|
131
|
+
/**
|
|
132
|
+
* ํ
์คํธ์ฉ โ ๋ด๋ถ ์ํ reset (๋จ์ ํ
์คํธ์์๋ง ํธ์ถ). ํ๋ก๋์
์ฝ๋๋ ์ฌ์ฉ X.
|
|
133
|
+
*/
|
|
134
|
+
declare function _reset(): void;
|
|
135
|
+
export {};
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* inbound ํค๋์ `traceparent`(/`tracestate`)๋ฅผ ๋ถ๋ชจ OTel Context ๋ก ๋ณต์ํ๋ค(ADR-196, W3C trace context).
|
|
3
|
+
*
|
|
4
|
+
* ๊ฒ์ดํธ์จ์ด/์
์คํธ๋ฆผ์ด ๋ณด๋ธ trace ์ HTTP ๋ฃจํธ span ์ ์๋ ์
๊ตฌ๋ค โ {@link enterHttpSpan} ์ `headers`
|
|
5
|
+
* ์ต์
์ด ์ด ํจ์๋ฅผ ๊ฑฐ์น๋ค. ํค๋๊ฐ ์๊ฑฐ๋ ํ์์ด ๋ฌดํจ๋ฉด `undefined`(ํธ์ถ๋ถ๊ฐ ์ ๋ฃจํธ๋ก ์์ โ fail-safe,
|
|
6
|
+
* ์๋ชป๋ ์ธ๋ถ ์
๋ ฅ์ด ์ถ์ ์ ๊นจ์ง ์๊ฒ). ์ตํธ์ธ OFF ๋ฉด `undefined`(0 ๋น์ฉ).
|
|
7
|
+
*
|
|
8
|
+
* ๋น์จ ์ํ๋ง(`traceidratio`)์ `ParentBasedSampler` ๋ผ ๋ณต์๋ ์๊ฒฉ ๋ถ๋ชจ์ sampled flag ๋ฅผ ๋ฐ๋ฅธ๋ค โ
|
|
9
|
+
* ์
์คํธ๋ฆผ์ด ์ํํ trace ๋ ์ฌ๊ธฐ์๋ ๊ธฐ๋ก๋๊ณ , ๋ฒ๋ฆฐ trace ๋ ์ฌ๊ธฐ์๋ ๋ฒ๋ ค์ ธ trace ๊ฐ ๋ฐํ ๋ง ๋์ง ์๋๋ค.
|
|
10
|
+
*
|
|
11
|
+
* @param {Record<string, string | string[] | undefined>} headers - `req.headers`(๋์๋ฌธ์ ๋ฌด๊ด ํค).
|
|
12
|
+
* @returns {import('@opentelemetry/api').Context | undefined} ์ ํจํ ์๊ฒฉ ๋ถ๋ชจ ์ปจํ
์คํธ, ์์ผ๋ฉด undefined.
|
|
13
|
+
*/
|
|
14
|
+
export function extractRemoteContext(headers: Record<string, string | string[] | undefined>): import("@opentelemetry/api").Context | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* ํ์ฌ ํ์ฑ span ์ outbound ํค๋(`traceparent`/`tracestate`)๋ก ์ง๋ ฌํํด carrier ์ ์ฑ์ด๋ค(ADR-196).
|
|
17
|
+
*
|
|
18
|
+
* ํ๋ฅ HTTP ํธ์ถ์ trace ๋ฅผ ์๋ ์ถ๊ตฌ๋ค โ `fetch(url, { headers: ctx.tracer.propagationHeaders() })`.
|
|
19
|
+
* ํ์ฑ span ์ด ์๊ฑฐ๋ ์ตํธ์ธ OFF ๋ฉด carrier ๋ฅผ ๊ทธ๋๋ก ๋ฐํ(์ฃผ์
์์ โ ํค๋ ์ค์ผ ์์).
|
|
20
|
+
*
|
|
21
|
+
* @param {Record<string, string>} [carrier={}] - ์ฑ์ธ ํค๋ ๊ฐ์ฒด(๊ธฐ์กด ํค ๋ณด์กด, traceparent/tracestate ๋ง ์ถ๊ฐ).
|
|
22
|
+
* @returns {Record<string, string>} carrier(์ฒด์ด๋์ฉ ๋์ผ ๊ฐ์ฒด).
|
|
23
|
+
* @example
|
|
24
|
+
* const res = await fetch(downstreamUrl, { headers: MegaTracing.propagationHeaders({ accept: 'application/json' }) })
|
|
25
|
+
*/
|
|
26
|
+
export function propagationHeaders(carrier?: Record<string, string>): Record<string, string>;
|
|
27
|
+
/**
|
|
28
|
+
* ํ์ฑ ์ฌ๋ถ (Boolean โ `is*`, ADR-036). `init` ํ `shutdown` ์ ์ด๋ฉด true.
|
|
29
|
+
* @returns {boolean}
|
|
30
|
+
*/
|
|
31
|
+
export function isEnabled(): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* OTel ํธ๋ ์ด์ฑ ์ด๊ธฐํ. ์ตํธ์ธ โ ๋ณธ ํจ์๋ฅผ ๋ถ๋ฅด์ง ์์ผ๋ฉด ์ด๋ค ์ด๋ํฐ์๋ ๋ฆฌ์ค๋๊ฐ ์ ๋ถ์ด 0 ๋น์ฉ.
|
|
34
|
+
*
|
|
35
|
+
* @param {object} opts
|
|
36
|
+
* @param {string} opts.serviceName - **ํ์**. `service.name` resource ์์ฑ.
|
|
37
|
+
* @param {string} [opts.endpoint] - OTLP HTTP traces endpoint (์: `http://localhost:4318/v1/traces`).
|
|
38
|
+
* ์ง์ + `exporter` ๋ฏธ์ง์ ์ ์๋์ผ๋ก `'otlp'` exporter ์ ํ.
|
|
39
|
+
* @param {'always_on'|'always_off'|`traceidratio:${number}`|number} [opts.sampling='always_on'] -
|
|
40
|
+
* ์ํ๋ฌ. ๋น์จ์ `'traceidratio:0.1'` ๋๋ ์ซ์ `0.1`(0~1). ๋น์จ ์ํ๋ฌ๋ `ParentBased` ๋ก ๊ฐ์ผ๋ค.
|
|
41
|
+
* @param {'console'|'otlp'|'zipkin'|'inmemory'|import('@opentelemetry/sdk-trace-base').SpanExporter} [opts.exporter] -
|
|
42
|
+
* exporter ์ข
๋ฅ ๋ฌธ์์ด ๋๋ ์ธ์คํด์ค ์ง์ ์ฃผ์
(ํ
์คํธ๋ `InMemorySpanExporter` ์ธ์คํด์ค). ๋ฏธ์ง์ ์
|
|
43
|
+
* `endpoint` ์์ผ๋ฉด `'otlp'`, ์์ผ๋ฉด `'console'`. `'zipkin'` ์ Zipkin v2 JSON(ADR-126 ๋ณด๊ฐ).
|
|
44
|
+
* @param {'simple'|'batch'} [opts.processor] - span processor. ๋ฏธ์ง์ ์ otlp=`'batch'`, ๊ทธ ์ธ=`'simple'`.
|
|
45
|
+
* @param {string} [opts.version] - `service.version` resource ์์ฑ.
|
|
46
|
+
* @param {string} [opts.environment] - `deployment.environment.name` resource ์์ฑ.
|
|
47
|
+
* @param {Record<string, any>} [opts.attributes] - ์ถ๊ฐ resource ์์ฑ(๋จธ์ง). ์ํฌ๋ฆฟ ๊ธ์ง.
|
|
48
|
+
* @returns {void}
|
|
49
|
+
* @throws {MegaConfigError} `tracing.already_initialized` / `tracing.service_name_required` / `tracing.invalid_sampling` / `tracing.invalid_exporter`.
|
|
50
|
+
*/
|
|
51
|
+
export function init(opts?: {
|
|
52
|
+
serviceName: string;
|
|
53
|
+
endpoint?: string;
|
|
54
|
+
sampling?: "always_on" | "always_off" | `traceidratio:${number}` | number;
|
|
55
|
+
exporter?: "console" | "otlp" | "zipkin" | "inmemory" | import("@opentelemetry/sdk-trace-base").SpanExporter;
|
|
56
|
+
processor?: "simple" | "batch";
|
|
57
|
+
version?: string;
|
|
58
|
+
environment?: string;
|
|
59
|
+
attributes?: Record<string, any>;
|
|
60
|
+
}): void;
|
|
61
|
+
/**
|
|
62
|
+
* `MEGA_OTEL_*` ํ๊ฒฝ๋ณ์๋ก ์ตํธ์ธ ์ด๊ธฐํ (12-factor). `MEGA_OTEL_ENABLED!=='true'` ๋ฉด **no-op**
|
|
63
|
+
* (init ๋ฏธํธ์ถ โ 0 ๋น์ฉ). ํ์ฑ ์ `MEGA_OTEL_SERVICE_NAME` ํ์.
|
|
64
|
+
*
|
|
65
|
+
* ๋งคํ:
|
|
66
|
+
* - `MEGA_OTEL_ENABLED` (true|false, ๋ํดํธ false)
|
|
67
|
+
* - `MEGA_OTEL_SERVICE_NAME` โ serviceName (ํ์)
|
|
68
|
+
* - `MEGA_OTEL_ENDPOINT` โ endpoint (OTLP)
|
|
69
|
+
* - `MEGA_OTEL_SAMPLING_RATIO` โ sampling (์ซ์ ๋น์จ; `always_on`/`always_off` ๋ฌธ์์ด๋ ํ์ฉ)
|
|
70
|
+
* - `MEGA_OTEL_EXPORTER` โ exporter (otlp|console|inmemory)
|
|
71
|
+
* - `MEGA_OTEL_VERSION` / `MEGA_OTEL_ENVIRONMENT` โ resource ์์ฑ
|
|
72
|
+
*
|
|
73
|
+
* @param {Record<string, string|undefined>} [env=process.env]
|
|
74
|
+
* @returns {boolean} ํ์ฑํ๋ผ init ํ์ผ๋ฉด true, ์ตํธ์ธ OFF ๋ฉด false.
|
|
75
|
+
* @throws {MegaConfigError} ํ์ฑ์ธ๋ฐ serviceName ๋๋ฝ ์ `tracing.service_name_required`.
|
|
76
|
+
*/
|
|
77
|
+
export function fromEnv(env?: Record<string, string | undefined>): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* ๋จ์ผ ์ด๋ํฐ์ `onCallStart`/`onCallEnd` ๋ฅผ ๊ตฌ๋
ํด span ์ผ๋ก ๋ณํํ๋ค. init ์ ์ด๋ฉด no-op(๋ฆฌ์ค๋ ๋ฏธ๋ถ์ฐฉ).
|
|
80
|
+
* ์ด๋ฏธ ๊ตฌ๋
๋ ์ด๋ํฐ๋ฅผ ๋ค์ ๋ถ๋ฅด๋ฉด ๊ธฐ์กด ๊ตฌ๋
์ ์ ์ง(์ค๋ณต ๋ถ์ฐฉ ๋ฐฉ์ง).
|
|
81
|
+
*
|
|
82
|
+
* @param {import('../adapters/mega-adapter.js').MegaAdapter} adapter
|
|
83
|
+
* @param {{ domain?: string, driver?: string, key?: string }} [meta] - span ์์ฑ ๋ณด๊ฐ์ฉ ๋ฉํ.
|
|
84
|
+
* @returns {() => void} ๊ตฌ๋
ํด์ ํจ์.
|
|
85
|
+
*/
|
|
86
|
+
export function subscribe(adapter: import("../adapters/mega-adapter.js").MegaAdapter, meta?: {
|
|
87
|
+
domain?: string;
|
|
88
|
+
driver?: string;
|
|
89
|
+
key?: string;
|
|
90
|
+
}): () => void;
|
|
91
|
+
/**
|
|
92
|
+
* ๋ถํ
๋ ์ ์ญ ์ด๋ํฐ ๋งค๋์ ์ **๋ชจ๋ ๊ณต์ ์ด๋ํฐ**์ hook ๋ฆฌ์ค๋๋ฅผ ์ผ๊ด ๊ตฌ๋
ํ๋ค(ADR-102 ๊ธ๋ก๋ฒ ๊ณต์ ).
|
|
93
|
+
* `connectAll` ์ดํ ํธ์ถ ๊ถ์ฅ(์ฐ๊ฒฐ ์ ๋ ์ด๋ํฐ๋ ๊ตฌ๋
์ ์์ โ ์ฒซ ํธ์ถ ๋ span ๋ฐํ).
|
|
94
|
+
*
|
|
95
|
+
* @param {{ entries: () => Array<{ domain: string, key: string, driver: string, adapter: import('../adapters/mega-adapter.js').MegaAdapter }> }} manager -
|
|
96
|
+
* `MegaAdapterManager` (entries() ๋
ธ์ถ). ํ
์คํธ ๋๋ธ๋ ๊ฐ์ ํํ๋ฉด ๋จ.
|
|
97
|
+
* @returns {number} ๊ตฌ๋
ํ ์ด๋ํฐ ์.
|
|
98
|
+
*/
|
|
99
|
+
export function attachToManager(manager: {
|
|
100
|
+
entries: () => Array<{
|
|
101
|
+
domain: string;
|
|
102
|
+
key: string;
|
|
103
|
+
driver: string;
|
|
104
|
+
adapter: import("../adapters/mega-adapter.js").MegaAdapter;
|
|
105
|
+
}>;
|
|
106
|
+
}): number;
|
|
107
|
+
/**
|
|
108
|
+
* ํธ๋ ์ด์ฑ ์ข
๋ฃ โ ๋ชจ๋ ๊ตฌ๋
ํด์ + ๋จ์ span flush + provider ์ข
๋ฃ. init ์ ์ด๋ฉด no-op.
|
|
109
|
+
* @returns {Promise<void>}
|
|
110
|
+
*/
|
|
111
|
+
export function shutdown(): Promise<void>;
|
|
112
|
+
/**
|
|
113
|
+
* ํ์ฌ exporter ๋ฐํ(ํ
์คํธยท๋๋ฒ๊ทธ์ฉ). `InMemorySpanExporter` ๋ฉด `.getFinishedSpans()` ๋ก span ๊ฒ์ฌ.
|
|
114
|
+
* @returns {import('@opentelemetry/sdk-trace-base').SpanExporter | null}
|
|
115
|
+
*/
|
|
116
|
+
export function getExporter(): import("@opentelemetry/sdk-trace-base").SpanExporter | null;
|
|
117
|
+
/**
|
|
118
|
+
* ๊ฐ์ flush โ `BatchSpanProcessor` ์ฌ์ฉ ์ ํ
์คํธ์์ span ๋ฐํ๋ฅผ ๊ธฐ๋ค๋ฆด ๋.
|
|
119
|
+
* @returns {Promise<void>}
|
|
120
|
+
*/
|
|
121
|
+
export function forceFlush(): Promise<void>;
|
|
122
|
+
/**
|
|
123
|
+
* **์ฌ์ฉ์ ์ง์ span** โ `name` span ์ ํ์ฌ ํ์ฑ span(์์ผ๋ฉด ๋ฃจํธ)์ ์์์ผ๋ก ์ด๊ณ `fn(span)` ์ ๊ทธ
|
|
124
|
+
* span ์ปจํ
์คํธ ์์์ ์คํํ๋ค(`run()` ๊ฒฉ๋ฆฌ). `fn` ์ด Promise ๋ฉด resolve/reject ๊น์ง ๊ธฐ๋ค๋ ค span ์
|
|
125
|
+
* ๋ซ๋๋ค. ์ตํธ์ธ OFF ๋ฉด 0 ๋น์ฉ โ span ์์ด `fn(NOOP_SPAN)` ๋ง ํธ์ถํ๋ค. `ctx.tracer.span` ์ ๊ตฌํ๋ถ.
|
|
126
|
+
*
|
|
127
|
+
* @template T
|
|
128
|
+
* @param {string} name - span ์ด๋ฆ(์: `'charge.process'`).
|
|
129
|
+
* @param {(span: import('@opentelemetry/api').Span) => T} fn - span ์์์ ์คํํ ํจ์(span ์ธ์ ๋ฐ์).
|
|
130
|
+
* @param {{ attributes?: Record<string, any>, kind?: import('@opentelemetry/api').SpanKind }} [opts]
|
|
131
|
+
* @returns {T} `fn` ์ ๋ฐํ๊ฐ(๊ทธ๋๋ก โ ๋๊ธฐ/Promise ๋ชจ๋).
|
|
132
|
+
* @throws {*} `fn` ์ด throw/reject ํ๋ฉด span ์ ๊ธฐ๋ก(ERROR)ํ๊ณ ๊ทธ๋๋ก ์ฌ์ ํ(silent ๊ธ์ง).
|
|
133
|
+
*/
|
|
134
|
+
export function span<T>(name: string, fn: (span: import("@opentelemetry/api").Span) => T, opts?: {
|
|
135
|
+
attributes?: Record<string, any>;
|
|
136
|
+
kind?: import("@opentelemetry/api").SpanKind;
|
|
137
|
+
}): T;
|
|
138
|
+
/**
|
|
139
|
+
* **์์/์ข
๋ฃ ๋ถ๋ฆฌํ span** โ HTTP `onRequest`/`onResponse` ์ฒ๋ผ ์์๊ณผ ์ข
๋ฃ๊ฐ ๋ค๋ฅธ ์ฝ๋ฐฑ์ธ ๊ฒฝ์ฐ์ ์ด๋ค.
|
|
140
|
+
* span ์ ์ด๊ณ `enterWith` ๋ก ํ์ฌ ๋น๋๊ธฐ ํ๋ฆ์ ํ์ฑ ์ปจํ
์คํธ๋ฅผ ์ด span ์ผ๋ก ๋ง๋ ๋ค, `end(err)` ๋ฅผ
|
|
141
|
+
* ๊ฐ์ง ํธ๋ค์ ๋๋ ค์ค๋ค(ํธ๋ค์ ๋ณดํต `req` ์ ๋ณด๊ดํ๋ค๊ฐ ์๋ต ์ ๋ซ๋๋ค). ์ตํธ์ธ OFF ๋ฉด no-op ํธ๋ค.
|
|
142
|
+
*
|
|
143
|
+
* โ ๏ธ `enterWith` ๋ **์์ฒญ๋ณ๋ก ๊ฒฉ๋ฆฌ๋ ๋น๋๊ธฐ ํ๋ฆ**์์๋ง ํธ์ถํด์ผ ํ๋ค(HTTP ์์ฒญยทWS ๋ฉ์์ง ์ฝ๋ฐฑ์ ๊ฐ๊ฐ
|
|
144
|
+
* ๋
๋ฆฝ async context ๋ผ ์์ โ ์ค์ธก ํ์ธ). ๊ณต์ ๋๊ธฐ ์ค์ฝํ์์ ๋ถ๋ฅด๋ฉด sibling ์ค์ผ(ADR-114) ์ํ.
|
|
145
|
+
*
|
|
146
|
+
* @param {string} name
|
|
147
|
+
* @param {{ attributes?: Record<string, any>, kind?: import('@opentelemetry/api').SpanKind, parent?: import('@opentelemetry/api').Context }} [opts]
|
|
148
|
+
* @returns {{ span: import('@opentelemetry/api').Span, end: (err?: unknown, endAttributes?: Record<string, any>) => void }}
|
|
149
|
+
*/
|
|
150
|
+
export function enterSpan(name: string, opts?: {
|
|
151
|
+
attributes?: Record<string, any>;
|
|
152
|
+
kind?: import("@opentelemetry/api").SpanKind;
|
|
153
|
+
parent?: import("@opentelemetry/api").Context;
|
|
154
|
+
}): {
|
|
155
|
+
span: import("@opentelemetry/api").Span;
|
|
156
|
+
end: (err?: unknown, endAttributes?: Record<string, any>) => void;
|
|
157
|
+
};
|
|
158
|
+
/**
|
|
159
|
+
* **HTTP ๋ฃจํธ span** ์ ์ฉ ํฌํผ โ `onRequest` ์์ ์ด๊ณ (`enterWith` ๋ก ํ์ฑํ), `onError` ์์ ์์ธ๋ฅผ
|
|
160
|
+
* ๊ธฐ๋ก(`setError`), `onResponse` ์์ ์ํ์ฝ๋์ ํจ๊ป ๋ซ๋๋ค(`finish`). HTTP ์๋งจํฑ(5xx=ERROR)์ ํ๊ณณ์
|
|
161
|
+
* ๋ชจ์ ๋ฐฐ์ ์ฝ๋(mega-app)๊ฐ OTel enum ์ ์ ๋ง์ง๊ฒ ํ๋ค. ์ตํธ์ธ OFF ๋ฉด no-op ํธ๋ค.
|
|
162
|
+
*
|
|
163
|
+
* `headers` ๋ฅผ ์ฃผ๋ฉด inbound `traceparent` ๋ฅผ ๋ถ๋ชจ๋ก ๋ณต์ํด({@link extractRemoteContext}, ADR-196) ๋ฃจํธ
|
|
164
|
+
* span ์ด ์
์คํธ๋ฆผ trace ์ ์ด์ด์ง๋ค โ ๋ฌดํจ/๋ถ์ฌ๋ฉด ์ข
์ ๋๋ก ์ ๋ฃจํธ.
|
|
165
|
+
*
|
|
166
|
+
* @param {{ method: string, route: string, path: string, host?: string, app: string, headers?: Record<string, string | string[] | undefined> }} info
|
|
167
|
+
* @returns {{ span: import('@opentelemetry/api').Span, setError: (err: unknown) => void, finish: (statusCode: number) => void }}
|
|
168
|
+
*/
|
|
169
|
+
export function enterHttpSpan({ method, route, path, host, app, headers }: {
|
|
170
|
+
method: string;
|
|
171
|
+
route: string;
|
|
172
|
+
path: string;
|
|
173
|
+
host?: string;
|
|
174
|
+
app: string;
|
|
175
|
+
headers?: Record<string, string | string[] | undefined>;
|
|
176
|
+
}): {
|
|
177
|
+
span: import("@opentelemetry/api").Span;
|
|
178
|
+
setError: (err: unknown) => void;
|
|
179
|
+
finish: (statusCode: number) => void;
|
|
180
|
+
};
|
|
181
|
+
/**
|
|
182
|
+
* ํ์ฌ ํ์ฑ span ์ trace/span id (๋ก๊ทธ ์๊ด๊ด๊ณ์ฉ). ํ์ฑ span ์๊ฑฐ๋ ์ตํธ์ธ OFF ๋ฉด null.
|
|
183
|
+
* @returns {{ traceId: string, spanId: string } | null}
|
|
184
|
+
*/
|
|
185
|
+
export function currentTraceIds(): {
|
|
186
|
+
traceId: string;
|
|
187
|
+
spanId: string;
|
|
188
|
+
} | null;
|
|
189
|
+
/**
|
|
190
|
+
* **pino mixin** โ ํ์ฑ span ์ด ์์ผ๋ฉด ๋ชจ๋ ๋ก๊ทธ ๋ผ์ธ์ `{ trace_id, span_id }` ๋ฅผ ์ฃผ์
ํ๋ค(ADR-116 (d)).
|
|
191
|
+
* ๋ก๊ฑฐ๊ฐ ์ผ์ง ์ฑ์์ `logger: { mixin: MegaTracing.logMixin }` ๋ก ๋ฐฐ์ ํ๋ฉด ์์ฒญ ๋ก๊ทธ๊ฐ trace ์ ์๊ด๋๋ค.
|
|
192
|
+
* ํ์ฑ span ์์ผ๋ฉด ๋น ๊ฐ์ฒด(์ฃผ์
์์). ์ตํธ์ธ OFF ๋ฉด ํญ์ ๋น ๊ฐ์ฒด โ 0 ๋น์ฉ.
|
|
193
|
+
* @returns {{ trace_id?: string, span_id?: string }}
|
|
194
|
+
*/
|
|
195
|
+
export function logMixin(): {
|
|
196
|
+
trace_id?: string;
|
|
197
|
+
span_id?: string;
|
|
198
|
+
};
|
|
199
|
+
/**
|
|
200
|
+
* ํ
์คํธ ๊ฒฉ๋ฆฌ์ฉ reset โ ๋๊ธฐ ๊ฐ์ ์ ๋ฆฌ(provider flush ์์ด ์ํ๋ง ๋น์). ๋น๋๊ธฐ ์ ์ ์ข
๋ฃ๋ `shutdown`.
|
|
201
|
+
* @returns {void}
|
|
202
|
+
*/
|
|
203
|
+
export function _reset(): void;
|
|
204
|
+
export { SpanKind } from "@opentelemetry/api";
|
|
205
|
+
/**
|
|
206
|
+
* `ctx.tracer` ๋ก ๋
ธ์ถํ๋ ํธ๋ ์ด์ ํ๋ฉด(ADR-077/116 canonical `ctx.tracer.span`). ๋ชจ๋ ์ฑ๊ธํค โ ํ์ฑ
|
|
207
|
+
* ์ปจํ
์คํธ๋ ALS ๊ฐ ์์ฒญ๋ณ๋ก ๋ค๊ณ ์์ผ๋ฏ๋ก ๊ฐ์ฒด 1๊ฐ๋ฅผ ๋ชจ๋ ์์ฒญ์ด ๊ณต์ ํด๋ ์์ (getter ๊ฐ ALS ๋ฅผ ์ฝ์).
|
|
208
|
+
*/
|
|
209
|
+
export const tracer: Readonly<{
|
|
210
|
+
span: typeof span;
|
|
211
|
+
/** outbound ํค๋์ traceparent/tracestate ์ฃผ์
(ADR-196) โ `fetch(url, { headers: ctx.tracer.propagationHeaders() })`. */
|
|
212
|
+
propagationHeaders: typeof propagationHeaders;
|
|
213
|
+
/** @returns {import('@opentelemetry/api').Span | undefined} ํ์ฌ ํ์ฑ span(์์ผ๋ฉด undefined โ 03-api-spec ยง10). */
|
|
214
|
+
activeSpan(): import("@opentelemetry/api").Span | undefined;
|
|
215
|
+
/** @returns {string|null} ํ์ฌ ํ์ฑ trace id(์์ผ๋ฉด null). */
|
|
216
|
+
readonly traceId: string | null;
|
|
217
|
+
/** @returns {string|null} ํ์ฌ ํ์ฑ span id(์์ผ๋ฉด null). */
|
|
218
|
+
readonly spanId: string | null;
|
|
219
|
+
}>;
|
|
220
|
+
export type TracingState = {
|
|
221
|
+
provider: import("@opentelemetry/sdk-trace-base").BasicTracerProvider;
|
|
222
|
+
tracer: import("@opentelemetry/api").Tracer;
|
|
223
|
+
exporter: import("@opentelemetry/sdk-trace-base").SpanExporter;
|
|
224
|
+
};
|