azify-logger 1.0.49 → 1.0.51

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "azify-logger",
3
- "version": "1.0.49",
3
+ "version": "1.0.51",
4
4
  "description": "Azify Logger Client - Centralized logging for OpenSearch",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -50,7 +50,7 @@
50
50
  "@opentelemetry/sdk-trace-base": "1.25.0",
51
51
  "@opentelemetry/semantic-conventions": "1.25.0",
52
52
  "adm-zip": "^0.5.16",
53
- "archiver": "^6.0.1",
53
+ "archiver": "^7.0.1",
54
54
  "axios": "^1.7.9",
55
55
  "bull": "^4.16.5",
56
56
  "cors": "^2.8.5",
@@ -60,8 +60,8 @@
60
60
  "fastify-plugin": "^5.0.0",
61
61
  "import-in-the-middle": "^3.0.0",
62
62
  "js-yaml": "^4.1.0",
63
+ "openid-client": "^5.7.1",
63
64
  "passport": "^0.7.0",
64
- "passport-azure-ad": "^4.3.5",
65
65
  "require-in-the-middle": "^7.4.0",
66
66
  "uuid": "^9.0.1"
67
67
  },
@@ -77,7 +77,8 @@
77
77
  "ioredis": "^5.8.2"
78
78
  },
79
79
  "overrides": {
80
- "semver": "^7.5.2"
80
+ "semver": "^7.5.2",
81
+ "glob": "^13.0.0"
81
82
  },
82
83
  "engines": {
83
84
  "node": ">=20 <=22"
@@ -94,6 +95,7 @@
94
95
  "index.d.ts",
95
96
  "init.js",
96
97
  "register.js",
98
+ "register.d.ts",
97
99
  "store.js",
98
100
  "store.d.ts",
99
101
  "register-otel.js",
package/register.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ import { Logger } from 'bunyan';
2
+
3
+ export interface RegisterOptions {
4
+ loggerUrl?: string;
5
+ serviceName?: string;
6
+ environment?: string;
7
+ }
8
+
9
+ /**
10
+ * Registers azify-logger with Bunyan
11
+ * @param logger - Bunyan logger instance
12
+ * @param options - Configuration options
13
+ * @example
14
+ * const register = require('azify-logger/register');
15
+ * register(myLogger, { loggerUrl: 'http://localhost:3001' });
16
+ */
17
+ declare function register(logger: Logger, options?: RegisterOptions): void;
18
+
19
+ export = register;
package/register.js CHANGED
@@ -39,6 +39,17 @@ try {
39
39
  const loggerUrlString = loggerEndpoint.toString()
40
40
  let transport = null
41
41
  const MAX_PENDING_OUTBOUND = 2000
42
+ let requestResponseDirectHttpFailureAnnounced = false
43
+
44
+ function announceRequestResponseDirectHttpFailure(line) {
45
+ if (requestResponseDirectHttpFailureAnnounced) {
46
+ return
47
+ }
48
+ requestResponseDirectHttpFailureAnnounced = true
49
+ try {
50
+ process.stderr.write(line)
51
+ } catch (_) {}
52
+ }
42
53
 
43
54
  function sendRequestResponseDirectHttp(payload) {
44
55
  try {
@@ -57,17 +68,19 @@ try {
57
68
  const debug = process.env.AZIFY_LOGGER_DEBUG === '1'
58
69
  const req = lib.request(opts, function (res) {
59
70
  res.resume()
60
- if (res.statusCode < 200 || res.statusCode >= 300) {
61
- try {
62
- process.stderr.write(`[azify-logger] REQUEST/RESPONSE log POST failed: server responded ${res.statusCode} (check log server at ${loggerUrlString})\n`)
63
- } catch (_) {}
71
+ if (res.statusCode >= 200 && res.statusCode < 300) {
72
+ requestResponseDirectHttpFailureAnnounced = false
73
+ } else if (res.statusCode < 200 || res.statusCode >= 300) {
74
+ announceRequestResponseDirectHttpFailure(
75
+ `[azify-logger] REQUEST/RESPONSE log POST failed: server responded ${res.statusCode} (check log server at ${loggerUrlString})\n`,
76
+ )
64
77
  if (debug) try { process.stderr.write(`[azify-logger] direct HTTP log server responded ${res.statusCode}\n`) } catch (_) {}
65
78
  }
66
79
  })
67
80
  req.on('error', function (err) {
68
- try {
69
- process.stderr.write(`[azify-logger] REQUEST/RESPONSE log POST failed: ${err && err.message} (is log server running at ${loggerUrlString}?)\n`)
70
- } catch (_) {}
81
+ announceRequestResponseDirectHttpFailure(
82
+ `[azify-logger] REQUEST/RESPONSE log POST failed: ${err && err.message} (is log server running at ${loggerUrlString}?)\n`,
83
+ )
71
84
  if (debug) try { process.stderr.write(`[azify-logger] direct HTTP to log server failed: ${err && err.message}\n`) } catch (_) {}
72
85
  })
73
86
  req.setTimeout(5000, function () { req.destroy() })
package/server.js CHANGED
@@ -67,14 +67,13 @@ if (authEnabled) {
67
67
  console.error('[auth] ⚠️ Azure AD habilitado mas variáveis faltando. Defina AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET e AZURE_REDIRECT_URL em env/app.env')
68
68
  console.error('[auth] Variáveis atuais: AZURE_TENANT_ID=' + (tenantId ? '***' : 'VAZIO') + ', AZURE_CLIENT_ID=' + (clientId ? '***' : 'VAZIO') + ', AZURE_CLIENT_SECRET=' + (clientSecret ? '***' : 'VAZIO') + ', AZURE_REDIRECT_URL=' + (redirectUrl ? '***' : 'VAZIO'))
69
69
  } else {
70
- const { setupAuth, setupAuthRoutes, ensureAuthenticated: _ensureAuth, ensureAdmin: _ensureAdmin } = require('./auth')
70
+ const { setupAuth, ensureAuthenticated: _ensureAuth, ensureAdmin: _ensureAdmin } = require('./auth')
71
71
  setupAuth(app)
72
- setupAuthRoutes(app)
73
72
  ensureAuthenticated = _ensureAuth
74
73
  ensureAdmin = _ensureAdmin
75
74
  }
76
75
  }
77
- console.log('[startup] auth configured')
76
+ console.log('[startup] auth session configured (OIDC routes registradas após init)')
78
77
 
79
78
  const IS_LOCAL = process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'dev' || !process.env.NODE_ENV
80
79
 
@@ -2564,28 +2563,53 @@ app.use((err, req, res, next) => {
2564
2563
 
2565
2564
  const port = process.env.PORT || 3001
2566
2565
 
2567
- app.listen(port, () => {
2568
- console.log('[startup] server listening on port', port, '- /health ready')
2569
- setTimeout(() => writeOtelCollectorConfigIfEnabled().catch(() => {}), 3000)
2570
- setTimeout(() => {
2571
- fetchGrafanaOrgs()
2572
- .then((orgs) => {
2573
- const toSetup = orgs.filter((o) => o.id !== 1 && o.name && o.name.toLowerCase() !== 'main org')
2574
- if (setupGrafanaForApp._cache) setupGrafanaForApp._cache.clear()
2575
- function runNext(i) {
2576
- if (i >= toSetup.length) {
2577
- if (toSetup.length) writeOtelCollectorConfigIfEnabled().catch(() => {})
2578
- return
2566
+ async function startServer() {
2567
+ if (authEnabled) {
2568
+ const tenantId = process.env.AZURE_TENANT_ID
2569
+ const clientId = process.env.AZURE_CLIENT_ID
2570
+ const clientSecret = process.env.AZURE_CLIENT_SECRET
2571
+ const redirectUrl = process.env.AZURE_REDIRECT_URL
2572
+ if (tenantId && clientId && clientSecret && redirectUrl) {
2573
+ try {
2574
+ const auth = require('./auth')
2575
+ await auth.initializeAzureAuth()
2576
+ auth.setupAuthRoutes(app)
2577
+ console.log('[startup] Azure AD OIDC (openid-client) rotas /auth prontas')
2578
+ } catch (e) {
2579
+ console.error('[auth] Falha ao inicializar OIDC:', e?.message || e)
2580
+ process.exit(1)
2581
+ }
2582
+ }
2583
+ }
2584
+
2585
+ app.listen(port, () => {
2586
+ console.log('[startup] server listening on port', port, '- /health ready')
2587
+ setTimeout(() => writeOtelCollectorConfigIfEnabled().catch(() => {}), 3000)
2588
+ setTimeout(() => {
2589
+ fetchGrafanaOrgs()
2590
+ .then((orgs) => {
2591
+ const toSetup = orgs.filter((o) => o.id !== 1 && o.name && o.name.toLowerCase() !== 'main org')
2592
+ if (setupGrafanaForApp._cache) setupGrafanaForApp._cache.clear()
2593
+ function runNext(i) {
2594
+ if (i >= toSetup.length) {
2595
+ if (toSetup.length) writeOtelCollectorConfigIfEnabled().catch(() => {})
2596
+ return
2597
+ }
2598
+ setImmediate(() => {
2599
+ setupGrafanaForApp(toSetup[i].name).catch((e) => console.warn('[setupGrafana] Reaplicar Tempo para org', toSetup[i].name, ':', e?.message || e))
2600
+ .finally(() => setTimeout(() => runNext(i + 1), 1000))
2601
+ })
2579
2602
  }
2580
- setImmediate(() => {
2581
- setupGrafanaForApp(toSetup[i].name).catch((e) => console.warn('[setupGrafana] Reaplicar Tempo para org', toSetup[i].name, ':', e?.message || e))
2582
- .finally(() => setTimeout(() => runNext(i + 1), 1000))
2583
- })
2584
- }
2585
- runNext(0)
2586
- })
2587
- .catch((e) => console.warn('[setupGrafana] Reaplicar Tempo para todas as orgs:', e?.message || e))
2588
- }, 60000)
2603
+ runNext(0)
2604
+ })
2605
+ .catch((e) => console.warn('[setupGrafana] Reaplicar Tempo para todas as orgs:', e?.message || e))
2606
+ }, 60000)
2607
+ })
2608
+ }
2609
+
2610
+ startServer().catch((e) => {
2611
+ console.error('[startup] erro fatal:', e)
2612
+ process.exit(1)
2589
2613
  })
2590
2614
 
2591
2615
  process.on('SIGTERM', () => {
package/store.d.ts CHANGED
@@ -25,6 +25,8 @@ export function captureOriginTraceMeta(): {
25
25
  originRequestId?: string
26
26
  }
27
27
 
28
+ export function mergeOriginTraceIntoStructuredLog<T>(payload: T): T
29
+
28
30
  export function addCurrentTraceToBullJobPayload<T>(data: T): T
29
31
 
30
32
  export function traceAttachmentForBullJob(): Record<string, unknown>
package/store.js CHANGED
@@ -82,6 +82,36 @@ function captureOriginTraceMeta() {
82
82
  }
83
83
  }
84
84
 
85
+ function isPlainObjectForLog(v) {
86
+ return v != null && typeof v === 'object' && !Array.isArray(v)
87
+ }
88
+
89
+ function mergeOriginTraceIntoStructuredLog(payload) {
90
+ if (!isPlainObjectForLog(payload)) {
91
+ return payload
92
+ }
93
+ const origin = captureOriginTraceMeta()
94
+ const meta = payload.meta
95
+ if (isPlainObjectForLog(meta)) {
96
+ const mergedMeta = { ...meta }
97
+ if (origin.originTraceId != null && mergedMeta.originTraceId === undefined) {
98
+ mergedMeta.originTraceId = origin.originTraceId
99
+ }
100
+ if (origin.originRequestId != null && mergedMeta.originRequestId === undefined) {
101
+ mergedMeta.originRequestId = origin.originRequestId
102
+ }
103
+ return { ...payload, meta: mergedMeta }
104
+ }
105
+ const out = { ...payload }
106
+ if (origin.originTraceId != null && out.originTraceId === undefined) {
107
+ out.originTraceId = origin.originTraceId
108
+ }
109
+ if (origin.originRequestId != null && out.originRequestId === undefined) {
110
+ out.originRequestId = origin.originRequestId
111
+ }
112
+ return out
113
+ }
114
+
85
115
  function mergeTraceIntoJobPayload(data, traceContext) {
86
116
  if (!traceContext || !traceContext.traceId) return data
87
117
  const base = data && typeof data === 'object' && !Array.isArray(data) ? data : {}
@@ -147,16 +177,42 @@ function attachTraceToBullJobData(data, traceRecord) {
147
177
  }
148
178
  }
149
179
 
180
+ function mergeOriginTraceMetaIntoJobPayload(data) {
181
+ if (!data || typeof data !== 'object' || Array.isArray(data)) {
182
+ return data
183
+ }
184
+ const origin = captureOriginTraceMeta()
185
+ const hasOriginToApply =
186
+ (origin.originTraceId != null && data.originTraceId === undefined) ||
187
+ (origin.originRequestId != null && data.originRequestId === undefined)
188
+ if (!hasOriginToApply) {
189
+ return data
190
+ }
191
+ const base = { ...data }
192
+ if (origin.originTraceId != null && base.originTraceId === undefined) {
193
+ base.originTraceId = origin.originTraceId
194
+ }
195
+ if (origin.originRequestId != null && base.originRequestId === undefined) {
196
+ base.originRequestId = origin.originRequestId
197
+ }
198
+ return base
199
+ }
200
+
150
201
  function addCurrentTraceToBullJobPayload(data) {
202
+ const withOrigin = mergeOriginTraceMetaIntoJobPayload(data)
151
203
  const trace = captureTraceForJobEnqueue()
152
- if (!trace) return data
153
- return attachTraceToBullJobData(data, trace)
204
+ if (!trace) return withOrigin
205
+ return attachTraceToBullJobData(withOrigin, trace)
154
206
  }
155
207
 
156
208
  function traceAttachmentForBullJob() {
157
209
  const trace = captureTraceForJobEnqueue()
158
- if (!trace) return {}
159
- return { [AZIFY_JOB_TRACE_FIELD]: trace }
210
+ const origin = captureOriginTraceMeta()
211
+ const out = { ...origin }
212
+ if (trace) {
213
+ out[AZIFY_JOB_TRACE_FIELD] = trace
214
+ }
215
+ return out
160
216
  }
161
217
 
162
218
  function prepareBullJobTraceContext(data) {
@@ -220,6 +276,7 @@ module.exports = {
220
276
  addCurrentTraceToBullJobPayload,
221
277
  traceAttachmentForBullJob,
222
278
  captureOriginTraceMeta,
279
+ mergeOriginTraceIntoStructuredLog,
223
280
  toTraceIdHex
224
281
  }
225
282