feat(phase-2): workstream 7 — Prometheus + Grafana Monitoring
- Add prom-client 15; shared registry in src/metrics/registry.ts (7 metrics) - HTTP request counter + duration histogram via metricsMiddleware - DB query duration histogram wrapping pg Pool.query - Redis command duration histogram via typed instrumentRedisMethod wrapper - agentidp_tokens_issued_total in OAuth2Service - agentidp_agents_registered_total in AgentService - GET /metrics unauthenticated endpoint (Prometheus text format) - docker-compose.monitoring.yml overlay (Prometheus + Grafana) - Grafana auto-provisioned datasource + pre-built AgentIdP dashboard - docs/devops/operations.md monitoring section added - 36/36 unit tests passing, 100% coverage on new metrics code - Fix pre-existing unused import in tests/integration/agents.test.ts Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
79
src/metrics/registry.ts
Normal file
79
src/metrics/registry.ts
Normal file
@@ -0,0 +1,79 @@
|
||||
/**
|
||||
* Shared Prometheus metrics registry for SentryAgent.ai AgentIdP.
|
||||
* All 7 metric definitions live here. Import specific metrics in the files that use them.
|
||||
* This is the ONLY file that defines metrics — all other files import from here.
|
||||
*/
|
||||
|
||||
import { Registry, Counter, Histogram } from 'prom-client';
|
||||
|
||||
/** Shared registry — do NOT use the default global registry (conflicts with tests). */
|
||||
export const metricsRegistry = new Registry();
|
||||
|
||||
/**
|
||||
* Total number of OAuth 2.0 tokens successfully issued.
|
||||
* Labels: scope (space-separated scope string)
|
||||
*/
|
||||
export const tokensIssuedTotal = new Counter({
|
||||
name: 'agentidp_tokens_issued_total',
|
||||
help: 'Total number of OAuth 2.0 access tokens issued successfully.',
|
||||
labelNames: ['scope'] as const,
|
||||
registers: [metricsRegistry],
|
||||
});
|
||||
|
||||
/**
|
||||
* Total number of agents successfully registered.
|
||||
* Labels: deployment_env
|
||||
*/
|
||||
export const agentsRegisteredTotal = new Counter({
|
||||
name: 'agentidp_agents_registered_total',
|
||||
help: 'Total number of AI agents registered successfully.',
|
||||
labelNames: ['deployment_env'] as const,
|
||||
registers: [metricsRegistry],
|
||||
});
|
||||
|
||||
/**
|
||||
* Total HTTP requests received.
|
||||
* Labels: method, route (normalised path), status_code
|
||||
*/
|
||||
export const httpRequestsTotal = new Counter({
|
||||
name: 'agentidp_http_requests_total',
|
||||
help: 'Total number of HTTP requests received.',
|
||||
labelNames: ['method', 'route', 'status_code'] as const,
|
||||
registers: [metricsRegistry],
|
||||
});
|
||||
|
||||
/**
|
||||
* HTTP request duration in seconds.
|
||||
* Labels: method, route, status_code
|
||||
*/
|
||||
export const httpRequestDurationSeconds = new Histogram({
|
||||
name: 'agentidp_http_request_duration_seconds',
|
||||
help: 'HTTP request duration in seconds.',
|
||||
labelNames: ['method', 'route', 'status_code'] as const,
|
||||
buckets: [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5],
|
||||
registers: [metricsRegistry],
|
||||
});
|
||||
|
||||
/**
|
||||
* PostgreSQL query duration in seconds.
|
||||
* Labels: operation (query/connect)
|
||||
*/
|
||||
export const dbQueryDurationSeconds = new Histogram({
|
||||
name: 'agentidp_db_query_duration_seconds',
|
||||
help: 'PostgreSQL query duration in seconds.',
|
||||
labelNames: ['operation'] as const,
|
||||
buckets: [0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1],
|
||||
registers: [metricsRegistry],
|
||||
});
|
||||
|
||||
/**
|
||||
* Redis command duration in seconds.
|
||||
* Labels: command (get/set/incr/expire/ping/etc.)
|
||||
*/
|
||||
export const redisCommandDurationSeconds = new Histogram({
|
||||
name: 'agentidp_redis_command_duration_seconds',
|
||||
help: 'Redis command duration in seconds.',
|
||||
labelNames: ['command'] as const,
|
||||
buckets: [0.0005, 0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25],
|
||||
registers: [metricsRegistry],
|
||||
});
|
||||
Reference in New Issue
Block a user