mirror of
https://github.com/Litlyx/litlyx
synced 2025-12-11 16:28:37 +01:00
new selfhosted version
This commit is contained in:
89
dashboard/server/api/admin/shard/info.ts
Normal file
89
dashboard/server/api/admin/shard/info.ts
Normal file
@@ -0,0 +1,89 @@
|
||||
|
||||
|
||||
import mongoose from "mongoose";
|
||||
|
||||
|
||||
async function executeAggregation(uuid: string) {
|
||||
const aggregation = [
|
||||
{ $match: { uuid: new mongoose.Types.UUID(uuid) } },
|
||||
{ $group: { _id: "$shard", chunkCount: { $sum: 1 } } },
|
||||
{
|
||||
$group: {
|
||||
_id: null,
|
||||
total: { $sum: "$chunkCount" },
|
||||
shards: { $push: { shard: "$_id", count: "$chunkCount" } }
|
||||
}
|
||||
},
|
||||
{ $unwind: "$shards" },
|
||||
{
|
||||
$project: {
|
||||
_id: 0,
|
||||
shard: "$shards.shard",
|
||||
chunkCount: "$shards.count",
|
||||
percent: { $round: [{ $multiply: [{ $divide: ["$shards.count", "$total"] }, 100] }, 2] }
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
const result = await mongoose.connection.useDb('config').collection('chunks').aggregate(aggregation).toArray();
|
||||
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
async function getAllCollections() {
|
||||
const result = await mongoose.connection.useDb('config').collection('collections').find({}).toArray();
|
||||
return result.filter((e: any) => e._id.startsWith('SimpleMetrics'));
|
||||
}
|
||||
|
||||
async function getOperations() {
|
||||
try {
|
||||
|
||||
const db = mongoose.connection.db?.admin();
|
||||
if (!db) return [];
|
||||
const result = await db.command({
|
||||
aggregate: 1,
|
||||
pipeline: [
|
||||
{ $currentOp: { allUsers: true, localOps: false } },
|
||||
{ $match: { type: 'op', "originatingCommand.reshardCollection": { $regex: "^SimpleMetrics.*" } } }
|
||||
],
|
||||
cursor: {}
|
||||
});
|
||||
|
||||
return result.cursor.firstBatch
|
||||
} catch (ex) {
|
||||
console.error('Error fetching current ops:', ex);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
async function getAdvancedInfo(collection: string) {
|
||||
try {
|
||||
const db = mongoose.connection.useDb('SimpleMetrics');
|
||||
const nativeDb = db.db;
|
||||
const stats = await nativeDb?.command({ collStats: collection });
|
||||
return stats;
|
||||
} catch (ex) {
|
||||
console.error("Error getting index info:", ex);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
export default defineEventHandler(async event => {
|
||||
const ctx = await getRequestContext(event, 'admin');
|
||||
|
||||
const collections = await getAllCollections();
|
||||
|
||||
const aggregations = await Promise.all(collections.map(async e => {
|
||||
const collName = e._id.toString().split('.')[1];
|
||||
const chunks = await executeAggregation(e.uuid.toString());
|
||||
const advanced = await getAdvancedInfo(collName);
|
||||
return { info: e, advanced, chunks }
|
||||
}))
|
||||
|
||||
const operations = await getOperations();
|
||||
|
||||
return { aggregations, operations };
|
||||
|
||||
|
||||
});
|
||||
Reference in New Issue
Block a user