add metrics to auth route
All checks were successful
Build and push image for doorman-homeassistant / docker (push) Successful in 33s
Build and push Doorman UI / API / docker (push) Successful in 1m29s
Build and push image for doorman-homeassistant / deploy-gitainer (push) Successful in 4s

This commit is contained in:
Martin Dimitrov 2025-02-02 12:33:31 -08:00
parent c424476f55
commit dd2d57c794
4 changed files with 40 additions and 10 deletions

View File

@ -8,3 +8,9 @@ AWS_SECRET_ACCESS_KEY=
# discord notifs
DISCORD_BOT_TOKEN=
# metrics
PUSHGATEWAY_URL=https://metrics.chromart.cc
STAGE=prod
PUSHGATEWAY_USER=doorman
PUSHGATEWAY_PW=doormanmetrics

View File

@ -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<TwilioContext, AuthRequest> = async function(context, event, callback) {
export const handler: ServerlessFunctionSignature<TwilioContext, AuthRequest> = 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<TwilioContext, AuthRequest> =
const config: DoorConfig = ddbItemToJSON<DoorConfig>(ddbConfig);
if (!config) {
getMetricFromRegistry<Counter>(metricsRegistry, AuthMetrics.DOOR_CONFIG_NOT_FOUND).inc({ door }, 1);
response.setStatusCode(404);
return callback(null, response);
}
@ -62,6 +63,9 @@ export const handler: ServerlessFunctionSignature<TwilioContext, AuthRequest> =
return callback(null, response);
}
getMetricFromRegistry<Counter>(metricsRegistry, AuthMetrics.AUTH_METHOD)
.inc({ method }, 1);
const fingerprint = {
method,
userAgent: event.request.headers['user-agent'],
@ -109,4 +113,4 @@ export const handler: ServerlessFunctionSignature<TwilioContext, AuthRequest> =
await client.destroy();
return callback(null, response);
};
});

View File

@ -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"],
}));
}

View File

@ -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;