Add metrics

This commit is contained in:
2025-09-15 00:13:57 +02:00
parent be5b042380
commit 33c7e2335f
8 changed files with 108 additions and 3 deletions
+4
View File
@@ -1,6 +1,7 @@
import { verify } from 'argon2';
import { useValidatedBody, z } from 'h3-zod';
import prisma from '~~/lib/prisma';
import { logins } from '~~/server/metrics';
export default defineEventHandler(async (event) => {
const { email, password } = await useValidatedBody(
@@ -25,10 +26,12 @@ export default defineEventHandler(async (event) => {
});
if (!user || user.password.length <= 0) {
console.warn(`Failed login attempted: Unknown email: ${email}`);
logins.inc({ success: 'false' });
throw createError({ status: 404, statusText: 'Not found!' });
}
if (!(await verify(user.password, password))) {
console.warn(`Failed login attempted: Wrong password: ${email}`);
logins.inc({ success: 'false' });
throw createError({ status: 404, statusText: 'Not found!' });
}
@@ -41,6 +44,7 @@ export default defineEventHandler(async (event) => {
},
loggedInAt: new Date()
});
logins.inc({ success: 'true' });
return { success: true, user: { id: user.id } };
});
+19
View File
@@ -3,6 +3,11 @@ import { randomUUID } from 'node:crypto';
import { z } from 'zod';
import prisma from '~~/lib/prisma';
import { minioClient, s3Bucket, s3Host } from '~~/lib/s3';
import {
answerChanged,
answerFinalized,
imageUploaded
} from '~~/server/metrics';
export default defineEventHandler(async (event) => {
const { questId } = await useValidatedParams(
@@ -21,6 +26,7 @@ export default defineEventHandler(async (event) => {
},
select: {
id: true,
huntId: true,
hunt: {
select: {
teams: {
@@ -125,6 +131,9 @@ export default defineEventHandler(async (event) => {
undefined;
if (data.image) {
imageUploaded.inc({
hunt: quest.huntId
});
const uuid = randomUUID();
await minioClient.putObject(
s3Bucket,
@@ -215,5 +224,15 @@ export default defineEventHandler(async (event) => {
}
}
answerChanged.inc({
hunt: quest.huntId
});
if (data.final) {
answerFinalized.inc({
hunt: quest.huntId
});
}
return { ok: true };
});
+25
View File
@@ -0,0 +1,25 @@
import { Counter } from 'prom-client';
export const imageUploaded = new Counter({
name: 'image_uploaded_total',
help: 'Images uploaded',
labelNames: ['hunt']
});
export const answerFinalized = new Counter({
name: 'answer_finalized_total',
help: 'Answer got finalized',
labelNames: ['hunt']
});
export const answerChanged = new Counter({
name: 'answer_changed_total',
help: 'Answer got uploaded or changed',
labelNames: ['hunt']
});
export const logins = new Counter({
name: 'login_total',
help: 'Logins',
labelNames: ['success']
});