diff --git a/packages/happy-server/sources/app/api/routes/v3SessionRoutes.ts b/packages/happy-server/sources/app/api/routes/v3SessionRoutes.ts index 1a013da6ec..08cdd804a1 100644 --- a/packages/happy-server/sources/app/api/routes/v3SessionRoutes.ts +++ b/packages/happy-server/sources/app/api/routes/v3SessionRoutes.ts @@ -1,4 +1,5 @@ import { buildNewMessageUpdate, eventRouter } from "@/app/events/eventRouter"; +import { messageEncryptedBytesHistogram, messageBatchSizeHistogram } from "@/app/monitoring/metrics2"; import { db } from "@/storage/db"; import { allocateSessionSeqBatch, allocateUserSeq } from "@/storage/seq"; import { randomKeyNaked } from "@/utils/randomKeyNaked"; @@ -112,6 +113,12 @@ export function v3SessionRoutes(app: Fastify) { const { sessionId } = request.params; const { messages } = request.body; + // Record message size metrics for compression baseline + messageBatchSizeHistogram.observe(messages.length); + for (const msg of messages) { + messageEncryptedBytesHistogram.observe(Buffer.byteLength(msg.content, 'utf8')); + } + const session = await db.session.findFirst({ where: { id: sessionId, diff --git a/packages/happy-server/sources/app/monitoring/metrics2.ts b/packages/happy-server/sources/app/monitoring/metrics2.ts index 75ac5cb093..3f11e05d59 100644 --- a/packages/happy-server/sources/app/monitoring/metrics2.ts +++ b/packages/happy-server/sources/app/monitoring/metrics2.ts @@ -60,6 +60,21 @@ export const httpRequestDurationHistogram = new Histogram({ registers: [register] }); +// Message size metrics (for compression baseline) +export const messageEncryptedBytesHistogram = new Histogram({ + name: 'happy_message_encrypted_bytes', + help: 'Size of encrypted message content in bytes (base64-encoded ciphertext)', + buckets: [64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144], + registers: [register] +}); + +export const messageBatchSizeHistogram = new Histogram({ + name: 'happy_message_batch_count', + help: 'Number of messages per batch POST', + buckets: [1, 2, 3, 5, 10, 20, 50, 100], + registers: [register] +}); + // Database count metrics export const databaseRecordCountGauge = new Gauge({ name: 'database_records_total',