PageSourceSearch

https://montplex.com/static/js/async/2846.71d63eab.js

js montplex.com collected 2026-10-03 21:16:25 UTC 12,932 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkengula_website=self.webpackChunkengula_website||[]).push([["2846"],{8172:function(e,n,r){r.r(n),r.d(n,{default:()=>d});var s=r(2676),t=r(453);function a(e){let n=Object.assign({h1:"h1",a:"a",h2:"h2",p:"p",strong:"strong",h3:"h3",ul:"ul",li:"li",pre:"pre",code:"code",table:"table",thead:"thead",tr:"tr",th:"th",tbody:"tbody",td:"td"},(0,t.ah)(),e.components);return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.h1,{id:"monitoring-engula",children:["Monitoring Engula",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#monitoring-engula",children:"#"})]}),"\n",(0,s.jsxs)(n.h2,{id:"overview",children:["Overview",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#overview",children:"#"})]}),"\n",(0,s.jsxs)(n.p,{children:["Engula maintains a high degree of consistency with Redis/Valkey 7.2 on the monitoring-related protocol surface, so you can reuse the mature Redis monitoring ecosystem. This article uses ",(0,s.jsx)(n.strong,{children:"Redis Exporter"})," + ",(0,s.jsx)(n.strong,{children:"Prometheus"})," + ",(0,s.jsx)(n.strong,{children:"Grafana"})," as an example to explain how to quickly set up Engula monitoring and reuse the widely adopted Redis Dashboard templates from the community."]}),"\n",(0,s.jsxs)(n.h3,{id:"key-advantage-no-customization-required",children:["Key Advantage: No Customization Required",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#key-advantage-no-customization-required",children:"#"})]}),"\n",(0,s.jsxs)(n.p,{children:["Because Engula implements the Redis protocol, existing monitoring tools can typically be used ",(0,s.jsx)(n.strong,{children:"without modification"}),", including:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Production-proven monitoring solutions and alerting experience"}),"\n",(0,s.jsx)(n.li,{children:"A rich set of Grafana Dashboard templates and metric coverage"}),"\n",(0,s.jsx)(n.li,{children:"A mature Prometheus collection and querying system"}),"\n"]}),"\n",(0,s.jsxs)(n.h2,{id:"architecture",children:["Architecture",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#architecture",children:"#"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"┌─────────────┐    ┌────────────────┐    ┌─────────────┐    ┌─────────────┐\n│   Engula    │───▶│ Redis Exporter │───▶│ Prometheus  │───▶│   Grafana   │\n│   Server(s) │    │ (oliver006)    │    │   Server    │    │  Dashboard  │\n└─────────────┘    └────────────────┘    └─────────────┘    └─────────────┘\n     6379               9121                9090               3000\n"})}),"\n",(0,s.jsxs)(n.h2,{id:"quick-start-docker-compose",children:["Quick Start (Docker Compose)",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#quick-start-docker-compose",children:"#"})]}),"\n",(0,s.jsxs)(n.p,{children:["The following is a quick deployment example (replace ",(0,s.jsx)(n.code,{children:"engula-server:6379"})," with your actual address):"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-text",children:"# docker-compose.yml\nversion: '3.8'\n\nservices:\n  redis-exporter:\n    image: oliver006/redis_exporter:latest\n    container_name: engula-redis-exporter\n    restart: unless-stopped\n    ports:\n      - \"9121:9121\"\n    environment:\n      - REDIS_ADDR=redis://engula-server:6379\n    command:\n      - '-redis.addr=redis://engula-server:6379'\n    networks:\n      - monitoring\n\n  prometheus:\n    image: prom/prometheus:latest\n    container_name: engula-prometheus\n    restart: unless-stopped\n    ports:\n      - \"9090:9090\"\n    volumes:\n      - ./prometheus.yml:/etc/prometheus/prometheus.yml\n      - prometheus_data:/prometheus\n    command:\n      - '--config.file=/etc/prometheus/prometheus.yml'\n      - '--storage.tsdb.path=/prometheus'\n      - '--storage.tsdb.retention.time=200h'\n      - '--web.enable-lifecycle'\n    networks:\n      - monitoring\n\n  grafana:\n    image: grafana/grafana:latest\n    container_name: engula-grafana\n    restart: unless-stopped\n    ports:\n      - \"3000:3000\"\n    environment:\n      - GF_SECURITY_ADMIN_USER=admin\n      - GF_SECURITY_ADMIN_PASSWORD=admin123\n    volumes:\n      - grafana_data:/var/lib/grafana\n    networks:\n      - monitoring\n\nvolumes:\n  prometheus_data:\n  grafana_data:\n\nnetworks:\n  monitoring:\n    driver: bridge\n"})}),"\n",(0,s.jsx)(n.p,{children:"Start:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"docker-compose up -d\n"})}),"\n",(0,s.jsxs)(n.h2,{id:"component-configuration",children:["Component Configuration",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#component-configuration",children:"#"})]}),"\n",(0,s.jsxs)(n.h3,{id:"1-redis-exporter",children:["1) Redis Exporter",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#1-redis-exporter",children:"#"})]}),"\n",(0,s.jsx)(n.p,{children:"Redis Exporter connects to Engula via the Redis protocol and exposes metrics in Prometheus format."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"# Single instance\ndocker run -d \\\n  --name engula-redis-exporter \\\n  -p 9121:9121 \\\n  oliver006/redis_exporter:latest \\\n  -redis.addr=redis://localhost:6379\n\n# Multiple instances\ndocker run -d \\\n  --name multi-redis-exporter \\\n  -p 9121:9121 \\\n  oliver006/redis_exporter:latest \\\n  -redis.addr=redis://engula-1:6379,redis://engula-2:6379,redis://engula-3:6379\n\n# With authentication\ndocker run -d \\\n  --name secure-redis-exporter \\\n  -p 9121:9121 \\\n  oliver006/redis_exporter:latest \\\n  -redis.addr=redis://engula-secure:6379 \\\n  -redis.password=your-password\n"})}),"\n",(0,s.jsx)(n.p,{children:"Common parameters:"}),"\n",(0,s.jsxs)(n.table,{children:["\n",(0,s.jsxs)(n.thead,{children:["\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.th,{children:"Parameter"}),"\n",(0,s.jsx)(n.th,{children:"Description"}),"\n",(0,s.jsx)(n.th,{children:"Example"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.tbody,{children:["\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"-redis.addr"})}),"\n",(0,s.jsx)(n.td,{children:"Engula address"}),"\n",(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"redis://localhost:6379"})}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"-redis.password"})}),"\n",(0,s.jsx)(n.td,{children:"Authentication password"}),"\n",(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"-redis.password=mypass123"})}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"-namespace"})}),"\n",(0,s.jsx)(n.td,{children:"Metric namespace"}),"\n",(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"-namespace=engula"})}),"\n"]}),"\n",(0,s.jsxs)(n.tr,{children:["\n",(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"-web.listen-address"})}),"\n",(0,s.jsx)(n.td,{children:"Exporter listening port"}),"\n",(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"-web.listen-address=:9121"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Verify the Exporter:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"curl http://localhost:9121/metrics\n"})}),"\n",(0,s.jsxs)(n.h3,{id:"2-prometheus",children:["2) Prometheus",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#2-prometheus",children:"#"})]}),"\n",(0,s.jsxs)(n.p,{children:["Create ",(0,s.jsx)(n.code,{children:"prometheus.yml"})," to collect metrics from Redis Exporter:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-text",children:"global:\n  scrape_interval: 15s\n  evaluation_interval: 15s\n\nscrape_configs:\n  - job_name: 'engula'\n    static_configs:\n      - targets: ['redis-exporter:9121']\n    scrape_interval: 15s\n    metrics_path: /metrics\n"})}),"\n",(0,s.jsx)(n.p,{children:"Verify targets:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"curl http://localhost:9090/targets\n"})}),"\n",(0,s.jsxs)(n.h3,{id:"3-grafana",children:["3) Grafana",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#3-grafana",children:"#"})]}),"\n",(0,s.jsxs)(n.p,{children:["Visit ",(0,s.jsx)(n.code,{children:"http://localhost:3000"})," (default admin/admin123) and add a Prometheus data source:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Name: ",(0,s.jsx)(n.code,{children:"Engula-Prometheus"})]}),"\n",(0,s.jsxs)(n.li,{children:["URL: ",(0,s.jsx)(n.code,{children:"http://prometheus:9090"})," (locally you can also use ",(0,s.jsx)(n.code,{children:"http://localhost:9090"}),")"]}),"\n"]}),"\n",(0,s.jsxs)(n.h2,{id:"recommended-dashboard-template",children:["Recommended Dashboard Template",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#recommended-dashboard-template",children:"#"})]}),"\n",(0,s.jsx)(n.p,{children:"One of the most commonly used Redis Dashboard templates in the community:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Dashboard ID:"})," 763"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Author:"})," oliver006"]}),"\n"]}
1),"\n",(0,s.jsxs)(n.p,{children:["Import path: Grafana → Import → enter ",(0,s.jsx)(n.code,{children:"763"})," → select data source ",(0,s.jsx)(n.code,{children:"Engula-Prometheus"}),"."]}),"\n",(0,s.jsxs)(n.h2,{id:"common-metric-examples-promql",children:["Common Metric Examples (PromQL)",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#common-metric-examples-promql",children:"#"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-promql",children:"# Commands per second (QPS)\nrate(redis_commands_processed_total[5m])\n\n# Connection count\nredis_connected_clients\n\n# Memory usage\nredis_memory_used_bytes\nredis_memory_max_bytes\n\n# Hit rate\n(redis_keyspace_hits_total / (redis_keyspace_hits_total + redis_keyspace_misses_total)) * 100\n"})}),"\n",(0,s.jsxs)(n.h2,{id:"best-practices",children:["Best Practices",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#best-practices",children:"#"})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Scrape interval: 15–30s is sufficient for most scenarios; shorten as needed for high-frequency scenarios"}),"\n",(0,s.jsx)(n.li,{children:"Storage retention: typically 15–30 days in production environments"}),"\n",(0,s.jsx)(n.li,{children:"Security: in production, it is recommended to enable authentication, network isolation, and configure TLS for external access"}),"\n"]}),"\n",(0,s.jsxs)(n.h2,{id:"resources",children:["Resources",(0,s.jsx)(n.a,{className:"header-anchor","aria-hidden":"true",href:"#resources",children:"#"})]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Redis Exporter: ",(0,s.jsx)(n.a,{href:"https://github.com/oliver006/redis_exporter",target:"_blank",rel:"noopener noreferrer",children:"https://github.com/oliver006/redis_exporter"})]}),"\n",(0,s.jsxs)(n.li,{children:["Prometheus: ",(0,s.jsx)(n.a,{href:"https://prometheus.io/docs/",target:"_blank",rel:"noopener noreferrer",children:"https://prometheus.io/docs/"})]}),"\n",(0,s.jsxs)(n.li,{children:["Grafana: ",(0,s.jsx)(n.a,{href:"https://grafana.com/docs/",target:"_blank",rel:"noopener noreferrer",children:"https://grafana.com/docs/"})]}),"\n"]})]})}function i(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{wrapper:n}=Object.assign({},(0,t.ah)(),e.components);return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}let d=i;i.__RSPRESS_PAGE_META={},i.__RSPRESS_PAGE_META["en%2Fdocs%2Fproduction%2Fmonitor.md"]={toc:[{text:"Overview",id:"overview",depth:2},{text:"Key Advantage: No Customization Required",id:"key-advantage-no-customization-required",depth:3},{text:"Architecture",id:"architecture",depth:2},{text:"Quick Start (Docker Compose)",id:"quick-start-docker-compose",depth:2},{text:"Component Configuration",id:"component-configuration",depth:2},{text:"1) Redis Exporter",id:"1-redis-exporter",depth:3},{text:"2) Prometheus",id:"2-prometheus",depth:3},{text:"3) Grafana",id:"3-grafana",depth:3},{text:"Recommended Dashboard Template",id:"recommended-dashboard-template",depth:2},{text:"Common Metric Examples (PromQL)",id:"common-metric-examples-promql",depth:2},{text:"Best Practices",id:"best-practices",depth:2},{text:"Resources",id:"resources",depth:2}],title:"Monitoring Engula",headingTitle:"Monitoring Engula",frontmatter:{}}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.