Skip to content

Commit 3e11cc2

Browse files
authored
fix(seeder): surface FRED 0-series failure in health + logs (koala73#2448)
* fix(seeder): surface FRED 0-series failure in health + logs - Log actual rejection reason when a FRED series fetch fails (was silent) - Warn explicitly when all 22 FRED series fail (0/22 case) - Fix truthiness guard: empty {} return from fetchFredSeries() is truthy, causing the 'all fetches failed' guard to never fire when FRED is down but other data (EIA, Macro) succeeds — FRED panels silently go stale Without this fix: FRED keys retain old Redis data until 26h TTL expires, health shows STALE_SEED (warning) not DEGRADED, and the actual error reason is never logged. * fix(seeder): use frHasData in FRED write block for consistency
1 parent dd5f4b2 commit 3e11cc2

1 file changed

Lines changed: 7 additions & 4 deletions

File tree

scripts/seed-economy.mjs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ async function fetchFredSeries() {
170170
]);
171171

172172
if (obsResp.status === 'rejected') {
173-
console.warn(` FRED ${seriesId}: fetch failed`);
173+
console.warn(` FRED ${seriesId}: fetch failed${obsResp.reason?.message || obsResp.reason}`);
174174
continue;
175175
}
176176

@@ -192,7 +192,9 @@ async function fetchFredSeries() {
192192
console.warn(` FRED ${seriesId}: ${e.message}`);
193193
}
194194
}
195-
console.log(` FRED series: ${Object.keys(results).length}/${FRED_SERIES.length}`);
195+
const fredCount = Object.keys(results).length;
196+
console.log(` FRED series: ${fredCount}/${FRED_SERIES.length}`);
197+
if (fredCount === 0) console.warn(' [WARN] FRED series: 0 fetched — all series failed. Check FRED_API_KEY and PROXY_URL. FRED-dependent panels will go stale.');
196198
return results;
197199
}
198200

@@ -542,12 +544,13 @@ async function fetchAll() {
542544
if (crudeInventories.status === 'rejected') console.warn(` CrudeInventories failed: ${crudeInventories.reason?.message || crudeInventories.reason}`);
543545
if (natGasStorage.status === 'rejected') console.warn(` NatGasStorage failed: ${natGasStorage.reason?.message || natGasStorage.reason}`);
544546

545-
if (!ep && !fr && !ms) throw new Error('All economic fetches failed');
547+
const frHasData = fr && Object.keys(fr).length > 0;
548+
if (!ep && !frHasData && !ms) throw new Error('All economic fetches failed');
546549

547550
// Write secondary keys BEFORE returning (runSeed calls process.exit after primary write)
548551
if (ec?.series?.length > 0) await writeExtraKeyWithMeta(KEYS.energyCapacity, ec, CAPACITY_TTL, ec.series.length);
549552

550-
if (fr) {
553+
if (frHasData) {
551554
for (const [seriesId, series] of Object.entries(fr)) {
552555
await writeExtraKeyWithMeta(`${FRED_KEY_PREFIX}:${seriesId}:0`, { series }, FRED_TTL, series.observations?.length ?? 0);
553556
}

0 commit comments

Comments
 (0)