1
This commit is contained in:
126
api/service/biz_api_stats_service.js
Normal file
126
api/service/biz_api_stats_service.js
Normal file
@@ -0,0 +1,126 @@
|
||||
const baseModel = require("../../middleware/baseModel");
|
||||
const { op } = baseModel;
|
||||
|
||||
/**
|
||||
* 构建日期范围 where 条件
|
||||
*/
|
||||
function buildDateWhere(start_date, end_date) {
|
||||
const where = {};
|
||||
if (start_date && end_date) {
|
||||
where.call_date = { [op.between]: [start_date, end_date] };
|
||||
} else if (start_date) {
|
||||
where.call_date = { [op.gte]: start_date };
|
||||
} else if (end_date) {
|
||||
where.call_date = { [op.lte]: end_date };
|
||||
}
|
||||
return where;
|
||||
}
|
||||
|
||||
/**
|
||||
* 按用户统计调用量(按接口路径分组)
|
||||
* @param {number} user_id
|
||||
* @param {string} [start_date] - YYYY-MM-DD
|
||||
* @param {string} [end_date] - YYYY-MM-DD
|
||||
*/
|
||||
async function getStatsByUser(user_id, start_date, end_date) {
|
||||
const where = { user_id, ...buildDateWhere(start_date, end_date) };
|
||||
const rows = await baseModel.biz_api_call_log.findAll({
|
||||
attributes: [
|
||||
"api_path",
|
||||
[baseModel.Sequelize.fn("COUNT", baseModel.Sequelize.col("id")), "call_count"],
|
||||
[baseModel.Sequelize.fn("AVG", baseModel.Sequelize.col("response_time")), "avg_response_time"],
|
||||
],
|
||||
where,
|
||||
group: ["api_path"],
|
||||
order: [[baseModel.Sequelize.literal("call_count"), "DESC"]],
|
||||
raw: true,
|
||||
});
|
||||
|
||||
const total = rows.reduce((s, r) => s + Number(r.call_count), 0);
|
||||
return { total, rows };
|
||||
}
|
||||
|
||||
/**
|
||||
* 按接口路径统计调用量(按用户分组)
|
||||
* @param {string} api_path
|
||||
* @param {string} [start_date]
|
||||
* @param {string} [end_date]
|
||||
*/
|
||||
async function getStatsByApi(api_path, start_date, end_date) {
|
||||
const where = { api_path, ...buildDateWhere(start_date, end_date) };
|
||||
const rows = await baseModel.biz_api_call_log.findAll({
|
||||
attributes: [
|
||||
"user_id",
|
||||
[baseModel.Sequelize.fn("COUNT", baseModel.Sequelize.col("id")), "call_count"],
|
||||
[baseModel.Sequelize.fn("AVG", baseModel.Sequelize.col("response_time")), "avg_response_time"],
|
||||
],
|
||||
where,
|
||||
group: ["user_id"],
|
||||
order: [[baseModel.Sequelize.literal("call_count"), "DESC"]],
|
||||
raw: true,
|
||||
});
|
||||
|
||||
const total = rows.reduce((s, r) => s + Number(r.call_count), 0);
|
||||
return { total, rows };
|
||||
}
|
||||
|
||||
/**
|
||||
* 综合统计面板:总调用量、按天趋势、Top 接口、Top 用户
|
||||
* @param {string} [start_date]
|
||||
* @param {string} [end_date]
|
||||
* @param {number} [top_limit=10]
|
||||
*/
|
||||
async function getSummary(start_date, end_date, top_limit = 10) {
|
||||
const dateWhere = buildDateWhere(start_date, end_date);
|
||||
const Seq = baseModel.Sequelize;
|
||||
|
||||
// 总调用量
|
||||
const totalResult = await baseModel.biz_api_call_log.count({ where: dateWhere });
|
||||
|
||||
// 按天趋势
|
||||
const daily_trend = await baseModel.biz_api_call_log.findAll({
|
||||
attributes: [
|
||||
"call_date",
|
||||
[Seq.fn("COUNT", Seq.col("id")), "call_count"],
|
||||
],
|
||||
where: dateWhere,
|
||||
group: ["call_date"],
|
||||
order: [["call_date", "ASC"]],
|
||||
raw: true,
|
||||
});
|
||||
|
||||
// Top 接口
|
||||
const top_apis = await baseModel.biz_api_call_log.findAll({
|
||||
attributes: [
|
||||
"api_path",
|
||||
[Seq.fn("COUNT", Seq.col("id")), "call_count"],
|
||||
],
|
||||
where: dateWhere,
|
||||
group: ["api_path"],
|
||||
order: [[Seq.literal("call_count"), "DESC"]],
|
||||
limit: top_limit,
|
||||
raw: true,
|
||||
});
|
||||
|
||||
// Top 用户
|
||||
const top_users = await baseModel.biz_api_call_log.findAll({
|
||||
attributes: [
|
||||
"user_id",
|
||||
[Seq.fn("COUNT", Seq.col("id")), "call_count"],
|
||||
],
|
||||
where: dateWhere,
|
||||
group: ["user_id"],
|
||||
order: [[Seq.literal("call_count"), "DESC"]],
|
||||
limit: top_limit,
|
||||
raw: true,
|
||||
});
|
||||
|
||||
return {
|
||||
total_calls: totalResult,
|
||||
daily_trend,
|
||||
top_apis,
|
||||
top_users,
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = { getStatsByUser, getStatsByApi, getSummary };
|
||||
Reference in New Issue
Block a user