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 +6 -4
- package/register.d.ts +19 -0
- package/register.js +20 -7
- package/server.js +48 -24
- package/store.d.ts +2 -0
- package/store.js +61 -4
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "azify-logger",
|
|
3
|
-
"version": "1.0.
|
|
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": "^
|
|
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
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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,
|
|
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
|
-
|
|
2568
|
-
|
|
2569
|
-
|
|
2570
|
-
|
|
2571
|
-
|
|
2572
|
-
|
|
2573
|
-
|
|
2574
|
-
|
|
2575
|
-
|
|
2576
|
-
|
|
2577
|
-
|
|
2578
|
-
|
|
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
|
-
|
|
2581
|
-
|
|
2582
|
-
|
|
2583
|
-
|
|
2584
|
-
|
|
2585
|
-
|
|
2586
|
-
|
|
2587
|
-
|
|
2588
|
-
|
|
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
|
|
153
|
-
return attachTraceToBullJobData(
|
|
204
|
+
if (!trace) return withOrigin
|
|
205
|
+
return attachTraceToBullJobData(withOrigin, trace)
|
|
154
206
|
}
|
|
155
207
|
|
|
156
208
|
function traceAttachmentForBullJob() {
|
|
157
209
|
const trace = captureTraceForJobEnqueue()
|
|
158
|
-
|
|
159
|
-
|
|
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
|
|