Some more update to fix with local DB Prem #9
No files matched your search
@@ -2,18 +2,13 @@ FROM oven/bun:1-alpine
|
|||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
# Install dependencies first (layer caching)
|
COPY backend/package*.json ./
|
||||||
# bun install is compatible with npm package.json / package-lock.json
|
|
||||||
COPY package*.json ./
|
|
||||||
RUN bun install --production
|
RUN bun install --production
|
||||||
|
|
||||||
# Copy application source
|
COPY backend/ .
|
||||||
COPY . .
|
|
||||||
|
|
||||||
# Expose backend API port
|
|
||||||
EXPOSE 3001
|
EXPOSE 3001
|
||||||
|
|
||||||
# Health check
|
|
||||||
HEALTHCHECK --interval=30s --timeout=10s --start-period=20s --retries=3 \
|
HEALTHCHECK --interval=30s --timeout=10s --start-period=20s --retries=3 \
|
||||||
CMD bun -e "require('http').get('http://localhost:3001/api/health', r => r.statusCode === 200 ? process.exit(0) : process.exit(1)).on('error', () => process.exit(1))"
|
CMD bun -e "require('http').get('http://localhost:3001/api/health', r => r.statusCode === 200 ? process.exit(0) : process.exit(1)).on('error', () => process.exit(1))"
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ async function populateAppCache(BASE_URL, token, siteUuid) {
|
|||||||
const headers = { 'x-api-key': token, 'Accept': 'application/json' };
|
const headers = { 'x-api-key': token, 'Accept': 'application/json' };
|
||||||
if (siteUuid) headers['x-net-site'] = siteUuid;
|
if (siteUuid) headers['x-net-site'] = siteUuid;
|
||||||
const res = await axios.get(`${BASE_URL}/lookup/applications`, {
|
const res = await axios.get(`${BASE_URL}/lookup/applications`, {
|
||||||
headers, params: { settings_limit: 5000 }, timeout: 20000
|
headers, params: { settings_limit: 10000 }, timeout: 20000
|
||||||
});
|
});
|
||||||
appLookupCache = {};
|
appLookupCache = {};
|
||||||
if (res.data && Array.isArray(res.data.data)) {
|
if (res.data && Array.isArray(res.data.data)) {
|
||||||
|
|||||||
@@ -2,18 +2,13 @@ FROM oven/bun:1-alpine
|
|||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
# Install dependencies first (layer caching)
|
COPY proxy/package*.json ./
|
||||||
# bun install is compatible with npm package.json / package-lock.json
|
|
||||||
COPY package*.json ./
|
|
||||||
RUN bun install --production
|
RUN bun install --production
|
||||||
|
|
||||||
# Copy application source
|
COPY proxy/ .
|
||||||
COPY . .
|
|
||||||
|
|
||||||
# Expose proxy REST API port
|
|
||||||
EXPOSE 4000
|
EXPOSE 4000
|
||||||
|
|
||||||
# Health check
|
|
||||||
HEALTHCHECK --interval=30s --timeout=10s --start-period=15s --retries=3 \
|
HEALTHCHECK --interval=30s --timeout=10s --start-period=15s --retries=3 \
|
||||||
CMD bun -e "require('http').get('http://localhost:4000/health', r => r.statusCode === 200 ? process.exit(0) : process.exit(1)).on('error', () => process.exit(1))"
|
CMD bun -e "require('http').get('http://localhost:4000/health', r => r.statusCode === 200 ? process.exit(0) : process.exit(1)).on('error', () => process.exit(1))"
|
||||||
|
|
||||||
|
|||||||
+42
-1
@@ -18,6 +18,8 @@ const {
|
|||||||
} = require('./collectorHelperDpi2');
|
} = require('./collectorHelperDpi2');
|
||||||
|
|
||||||
const { Summary, AppStat } = require('./models/Schemas');
|
const { Summary, AppStat } = require('./models/Schemas');
|
||||||
|
const { LookupApp } = require('./models/SchemasAux');
|
||||||
|
const { BASE_URL } = require('./netifyClientCore');
|
||||||
const { pruneOldData } = require('./dataRetention');
|
const { pruneOldData } = require('./dataRetention');
|
||||||
|
|
||||||
const SITE_UUIDS_STR = process.env.NETIFY_SITE_UUIDS || process.env.NETIFY_SITE_UUID;
|
const SITE_UUIDS_STR = process.env.NETIFY_SITE_UUIDS || process.env.NETIFY_SITE_UUID;
|
||||||
@@ -255,8 +257,47 @@ async function collectSpecificAgents(agentUuids, siteUuid = SITE_UUIDS[0], delay
|
|||||||
return { success: true, mode: 'specific_agents', agents_count: agentUuids.length, successful, results };
|
return { success: true, mode: 'specific_agents', agents_count: agentUuids.length, successful, results };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function populateLookupApps(siteUuid = '') {
|
||||||
|
try {
|
||||||
|
const axios = require('axios');
|
||||||
|
const headers = { 'Accept': 'application/json' };
|
||||||
|
const res = await axios.get(`${BASE_URL}/lookup/applications`, {
|
||||||
|
headers, params: { settings_limit: 10000 }, timeout: 20000
|
||||||
|
});
|
||||||
|
const apps = res.data?.data;
|
||||||
|
if (!apps || !Array.isArray(apps)) {
|
||||||
|
console.log('[LookupApp] No application data from DPI API');
|
||||||
|
return { success: false, count: 0 };
|
||||||
|
}
|
||||||
|
let upserted = 0;
|
||||||
|
for (const a of apps) {
|
||||||
|
if (!a.id) continue;
|
||||||
|
const doc = {
|
||||||
|
id: a.id,
|
||||||
|
tag: a.tag || '',
|
||||||
|
label: a.label || '',
|
||||||
|
name: a.full_label || a.label || '',
|
||||||
|
full_name: a.full_label || '',
|
||||||
|
description: a.description || '',
|
||||||
|
favicon: a.favicon || '',
|
||||||
|
icon: a.icon || '',
|
||||||
|
logo: a.logo || '',
|
||||||
|
application_category: a.category || null
|
||||||
|
};
|
||||||
|
await LookupApp.updateOne({ id: a.id }, { $set: doc }, { upsert: true });
|
||||||
|
upserted++;
|
||||||
|
}
|
||||||
|
console.log(`[LookupApp] Upserted ${upserted} applications`);
|
||||||
|
return { success: true, count: upserted };
|
||||||
|
} catch (err) {
|
||||||
|
console.error('[LookupApp] Population error:', err.message);
|
||||||
|
return { success: false, count: 0 };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
collectAllAgents,
|
collectAllAgents,
|
||||||
collectSpecificAgent,
|
collectSpecificAgent,
|
||||||
collectSpecificAgents
|
collectSpecificAgents,
|
||||||
|
populateLookupApps
|
||||||
};
|
};
|
||||||
+12
-3
@@ -3,7 +3,7 @@
|
|||||||
// Runs every 5 minutes, collecting data for all agents or a specific agent.
|
// Runs every 5 minutes, collecting data for all agents or a specific agent.
|
||||||
|
|
||||||
const cron = require('node-cron');
|
const cron = require('node-cron');
|
||||||
const { collectAllAgents, collectSpecificAgent, collectSpecificAgents } = require('./collector');
|
const { collectAllAgents, collectSpecificAgent, collectSpecificAgents, populateLookupApps } = require('./collector');
|
||||||
|
|
||||||
// Mode: 'all' = collect all agents, 'agent' = collect one specific agent, 'agents' = collect multiple agents
|
// Mode: 'all' = collect all agents, 'agent' = collect one specific agent, 'agents' = collect multiple agents
|
||||||
const COLLECT_MODE = process.env.PROXY_COLLECT_MODE || 'all';
|
const COLLECT_MODE = process.env.PROXY_COLLECT_MODE || 'all';
|
||||||
@@ -21,6 +21,7 @@ let lastRunAt = null;
|
|||||||
let lastRunResult = null;
|
let lastRunResult = null;
|
||||||
let runCount = 0;
|
let runCount = 0;
|
||||||
let lastCapacityLogAt = 0;
|
let lastCapacityLogAt = 0;
|
||||||
|
let lastAppLookupRefresh = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute one collection cycle (called by cron and manual trigger).
|
* Execute one collection cycle (called by cron and manual trigger).
|
||||||
@@ -58,6 +59,14 @@ async function runCollection() {
|
|||||||
const { logCapacityStats } = require('./db/capacityTracker');
|
const { logCapacityStats } = require('./db/capacityTracker');
|
||||||
await logCapacityStats(`[PROXY] [MongoDB] Capacity Used after Run #${runCount}:`);
|
await logCapacityStats(`[PROXY] [MongoDB] Capacity Used after Run #${runCount}:`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Refresh application lookup catalog daily (expensive: fetches 5000+ apps)
|
||||||
|
if (now - (lastAppLookupRefresh || 0) >= CAPACITY_LOG_INTERVAL_MS) {
|
||||||
|
lastAppLookupRefresh = now;
|
||||||
|
await populateLookupApps('').catch(err =>
|
||||||
|
console.error('[Scheduler] LookupApp refresh failed:', err.message)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return lastRunResult;
|
return lastRunResult;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
@@ -96,8 +105,8 @@ function startScheduler() {
|
|||||||
|
|
||||||
// Initial run immediately on startup (async, do not block server start)
|
// Initial run immediately on startup (async, do not block server start)
|
||||||
setTimeout(async () => {
|
setTimeout(async () => {
|
||||||
// 1. Sync dictionary first
|
// 1. Sync application lookup catalog from DPI API
|
||||||
// await netifyClient.syncApplicationDictionary();
|
populateLookupApps('').catch(err => console.error('[Scheduler] Initial LookupApp sync failed:', err.message));
|
||||||
|
|
||||||
// 2. Start normal telemetry collection
|
// 2. Start normal telemetry collection
|
||||||
runCollection().catch(err => console.error('[Scheduler] Initial run error:', err.message));
|
runCollection().catch(err => console.error('[Scheduler] Initial run error:', err.message));
|
||||||
|
|||||||
Reference in new issue
Block a user