gitdataai/libs/observability/src/business_metrics.rs

294 lines
9.8 KiB
Rust

//! Business-level metrics for platform operations.
//!
//! Provides `metrics::counter!` and `metrics::gauge!` calls for all
//! business events (projects, issues, PRs, rooms, repos, billing).
//! Counter names are registered in `install_recorder()` so they appear
//! in Prometheus exposition format.
//!
//! Service layer code should call `incr!()` after successful operations.
/// Increment a business counter by 1.
/// Calls `metrics::counter!` from within the observability crate so
/// calling crates don't need `metrics` as a direct dependency.
#[macro_export]
macro_rules! incr {
($name:expr) => {
$crate::increment_business_counter($name)
};
}
/// Function wrapper so the `metrics::counter!` macro is only invoked
/// inside the observability crate (which depends on `metrics`).
pub fn increment_business_counter(name: &'static str) {
metrics::counter!(name);
}
// ── Counter names (constants) ──────────────────────────────────────────────────
// Project
pub const PROJECTS_CREATED_TOTAL: &str = "projects_created_total";
pub const PROJECTS_DELETED_TOTAL: &str = "projects_deleted_total";
pub const PROJECT_MEMBERS_ADDED_TOTAL: &str = "project_members_added_total";
pub const PROJECT_MEMBERS_REMOVED_TOTAL: &str = "project_members_removed_total";
pub const PROJECT_MEMBERS_ROLE_CHANGED_TOTAL: &str = "project_members_role_changed_total";
pub const PROJECT_LIKES_TOTAL: &str = "project_likes_total";
pub const PROJECT_UNLIKES_TOTAL: &str = "project_unlikes_total";
pub const PROJECT_WATCHES_TOTAL: &str = "project_watches_total";
pub const PROJECT_UNWATCHES_TOTAL: &str = "project_unwatches_total";
// Issue
pub const ISSUES_OPENED_TOTAL: &str = "issues_opened_total";
pub const ISSUES_CLOSED_TOTAL: &str = "issues_closed_total";
pub const ISSUES_REOPENED_TOTAL: &str = "issues_reopened_total";
pub const ISSUES_DELETED_TOTAL: &str = "issues_deleted_total";
pub const ISSUES_UPDATED_TOTAL: &str = "issues_updated_total";
pub const ISSUE_COMMENTS_CREATED_TOTAL: &str = "issue_comments_created_total";
pub const ISSUE_COMMENTS_DELETED_TOTAL: &str = "issue_comments_deleted_total";
// Pull Request
pub const PRS_OPENED_TOTAL: &str = "prs_opened_total";
pub const PRS_MERGED_TOTAL: &str = "prs_merged_total";
pub const PRS_CLOSED_TOTAL: &str = "prs_closed_total";
pub const PRS_UPDATED_TOTAL: &str = "prs_updated_total";
pub const PR_REVIEWS_SUBMITTED_TOTAL: &str = "pr_reviews_submitted_total";
pub const PR_REVIEW_COMMENTS_TOTAL: &str = "pr_review_comments_total";
// Room
pub const ROOMS_CREATED_TOTAL: &str = "rooms_created_total";
pub const ROOMS_DELETED_TOTAL: &str = "rooms_deleted_total";
pub const ROOMS_UPDATED_TOTAL: &str = "rooms_updated_total";
pub const ROOM_MESSAGES_SENT_TOTAL: &str = "room_messages_sent_total";
pub const ROOM_MESSAGES_AI_TOTAL: &str = "room_messages_ai_total";
pub const ROOM_THREADS_CREATED_TOTAL: &str = "room_threads_created_total";
// Repo / Git
pub const REPOS_CREATED_TOTAL: &str = "repos_created_total";
pub const GIT_COMMITS_PUSHED_TOTAL: &str = "git_commits_pushed_total";
pub const GIT_BRANCHES_CREATED_TOTAL: &str = "git_branches_created_total";
pub const GIT_BRANCHES_DELETED_TOTAL: &str = "git_branches_deleted_total";
pub const GIT_TAGS_CREATED_TOTAL: &str = "git_tags_created_total";
pub const GIT_TAGS_DELETED_TOTAL: &str = "git_tags_deleted_total";
pub const GIT_CLONES_TOTAL: &str = "git_clones_total";
// Billing
pub const BILLING_CREDITS_USED_TOTAL: &str = "billing_credits_used_total";
pub const BILLING_ERRORS_TOTAL: &str = "billing_errors_total";
pub const BILLING_CREDITS_ADDED_TOTAL: &str = "billing_credits_added_total";
// AI (supplements existing ai_* counters)
pub const AI_ROOM_CALLS_TOTAL: &str = "ai_room_calls_total";
pub const AI_CHAT_CONVERSATIONS_CREATED: &str = "ai_chat_conversations_created_total";
pub const AI_CHAT_MESSAGES_SENT: &str = "ai_chat_messages_sent_total";
// ── Gauge names ─────────────────────────────────────────────────────────────────
pub const ACTIVE_CONNECTIONS: &str = "active_connections";
pub const ACTIVE_ROOM_PARTICIPANTS: &str = "active_room_participants";
/// Register all business metric descriptions.
/// Called from `install_recorder()` in `prometheus_exporter.rs`.
pub fn describe_business_metrics() {
// Project
metrics::describe_counter!(
PROJECTS_CREATED_TOTAL,
metrics::Unit::Count,
"Projects created"
);
metrics::describe_counter!(
PROJECTS_DELETED_TOTAL,
metrics::Unit::Count,
"Projects deleted"
);
metrics::describe_counter!(
PROJECT_MEMBERS_ADDED_TOTAL,
metrics::Unit::Count,
"Project members added"
);
metrics::describe_counter!(
PROJECT_MEMBERS_REMOVED_TOTAL,
metrics::Unit::Count,
"Project members removed"
);
metrics::describe_counter!(
PROJECT_MEMBERS_ROLE_CHANGED_TOTAL,
metrics::Unit::Count,
"Project member role changes"
);
metrics::describe_counter!(PROJECT_LIKES_TOTAL, metrics::Unit::Count, "Project likes");
metrics::describe_counter!(
PROJECT_UNLIKES_TOTAL,
metrics::Unit::Count,
"Project unlikes"
);
metrics::describe_counter!(
PROJECT_WATCHES_TOTAL,
metrics::Unit::Count,
"Project watches"
);
metrics::describe_counter!(
PROJECT_UNWATCHES_TOTAL,
metrics::Unit::Count,
"Project unwatches"
);
// Issue
metrics::describe_counter!(ISSUES_OPENED_TOTAL, metrics::Unit::Count, "Issues opened");
metrics::describe_counter!(ISSUES_CLOSED_TOTAL, metrics::Unit::Count, "Issues closed");
metrics::describe_counter!(
ISSUES_REOPENED_TOTAL,
metrics::Unit::Count,
"Issues reopened"
);
metrics::describe_counter!(ISSUES_DELETED_TOTAL, metrics::Unit::Count, "Issues deleted");
metrics::describe_counter!(ISSUES_UPDATED_TOTAL, metrics::Unit::Count, "Issues updated");
metrics::describe_counter!(
ISSUE_COMMENTS_CREATED_TOTAL,
metrics::Unit::Count,
"Issue comments created"
);
metrics::describe_counter!(
ISSUE_COMMENTS_DELETED_TOTAL,
metrics::Unit::Count,
"Issue comments deleted"
);
// Pull Request
metrics::describe_counter!(
PRS_OPENED_TOTAL,
metrics::Unit::Count,
"Pull requests opened"
);
metrics::describe_counter!(
PRS_MERGED_TOTAL,
metrics::Unit::Count,
"Pull requests merged"
);
metrics::describe_counter!(
PRS_CLOSED_TOTAL,
metrics::Unit::Count,
"Pull requests closed (without merge)"
);
metrics::describe_counter!(
PRS_UPDATED_TOTAL,
metrics::Unit::Count,
"Pull requests updated"
);
metrics::describe_counter!(
PR_REVIEWS_SUBMITTED_TOTAL,
metrics::Unit::Count,
"PR reviews submitted"
);
metrics::describe_counter!(
PR_REVIEW_COMMENTS_TOTAL,
metrics::Unit::Count,
"PR review comments"
);
// Room
metrics::describe_counter!(
ROOMS_CREATED_TOTAL,
metrics::Unit::Count,
"Chat rooms created"
);
metrics::describe_counter!(
ROOMS_DELETED_TOTAL,
metrics::Unit::Count,
"Chat rooms deleted"
);
metrics::describe_counter!(
ROOMS_UPDATED_TOTAL,
metrics::Unit::Count,
"Chat rooms updated"
);
metrics::describe_counter!(
ROOM_MESSAGES_SENT_TOTAL,
metrics::Unit::Count,
"Room messages sent (human)"
);
metrics::describe_counter!(
ROOM_MESSAGES_AI_TOTAL,
metrics::Unit::Count,
"Room messages sent (AI)"
);
metrics::describe_counter!(
ROOM_THREADS_CREATED_TOTAL,
metrics::Unit::Count,
"Room threads created"
);
// Repo / Git
metrics::describe_counter!(REPOS_CREATED_TOTAL, metrics::Unit::Count, "Repos created");
metrics::describe_counter!(
GIT_COMMITS_PUSHED_TOTAL,
metrics::Unit::Count,
"Git commits pushed"
);
metrics::describe_counter!(
GIT_BRANCHES_CREATED_TOTAL,
metrics::Unit::Count,
"Git branches created"
);
metrics::describe_counter!(
GIT_BRANCHES_DELETED_TOTAL,
metrics::Unit::Count,
"Git branches deleted"
);
metrics::describe_counter!(
GIT_TAGS_CREATED_TOTAL,
metrics::Unit::Count,
"Git tags created"
);
metrics::describe_counter!(
GIT_TAGS_DELETED_TOTAL,
metrics::Unit::Count,
"Git tags deleted"
);
metrics::describe_counter!(
GIT_CLONES_TOTAL,
metrics::Unit::Count,
"Git clone/fetch operations"
);
// Billing
metrics::describe_counter!(
BILLING_CREDITS_USED_TOTAL,
metrics::Unit::Count,
"Billing credits consumed"
);
metrics::describe_counter!(BILLING_ERRORS_TOTAL, metrics::Unit::Count, "Billing errors");
metrics::describe_counter!(
BILLING_CREDITS_ADDED_TOTAL,
metrics::Unit::Count,
"Billing credits added (top-up)"
);
// AI
metrics::describe_counter!(
AI_ROOM_CALLS_TOTAL,
metrics::Unit::Count,
"AI calls in room context"
);
metrics::describe_counter!(
AI_CHAT_CONVERSATIONS_CREATED,
metrics::Unit::Count,
"AI chat conversations created"
);
metrics::describe_counter!(
AI_CHAT_MESSAGES_SENT,
metrics::Unit::Count,
"AI chat messages sent"
);
// Gauges
metrics::describe_gauge!(
ACTIVE_CONNECTIONS,
metrics::Unit::Count,
"Active WebSocket connections"
);
metrics::describe_gauge!(
ACTIVE_ROOM_PARTICIPANTS,
metrics::Unit::Count,
"Active room participants"
);
}