@omen.foundation/node-microservice-runtime 0.1.44 → 0.1.46

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/src/runtime.ts CHANGED
@@ -4,6 +4,8 @@ import { GatewayRequester } from './requester.js';
4
4
  import { AuthManager } from './auth.js';
5
5
  import { createLogger } from './logger.js';
6
6
  import { loadEnvironmentConfig } from './env.js';
7
+ import { setupCollectorBeforeLogging } from './collector-manager.js';
8
+ import pino from 'pino';
7
9
  import { listRegisteredServices, getServiceOptions, getConfigureServicesHandlers, getInitializeServicesHandlers } from './decorators.js';
8
10
  import { generateOpenApiDocument } from './docs.js';
9
11
  import { VERSION } from './index.js';
@@ -60,7 +62,15 @@ export class MicroserviceRuntime {
60
62
  constructor(env?: EnvironmentConfig) {
61
63
  this.env = env ?? loadEnvironmentConfig();
62
64
 
63
- // Get registered services first to extract service name for logger
65
+ // STEP 1: Create minimal console logger for startup messages (before collector setup)
66
+ // This ensures we have logging available immediately, even before collector is ready
67
+ const startupLogger = pino({
68
+ name: 'beamable-runtime-startup',
69
+ level: 'info',
70
+ }, process.stdout);
71
+ startupLogger.info('Starting Beamable Node microservice runtime.');
72
+
73
+ // STEP 2: Get registered services to extract service name
64
74
  const registered = listRegisteredServices();
65
75
  if (registered.length === 0) {
66
76
  throw new Error('No microservices registered. Use the @Microservice decorator to register at least one class.');
@@ -70,10 +80,27 @@ export class MicroserviceRuntime {
70
80
  const primaryService = registered[0];
71
81
  const qualifiedServiceName = `micro_${primaryService.qualifiedName}`;
72
82
 
83
+ // STEP 3: Setup collector BEFORE creating the main logger
84
+ // This ensures all logs from the main logger are captured via OTLP
85
+ startupLogger.info('Setting up OpenTelemetry collector...');
86
+ const otlpEndpoint = setupCollectorBeforeLogging(
87
+ this.env,
88
+ 60000 // 60 second timeout
89
+ );
90
+
91
+ if (otlpEndpoint) {
92
+ startupLogger.info(`Collector ready at ${otlpEndpoint}, creating main logger...`);
93
+ } else {
94
+ startupLogger.warn('Collector setup did not complete, continuing without OTLP logging');
95
+ }
96
+
97
+ // STEP 4: Create main logger (collector is now ready, so all logs will be captured)
98
+ // Pass the OTLP endpoint to skip re-discovery/startup
73
99
  this.logger = createLogger(this.env, {
74
100
  name: 'beamable-node-microservice',
75
101
  serviceName: primaryService.name,
76
102
  qualifiedServiceName: qualifiedServiceName,
103
+ otlpEndpoint: otlpEndpoint || undefined, // Pass endpoint if collector was set up
77
104
  });
78
105
  this.serviceManager = new BeamableServiceManager(this.env, this.logger);
79
106