@gobing-ai/ts-infra 0.2.8 → 0.3.0

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.
Files changed (61) hide show
  1. package/README.md +49 -13
  2. package/dist/event-bus/event-bus.d.ts.map +1 -1
  3. package/dist/event-bus/event-bus.js +4 -0
  4. package/dist/index.d.ts +1 -3
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +1 -2
  7. package/dist/job-queue/db-job-queue.d.ts.map +1 -1
  8. package/dist/job-queue/db-job-queue.js +12 -2
  9. package/dist/job-queue/types.d.ts +1 -1
  10. package/dist/job-queue/types.d.ts.map +1 -1
  11. package/dist/logger.js +5 -6
  12. package/dist/scheduler/cloudflare.d.ts +0 -4
  13. package/dist/scheduler/cloudflare.d.ts.map +1 -1
  14. package/dist/scheduler/cloudflare.js +10 -1
  15. package/dist/scheduler/factory.d.ts +0 -3
  16. package/dist/scheduler/factory.d.ts.map +1 -1
  17. package/dist/scheduler/factory.js +5 -14
  18. package/dist/scheduler/node.d.ts +0 -4
  19. package/dist/scheduler/node.d.ts.map +1 -1
  20. package/dist/scheduler/node.js +11 -0
  21. package/dist/telemetry/config.d.ts +0 -5
  22. package/dist/telemetry/config.d.ts.map +1 -1
  23. package/dist/telemetry/config.js +0 -3
  24. package/dist/telemetry/index.d.ts +1 -1
  25. package/dist/telemetry/index.d.ts.map +1 -1
  26. package/dist/telemetry/index.js +1 -1
  27. package/dist/telemetry/metrics.d.ts +1 -10
  28. package/dist/telemetry/metrics.d.ts.map +1 -1
  29. package/dist/telemetry/metrics.js +9 -26
  30. package/dist/telemetry/otel-node.d.ts +37 -0
  31. package/dist/telemetry/otel-node.d.ts.map +1 -0
  32. package/dist/telemetry/otel-node.js +85 -0
  33. package/dist/telemetry/sdk.d.ts +12 -1
  34. package/dist/telemetry/sdk.d.ts.map +1 -1
  35. package/dist/telemetry/sdk.js +17 -27
  36. package/package.json +36 -7
  37. package/src/event-bus/event-bus.ts +4 -0
  38. package/src/index.ts +0 -9
  39. package/src/job-queue/db-job-queue.ts +17 -2
  40. package/src/job-queue/types.ts +1 -1
  41. package/src/logger.ts +4 -4
  42. package/src/scheduler/cloudflare.ts +8 -1
  43. package/src/scheduler/factory.ts +2 -15
  44. package/src/scheduler/node.ts +10 -0
  45. package/src/telemetry/config.ts +0 -8
  46. package/src/telemetry/index.ts +0 -6
  47. package/src/telemetry/metrics.ts +9 -38
  48. package/src/telemetry/otel-node.ts +116 -0
  49. package/src/telemetry/sdk.ts +18 -30
  50. package/dist/events/app-events.d.ts +0 -7
  51. package/dist/events/app-events.d.ts.map +0 -1
  52. package/dist/events/app-events.js +0 -4
  53. package/dist/events/create-system-bus.d.ts +0 -6
  54. package/dist/events/create-system-bus.d.ts.map +0 -1
  55. package/dist/events/create-system-bus.js +0 -7
  56. package/dist/events/index.d.ts +0 -3
  57. package/dist/events/index.d.ts.map +0 -1
  58. package/dist/events/index.js +0 -1
  59. package/src/events/app-events.ts +0 -8
  60. package/src/events/create-system-bus.ts +0 -8
  61. package/src/events/index.ts +0 -2
package/README.md CHANGED
@@ -4,15 +4,14 @@ Infrastructure backbone — typed event bus, DB-backed job queue, cron scheduler
4
4
 
5
5
  ## Overview
6
6
 
7
- `ts-infra` provides seven subsystems that form the application backbone:
7
+ `ts-infra` provides six subsystems that form the application backbone:
8
8
 
9
9
  | Subsystem | Module | Purpose |
10
10
  |-----------|--------|---------|
11
11
  | **Event Bus** | `event-bus/` | Typed pub/sub with sync + async dispatch, lifecycle self-observability |
12
- | **Events** | `events/` | Typed event map pattern + system bus factory |
13
12
  | **Job Queue** | `job-queue/` | DB-backed enqueue and consume flow (`DBJobQueue`, `DBQueueConsumer`) plus queue interfaces |
14
13
  | **Scheduler** | `scheduler/` | Cron-like scheduled actions — Node (interval), Cloudflare (Cron Triggers), Noop (test) |
15
- | **Telemetry** | `telemetry/` | OpenTelemetry SDK wrapper — tracing (`traceAsync`), metrics (17 instruments), SQL sanitizer |
14
+ | **Telemetry** | `telemetry/` | OTel instrumentation — tracing (`traceAsync`), metrics (12 instruments), SQL sanitizer; opt-in OTLP export via the `/otel-node` subpath |
16
15
  | **API Client** | `api-client.ts` | Typed HTTP client with OTel tracing, timeout, and error handling |
17
16
  | **Logger** | `logger.ts` | Structured JSON logger with levels, child loggers, and mute toggle |
18
17
 
@@ -32,12 +31,6 @@ classDiagram
32
31
  }
33
32
  }
34
33
 
35
- namespace events {
36
- class EventFactory {
37
- +createSystemBus() EventBus
38
- }
39
- }
40
-
41
34
  namespace job-queue {
42
35
  class JobQueue~T~ {
43
36
  <<interface>>
@@ -104,12 +97,16 @@ classDiagram
104
97
  +getActiveSpan() Span
105
98
  }
106
99
  class Metrics {
107
- +getHttpServerRequestTotal() Counter
108
- +getHttpServerRequestDuration() Histogram
109
- +getDbOperationTotal() Counter
100
+ +getHttpClientRequestTotal() Counter
101
+ +getHttpClientRequestDuration() Histogram
102
+ +getEventbusEmitsTotal() Counter
110
103
  +getQueueJobEnqueuedTotal() Counter
111
104
  +getSchedulerJobExecutedTotal() Counter
112
105
  }
106
+ class OtelNode {
107
+ +initNodeTelemetry(opts) void
108
+ +shutdownNodeTelemetry() Promise~void~
109
+ }
113
110
  class DbSanitize {
114
111
  +sanitizeSql(sql) string
115
112
  +extractSqlOperation(sql) string
@@ -343,7 +340,6 @@ initTelemetry({
343
340
  enabled: true,
344
341
  serviceName: 'my-api',
345
342
  environment: 'production',
346
- exporterEndpoint: 'http://otel-collector:4318/v1/traces',
347
343
  });
348
344
 
349
345
  // Trace an operation
@@ -371,6 +367,46 @@ getQueueJobEnqueuedTotal().add(1, { 'queue.job_type': 'send-email' });
371
367
  getQueueJobProcessingDuration().record(42, { 'queue.job_type': 'send-email' });
372
368
  ```
373
369
 
370
+ #### Instrumentation vs. export
371
+
372
+ The main barrel only **instruments** — it records spans and metrics against the
373
+ globally-registered OpenTelemetry provider, and degrades to no-ops when none is
374
+ registered. It does **not** ship an exporter, so it never forces an OTel SDK or a
375
+ collector opinion on consumers. Two ways to actually export:
376
+
377
+ 1. **BYO** — register your own OTel SDK (tracer + meter providers, exporters) at
378
+ process startup. ts-infra's spans/metrics flow into it automatically.
379
+ 2. **Turnkey OTLP** — opt into the `@gobing-ai/ts-infra/otel-node` subpath, which
380
+ wires Node OTLP/HTTP export for both signals and registers the providers
381
+ globally.
382
+
383
+ ```ts
384
+ // Node-only convenience: pulls the optional OTLP exporter peers.
385
+ import { initNodeTelemetry, shutdownNodeTelemetry } from '@gobing-ai/ts-infra/otel-node';
386
+
387
+ initNodeTelemetry({
388
+ serviceName: 'my-api',
389
+ serviceVersion: '1.4.0',
390
+ endpoint: 'http://otel-collector:4318', // signal paths (/v1/traces, /v1/metrics) appended
391
+ headers: { authorization: `Bearer ${process.env.OTEL_TOKEN}` },
392
+ });
393
+
394
+ process.on('SIGTERM', async () => {
395
+ await shutdownNodeTelemetry(); // flush + drain buffered spans/metrics
396
+ });
397
+ ```
398
+
399
+ The exporter packages are **optional peers** — only consumers of `/otel-node`
400
+ need them installed. The main `@gobing-ai/ts-infra` import never pulls them, so
401
+ BYO and browser/edge consumers stay lean. To use the subpath:
402
+
403
+ ```bash
404
+ bun add @opentelemetry/sdk-trace-node @opentelemetry/sdk-metrics \
405
+ @opentelemetry/resources \
406
+ @opentelemetry/exporter-trace-otlp-http \
407
+ @opentelemetry/exporter-metrics-otlp-http
408
+ ```
409
+
374
410
  ## Usage
375
411
 
376
412
  ### Install
@@ -1 +1 @@
1
- {"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/event-bus/event-bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,KAAK,EAER,kBAAkB,EAElB,QAAQ,EAER,gBAAgB,EACnB,MAAM,SAAS,CAAC;AAQjB;;;GAGG;AACH,qBAAa,QAAQ,CAAC,OAAO,SAAS,QAAQ;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyD;IACtF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyD;IACvF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiD;IACjF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsC;IACnE,OAAO,CAAC,kBAAkB,CAAK;gBAEnB,IAAI,CAAC,EAAE;QACf,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,YAAY,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC;KAC/C;IAKD,EAAE,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,IAAI;IAQzF,IAAI,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,IAAI;IAS3F,GAAG,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;IAkBjE,kBAAkB,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI;IAUtD,IAAI,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAwE7F,aAAa,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM;IAMjF,UAAU,IAAI,MAAM,EAAE;IAOtB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,oBAAoB;CAU/B"}
1
+ {"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/event-bus/event-bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,KAAK,EAER,kBAAkB,EAElB,QAAQ,EAER,gBAAgB,EACnB,MAAM,SAAS,CAAC;AAQjB;;;GAGG;AACH,qBAAa,QAAQ,CAAC,OAAO,SAAS,QAAQ;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyD;IACtF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyD;IACvF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiD;IACjF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsC;IACnE,OAAO,CAAC,kBAAkB,CAAK;gBAEnB,IAAI,CAAC,EAAE;QACf,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,YAAY,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC;KAC/C;IAKD,EAAE,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,IAAI;IAQzF,IAAI,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,IAAI;IAS3F,GAAG,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;IAkBjE,kBAAkB,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI;IAUtD,IAAI,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA2E7F,aAAa,CAAC,CAAC,SAAS,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM;IAMjF,UAAU,IAAI,MAAM,EAAE;IAOtB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,oBAAoB;CAU/B"}
@@ -1,4 +1,5 @@
1
1
  import { getLogger } from '../logger.js';
2
+ import { getEventbusEmitsTotal, getEventbusErrorsTotal } from '../telemetry/metrics.js';
2
3
  let _busLogger;
3
4
  function busLogger() {
4
5
  if (!_busLogger)
@@ -123,6 +124,9 @@ export class EventBus {
123
124
  }
124
125
  const durationMs = performance.now() - startMs;
125
126
  const detail = args.length === 1 ? args[0] : args.length > 1 ? args : undefined;
127
+ getEventbusEmitsTotal().add(1, { event: eventName });
128
+ if (errors > 0)
129
+ getEventbusErrorsTotal().add(errors, { event: eventName });
126
130
  this.publishEmitDone({ event: eventName, syncCount, asyncCount, emitDurationMs: durationMs, errors, detail });
127
131
  if (syncCount === 0 && asyncCount === 0) {
128
132
  busLogger().debug('emit with zero handlers', { event: eventName });
package/dist/index.d.ts CHANGED
@@ -1,10 +1,8 @@
1
1
  export { APIClient, type APIClientConfig, APIError, type RequestOptions } from './api-client';
2
2
  export { EventBus, type EventMap, type SubscribeOptions } from './event-bus/index';
3
- export type { AppEvents, AppInternalEvents } from './events/index';
4
- export { createSystemBus } from './events/index';
5
3
  export type { EnqueueOptions, Job, JobHandler, JobQueue, QueueConsumer, QueueConsumerConfig, QueueStats, } from './job-queue/index';
6
4
  export { DBJobQueue, DBQueueConsumer } from './job-queue/index';
7
5
  export { getLogger, initializeLogger, type Logger, type LogLevel } from './logger';
8
6
  export { CloudflareSchedulerAdapter, getSchedulerAdapter, initScheduler, NodeSchedulerAdapter, NoopSchedulerAdapter, type ScheduledAction, type SchedulerAdapter, setSchedulerAdapter, } from './scheduler/index';
9
- export { addSpanAttributes, addSpanEvent, extractSqlOperation, getActiveSpan, getDbOperationDuration, getDbOperationErrors, getDbOperationTotal, getEventbusEmitsTotal, getEventbusErrorsTotal, getHttpClientRequestDuration, getHttpClientRequestErrors, getHttpClientRequestTotal, getHttpServerRequestDuration, getHttpServerRequestErrors, getHttpServerRequestTotal, getQueueJobCompletedTotal, getQueueJobEnqueuedTotal, getQueueJobFailedTotal, getQueueJobProcessingDuration, getSchedulerJobDuration, getSchedulerJobExecutedTotal, getSchedulerJobFailedTotal, getTelemetryConfig, getTracer, initMetrics, initTelemetry, isTelemetryEnabled, sanitizeSql, shutdownMetrics, shutdownTelemetry, type TelemetryConfig, type TelemetryConfigPartial, traceAsync, traceSync, withSpan, } from './telemetry/index';
7
+ export { addSpanAttributes, addSpanEvent, extractSqlOperation, getActiveSpan, getEventbusEmitsTotal, getEventbusErrorsTotal, getHttpClientRequestDuration, getHttpClientRequestErrors, getHttpClientRequestTotal, getQueueJobCompletedTotal, getQueueJobEnqueuedTotal, getQueueJobFailedTotal, getQueueJobProcessingDuration, getSchedulerJobDuration, getSchedulerJobExecutedTotal, getSchedulerJobFailedTotal, getTelemetryConfig, getTracer, initMetrics, initTelemetry, isTelemetryEnabled, sanitizeSql, shutdownMetrics, shutdownTelemetry, type TelemetryConfig, type TelemetryConfigPartial, traceAsync, traceSync, withSpan, } from './telemetry/index';
10
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,KAAK,eAAe,EAAE,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9F,OAAO,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGnF,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,YAAY,EACR,cAAc,EACd,GAAG,EACH,UAAU,EACV,QAAQ,EACR,aAAa,EACb,mBAAmB,EACnB,UAAU,GACb,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGhE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAGnF,OAAO,EACH,0BAA0B,EAC1B,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,mBAAmB,GACtB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACH,iBAAiB,EACjB,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACb,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,4BAA4B,EAC5B,0BAA0B,EAC1B,yBAAyB,EACzB,4BAA4B,EAC5B,0BAA0B,EAC1B,yBAAyB,EACzB,yBAAyB,EACzB,wBAAwB,EACxB,sBAAsB,EACtB,6BAA6B,EAC7B,uBAAuB,EACvB,4BAA4B,EAC5B,0BAA0B,EAC1B,kBAAkB,EAClB,SAAS,EACT,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,UAAU,EACV,SAAS,EACT,QAAQ,GACX,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,KAAK,eAAe,EAAE,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9F,OAAO,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEnF,YAAY,EACR,cAAc,EACd,GAAG,EACH,UAAU,EACV,QAAQ,EACR,aAAa,EACb,mBAAmB,EACnB,UAAU,GACb,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGhE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AAGnF,OAAO,EACH,0BAA0B,EAC1B,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,mBAAmB,GACtB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACH,iBAAiB,EACjB,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACb,qBAAqB,EACrB,sBAAsB,EACtB,4BAA4B,EAC5B,0BAA0B,EAC1B,yBAAyB,EACzB,yBAAyB,EACzB,wBAAwB,EACxB,sBAAsB,EACtB,6BAA6B,EAC7B,uBAAuB,EACvB,4BAA4B,EAC5B,0BAA0B,EAC1B,kBAAkB,EAClB,SAAS,EACT,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,UAAU,EACV,SAAS,EACT,QAAQ,GACX,MAAM,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -2,7 +2,6 @@
2
2
  export { APIClient, APIError } from './api-client.js';
3
3
  // Event Bus
4
4
  export { EventBus } from './event-bus/index.js';
5
- export { createSystemBus } from './events/index.js';
6
5
  // Job Queue
7
6
  export { DBJobQueue, DBQueueConsumer } from './job-queue/index.js';
8
7
  // Logger
@@ -10,4 +9,4 @@ export { getLogger, initializeLogger } from './logger.js';
10
9
  // Scheduler
11
10
  export { CloudflareSchedulerAdapter, getSchedulerAdapter, initScheduler, NodeSchedulerAdapter, NoopSchedulerAdapter, setSchedulerAdapter, } from './scheduler/index.js';
12
11
  // Telemetry
13
- export { addSpanAttributes, addSpanEvent, extractSqlOperation, getActiveSpan, getDbOperationDuration, getDbOperationErrors, getDbOperationTotal, getEventbusEmitsTotal, getEventbusErrorsTotal, getHttpClientRequestDuration, getHttpClientRequestErrors, getHttpClientRequestTotal, getHttpServerRequestDuration, getHttpServerRequestErrors, getHttpServerRequestTotal, getQueueJobCompletedTotal, getQueueJobEnqueuedTotal, getQueueJobFailedTotal, getQueueJobProcessingDuration, getSchedulerJobDuration, getSchedulerJobExecutedTotal, getSchedulerJobFailedTotal, getTelemetryConfig, getTracer, initMetrics, initTelemetry, isTelemetryEnabled, sanitizeSql, shutdownMetrics, shutdownTelemetry, traceAsync, traceSync, withSpan, } from './telemetry/index.js';
12
+ export { addSpanAttributes, addSpanEvent, extractSqlOperation, getActiveSpan, getEventbusEmitsTotal, getEventbusErrorsTotal, getHttpClientRequestDuration, getHttpClientRequestErrors, getHttpClientRequestTotal, getQueueJobCompletedTotal, getQueueJobEnqueuedTotal, getQueueJobFailedTotal, getQueueJobProcessingDuration, getSchedulerJobDuration, getSchedulerJobExecutedTotal, getSchedulerJobFailedTotal, getTelemetryConfig, getTracer, initMetrics, initTelemetry, isTelemetryEnabled, sanitizeSql, shutdownMetrics, shutdownTelemetry, traceAsync, traceSync, withSpan, } from './telemetry/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"db-job-queue.d.ts","sourceRoot":"","sources":["../../src/job-queue/db-job-queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAkB,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAO,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE7G,kFAAkF;AAClF,qBAAa,UAAU,CAAC,CAAC,GAAG,OAAO,CAAE,YAAW,QAAQ,CAAC,CAAC,CAAC;IAC3C,QAAQ,CAAC,GAAG,EAAE,WAAW;gBAAhB,GAAG,EAAE,WAAW;IAE/B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IAI5E,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC,CAAA;KAAE,GAAG,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAI3F,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC;CAGrC;AAED,qFAAqF;AACrF,qBAAa,eAAe,CAAC,CAAC,GAAG,OAAO,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC;IAc7D,OAAO,CAAC,QAAQ,CAAC,GAAG;IAbxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoC;IAC7D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAK;gBAGA,GAAG,EAAE,WAAW,EACjC,MAAM,GAAE,mBAAwB;IAWpC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI;IAI9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAarB,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC;IAIlC,sFAAsF;IAChF,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAyBpC,OAAO,CAAC,QAAQ;YAMF,IAAI;YASJ,UAAU;YAgBV,WAAW;CAW5B"}
1
+ {"version":3,"file":"db-job-queue.d.ts","sourceRoot":"","sources":["../../src/job-queue/db-job-queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAkB,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAOhF,OAAO,KAAK,EAAE,cAAc,EAAO,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE7G,kFAAkF;AAClF,qBAAa,UAAU,CAAC,CAAC,GAAG,OAAO,CAAE,YAAW,QAAQ,CAAC,CAAC,CAAC;IAC3C,QAAQ,CAAC,GAAG,EAAE,WAAW;gBAAhB,GAAG,EAAE,WAAW;IAE/B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IAM5E,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC,CAAA;KAAE,GAAG,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAM3F,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC;CAGrC;AAED,qFAAqF;AACrF,qBAAa,eAAe,CAAC,CAAC,GAAG,OAAO,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC;IAc7D,OAAO,CAAC,QAAQ,CAAC,GAAG;IAbxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoC;IAC7D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAK;gBAGA,GAAG,EAAE,WAAW,EACjC,MAAM,GAAE,mBAAwB;IAWpC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI;IAI9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAarB,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC;IAIlC,sFAAsF;IAChF,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAyBpC,OAAO,CAAC,QAAQ;YAMF,IAAI;YASJ,UAAU;YAoBV,WAAW;CAY5B"}
@@ -1,3 +1,4 @@
1
+ import { getQueueJobCompletedTotal, getQueueJobEnqueuedTotal, getQueueJobFailedTotal, getQueueJobProcessingDuration, } from '../telemetry/metrics.js';
1
2
  /** DB-backed job queue implementation over `@gobing-ai/ts-db`'s `QueueJobDao`. */
2
3
  export class DBJobQueue {
3
4
  dao;
@@ -5,10 +6,14 @@ export class DBJobQueue {
5
6
  this.dao = dao;
6
7
  }
7
8
  async enqueue(type, payload, options) {
8
- return this.dao.enqueue(type, payload, options);
9
+ const id = await this.dao.enqueue(type, payload, options);
10
+ getQueueJobEnqueuedTotal().add(1, { type });
11
+ return id;
9
12
  }
10
13
  async enqueueBatch(jobs) {
11
- return this.dao.enqueueBatch(jobs);
14
+ const ids = await this.dao.enqueueBatch(jobs);
15
+ getQueueJobEnqueuedTotal().add(jobs.length);
16
+ return ids;
12
17
  }
13
18
  async stats() {
14
19
  return this.dao.getStats();
@@ -105,11 +110,15 @@ export class DBQueueConsumer {
105
110
  await this.failOrRetry(job, new Error(`No handler registered for job type "${job.type}"`));
106
111
  return;
107
112
  }
113
+ const startMs = performance.now();
108
114
  try {
109
115
  await handler(job);
110
116
  await this.dao.markCompleted(job.id);
117
+ getQueueJobCompletedTotal().add(1, { type: job.type });
118
+ getQueueJobProcessingDuration().record(performance.now() - startMs, { type: job.type });
111
119
  }
112
120
  catch (error) {
121
+ getQueueJobProcessingDuration().record(performance.now() - startMs, { type: job.type });
113
122
  await this.failOrRetry(job, error);
114
123
  }
115
124
  }
@@ -118,6 +127,7 @@ export class DBQueueConsumer {
118
127
  const message = error instanceof Error ? error.message : String(error);
119
128
  if (attempts >= job.maxRetries) {
120
129
  await this.dao.markFailed(job.id, attempts, message);
130
+ getQueueJobFailedTotal().add(1, { type: job.type });
121
131
  return;
122
132
  }
123
133
  const delay = Math.min(this.maxDelay, this.baseDelay * 2 ** Math.max(0, attempts - 1));
@@ -28,6 +28,7 @@ export interface JobQueue<T = unknown> {
28
28
  type: string;
29
29
  payload: T;
30
30
  } & EnqueueOptions>): Promise<string[]>;
31
+ stats(): Promise<QueueStats>;
31
32
  }
32
33
  export type JobHandler<T = unknown> = (job: Job<T>) => Promise<void>;
33
34
  export interface QueueStats {
@@ -44,7 +45,6 @@ export interface QueueConsumerConfig {
44
45
  baseDelay?: number;
45
46
  maxDelay?: number;
46
47
  drainTimeoutMs?: number;
47
- maxPollBackoff?: number;
48
48
  }
49
49
  export interface QueueConsumer<T = unknown> {
50
50
  register(type: string, handler: JobHandler<T>): void;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/job-queue/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,OAAO;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ,CAAC,CAAC,GAAG,OAAO;IACjC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7E,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC,CAAA;KAAE,GAAG,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC/F;AAED,MAAM,MAAM,UAAU,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAErE,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACrD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;CAChC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/job-queue/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,OAAO;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ,CAAC,CAAC,GAAG,OAAO;IACjC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7E,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC,CAAA;KAAE,GAAG,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5F,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;CAChC;AAED,MAAM,MAAM,UAAU,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAErE,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACrD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;CAChC"}
package/dist/logger.js CHANGED
@@ -13,15 +13,14 @@ const LEVEL_ORDER = {
13
13
  };
14
14
  class ConsoleLogger {
15
15
  category;
16
- minLevel;
17
16
  context;
18
- constructor(category, minLevel = 'info', context = {}) {
17
+ constructor(category, context = {}) {
19
18
  this.category = category;
20
- this.minLevel = minLevel;
21
19
  this.context = { category, ...context };
22
20
  }
23
21
  log(level, msg, data) {
24
- if (LEVEL_ORDER[level] < LEVEL_ORDER[this.minLevel])
22
+ // Read the level dynamically so re-initialization affects cached loggers too.
23
+ if (LEVEL_ORDER[level] < LEVEL_ORDER[globalLevel])
25
24
  return;
26
25
  if (globalMuted)
27
26
  return;
@@ -68,7 +67,7 @@ class ConsoleLogger {
68
67
  this.log('fatal', msg, data);
69
68
  }
70
69
  child(context) {
71
- return new ConsoleLogger(this.category, this.minLevel, { ...this.context, ...context });
70
+ return new ConsoleLogger(this.category, { ...this.context, ...context });
72
71
  }
73
72
  }
74
73
  const loggers = new Map();
@@ -87,7 +86,7 @@ export function getLogger(category) {
87
86
  const existing = loggers.get(category);
88
87
  if (existing)
89
88
  return existing;
90
- const logger = new ConsoleLogger(category, globalLevel);
89
+ const logger = new ConsoleLogger(category);
91
90
  loggers.set(category, logger);
92
91
  return logger;
93
92
  }
@@ -1,7 +1,3 @@
1
- /**
2
- * Cloudflare Workers scheduler adapter using Cron Triggers.
3
- * Uses minimal local type declarations — no @cloudflare/workers-types dependency.
4
- */
5
1
  import type { ScheduledAction, SchedulerAdapter } from './types';
6
2
  interface CfScheduledEvent {
7
3
  cron: string;
@@ -1 +1 @@
1
- {"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../../src/scheduler/cloudflare.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEjE,UAAU,gBAAgB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CAC9C;AAED,UAAU,cAAc;IACpB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CAC9C;AAED,qBAAa,0BAA2B,YAAW,gBAAgB;IAC/D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;;IAI9D,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI;IAI/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;;OAGG;IACH,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI;CAM3E"}
1
+ {"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../../src/scheduler/cloudflare.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEjE,UAAU,gBAAgB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CAC9C;AAED,UAAU,cAAc;IACpB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;CAC9C;AAED,qBAAa,0BAA2B,YAAW,gBAAgB;IAC/D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;;IAI9D,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI;IAI/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;;OAGG;IACH,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI;CAY3E"}
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Cloudflare Workers scheduler adapter using Cron Triggers.
3
+ * Uses minimal local type declarations — no @cloudflare/workers-types dependency.
4
+ */
5
+ import { getSchedulerJobExecutedTotal, getSchedulerJobFailedTotal } from '../telemetry/metrics.js';
1
6
  export class CloudflareSchedulerAdapter {
2
7
  entries = new Map();
3
8
  constructor() { }
@@ -18,7 +23,11 @@ export class CloudflareSchedulerAdapter {
18
23
  handleScheduledEvent(event, ctx) {
19
24
  const action = this.entries.get(event.cron);
20
25
  if (action) {
21
- ctx.waitUntil(action());
26
+ getSchedulerJobExecutedTotal().add(1, { cron: event.cron });
27
+ ctx.waitUntil(action().catch((error) => {
28
+ getSchedulerJobFailedTotal().add(1, { cron: event.cron });
29
+ throw error;
30
+ }));
22
31
  }
23
32
  }
24
33
  }
@@ -1,6 +1,3 @@
1
- /**
2
- * Scheduler factory — selects adapter based on runtime.
3
- */
4
1
  import type { ScheduledAction, SchedulerAdapter } from './types';
5
2
  export declare function setSchedulerAdapter(adapter: SchedulerAdapter): void;
6
3
  /** Reset the scheduler adapter singleton. For testing. */
@@ -1 +1 @@
1
- {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/scheduler/factory.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAIjE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAEnE;AAED,0DAA0D;AAC1D,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED,wBAAgB,mBAAmB,IAAI,gBAAgB,GAAG,SAAS,CAElE;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,GAAG,gBAAgB,CAa9F"}
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/scheduler/factory.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAIjE,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAEnE;AAED,0DAA0D;AAC1D,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED,wBAAgB,mBAAmB,IAAI,gBAAgB,GAAG,SAAS,CAElE;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,GAAG,gBAAgB,CAa9F"}
@@ -1,3 +1,7 @@
1
+ /**
2
+ * Scheduler factory — selects adapter based on runtime.
3
+ */
4
+ import { NoopSchedulerAdapter } from './noop.js';
1
5
  let runtimeAdapter;
2
6
  export function setSchedulerAdapter(adapter) {
3
7
  runtimeAdapter = adapter;
@@ -21,7 +25,7 @@ export function getSchedulerAdapter() {
21
25
  export function initScheduler(cronEntries) {
22
26
  // Default: create a noop adapter. Apps inject their own via setSchedulerAdapter.
23
27
  if (!runtimeAdapter) {
24
- runtimeAdapter = createNoopScheduler();
28
+ runtimeAdapter = new NoopSchedulerAdapter();
25
29
  }
26
30
  if (cronEntries) {
27
31
  for (const [cron, action] of cronEntries) {
@@ -30,16 +34,3 @@ export function initScheduler(cronEntries) {
30
34
  }
31
35
  return runtimeAdapter;
32
36
  }
33
- function createNoopScheduler() {
34
- return {
35
- register() {
36
- /* noop */
37
- },
38
- start() {
39
- return Promise.resolve();
40
- },
41
- stop() {
42
- return Promise.resolve();
43
- },
44
- };
45
- }
@@ -1,7 +1,3 @@
1
- /**
2
- * Node.js scheduler adapter using a simple setInterval-based approach.
3
- * No external cron library dependency — cron expressions are parsed minimally.
4
- */
5
1
  import type { ScheduledAction, SchedulerAdapter } from './types';
6
2
  export declare class NodeSchedulerAdapter implements SchedulerAdapter {
7
3
  private readonly entries;
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/scheduler/node.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AA6BjE,qBAAa,oBAAqB,YAAW,gBAAgB;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,OAAO,CAAS;;IAIxB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI;IAU/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B,OAAO,CAAC,UAAU;YAOJ,gBAAgB;CAOjC"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/scheduler/node.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AA6BjE,qBAAa,oBAAqB,YAAW,gBAAgB;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,OAAO,CAAS;;IAIxB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI;IAU/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B,OAAO,CAAC,UAAU;YAOJ,gBAAgB;CAYjC"}
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Node.js scheduler adapter using a simple setInterval-based approach.
3
+ * No external cron library dependency — cron expressions are parsed minimally.
4
+ */
5
+ import { getSchedulerJobDuration, getSchedulerJobExecutedTotal, getSchedulerJobFailedTotal, } from '../telemetry/metrics.js';
1
6
  /** Simple helper to parse cron-like interval strings into milliseconds. */
2
7
  function parseInterval(cron) {
3
8
  // Support simple patterns: "* * * * *" (every minute), "*/5 * * * *" (every 5 min)
@@ -53,11 +58,17 @@ export class NodeSchedulerAdapter {
53
58
  entry.timer = setInterval(this._onScheduledTick.bind(this, entry), interval);
54
59
  }
55
60
  async _onScheduledTick(entry) {
61
+ const startMs = performance.now();
62
+ getSchedulerJobExecutedTotal().add(1, { cron: entry.cron });
56
63
  try {
57
64
  await entry.action();
58
65
  }
59
66
  catch {
60
67
  // Swallow — scheduler errors should not crash the process
68
+ getSchedulerJobFailedTotal().add(1, { cron: entry.cron });
69
+ }
70
+ finally {
71
+ getSchedulerJobDuration().record(performance.now() - startMs, { cron: entry.cron });
61
72
  }
62
73
  }
63
74
  }
@@ -8,10 +8,6 @@ export interface TelemetryConfig {
8
8
  serviceName: string;
9
9
  /** Deployment environment (development, staging, production). */
10
10
  environment: string;
11
- /** OTLP exporter endpoint (e.g. `http://localhost:4318/v1/traces`). */
12
- exporterEndpoint?: string | undefined;
13
- /** Export protocol — only `http` is supported in v1. */
14
- exporterProtocol: 'http';
15
11
  /**
16
12
  * Debug-only DB statement capture.
17
13
  *
@@ -30,7 +26,6 @@ export interface TelemetryConfigPartial {
30
26
  enabled?: boolean | undefined;
31
27
  serviceName?: string | undefined;
32
28
  environment?: string | undefined;
33
- exporterEndpoint?: string | undefined;
34
29
  dbStatementDebug?: boolean | undefined;
35
30
  /** Deployment environment fallback (from app.env). */
36
31
  appEnv?: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/telemetry/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC5B,kEAAkE;IAClE,OAAO,EAAE,OAAO,CAAC;IACjB,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,wDAAwD;IACxD,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;;;;;;OAQG;IACH,gBAAgB,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AASD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,GAAE,sBAA2B,GAAG,eAAe,CAY9F"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/telemetry/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC5B,kEAAkE;IAClE,OAAO,EAAE,OAAO,CAAC;IACjB,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;;OAQG;IACH,gBAAgB,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAQD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,GAAE,sBAA2B,GAAG,eAAe,CAU9F"}
@@ -5,7 +5,6 @@ const DEFAULTS = {
5
5
  enabled: true,
6
6
  serviceName: 'ts-libs',
7
7
  environment: 'development',
8
- exporterProtocol: 'http',
9
8
  };
10
9
  /**
11
10
  * Resolve the full telemetry config by merging a partial override with defaults.
@@ -17,8 +16,6 @@ export function getTelemetryConfig(configPartial = {}) {
17
16
  enabled,
18
17
  serviceName,
19
18
  environment: configPartial.environment ?? configPartial.appEnv ?? DEFAULTS.environment,
20
- exporterEndpoint: configPartial.exporterEndpoint,
21
- exporterProtocol: DEFAULTS.exporterProtocol,
22
19
  dbStatementDebug: configPartial.dbStatementDebug ?? false,
23
20
  };
24
21
  }
@@ -1,6 +1,6 @@
1
1
  export { getTelemetryConfig, type TelemetryConfig, type TelemetryConfigPartial } from './config';
2
2
  export { extractSqlOperation, sanitizeSql } from './db-sanitize';
3
- export { type Counter, getDbOperationDuration, getDbOperationErrors, getDbOperationTotal, getEventbusEmitsTotal, getEventbusErrorsTotal, getHttpClientRequestDuration, getHttpClientRequestErrors, getHttpClientRequestTotal, getHttpServerRequestDuration, getHttpServerRequestErrors, getHttpServerRequestTotal, getQueueJobCompletedTotal, getQueueJobEnqueuedTotal, getQueueJobFailedTotal, getQueueJobProcessingDuration, getSchedulerJobDuration, getSchedulerJobExecutedTotal, getSchedulerJobFailedTotal, type Histogram, initMetrics, shutdownMetrics, } from './metrics';
3
+ export { type Counter, getEventbusEmitsTotal, getEventbusErrorsTotal, getHttpClientRequestDuration, getHttpClientRequestErrors, getHttpClientRequestTotal, getQueueJobCompletedTotal, getQueueJobEnqueuedTotal, getQueueJobFailedTotal, getQueueJobProcessingDuration, getSchedulerJobDuration, getSchedulerJobExecutedTotal, getSchedulerJobFailedTotal, type Histogram, initMetrics, shutdownMetrics, } from './metrics';
4
4
  export { getTracer, initTelemetry, isTelemetryEnabled, shutdownTelemetry } from './sdk';
5
5
  export type { Span, SpanOptions, Tracer } from './tracing';
6
6
  export { addSpanAttributes, addSpanEvent, getActiveSpan, traceAsync, traceSync, withSpan } from './tracing';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,KAAK,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,UAAU,CAAC;AACjG,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EACH,KAAK,OAAO,EACZ,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,4BAA4B,EAC5B,0BAA0B,EAC1B,yBAAyB,EACzB,4BAA4B,EAC5B,0BAA0B,EAC1B,yBAAyB,EACzB,yBAAyB,EACzB,wBAAwB,EACxB,sBAAsB,EACtB,6BAA6B,EAC7B,uBAAuB,EACvB,4BAA4B,EAC5B,0BAA0B,EAC1B,KAAK,SAAS,EACd,WAAW,EACX,eAAe,GAClB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AACxF,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,KAAK,eAAe,EAAE,KAAK,sBAAsB,EAAE,MAAM,UAAU,CAAC;AACjG,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EACH,KAAK,OAAO,EACZ,qBAAqB,EACrB,sBAAsB,EACtB,4BAA4B,EAC5B,0BAA0B,EAC1B,yBAAyB,EACzB,yBAAyB,EACzB,wBAAwB,EACxB,sBAAsB,EACtB,6BAA6B,EAC7B,uBAAuB,EACvB,4BAA4B,EAC5B,0BAA0B,EAC1B,KAAK,SAAS,EACd,WAAW,EACX,eAAe,GAClB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AACxF,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC"}
@@ -1,5 +1,5 @@
1
1
  export { getTelemetryConfig } from './config.js';
2
2
  export { extractSqlOperation, sanitizeSql } from './db-sanitize.js';
3
- export { getDbOperationDuration, getDbOperationErrors, getDbOperationTotal, getEventbusEmitsTotal, getEventbusErrorsTotal, getHttpClientRequestDuration, getHttpClientRequestErrors, getHttpClientRequestTotal, getHttpServerRequestDuration, getHttpServerRequestErrors, getHttpServerRequestTotal, getQueueJobCompletedTotal, getQueueJobEnqueuedTotal, getQueueJobFailedTotal, getQueueJobProcessingDuration, getSchedulerJobDuration, getSchedulerJobExecutedTotal, getSchedulerJobFailedTotal, initMetrics, shutdownMetrics, } from './metrics.js';
3
+ export { getEventbusEmitsTotal, getEventbusErrorsTotal, getHttpClientRequestDuration, getHttpClientRequestErrors, getHttpClientRequestTotal, getQueueJobCompletedTotal, getQueueJobEnqueuedTotal, getQueueJobFailedTotal, getQueueJobProcessingDuration, getSchedulerJobDuration, getSchedulerJobExecutedTotal, getSchedulerJobFailedTotal, initMetrics, shutdownMetrics, } from './metrics.js';
4
4
  export { getTracer, initTelemetry, isTelemetryEnabled, shutdownTelemetry } from './sdk.js';
5
5
  export { addSpanAttributes, addSpanEvent, getActiveSpan, traceAsync, traceSync, withSpan } from './tracing.js';
@@ -3,20 +3,11 @@
3
3
  * All degrade to no-ops when telemetry is disabled.
4
4
  */
5
5
  import { type Counter, type Histogram } from '@opentelemetry/api';
6
- import type { MeterProvider } from '@opentelemetry/sdk-metrics';
7
6
  export type { Counter, Histogram } from '@opentelemetry/api';
8
- import type { TelemetryConfig } from './config';
9
7
  export declare function isMetricsInitialized(): boolean;
10
- export declare function getMeterProvider(): MeterProvider;
11
- export declare function getHttpServerRequestTotal(): Counter;
12
- export declare function getHttpServerRequestDuration(): Histogram;
13
- export declare function getHttpServerRequestErrors(): Counter;
14
8
  export declare function getHttpClientRequestTotal(): Counter;
15
9
  export declare function getHttpClientRequestDuration(): Histogram;
16
10
  export declare function getHttpClientRequestErrors(): Counter;
17
- export declare function getDbOperationTotal(): Counter;
18
- export declare function getDbOperationDuration(): Histogram;
19
- export declare function getDbOperationErrors(): Counter;
20
11
  export declare function getEventbusEmitsTotal(): Counter;
21
12
  export declare function getEventbusErrorsTotal(): Counter;
22
13
  export declare function getQueueJobEnqueuedTotal(): Counter;
@@ -26,7 +17,7 @@ export declare function getQueueJobProcessingDuration(): Histogram;
26
17
  export declare function getSchedulerJobExecutedTotal(): Counter;
27
18
  export declare function getSchedulerJobDuration(): Histogram;
28
19
  export declare function getSchedulerJobFailedTotal(): Counter;
29
- export declare function initMetrics(_config?: Partial<TelemetryConfig>): void;
20
+ export declare function initMetrics(): void;
30
21
  export declare function shutdownMetrics(): Promise<void>;
31
22
  export declare function _resetMetrics(): void;
32
23
  //# sourceMappingURL=metrics.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/telemetry/metrics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,SAAS,EAAW,MAAM,oBAAoB,CAAC;AAC3E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAKhD,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C;AAED,wBAAgB,gBAAgB,IAAI,aAAa,CAEhD;AA6BD,wBAAgB,yBAAyB,IAAI,OAAO,CAEnD;AAED,wBAAgB,4BAA4B,IAAI,SAAS,CAExD;AAED,wBAAgB,0BAA0B,IAAI,OAAO,CAEpD;AAID,wBAAgB,yBAAyB,IAAI,OAAO,CAEnD;AAED,wBAAgB,4BAA4B,IAAI,SAAS,CAExD;AAED,wBAAgB,0BAA0B,IAAI,OAAO,CAEpD;AAID,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED,wBAAgB,sBAAsB,IAAI,SAAS,CAElD;AAED,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C;AAID,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAED,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAID,wBAAgB,wBAAwB,IAAI,OAAO,CAElD;AAED,wBAAgB,yBAAyB,IAAI,OAAO,CAEnD;AAED,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED,wBAAgB,6BAA6B,IAAI,SAAS,CAEzD;AAID,wBAAgB,4BAA4B,IAAI,OAAO,CAEtD;AAED,wBAAgB,uBAAuB,IAAI,SAAS,CAEnD;AAED,wBAAgB,0BAA0B,IAAI,OAAO,CAEpD;AAID,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAGpE;AAED,wBAAgB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAG/C;AAED,wBAAgB,aAAa,IAAI,IAAI,CAMpC"}
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/telemetry/metrics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,SAAS,EAAW,MAAM,oBAAoB,CAAC;AAE3E,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAI7D,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C;AA8BD,wBAAgB,yBAAyB,IAAI,OAAO,CAEnD;AAED,wBAAgB,4BAA4B,IAAI,SAAS,CAExD;AAED,wBAAgB,0BAA0B,IAAI,OAAO,CAEpD;AAID,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAED,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAID,wBAAgB,wBAAwB,IAAI,OAAO,CAElD;AAED,wBAAgB,yBAAyB,IAAI,OAAO,CAEnD;AAED,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED,wBAAgB,6BAA6B,IAAI,SAAS,CAEzD;AAID,wBAAgB,4BAA4B,IAAI,OAAO,CAEtD;AAED,wBAAgB,uBAAuB,IAAI,SAAS,CAEnD;AAED,wBAAgB,0BAA0B,IAAI,OAAO,CAEpD;AAID,wBAAgB,WAAW,IAAI,IAAI,CAGlC;AAED,wBAAgB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAS/C;AAED,wBAAgB,aAAa,IAAI,IAAI,CAMpC"}
@@ -3,18 +3,15 @@
3
3
  * All degrade to no-ops when telemetry is disabled.
4
4
  */
5
5
  import { metrics } from '@opentelemetry/api';
6
- let meterProvider;
7
6
  let metricsInitialized = false;
8
7
  export function isMetricsInitialized() {
9
8
  return metricsInitialized;
10
9
  }
11
- export function getMeterProvider() {
12
- return meterProvider ?? metrics.getMeterProvider();
13
- }
14
10
  const METER_NAME = '@gobing-ai/ts-infra';
15
11
  const METER_VERSION = '0.1.0';
12
+ /** Meter from the globally-registered provider (no-op when none registered). */
16
13
  function getMeter() {
17
- return getMeterProvider().getMeter(METER_NAME, METER_VERSION);
14
+ return metrics.getMeter(METER_NAME, METER_VERSION);
18
15
  }
19
16
  // ── Instrument cache ────────────────────────────────────────────────
20
17
  const instruments = {};
@@ -30,16 +27,6 @@ function getOrCreateHistogram(key, name, description, unit = 'ms') {
30
27
  }
31
28
  return instruments[key];
32
29
  }
33
- // ── HTTP server ─────────────────────────────────────────────────────
34
- export function getHttpServerRequestTotal() {
35
- return getOrCreateCounter('httpSrvReq', 'http.server.request.total', 'Total inbound HTTP requests', '{request}');
36
- }
37
- export function getHttpServerRequestDuration() {
38
- return getOrCreateHistogram('httpSrvDur', 'http.server.request.duration', 'Inbound HTTP request duration');
39
- }
40
- export function getHttpServerRequestErrors() {
41
- return getOrCreateCounter('httpSrvErr', 'http.server.request.errors', 'Inbound HTTP 5xx errors', '{error}');
42
- }
43
30
  // ── HTTP client ─────────────────────────────────────────────────────
44
31
  export function getHttpClientRequestTotal() {
45
32
  return getOrCreateCounter('httpCliReq', 'http.client.request.total', 'Total outbound HTTP requests', '{request}');
@@ -50,16 +37,6 @@ export function getHttpClientRequestDuration() {
50
37
  export function getHttpClientRequestErrors() {
51
38
  return getOrCreateCounter('httpCliErr', 'http.client.request.errors', 'Outbound HTTP errors', '{error}');
52
39
  }
53
- // ── DB ──────────────────────────────────────────────────────────────
54
- export function getDbOperationTotal() {
55
- return getOrCreateCounter('dbOpTotal', 'db.client.operation.total', 'Total DB operations', '{operation}');
56
- }
57
- export function getDbOperationDuration() {
58
- return getOrCreateHistogram('dbOpDur', 'db.client.operation.duration', 'DB operation duration');
59
- }
60
- export function getDbOperationErrors() {
61
- return getOrCreateCounter('dbOpErr', 'db.client.operation.errors', 'DB operation errors', '{error}');
62
- }
63
40
  // ── Event bus ───────────────────────────────────────────────────────
64
41
  export function getEventbusEmitsTotal() {
65
42
  return getOrCreateCounter('ebEmit', 'eventbus.emits.total', 'Total event bus emits', '{emit}');
@@ -91,12 +68,18 @@ export function getSchedulerJobFailedTotal() {
91
68
  return getOrCreateCounter('schedFail', 'scheduler.jobs.failed', 'Failed scheduled jobs', '{failure}');
92
69
  }
93
70
  // ── Lifecycle ───────────────────────────────────────────────────────
94
- export function initMetrics(_config) {
71
+ export function initMetrics() {
95
72
  if (metricsInitialized)
96
73
  return;
97
74
  metricsInitialized = true;
98
75
  }
99
76
  export function shutdownMetrics() {
77
+ // The meter provider is owned by whoever registered it globally (the host
78
+ // app or `@gobing-ai/ts-infra/otel-node`). Here we only drop the instrument
79
+ // cache so post-shutdown getters rebuild against a fresh meter.
80
+ for (const key of Object.keys(instruments)) {
81
+ instruments[key] = undefined;
82
+ }
100
83
  metricsInitialized = false;
101
84
  return Promise.resolve();
102
85
  }