diff --git a/redis.js b/redis.js index 4c1079d..8dd8a29 100644 --- a/redis.js +++ b/redis.js @@ -17,6 +17,20 @@ return hits const SCAN_BATCH = 200; +function parseInfoSections(chunks) { + const out = new Map(); + for (const chunk of chunks) { + for (const line of String(chunk || '').split('\n')) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith('#')) continue; + const sep = trimmed.indexOf(':'); + if (sep < 1) continue; + out.set(trimmed.slice(0, sep).trim(), trimmed.slice(sep + 1).trim()); + } + } + return out; +} + function createMemoryBackend() { const store = new Map(); const listeners = new Map(); @@ -184,25 +198,43 @@ function createRedis({ url, prefix } = {}) { async info() { const base = { ...stats, enabled: enabled(), ready: ready(), namespace }; - if (!ready()) return { ...base, driver: 'memory', used_memory_bytes: null, used_memory_human: null, keys: null }; + const offline = { + ...base, + driver: 'memory', + version: null, + server_uptime_s: null, + used_memory_bytes: null, + used_memory_human: null, + keys: null, + }; + if (!ready()) return offline; try { - const [raw, dbsize] = await Promise.all([client.info('memory'), client.dbSize()]); - let used = null; - let human = null; - for (const line of String(raw || '').split('\n')) { - if (line.startsWith('used_memory:')) used = parseInt(line.slice(13).trim(), 10) || null; - else if (line.startsWith('used_memory_human:')) human = line.slice(19).trim(); - } + const [raw, dbsize, server] = await Promise.all([ + client.info('memory'), + client.dbSize(), + client.info('server'), + ]); + const fields = parseInfoSections([raw, server]); return { ...base, driver: 'redis', - used_memory_bytes: used, - used_memory_human: human, + version: fields.get('redis_version') || null, + server_uptime_s: fields.has('uptime_in_seconds') ? Number(fields.get('uptime_in_seconds')) || null : null, + used_memory_bytes: fields.has('used_memory') ? Number(fields.get('used_memory')) || null : null, + used_memory_human: fields.get('used_memory_human') || null, keys: Number(dbsize) || 0, }; } catch (e) { noteError('info', e); - return { ...base, driver: 'redis', used_memory_bytes: null, used_memory_human: null, keys: null }; + return { + ...base, + driver: 'redis', + version: null, + server_uptime_s: null, + used_memory_bytes: null, + used_memory_human: null, + keys: null, + }; } },