From dd2d57c7941b0646db8fc82f77909b4c25f8e6a7 Mon Sep 17 00:00:00 2001 From: Martin Dimitrov Date: Sun, 2 Feb 2025 12:33:31 -0800 Subject: [PATCH] add metrics to auth route --- packages/doorman-api/.env.example | 8 +++++++- .../src/functions/api/door/auth.ts | 18 ++++++++++------- .../doorman-api/src/metrics/AuthMetrics.ts | 20 +++++++++++++++++++ .../doorman-api/src/types/TwilioContext.ts | 4 ++-- 4 files changed, 40 insertions(+), 10 deletions(-) create mode 100644 packages/doorman-api/src/metrics/AuthMetrics.ts diff --git a/packages/doorman-api/.env.example b/packages/doorman-api/.env.example index f4659f8..224f279 100644 --- a/packages/doorman-api/.env.example +++ b/packages/doorman-api/.env.example @@ -7,4 +7,10 @@ AWS_ACCESS_KEY= AWS_SECRET_ACCESS_KEY= # discord notifs -DISCORD_BOT_TOKEN= \ No newline at end of file +DISCORD_BOT_TOKEN= + +# metrics +PUSHGATEWAY_URL=https://metrics.chromart.cc +STAGE=prod +PUSHGATEWAY_USER=doorman +PUSHGATEWAY_PW=doormanmetrics \ No newline at end of file diff --git a/packages/doorman-api/src/functions/api/door/auth.ts b/packages/doorman-api/src/functions/api/door/auth.ts index 2ac80c8..21653c9 100644 --- a/packages/doorman-api/src/functions/api/door/auth.ts +++ b/packages/doorman-api/src/functions/api/door/auth.ts @@ -4,12 +4,15 @@ import { ServerlessEventObject, ServerlessFunctionSignature } from "@twilio-labs/serverless-runtime-types/types"; import { TwilioContext } from "../../../types/TwilioContext"; -import { shouldBlockRequest, UserAgentHeader } from "../../../utils/blockUserAgent"; +import { UserAgentHeader } from "../../../utils/blockUserAgent"; import { clearLockStatusCommand, createDDBClient, ddbItemToJSON, getDoorConfigCommand, getLockStatusCommand, isLockOpen, setLockStatusCommand } from "../../../utils/ddb"; import { DoorConfig } from "../../../types/DoorConfig"; import { AuthMethod } from "../../../types/AuthMethod"; import { Lock } from "../../../types/Lock"; import { DoorStatus } from "../../../types/DoorStatus"; +import { getMetricFromRegistry, withMetrics } from "../../../common/DoormanHandler"; +import { AuthMetrics, registerMetrics } from "../../../metrics/AuthMetrics"; +import { Counter } from "prom-client"; export interface AuthRequest extends ServerlessEventObject<{}, UserAgentHeader> { door?: string; @@ -18,13 +21,10 @@ export interface AuthRequest extends ServerlessEventObject<{}, UserAgentHeader> timeout?: string; } -export const handler: ServerlessFunctionSignature = async function(context, event, callback) { +export const handler: ServerlessFunctionSignature = withMetrics('auth', async (context, event, callback, metricsRegistry) => { const response = new Twilio.Response(); - if (shouldBlockRequest(event)) { - response.setStatusCode(200); - return callback(null, response); - } + registerMetrics(metricsRegistry); let door = event.door; let pin = event.key; @@ -40,6 +40,7 @@ export const handler: ServerlessFunctionSignature = const config: DoorConfig = ddbItemToJSON(ddbConfig); if (!config) { + getMetricFromRegistry(metricsRegistry, AuthMetrics.DOOR_CONFIG_NOT_FOUND).inc({ door }, 1); response.setStatusCode(404); return callback(null, response); } @@ -62,6 +63,9 @@ export const handler: ServerlessFunctionSignature = return callback(null, response); } + getMetricFromRegistry(metricsRegistry, AuthMetrics.AUTH_METHOD) + .inc({ method }, 1); + const fingerprint = { method, userAgent: event.request.headers['user-agent'], @@ -109,4 +113,4 @@ export const handler: ServerlessFunctionSignature = await client.destroy(); return callback(null, response); -}; +}); diff --git a/packages/doorman-api/src/metrics/AuthMetrics.ts b/packages/doorman-api/src/metrics/AuthMetrics.ts new file mode 100644 index 0000000..0728bde --- /dev/null +++ b/packages/doorman-api/src/metrics/AuthMetrics.ts @@ -0,0 +1,20 @@ +import { Counter, Registry, Summary } from "prom-client"; + +export enum AuthMetrics { + DOOR_CONFIG_NOT_FOUND = "DoorConfigNotFound", + AUTH_METHOD = "AuthMethod", +} + +export const registerMetrics = (metricsRegistry: Registry) => { + metricsRegistry.registerMetric(new Counter({ + name: AuthMetrics.DOOR_CONFIG_NOT_FOUND, + help: "Auth was attempted on a door that does not exist", + labelNames: ["door"], + })); + + metricsRegistry.registerMetric(new Counter({ + name: AuthMetrics.AUTH_METHOD, + help: "Which auth method was used", + labelNames: ["method"], + })); +} diff --git a/packages/doorman-api/src/types/TwilioContext.ts b/packages/doorman-api/src/types/TwilioContext.ts index fa427af..c5a7ec6 100644 --- a/packages/doorman-api/src/types/TwilioContext.ts +++ b/packages/doorman-api/src/types/TwilioContext.ts @@ -1,6 +1,6 @@ -import { EnvironmentVariables } from "@twilio-labs/serverless-runtime-types/types"; +import { DoormanLambdaContext } from "../common/DoormanHandlerContext"; -export interface TwilioContext extends EnvironmentVariables { +export interface TwilioContext extends DoormanLambdaContext { AWS_ACCESS_KEY: string; AWS_SECRET_ACCESS_KEY: string; DISCORD_BOT_TOKEN: string;