<p><img class="alignnone size-full wp-image-3638" style="max-width: 100%; height: auto;" src="https://flowgenius.in/wp-content/uploads/2025/12/7-1.png" alt="n8n Cache Architecture and Data Flow Diagram" /></p>
<p style="text-align: center;">Step by Step Guide for Monitoring Redis Health for n8n</p>
<p> </p>
<p> </p>
<p style="margin-bottom: 2em; line-height: 1.9;"><strong>Who this is for:</strong> Site reliability engineers, DevOps specialists, or n8n operators who need production‑grade visibility and alerts on the Redis instance that backs n8n workflows. For a complete overview of Redis usage, errors, performance tuning, and scaling in n8n, check out our detailed guide on <a href="https://flowgenius.in/n8n-redis-error-troubleshooting-guide/"><strong><em data-start="361" data-end="386">Redis for n8n Workflows</em></strong></a>.</p>
<hr style="margin: 55px 0;" />
<h2 style="margin-bottom: 45px; line-height: 1.3;">Quick Diagnosis</h2>
<ol style="margin-bottom: 2em; line-height: 1.9;">
<li>Deploy <strong>redis_exporter</strong> (Docker or Helm).</li>
<li>Add a <code>redis-n8n</code> scrape job to <code>prometheus.yml</code>.</li>
<li>Import the <em>n8n Redis Health</em> Grafana dashboard (JSON below).</li>
<li>Create Alertmanager rules for <code>redis_up</code>, memory pressure, and client spikes.</li>
</ol>
<p style="margin-bottom: 2em; line-height: 1.9;">Result: real‑time graphs and alerts for memory usage, client connections, and instance availability—critical for keeping n8n operational.</p>
<hr style="margin: 55px 0;" />
<h2 style="margin-bottom: 45px; line-height: 1.3;">1. Why n8n Needs Dedicated Redis Monitoring</h2>
<p style="margin-bottom: 2em; line-height: 1.9;">n8n relies on Redis for workflow state, credential caches, and queue data. A single metric breach can cascade into workflow failures, credential loss, or dead‑lettered jobs. If you are planning to <a href="https://flowgenius.in/scaling-redis-for-high-n8n-load/"><strong>scale Redis for high n8n load</strong></a>, finish it up and continue the setup.</p>
<table style="border-collapse: collapse; width: 100%; margin-bottom: 2em;">
<thead>
<tr>
<th style="padding: 12px 14px; text-align: left;">**n8n Concern**</th>
<th style="padding: 12px 14px; text-align: left;">**Key Redis Metric**</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding: 12px 14px;">Workflow continuity</td>
<td style="padding: 12px 14px;">`connected_clients`</td>
</tr>
<tr>
<td style="padding: 12px 14px;">Credential cache reliability</td>
<td style="padding: 12px 14px;">`used_memory` / `maxmemory`</td>
</tr>
<tr>
<td style="padding: 12px 14px;">Queue processing speed</td>
<td style="padding: 12px 14px;">`instantaneous_ops_per_sec`</td>
</tr>
<tr>
<td style="padding: 12px 14px;">Instance availability</td>
<td style="padding: 12px 14px;">`redis_up`</td>
</tr>
</tbody>
</table>
<p style="margin-bottom: 2em; line-height: 1.9;"><em>Impact</em>: If any of these metrics cross their thresholds, n8n jobs stall or data is lost.</p>
<hr style="margin: 55px 0;" />
<h2 style="margin-bottom: 45px; line-height: 1.3;">2. Prerequisites</h2>
<table style="border-collapse: collapse; width: 100%; margin-bottom: 2em;">
<thead>
<tr>
<th style="padding: 12px 14px; text-align: left;">Requirement</th>
<th style="padding: 12px 14px; text-align: left;">Detail</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding: 12px 14px;">n8n version</td>
<td style="padding: 12px 14px;">≥ 0.221 (external Redis)</td>
</tr>
<tr>
<td style="padding: 12px 14px;">Redis version</td>
<td style="padding: 12px 14px;">5 – 7 (supported by exporter)</td>
</tr>
<tr>
<td style="padding: 12px 14px;">Prometheus</td>
<td style="padding: 12px 14px;">≥ 2.30</td>
</tr>
<tr>
<td style="padding: 12px 14px;">Grafana</td>
<td style="padding: 12px 14px;">≥ 9.0</td>
</tr>
<tr>
<td style="padding: 12px 14px;">Network</td>
<td style="padding: 12px 14px;">Prometheus → Redis :6379 reachable</td>
</tr>
<tr>
<td style="padding: 12px 14px;">Optional</td>
<td style="padding: 12px 14px;">Alertmanager for automated alerts</td>
</tr>
</tbody>
</table>
<hr style="margin: 55px 0;" />
<h2 style="margin-bottom: 45px; line-height: 1.3;">3. Deploy the Redis Exporter</h2>
<h3 style="margin-bottom: 45px; line-height: 1.3;">3.1 Docker – quick start</h3>
<pre style="background: #fafafa; padding: 20px; border: 1px solid #e0e0e0; overflow: auto;">docker run -d \
--name redis_exporter \
-p 9121:9121 \
-e REDIS_ADDR=redis://<REDIS_HOST>:6379 \
oliver006/redis_exporter:latest
</pre>
<p style="margin-bottom: 2em; line-height: 1.9;">*Replace <code><REDIS_HOST></code> with the host n8n uses.*</p>
<h3 style="margin-bottom: 45px; line-height: 1.3;">3.2 Kubernetes – Helm chart</h3>
<pre style="background: #fafafa; padding: 20px; border: 1px solid #e0e0e0; overflow: auto;">helm repo add prometheus-community \
https://prometheus-community.github.io/helm-charts
helm repo update
helm install redis-exporter prometheus-community/prometheus-redis-exporter \
--set redis.address=redis://<REDIS_HOST>:6379 \
--set service.port=9121
</pre>
<p style="margin-bottom: 2em; line-height: 1.9;"><strong>EEFA Note</strong> – In production, set <code>REDIS_PASSWORD</code> (or <code>--redis.password</code>) to avoid exposing unauthenticated metrics.</p>
<hr style="margin: 55px 0;" />
<h2 style="margin-bottom: 45px; line-height: 1.3;">4. Configure Prometheus to Scrape the Exporter</h2>
<p style="margin-bottom: 2em; line-height: 1.9;">Add a new job to <code>prometheus.yml</code>:</p>
<pre style="background: #fafafa; padding: 20px; border: 1px solid #e0e0e0; overflow: auto;">scrape_configs:
- job_name: 'redis-n8n'
static_configs:
- targets: ['<EXPORTER_HOST>:9121']
</pre>
<p style="margin-bottom: 2em; line-height: 1.9;">Add a relabel rule that tags metrics with the n8n instance name:</p>
<pre style="background: #fafafa; padding: 20px; border: 1px solid #e0e0e0; overflow: auto;"> relabel_configs:
- source_labels: [__address__]
target_label: instance
replacement: n8n-redis
</pre>
<p style="margin-bottom: 2em; line-height: 1.9;">Reload Prometheus: <code>curl -X POST http://localhost:9090/-/reload</code></p>
<hr style="margin: 55px 0;" />
<h2 style="margin-bottom: 45px; line-height: 1.3;">5. n8n‑Specific Grafana Dashboard</h2>
<p style="margin-bottom: 2em; line-height: 1.9;">Import the JSON below (Grafana > Dashboard > Import). It visualizes the three health pillars: availability, memory, and client load.</p>
<pre style="background: #fafafa; padding: 20px; border: 1px solid #e0e0e0; overflow: auto;">{
"dashboard": {
"title": "n8n Redis Health",
"panels": [
{
"type": "stat",
"title": "Redis Up",
"targets": [{ "expr": "redis_up{instance=\"n8n-redis\"}" }],
"colorMode": "value",
"thresholds": "0,1"
},
{
"type": "graph",
"title": "Memory Usage vs Maxmemory",
"targets": [
{ "expr": "redis_memory_used_bytes{instance=\"n8n-redis\"}", "legendFormat": "Used" },
{ "expr": "redis_memory_max_bytes{instance=\"n8n-redis\"}", "legendFormat": "Max" }
],
"yaxes": [{ "format": "bytes" }, {}]
},
{
"type": "graph",
"title": "Connected Clients",
"targets": [{ "expr": "redis_connected_clients{instance=\"n8n-redis\"}" }],
"yaxes": [{ "format": "short" }, {}]
},
{
"type": "graph",
"title": "Ops per Second (Instantaneous)",
"targets": [{ "expr": "redis_instantaneous_ops_per_sec{instance=\"n8n-redis\"}" }],
"yaxes": [{ "format": "ops" }, {}]
}
],
"templating": {
"list": [
{
"type": "query",
"name": "instance",
"datasource": "Prometheus",
"query": "label_values(redis_up, instance)",
"refresh": 1,
"includeAll": false
}
]
}
}
}
</pre>
<h3 style="margin-bottom: 45px; line-height: 1.3;">Dashboard Customization Checklist</h3>
<ul style="margin-bottom: 2em; line-height: 1.9;">
<li>Set <strong>Refresh</strong> to <code>30 s</code> (captures n8n queue spikes).</li>
<li>Add <strong>Annotations</strong> for n8n deployment rollouts.</li>
<li>Enable <strong>Panel Links</strong> to the n8n workflow editor for quick navigation.</li>
<li>When a tragedy or fallback occurs,<br />
Check out: <a href="https://flowgenius.in/fallback-strategies-when-redis-is-down-in-n8n-keep-your-workflows-running/"><strong>fallback strategies when Redis is down in n8n</strong></a></li>
</ul>
<hr style="margin: 55px 0;" />
<h2 style="margin-bottom: 45px; line-height: 1.3;">6. Alerting – Detecting Critical Redis Conditions</h2>
<p style="margin-bottom: 2em; line-height: 1.9;">Create <code>redis_n8n_alerts.yml</code> and reference it from your Prometheus <code>alerting_rules.yml</code>.</p>
<h3 style="margin-bottom: 45px; line-height: 1.3;">6.1 Instance‑down alert</h3>
<pre style="background: #fafafa; padding: 20px; border: 1px solid #e0e0e0; overflow: auto;">- alert: RedisDown
expr: redis_up{instance="n8n-redis"} == 0
for: 2m
labels:
severity: critical
annotations:
summary: "Redis instance for n8n is unreachable"
description: "No metrics received from {{ $labels.instance }} for >2 minutes."
</pre>
<h3 style="margin-bottom: 45px; line-height: 1.3;">6.2 Memory‑pressure alert</h3>
<pre style="background: #fafafa; padding: 20px; border: 1px solid #e0e0e0; overflow: auto;">- alert: RedisMemoryPressure
expr: (redis_memory_used_bytes{instance="n8n-redis"} /
redis_memory_max_bytes{instance="n8n-redis"}) > 0.85
for: 5m
labels:
severity: warning
annotations:
summary: "Redis memory usage high on n8n"
description: "Memory usage is {{ $value | humanizePercentage }} of maxmemory."
</pre>
<h3 style="margin-bottom: 45px; line-height: 1.3;">6.3 Client‑spike alert</h3>
<pre style="background: #fafafa; padding: 20px; border: 1px solid #e0e0e0; overflow: auto;">- alert: RedisClientSpikes
expr: redis_connected_clients{instance="n8n-redis"} > 800
for: 3m
labels:
severity: warning
annotations:
summary: "High number of Redis clients for n8n"
description: "{{ $value }} clients connected (threshold 800)."
</pre>
<p style="margin-bottom: 2em; line-height: 1.9;"><strong>EEFA Note</strong> – In a Kubernetes StatefulSet with <code>maxmemory-policy allkeys-lru</code>, a memory‑pressure alert should trigger a **scale‑out** or **cache‑purge** job rather than a simple restart.</p>
<hr style="margin: 55px 0;" />
<h2 style="margin-bottom: 45px; line-height: 1.3;">7. Pulling n8n‑Specific Insights from <code>INFO</code></h2>
<p style="margin-bottom: 2em; line-height: 1.9;">Some n8n‑relevant fields are only exposed via <code>INFO</code>. Run the helper script on the Redis host (or via <code>redis-cli</code> from n8n) to surface them:</p>
<pre style="background: #fafafa; padding: 20px; border: 1px solid #e0e0e0; overflow: auto;">#!/usr/bin/env bash
# n8n‑Redis health helper – prints only n8n‑relevant sections
redis-cli INFO memory | grep -E 'used_memory|maxmemory|used_memory_peak'
redis-cli INFO clients | grep connected_clients
redis-cli INFO stats | grep instantaneous_ops_per_sec
</pre>
<h3 style="margin-bottom: 45px; line-height: 1.3;">Interpretation Table</h3>
<table style="border-collapse: collapse; width: 100%; margin-bottom: 2em;">
<thead>
<tr>
<th style="padding: 12px 14px; text-align: left;">INFO line</th>
<th style="padding: 12px 14px; text-align: left;">n8n relevance</th>
<th style="padding: 12px 14px; text-align: left;">Action if abnormal</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding: 12px 14px;">`used_memory`</td>
<td style="padding: 12px 14px;">Current memory footprint of workflow state</td>
<td style="padding: 12px 14px;">Investigate large payloads or raise <code>maxmemory</code>.</td>
</tr>
<tr>
<td style="padding: 12px 14px;">`maxmemory`</td>
<td style="padding: 12px 14px;">Configured limit (if set)</td>
<td style="padding: 12px 14px;">Increase limit or enable LRU eviction.</td>
</tr>
<tr>
<td style="padding: 12px 14px;">`connected_clients`</td>
<td style="padding: 12px 14px;">Number of n8n workers + API callers</td>
<td style="padding: 12px 14px;">Scale n8n workers or adjust client pooling.</td>
</tr>
<tr>
<td style="padding: 12px 14px;">`instantaneous_ops_per_sec`</td>
<td style="padding: 12px 14px;">Throughput of queue pushes/pops</td>
<td style="padding: 12px 14px;">Check for bottlenecks in heavy‑load workflows.</td>
</tr>
</tbody>
</table>
<hr style="margin: 55px 0;" />
<h2 style="margin-bottom: 45px; line-height: 1.3;">8. Troubleshooting Common Monitoring Pitfalls</h2>
<table style="border-collapse: collapse; width: 100%; margin-bottom: 2em;">
<thead>
<tr>
<th style="padding: 12px 14px; text-align: left;">Symptom</th>
<th style="padding: 12px 14px; text-align: left;">Likely Cause</th>
<th style="padding: 12px 14px; text-align: left;">Fix</th>
</tr>
</thead>
<tbody>
<tr>
<td style="padding: 12px 14px;">No metrics appear in Grafana</td>
<td style="padding: 12px 14px;">Exporter not reachable (firewall, wrong <code>REDIS_ADDR</code>)</td>
<td style="padding: 12px 14px;">Verify: <code>curl http://<EXPORTER_HOST>:9121/metrics</code></td>
</tr>
<tr>
<td style="padding: 12px 14px;"><code>redis_up</code> always 0</td>
<td style="padding: 12px 14px;">Exporter started without proper auth</td>
<td style="padding: 12px 14px;">Set <code>REDIS_PASSWORD</code> env var; restart exporter</td>
</tr>
<tr>
<td style="padding: 12px 14px;">Alert flaps repeatedly</td>
<td style="padding: 12px 14px;">Scrape interval too low vs <code>for:</code> clause</td>
<td style="padding: 12px 14px;">Increase <code>scrape_interval</code> to <code>30s</code> and <code>for:</code> to <code>5m</code></td>
</tr>
<tr>
<td style="padding: 12px 14px;">Memory chart flat at 0</td>
<td style="padding: 12px 14px;"><code>maxmemory</code> not set, exporter skips metric</td>
<td style="padding: 12px 14px;">Define <code>maxmemory</code> in <code>redis.conf</code> or rely on <code>redis_memory_used_bytes</code> alone</td>
</tr>
<tr>
<td style="padding: 12px 14px;">High <code>connected_clients</code> but low latency</td>
<td style="padding: 12px 14px;">Stale connections from old n8n pods</td>
<td style="padding: 12px 14px;">Enable <code>client-timeout</code> or run <code>CLIENT KILL TYPE normal</code> post‑deploy</td>
</tr>
</tbody>
</table>
<hr style="margin: 55px 0;" />
<h2 style="margin-bottom: 45px; line-height: 1.3;">9. Production‑Grade Enhancements</h2>
<ol style="margin-bottom: 2em; line-height: 1.9;">
<li><strong>TLS‑Secured Exporter</strong> – Place the exporter behind an NGINX sidecar with mTLS; use <code>--tls-client-ca</code> and <code>--tls-client-cert</code>.</li>
<li><strong>Multi‑Tenant Labels</strong> – For multiple n8n instances, add <code>instance="n8n-prod"</code> / <code>instance="n8n-staging"</code> to both exporter env and Prometheus job.</li>
<li><strong>Auto‑Scaling Hook</strong> – Wire an Alertmanager webhook to a Kubernetes HPA that adds n8n workers when <code>connected_clients</code> > 800.</li>
<li><strong>Long‑Term Retention</strong> – Configure Prometheus remote‑write to Thanos or Cortex to keep Redis health history for compliance audits.</li>
</ol>
<hr style="margin: 55px 0;" />
<h2 style="margin-bottom: 45px; line-height: 1.3;">Conclusion</h2>
<p style="margin-bottom: 2em; line-height: 1.9;">By instrumenting Redis with <code>redis_exporter</code>, scraping it via Prometheus, visualizing the core n8n metrics in a purpose‑built Grafana dashboard, and wiring sensible Alertmanager rules, you gain immediate visibility into the health factors that directly affect n8n workflow execution. The approach is lightweight, production‑ready, and scales from a single‑node deployment to multi‑tenant, HA Redis clusters—ensuring n8n remains reliable under real‑world load.</p>

Step by Step Guide for Monitoring Redis Health for n8n
Who this is for: Site reliability engineers, DevOps specialists, or n8n operators who need production‑grade visibility and alerts on the Redis instance that backs n8n workflows. For a complete overview of Redis usage, errors, performance tuning, and scaling in n8n, check out our detailed guide on Redis for n8n Workflows.
Quick Diagnosis
- Deploy redis_exporter (Docker or Helm).
- Add a
redis-n8n scrape job to prometheus.yml.
- Import the n8n Redis Health Grafana dashboard (JSON below).
- Create Alertmanager rules for
redis_up, memory pressure, and client spikes.
Result: real‑time graphs and alerts for memory usage, client connections, and instance availability—critical for keeping n8n operational.
1. Why n8n Needs Dedicated Redis Monitoring
n8n relies on Redis for workflow state, credential caches, and queue data. A single metric breach can cascade into workflow failures, credential loss, or dead‑lettered jobs. If you are planning to scale Redis for high n8n load, finish it up and continue the setup.
| **n8n Concern** |
**Key Redis Metric** |
| Workflow continuity |
`connected_clients` |
| Credential cache reliability |
`used_memory` / `maxmemory` |
| Queue processing speed |
`instantaneous_ops_per_sec` |
| Instance availability |
`redis_up` |
Impact: If any of these metrics cross their thresholds, n8n jobs stall or data is lost.
2. Prerequisites
| Requirement |
Detail |
| n8n version |
≥ 0.221 (external Redis) |
| Redis version |
5 – 7 (supported by exporter) |
| Prometheus |
≥ 2.30 |
| Grafana |
≥ 9.0 |
| Network |
Prometheus → Redis :6379 reachable |
| Optional |
Alertmanager for automated alerts |
3. Deploy the Redis Exporter
3.1 Docker – quick start
docker run -d \
--name redis_exporter \
-p 9121:9121 \
-e REDIS_ADDR=redis://<REDIS_HOST>:6379 \
oliver006/redis_exporter:latest
*Replace <REDIS_HOST> with the host n8n uses.*
3.2 Kubernetes – Helm chart
helm repo add prometheus-community \
https://prometheus-community.github.io/helm-charts
helm repo update
helm install redis-exporter prometheus-community/prometheus-redis-exporter \
--set redis.address=redis://<REDIS_HOST>:6379 \
--set service.port=9121
EEFA Note – In production, set REDIS_PASSWORD (or --redis.password) to avoid exposing unauthenticated metrics.
4. Configure Prometheus to Scrape the Exporter
Add a new job to prometheus.yml:
scrape_configs:
- job_name: 'redis-n8n'
static_configs:
- targets: ['<EXPORTER_HOST>:9121']
Add a relabel rule that tags metrics with the n8n instance name:
relabel_configs:
- source_labels: [__address__]
target_label: instance
replacement: n8n-redis
Reload Prometheus: curl -X POST http://localhost:9090/-/reload
5. n8n‑Specific Grafana Dashboard
Import the JSON below (Grafana > Dashboard > Import). It visualizes the three health pillars: availability, memory, and client load.
{
"dashboard": {
"title": "n8n Redis Health",
"panels": [
{
"type": "stat",
"title": "Redis Up",
"targets": [{ "expr": "redis_up{instance=\"n8n-redis\"}" }],
"colorMode": "value",
"thresholds": "0,1"
},
{
"type": "graph",
"title": "Memory Usage vs Maxmemory",
"targets": [
{ "expr": "redis_memory_used_bytes{instance=\"n8n-redis\"}", "legendFormat": "Used" },
{ "expr": "redis_memory_max_bytes{instance=\"n8n-redis\"}", "legendFormat": "Max" }
],
"yaxes": [{ "format": "bytes" }, {}]
},
{
"type": "graph",
"title": "Connected Clients",
"targets": [{ "expr": "redis_connected_clients{instance=\"n8n-redis\"}" }],
"yaxes": [{ "format": "short" }, {}]
},
{
"type": "graph",
"title": "Ops per Second (Instantaneous)",
"targets": [{ "expr": "redis_instantaneous_ops_per_sec{instance=\"n8n-redis\"}" }],
"yaxes": [{ "format": "ops" }, {}]
}
],
"templating": {
"list": [
{
"type": "query",
"name": "instance",
"datasource": "Prometheus",
"query": "label_values(redis_up, instance)",
"refresh": 1,
"includeAll": false
}
]
}
}
}
Dashboard Customization Checklist
- Set Refresh to
30 s (captures n8n queue spikes).
- Add Annotations for n8n deployment rollouts.
- Enable Panel Links to the n8n workflow editor for quick navigation.
- When a tragedy or fallback occurs,
Check out: fallback strategies when Redis is down in n8n
6. Alerting – Detecting Critical Redis Conditions
Create redis_n8n_alerts.yml and reference it from your Prometheus alerting_rules.yml.
6.1 Instance‑down alert
- alert: RedisDown
expr: redis_up{instance="n8n-redis"} == 0
for: 2m
labels:
severity: critical
annotations:
summary: "Redis instance for n8n is unreachable"
description: "No metrics received from {{ $labels.instance }} for >2 minutes."
6.2 Memory‑pressure alert
- alert: RedisMemoryPressure
expr: (redis_memory_used_bytes{instance="n8n-redis"} /
redis_memory_max_bytes{instance="n8n-redis"}) > 0.85
for: 5m
labels:
severity: warning
annotations:
summary: "Redis memory usage high on n8n"
description: "Memory usage is {{ $value | humanizePercentage }} of maxmemory."
6.3 Client‑spike alert
- alert: RedisClientSpikes
expr: redis_connected_clients{instance="n8n-redis"} > 800
for: 3m
labels:
severity: warning
annotations:
summary: "High number of Redis clients for n8n"
description: "{{ $value }} clients connected (threshold 800)."
EEFA Note – In a Kubernetes StatefulSet with maxmemory-policy allkeys-lru, a memory‑pressure alert should trigger a **scale‑out** or **cache‑purge** job rather than a simple restart.
7. Pulling n8n‑Specific Insights from INFO
Some n8n‑relevant fields are only exposed via INFO. Run the helper script on the Redis host (or via redis-cli from n8n) to surface them:
#!/usr/bin/env bash
# n8n‑Redis health helper – prints only n8n‑relevant sections
redis-cli INFO memory | grep -E 'used_memory|maxmemory|used_memory_peak'
redis-cli INFO clients | grep connected_clients
redis-cli INFO stats | grep instantaneous_ops_per_sec
Interpretation Table
| INFO line |
n8n relevance |
Action if abnormal |
| `used_memory` |
Current memory footprint of workflow state |
Investigate large payloads or raise maxmemory. |
| `maxmemory` |
Configured limit (if set) |
Increase limit or enable LRU eviction. |
| `connected_clients` |
Number of n8n workers + API callers |
Scale n8n workers or adjust client pooling. |
| `instantaneous_ops_per_sec` |
Throughput of queue pushes/pops |
Check for bottlenecks in heavy‑load workflows. |
8. Troubleshooting Common Monitoring Pitfalls
| Symptom |
Likely Cause |
Fix |
| No metrics appear in Grafana |
Exporter not reachable (firewall, wrong REDIS_ADDR) |
Verify: curl http://<EXPORTER_HOST>:9121/metrics |
redis_up always 0 |
Exporter started without proper auth |
Set REDIS_PASSWORD env var; restart exporter |
| Alert flaps repeatedly |
Scrape interval too low vs for: clause |
Increase scrape_interval to 30s and for: to 5m |
| Memory chart flat at 0 |
maxmemory not set, exporter skips metric |
Define maxmemory in redis.conf or rely on redis_memory_used_bytes alone |
High connected_clients but low latency |
Stale connections from old n8n pods |
Enable client-timeout or run CLIENT KILL TYPE normal post‑deploy |
9. Production‑Grade Enhancements
- TLS‑Secured Exporter – Place the exporter behind an NGINX sidecar with mTLS; use
--tls-client-ca and --tls-client-cert.
- Multi‑Tenant Labels – For multiple n8n instances, add
instance="n8n-prod" / instance="n8n-staging" to both exporter env and Prometheus job.
- Auto‑Scaling Hook – Wire an Alertmanager webhook to a Kubernetes HPA that adds n8n workers when
connected_clients > 800.
- Long‑Term Retention – Configure Prometheus remote‑write to Thanos or Cortex to keep Redis health history for compliance audits.
Conclusion
By instrumenting Redis with redis_exporter, scraping it via Prometheus, visualizing the core n8n metrics in a purpose‑built Grafana dashboard, and wiring sensible Alertmanager rules, you gain immediate visibility into the health factors that directly affect n8n workflow execution. The approach is lightweight, production‑ready, and scales from a single‑node deployment to multi‑tenant, HA Redis clusters—ensuring n8n remains reliable under real‑world load.