mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-09-22 13:39:35 +00:00
mics: add api latency metric
This commit is contained in:
@@ -2,47 +2,50 @@ import { requestContext } from "@fastify/request-context";
|
|||||||
import opentelemetry from "@opentelemetry/api";
|
import opentelemetry from "@opentelemetry/api";
|
||||||
import fp from "fastify-plugin";
|
import fp from "fastify-plugin";
|
||||||
|
|
||||||
|
const apiMeter = opentelemetry.metrics.getMeter("API");
|
||||||
|
|
||||||
|
const latencyHistogram = apiMeter.createHistogram("API_latency", {
|
||||||
|
unit: "ms"
|
||||||
|
});
|
||||||
|
|
||||||
|
const infisicalMeter = opentelemetry.metrics.getMeter("Infisical");
|
||||||
|
|
||||||
|
const requestCounter = infisicalMeter.createCounter("infisical.http.server.request.count", {
|
||||||
|
description: "Total number of API requests to Infisical (covers both human users and machine identities)",
|
||||||
|
unit: "{request}"
|
||||||
|
});
|
||||||
|
|
||||||
|
const requestDurationHistogram = infisicalMeter.createHistogram("infisical.http.server.request.duration", {
|
||||||
|
description: "API request latency",
|
||||||
|
unit: "s"
|
||||||
|
});
|
||||||
|
|
||||||
export const apiMetrics = fp(async (fastify) => {
|
export const apiMetrics = fp(async (fastify) => {
|
||||||
const apiMeter = opentelemetry.metrics.getMeter("API");
|
|
||||||
|
|
||||||
const latencyHistogram = apiMeter.createHistogram("API_latency", {
|
|
||||||
unit: "ms"
|
|
||||||
});
|
|
||||||
|
|
||||||
const infisicalMeter = opentelemetry.metrics.getMeter("Infisical");
|
|
||||||
|
|
||||||
const requestCounter = infisicalMeter.createCounter("infisical.http.server.request.count", {
|
|
||||||
description: "Total number of API requests to Infisical (covers both human users and machine identities)",
|
|
||||||
unit: "{request}"
|
|
||||||
});
|
|
||||||
|
|
||||||
fastify.addHook("onResponse", async (request, reply) => {
|
fastify.addHook("onResponse", async (request, reply) => {
|
||||||
const { method } = request;
|
const { method } = request;
|
||||||
const route = request.routerPath;
|
const route = request.routerPath;
|
||||||
const { statusCode } = reply;
|
const { statusCode } = reply;
|
||||||
|
|
||||||
// Record latency
|
|
||||||
latencyHistogram.record(reply.elapsedTime, {
|
latencyHistogram.record(reply.elapsedTime, {
|
||||||
route,
|
route,
|
||||||
method,
|
method,
|
||||||
statusCode
|
statusCode
|
||||||
});
|
});
|
||||||
|
|
||||||
// Get context data
|
|
||||||
const orgId = requestContext.get("orgId");
|
const orgId = requestContext.get("orgId");
|
||||||
const orgName = requestContext.get("orgName");
|
const orgName = requestContext.get("orgName");
|
||||||
const userAuthInfo = requestContext.get("userAuthInfo");
|
const userAuthInfo = requestContext.get("userAuthInfo");
|
||||||
const identityAuthInfo = requestContext.get("identityAuthInfo");
|
const identityAuthInfo = requestContext.get("identityAuthInfo");
|
||||||
const projectDetails = requestContext.get("projectDetails");
|
const projectDetails = requestContext.get("projectDetails");
|
||||||
|
const userAgent = requestContext.get("userAgent");
|
||||||
|
const ip = requestContext.get("ip");
|
||||||
|
|
||||||
// Build attributes object
|
|
||||||
const attributes: Record<string, string | number> = {
|
const attributes: Record<string, string | number> = {
|
||||||
"http.request.method": method,
|
"http.request.method": method,
|
||||||
"http.route": route,
|
"http.route": route,
|
||||||
"http.response.status_code": statusCode
|
"http.response.status_code": statusCode
|
||||||
};
|
};
|
||||||
|
|
||||||
// Add organization info
|
|
||||||
if (orgId) {
|
if (orgId) {
|
||||||
attributes["infisical.organization.id"] = orgId;
|
attributes["infisical.organization.id"] = orgId;
|
||||||
}
|
}
|
||||||
@@ -50,7 +53,6 @@ export const apiMetrics = fp(async (fastify) => {
|
|||||||
attributes["infisical.organization.name"] = orgName;
|
attributes["infisical.organization.name"] = orgName;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add user info (for human users)
|
|
||||||
if (userAuthInfo) {
|
if (userAuthInfo) {
|
||||||
if (userAuthInfo.userId) {
|
if (userAuthInfo.userId) {
|
||||||
attributes["infisical.user.id"] = userAuthInfo.userId;
|
attributes["infisical.user.id"] = userAuthInfo.userId;
|
||||||
@@ -60,7 +62,6 @@ export const apiMetrics = fp(async (fastify) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add identity info (for machine identities)
|
|
||||||
if (identityAuthInfo) {
|
if (identityAuthInfo) {
|
||||||
if (identityAuthInfo.identityId) {
|
if (identityAuthInfo.identityId) {
|
||||||
attributes["infisical.identity.id"] = identityAuthInfo.identityId;
|
attributes["infisical.identity.id"] = identityAuthInfo.identityId;
|
||||||
@@ -73,7 +74,6 @@ export const apiMetrics = fp(async (fastify) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add project info
|
|
||||||
if (projectDetails) {
|
if (projectDetails) {
|
||||||
if (projectDetails.id) {
|
if (projectDetails.id) {
|
||||||
attributes["infisical.project.id"] = projectDetails.id;
|
attributes["infisical.project.id"] = projectDetails.id;
|
||||||
@@ -83,17 +83,15 @@ export const apiMetrics = fp(async (fastify) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add user agent
|
|
||||||
const userAgent = request.headers["user-agent"];
|
|
||||||
if (userAgent) {
|
if (userAgent) {
|
||||||
attributes["user_agent.original"] = userAgent;
|
attributes["user_agent.original"] = userAgent;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add client IP address
|
if (ip) {
|
||||||
if (request.realIp) {
|
attributes["client.address"] = ip;
|
||||||
attributes["client.address"] = request.realIp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
requestCounter.add(1, attributes);
|
requestCounter.add(1, attributes);
|
||||||
|
requestDurationHistogram.record(reply.elapsedTime / 1000, attributes);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user