118 lines
2.8 KiB
JavaScript
118 lines
2.8 KiB
JavaScript
const { getRedisClient } = require("./redis/client")
|
|
const dealReportDb = require("../db/dealReport.db")
|
|
const {
|
|
VOTE_HASH_KEY,
|
|
COMMENT_LIKE_HASH_KEY,
|
|
COMMENT_HASH_KEY,
|
|
COMMENT_DELETE_HASH_KEY,
|
|
DEAL_UPDATE_HASH_KEY,
|
|
DEAL_CREATE_HASH_KEY,
|
|
DEAL_AI_REVIEW_HASH_KEY,
|
|
NOTIFICATION_HASH_KEY,
|
|
NOTIFICATION_READ_HASH_KEY,
|
|
DEAL_SAVE_HASH_KEY,
|
|
AUDIT_HASH_KEY,
|
|
USER_UPDATE_HASH_KEY,
|
|
USER_NOTE_HASH_KEY,
|
|
DEAL_REPORT_UPDATE_HASH_KEY,
|
|
CATEGORY_UPSERT_HASH_KEY,
|
|
SELLER_UPSERT_HASH_KEY,
|
|
SELLER_DOMAIN_UPSERT_HASH_KEY,
|
|
} = require("./redis/dbSync.service")
|
|
|
|
function createRedisClient() {
|
|
return getRedisClient()
|
|
}
|
|
|
|
function parseRedisInfo(raw = "") {
|
|
const info = {}
|
|
String(raw)
|
|
.split("\n")
|
|
.forEach((line) => {
|
|
if (!line || line.startsWith("#")) return
|
|
const idx = line.indexOf(":")
|
|
if (idx <= 0) return
|
|
const key = line.slice(0, idx)
|
|
const value = line.slice(idx + 1).trim()
|
|
info[key] = value
|
|
})
|
|
return info
|
|
}
|
|
|
|
async function getPendingDealCount(redis) {
|
|
try {
|
|
const result = await redis.call(
|
|
"FT.SEARCH",
|
|
"idx:data:deals",
|
|
"@status:{PENDING}",
|
|
"LIMIT",
|
|
0,
|
|
0
|
|
)
|
|
const total = Array.isArray(result) ? Number(result[0]) : null
|
|
return Number.isFinite(total) ? total : 0
|
|
} catch (err) {
|
|
return null
|
|
}
|
|
}
|
|
|
|
async function getQueueSizes(redis) {
|
|
const keys = [
|
|
VOTE_HASH_KEY,
|
|
COMMENT_LIKE_HASH_KEY,
|
|
COMMENT_HASH_KEY,
|
|
COMMENT_DELETE_HASH_KEY,
|
|
DEAL_UPDATE_HASH_KEY,
|
|
DEAL_CREATE_HASH_KEY,
|
|
DEAL_AI_REVIEW_HASH_KEY,
|
|
NOTIFICATION_HASH_KEY,
|
|
NOTIFICATION_READ_HASH_KEY,
|
|
DEAL_SAVE_HASH_KEY,
|
|
AUDIT_HASH_KEY,
|
|
USER_UPDATE_HASH_KEY,
|
|
USER_NOTE_HASH_KEY,
|
|
DEAL_REPORT_UPDATE_HASH_KEY,
|
|
CATEGORY_UPSERT_HASH_KEY,
|
|
SELLER_UPSERT_HASH_KEY,
|
|
SELLER_DOMAIN_UPSERT_HASH_KEY,
|
|
]
|
|
|
|
const pipeline = redis.pipeline()
|
|
keys.forEach((key) => pipeline.hlen(key))
|
|
const results = await pipeline.exec()
|
|
|
|
const sizes = {}
|
|
keys.forEach((key, idx) => {
|
|
const value = results?.[idx]?.[1]
|
|
sizes[key] = Number.isFinite(Number(value)) ? Number(value) : 0
|
|
})
|
|
return sizes
|
|
}
|
|
|
|
async function getAdminMetrics() {
|
|
const redis = createRedisClient()
|
|
try {
|
|
const [pendingDeals, queues, infoRaw, openReports] = await Promise.all([
|
|
getPendingDealCount(redis),
|
|
getQueueSizes(redis),
|
|
redis.info(),
|
|
dealReportDb.countDealReports({ status: "OPEN" }),
|
|
])
|
|
const info = parseRedisInfo(infoRaw)
|
|
|
|
return {
|
|
pendingDeals,
|
|
openReports,
|
|
redis: {
|
|
usedMemory: info.used_memory ?? null,
|
|
connectedClients: info.connected_clients ?? null,
|
|
keyspaceHits: info.keyspace_hits ?? null,
|
|
keyspaceMisses: info.keyspace_misses ?? null,
|
|
},
|
|
dbsyncQueues: queues,
|
|
}
|
|
} finally {}
|
|
}
|
|
|
|
module.exports = { getAdminMetrics }
|