@nxtedition/lib 23.9.18 → 23.10.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.
- package/app.js +75 -2
- package/package.json +1 -1
package/app.js
CHANGED
|
@@ -37,6 +37,7 @@ import { LRUCache } from 'lru-cache'
|
|
|
37
37
|
import xuid from 'xuid'
|
|
38
38
|
import { isTimeBetween } from './time.js'
|
|
39
39
|
import makeUnderPressure from './under-pressure.js'
|
|
40
|
+
import undici from '@nxtedition/undici'
|
|
40
41
|
|
|
41
42
|
export function makeApp(appConfig, onTerminate) {
|
|
42
43
|
let ds
|
|
@@ -479,6 +480,65 @@ export function makeApp(appConfig, onTerminate) {
|
|
|
479
480
|
compiler = makeTemplateCompiler({ ds, logger, ...appConfig.compiler })
|
|
480
481
|
}
|
|
481
482
|
|
|
483
|
+
const undiciDefaults = {
|
|
484
|
+
connected: 0,
|
|
485
|
+
disconnected: 0,
|
|
486
|
+
connections: 0,
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
const undici$ = new rxjs.BehaviorSubject(undiciDefaults)
|
|
490
|
+
{
|
|
491
|
+
function onConnect(origin, targets) {
|
|
492
|
+
const stats = { ...undici$.value }
|
|
493
|
+
stats.connected++
|
|
494
|
+
stats.connections = stats.connected - stats.disconnected
|
|
495
|
+
undici$.next(stats)
|
|
496
|
+
logger.debug({ url: origin, count: stats.connected }, 'upstream connect')
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
function onDisconnect(origin, targets, err) {
|
|
500
|
+
const stats = { ...undici$.value }
|
|
501
|
+
stats.connected--
|
|
502
|
+
stats.connections = stats.connected - stats.disconnected
|
|
503
|
+
undici$.next(stats)
|
|
504
|
+
logger.debug({ url: origin, count: stats.connected }, 'upstream disconnect')
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
let currentDispatcher
|
|
508
|
+
function maybeRegisterUndiciStats() {
|
|
509
|
+
const nextDispatcher = undici.getGlobalDispatcher()
|
|
510
|
+
|
|
511
|
+
if (nextDispatcher === currentDispatcher) {
|
|
512
|
+
return
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
if (currentDispatcher) {
|
|
516
|
+
currentDispatcher.off('connect', onConnect).off('disconnect', onDisconnect)
|
|
517
|
+
currentDispatcher = null
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
undici$.next(undiciDefaults)
|
|
521
|
+
|
|
522
|
+
nextDispatcher.on('connect', onConnect).on('disconnect', onDisconnect)
|
|
523
|
+
|
|
524
|
+
currentDispatcher = nextDispatcher
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
let undiciInterval = setInterval(() => maybeRegisterUndiciStats(), 10e3).unref()
|
|
528
|
+
|
|
529
|
+
destroyers.push(() => {
|
|
530
|
+
if (undiciInterval) {
|
|
531
|
+
clearInterval(undiciInterval)
|
|
532
|
+
undiciInterval = null
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
if (currentDispatcher) {
|
|
536
|
+
currentDispatcher.off('connect', onConnect).off('disconnect', onDisconnect)
|
|
537
|
+
currentDispatcher = null
|
|
538
|
+
}
|
|
539
|
+
})
|
|
540
|
+
}
|
|
541
|
+
|
|
482
542
|
const monitorProviders = {}
|
|
483
543
|
|
|
484
544
|
let stats$
|
|
@@ -568,9 +628,11 @@ export function makeApp(appConfig, onTerminate) {
|
|
|
568
628
|
}
|
|
569
629
|
}),
|
|
570
630
|
),
|
|
631
|
+
undici$,
|
|
571
632
|
),
|
|
572
|
-
rx.map(([serviceStats, appStats]) => ({
|
|
633
|
+
rx.map(([serviceStats, appStats, undiciStats]) => ({
|
|
573
634
|
...appStats,
|
|
635
|
+
undici: undici$,
|
|
574
636
|
[serviceName]: serviceStats,
|
|
575
637
|
})),
|
|
576
638
|
rx.retryWhen((err$) =>
|
|
@@ -636,6 +698,17 @@ export function makeApp(appConfig, onTerminate) {
|
|
|
636
698
|
rx.distinctUntilChanged(fp.isEqual),
|
|
637
699
|
rx.repeatWhen((complete$) => complete$.pipe(rx.delay(10e3))),
|
|
638
700
|
),
|
|
701
|
+
undici$.pipe(
|
|
702
|
+
rx.map((stats) => {
|
|
703
|
+
return [
|
|
704
|
+
{
|
|
705
|
+
id: 'app:undici_upstream_connections',
|
|
706
|
+
level: stats.connections > 8192 ? 50 : stats.connections > 4096 ? 40 : 30,
|
|
707
|
+
msg: `Undici: ${stats.connections} upstream connected`,
|
|
708
|
+
},
|
|
709
|
+
]
|
|
710
|
+
}),
|
|
711
|
+
),
|
|
639
712
|
toobusy?.appLag$.pipe(
|
|
640
713
|
rx.map((lag) =>
|
|
641
714
|
lag == null
|
|
@@ -1015,7 +1088,7 @@ export function makeApp(appConfig, onTerminate) {
|
|
|
1015
1088
|
utilsBC.unref()
|
|
1016
1089
|
|
|
1017
1090
|
function writeHeapSnapshot() {
|
|
1018
|
-
const snapshotPath = `${os.tmpdir()}/heap-${Date.now()}-${serviceName}-${serviceModule}-${serviceInstanceId}-${serviceWorkerId}.heapsnapshot`
|
|
1091
|
+
const snapshotPath = `${os.tmpdir()}/heap-${Date.now()}-${serviceName}-${serviceModule}-${serviceInstanceId}-${serviceWorkerId}-${threadId}.heapsnapshot`
|
|
1019
1092
|
v8.writeHeapSnapshot(snapshotPath)
|
|
1020
1093
|
logger.info({ snapshotPath }, 'heap snapshot')
|
|
1021
1094
|
}
|