From 6906d7f213f67324cf0f609d56d47dd4d6d15142 Mon Sep 17 00:00:00 2001 From: Alexander Quast <alexander.quast@open-xchange.com> Date: Fri, 8 Jul 2022 14:29:07 +0200 Subject: [PATCH] Added extended logging to some modules Changelog: - Changed all 'trace' logs to level 'debug' - Added logging to the version check functions on log level 'info' and 'debug' - Added some time measures on ready checks to see what's taking so long on startup --- src/cache.js | 8 ++++---- src/config.js | 2 +- src/index.js | 3 +-- src/logger.js | 2 ++ src/redis.js | 6 +++--- src/routes/health.js | 4 +++- src/util.js | 1 + src/version.js | 30 ++++++++++++++++++++---------- 8 files changed, 35 insertions(+), 21 deletions(-) diff --git a/src/cache.js b/src/cache.js index 505849c..d32396e 100644 --- a/src/cache.js +++ b/src/cache.js @@ -4,7 +4,7 @@ import * as redis from './redis.js' const cache = {} export function set (key, value) { - logger.trace(`[Cache] Set ${key}`) + logger.debug(`[Cache] Set ${key}`) if (cache[key] === value) return cache[key] = value if (redis.isEnabled()) { @@ -20,7 +20,7 @@ export async function clear () { export function get (key, fallback) { if (cache[key]) { - logger.trace(`[Cache] Resolve "${key}" from memory`) + logger.debug(`[Cache] Resolve "${key}" from memory`) return cache[key] } @@ -28,7 +28,7 @@ export function get (key, fallback) { if (redis.isEnabled()) { let result = await redis.client.get(key) if (result) { - logger.trace(`[Cache] Resolve "${key}" from redis`) + logger.debug(`[Cache] Resolve "${key}" from redis`) result = JSON.parse(result) cache[key] = result return result @@ -39,7 +39,7 @@ export function get (key, fallback) { const fallbackResult = await fallback() if (fallbackResult) { - logger.trace(`[Cache] Found a fallback for "${key}"`) + logger.debug(`[Cache] Found a fallback for "${key}"`) cache[key] = fallbackResult if (redis.isEnabled()) redis.client.set(key, JSON.stringify(fallbackResult)) } diff --git a/src/config.js b/src/config.js index 0719fa8..233c19c 100644 --- a/src/config.js +++ b/src/config.js @@ -6,7 +6,7 @@ class Config { async load () { const urlsSource = await fs.readFile('./config/config.yaml', 'utf8') this._urls = yaml.load(urlsSource).baseUrls - logger.trace('[Config] Config has been loaded') + logger.debug('[Config] Config has been loaded') } get urls () { diff --git a/src/index.js b/src/index.js index 796ef76..a6ef6d4 100644 --- a/src/index.js +++ b/src/index.js @@ -5,7 +5,6 @@ import { logger } from './logger.js' import { createApp } from './create-app.js' import express from 'express' import createQueues from './create-queues.js' - config() const root = express() @@ -14,7 +13,7 @@ createQueues() // Binds and listens for connections on the specified host and port root.listen(process.env.PORT, () => { - logger.info(`[Server] ui-middleware listening on port ${process.env.PORT}`) + logger.info(`[Server] ui-middleware listening on port ${process.env.PORT}, PID: ${process.pid}`) }) process.on('uncaughtException', err => { diff --git a/src/logger.js b/src/logger.js index 4f41819..50b37a8 100644 --- a/src/logger.js +++ b/src/logger.js @@ -4,3 +4,5 @@ config() export const httpLogger = createHttpLogger() export const logger = createLogger() +export const t0 = +new Date() +export const timeSinceStartup = () => (new Date() - t0) / 1000 diff --git a/src/redis.js b/src/redis.js index 0c16567..1e5e2ab 100644 --- a/src/redis.js +++ b/src/redis.js @@ -1,5 +1,5 @@ import Redis from 'ioredis' -import { logger } from './logger.js' +import { logger, timeSinceStartup } from './logger.js' import Queue from 'bull' const commonQueueOptions = { enableReadyCheck: false, maxRetriesPerRequest: null } @@ -8,7 +8,7 @@ const createClient = (type, options = {}) => { if (!isEnabled()) { return new Proxy({}, { get () { - throw new Error('Redis is disabled. Do not use it.') + throw new Error('Redis is disabled. Check for redis.isEnabled()') } }) } @@ -20,7 +20,7 @@ const createClient = (type, options = {}) => { password: process.env.REDIS_PASSWORD, ...options }) - client.on('ready', () => logger.info(`[Redis] Connected ${type} to redis on ${process.env.REDIS_HOST}`)) + client.on('ready', () => logger.info(`[Redis] Connected ${type} to redis on ${process.env.REDIS_HOST}. Time since startup: ${timeSinceStartup()}s`)) client.on('error', (err) => logger.error(`[Redis] Connect error: ${err}`)) return client diff --git a/src/routes/health.js b/src/routes/health.js index 9e64e08..6920cd0 100644 --- a/src/routes/health.js +++ b/src/routes/health.js @@ -4,7 +4,7 @@ import * as redis from '../redis.js' import { getLatestVersion } from '../version.js' import { once } from '../util.js' import { config } from '../config.js' - +import { logger, timeSinceStartup } from '../logger.js' const router = Router() const healthCheck = new health.HealthChecker() @@ -17,7 +17,9 @@ const checkLatestVersion = new health.StartupCheck('check latest version', once( // config is required before the first version check await config.load() await getLatestVersion() + logger.info(`[Health] Check latest version on startup. Time since startup: ${timeSinceStartup()}`) })) + healthCheck.registerStartupCheck(checkLatestVersion) router.use('/live', health.LivenessEndpoint(healthCheck)) diff --git a/src/util.js b/src/util.js index 3fe5da8..c9eccb5 100644 --- a/src/util.js +++ b/src/util.js @@ -71,3 +71,4 @@ export function once (fn, context) { return res } } +export const t0 = +new Date() diff --git a/src/version.js b/src/version.js index f14e4e6..6c78dc2 100644 --- a/src/version.js +++ b/src/version.js @@ -17,7 +17,7 @@ export const fetchLatestVersion = async () => { if (!version) throw new Error() return version } catch (err) { - logger.debug(`[Version] UI container at ${baseUrl} does not have meta.json. Fall back to version hash based on manifest.`) + logger.error(`[Version] UI container at ${baseUrl} does not have meta.json. Fall back to version hash based on manifest.`) } try { const response = await fetch(new URL('manifest.json', baseUrl)) @@ -33,20 +33,23 @@ export const fetchLatestVersion = async () => { export async function getLatestVersion () { if (latestVersion) return latestVersion - if (redis.isEnabled()) { const version = await redis.client.get(getRedisKey({ name: 'latestVersion' })) - if (version) return (latestVersion = version) + if (version) { + logger.debug(`[Version] Got initial version from redis: '${version}'`) + return (latestVersion = version) + } } - const newVersion = await fetchLatestVersion() + const version = await fetchLatestVersion() + logger.info(`[Version] Fetched initial version: '${version}'`) if (redis.isEnabled()) { - redis.pubClient.publish(getRedisKey({ name: 'updateLatestVersion' }), newVersion) - await redis.client.set(getRedisKey({ name: 'latestVersion' }), newVersion) + redis.pubClient.publish(getRedisKey({ name: 'updateLatestVersion' }), version) + await redis.client.set(getRedisKey({ name: 'latestVersion' }), version) } - return (latestVersion = newVersion) + return (latestVersion = version) } export function registerLatestVersionListener (client) { @@ -54,26 +57,33 @@ export function registerLatestVersionListener (client) { const key = getRedisKey({ name: 'updateLatestVersion' }) client.subscribe(key, (errs, count) => logger.info(`[Redis] Subscribed to ${key}.`)) - client.on('message', async (channel, message) => { + client.on('message', async (channel, version) => { if (channel !== key) return + logger.info(`[Version] Received 'updateLatestVersion' event. Clearing cache. New version: '${version}'`) await config.load() cache.clear() - latestVersion = message + latestVersion = version }) } export async function updateVersionProcessor () { + logger.info('[Version] Check for new version') await config.load() const [storedVersion, fetchedVersion] = await Promise.all([ getLatestVersion(), fetchLatestVersion() ]) - if (storedVersion === fetchedVersion) return fetchedVersion + if (storedVersion === fetchedVersion) { + logger.info(`[Version] No new version has been found. No update needed. Current version: ${storedVersion}`) + return fetchedVersion + } + logger.info(`[Version] Found new source version. Current version: '${storedVersion}', new version: '${fetchedVersion}'`) if (redis.isEnabled()) { redis.pubClient.publish(getRedisKey({ name: 'updateLatestVersion' }), fetchedVersion) await redis.client.set(getRedisKey({ name: 'latestVersion' }), fetchedVersion) } else { // if redis is disabled, this will only be trigger by a setInterval and not from a redis event + logger.info('[Version] Clear local cache due to version update.') cache.clear() } return (latestVersion = fetchedVersion) -- GitLab