Skip to content

How to Monitor Odoo Performance (Logs, Metrics)

DeployMonkey Team · March 11, 2026 8 min read

What to Monitor in Odoo

Effective Odoo monitoring covers four areas:

  1. Application health — is Odoo responding? Is it slow?
  2. Database performance — are queries fast? Is PostgreSQL under pressure?
  3. System resources — CPU, RAM, disk, and network on the host
  4. Business signals — cron job failures, email bounce rates, background task queues

Step 1 — Odoo Health Endpoint

Odoo exposes a simple health check at /web/health (Odoo 15+) and /web/webclient/version_info (all versions). Use these for uptime monitoring:

# Check from cron (every minute):
curl -sf https://your-odoo.example.com/web/health || \
  echo "Odoo DOWN at $(date)" | mail -s "Odoo Alert" [email protected]

# Or use a monitoring service (UptimeRobot, BetterUptime) pointed at /web/health

Step 2 — Odoo Log Analysis

Odoo writes structured logs to its log file. Key patterns to watch:

# Slow requests (over threshold):
grep "took [0-9]\{4,\}" /var/log/odoo/odoo.log | tail -20

# Worker timeouts:
grep "worker timeout\|SIGKILL\|limit_time" /var/log/odoo/odoo.log | tail -20

# Errors:
grep "ERROR\|CRITICAL\|Traceback" /var/log/odoo/odoo.log | tail -50

# Failed cron jobs:
grep "cron.*error\|cron.*fail" /var/log/odoo/odoo.log | tail -20

Configure log rotation so logs do not fill your disk:

# /etc/logrotate.d/odoo
/var/log/odoo/odoo.log {
daily
rotate 14
compress
missingok
notifempty
postrotate
    systemctl kill -s HUP odoo
endscript
}

Step 3 — PostgreSQL pg_stat_statements

# Enable in postgresql.conf:
shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.max = 10000
pg_stat_statements.track = all

# Restart PostgreSQL, then:
psql -U odoo -d mydb -c "CREATE EXTENSION IF NOT EXISTS pg_stat_statements;"

# Find the 10 slowest queries (by mean execution time):
SELECT
left(query, 100) AS query,
calls,
round(mean_exec_time::numeric, 2) AS mean_ms,
round(total_exec_time::numeric, 0) AS total_ms
FROM pg_stat_statements
ORDER BY mean_exec_time DESC
LIMIT 10;

Run this weekly and investigate any query averaging over 200 ms. See Optimize PostgreSQL for Odoo for index strategies.

Step 4 — System Metrics with Prometheus + Node Exporter

# Install node_exporter on the Odoo server:
docker run -d \
  --name node_exporter \
  --net host \
  --pid host \
  -v /proc:/host/proc:ro \
  -v /sys:/host/sys:ro \
  -v /:/rootfs:ro \
  prom/node-exporter \
  --path.procfs /host/proc \
  --path.sysfs /host/sys \
  --collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)"
# prometheus.yml (scrape config):
scrape_configs:
  - job_name: 'odoo_host'
static_configs:
  - targets: ['your-server-ip:9100']

Step 5 — PostgreSQL Exporter for Prometheus

docker run -d \
  --name postgres_exporter \
  -e DATA_SOURCE_NAME="postgresql://odoo:[email protected]:5432/mydb?sslmode=disable" \
  -p 9187:9187 \
  quay.io/prometheuscommunity/postgres-exporter

This exposes PostgreSQL metrics (connections, transaction rate, replication lag, table sizes) to Prometheus.

Step 6 — Grafana Dashboards

Import the following community dashboards into Grafana:

  • Node Exporter Full: dashboard ID 1860 — CPU, RAM, disk, network per host
  • PostgreSQL Database: dashboard ID 9628 — query throughput, connection count, cache hit ratio

Set up alerts in Grafana for:

  • CPU sustained above 85% for 5 minutes
  • RAM usage above 90%
  • Disk above 80% (Odoo databases grow steadily)
  • PostgreSQL connections above 80% of max_connections
  • Odoo health endpoint returning non-200

Step 7 — Disk Alerts (Critical for Odoo)

Odoo databases grow continuously. A full disk causes PostgreSQL to crash and Odoo to fail completely with no clear error message. Monitor disk proactively:

# Simple cron alert:
df -h / | awk 'NR==2 {if ($5+0 > 80) print "DISK ALERT: " $5 " used on /"}' | \
  mail -s "Disk Alert" [email protected]

How DeployMonkey Monitors Your Instance

Every DeployMonkey instance includes built-in monitoring: health check polling every 30 seconds, disk usage alerts at 75% and 90%, and a performance dashboard in the control panel showing response time trends, worker status, and database size. You get instant notifications without setting up Prometheus yourself.

Start free at deploymonkey.app.

Frequently Asked Questions

How do I enable debug logging in Odoo?

Add log_level = debug to odoo.conf, or pass --log-level=debug at startup. Be careful — debug logging generates enormous volumes of output and can itself slow Odoo down.

What is a good PostgreSQL cache hit ratio?

Above 99% is ideal. Below 95% means PostgreSQL is reading from disk frequently — increase shared_buffers or add RAM.

How do I find which user or report is causing slow queries?

Enable log_min_duration_statement = 1000 in postgresql.conf to log all queries over 1 second, including the client IP and database user that ran them.

Is there a built-in Odoo performance monitoring tool?

Odoo Enterprise has a basic monitoring dashboard. For Community, third-party modules like web_profiler add request profiling. For production monitoring, Prometheus + Grafana is the standard approach.