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.