koishi-plugin-exporter
Version:
Koishi OpenMetrics Exporter
94 lines (93 loc) • 3.05 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.dau = void 0;
const koishi_1 = require("koishi");
const prom_client_1 = require("prom-client");
const common_1 = require("../common");
const dau = (ctx, config, register) => {
const dauBuffer = [];
ctx.model.extend('exporter_dau', {
user: {
type: 'unsigned',
nullable: false,
},
date: {
type: 'unsigned',
nullable: false,
},
count: {
type: 'unsigned',
nullable: false,
},
}, {
primary: ['user', 'date'],
unique: [['user', 'date']],
});
ctx.on('message-created', ({ platform, userId }) => dauBuffer.push({
platform,
userId,
}));
new prom_client_1.Gauge({
name: common_1.prefix + common_1.metricNames.dau,
help: 'Daily active user.',
registers: [register],
labelNames: ['instance_name'],
async collect() {
// Get current date
const dateString = (0, common_1.getDateString)(ctx);
const date = Number(dateString);
// Get all items from buffer
const items = dauBuffer.concat();
if (items.length) {
// Reset buffer
dauBuffer.length = 0;
// Get all user ids
const ids = await ctx.database.get('binding', {
$or: items.map((x) => ({
platform: [x.platform],
pid: [x.userId],
})),
}, ['aid']);
// Insert all user ids for current date
await ctx.database.upsert('exporter_dau', ids.map(({ aid }) => ({
user: aid,
date,
count: 0,
})));
}
// Get all records of current date
const dau = await ctx.database
.select('exporter_dau')
.where({
date: [date],
})
.execute((x) => koishi_1.$.count(x.user));
// Set DAU to length
this.set({
instance_name: config.name,
}, dau);
},
});
new prom_client_1.Gauge({
name: common_1.prefix + common_1.metricNames.dau_yesterday,
help: 'DAU yesterday.',
registers: [register],
labelNames: ['instance_name'],
async collect() {
// Get yesterday
const date = Number((0, common_1.yesterday)((0, common_1.getDateString)(ctx)));
// Get all records of yesterday
const dau = await ctx.database
.select('exporter_dau')
.where({
date: [date],
})
.execute((x) => koishi_1.$.count(x.user));
// Set DAU to length
this.set({
instance_name: config.name,
}, dau);
},
});
};
exports.dau = dau;