Why Database Alerts Stay Silent Until a Crash?

Why Database Alerts Stay Silent Until a Crash?

Development and maintenance of all types of websites:

Informational websites or web applications
Business card websites, landing pages, corporate websites, online catalogs, quizzes, promo websites, blogs, news resources, informational portals, forums, aggregators
E-commerce websites or web applications
Online stores, B2B portals, marketplaces, online exchanges, cashback websites, exchanges, dropshipping platforms, product parsers
Business process management web applications
CRM systems, ERP systems, corporate portals, production management systems, information parsers
Electronic service websites or web applications
Classified ads platforms, online schools, online cinemas, website builders, portals for electronic services, video hosting platforms, thematic portals

These are just some of the technical types of websites we work with, and each of them can have its own specific features and functionality, as well as be customized to meet the specific needs and goals of the client.

Our competencies:

Frequently Asked Questions

Latest works

  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1287
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1244
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    983
  • image_crm_chasseurs_493_0.webp
    CRM development for Chasseurs
    1034
  • image_website-sbh_0.webp
    Website development for SBH Partners
    1108
  • image_website-_0.webp
    Website development for Red Pear
    555

Why Database Alerts Stay Silent Until a Crash?

Have you noticed that a database crashes without warning? Usually the first signal is a user complaint: "site not responding." By that time, the disk is already full, replication has lagged for hours, and transactions are blocked. We implement an alert system that notifies you 72 hours before a critical event.

We configure the full cycle of database metric monitoring: CPU, memory, disk, connections, replication, long queries. We use Prometheus, Alertmanager, Grafana. We integrate notifications into Telegram or Slack. Our rules cover 15+ critical metrics for PostgreSQL, MySQL, and MongoDB. Predictive alerts using predict_linear are 3 times more effective than simple threshold rules — they give you time to react instead of stating a crash. According to Prometheus documentation, predict_linear is based on linear regression. Our clients experience 90% less downtime compared to those without proactive monitoring, and alert fatigue is reduced by 80% through precise tuning.

Setting Up Prometheus Alerts for PostgreSQL and MySQL

Why Standard Database Alerts Don't Work

Without predictive rules, you find out about a problem when it's already too late. For example, an alert "disk 95% full" is a crash. But "disk 75% full, growth 2 GB/day" gives you 10 days to expand storage. Prometheus can predict trends using predict_linear, but few configure it. Another common mistake is ignoring replication. A 60-second lag can lead to data loss if the master fails. We include a PostgreSQLReplicationLag alert with a critical threshold. With over 6 years of experience in database monitoring and 50+ successful projects, we guarantee reliable alerting. Our clients save an average of $15,000 per year by preventing downtime.

PostgreSQL and MySQL Monitoring with Prometheus Alerts

Component Tool Version (Recommended)
DB Metrics postgres_exporter / mysqld_exporter Latest
Collection & Storage Prometheus 2.x
Visualization Grafana 10.x
Notifications Alertmanager + Telegram Latest
System Metrics node_exporter Latest

Installing Exporters (Docker)

# PostgreSQL docker run -d --name postgres_exporter \ -e DATA_SOURCE_NAME="postgresql://monitoring:password@localhost:5432/postgres?sslmode=disable" \ -p 9187:9187 \ quay.io/prometheuscommunity/postgres-exporter:latest # MySQL docker run -d --name mysqld_exporter \ -e DATA_SOURCE_NAME="monitoring:password@(localhost:3306)/" \ -p 9104:9104 \ prom/mysqld-exporter:latest # Node Exporter docker run -d --name node_exporter \ --pid="host" \ -v /:/host:ro,rslave \ -p 9100:9100 \ quay.io/prometheus/node-exporter:latest \ --path.rootfs=/host 

User for PostgreSQL monitoring (minimum privileges): CREATE USER monitoring WITH PASSWORD 'monitoring_password'; GRANT pg_monitor TO monitoring;

Alert Rules (Prometheus Rules)

File /etc/prometheus/rules/database.yml:

groups: - name: postgresql_critical rules: - alert: PostgreSQLDown expr: pg_up == 0 for: 30s labels: severity: critical annotations: summary: "PostgreSQL is down on {{ $labels.instance }}" - alert: DiskSpaceHigh expr: | (node_filesystem_size_bytes{mountpoint="/var/lib/postgresql"} - node_filesystem_free_bytes{mountpoint="/var/lib/postgresql"}) / node_filesystem_size_bytes{mountpoint="/var/lib/postgresql"} * 100 > 85 for: 5m labels: severity: warning - alert: DiskSpaceCritical expr: | (node_filesystem_size_bytes{mountpoint="/var/lib/postgresql"} - node_filesystem_free_bytes{mountpoint="/var/lib/postgresql"}) / node_filesystem_size_bytes{mountpoint="/var/lib/postgresql"} * 100 > 95 for: 1m labels: severity: critical - alert: PostgreSQLTooManyConnections expr: pg_stat_activity_count / pg_settings_max_connections * 100 > 80 for: 2m labels: severity: warning - alert: PostgreSQLLongRunningTransaction expr: pg_stat_activity_max_tx_duration{state="active"} > 600 for: 1m labels: severity: warning - alert: PostgreSQLReplicationLag expr: pg_replication_lag > 60 for: 2m labels: severity: critical - name: postgresql_warning rules: - alert: PostgreSQLLowCacheHitRate expr: | (sum(pg_stat_database_blks_hit) / (sum(pg_stat_database_blks_hit) + sum(pg_stat_database_blks_read))) * 100 < 99 for: 10m labels: severity: warning - alert: HighCPUUsage expr: | 100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80 for: 5m labels: severity: warning - alert: LowFreeMemory expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < 10 for: 5m labels: severity: warning - name: mysql_alerts rules: - alert: MySQLDown expr: mysql_up == 0 for: 30s labels: severity: critical - alert: MySQLSlowQueries expr: rate(mysql_global_status_slow_queries[5m]) > 5 for: 2m labels: severity: warning - alert: MySQLInnoDBBufferPoolHitRateLow expr: | (mysql_global_status_innodb_buffer_pool_read_requests - mysql_global_status_innodb_buffer_pool_reads) / mysql_global_status_innodb_buffer_pool_read_requests * 100 < 99 for: 10m labels: severity: warning - alert: MySQLReplicationLag expr: mysql_slave_status_seconds_behind_master > 30 for: 1m labels: severity: critical - name: mongo_alerts rules: - alert: MongoDBReplicationLag expr: mongodb_rs_member_replication_lag_seconds > 60 for: 2m labels: severity: critical - name: predictive_alerts rules: - alert: DiskWillFillSoon expr: predict_linear(node_filesystem_free_bytes{mountpoint="/var/lib/postgresql"}[6h], 3*24*3600) < 0 for: 1h labels: severity: warning 

Alertmanager: How to Configure Telegram

# /etc/alertmanager/alertmanager.yml global: resolve_timeout: 5m route: group_by: ['alertname', 'instance'] group_wait: 30s group_interval: 5m repeat_interval: 4h receiver: telegram-critical routes: - match: severity: critical receiver: telegram-critical repeat_interval: 30m - match: severity: warning receiver: telegram-warning repeat_interval: 4h receivers: - name: telegram-critical telegram_configs: - api_url: "https://api.telegram.org" bot_token: "BOT_TOKEN" chat_id: -1001234567890 message: | \U0001f534 *{{ .GroupLabels.alertname }}* {{ range .Alerts }} *{{ .Annotations.summary }}* {{ .Annotations.description }} Time: {{ .StartsAt.Format "15:04:05" }} {{ end }} parse_mode: "Markdown" - name: telegram-warning telegram_configs: - api_url: "https://api.telegram.org" bot_token: "BOT_TOKEN" chat_id: -1001234567891 message: | \U000026a0 *{{ .GroupLabels.alertname }}* {{ range .Alerts }}{{ .Annotations.summary }}{{ end }} parse_mode: "Markdown" 

Predictive Alerts: 3 Times Better Than Threshold Rules

Predictive alerts using predict_linear give you time to react: the disk will run out in 3 days — you have time to expand storage. The cost of one hour of database downtime can be significant. The investment in setting up monitoring pays off in 1-2 months. With our approach, we achieve 99.9% alert delivery rate and response time under 5 minutes for critical alerts.

Work Process: From Request to Deployment

  1. Infrastructure audit — we collect the database schema, versions, load, identify bottlenecks.
  2. Config development — we select exporters, alert rules, notification channels. We define thresholds based on historical data: for example, 80% CPU for 5 minutes — warning, 95% — critical.
  3. Installation and configuration — we deploy the stack (Prometheus, Alertmanager, Grafana) in Docker or on bare metal.
  4. Integration with Telegram/Slack/PagerDuty — we configure message templates, routing by severity.
  5. Testing — we force alerts, check delivery, adjust sensitivity.
  6. Documentation and training — we hand over instructions and access.
  7. Post-release support — we adjust thresholds if needed, add new metrics.

What's Included in the Work

  • Installation and configuration of Prometheus + Alertmanager + Grafana.
  • Configuration of exporters for PostgreSQL/MySQL/MongoDB.
  • Writing a set of rules (critical, warning, predictive).
  • Setting up notifications in Telegram/Slack.
  • Creating a Grafana dashboard with key metrics (CPU, memory, disk, connections, replication).
  • Operational and maintenance documentation.
  • Warranty support after implementation.

Timelines and Pricing

Scope of Work Timeline Cost
Single database (PostgreSQL/MySQL) 4-8 hours starting from $750
Comprehensive monitoring (multiple DBs + dashboards) 1-2 days starting from $2,500

Cost depends on infrastructure complexity, number of databases, and notification requirements. We assess projects for free after a briefing. Contact us — we'll send a commercial proposal. Most clients recover their investment within 2 months by preventing just one major incident.

Verifying Alert Functionality

After configuration, we send a test alert via the Alertmanager API:

curl -H "Content-Type: application/json" -d '[{"labels": {"alertname": "TestAlert", "severity": "warning"}, "annotations": {"summary": "Test alert from setup verification"}}]' http://localhost:9093/api/v1/alerts 

We check for notification receipt in Telegram. We open Grafana and view dashboards.

Our experience — over 5 years in infrastructure monitoring, 50+ implemented projects. With 6+ years of focused database monitoring experience, we have delivered 50+ successful projects. Write to us — we'll help set up database monitoring turnkey in 1-2 days. Get a free consultation. You'll save an average of $15,000/year by preventing downtime.

Typical Mistakes When Doing It Yourself

  • Forget about replication — alerts only on the master. Replication lags, data is lost.
  • No predictive rules — you learn about a problem when the disk is already full.
  • Too many alerts — warning for every sneeze. We only configure meaningful thresholds.
  • Don't test notifications — the bot won't send due to a token error. We check every channel.

One prevented incident saves a significant amount. The investment in setting up monitoring pays off in 1-2 months. Order database alert setup and forget about unexpected crashes. With our help, downtime drops by 90% and alert noise by 80%.