@platformatic/watt-extra 1.13.0-alpha.2 → 1.13.0-alpha.3
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/lib/watt.js +33 -2
- package/package.json +1 -1
- package/plugins/auth.js +3 -0
- package/plugins/init.js +16 -0
package/lib/watt.js
CHANGED
|
@@ -53,11 +53,15 @@ class Watt {
|
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
async spawn () {
|
|
56
|
+
this.#logger.info('[ECS-DEBUG] spawn: enter')
|
|
56
57
|
try {
|
|
57
58
|
this.runtime = await this.#createRuntime()
|
|
59
|
+
this.#logger.info('[ECS-DEBUG] spawn: createRuntime returned, about to call runtime.start()')
|
|
58
60
|
this.#logger.info('Starting runtime -WATT')
|
|
59
61
|
await this.runtime.start()
|
|
62
|
+
this.#logger.info('[ECS-DEBUG] spawn: runtime.start() returned')
|
|
60
63
|
await this.updateSharedContext(this.#sharedContext)
|
|
64
|
+
this.#logger.info('[ECS-DEBUG] spawn: updateSharedContext returned')
|
|
61
65
|
this.#logger.info('Runtime started')
|
|
62
66
|
} catch (err) {
|
|
63
67
|
this.#logger.error(
|
|
@@ -155,14 +159,17 @@ class Watt {
|
|
|
155
159
|
}
|
|
156
160
|
|
|
157
161
|
async #createRuntime () {
|
|
162
|
+
this.#logger.info('[ECS-DEBUG] createRuntime: enter')
|
|
158
163
|
this.#logger.info('Creating runtime')
|
|
159
164
|
const { create, transform } = this.#require('@platformatic/runtime')
|
|
160
165
|
|
|
166
|
+
this.#logger.info('[ECS-DEBUG] createRuntime: about to call platformatic create()')
|
|
161
167
|
this.#logger.info('Creating runtime')
|
|
162
168
|
|
|
163
169
|
const runtime = await create(this.#appDir, null, {
|
|
164
170
|
isProduction: true,
|
|
165
171
|
transform: async (config) => {
|
|
172
|
+
this.#logger.info('[ECS-DEBUG] createRuntime: transform called')
|
|
166
173
|
config = await transform(config)
|
|
167
174
|
|
|
168
175
|
this.#config = config
|
|
@@ -171,9 +178,11 @@ class Watt {
|
|
|
171
178
|
this.#logger.info('Patching runtime config')
|
|
172
179
|
|
|
173
180
|
this.#patchRuntimeConfig(config)
|
|
181
|
+
this.#logger.info('[ECS-DEBUG] createRuntime: transform done')
|
|
174
182
|
return config
|
|
175
183
|
}
|
|
176
184
|
})
|
|
185
|
+
this.#logger.info('[ECS-DEBUG] createRuntime: platformatic create() returned')
|
|
177
186
|
|
|
178
187
|
/* c8 ignore next 3 */
|
|
179
188
|
const restartListener = restartRuntime.bind(null, runtime)
|
|
@@ -182,11 +191,15 @@ class Watt {
|
|
|
182
191
|
process.removeListener('SIGUSR2', restartListener)
|
|
183
192
|
})
|
|
184
193
|
|
|
194
|
+
this.#logger.info('[ECS-DEBUG] createRuntime: about to configureServices')
|
|
185
195
|
await this.#configureServices(runtime)
|
|
196
|
+
this.#logger.info('[ECS-DEBUG] createRuntime: configureServices returned, about to runtime.init()')
|
|
186
197
|
|
|
187
198
|
try {
|
|
188
199
|
await runtime.init()
|
|
200
|
+
this.#logger.info('[ECS-DEBUG] createRuntime: runtime.init() returned')
|
|
189
201
|
} catch (e) {
|
|
202
|
+
this.#logger.error({ err: ensureLoggableError(e) }, '[ECS-DEBUG] createRuntime: runtime.init() threw')
|
|
190
203
|
await runtime.close()
|
|
191
204
|
throw e
|
|
192
205
|
}
|
|
@@ -508,13 +521,18 @@ class Watt {
|
|
|
508
521
|
}
|
|
509
522
|
|
|
510
523
|
async #configureServices (runtime) {
|
|
524
|
+
this.#logger.info('[ECS-DEBUG] configureServices: enter')
|
|
511
525
|
if (typeof runtime.setApplicationConfigPatch !== 'function') {
|
|
526
|
+
this.#logger.info('[ECS-DEBUG] configureServices: runtime has no setApplicationConfigPatch, skipping')
|
|
512
527
|
return
|
|
513
528
|
}
|
|
514
529
|
|
|
515
530
|
const config = runtime.getRuntimeConfig(true)
|
|
531
|
+
const apps = config.applications ?? []
|
|
532
|
+
this.#logger.info({ count: apps.length, apps: apps.map(a => ({ id: a.id, type: a.type, entrypoint: a.entrypoint })) }, '[ECS-DEBUG] configureServices: iterating apps')
|
|
516
533
|
|
|
517
|
-
for (const app of
|
|
534
|
+
for (const app of apps) {
|
|
535
|
+
this.#logger.info({ id: app.id, type: app.type }, '[ECS-DEBUG] configureServices: handling app')
|
|
518
536
|
if (app.type === 'next') {
|
|
519
537
|
await this.#configureNextService(runtime, app)
|
|
520
538
|
} else if (
|
|
@@ -528,19 +546,24 @@ class Watt {
|
|
|
528
546
|
} else if (app.type === '@platformatic/regina') {
|
|
529
547
|
await this.#configureReginaService(runtime, app)
|
|
530
548
|
}
|
|
549
|
+
this.#logger.info({ id: app.id }, '[ECS-DEBUG] configureServices: done with app')
|
|
531
550
|
}
|
|
551
|
+
this.#logger.info('[ECS-DEBUG] configureServices: all apps configured')
|
|
532
552
|
}
|
|
533
553
|
|
|
534
554
|
async #configureNextService (runtime, service) {
|
|
555
|
+
this.#logger.info({ id: service.id, path: service.path, entrypoint: service.entrypoint }, '[ECS-DEBUG] configureNextService: enter')
|
|
535
556
|
let nextSchema
|
|
536
557
|
|
|
537
558
|
try {
|
|
538
559
|
const nextPackage = createRequire(
|
|
539
560
|
resolve(service.path, 'index.js')
|
|
540
561
|
).resolve('@platformatic/next')
|
|
562
|
+
this.#logger.info({ nextPackage }, '[ECS-DEBUG] configureNextService: resolved @platformatic/next')
|
|
541
563
|
nextSchema = JSON.parse(
|
|
542
564
|
await readFile(resolve(nextPackage, '../schema.json'), 'utf8')
|
|
543
565
|
)
|
|
566
|
+
this.#logger.info('[ECS-DEBUG] configureNextService: read next schema')
|
|
544
567
|
} catch (e) {
|
|
545
568
|
this.#logger.error(
|
|
546
569
|
{ err: ensureLoggableError(e) },
|
|
@@ -589,6 +612,7 @@ class Watt {
|
|
|
589
612
|
}
|
|
590
613
|
|
|
591
614
|
async #configurePlatformaticServices (runtime, app) {
|
|
615
|
+
this.#logger.info({ id: app.id, entrypoint: app.entrypoint, type: app.type }, '[ECS-DEBUG] configurePlatformaticServices: enter')
|
|
592
616
|
if (app.entrypoint) {
|
|
593
617
|
const config = app
|
|
594
618
|
const patches = [{ op: 'add', path: '/server/trustProxy', value: true }]
|
|
@@ -601,20 +625,27 @@ class Watt {
|
|
|
601
625
|
|
|
602
626
|
this.#patchService(runtime, app.id, patches)
|
|
603
627
|
}
|
|
628
|
+
this.#logger.info({ id: app.id }, '[ECS-DEBUG] configurePlatformaticServices: exit')
|
|
604
629
|
}
|
|
605
630
|
|
|
606
631
|
async #configureReginaService (runtime, app) {
|
|
632
|
+
this.#logger.info({ id: app.id }, '[ECS-DEBUG] configureReginaService: enter')
|
|
607
633
|
const privateIp = await this.#getPrivateIp()
|
|
608
634
|
const port = this.#getRuntimePort()
|
|
609
635
|
const address = `http://${privateIp}:${port}`
|
|
636
|
+
this.#logger.info({ id: app.id, address }, '[ECS-DEBUG] configureReginaService: applying patch')
|
|
610
637
|
|
|
611
638
|
this.#patchService(runtime, app.id, [
|
|
612
639
|
{ op: 'add', path: '/regina/memberAddress', value: address }
|
|
613
640
|
])
|
|
641
|
+
this.#logger.info({ id: app.id }, '[ECS-DEBUG] configureReginaService: exit')
|
|
614
642
|
}
|
|
615
643
|
|
|
616
644
|
async #getPrivateIp () {
|
|
617
|
-
const
|
|
645
|
+
const hostname = os.hostname()
|
|
646
|
+
this.#logger.info({ hostname }, '[ECS-DEBUG] getPrivateIp: about to dns.lookup')
|
|
647
|
+
const { address } = await dns.lookup(hostname)
|
|
648
|
+
this.#logger.info({ hostname, address }, '[ECS-DEBUG] getPrivateIp: resolved')
|
|
618
649
|
return address
|
|
619
650
|
}
|
|
620
651
|
|
package/package.json
CHANGED
package/plugins/auth.js
CHANGED
|
@@ -43,10 +43,13 @@ async function loadK8sToken (log) {
|
|
|
43
43
|
// endpoint. K8s identity travels via the SA JWT, so no resolution needed there.
|
|
44
44
|
async function resolveEcsIdentity (log) {
|
|
45
45
|
const metadataUrl = `${process.env.ECS_CONTAINER_METADATA_URI_V4}/task`
|
|
46
|
+
log.info({ metadataUrl }, '[ECS-DEBUG] resolveEcsIdentity: fetching task metadata')
|
|
46
47
|
try {
|
|
47
48
|
const res = await fetch(metadataUrl)
|
|
49
|
+
log.info({ status: res.status, ok: res.ok }, '[ECS-DEBUG] resolveEcsIdentity: metadata fetch returned')
|
|
48
50
|
if (!res.ok) throw new Error(`status ${res.status}`)
|
|
49
51
|
const meta = await res.json()
|
|
52
|
+
log.info({ TaskARN: meta.TaskARN, Cluster: meta.Cluster, Family: meta.Family, LaunchType: meta.LaunchType }, '[ECS-DEBUG] resolveEcsIdentity: parsed metadata')
|
|
50
53
|
const id = meta.TaskARN?.split('/').pop()
|
|
51
54
|
// meta.Cluster may be either the short name or the full cluster ARN
|
|
52
55
|
// (e.g. 'arn:aws:ecs:us-east-1:123456789012:cluster/my-cluster'). We
|
package/plugins/init.js
CHANGED
|
@@ -26,6 +26,14 @@ async function initPlugin (app) {
|
|
|
26
26
|
const applicationDir = app.env.PLT_APP_DIR
|
|
27
27
|
const instanceId = app.provider === 'k8s' ? os.hostname() : app.machineIdentity?.id
|
|
28
28
|
|
|
29
|
+
app.log.info({
|
|
30
|
+
provider: app.provider,
|
|
31
|
+
hostname: os.hostname(),
|
|
32
|
+
machineIdentity: app.machineIdentity,
|
|
33
|
+
instanceId,
|
|
34
|
+
applicationDir
|
|
35
|
+
}, '[ECS-DEBUG] init: computed instanceId')
|
|
36
|
+
|
|
29
37
|
app.log.info({ applicationName, applicationDir }, 'Loading watt-extra application')
|
|
30
38
|
|
|
31
39
|
// Skip ICC initialization if PLT_ICC_URL is not set
|
|
@@ -39,6 +47,14 @@ async function initPlugin (app) {
|
|
|
39
47
|
|
|
40
48
|
const instanceConfig = await initApplicationInstance(instanceId, applicationName)
|
|
41
49
|
app.log.info({ applicationId: instanceConfig.applicationId }, 'Got application info')
|
|
50
|
+
app.log.info({
|
|
51
|
+
iccServices: instanceConfig.iccServices,
|
|
52
|
+
enableSlicerInterceptor: instanceConfig.enableSlicerInterceptor,
|
|
53
|
+
enableTrafficInterceptor: instanceConfig.enableTrafficInterceptor,
|
|
54
|
+
enableOpenTelemetry: instanceConfig.enableOpenTelemetry,
|
|
55
|
+
httpCacheKeys: Object.keys(instanceConfig.httpCache?.clientOpts || {}),
|
|
56
|
+
configKeys: Object.keys(instanceConfig.config || {})
|
|
57
|
+
}, '[ECS-DEBUG] init: ICC instanceConfig details')
|
|
42
58
|
|
|
43
59
|
instanceConfig.scaler ??= { version: 'v1' }
|
|
44
60
|
|