Prometheus監控 Redis & Redis Cluster 說明
說明
在前面的Prometheus + Grafana 部署說明之「安裝」文章裡,大致介紹說明了Prometheus和Grafana的一些安裝使用,現在開始如何始部署Prometheus+Grafana 來監控Redis
部署
在之前介紹的Prometheus系列文章裡,已經瞭解了Prometheus是通過拉取的方式來儲存監控資料的,可以自己寫一個服務來去Redis來獲取需要監控的相關指標,也可以直接用現成的exporter,如GitHub上redis_exporter,本文對Redis的監控是通過該匯出器進行的。
下載&解壓:
#下載
wget https://github.com/oliver006/redis_exporter/releases/download/v1.3.5/redis_exporter-v1.3.5.linux-amd64.tar.gz#解壓
tar xvf redis_exporter-v1.3.5.linux-amd64.tar.gz
注意:redis_exporter 版本從 0.x to 1.x 有了很大的改變:為了使redis_exporter更緊密地遵循“編寫匯出器的最佳實踐”,不再直接支援配置(和抓取)多個Redis例項,而是將這一任務推給了Prometheus伺服器,具體情況可以看作者說明。如果需要抓取多個例項,請檢視如何配置Prometheus伺服器以刮取多個例項。
但如果已經按照Prometheus專案的推薦使用了匯出器,並且僅scrape了一個例項(例如使用--redis.addr和--redis.password 標誌),那麼沒有任何改變。
準備:
1)在開啟redis_exporter [v1.3.5]之前,需要先配置Prometheus,按照Prometheus + Grafana 部署說明之「安裝」裝好Prometheus之後,修改其配置檔案。本次示例是通過檔案服務發現來處理的,因為監控服務的同時也要監控系統相關的指標,所以需要node_exporter和redis_exporter。檔案發現機制有2種方式:exporter配置可以放到一個檔案,也可以為每個例項單獨配置檔案。如放到一個配置檔案:
① 多例項相同密碼的抓取(只需要一個redis-exporter),叢集資訊:
3節點無從,密碼 abc 192.168.163.132、133、134 -- 6379 192.168.163.132、133、134 -- 6380
1.1 exporter配置放到一個檔案的相關配置:
prometheus.yml:
global: scrape_interval: 10s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 10s # Evaluate rules every 15 seconds. The default is every 1 minute. alerting: alertmanagers: - static_configs: - targets: # - alertmanager:9093 rule_files: # - "first_rules.yml" # - "second_rules.yml" scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['192.168.163.132:9099'] - job_name: 'node_exporter' scrape_interval: 1s file_sd_configs: - files: - targets/node/nodes-instances.json refresh_interval: 10s relabel_configs: - action: replace source_labels: ['__address__'] regex: (.*):(.*) replacement: $1 target_label: hostname - action: labeldrop regex: __meta_filepath - job_name: 'redis_exporter' scrape_interval: 1s file_sd_configs: - files: - targets/redis/redis-instances.json metrics_path: /scrape relabel_configs: - action: replace source_labels: ['__address__'] regex: (.*):(.*) replacement: $1 target_label: hostip - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: 192.168.163.132:9123View Code
nodes-instances.json:
[ { "targets": [ "192.168.163.132:9199", "192.168.163.133:9199","192.168.163.134:9199"] } ]View Code
redis-instances.json:
[ { "targets": [ "192.168.163.132:6379","192.168.163.133:6379","192.168.163.134:6379"], "labels": {"env":"test","cluster":"test_one"} }, { "targets": [ "192.168.163.132:6380","192.168.163.133:6380","192.168.163.134:6380"], "labels": {"env":"test","cluster":"test_two"} } ]View Code
以後如果有相關的例項叢集包括主從加進來,只要修改以上2個exporter檔案即可。最後開啟exporter:
#各個節點執行 node-exporter: ./node_exporter --web.listen-address=:9199 #指定節點執行 redis_exporter: ./redis_exporter -redis-only-metrics -redis.password abc -web.listen-address=:9123
1.2 exporter配置獨立存放的相關配置:
prometheus.yml:
global: scrape_interval: 10s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 10s # Evaluate rules every 15 seconds. The default is every 1 minute. alerting: alertmanagers: - static_configs: - targets: # - alertmanager:9093 rule_files: # - "first_rules.yml" # - "second_rules.yml" scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['192.168.163.132:9099'] - job_name: 'node_exporter' scrape_interval: 1s file_sd_configs: - files: - targets/node/*.yml refresh_interval: 10s relabel_configs: - action: replace source_labels: ['__address__'] regex: (.*):(.*) replacement: $1 target_label: hostname - action: labeldrop regex: __meta_filepath - job_name: 'redis_exporter' scrape_interval: 1s file_sd_configs: - files: - targets/redis/*.yml metrics_path: /scrape relabel_configs: - action: replace source_labels: ['__address__'] regex: (.*):(.*) replacement: $1 target_label: hostip - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: 192.168.163.132:9123View Code
targets/node/*.yml:
# ls -lh /etc/prometheus/targets/node/*.yml -rw-r--r-- 1 root root 117 4月 18 14:51 /etc/prometheus/targets/node/test2_node_exporter.yml -rw-r--r-- 1 root root 117 4月 18 14:51 /etc/prometheus/targets/node/test3_node_exporter.yml -rw-r--r-- 1 root root 117 4月 18 14:51 /etc/prometheus/targets/node/test4_node_exporter.yml # cat /etc/prometheus/targets/node/test2_node_exporter.yml [ { "targets": ["192.168.163.132:9199"], "labels": {"env":"test","alias":"test2"} } ] # cat /etc/prometheus/targets/node/test3_node_exporter.yml [ { "targets": ["192.168.163.133:9199"], "labels": {"env":"test","alias":"test3"} } ] # cat /etc/prometheus/targets/node/test4_node_exporter.yml [ { "targets": ["192.168.163.134:9199"], "labels": {"env":"test","alias":"test4"} } ]View Code
targets/redis/*.yml:
# ls -lh /etc/prometheus/targets/redis/*.yml -rw-r--r-- 1 root root 121 4月 18 13:14 /etc/prometheus/targets/redis/test2_6379_redis_exporter.yml -rw-r--r-- 1 root root 121 4月 18 13:14 /etc/prometheus/targets/redis/test2_6380_redis_exporter.yml -rw-r--r-- 1 root root 121 4月 18 13:14 /etc/prometheus/targets/redis/test3_6379_redis_exporter.yml -rw-r--r-- 1 root root 121 4月 18 13:15 /etc/prometheus/targets/redis/test3_6380_redis_exporter.yml -rw-r--r-- 1 root root 121 4月 18 13:14 /etc/prometheus/targets/redis/test4_6379_redis_exporter.yml -rw-r--r-- 1 root root 121 4月 18 13:15 /etc/prometheus/targets/redis/test4_6380_redis_exporter.yml # cat /etc/prometheus/targets/redis/test2_6379_redis_exporter.yml [ { "targets": [ "192.168.163.132:6379"], "labels": {"env":"test","cluster":"test_one","alias":"test2"} } ] # cat /etc/prometheus/targets/redis/test3_6379_redis_exporter.yml [ { "targets": [ "192.168.163.133:6379"], "labels": {"env":"test","cluster":"test_one","alias":"test3"} } ] # cat /etc/prometheus/targets/redis/test4_6379_redis_exporter.yml [ { "targets": [ "192.168.163.134:6379"], "labels": {"env":"test","cluster":"test_one","alias":"test4"} } ] # cat /etc/prometheus/targets/redis/test2_6380_redis_exporter.yml [ { "targets": [ "192.168.163.132:6380"], "labels": {"env":"test","cluster":"test_two","alias":"test2"} } ] # cat /etc/prometheus/targets/redis/test3_6380_redis_exporter.yml [ { "targets": [ "192.168.163.133:6380"], "labels": {"env":"test","cluster":"test_two","alias":"test3"} } ] # cat /etc/prometheus/targets/redis/test4_6380_redis_exporter.yml [ { "targets": [ "192.168.163.134:6380"], "labels": {"env":"test","cluster":"test_two","alias":"test4"} } ]View Code
以後如果有相關的例項叢集加進來包括主從,只要新增2類exporter檔案即可。最後開啟exporter:
#各個節點執行 node-exporter: ./node_exporter --web.listen-address=:9199 #指定節點執行 redis_exporter: ./redis_exporter -redis-only-metrics -redis.password abc -web.listen-address=:9123
以上2種通過檔案服務發現的方法,推薦第2個。因為新增的檔案有問題也不影響服務,修改檔案可能會引發問題;並且也可以為各個節點打需要的labels。
最後配置Grafana,效果:
JSON Model:
{ "annotations": { "list": [ { "builtIn": 1, "datasource": "-- Grafana --", "enable": true, "hide": true, "iconColor": "rgba(0, 211, 255, 1)", "name": "Annotations & Alerts", "type": "dashboard" } ] }, "editable": true, "gnetId": null, "graphTooltip": 0, "id": 13, "iteration": 1587194136640, "links": [], "panels": [ { "cacheTimeout": null, "colorBackground": false, "colorValue": true, "colors": [ "#299c46", "rgba(237, 129, 40, 0.89)", "#d44a3a" ], "datasource": null, "description": "叢集個數", "format": "none", "gauge": { "maxValue": 100, "minValue": 0, "show": false, "thresholdLabels": false, "thresholdMarkers": true }, "gridPos": { "h": 3, "w": 5, "x": 0, "y": 0 }, "id": 8, "interval": null, "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "nullPointMode": "connected", "nullText": null, "postfix": "", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "50%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "rgb(31, 120, 193)", "show": false, "ymax": null, "ymin": null }, "tableColumn": "", "targets": [ { "expr": "count(count(redis_up{cluster=~\"$cluster\"}>0) by (cluster))", "interval": "", "legendFormat": "", "refId": "A" } ], "thresholds": "", "timeFrom": null, "timeShift": null, "title": "叢集個數", "type": "singlestat", "valueFontSize": "100%", "valueMaps": [ { "op": "=", "text": "N/A", "value": "null" } ], "valueName": "current" }, { "cacheTimeout": null, "colorBackground": false, "colorValue": true, "colors": [ "#299c46", "rgba(237, 129, 40, 0.89)", "#d44a3a" ], "datasource": null, "description": "叢集節點數量", "format": "none", "gauge": { "maxValue": 100, "minValue": 0, "show": false, "thresholdLabels": false, "thresholdMarkers": true }, "gridPos": { "h": 3, "w": 5, "x": 5, "y": 0 }, "id": 4, "interval": null, "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "nullPointMode": "connected", "nullText": null, "postfix": "", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "50%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "rgb(31, 120, 193)", "show": false, "ymax": null, "ymin": null }, "tableColumn": "", "targets": [ { "expr": "count(redis_up{cluster=~\"$cluster\"})", "interval": "", "legendFormat": "", "refId": "A" } ], "thresholds": "", "timeFrom": null, "timeShift": null, "title": "叢集節點數", "type": "singlestat", "valueFontSize": "100%", "valueMaps": [ { "op": "=", "text": "N/A", "value": "null" } ], "valueName": "current" }, { "cacheTimeout": null, "colorBackground": false, "colorValue": true, "colors": [ "#299c46", "rgba(237, 129, 40, 0.89)", "#d44a3a" ], "datasource": null, "description": "叢集活躍節點數量", "format": "none", "gauge": { "maxValue": 100, "minValue": 0, "show": false, "thresholdLabels": false, "thresholdMarkers": true }, "gridPos": { "h": 3, "w": 4, "x": 10, "y": 0 }, "id": 6, "interval": null, "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "nullPointMode": "connected", "nullText": null, "postfix": "", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "50%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "rgb(31, 120, 193)", "show": false, "ymax": null, "ymin": null }, "tableColumn": "", "targets": [ { "expr": "count(redis_up{cluster=~\"$cluster\"}>0)", "interval": "", "legendFormat": "", "refId": "A" } ], "thresholds": "", "timeFrom": null, "timeShift": null, "title": "叢集活躍節點數", "type": "singlestat", "valueFontSize": "100%", "valueMaps": [ { "op": "=", "text": "N/A", "value": "null" } ], "valueName": "current" }, { "cacheTimeout": null, "colorBackground": false, "colorPrefix": false, "colorValue": true, "colors": [ "#299c46", "rgba(237, 129, 40, 0.89)", "#d44a3a" ], "datasource": null, "description": "主節點數量", "format": "none", "gauge": { "maxValue": 100, "minValue": 0, "show": false, "thresholdLabels": false, "thresholdMarkers": true }, "gridPos": { "h": 3, "w": 5, "x": 14, "y": 0 }, "id": 10, "interval": null, "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "nullPointMode": "connected", "nullText": null, "postfix": "", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "50%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "rgb(31, 120, 193)", "show": false, "ymax": null, "ymin": null }, "tableColumn": "", "targets": [ { "expr": "count(redis_instance_info{cluster=~\"$cluster\", role=\"master\"})", "interval": "", "legendFormat": "", "refId": "A" } ], "thresholds": "", "timeFrom": null, "timeShift": null, "title": "主節點個數", "type": "singlestat", "valueFontSize": "100%", "valueMaps": [ { "op": "=", "text": "N/A", "value": "null" } ], "valueName": "current" }, { "cacheTimeout": null, "colorBackground": false, "colorValue": true, "colors": [ "#299c46", "rgba(237, 129, 40, 0.89)", "#d44a3a" ], "datasource": null, "description": "從節點數量", "format": "none", "gauge": { "maxValue": 100, "minValue": 0, "show": false, "thresholdLabels": false, "thresholdMarkers": true }, "gridPos": { "h": 3, "w": 5, "x": 19, "y": 0 }, "id": 12, "interval": null, "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "nullPointMode": "connected", "nullText": null, "postfix": "", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "50%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "rgb(31, 120, 193)", "show": false, "ymax": null, "ymin": null }, "tableColumn": "", "targets": [ { "expr": "count(redis_instance_info{cluster=~\"$cluster\", role=\"slave\"})", "interval": "", "legendFormat": "", "refId": "A" } ], "thresholds": "", "timeFrom": null, "timeShift": null, "title": "從節點個數", "type": "singlestat", "valueFontSize": "100%", "valueMaps": [ { "op": "=", "text": "N/A", "value": "null" } ], "valueName": "current" }, { "aliasColors": {}, "bars": false, "dashLength": 10, "dashes": false, "datasource": null, "description": "Redus Cluster OPS指標", "fill": 1, "fillGradient": 0, "gridPos": { "h": 8, "w": 12, "x": 0, "y": 3 }, "hiddenSeries": false, "id": 16, "legend": { "avg": false, "current": false, "max": false, "min": false, "show": true, "total": false, "values": false }, "lines": true, "linewidth": 1, "nullPointMode": "null", "options": { "dataLinks": [] }, "percentage": false, "pointradius": 2, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "expr": "ceil(sum(rate(redis_commands_processed_total{cluster=~\"$cluster\",instance=~\"$master\"}[$interval])) by (cluster))", "interval": "5s", "legendFormat": "{{cluster}}", "refId": "A" } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, "title": "Redis Cluster OPS", "tooltip": { "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true } ], "yaxis": { "align": false, "alignLevel": null } }, { "aliasColors": {}, "bars": false, "dashLength": 10, "dashes": false, "datasource": null, "description": "Redis 記憶體使用大小值", "fill": 1, "fillGradient": 0, "gridPos": { "h": 8, "w": 12, "x": 12, "y": 3 }, "hiddenSeries": false, "id": 18, "legend": { "avg": false, "current": false, "max": false, "min": false, "show": true, "total": false, "values": false }, "lines": true, "linewidth": 1, "nullPointMode": "null", "options": { "dataLinks": [] }, "percentage": false, "pointradius": 2, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "expr": "redis_memory_used_bytes{instance=~\"$instance\"} ", "interval": "5s", "legendFormat": "{{instance}}", "refId": "A" } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, "title": "Redis 記憶體使用大小", "tooltip": { "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "bytes", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true } ], "yaxis": { "align": false, "alignLevel": null } }, { "aliasColors": {}, "bars": false, "dashLength": 10, "dashes": false, "datasource": null, "description": "Redis Server CPU使用率", "fill": 1, "fillGradient": 0, "gridPos": { "h": 8, "w": 12, "x": 0, "y": 11 }, "hiddenSeries": false, "id": 14, "legend": { "avg": false, "current": false, "max": false, "min": false, "show": true, "total": false, "values": false }, "lines": true, "linewidth": 1, "nullPointMode": "null", "options": { "dataLinks": [] }, "percentage": false, "pointradius": 2, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "expr": "100* (rate(redis_cpu_sys_seconds_total{instance=~\"$instance\"}[$interval]) + rate(redis_cpu_user_seconds_total{instance=~\"$instance\"}[$interval]))", "interval": "5s", "legendFormat": "{{instance}}", "refId": "A" } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, "title": "Redis CPU使用率", "tooltip": { "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "percent", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true } ], "yaxis": { "align": false, "alignLevel": null } }, { "aliasColors": {}, "bars": false, "dashLength": 10, "dashes": false, "datasource": null, "description": "Redis 記憶體使用率", "fill": 1, "fillGradient": 0, "gridPos": { "h": 8, "w": 12, "x": 12, "y": 11 }, "hiddenSeries": false, "id": 20, "legend": { "avg": false, "current": false, "max": false, "min": false, "show": true, "total": false, "values": false }, "lines": true, "linewidth": 1, "nullPointMode": "null", "options": { "dataLinks": [] }, "percentage": false, "pointradius": 2, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "expr": "(redis_memory_used_bytes{instance=~\"$instance\"} / redis_config_maxmemory{instance=~\"$instance\"}) * 100", "interval": "5s", "legendFormat": "{{instance}}", "refId": "A" } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, "title": "Redis 記憶體使用率", "tooltip": { "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "percent", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true } ], "yaxis": { "align": false, "alignLevel": null } }, { "aliasColors": {}, "bars": false, "dashLength": 10, "dashes": false, "datasource": null, "description": "各個節點系統CPU使用率", "fill": 1, "fillGradient": 0, "gridPos": { "h": 8, "w": 12, "x": 0, "y": 19 }, "hiddenSeries": false, "id": 24, "legend": { "avg": false, "current": false, "max": false, "min": false, "show": true, "total": false, "values": false }, "lines": true, "linewidth": 1, "nullPointMode": "null", "options": { "dataLinks": [] }, "percentage": false, "pointradius": 2, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "expr": "topk(3,clamp_max((avg by (hostname,mode) ((clamp_max(rate(node_cpu_seconds_total{hostname=~\"$host\",mode!=\"idle\"}[$interval]),1)) or (clamp_max(irate(node_cpu_seconds_total{hostname=~\"$host\",mode!=\"idle\"}[5m]),1)) ))*100,100))", "hide": true, "interval": "", "legendFormat": "{{mode}}", "refId": "A" }, { "expr": "1 - avg by (hostname)(rate(node_cpu_seconds_total{hostname=~\"$host\", mode=\"idle\"}[$interval]))", "interval": "", "legendFormat": "{{hostname}}", "refId": "B" } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, "title": "系統CPU使用率", "tooltip": { "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "percentunit", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true } ], "yaxis": { "align": false, "alignLevel": null } }, { "aliasColors": {}, "bars": false, "dashLength": 10, "dashes": false, "datasource": null, "description": "各個節點系統實體記憶體利用率", "fill": 1, "fillGradient": 0, "gridPos": { "h": 8, "w": 12, "x": 12, "y": 19 }, "hiddenSeries": false, "id": 30, "legend": { "avg": false, "current": false, "max": false, "min": false, "show": true, "total": false, "values": false }, "lines": true, "linewidth": 1, "nullPointMode": "null", "options": { "dataLinks": [] }, "percentage": false, "pointradius": 2, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "expr": "(node_memory_Cached_bytes{hostname=~\"$host\"} + node_memory_Buffers_bytes{hostname=~\"$host\"} + node_memory_MemFree_bytes{hostname=~\"$host\"})/node_memory_MemTotal_bytes{hostname=~\"$host\"}", "hide": true, "interval": "", "legendFormat": "{{hostname}}", "refId": "A" }, { "expr": "((node_memory_MemTotal_bytes{hostname=~\"$host\"} - (node_memory_MemAvailable_bytes{hostname=~\"$host\"} or (node_memory_MemFree_bytes{hostname=~\"$host\"} + node_memory_Buffers_bytes{hostname=~\"$host\"} + node_memory_Cached_bytes{hostname=~\"$host\"})))*100 / node_memory_MemTotal_bytes{hostname=~\"$host\"})", "hide": false, "interval": "", "legendFormat": "{{hostname}}", "refId": "B" } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, "title": "系統實體記憶體利用率", "tooltip": { "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "percent", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true } ], "yaxis": { "align": false, "alignLevel": null } }, { "aliasColors": {}, "bars": true, "cacheTimeout": null, "dashLength": 10, "dashes": false, "datasource": null, "description": "各個節點系統磁碟使用率", "fill": 1, "fillGradient": 0, "gridPos": { "h": 8, "w": 12, "x": 0, "y": 27 }, "hiddenSeries": false, "id": 32, "legend": { "avg": false, "current": false, "max": false, "min": false, "show": true, "total": false, "values": false }, "lines": false, "linewidth": 1, "links": [], "nullPointMode": "null", "options": { "dataLinks": [] }, "percentage": false, "pluginVersion": "6.7.2", "pointradius": 2, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "expr": "topk(10,max((1 - node_filesystem_avail_bytes{hostname=~\"$host\", fstype!~\"rootfs|selinuxfs|autofs|rpc_pipefs|tmpfs\"} / node_filesystem_size_bytes{hostname=~\"$host\", fstype!~\"rootfs|selinuxfs|autofs|rpc_pipefs|tmpfs\"})*100) by (hostname) > 0)", "interval": "", "legendFormat": "{{hostname}}", "refId": "A" } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, "title": "系統磁碟使用率", "tooltip": { "shared": false, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "series", "name": null, "show": true, "values": [ "current" ] }, "yaxes": [ { "format": "percent", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true } ], "yaxis": { "align": false, "alignLevel": null } }, { "aliasColors": {}, "bars": false, "dashLength": 10, "dashes": false, "datasource": null, "description": "各個節點以及叢集的 KEYS 總數", "fill": 1, "fillGradient": 0, "gridPos": { "h": 8, "w": 12, "x": 12, "y": 27 }, "hiddenSeries": false, "id": 22, "legend": { "avg": false, "current": false, "max": false, "min": false, "show": true, "total": false, "values": false }, "lines": true, "linewidth": 1, "nullPointMode": "null", "options": { "dataLinks": [] }, "percentage": false, "pointradius": 2, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "expr": "sum(redis_db_keys{instance=~\"$master\"}) by (instance,db)", "interval": "", "legendFormat": "{{instance}}", "refId": "A" }, { "expr": "sum(redis_db_keys{instance=~\"$master\"}) by (cluster)", "interval": "", "legendFormat": "{{cluster}}_total", "refId": "B" } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, "title": "KEYS 總數", "tooltip": { "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true } ], "yaxis": { "align": false, "alignLevel": null } }, { "aliasColors": {}, "bars": false, "dashLength": 10, "dashes": false, "datasource": null, "description": "各個節點活躍連線數", "fill": 1, "fillGradient": 0, "gridPos": { "h": 8, "w": 12, "x": 0, "y": 35 }, "hiddenSeries": false, "id": 26, "legend": { "avg": false, "current": false, "max": false, "min": false, "show": true, "total": false, "values": false }, "lines": true, "linewidth": 1, "nullPointMode": "null", "options": { "dataLinks": [] }, "percentage": false, "pointradius": 2, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "expr": "redis_connected_clients{instance=~\"$instance\"}", "interval": "", "legendFormat": "{{hostip}}", "refId": "A" } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, "title": "活躍連線數", "tooltip": { "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true } ], "yaxis": { "align": false, "alignLevel": null } }, { "aliasColors": {}, "bars": false, "dashLength": 10, "dashes": false, "datasource": null, "description": "各個節點記憶體碎片率", "fill": 1, "fillGradient": 0, "gridPos": { "h": 8, "w": 12, "x": 12, "y": 35 }, "hiddenSeries": false, "id": 28, "legend": { "avg": false, "current": false, "max": false, "min": false, "show": true, "total": false, "values": false }, "lines": true, "linewidth": 1, "nullPointMode": "null", "options": { "dataLinks": [] }, "percentage": false, "pointradius": 2, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "expr": "redis_mem_fragmentation_ratio{instance=~\"$instance\"}", "interval": "", "legendFormat": "{{instance}}", "refId": "A" } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, "title": "記憶體碎片率", "tooltip": { "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true } ], "yaxis": { "align": false, "alignLevel": null } }, { "aliasColors": {}, "bars": false, "dashLength": 10, "dashes": false, "datasource": null, "description": "各個節點 的負載", "fill": 1, "fillGradient": 0, "gridPos": { "h": 8, "w": 12, "x": 0, "y": 43 }, "hiddenSeries": false, "id": 34, "legend": { "avg": false, "current": false, "max": false, "min": false, "show": true, "total": false, "values": false }, "lines": true, "linewidth": 1, "nullPointMode": "null", "options": { "dataLinks": [] }, "percentage": false, "pointradius": 2, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "expr": "node_load1{hostname=~\"$host\"}", "interval": "", "legendFormat": "{{hostname}}", "refId": "A" } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, "title": "負載(Load)", "tooltip": { "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true } ], "yaxis": { "align": false, "alignLevel": null } } ], "refresh": "5s", "schemaVersion": 22, "style": "dark", "tags": [], "templating": { "list": [ { "auto": true, "auto_count": 100, "auto_min": "1s", "current": { "selected": false, "text": "5s", "value": "5s" }, "hide": 0, "label": "interval", "name": "interval", "options": [ { "selected": false, "text": "auto", "value": "$__auto_interval_interval" }, { "selected": true, "text": "5s", "value": "5s" }, { "selected": false, "text": "30s", "value": "30s" }, { "selected": false, "text": "1m", "value": "1m" }, { "selected": false, "text": "10m", "value": "10m" }, { "selected": false, "text": "30m", "value": "30m" }, { "selected": false, "text": "1h", "value": "1h" }, { "selected": false, "text": "6h", "value": "6h" }, { "selected": false, "text": "12h", "value": "12h" }, { "selected": false, "text": "1d", "value": "1d" } ], "query": "5s,30s,1m,10m,30m,1h,6h,12h,1d", "refresh": 2, "skipUrlSync": false, "type": "interval" }, { "allValue": null, "current": { "text": "All", "value": [ "$__all" ] }, "datasource": "Prometheus", "definition": "label_values(redis_up,cluster)", "hide": 0, "includeAll": true, "index": -1, "label": "Cluster", "multi": true, "name": "cluster", "options": [], "query": "label_values(redis_up,cluster)", "refresh": 1, "regex": "", "skipUrlSync": false, "sort": 0, "tagValuesQuery": "", "tags": [], "tagsQuery": "", "type": "query", "useTags": false }, { "allValue": null, "current": { "text": "All", "value": [ "$__all" ] }, "datasource": "Prometheus", "definition": "label_values(redis_instance_info,role)", "hide": 0, "includeAll": true, "index": -1, "label": "Role", "multi": true, "name": "role", "options": [], "query": "label_values(redis_instance_info,role)", "refresh": 1, "regex": "", "skipUrlSync": false, "sort": 0, "tagValuesQuery": "", "tags": [], "tagsQuery": "", "type": "query", "useTags": false }, { "allValue": null, "current": { "text": "All", "value": [ "$__all" ] }, "datasource": "Prometheus", "definition": "label_values(redis_instance_info{cluster=~\"$cluster\",role=~\"$role\"},instance)", "hide": 2, "includeAll": true, "index": -1, "label": "instance", "multi": true, "name": "instance", "options": [], "query": "label_values(redis_instance_info{cluster=~\"$cluster\",role=~\"$role\"},instance)", "refresh": 1, "regex": "", "skipUrlSync": false, "sort": 0, "tagValuesQuery": "", "tags": [], "tagsQuery": "", "type": "query", "useTags": false }, { "allValue": null, "current": { "text": "All", "value": [ "$__all" ] }, "datasource": "Prometheus", "definition": "label_values(redis_instance_info{cluster=~\"$cluster\",role=\"master\"},instance)", "hide": 2, "includeAll": true, "index": -1, "label": "master", "multi": true, "name": "master", "options": [], "query": "label_values(redis_instance_info{cluster=~\"$cluster\",role=\"master\"},instance)", "refresh": 1, "regex": "", "skipUrlSync": false, "sort": 0, "tagValuesQuery": "", "tags": [], "tagsQuery": "", "type": "query", "useTags": false }, { "allValue": null, "current": { "text": "All", "value": [ "$__all" ] }, "datasource": "Prometheus", "definition": "label_values(redis_up{cluster=~\"$cluster\"}, hostip)", "hide": 2, "includeAll": true, "index": -1, "label": "host", "multi": true, "name": "host", "options": [], "query": "label_values(redis_up{cluster=~\"$cluster\"}, hostip)", "refresh": 1, "regex": "", "skipUrlSync": false, "sort": 0, "tagValuesQuery": "", "tags": [], "tagsQuery": "", "type": "query", "useTags": false } ] }, "time": { "from": "now-5m", "to": "now" }, "timepicker": { "refresh_intervals": [ "5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d" ] }, "timezone": "", "title": "Redis_Cluster_V1.35", "uid": "5FfBHG3Zz", "variables": { "list": [] }, "version": 3 }View Code
②:不同密碼多例項抓取,因為使用的是 >1.x 的redis_exporter [v1.3.5],不支援多例項。因為一個export只能指定一個密碼,如果想進行多例項不同密碼抓取的話,所以需要在Prometheus配置多個redis_exporter,叢集資訊為:
3節點無從 192.168.163.132、133、134 -- 6379 密碼 abc 192.168.163.132、133、134 -- 6380 密碼 cba
prometheus.yml:
global: scrape_interval: 10s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 10s # Evaluate rules every 15 seconds. The default is every 1 minute. alerting: alertmanagers: - static_configs: - targets: # - alertmanager:9093 rule_files: # - "first_rules.yml" # - "second_rules.yml" scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['192.168.163.132:9099'] - job_name: 'node_exporter' scrape_interval: 1s file_sd_configs: - files: - targets/node/*.yml refresh_interval: 10s relabel_configs: - action: replace source_labels: ['__address__'] regex: (.*):(.*) replacement: $1 target_label: hostname - action: labeldrop regex: __meta_filepath - job_name: 'redis_exporter_A' scrape_interval: 1s file_sd_configs: - files: - targets/redis/A*.yml metrics_path: /scrape relabel_configs: - action: replace source_labels: ['__address__'] regex: (.*):(.*) replacement: $1 target_label: hostip - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: 192.168.163.132:9123 - job_name: 'redis_exporter_B' scrape_interval: 1s file_sd_configs: - files: - targets/redis/B*.yml metrics_path: /scrape relabel_configs: - action: replace source_labels: ['__address__'] regex: (.*):(.*) replacement: $1 target_label: hostip - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: 192.168.163.132:9124View Code
targets/redis/*.yml:
# ls -lh /etc/prometheus/targets/redis/A*.yml -rw-r--r-- 1 root root 121 4月 18 13:14 /etc/prometheus/targets/redis/Atest2_6379_redis_exporter.yml -rw-r--r-- 1 root root 121 4月 18 13:14 /etc/prometheus/targets/redis/Atest3_6379_redis_exporter.yml -rw-r--r-- 1 root root 121 4月 18 13:14 /etc/prometheus/targets/redis/Atest4_6379_redis_exporter.yml # ls -lh /etc/prometheus/targets/redis/B*.yml -rw-r--r-- 1 root root 121 4月 18 13:14 /etc/prometheus/targets/redis/Btest2_6380_redis_exporter.yml -rw-r--r-- 1 root root 121 4月 18 13:15 /etc/prometheus/targets/redis/Btest3_6380_redis_exporter.yml -rw-r--r-- 1 root root 121 4月 18 13:15 /etc/prometheus/targets/redis/Btest4_6380_redis_exporter.yml # cat /etc/prometheus/targets/redis/Atest2_6379_redis_exporter.yml [ { "targets": [ "192.168.163.132:6379"], "labels": {"env":"test","cluster":"test_one","alias":"test2"} } ] # cat /etc/prometheus/targets/redis/Atest3_6379_redis_exporter.yml [ { "targets": [ "192.168.163.133:6379"], "labels": {"env":"test","cluster":"test_one","alias":"test3"} } ] # cat /etc/prometheus/targets/redis/Atest4_6379_redis_exporter.yml [ { "targets": [ "192.168.163.134:6379"], "labels": {"env":"test","cluster":"test_one","alias":"test4"} } ] # cat /etc/prometheus/targets/redis/Btest2_6380_redis_exporter.yml [ { "targets": [ "192.168.163.132:6380"], "labels": {"env":"test","cluster":"test_two","alias":"test2"} } ] # cat /etc/prometheus/targets/redis/Btest3_6380_redis_exporter.yml [ { "targets": [ "192.168.163.133:6380"], "labels": {"env":"test","cluster":"test_two","alias":"test3"} } ] # cat /etc/prometheus/targets/redis/Btest4_6380_redis_exporter.yml [ { "targets": [ "192.168.163.134:6380"], "labels": {"env":"test","cluster":"test_two","alias":"test4"} } ]View Code
以後如果有相關的例項叢集包括主從加進來,只要新增2類exporter檔案即可。最後開啟exporter:
#指定節點執行 redis_exporter: ./redis_exporter -redis-only-metrics -redis.password abc -web.listen-address=:9123 #指定節點執行 redis_exporter: ./redis_exporter -redis-only-metrics -redis.password cba -web.listen-address=:9124
最後配置Grafana,效果和①一樣,唯一的區別就是②開多個exporter。這樣會導致一個問題:每次增加不同密碼的節點都會修改Prometheus配置檔案,既不安全也不方便。可以通過下面方法來實現多例項不同密碼抓取。按照編寫匯出器的最佳實踐,需要像nodes_exporter一樣在不同例項的主機上安裝和開啟redis_exporter,即為每個redis instance開啟一個exporter。叢集資訊為:
叢集1:密碼 cc
M: 192.168.163.132:15389 192.168.163.133:15389 192.168.163.134:15389 S: 192.168.163.132:15489 192.168.163.133:15489 192.168.163.134:15489 叢集2:密碼abc M: 192.168.163.132:6379 192.168.163.133:6379 192.168.163.134:6379 S: 192.168.163.132:6381 192.168.163.133:6381 192.168.163.134:6381
prometheus.yml:
global: scrape_interval: 10s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 10s # Evaluate rules every 15 seconds. The default is every 1 minute. alerting: alertmanagers: - static_configs: - targets: # - alertmanager:9093 rule_files: # - "first_rules.yml" # - "second_rules.yml" scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['192.168.163.132:9099'] - job_name: 'node_exporter' scrape_interval: 1s file_sd_configs: - files: - targets/node/node*.yml refresh_interval: 10s relabel_configs: - action: replace source_labels: ['__address__'] regex: (.*):(.*) replacement: $1 target_label: hostname - action: labeldrop regex: __meta_filepath - job_name: 'redis_exporter' scrape_interval: 1s file_sd_configs: - files: - targets/redis/redis*.yml relabel_configs: - action: replace source_labels: ['__address__'] regex: (.*):(.*) replacement: $1 target_label: hostip - action: labeldrop regex: __meta_filepathView Code
targets/redis/redis*.yml
root@test2:/etc/prometheus/targets/redis# ls -lh redis* -rw-r--r-- 1 prometheus prometheus 117 4月 18 22:02 redis_test2_15389_exporter.yml -rw-r--r-- 1 prometheus prometheus 117 4月 18 22:05 redis_test2_15489_exporter.yml -rw-r--r-- 1 prometheus prometheus 117 4月 18 22:02 redis_test3_15389_exporter.yml -rw-r--r-- 1 prometheus prometheus 117 4月 18 22:05 redis_test3_15489_exporter.yml -rw-r--r-- 1 prometheus prometheus 117 4月 18 22:03 redis_test4_15389_exporter.yml -rw-r--r-- 1 prometheus prometheus 117 4月 18 22:05 redis_test4_15489_exporter.yml root@test2:/etc/prometheus/targets/redis# cat redis_test2_15389_exporter.yml [ { "targets": ["192.168.163.132:9121"], "labels": {"env":"test","cluster":"test","alias":"test2"} } ] root@test2:/etc/prometheus/targets/redis# cat redis_test3_15389_exporter.yml [ { "targets": ["192.168.163.133:9121"], "labels": {"env":"test","cluster":"test","alias":"test3"} } ] root@test2:/etc/prometheus/targets/redis# cat redis_test4_15389_exporter.yml [ { "targets": ["192.168.163.134:9121"], "labels": {"env":"test","cluster":"test","alias":"test4"} } ] root@test2:/etc/prometheus/targets/redis# cat redis_test2_15489_exporter.yml [ { "targets": ["192.168.163.132:9122"], "labels": {"env":"test","cluster":"test","alias":"test2"} } ] root@test2:/etc/prometheus/targets/redis# cat redis_test3_15489_exporter.yml [ { "targets": ["192.168.163.133:9122"], "labels": {"env":"test","cluster":"test","alias":"test3"} } ] root@test2:/etc/prometheus/targets/redis# cat redis_test4_15489_exporter.yml [ { "targets": ["192.168.163.134:9122"], "labels": {"env":"test","cluster":"test","alias":"test4"} } ]View Code
通過檔案服務發現,實現動態新增節點(exporter),一個Redis例項一個exporter,這裡只開叢集1的exporter,即在test2、test3、test4上各開啟2個exporter,共6個exporter對應6個Redis例項,配置完成之後,可以直接到各個監控主機上啟動redis_exporter:
test2: ./redis_exporter -redis-only-metrics -redis.addr 192.168.163.132:15389 -redis.password cc -web.listen-address=:9121 ./redis_exporter -redis-only-metrics -redis.addr 192.168.163.132:15489 -redis.password cc -web.listen-address=:9122 test3: ./redis_exporter -redis-only-metrics -redis.addr 192.168.163.133:15389 -redis.password cc -web.listen-address=:9121 ./redis_exporter -redis-only-metrics -redis.addr 192.168.163.133:15489 -redis.password cc -web.listen-address=:9122 test4: ./redis_exporter -redis-only-metrics -redis.addr 192.168.163.134:15389 -redis.password cc -web.listen-address=:9121 ./redis_exporter -redis-only-metrics -redis.addr 192.168.163.134:15489 -redis.password cc -web.listen-address=:9122
最後配置Grafana,效果:
JSON Model:
{ "annotations": { "list": [ { "builtIn": 1, "datasource": "-- Grafana --", "enable": true, "hide": true, "iconColor": "rgba(0, 211, 255, 1)", "name": "Annotations & Alerts", "type": "dashboard" } ] }, "editable": true, "gnetId": null, "graphTooltip": 0, "id": 13, "iteration": 1587219062782, "links": [], "panels": [ { "cacheTimeout": null, "colorBackground": false, "colorValue": true, "colors": [ "#299c46", "rgba(237, 129, 40, 0.89)", "#d44a3a" ], "datasource": null, "description": "叢集個數", "format": "none", "gauge": { "maxValue": 100, "minValue": 0, "show": false, "thresholdLabels": false, "thresholdMarkers": true }, "gridPos": { "h": 3, "w": 5, "x": 0, "y": 0 }, "id": 8, "interval": null, "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "nullPointMode": "connected", "nullText": null, "postfix": "", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "50%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "rgb(31, 120, 193)", "show": false, "ymax": null, "ymin": null }, "tableColumn": "", "targets": [ { "expr": "count(count(redis_up{cluster=~\"$cluster\"}>0) by (cluster))", "interval": "", "legendFormat": "", "refId": "A" } ], "thresholds": "", "timeFrom": null, "timeShift": null, "title": "叢集個數", "type": "singlestat", "valueFontSize": "100%", "valueMaps": [ { "op": "=", "text": "N/A", "value": "null" } ], "valueName": "current" }, { "cacheTimeout": null, "colorBackground": false, "colorValue": true, "colors": [ "#299c46", "rgba(237, 129, 40, 0.89)", "#d44a3a" ], "datasource": null, "description": "叢集節點數量", "format": "none", "gauge": { "maxValue": 100, "minValue": 0, "show": false, "thresholdLabels": false, "thresholdMarkers": true }, "gridPos": { "h": 3, "w": 5, "x": 5, "y": 0 }, "id": 4, "interval": null, "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "nullPointMode": "connected", "nullText": null, "postfix": "", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "50%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "rgb(31, 120, 193)", "show": false, "ymax": null, "ymin": null }, "tableColumn": "", "targets": [ { "expr": "count(redis_up{cluster=~\"$cluster\"})", "interval": "", "legendFormat": "", "refId": "A" } ], "thresholds": "", "timeFrom": null, "timeShift": null, "title": "叢集節點數", "type": "singlestat", "valueFontSize": "100%", "valueMaps": [ { "op": "=", "text": "N/A", "value": "null" } ], "valueName": "current" }, { "cacheTimeout": null, "colorBackground": false, "colorValue": true, "colors": [ "#299c46", "rgba(237, 129, 40, 0.89)", "#d44a3a" ], "datasource": null, "description": "叢集活躍節點數量", "format": "none", "gauge": { "maxValue": 100, "minValue": 0, "show": false, "thresholdLabels": false, "thresholdMarkers": true }, "gridPos": { "h": 3, "w": 4, "x": 10, "y": 0 }, "id": 6, "interval": null, "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "nullPointMode": "connected", "nullText": null, "postfix": "", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "50%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "rgb(31, 120, 193)", "show": false, "ymax": null, "ymin": null },