Back to Projects

Observability Platform

Centralized Monitoring & Observability Platform

The Problem

Application services were going down without the team knowing. With no automated detection, outages surfaced reactively: the team typically learned something was down only when a user complained, a stakeholder escalated, or an engineer happened to check manually, often after the service had already been unavailable for a while. A formal Causal Analysis and Resolution (CAR) exercise traced the root problem to having no monitoring or alerting capability at all; building a centralized monitoring system was adopted as the corrective action, with the explicit goal of ending undetected outages for good.

Constraints

  • Staging and production run on separate servers and had to be monitored independently, without duplicated configuration that would inevitably drift apart.
  • No budget for commercial licensing: the solution had to be built on proven open-source tooling.
  • Zero disruption to production during instrumentation and rollout.
  • Solo delivery: architecture, implementation, security, and rollout were all one engineer.

How It Was Solved

  • A pull-based metrics model: Prometheus scrapes metrics from each service and server on a schedule via lightweight exporters, so monitored systems only need to expose metrics, not push them anywhere.
  • A single environment label flows through every scrape config, alert rule, and dashboard, so one set of configuration serves every environment while keeping their data cleanly separated, onboarding a new system becomes a config change, not a rebuild.
  • Centralized log aggregation: a lightweight agent on each server ships logs to a central store tagged with the same labels as the metrics, so an engineer can move from a metric anomaly straight to the log lines behind it.
  • Alerting tuned for signal, not noise: critical, user-impacting problems trigger email; lower-priority warnings stay on dashboards only, and inhibition rules stop one incident from producing a flood of redundant alerts.
  • Security in layers: everything sits behind a TLS reverse proxy, sensitive interfaces require authentication, and firewall rules restrict the internal exporters to the monitoring server only.

What I Built

  • Built the full metrics pipeline: application metrics via each service's own metrics endpoint, host-level metrics (CPU, memory, disk) from every server, and database metrics, all labeled by environment.
  • Designed a custom NOC-style home dashboard plus per-environment service, host, and database dashboards in Grafana, with an environment switcher.
  • Configured Alertmanager for severity-based email routing, a custom branded HTML alert template for firing/resolved states, and inhibition rules to keep one outage to one notification.
  • Deployed centralized logging with per-server shipping agents, labeled to match the metrics so logs and dashboards share a common view.
  • Secured the whole platform for internet-facing operation: HTTPS via reverse proxy with Let's Encrypt, authentication on sensitive interfaces, firewalled exporters, and role-based read-only Grafana access for the team.
  • Orchestrated the entire stack with Docker Compose: persistent storage, automatic restarts, and a 30-day retention window, structured to be easy to reproduce or extend.

Result

  • The team is now automatically alerted when a service degrades or goes down, typically before any user notices, the exact failure mode the original CAR was opened for is gone.
  • One place to see the health of every service, host, and database across all environments, with searchable centralized logs replacing manual server-by-server inspection.
  • 30 days of retained history for diagnosis and trend analysis; onboarding a new system is now a config change, not a new project.
PrometheusAlertmanagerGrafanaDockerDocker ComposeNginxPromQLLogQL