From 488c8471beebe48ce9674fc2da936a749d11df85 Mon Sep 17 00:00:00 2001 From: schmikei Date: Mon, 10 Nov 2025 10:50:04 -0500 Subject: [PATCH 1/3] modernize the redis-enterprise mixin to use modern libraries --- .../{alerts => }/alerts.libsonnet | 56 +- redis-enterprise-mixin/config.libsonnet | 40 +- redis-enterprise-mixin/dashboards.libsonnet | 148 ++ .../dashboards/dashboards.libsonnet | 3 - .../redis-enterprise-database.libsonnet | 1537 -------------- .../redis-enterprise-nodes.libsonnet | 1055 ---------- .../redis-enterprise-overview.libsonnet | 1382 ------------- .../redis-enterprise-database-overview.json | 1831 ----------------- .../redis-enterprise-database-overview.jsonn | 1198 +++++++++++ .../dashboards_out/redis-enterprise-logs.json | 307 +++ .../redis-enterprise-node-overview.json | 1071 +++------- .../redis-enterprise-overview.json | 1330 ++++-------- redis-enterprise-mixin/g.libsonnet | 1 + redis-enterprise-mixin/jsonnetfile.json | 31 +- redis-enterprise-mixin/links.libsonnet | 25 + redis-enterprise-mixin/main.libsonnet | 49 + redis-enterprise-mixin/mixin.libsonnet | 34 +- redis-enterprise-mixin/panels.libsonnet | 469 +++++ .../prometheus_alerts.yaml | 18 +- redis-enterprise-mixin/rows.libsonnet | 106 + .../signals/databases.libsonnet | 298 +++ .../signals/nodes.libsonnet | 214 ++ .../signals/overview.libsonnet | 284 +++ 23 files changed, 3940 insertions(+), 7547 deletions(-) rename redis-enterprise-mixin/{alerts => }/alerts.libsonnet (74%) create mode 100644 redis-enterprise-mixin/dashboards.libsonnet delete mode 100644 redis-enterprise-mixin/dashboards/dashboards.libsonnet delete mode 100644 redis-enterprise-mixin/dashboards/redis-enterprise-database.libsonnet delete mode 100644 redis-enterprise-mixin/dashboards/redis-enterprise-nodes.libsonnet delete mode 100644 redis-enterprise-mixin/dashboards/redis-enterprise-overview.libsonnet delete mode 100644 redis-enterprise-mixin/dashboards_out/redis-enterprise-database-overview.json create mode 100644 redis-enterprise-mixin/dashboards_out/redis-enterprise-database-overview.jsonn create mode 100644 redis-enterprise-mixin/dashboards_out/redis-enterprise-logs.json create mode 100644 redis-enterprise-mixin/g.libsonnet create mode 100644 redis-enterprise-mixin/links.libsonnet create mode 100644 redis-enterprise-mixin/main.libsonnet create mode 100644 redis-enterprise-mixin/panels.libsonnet create mode 100644 redis-enterprise-mixin/rows.libsonnet create mode 100644 redis-enterprise-mixin/signals/databases.libsonnet create mode 100644 redis-enterprise-mixin/signals/nodes.libsonnet create mode 100644 redis-enterprise-mixin/signals/overview.libsonnet diff --git a/redis-enterprise-mixin/alerts/alerts.libsonnet b/redis-enterprise-mixin/alerts.libsonnet similarity index 74% rename from redis-enterprise-mixin/alerts/alerts.libsonnet rename to redis-enterprise-mixin/alerts.libsonnet index d8e7b5fe9..ecf7a3f44 100644 --- a/redis-enterprise-mixin/alerts/alerts.libsonnet +++ b/redis-enterprise-mixin/alerts.libsonnet @@ -1,14 +1,14 @@ { - prometheusAlerts+:: { - groups+: [ + new(this): { + groups: [ { name: 'RedisEnterpriseAlerts', rules: [ { alert: 'RedisEnterpriseClusterOutOfMemory', expr: ||| - sum(redis_used_memory) by (redis_cluster, node) / sum(node_available_memory) by (redis_cluster, node) * 100 > %(alertsClusterOutOfMemoryThreshold)s - ||| % $._config, + sum(redis_used_memory{%(filteringSelector)s}) by (redis_cluster, node) / sum(node_available_memory{%(filteringSelector)s}) by (redis_cluster, node) * 100 > %(alertsClusterOutOfMemoryThreshold)s + ||| % this.config, 'for': '5m', labels: { severity: 'critical', @@ -19,14 +19,14 @@ ( 'Memory usage is at {{ printf "%%.0f" $value }} percent on the cluster {{$labels.redis_cluster}}, ' + "which is above the configured threshold of %(alertsClusterOutOfMemoryThreshold)s%% of the cluster's available memory" - ) % $._config, + ) % this.config, }, }, { alert: 'RedisEnterpriseNodeNotResponding', expr: ||| - node_up == 0 - ||| % $._config, + node_up{%(filteringSelector)s} == 0 + ||| % this.config, 'for': '5m', labels: { severity: 'critical', @@ -36,14 +36,14 @@ description: ( 'The node {{$labels.node}} in {{$labels.redis_cluster}} is offline or unreachable.' - ) % $._config, + ) % this.config, }, }, { alert: 'RedisEnterpriseDatabaseNotResponding', expr: ||| - bdb_up == 0 - ||| % $._config, + bdb_up{%(filteringSelector)s} == 0 + ||| % this.config, 'for': '5m', labels: { severity: 'critical', @@ -53,14 +53,14 @@ description: ( 'The database {{$labels.bdb}} in {{$labels.redis_cluster}} is offline or unreachable.' - ) % $._config, + ) % this.config, }, }, { alert: 'RedisEnterpriseShardNotResponding', expr: ||| - redis_up == 0 - ||| % $._config, + redis_up{%(filteringSelector)s} == 0 + ||| % this.config, 'for': '5m', labels: { severity: 'critical', @@ -70,14 +70,14 @@ description: ( 'The shard {{$labels.redis}} on database {{$labels.bdb}} running on node {{$labels.node}} in the cluster {{$labels.redis_cluster}} is offline or unreachable.' - ) % $._config, + ) % this.config, }, }, { alert: 'RedisEnterpriseNodeHighCPUUtilization', expr: ||| - (sum(node_cpu_user) by (node, redis_cluster, job) + sum(node_cpu_system) by (node, redis_cluster, job)) * 100 > %(alertsNodeCPUHighUtilizationThreshold)s - ||| % $._config, + (sum(node_cpu_user{%(filteringSelector)s}) by (node, redis_cluster, job) + sum(node_cpu_system{%(filteringSelector)s}) by (node, redis_cluster, job)) * 100 > %(alertsNodeCPUHighUtilizationThreshold)s + ||| % this.config, 'for': '5m', labels: { severity: 'warning', @@ -88,14 +88,14 @@ ( 'The node {{$labels.node}} in cluster {{$labels.redis_cluster}} has a CPU percentage of ${{ printf "%%.0f" $value }}, which exceeds ' + 'the threshold %(alertsNodeCPUHighUtilizationThreshold)s%%.' - ) % $._config, + ) % this.config, }, }, { alert: 'RedisEnterpriseDatabaseHighMemoryUtilization', expr: ||| - sum(bdb_used_memory) by (bdb, redis_cluster) / sum(bdb_memory_limit) by (bdb, redis_cluster) * 100 > %(alertsDatabaseHighMemoryUtiliation)s - ||| % $._config, + sum(bdb_used_memory{%(filteringSelector)s}) by (bdb, redis_cluster) / sum(bdb_memory_limit{%(filteringSelector)s}) by (bdb, redis_cluster) * 100 > %(alertsDatabaseHighMemoryUtilization)s + ||| % this.config, 'for': '5m', labels: { severity: 'warning', @@ -104,16 +104,16 @@ summary: 'Node memory utilization is above the configured threshold.', description: ( - 'The database {{$labels.bdb}} in cluster {{$labels.redis_cluster}} has a memory utiliztaion of ${{ printf "%%.0f" $value }}, which exceeds ' + - 'the threshold %(alertsDatabaseHighMemoryUtiliation)s%%.' - ) % $._config, + 'The database {{$labels.bdb}} in cluster {{$labels.redis_cluster}} has a memory utilization of ${{ printf "%%.0f" $value }}, which exceeds ' + + 'the threshold %(alertsDatabaseHighMemoryUtilization)s%%.' + ) % this.config, }, }, { alert: 'RedisEnterpriseAverageLatencyIncreasing', expr: ||| - bdb_avg_latency / 1000 > %(alertsDatabaseHighLatencyMs)s - ||| % $._config, + bdb_avg_latency{%(filteringSelector)s} / 1000 > %(alertsDatabaseHighLatencyMs)s + ||| % this.config, 'for': '5m', labels: { severity: 'warning', @@ -124,14 +124,14 @@ ( 'The database {{$labels.bdb}} in cluster {{$labels.redis_cluster}} has high latency of ${{ printf "%%.0f" $value }}, which exceeds ' + 'the threshold of %(alertsDatabaseHighLatencyMs)s ms.' - ) % $._config, + ) % this.config, }, }, { alert: 'RedisEnterpriseKeyEvictionsIncreasing', expr: ||| - bdb_evicted_objects >= %(alertsEvictedObjectsThreshold)s - ||| % $._config, + bdb_evicted_objects{%(filteringSelector)s} >= %(alertsEvictedObjectsThreshold)s + ||| % this.config, 'for': '5m', labels: { severity: 'warning', @@ -142,7 +142,7 @@ ( 'The database {{$labels.bdb}} in cluster {{$labels.redis_cluster}} is evicting ${{ printf "%%.0f" $value }} objects, which exceeds ' + 'the threshold of %(alertsEvictedObjectsThreshold)s evicted objects.' - ) % $._config, + ) % this.config, }, }, ], diff --git a/redis-enterprise-mixin/config.libsonnet b/redis-enterprise-mixin/config.libsonnet index 6ce8fba65..33fc70ab9 100644 --- a/redis-enterprise-mixin/config.libsonnet +++ b/redis-enterprise-mixin/config.libsonnet @@ -1,17 +1,33 @@ { - _config+:: { - dashboardTags: ['redis-enterprise-mixin'], - dashboardPeriod: 'now-1h', - dashboardTimezone: 'default', - dashboardRefresh: '1m', + local this = self, + filteringSelector: 'job="integrations/redis-enterprise"', + groupLabels: ['job', 'redis_cluster'], + instanceLabels: ['instance'], + nodeLabels: ['node'], + databaseLabels: ['bdb'], + uid: 'redis-enterprise', + dashboardNamePrefix: 'Redis Enterprise', + dashboardTags: [self.uid + '-mixin'], + dashboardPeriod: 'now-1h', + dashboardTimezone: 'default', + dashboardRefresh: '1m', - //alert thresholds - alertsClusterOutOfMemoryThreshold: 80, // % - alertsNodeCPUHighUtilizationThreshold: 80, // % - alertsDatabaseHighMemoryUtiliation: 80, // % - alertsDatabaseHighLatencyMs: 1000, // ms - alertsEvictedObjectsThreshold: 1, + // Alert thresholds + alertsClusterOutOfMemoryThreshold: 80, // % + alertsNodeCPUHighUtilizationThreshold: 80, // % + alertsDatabaseHighMemoryUtilization: 80, // % + alertsDatabaseHighLatencyMs: 1000, // ms + alertsEvictedObjectsThreshold: 1, - enableLokiLogs: true, + enableLokiLogs: true, + extraLogLabels: [], + showLogsVolume: true, + + // Metrics source for signals + metricsSource: 'prometheus', + signals: { + overview: (import './signals/overview.libsonnet')(this), + nodes: (import './signals/nodes.libsonnet')(this), + databases: (import './signals/databases.libsonnet')(this), }, } diff --git a/redis-enterprise-mixin/dashboards.libsonnet b/redis-enterprise-mixin/dashboards.libsonnet new file mode 100644 index 000000000..809c2ccb1 --- /dev/null +++ b/redis-enterprise-mixin/dashboards.libsonnet @@ -0,0 +1,148 @@ +local g = import './g.libsonnet'; +local commonlib = import 'common-lib/common/main.libsonnet'; +local util = import 'common-lib/common/util.libsonnet'; +local logslib = import 'logs-lib/logs/main.libsonnet'; + + +{ + local root = self, + new(this):: + local prefix = this.config.dashboardNamePrefix; + local links = this.grafana.links; + local tags = this.config.dashboardTags; + local uid = g.util.string.slugify(this.config.uid); + local vars = this.grafana.variables; + local annotations = this.grafana.annotations; + local refresh = this.config.dashboardRefresh; + local period = this.config.dashboardPeriod; + local timezone = this.config.dashboardTimezone; + + local nodeVars = std.map( + function(label) + g.dashboard.variable.query.new(label) + + g.dashboard.variable.custom.selectionOptions.withMulti(true) + + g.dashboard.variable.query.queryTypes.withLabelValues(label, metric='node_up') + + g.dashboard.variable.query.withDatasourceFromVariable(vars.datasources.prometheus) + + g.dashboard.variable.query.selectionOptions.withIncludeAll(true), + this.config.nodeLabels + ); + + local databaseVars = std.map( + function(label) + g.dashboard.variable.query.new(label) + + g.dashboard.variable.custom.selectionOptions.withMulti(true) + + g.dashboard.variable.custom.selectionOptions.withIncludeAll(true) + + g.dashboard.variable.query.queryTypes.withLabelValues(label, metric='bdb_up') + + g.dashboard.variable.query.withDatasourceFromVariable(vars.datasources.prometheus), this.config.databaseLabels + ); + + + { + 'redis-enterprise-overview.json': + g.dashboard.new(prefix + ' overview') + + g.dashboard.withPanels( + g.util.panel.resolveCollapsedFlagOnRows( + g.util.grid.wrapPanels( + [ + this.grafana.rows.overviewRow, + this.grafana.rows.overviewNodesKPIsRow, + this.grafana.rows.overviewDatabaseKPIsRow, + ] + ) + ) + ) + root.applyCommon( + vars.multiInstance, + uid + '_overview', + tags, + links { redisEnterpriseOverview:: {} }, + annotations, + timezone, + refresh, + period, + ), + 'redis-enterprise-node-overview.json': + g.dashboard.new(prefix + ' nodes') + + g.dashboard.withPanels( + g.util.panel.resolveCollapsedFlagOnRows( + g.util.grid.wrapPanels( + [ + this.grafana.rows.nodesOverviewRow, + this.grafana.rows.nodesMetricsRow, + ] + ) + ) + ) + root.applyCommon( + vars.multiInstance + nodeVars, + uid + '_nodes', + tags, + links { redisEnterpriseNodes:: {} }, + annotations, + timezone, + refresh, + period, + ), + 'redis-enterprise-database-overview.jsonn': + g.dashboard.new(prefix + ' databases') + + g.dashboard.withPanels( + g.util.panel.resolveCollapsedFlagOnRows( + g.util.grid.wrapPanels( + [ + this.grafana.rows.databasesOverviewRow, + this.grafana.rows.databasesMetricsRow, + this.grafana.rows.databasesCRDBRow, + ] + ), + ) + ) + root.applyCommon( + vars.multiInstance + nodeVars + databaseVars, + uid + '_databases', + tags, + links { redisEnterpriseDatabases:: {} }, + annotations, + timezone, + refresh, + period, + ), + } + if this.config.enableLokiLogs then { + 'redis-enterprise-logs.json': + logslib.new( + prefix + ' logs', + datasourceName=this.grafana.variables.datasources.loki.name, + datasourceRegex=this.grafana.variables.datasources.loki.regex, + filterSelector=this.config.filteringSelector, + labels=this.config.groupLabels + this.config.extraLogLabels, + formatParser=null, + showLogsVolume=this.config.showLogsVolume, + ) + { + dashboards+: + { + logs+: + root.applyCommon(super.logs.templating.list, uid=uid + '-logs', tags=tags, links=links { redisEnterpriseLogs+:: {} }, annotations=annotations, timezone=timezone, refresh=refresh, period=period), + }, + panels+: + { + logs+: + g.panel.logs.options.withEnableLogDetails(true) + + g.panel.logs.options.withShowTime(false) + + g.panel.logs.options.withWrapLogMessage(false), + }, + variables+: { + toArray+: [ + this.grafana.variables.datasources.prometheus { hide: 2 }, + ], + }, + }.dashboards.logs, + } + else {}, + + applyCommon(vars, uid, tags, links, annotations, timezone, refresh, period): + g.dashboard.withTags(tags) + + g.dashboard.withUid(uid) + + g.dashboard.withLinks(std.objectValues(links)) + + g.dashboard.withTimezone(timezone) + + g.dashboard.withRefresh(refresh) + + g.dashboard.time.withFrom(period) + + g.dashboard.withVariables(vars) + + g.dashboard.withAnnotations(std.objectValues(annotations)), +} diff --git a/redis-enterprise-mixin/dashboards/dashboards.libsonnet b/redis-enterprise-mixin/dashboards/dashboards.libsonnet deleted file mode 100644 index a3ef6de5e..000000000 --- a/redis-enterprise-mixin/dashboards/dashboards.libsonnet +++ /dev/null @@ -1,3 +0,0 @@ -(import 'redis-enterprise-overview.libsonnet') + -(import 'redis-enterprise-nodes.libsonnet') + -(import 'redis-enterprise-database.libsonnet') diff --git a/redis-enterprise-mixin/dashboards/redis-enterprise-database.libsonnet b/redis-enterprise-mixin/dashboards/redis-enterprise-database.libsonnet deleted file mode 100644 index 8ac99e965..000000000 --- a/redis-enterprise-mixin/dashboards/redis-enterprise-database.libsonnet +++ /dev/null @@ -1,1537 +0,0 @@ -local grafana = (import 'grafonnet/grafana.libsonnet'); -local dashboard = grafana.dashboard; -local template = grafana.template; -local prometheus = grafana.prometheus; - -local dashboardUid = 'redis-enterprise-database-overview'; - -local promDatasourceName = 'prometheus_datasource'; - -local promDatasource = { - uid: '${%s}' % promDatasourceName, -}; - -local nodeMatcher = 'redis_cluster=~"$redis_cluster", job=~"$job"'; -local matcher = nodeMatcher + ', bdb=~"$database"'; - -local databaseUpPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bdb_up{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ bdb }}', - ), - ], - type: 'timeseries', - title: 'Database up', - description: 'Displays up/down status for the selected database.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local shardsUpPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'redis_up{redis_cluster=~"$redis_cluster", job=~"$job", node=~"$node"}', - datasource=promDatasource, - legendFormat='{{ bdb }} - redis: {{ redis }}', - ), - ], - type: 'bargauge', - title: 'Shards up', - description: 'Displays up/down status for each shard related to the database.', - fieldConfig: { - defaults: { - color: { - mode: 'thresholds', - }, - displayName: '${__series.name}', - mappings: [], - max: 1, - min: 0, - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 0, - }, - { - color: 'green', - value: 1, - }, - ], - }, - }, - overrides: [], - }, - options: { - displayMode: 'basic', - minVizHeight: 10, - minVizWidth: 0, - orientation: 'horizontal', - reduceOptions: { - calcs: [ - 'lastNotNull', - ], - fields: '', - values: false, - }, - showUnfilled: true, - }, - pluginVersion: '9.4.7', -}; - -local nodesUpPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'node_up{' + nodeMatcher + ', node=~"$node"}', - datasource=promDatasource, - legendFormat='{{ node }}', - ), - ], - type: 'timeseries', - title: 'Nodes up', - description: 'Displays up/down status for each node related to the database.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local databaseOperationsPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bdb_read_req{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ bdb }} - read', - ), - prometheus.target( - 'bdb_write_req{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{bdb}} - write', - ), - ], - type: 'timeseries', - title: 'Database operations', - description: 'Rate of read and write requests.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'ops', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local databaseAverageLatencyPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bdb_avg_read_latency{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ bdb }} - read', - ), - prometheus.target( - 'bdb_avg_write_latency{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{bdb }} - write', - ), - ], - type: 'timeseries', - title: 'Database average latency', - description: 'Average rate of read and write latency', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'seconds', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local databaseKeyCountPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bdb_no_of_keys{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ bdb }}', - ), - ], - type: 'timeseries', - title: 'Database key count', - description: 'Number of keys in the database.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local databaseCacheHitRatioPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bdb_read_hits{' + matcher + '} / clamp_min(bdb_read_misses{' + matcher + '} + bdb_read_hits{' + matcher + '}, 1) * 100', - datasource=promDatasource, - legendFormat='{{ bdb }}', - ), - ], - type: 'timeseries', - title: 'Database cache hit ratio', - description: 'Percentage of read operations that result in a cache hit.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'percent', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local databaseEvictionsVsExpirationsPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bdb_expired_objects{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ bdb }} - expired', - ), - prometheus.target( - 'bdb_evicted_objects{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ bdb }} - evicted', - ), - ], - type: 'timeseries', - title: 'Database evictions vs expirations', - description: 'Rate of object expiration and eviction', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'ops', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local databaseMemoryUtilizationPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bdb_used_memory{' + matcher + '} / bdb_memory_limit{' + matcher + '} * 100', - datasource=promDatasource, - legendFormat='{{ bdb }}', - ), - ], - type: 'timeseries', - title: 'Database memory utilization', - description: 'Calculated memory utilization % of the database compared to the limit.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'percent', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local databaseMemoryFragmentationRatioPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bdb_mem_frag_ratio{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ bdb }}', - ), - ], - type: 'timeseries', - title: 'Database memory fragmentation ratio', - description: 'RAM fragmentation ratio between RSS and allocated RAM.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'percent', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local databaseLUAHeapSizePanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bdb_mem_size_lua{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ bdb }}', - ), - ], - type: 'timeseries', - title: 'Database LUA heap size', - description: 'LUA scripting heap size', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'bytes', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local databaseNetworkIngressPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bdb_ingress_bytes{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ bdb }}', - ), - ], - type: 'timeseries', - title: 'Database network ingress', - description: 'Rate of incoming network traffic.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'binBps', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local databaseNetworkEgressPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bdb_egress_bytes{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ bdb }}', - ), - ], - type: 'timeseries', - title: 'Database network egress', - description: 'Rate of outgoing network traffic.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'binBps', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local databaseConnectionsPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bdb_conns{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ bdb }}', - ), - ], - type: 'timeseries', - title: 'Database connections', - description: 'Number of client connections', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local activeactiveRow = { - datasource: promDatasource, - targets: [], - type: 'row', - title: 'Active-active', - collapsed: false, -}; - -local syncStatusPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bdb_crdt_syncer_status{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ bdb }} - repl_id: {{ crdt_replica_id }}', - ), - ], - type: 'timeseries', - title: 'Sync status', - description: 'Sync status for CRDB traffic.\n- 0=in-sync\n- 1=syncing\n- 2=out of sync', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local localLagPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bdb_crdt_syncer_local_ingress_lag_time{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ bdb }}', - ), - ], - type: 'timeseries', - title: 'Local lag', - description: 'Lag between source and destination for CRDB traffic.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'ms', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local crdbIngressCompressedPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bdb_crdt_syncer_ingress_bytes{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ bdb }}', - ), - ], - type: 'timeseries', - title: 'CRDB ingress compressed', - description: 'Rate of compressed network traffic to the CRDB.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'binBps', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local crdbIngressDecompressedPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bdb_crdt_ingress_bytes_decompressed{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ bdb }}', - ), - ], - type: 'timeseries', - title: 'CRDB ingress decompressed', - description: 'Rate of decompressed network traffic to the CRDB.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'binBps', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -{ - grafanaDashboards+:: { - 'redis-enterprise-database-overview.json': - dashboard.new( - 'Redis Enterprise database overview', - time_from='%s' % $._config.dashboardPeriod, - tags=($._config.dashboardTags), - timezone='%s' % $._config.dashboardTimezone, - refresh='%s' % $._config.dashboardRefresh, - description='', - uid=dashboardUid, - ) - .addLink(grafana.link.dashboards( - asDropdown=false, - title='Other Redis Enterprise dashboards', - includeVars=true, - keepTime=true, - tags=($._config.dashboardTags), - )) - .addTemplates( - [ - template.datasource( - promDatasourceName, - 'prometheus', - null, - label='Data Source', - refresh='load' - ), - template.new( - 'job', - promDatasource, - 'label_values(bdb_up, job)', - label='Job', - refresh=1, - includeAll=true, - multi=true, - allValues='', - sort=0 - ), - template.new( - 'redis_cluster', - promDatasource, - 'label_values(bdb_up, redis_cluster)', - label='Redis Cluster', - refresh=1, - includeAll=true, - multi=true, - allValues='', - sort=0 - ), - template.new( - 'node', - promDatasource, - 'label_values(redis_up, node)', - label='Node', - refresh=1, - includeAll=true, - multi=true, - allValues='', - sort=0 - ), - template.new( - 'database', - promDatasource, - 'label_values(bdb_up, bdb)', - label='Database', - refresh=1, - includeAll=true, - multi=true, - allValues='', - sort=0 - ), - ] - ) - .addPanels( - [ - databaseUpPanel { gridPos: { h: 6, w: 8, x: 0, y: 0 } }, - shardsUpPanel { gridPos: { h: 6, w: 8, x: 8, y: 0 } }, - nodesUpPanel { gridPos: { h: 6, w: 8, x: 16, y: 0 } }, - databaseOperationsPanel { gridPos: { h: 6, w: 12, x: 0, y: 6 } }, - databaseAverageLatencyPanel { gridPos: { h: 6, w: 12, x: 12, y: 6 } }, - databaseKeyCountPanel { gridPos: { h: 6, w: 8, x: 0, y: 12 } }, - databaseCacheHitRatioPanel { gridPos: { h: 6, w: 8, x: 8, y: 12 } }, - databaseEvictionsVsExpirationsPanel { gridPos: { h: 6, w: 8, x: 16, y: 12 } }, - databaseMemoryUtilizationPanel { gridPos: { h: 6, w: 8, x: 0, y: 18 } }, - databaseMemoryFragmentationRatioPanel { gridPos: { h: 6, w: 8, x: 8, y: 18 } }, - databaseLUAHeapSizePanel { gridPos: { h: 6, w: 8, x: 16, y: 18 } }, - databaseNetworkIngressPanel { gridPos: { h: 6, w: 8, x: 0, y: 24 } }, - databaseNetworkEgressPanel { gridPos: { h: 6, w: 8, x: 8, y: 24 } }, - databaseConnectionsPanel { gridPos: { h: 6, w: 8, x: 16, y: 24 } }, - activeactiveRow { gridPos: { h: 1, w: 24, x: 0, y: 30 } }, - syncStatusPanel { gridPos: { h: 6, w: 6, x: 0, y: 31 } }, - localLagPanel { gridPos: { h: 6, w: 6, x: 6, y: 31 } }, - crdbIngressCompressedPanel { gridPos: { h: 6, w: 6, x: 12, y: 31 } }, - crdbIngressDecompressedPanel { gridPos: { h: 6, w: 6, x: 18, y: 31 } }, - ] - ), - }, -} diff --git a/redis-enterprise-mixin/dashboards/redis-enterprise-nodes.libsonnet b/redis-enterprise-mixin/dashboards/redis-enterprise-nodes.libsonnet deleted file mode 100644 index 9a31a937c..000000000 --- a/redis-enterprise-mixin/dashboards/redis-enterprise-nodes.libsonnet +++ /dev/null @@ -1,1055 +0,0 @@ -local grafana = (import 'grafonnet/grafana.libsonnet'); -local dashboard = grafana.dashboard; -local template = grafana.template; -local prometheus = grafana.prometheus; - -local dashboardUid = 'redis-enterprise-node-overview'; - -local promDatasourceName = 'prometheus_datasource'; -local lokiDatasourceName = 'loki_datasource'; - -local promDatasource = { - uid: '${%s}' % promDatasourceName, -}; - -local lokiDatasource = { - uid: '${%s}' % lokiDatasourceName, -}; - -local matcher = 'redis_cluster=~"$redis_cluster", job=~"$job", node=~"$node"'; - -local nodesUpPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'node_up{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ node }}', - ), - ], - type: 'timeseries', - title: 'Nodes up', - description: 'Displays up/down status for the selected node', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local databaseUpPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bdb_up{redis_cluster=~"$redis_cluster", job=~"$job"}', - datasource=promDatasource, - legendFormat='db: {{ bdb }}', - ), - ], - type: 'bargauge', - title: 'Database up', - description: 'Displays up/down status for the databases of the selected node(s).', - fieldConfig: { - defaults: { - color: { - mode: 'thresholds', - }, - displayName: '${__series.name}', - mappings: [], - min: 0, - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'transparent', - value: null, - }, - { - color: 'red', - value: 0, - }, - { - color: 'green', - value: 1, - }, - ], - }, - }, - overrides: [], - }, - options: { - displayMode: 'basic', - minVizHeight: 10, - minVizWidth: 0, - orientation: 'horizontal', - reduceOptions: { - calcs: [ - 'lastNotNull', - ], - fields: '', - values: false, - }, - showUnfilled: true, - }, - pluginVersion: '9.4.7', -}; - -local shardsUpPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'redis_up{' + matcher + '}', - datasource=promDatasource, - legendFormat='redis: {{redis}}', - ), - ], - type: 'bargauge', - title: 'Shards up', - description: 'Displays up/down status for the shards on the selected node.', - fieldConfig: { - defaults: { - color: { - mode: 'thresholds', - }, - displayName: '${__series.name}', - mappings: [], - min: 0, - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'transparent', - value: null, - }, - { - color: 'red', - value: 0, - }, - { - color: 'green', - value: 1, - }, - ], - }, - }, - overrides: [], - }, - options: { - displayMode: 'basic', - minVizHeight: 10, - minVizWidth: 0, - orientation: 'horizontal', - reduceOptions: { - calcs: [ - 'lastNotNull', - ], - fields: '', - values: false, - }, - showUnfilled: true, - }, - pluginVersion: '9.4.7', -}; - -local nodeRequestsPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'node_total_req{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ node }}', - ), - ], - type: 'timeseries', - title: 'Node requests', - description: 'Total endpoint request rate for the selected node.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'reqps', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local nodeAverageLatencyPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'node_avg_latency{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ node }}', - ), - ], - type: 'timeseries', - title: 'Node average latency', - description: 'Average request latency for the selected node.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 's', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local nodeCPUUtilizationPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'node_cpu_system{' + matcher + '} * 100', - datasource=promDatasource, - legendFormat='{{ node }} - system', - ), - prometheus.target( - 'node_cpu_user{' + matcher + '} * 100', - datasource=promDatasource, - legendFormat='{{node}} - user', - ), - ], - type: 'timeseries', - title: 'Node CPU utilization', - description: 'CPU utilization for idle, main, and user threads.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'percent', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local nodeMemoryUtilizationPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - '(sum(redis_used_memory{' + matcher + '}) by (redis_cluster, job, node) / clamp_min(sum(node_available_memory{' + matcher + '}) by (redis_cluster, job, node) + sum(redis_used_memory{' + matcher + '}) by (redis_cluster, job, node), 1)) * 100', - datasource=promDatasource, - legendFormat='{{node}}', - ), - ], - type: 'timeseries', - title: 'Node memory utilization', - description: 'Node memory utilization %.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'percent', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local nodeEphemeralFreeStoragePanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'node_ephemeral_storage_free{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ node }}', - ), - ], - type: 'timeseries', - title: 'Node ephemeral free storage', - description: 'Ephemeral storage available for the selected node.\n', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'bytes', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local nodePersistentFreeStoragePanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'node_persistent_storage_free{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ node }}', - ), - ], - type: 'timeseries', - title: 'Node persistent free storage', - description: 'Persistent storage available for the selected node', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'bytes', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local nodeNetworkIngressPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'node_ingress_bytes{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ node }}', - ), - ], - type: 'timeseries', - title: 'Node network ingress', - description: 'Rate of incoming network traffic to the selected node', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'binBps', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local nodeNetworkEgressPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'node_egress_bytes{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ node }}', - ), - ], - type: 'timeseries', - title: 'Node network egress', - description: 'Rate of outgoing network traffic to the selected node.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'binBps', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local nodeClientConnectionsPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'node_conns{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ node }}', - ), - ], - type: 'timeseries', - title: 'Node client connections', - description: 'Number of client connections to each node.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local redisLogsPanel = { - datasource: lokiDatasource, - targets: [ - { - datasource: lokiDatasource, - editorMode: 'code', - expr: '{filename=~"/var/opt/redislabs/log/redis-.*.log", job=~"$job", redis_cluster=~"$redis_cluster"} |= ``', - queryType: 'range', - refId: 'A', - }, - ], - type: 'logs', - title: 'Redis logs', - description: 'Recent logs outputted from the Redis server.', - options: { - dedupStrategy: 'none', - enableLogDetails: true, - prettifyLogMessage: false, - showCommonLabels: false, - showLabels: false, - showTime: false, - sortOrder: 'Descending', - wrapLogMessage: false, - }, -}; - -{ - grafanaDashboards+:: { - 'redis-enterprise-node-overview.json': - dashboard.new( - 'Redis Enterprise node overview', - time_from='%s' % $._config.dashboardPeriod, - tags=($._config.dashboardTags), - timezone='%s' % $._config.dashboardTimezone, - refresh='%s' % $._config.dashboardRefresh, - description='', - uid=dashboardUid, - ) - .addLink(grafana.link.dashboards( - asDropdown=false, - title='Other Redis Enterprise dashboards', - includeVars=true, - keepTime=true, - tags=($._config.dashboardTags), - )) - .addTemplates( - std.flattenArrays([ - [ - template.datasource( - promDatasourceName, - 'prometheus', - null, - label='Data Source', - refresh='load' - ), - ], - if $._config.enableLokiLogs then [ - template.datasource( - lokiDatasourceName, - 'loki', - null, - label='Loki Datasource', - refresh='load' - ), - ] else [], - [ - template.new( - 'job', - promDatasource, - 'label_values(node_up, job)', - label='Job', - refresh=1, - includeAll=true, - multi=true, - allValues='', - sort=0 - ), - template.new( - 'redis_cluster', - promDatasource, - 'label_values(node_up, redis_cluster)', - label='Redis Cluster', - refresh=1, - includeAll=true, - multi=true, - allValues='', - sort=0 - ), - template.new( - 'node', - promDatasource, - 'label_values(node_up, node)\n', - label='Node', - refresh=1, - includeAll=true, - multi=true, - allValues='', - sort=0 - ), - ], - ]) - ) - .addPanels( - std.flattenArrays([ - [ - nodesUpPanel { gridPos: { h: 6, w: 8, x: 0, y: 0 } }, - databaseUpPanel { gridPos: { h: 6, w: 8, x: 8, y: 0 } }, - shardsUpPanel { gridPos: { h: 6, w: 8, x: 16, y: 0 } }, - nodeRequestsPanel { gridPos: { h: 6, w: 8, x: 0, y: 6 } }, - nodeAverageLatencyPanel { gridPos: { h: 6, w: 8, x: 8, y: 6 } }, - nodeCPUUtilizationPanel { gridPos: { h: 6, w: 8, x: 16, y: 6 } }, - nodeMemoryUtilizationPanel { gridPos: { h: 6, w: 8, x: 0, y: 12 } }, - nodeEphemeralFreeStoragePanel { gridPos: { h: 6, w: 8, x: 8, y: 12 } }, - nodePersistentFreeStoragePanel { gridPos: { h: 6, w: 8, x: 16, y: 12 } }, - nodeNetworkIngressPanel { gridPos: { h: 6, w: 8, x: 0, y: 18 } }, - nodeNetworkEgressPanel { gridPos: { h: 6, w: 8, x: 8, y: 18 } }, - nodeClientConnectionsPanel { gridPos: { h: 6, w: 8, x: 16, y: 18 } }, - ], - if $._config.enableLokiLogs then [ - redisLogsPanel { gridPos: { h: 8, w: 24, x: 0, y: 24 } }, - ] else [], - [ - ], - ]) - ), - }, -} diff --git a/redis-enterprise-mixin/dashboards/redis-enterprise-overview.libsonnet b/redis-enterprise-mixin/dashboards/redis-enterprise-overview.libsonnet deleted file mode 100644 index e8c88d2de..000000000 --- a/redis-enterprise-mixin/dashboards/redis-enterprise-overview.libsonnet +++ /dev/null @@ -1,1382 +0,0 @@ -local grafana = (import 'grafonnet/grafana.libsonnet'); -local dashboard = grafana.dashboard; -local template = grafana.template; -local prometheus = grafana.prometheus; - -local dashboardUid = 'redis-enterprise-overview'; - -local promDatasourceName = 'prometheus_datasource'; - -local promDatasource = { - uid: '${%s}' % promDatasourceName, -}; - -local matcher = 'redis_cluster=~"$redis_cluster", job=~"$job"'; - -local nodesUpPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'node_up{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ redis_cluster }} - {{ node }}', - ), - ], - type: 'bargauge', - title: 'Nodes up', - description: 'Up/down status for each node in the cluster.', - fieldConfig: { - defaults: { - color: { - mode: 'thresholds', - }, - displayName: '${__series.name}', - mappings: [], - min: 0, - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'red', - value: 0, - }, - { - color: 'green', - value: 1, - }, - ], - }, - }, - overrides: [], - }, - options: { - displayMode: 'basic', - minVizHeight: 10, - minVizWidth: 0, - orientation: 'horizontal', - reduceOptions: { - calcs: [ - 'lastNotNull', - ], - fields: '', - values: false, - }, - showUnfilled: true, - }, - pluginVersion: '9.4.7', -}; - -local databasesUpPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bdb_up{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ redis_cluster }} - bdb={{bdb}}', - ), - ], - type: 'bargauge', - title: 'Databases up', - description: 'Up/down status for each database in the cluster.', - fieldConfig: { - defaults: { - color: { - mode: 'thresholds', - }, - displayName: '${__series.name}', - mappings: [], - max: 1, - min: 0, - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'red', - value: 0, - }, - { - color: 'green', - value: 1, - }, - ], - }, - }, - overrides: [], - }, - options: { - displayMode: 'basic', - minVizHeight: 10, - minVizWidth: 0, - orientation: 'horizontal', - reduceOptions: { - calcs: [ - 'lastNotNull', - ], - fields: '', - values: false, - }, - showUnfilled: true, - }, - pluginVersion: '9.4.7', -}; - -local shardsUpPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'redis_up{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ redis_cluster }} - redis: {{ redis }} ', - ), - ], - type: 'bargauge', - title: 'Shards up', - description: 'Up/down status for each shard in the cluster.', - fieldConfig: { - defaults: { - color: { - mode: 'thresholds', - }, - displayName: '${__series.name}', - mappings: [], - min: 0, - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'red', - value: 0, - }, - { - color: 'green', - value: 1, - }, - ], - }, - }, - overrides: [], - }, - options: { - displayMode: 'basic', - minVizHeight: 10, - minVizWidth: 0, - orientation: 'horizontal', - reduceOptions: { - calcs: [ - 'lastNotNull', - ], - fields: '', - values: false, - }, - showUnfilled: true, - }, - pluginVersion: '9.4.7', -}; - -local clusterTotalRequestsPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'sum(node_total_req{redis_cluster=~"$redis_cluster", job=~"$job"}) by (redis_cluster, job)', - datasource=promDatasource, - legendFormat='{{ redis_cluster }}', - ), - ], - type: 'timeseries', - title: 'Cluster total requests', - description: 'Total requests handled by endpoints aggregated across all nodes.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local clusterTotalMemoryUsedPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'sum(bdb_used_memory{redis_cluster=~"$redis_cluster", job=~"$job"}) by (job, bdb, redis_cluster)', - datasource=promDatasource, - legendFormat='{{ redis_cluster }} - db: {{ bdb }}', - ), - ], - type: 'timeseries', - title: 'Cluster total memory used', - description: 'Total memory used by each across each database in the cluster', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'bytes', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local clusterTotalConnectionsPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'sum(bdb_conns{redis_cluster=~"$redis_cluster", job=~"$job"}) by (bdb, redis_cluster, job)', - datasource=promDatasource, - legendFormat='{{ redis_cluster }} - db: {{ bdb }}', - ), - ], - type: 'timeseries', - title: 'Cluster total connections', - description: 'Total connections to each database in the cluster.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local clusterTotalKeysPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'sum(bdb_no_of_keys{' + matcher + '}) by (redis_cluster, bdb, job)', - datasource=promDatasource, - legendFormat='{{ redis_cluster }} - db: {{ bdb }}', - ), - ], - type: 'timeseries', - title: 'Cluster total keys', - description: 'Total cluster key count for each database in the cluster.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local clusterCacheHitRatioPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bdb_read_hits{' + matcher + '} / (clamp_min(bdb_read_hits{' + matcher + '} + bdb_read_misses{' + matcher + '}, 1)) * 100', - datasource=promDatasource, - legendFormat='{{ redis_cluster }} - db: {{ bdb }}', - ), - ], - type: 'timeseries', - title: 'Cluster cache hit ratio', - description: 'Ratio of database cache key hits against hits and misses.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'percent', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local clusterEvictionsVsExpiredObjectsPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bdb_evicted_objects{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ redis_cluster }} - db: {{ bdb }} - evicted', - ), - prometheus.target( - 'bdb_expired_objects{' + matcher + '}', - datasource=promDatasource, - legendFormat='{{ redis_cluster }} - db: {{ bdb }} - expired', - ), - ], - type: 'timeseries', - title: 'Cluster evictions vs expired objects', - description: 'Sum of key evictions and expirations in the cluster by database.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'ops', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local nodesKPIsRow = { - datasource: promDatasource, - targets: [], - type: 'row', - title: 'Nodes KPIs', - collapsed: false, -}; - -local nodeRequestsPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'rate(node_total_req{' + matcher + '}[$__rate_interval])', - datasource=promDatasource, - legendFormat='{{ redis_cluster }} - node: {{ node }} ', - ), - ], - type: 'timeseries', - title: 'Node requests', - description: 'Endpoint request rate for each node in the cluster.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'reqps', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local nodeAverageLatencyPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'node_avg_latency{' + matcher + ' }', - datasource=promDatasource, - legendFormat='{{ redis_cluster }} - node: {{ node }} ', - ), - ], - type: 'timeseries', - title: 'Node average latency', - description: 'Average latency for each node in the cluster.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 's', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local nodeMemoryUtilizationPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - '(sum(redis_used_memory{' + matcher + '}) by (redis_cluster, node, job) / clamp_min(sum(node_available_memory{' + matcher + '}) by (redis_cluster,node, job), 1)) * 100', - datasource=promDatasource, - legendFormat='{{ redis_cluster }} - node: {{ node }} ', - ), - ], - type: 'timeseries', - title: 'Node memory utilization', - description: 'Memory utilization % for each node in the cluster.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'percent', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local nodeCPUUtilizationPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'node_cpu_system{' + matcher + '} * 100', - datasource=promDatasource, - legendFormat='node: {{ node }} - system', - ), - prometheus.target( - 'node_cpu_user{' + matcher + '} * 100', - datasource=promDatasource, - legendFormat='node: {{ node }} - user', - ), - ], - type: 'timeseries', - title: 'Node CPU utilization', - description: 'CPU utilization for each node in the cluster.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'percent', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local databaseKPIsRow = { - datasource: promDatasource, - targets: [], - type: 'row', - title: 'Database KPIs', - collapsed: false, -}; - -local databaseOperationsPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'sum(bdb_instantaneous_ops_per_sec{' + matcher + '}) by (redis_cluster, bdb, job)', - datasource=promDatasource, - legendFormat='{{ redis_cluster }} - db: {{ bdb }} ', - ), - ], - type: 'timeseries', - title: 'Database operations', - description: 'Rate of request handled by each database in the cluster.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'ops', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local databaseAverageLatencyPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'sum(bdb_avg_latency{' + matcher + '}) by (redis_cluster, job, bdb)', - datasource=promDatasource, - legendFormat='{{ redis_cluster }} - db: {{ bdb }} ', - ), - ], - type: 'timeseries', - title: 'Database average latency', - description: 'Average latency for each database in the cluster.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 's', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local databaseMemoryUtilizationPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'sum(bdb_used_memory{' + matcher + '}) by (job, redis_cluster, bdb) / clamp_min(sum(bdb_memory_limit{' + matcher + '}) by (job, redis_cluster, bdb), 1) * 100 ', - datasource=promDatasource, - legendFormat='{{ redis_cluster }} - db: {{ bdb }} ', - ), - ], - type: 'timeseries', - title: 'Database memory utilization', - description: 'Calculated memory utilization % for each database in the cluster.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'percent', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -local databaseCacheHitRatioPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'sum(bdb_read_hits{' + matcher + '}) by (job, redis_cluster, bdb) / clamp_min(sum(bdb_read_hits{' + matcher + '}) by (job, redis_cluster, bdb) + sum(bdb_read_misses{' + matcher + '}) by (job, redis_cluster, bdb),1) * 100', - datasource=promDatasource, - legendFormat='{{ redis_cluster }} - db: {{ bdb }} ', - ), - ], - type: 'timeseries', - title: 'Database cache hit ratio', - description: 'Calculated cache hit rate for each database in the cluster', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 0, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - lineInterpolation: 'linear', - lineWidth: 1, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'auto', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - { - color: 'red', - value: 80, - }, - ], - }, - unit: 'percent', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'single', - sort: 'none', - }, - }, -}; - -{ - grafanaDashboards+:: { - 'redis-enterprise-overview.json': - dashboard.new( - 'Redis Enterprise overview', - time_from='%s' % $._config.dashboardPeriod, - tags=($._config.dashboardTags), - timezone='%s' % $._config.dashboardTimezone, - refresh='%s' % $._config.dashboardRefresh, - description='', - uid=dashboardUid, - ) - .addLink(grafana.link.dashboards( - asDropdown=false, - title='Other Redis Enterprise dashboards', - includeVars=true, - keepTime=true, - tags=($._config.dashboardTags), - )) - .addTemplates( - [ - template.datasource( - promDatasourceName, - 'prometheus', - null, - label='Data Source', - refresh='load' - ), - template.new( - 'job', - promDatasource, - 'label_values(node_up, job)', - label='Job', - refresh=2, - includeAll=true, - multi=true, - allValues='', - sort=0 - ), - template.new( - 'redis_cluster', - promDatasource, - 'label_values(node_up, redis_cluster)\n', - label='Redis Cluster', - refresh=1, - includeAll=true, - multi=true, - allValues='', - sort=0 - ), - ] - ) - .addPanels( - [ - nodesUpPanel { gridPos: { h: 6, w: 8, x: 0, y: 0 } }, - databasesUpPanel { gridPos: { h: 6, w: 8, x: 8, y: 0 } }, - shardsUpPanel { gridPos: { h: 6, w: 8, x: 16, y: 0 } }, - clusterTotalRequestsPanel { gridPos: { h: 6, w: 8, x: 0, y: 6 } }, - clusterTotalMemoryUsedPanel { gridPos: { h: 6, w: 8, x: 8, y: 6 } }, - clusterTotalConnectionsPanel { gridPos: { h: 6, w: 8, x: 16, y: 6 } }, - clusterTotalKeysPanel { gridPos: { h: 6, w: 8, x: 0, y: 12 } }, - clusterCacheHitRatioPanel { gridPos: { h: 6, w: 8, x: 8, y: 12 } }, - clusterEvictionsVsExpiredObjectsPanel { gridPos: { h: 6, w: 8, x: 16, y: 12 } }, - nodesKPIsRow { gridPos: { h: 1, w: 24, x: 0, y: 18 } }, - nodeRequestsPanel { gridPos: { h: 6, w: 6, x: 0, y: 19 } }, - nodeAverageLatencyPanel { gridPos: { h: 6, w: 6, x: 6, y: 19 } }, - nodeMemoryUtilizationPanel { gridPos: { h: 6, w: 6, x: 12, y: 19 } }, - nodeCPUUtilizationPanel { gridPos: { h: 6, w: 6, x: 18, y: 19 } }, - databaseKPIsRow { gridPos: { h: 1, w: 24, x: 0, y: 25 } }, - databaseOperationsPanel { gridPos: { h: 6, w: 6, x: 0, y: 26 } }, - databaseAverageLatencyPanel { gridPos: { h: 6, w: 6, x: 6, y: 26 } }, - databaseMemoryUtilizationPanel { gridPos: { h: 6, w: 6, x: 12, y: 26 } }, - databaseCacheHitRatioPanel { gridPos: { h: 6, w: 6, x: 18, y: 26 } }, - ] - ), - }, -} diff --git a/redis-enterprise-mixin/dashboards_out/redis-enterprise-database-overview.json b/redis-enterprise-mixin/dashboards_out/redis-enterprise-database-overview.json deleted file mode 100644 index 39d933dda..000000000 --- a/redis-enterprise-mixin/dashboards_out/redis-enterprise-database-overview.json +++ /dev/null @@ -1,1831 +0,0 @@ -{ - "__inputs": [ ], - "__requires": [ ], - "annotations": { - "list": [ ] - }, - "description": "", - "editable": false, - "gnetId": null, - "graphTooltip": 0, - "hideControls": false, - "id": null, - "links": [ - { - "asDropdown": false, - "icon": "external link", - "includeVars": true, - "keepTime": true, - "tags": [ - "redis-enterprise-mixin" - ], - "targetBlank": false, - "title": "Other Redis Enterprise dashboards", - "type": "dashboards", - "url": "" - } - ], - "panels": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "Displays up/down status for the selected database.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ ] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 0, - "y": 0 - }, - "id": 2, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "bdb_up{redis_cluster=~\"$redis_cluster\", job=~\"$job\", bdb=~\"$database\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ bdb }}" - } - ], - "title": "Database up", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "Displays up/down status for each shard related to the database.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "displayName": "${__series.name}", - "mappings": [ ], - "max": 1, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 0 - }, - { - "color": "green", - "value": 1 - } - ] - } - }, - "overrides": [ ] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 8, - "y": 0 - }, - "id": 3, - "options": { - "displayMode": "basic", - "minVizHeight": 10, - "minVizWidth": 0, - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showUnfilled": true - }, - "pluginVersion": "9.4.7", - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "redis_up{redis_cluster=~\"$redis_cluster\", job=~\"$job\", node=~\"$node\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ bdb }} - redis: {{ redis }}" - } - ], - "title": "Shards up", - "type": "bargauge" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "Displays up/down status for each node related to the database.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ ] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 16, - "y": 0 - }, - "id": 4, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "node_up{redis_cluster=~\"$redis_cluster\", job=~\"$job\", node=~\"$node\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ node }}" - } - ], - "title": "Nodes up", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "Rate of read and write requests.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ops" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 6, - "w": 12, - "x": 0, - "y": 6 - }, - "id": 5, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "bdb_read_req{redis_cluster=~\"$redis_cluster\", job=~\"$job\", bdb=~\"$database\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ bdb }} - read" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "bdb_write_req{redis_cluster=~\"$redis_cluster\", job=~\"$job\", bdb=~\"$database\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{bdb}} - write" - } - ], - "title": "Database operations", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "Average rate of read and write latency", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "seconds" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 6, - "w": 12, - "x": 12, - "y": 6 - }, - "id": 6, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "bdb_avg_read_latency{redis_cluster=~\"$redis_cluster\", job=~\"$job\", bdb=~\"$database\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ bdb }} - read" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "bdb_avg_write_latency{redis_cluster=~\"$redis_cluster\", job=~\"$job\", bdb=~\"$database\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{bdb }} - write" - } - ], - "title": "Database average latency", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "Number of keys in the database.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "none" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 0, - "y": 12 - }, - "id": 7, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "bdb_no_of_keys{redis_cluster=~\"$redis_cluster\", job=~\"$job\", bdb=~\"$database\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ bdb }}" - } - ], - "title": "Database key count", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "Percentage of read operations that result in a cache hit.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percent" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 8, - "y": 12 - }, - "id": 8, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "bdb_read_hits{redis_cluster=~\"$redis_cluster\", job=~\"$job\", bdb=~\"$database\"} / clamp_min(bdb_read_misses{redis_cluster=~\"$redis_cluster\", job=~\"$job\", bdb=~\"$database\"} + bdb_read_hits{redis_cluster=~\"$redis_cluster\", job=~\"$job\", bdb=~\"$database\"}, 1) * 100", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ bdb }}" - } - ], - "title": "Database cache hit ratio", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "Rate of object expiration and eviction", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ops" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 16, - "y": 12 - }, - "id": 9, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "bdb_expired_objects{redis_cluster=~\"$redis_cluster\", job=~\"$job\", bdb=~\"$database\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ bdb }} - expired" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "bdb_evicted_objects{redis_cluster=~\"$redis_cluster\", job=~\"$job\", bdb=~\"$database\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ bdb }} - evicted" - } - ], - "title": "Database evictions vs expirations", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "Calculated memory utilization % of the database compared to the limit.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percent" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 0, - "y": 18 - }, - "id": 10, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "bdb_used_memory{redis_cluster=~\"$redis_cluster\", job=~\"$job\", bdb=~\"$database\"} / bdb_memory_limit{redis_cluster=~\"$redis_cluster\", job=~\"$job\", bdb=~\"$database\"} * 100", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ bdb }}" - } - ], - "title": "Database memory utilization", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "RAM fragmentation ratio between RSS and allocated RAM.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percent" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 8, - "y": 18 - }, - "id": 11, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "bdb_mem_frag_ratio{redis_cluster=~\"$redis_cluster\", job=~\"$job\", bdb=~\"$database\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ bdb }}" - } - ], - "title": "Database memory fragmentation ratio", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "LUA scripting heap size", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 16, - "y": 18 - }, - "id": 12, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "bdb_mem_size_lua{redis_cluster=~\"$redis_cluster\", job=~\"$job\", bdb=~\"$database\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ bdb }}" - } - ], - "title": "Database LUA heap size", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "Rate of incoming network traffic.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "binBps" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 0, - "y": 24 - }, - "id": 13, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "bdb_ingress_bytes{redis_cluster=~\"$redis_cluster\", job=~\"$job\", bdb=~\"$database\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ bdb }}" - } - ], - "title": "Database network ingress", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "Rate of outgoing network traffic.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "binBps" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 8, - "y": 24 - }, - "id": 14, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "bdb_egress_bytes{redis_cluster=~\"$redis_cluster\", job=~\"$job\", bdb=~\"$database\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ bdb }}" - } - ], - "title": "Database network egress", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "Number of client connections", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "none" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 6, - "w": 8, - "x": 16, - "y": 24 - }, - "id": 15, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "bdb_conns{redis_cluster=~\"$redis_cluster\", job=~\"$job\", bdb=~\"$database\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ bdb }}" - } - ], - "title": "Database connections", - "type": "timeseries" - }, - { - "collapsed": false, - "datasource": { - "uid": "${prometheus_datasource}" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 30 - }, - "id": 16, - "targets": [ ], - "title": "Active-active", - "type": "row" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "Sync status for CRDB traffic.\n- 0=in-sync\n- 1=syncing\n- 2=out of sync", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "none" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 31 - }, - "id": 17, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "bdb_crdt_syncer_status{redis_cluster=~\"$redis_cluster\", job=~\"$job\", bdb=~\"$database\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ bdb }} - repl_id: {{ crdt_replica_id }}" - } - ], - "title": "Sync status", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "Lag between source and destination for CRDB traffic.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "ms" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 31 - }, - "id": 18, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "bdb_crdt_syncer_local_ingress_lag_time{redis_cluster=~\"$redis_cluster\", job=~\"$job\", bdb=~\"$database\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ bdb }}" - } - ], - "title": "Local lag", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "Rate of compressed network traffic to the CRDB.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "binBps" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 31 - }, - "id": 19, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "bdb_crdt_syncer_ingress_bytes{redis_cluster=~\"$redis_cluster\", job=~\"$job\", bdb=~\"$database\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ bdb }}" - } - ], - "title": "CRDB ingress compressed", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "Rate of decompressed network traffic to the CRDB.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "binBps" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 31 - }, - "id": 20, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "bdb_crdt_ingress_bytes_decompressed{redis_cluster=~\"$redis_cluster\", job=~\"$job\", bdb=~\"$database\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ bdb }}" - } - ], - "title": "CRDB ingress decompressed", - "type": "timeseries" - } - ], - "refresh": "1m", - "rows": [ ], - "schemaVersion": 14, - "style": "dark", - "tags": [ - "redis-enterprise-mixin" - ], - "templating": { - "list": [ - { - "current": { }, - "hide": 0, - "label": "Data Source", - "name": "prometheus_datasource", - "options": [ ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": "", - "current": { }, - "datasource": { - "uid": "${prometheus_datasource}" - }, - "hide": 0, - "includeAll": true, - "label": "Job", - "multi": true, - "name": "job", - "options": [ ], - "query": "label_values(bdb_up, job)", - "refresh": 1, - "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tags": [ ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": "", - "current": { }, - "datasource": { - "uid": "${prometheus_datasource}" - }, - "hide": 0, - "includeAll": true, - "label": "Redis Cluster", - "multi": true, - "name": "redis_cluster", - "options": [ ], - "query": "label_values(bdb_up, redis_cluster)", - "refresh": 1, - "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tags": [ ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": "", - "current": { }, - "datasource": { - "uid": "${prometheus_datasource}" - }, - "hide": 0, - "includeAll": true, - "label": "Node", - "multi": true, - "name": "node", - "options": [ ], - "query": "label_values(redis_up, node)", - "refresh": 1, - "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tags": [ ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": "", - "current": { }, - "datasource": { - "uid": "${prometheus_datasource}" - }, - "hide": 0, - "includeAll": true, - "label": "Database", - "multi": true, - "name": "database", - "options": [ ], - "query": "label_values(bdb_up, bdb)", - "refresh": 1, - "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tags": [ ], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "default", - "title": "Redis Enterprise database overview", - "uid": "redis-enterprise-database-overview", - "version": 0 - } \ No newline at end of file diff --git a/redis-enterprise-mixin/dashboards_out/redis-enterprise-database-overview.jsonn b/redis-enterprise-mixin/dashboards_out/redis-enterprise-database-overview.jsonn new file mode 100644 index 000000000..aa094135d --- /dev/null +++ b/redis-enterprise-mixin/dashboards_out/redis-enterprise-database-overview.jsonn @@ -0,0 +1,1198 @@ +{ + "annotations": { + "list": [ ] + }, + "links": [ + { + "asDropdown": true, + "includeVars": true, + "keepTime": true, + "tags": [ + "redis-enterprise-mixin" + ], + "title": "All Redis Enterprise dashboards", + "type": "dashboards" + }, + { + "keepTime": true, + "title": "Redis Enterprise logs", + "type": "link", + "url": "/d/redisenterprise-logs" + }, + { + "title": "Redis Enterprise nodes", + "type": "link", + "url": "/d/redisenterprise_nodes" + }, + { + "title": "Redis Enterprise overview", + "type": "link", + "url": "/d/redisenterprise_overview" + } + ], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 0, + "x": 0, + "y": 0 + }, + "id": 1, + "panels": [ ], + "title": "Database overview", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "Displays up/down status for the selected database.", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" + }, + "unit": "none" + } + }, + "gridPos": { + "h": 6, + "w": 8, + "x": 0, + "y": 1 + }, + "id": 2, + "options": { + "legend": { + "calcs": [ ], + "displayMode": "list" + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "expr": "bdb_up{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", bdb=~\"$bdb\"}", + "format": "time_series", + "instant": false, + "legendFormat": "{{ bdb }}", + "refId": "Database up" + } + ], + "title": "Database up", + "type": "timeseries" + }, + { + "datasource": { + "type": "datasource", + "uid": "-- Mixed --" + }, + "description": "Displays up/down status for each shard related to the database.", + "fieldConfig": { + "defaults": { + "max": 1, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 0 + }, + { + "color": "green", + "value": 1 + } + ] + } + } + }, + "gridPos": { + "h": 6, + "w": 8, + "x": 8, + "y": 1 + }, + "id": 3, + "options": { + "displayMode": "basic", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ] + }, + "showUnfilled": true + }, + "pluginVersion": "v11.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "expr": "redis_up{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", bdb=~\"$bdb\"}", + "format": "time_series", + "instant": false, + "legendFormat": "{{ bdb }} - redis: {{ redis }}", + "refId": "Shard up" + } + ], + "title": "Shards up", + "type": "bargauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "Displays up/down status for each node related to the database.", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" + }, + "unit": "none" + } + }, + "gridPos": { + "h": 6, + "w": 8, + "x": 16, + "y": 1 + }, + "id": 4, + "options": { + "legend": { + "calcs": [ ], + "displayMode": "list" + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "expr": "node_up{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", node=~\"$node\"}", + "format": "time_series", + "instant": false, + "legendFormat": "{{ node }}", + "refId": "Nodes up" + } + ], + "title": "Nodes up", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 0, + "x": 0, + "y": 7 + }, + "id": 5, + "panels": [ ], + "title": "Database metrics", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "Rate of read and write requests.", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" + }, + "unit": "none" + } + }, + "gridPos": { + "h": 6, + "w": 8, + "x": 0, + "y": 8 + }, + "id": 6, + "options": { + "legend": { + "calcs": [ ], + "displayMode": "list" + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "expr": "bdb_read_req{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", bdb=~\"$bdb\"}", + "format": "time_series", + "instant": false, + "legendFormat": "{{ bdb }} - read", + "refId": "Database read requests" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "expr": "bdb_write_req{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", bdb=~\"$bdb\"}", + "format": "time_series", + "instant": false, + "legendFormat": "{{ bdb }} - write", + "refId": "Database write requests" + } + ], + "title": "Database operations", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "Average latency for read and write requests.", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" + }, + "unit": "s" + } + }, + "gridPos": { + "h": 6, + "w": 8, + "x": 8, + "y": 8 + }, + "id": 7, + "options": { + "legend": { + "calcs": [ ], + "displayMode": "list" + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "expr": "bdb_avg_read_latency{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", bdb=~\"$bdb\"}", + "format": "time_series", + "instant": false, + "legendFormat": "{{ bdb }} - read", + "refId": "Database read latency" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "expr": "bdb_avg_write_latency{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", bdb=~\"$bdb\"}", + "format": "time_series", + "instant": false, + "legendFormat": "{{ bdb }} - write", + "refId": "Database write latency" + } + ], + "title": "Database latency", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "Number of client connections.", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" + }, + "decimals": 1, + "noValue": "No packets", + "unit": "none" + } + }, + "gridPos": { + "h": 6, + "w": 8, + "x": 16, + "y": 8 + }, + "id": 8, + "options": { + "legend": { + "calcs": [ ], + "displayMode": "list" + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "expr": "bdb_conns{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", bdb=~\"$bdb\"}", + "format": "time_series", + "instant": false, + "legendFormat": "{{ bdb }}", + "refId": "Database connections" + } + ], + "title": "Database connections", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "Number of keys in the database.", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" + }, + "unit": "none" + } + }, + "gridPos": { + "h": 6, + "w": 8, + "x": 0, + "y": 14 + }, + "id": 9, + "options": { + "legend": { + "calcs": [ ], + "displayMode": "list" + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "expr": "bdb_no_of_keys{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", bdb=~\"$bdb\"}", + "format": "time_series", + "instant": false, + "legendFormat": "{{ bdb }}", + "refId": "Database key count" + } + ], + "title": "Database key count", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "Calculated cache hit rate for the database.", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" + }, + "unit": "percent" + } + }, + "gridPos": { + "h": 6, + "w": 8, + "x": 8, + "y": 14 + }, + "id": 10, + "options": { + "legend": { + "calcs": [ ], + "displayMode": "list" + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "expr": "sum(bdb_read_hits{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", bdb=~\"$bdb\"}) by (job, redis_cluster, bdb) / clamp_min(sum(bdb_read_hits{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", bdb=~\"$bdb\"}) by (job, redis_cluster, bdb) + sum(bdb_read_misses{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", bdb=~\"$bdb\"}) by (job, redis_cluster, bdb), 1) * 100", + "format": "time_series", + "instant": false, + "legendFormat": "{{ bdb }}", + "refId": "Database cache hit ratio" + } + ], + "title": "Database cache hit ratio", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "Calculated memory utilization % of the database compared to the limit.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-BlYlRd" + }, + "custom": { + "fillOpacity": 30, + "gradientMode": "scheme", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" + }, + "decimals": 1, + "max": 100, + "min": 0, + "unit": "percent" + } + }, + "gridPos": { + "h": 6, + "w": 8, + "x": 16, + "y": 14 + }, + "id": 11, + "options": { + "legend": { + "calcs": [ ], + "displayMode": "list" + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "expr": "bdb_used_memory{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", bdb=~\"$bdb\"} / bdb_memory_limit{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", bdb=~\"$bdb\"} * 100", + "format": "time_series", + "instant": false, + "legendFormat": "{{ bdb }}", + "refId": "Database memory utilization" + } + ], + "title": "Database memory utilization", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "Number of evicted and expired objects from the database.", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" + }, + "unit": "ops" + } + }, + "gridPos": { + "h": 6, + "w": 12, + "x": 0, + "y": 20 + }, + "id": 12, + "options": { + "legend": { + "calcs": [ ], + "displayMode": "list" + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "expr": "bdb_evicted_objects{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", bdb=~\"$bdb\"}", + "format": "time_series", + "instant": false, + "legendFormat": "{{ bdb }} - evicted", + "refId": "Database evicted objects" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "expr": "bdb_expired_objects{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", bdb=~\"$bdb\"}", + "format": "time_series", + "instant": false, + "legendFormat": "{{ bdb }} - expired", + "refId": "Database expired objects" + } + ], + "title": "Database evictions vs expired objects", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "RAM fragmentation ratio between RSS and allocated RAM.", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" + }, + "unit": "percent" + } + }, + "gridPos": { + "h": 6, + "w": 12, + "x": 12, + "y": 20 + }, + "id": 13, + "options": { + "legend": { + "calcs": [ ], + "displayMode": "list" + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "expr": "bdb_mem_frag_ratio{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", bdb=~\"$bdb\"}", + "format": "time_series", + "instant": false, + "legendFormat": "{{ bdb }}", + "refId": "Database memory fragmentation ratio" + } + ], + "title": "Database memory fragmentation ratio", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "LUA scripting heap size.", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" + }, + "min": 0, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": ".*(T|t)otal.*" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-orange", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 10, + 10 + ], + "fill": "dash" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 8, + "x": 0, + "y": 26 + }, + "id": 14, + "options": { + "legend": { + "calcs": [ ], + "displayMode": "list" + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "expr": "bdb_mem_size_lua{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", bdb=~\"$bdb\"}", + "format": "time_series", + "instant": false, + "legendFormat": "{{ bdb }}", + "refId": "Database LUA heap size" + } + ], + "title": "Database LUA heap size", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "Rate of incoming network traffic.", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" + }, + "decimals": 1, + "noValue": "No packets", + "unit": "binBps" + } + }, + "gridPos": { + "h": 6, + "w": 8, + "x": 8, + "y": 26 + }, + "id": 15, + "options": { + "legend": { + "calcs": [ ], + "displayMode": "list" + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "expr": "bdb_ingress_bytes{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", bdb=~\"$bdb\"}", + "format": "time_series", + "instant": false, + "legendFormat": "{{ bdb }}", + "refId": "Database network ingress" + } + ], + "title": "Database network ingress", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "Rate of outgoing network traffic.", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" + }, + "decimals": 1, + "noValue": "No packets", + "unit": "binBps" + } + }, + "gridPos": { + "h": 6, + "w": 8, + "x": 16, + "y": 26 + }, + "id": 16, + "options": { + "legend": { + "calcs": [ ], + "displayMode": "list" + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "expr": "bdb_egress_bytes{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", bdb=~\"$bdb\"}", + "format": "time_series", + "instant": false, + "legendFormat": "{{ bdb }}", + "refId": "Database network egress" + } + ], + "title": "Database network egress", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 0, + "x": 0, + "y": 32 + }, + "id": 17, + "panels": [ ], + "title": "Active-Active", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "Sync status for CRDB traffic (0=in-sync, 1=syncing, 2=out of sync).", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" + }, + "unit": "none" + } + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 0, + "y": 33 + }, + "id": 18, + "options": { + "legend": { + "calcs": [ ], + "displayMode": "list" + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "expr": "bdb_crdt_syncer_status{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", bdb=~\"$bdb\"}", + "format": "time_series", + "instant": false, + "legendFormat": "{{ bdb }} - repl_id: {{ crdt_replica_id }}", + "refId": "Sync status" + } + ], + "title": "Sync status", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "Lag between source and destination for CRDB traffic.", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" + }, + "unit": "ms" + } + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 6, + "y": 33 + }, + "id": 19, + "options": { + "legend": { + "calcs": [ ], + "displayMode": "list" + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "expr": "bdb_crdt_syncer_local_ingress_lag_time{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", bdb=~\"$bdb\"}", + "format": "time_series", + "instant": false, + "legendFormat": "{{ bdb }}", + "refId": "Local lag" + } + ], + "title": "Local lag", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "Rate of compressed network traffic to the CRDB.", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" + }, + "unit": "binBps" + } + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 12, + "y": 33 + }, + "id": 20, + "options": { + "legend": { + "calcs": [ ], + "displayMode": "list" + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "expr": "bdb_crdt_syncer_ingress_bytes{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", bdb=~\"$bdb\"}", + "format": "time_series", + "instant": false, + "legendFormat": "{{ bdb }}", + "refId": "CRDB ingress compressed" + } + ], + "title": "CRDB ingress compressed", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "Rate of decompressed network traffic to the CRDB.", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" + }, + "decimals": 1, + "noValue": "No packets", + "unit": "binBps" + } + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 18, + "y": 33 + }, + "id": 21, + "options": { + "legend": { + "calcs": [ ], + "displayMode": "list" + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "expr": "bdb_crdt_ingress_bytes_decompressed{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", bdb=~\"$bdb\"}", + "format": "time_series", + "instant": false, + "legendFormat": "{{ bdb }}", + "refId": "CRDB ingress decompressed" + } + ], + "title": "CRDB ingress decompressed", + "type": "timeseries" + } + ], + "refresh": "1m", + "schemaVersion": 39, + "tags": [ + "redis-enterprise-mixin" + ], + "templating": { + "list": [ + { + "label": "Prometheus data source", + "name": "prometheus_datasource", + "query": "prometheus", + "regex": "", + "type": "datasource" + }, + { + "allValue": ".+", + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "includeAll": true, + "label": "Job", + "multi": true, + "name": "job", + "query": "label_values(node_up{job=\"integrations/redis-enterprise\"}, job)", + "refresh": 2, + "sort": 1, + "type": "query" + }, + { + "allValue": ".*", + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "includeAll": true, + "label": "Redis cluster", + "multi": true, + "name": "redis_cluster", + "query": "label_values(node_up{job=\"integrations/redis-enterprise\",job=~\"$job\"}, redis_cluster)", + "refresh": 2, + "sort": 1, + "type": "query" + }, + { + "allValue": ".+", + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "includeAll": true, + "label": "Instance", + "multi": true, + "name": "instance", + "query": "label_values(node_up{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\"}, instance)", + "refresh": 2, + "sort": 1, + "type": "query" + }, + { + "hide": 2, + "label": "Loki data source", + "name": "loki_datasource", + "query": "loki", + "regex": "", + "type": "datasource" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "includeAll": true, + "multi": true, + "name": "node", + "query": "label_values(node_up, node)", + "type": "query" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "includeAll": true, + "multi": true, + "name": "bdb", + "query": "label_values(bdb_up, bdb)", + "type": "query" + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timezone": "default", + "title": "Redis Enterprise databases", + "uid": "redisenterprise_databases" + } \ No newline at end of file diff --git a/redis-enterprise-mixin/dashboards_out/redis-enterprise-logs.json b/redis-enterprise-mixin/dashboards_out/redis-enterprise-logs.json new file mode 100644 index 000000000..1bf938e85 --- /dev/null +++ b/redis-enterprise-mixin/dashboards_out/redis-enterprise-logs.json @@ -0,0 +1,307 @@ +{ + "annotations": { + "list": [ ] + }, + "links": [ + { + "asDropdown": true, + "includeVars": true, + "keepTime": true, + "tags": [ + "redis-enterprise-mixin" + ], + "title": "All Redis Enterprise dashboards", + "type": "dashboards" + }, + { + "title": "Redis Enterprise databases", + "type": "link", + "url": "/d/redisenterprise_databases" + }, + { + "title": "Redis Enterprise nodes", + "type": "link", + "url": "/d/redisenterprise_nodes" + }, + { + "title": "Redis Enterprise overview", + "type": "link", + "url": "/d/redisenterprise_overview" + } + ], + "panels": [ + { + "datasource": { + "type": "loki", + "uid": "${loki_datasource}" + }, + "description": "Logs volume grouped by \"level\" label.", + "fieldConfig": { + "defaults": { + "custom": { + "drawStyle": "bars", + "fillOpacity": 50, + "stacking": { + "mode": "normal" + } + }, + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "(E|e)merg|(F|f)atal|(A|a)lert|(C|c)rit.*" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "(E|e)(rr.*|RR.*)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "(W|w)(arn.*|ARN.*|rn|RN)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "(N|n)(otice|ote)|(I|i)(nf.*|NF.*)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "dbg.*|DBG.*|(D|d)(EBUG|ebug)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "(T|t)(race|RACE)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "logs" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "text", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 1, + "maxDataPoints": 100, + "options": { + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "loki", + "uid": "${loki_datasource}" + }, + "expr": "sum by (level) (count_over_time({job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\"}\n|~ \"$regex_search\"\n\n[$__auto]))\n", + "legendFormat": "{{ level }}" + } + ], + "title": "Logs volume", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "Value", + "renamePattern": "logs" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "datasource", + "uid": "-- Mixed --" + }, + "gridPos": { + "h": 18, + "w": 24, + "x": 0, + "y": 18 + }, + "id": 2, + "options": { + "dedupStrategy": "exact", + "enableLogDetails": true, + "prettifyLogMessage": true, + "showTime": false, + "wrapLogMessage": false + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "loki", + "uid": "${loki_datasource}" + }, + "expr": "{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\"} \n|~ \"$regex_search\"\n\n\n" + } + ], + "title": "Logs", + "type": "logs" + } + ], + "refresh": "1m", + "schemaVersion": 39, + "tags": [ + "redis-enterprise-mixin" + ], + "templating": { + "list": [ + { + "label": "Loki data source", + "name": "loki_datasource", + "query": "loki", + "regex": "", + "type": "datasource" + }, + { + "allValue": ".*", + "datasource": { + "type": "loki", + "uid": "${loki_datasource}" + }, + "includeAll": true, + "label": "Job", + "multi": true, + "name": "job", + "query": "label_values({job=\"integrations/redis-enterprise\"}, job)", + "refresh": 2, + "sort": 1, + "type": "query" + }, + { + "allValue": ".*", + "datasource": { + "type": "loki", + "uid": "${loki_datasource}" + }, + "includeAll": true, + "label": "Redis cluster", + "multi": true, + "name": "redis_cluster", + "query": "label_values({job=\"integrations/redis-enterprise\",job=~\"$job\"}, redis_cluster)", + "refresh": 2, + "sort": 1, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "", + "value": "" + }, + "label": "Regex search", + "name": "regex_search", + "options": [ + { + "selected": true, + "text": "", + "value": "" + } + ], + "query": "", + "type": "textbox" + }, + { + "hide": 2, + "label": "Prometheus data source", + "name": "prometheus_datasource", + "query": "prometheus", + "regex": "", + "type": "datasource" + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timezone": "default", + "title": "Redis Enterprise logs", + "uid": "redisenterprise-logs" + } \ No newline at end of file diff --git a/redis-enterprise-mixin/dashboards_out/redis-enterprise-node-overview.json b/redis-enterprise-mixin/dashboards_out/redis-enterprise-node-overview.json index 1cb49809b..38b4aaef1 100644 --- a/redis-enterprise-mixin/dashboards_out/redis-enterprise-node-overview.json +++ b/redis-enterprise-mixin/dashboards_out/redis-enterprise-node-overview.json @@ -1,116 +1,96 @@ { - "__inputs": [ ], - "__requires": [ ], "annotations": { "list": [ ] }, - "description": "", - "editable": false, - "gnetId": null, - "graphTooltip": 0, - "hideControls": false, - "id": null, "links": [ { - "asDropdown": false, - "icon": "external link", + "asDropdown": true, "includeVars": true, "keepTime": true, "tags": [ "redis-enterprise-mixin" ], - "targetBlank": false, - "title": "Other Redis Enterprise dashboards", - "type": "dashboards", - "url": "" + "title": "All Redis Enterprise dashboards", + "type": "dashboards" + }, + { + "title": "Redis Enterprise databases", + "type": "link", + "url": "/d/redisenterprise_databases" + }, + { + "keepTime": true, + "title": "Redis Enterprise logs", + "type": "link", + "url": "/d/redisenterprise-logs" + }, + { + "title": "Redis Enterprise overview", + "type": "link", + "url": "/d/redisenterprise_overview" } ], "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 0, + "x": 0, + "y": 0 + }, + "id": 1, + "panels": [ ], + "title": "Node overview", + "type": "row" + }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "description": "Displays up/down status for the selected node", + "description": "Displays up/down status for the selected node.", "fieldConfig": { "defaults": { - "color": { - "mode": "palette-classic" - }, "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ ] + "unit": "none" + } }, "gridPos": { "h": 6, "w": 8, "x": 0, - "y": 0 + "y": 1 }, "id": 2, "options": { "legend": { "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "displayMode": "list" }, "tooltip": { - "mode": "single", - "sort": "none" + "mode": "multi", + "sort": "desc" } }, + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "node_up{redis_cluster=~\"$redis_cluster\", job=~\"$job\", node=~\"$node\"}", + "expr": "node_up{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", node=~\"$node\"}", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ node }}" + "instant": false, + "legendFormat": "{{ node }}", + "refId": "Node up" } ], "title": "Nodes up", @@ -118,16 +98,12 @@ }, { "datasource": { - "uid": "${prometheus_datasource}" + "type": "datasource", + "uid": "-- Mixed --" }, "description": "Displays up/down status for the databases of the selected node(s).", "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, - "displayName": "${__series.name}", - "mappings": [ ], "min": 0, "thresholds": { "mode": "absolute", @@ -146,40 +122,37 @@ } ] } - }, - "overrides": [ ] + } }, "gridPos": { "h": 6, "w": 8, "x": 8, - "y": 0 + "y": 1 }, "id": 3, "options": { "displayMode": "basic", - "minVizHeight": 10, - "minVizWidth": 0, "orientation": "horizontal", "reduceOptions": { "calcs": [ "lastNotNull" - ], - "fields": "", - "values": false + ] }, "showUnfilled": true }, - "pluginVersion": "9.4.7", + "pluginVersion": "v11.4.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "bdb_up{redis_cluster=~\"$redis_cluster\", job=~\"$job\"}", + "expr": "bdb_up{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"}", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "db: {{ bdb }}" + "instant": false, + "legendFormat": "db: {{ bdb }}", + "refId": "Database up" } ], "title": "Database up", @@ -187,16 +160,12 @@ }, { "datasource": { - "uid": "${prometheus_datasource}" + "type": "datasource", + "uid": "-- Mixed --" }, "description": "Displays up/down status for the shards on the selected node.", "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, - "displayName": "${__series.name}", - "mappings": [ ], "min": 0, "thresholds": { "mode": "absolute", @@ -215,131 +184,102 @@ } ] } - }, - "overrides": [ ] + } }, "gridPos": { "h": 6, "w": 8, "x": 16, - "y": 0 + "y": 1 }, "id": 4, "options": { "displayMode": "basic", - "minVizHeight": 10, - "minVizWidth": 0, "orientation": "horizontal", "reduceOptions": { "calcs": [ "lastNotNull" - ], - "fields": "", - "values": false + ] }, "showUnfilled": true }, - "pluginVersion": "9.4.7", + "pluginVersion": "v11.4.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "redis_up{redis_cluster=~\"$redis_cluster\", job=~\"$job\", node=~\"$node\"}", + "expr": "redis_up{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", node=~\"$node\"}", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "redis: {{redis}}" + "instant": false, + "legendFormat": "redis: {{ redis }}", + "refId": "Shard up" } ], "title": "Shards up", "type": "bargauge" }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 0, + "x": 0, + "y": 7 + }, + "id": 5, + "panels": [ ], + "title": "Node metrics", + "type": "row" + }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, "description": "Total endpoint request rate for the selected node.", "fieldConfig": { "defaults": { - "color": { - "mode": "palette-classic" - }, "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "reqps" - }, - "overrides": [ ] + "unit": "none" + } }, "gridPos": { "h": 6, "w": 8, "x": 0, - "y": 6 + "y": 8 }, - "id": 5, + "id": 6, "options": { "legend": { "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "displayMode": "list" }, "tooltip": { - "mode": "single", - "sort": "none" + "mode": "multi", + "sort": "desc" } }, + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "node_total_req{redis_cluster=~\"$redis_cluster\", job=~\"$job\", node=~\"$node\"}", + "expr": "node_total_req{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", node=~\"$node\"}", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ node }}" + "instant": false, + "legendFormat": "{{ node }}", + "refId": "Node requests" } ], "title": "Node requests", @@ -347,90 +287,51 @@ }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "description": "Average request latency for the selected node.", + "description": "Average latency for the selected node.", "fieldConfig": { "defaults": { - "color": { - "mode": "palette-classic" - }, "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" }, "unit": "s" - }, - "overrides": [ ] + } }, "gridPos": { "h": 6, "w": 8, "x": 8, - "y": 6 + "y": 8 }, - "id": 6, + "id": 7, "options": { "legend": { "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "displayMode": "list" }, "tooltip": { - "mode": "single", - "sort": "none" + "mode": "multi", + "sort": "desc" } }, + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "node_avg_latency{redis_cluster=~\"$redis_cluster\", job=~\"$job\", node=~\"$node\"}", + "expr": "node_avg_latency{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", node=~\"$node\"}", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ node }}" + "instant": false, + "legendFormat": "{{ node }}", + "refId": "Node average latency" } ], "title": "Node average latency", @@ -438,99 +339,62 @@ }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "description": "CPU utilization for idle, main, and user threads.", + "description": "CPU utilization for the selected node.", "fieldConfig": { "defaults": { - "color": { - "mode": "palette-classic" - }, "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" }, "unit": "percent" - }, - "overrides": [ ] + } }, "gridPos": { "h": 6, "w": 8, "x": 16, - "y": 6 + "y": 8 }, - "id": 7, + "id": 8, "options": { "legend": { "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "displayMode": "list" }, "tooltip": { - "mode": "single", - "sort": "none" + "mode": "multi", + "sort": "desc" } }, + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "node_cpu_system{redis_cluster=~\"$redis_cluster\", job=~\"$job\", node=~\"$node\"} * 100", + "expr": "node_cpu_system{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", node=~\"$node\"} * 100", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ node }} - system" + "instant": false, + "legendFormat": "{{ node }} - system", + "refId": "Node CPU system" }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "node_cpu_user{redis_cluster=~\"$redis_cluster\", job=~\"$job\", node=~\"$node\"} * 100", + "expr": "node_cpu_user{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", node=~\"$node\"} * 100", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{node}} - user" + "instant": false, + "legendFormat": "{{ node }} - user", + "refId": "Node CPU user" } ], "title": "Node CPU utilization", @@ -538,90 +402,51 @@ }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "description": "Node memory utilization %.", + "description": "Memory utilization % for the selected node.", "fieldConfig": { "defaults": { - "color": { - "mode": "palette-classic" - }, "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" }, "unit": "percent" - }, - "overrides": [ ] + } }, "gridPos": { "h": 6, "w": 8, "x": 0, - "y": 12 + "y": 14 }, - "id": 8, + "id": 9, "options": { "legend": { "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "displayMode": "list" }, "tooltip": { - "mode": "single", - "sort": "none" + "mode": "multi", + "sort": "desc" } }, + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "(sum(redis_used_memory{redis_cluster=~\"$redis_cluster\", job=~\"$job\", node=~\"$node\"}) by (redis_cluster, job, node) / clamp_min(sum(node_available_memory{redis_cluster=~\"$redis_cluster\", job=~\"$job\", node=~\"$node\"}) by (redis_cluster, job, node) + sum(redis_used_memory{redis_cluster=~\"$redis_cluster\", job=~\"$job\", node=~\"$node\"}) by (redis_cluster, job, node), 1)) * 100", + "expr": "(sum(redis_used_memory{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"}) by (redis_cluster, node, job) / clamp_min(sum(node_available_memory{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"}) by (redis_cluster, node, job), 1)) * 100", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{node}}" + "instant": false, + "legendFormat": "{{ node }}", + "refId": "Node memory utilization" } ], "title": "Node memory utilization", @@ -629,90 +454,51 @@ }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "description": "Ephemeral storage available for the selected node.\n", + "description": "Ephemeral storage available for the selected node.", "fieldConfig": { "defaults": { - "color": { - "mode": "palette-classic" - }, "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] + "fillOpacity": 1, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" }, "unit": "bytes" - }, - "overrides": [ ] + } }, "gridPos": { "h": 6, "w": 8, "x": 8, - "y": 12 + "y": 14 }, - "id": 9, + "id": 10, "options": { "legend": { "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "displayMode": "list" }, "tooltip": { - "mode": "single", - "sort": "none" + "mode": "multi", + "sort": "desc" } }, + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "node_ephemeral_storage_free{redis_cluster=~\"$redis_cluster\", job=~\"$job\", node=~\"$node\"}", + "expr": "node_ephemeral_storage_free{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", node=~\"$node\"}", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ node }}" + "instant": false, + "legendFormat": "{{ node }}", + "refId": "Node ephemeral free storage" } ], "title": "Node ephemeral free storage", @@ -720,90 +506,51 @@ }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "description": "Persistent storage available for the selected node", + "description": "Persistent storage available for the selected node.", "fieldConfig": { "defaults": { - "color": { - "mode": "palette-classic" - }, "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] + "fillOpacity": 1, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" }, "unit": "bytes" - }, - "overrides": [ ] + } }, "gridPos": { "h": 6, "w": 8, "x": 16, - "y": 12 + "y": 14 }, - "id": 10, + "id": 11, "options": { "legend": { "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "displayMode": "list" }, "tooltip": { - "mode": "single", - "sort": "none" + "mode": "multi", + "sort": "desc" } }, + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "node_persistent_storage_free{redis_cluster=~\"$redis_cluster\", job=~\"$job\", node=~\"$node\"}", + "expr": "node_persistent_storage_free{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", node=~\"$node\"}", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ node }}" + "instant": false, + "legendFormat": "{{ node }}", + "refId": "Node persistent free storage" } ], "title": "Node persistent free storage", @@ -811,90 +558,53 @@ }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "description": "Rate of incoming network traffic to the selected node", + "description": "Network ingress for the selected node.", "fieldConfig": { "defaults": { - "color": { - "mode": "palette-classic" - }, "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" + }, + "decimals": 1, + "noValue": "No packets", "unit": "binBps" - }, - "overrides": [ ] + } }, "gridPos": { "h": 6, "w": 8, "x": 0, - "y": 18 + "y": 20 }, - "id": 11, + "id": 12, "options": { "legend": { "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "displayMode": "list" }, "tooltip": { - "mode": "single", - "sort": "none" + "mode": "multi", + "sort": "desc" } }, + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "node_ingress_bytes{redis_cluster=~\"$redis_cluster\", job=~\"$job\", node=~\"$node\"}", + "expr": "node_network_ingress{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", node=~\"$node\"}", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ node }}" + "instant": false, + "legendFormat": "{{ node }}", + "refId": "Node network ingress" } ], "title": "Node network ingress", @@ -902,90 +612,53 @@ }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "description": "Rate of outgoing network traffic to the selected node.", + "description": "Network egress for the selected node.", "fieldConfig": { "defaults": { - "color": { - "mode": "palette-classic" - }, "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" + }, + "decimals": 1, + "noValue": "No packets", "unit": "binBps" - }, - "overrides": [ ] + } }, "gridPos": { "h": 6, "w": 8, "x": 8, - "y": 18 + "y": 20 }, - "id": 12, + "id": 13, "options": { "legend": { "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "displayMode": "list" }, "tooltip": { - "mode": "single", - "sort": "none" + "mode": "multi", + "sort": "desc" } }, + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "node_egress_bytes{redis_cluster=~\"$redis_cluster\", job=~\"$job\", node=~\"$node\"}", + "expr": "node_network_egress{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", node=~\"$node\"}", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ node }}" + "instant": false, + "legendFormat": "{{ node }}", + "refId": "Node network egress" } ], "title": "Node network egress", @@ -993,228 +666,136 @@ }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "description": "Number of client connections to each node.", + "description": "Number of client connections to the selected node.", "fieldConfig": { "defaults": { - "color": { - "mode": "palette-classic" - }, "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" + }, + "decimals": 1, + "noValue": "No packets", "unit": "none" - }, - "overrides": [ ] + } }, "gridPos": { "h": 6, "w": 8, "x": 16, - "y": 18 + "y": 20 }, - "id": 13, + "id": 14, "options": { "legend": { "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "displayMode": "list" }, "tooltip": { - "mode": "single", - "sort": "none" + "mode": "multi", + "sort": "desc" } }, + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "node_conns{redis_cluster=~\"$redis_cluster\", job=~\"$job\", node=~\"$node\"}", + "expr": "node_conns{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\", node=~\"$node\"}", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ node }}" + "instant": false, + "legendFormat": "{{ node }}", + "refId": "Node client connections" } ], "title": "Node client connections", "type": "timeseries" - }, - { - "datasource": { - "uid": "${loki_datasource}" - }, - "description": "Recent logs outputted from the Redis server.", - "gridPos": { - "h": 8, - "w": 24, - "x": 0, - "y": 24 - }, - "id": 14, - "options": { - "dedupStrategy": "none", - "enableLogDetails": true, - "prettifyLogMessage": false, - "showCommonLabels": false, - "showLabels": false, - "showTime": false, - "sortOrder": "Descending", - "wrapLogMessage": false - }, - "targets": [ - { - "datasource": { - "uid": "${loki_datasource}" - }, - "editorMode": "code", - "expr": "{filename=~\"/var/opt/redislabs/log/redis-.*.log\", job=~\"$job\", redis_cluster=~\"$redis_cluster\"} |= ``", - "queryType": "range", - "refId": "A" - } - ], - "title": "Redis logs", - "type": "logs" } ], "refresh": "1m", - "rows": [ ], - "schemaVersion": 14, - "style": "dark", + "schemaVersion": 39, "tags": [ "redis-enterprise-mixin" ], "templating": { "list": [ { - "current": { }, - "hide": 0, - "label": "Data Source", + "label": "Prometheus data source", "name": "prometheus_datasource", - "options": [ ], "query": "prometheus", - "refresh": 1, "regex": "", "type": "datasource" }, { - "current": { }, - "hide": 0, - "label": "Loki Datasource", - "name": "loki_datasource", - "options": [ ], - "query": "loki", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": "", - "current": { }, + "allValue": ".+", "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "hide": 0, "includeAll": true, "label": "Job", "multi": true, "name": "job", - "options": [ ], - "query": "label_values(node_up, job)", - "refresh": 1, - "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tags": [ ], - "tagsQuery": "", - "type": "query", - "useTags": false + "query": "label_values(node_up{job=\"integrations/redis-enterprise\"}, job)", + "refresh": 2, + "sort": 1, + "type": "query" }, { - "allValue": "", - "current": { }, + "allValue": ".*", "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "hide": 0, "includeAll": true, - "label": "Redis Cluster", + "label": "Redis cluster", "multi": true, "name": "redis_cluster", - "options": [ ], - "query": "label_values(node_up, redis_cluster)", - "refresh": 1, + "query": "label_values(node_up{job=\"integrations/redis-enterprise\",job=~\"$job\"}, redis_cluster)", + "refresh": 2, + "sort": 1, + "type": "query" + }, + { + "allValue": ".+", + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "includeAll": true, + "label": "Instance", + "multi": true, + "name": "instance", + "query": "label_values(node_up{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\"}, instance)", + "refresh": 2, + "sort": 1, + "type": "query" + }, + { + "hide": 2, + "label": "Loki data source", + "name": "loki_datasource", + "query": "loki", "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tags": [ ], - "tagsQuery": "", - "type": "query", - "useTags": false + "type": "datasource" }, { - "allValue": "", - "current": { }, "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "hide": 0, "includeAll": true, - "label": "Node", "multi": true, "name": "node", - "options": [ ], - "query": "label_values(node_up, node)\n", - "refresh": 1, - "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tags": [ ], - "tagsQuery": "", - "type": "query", - "useTags": false + "query": "label_values(node_up, node)", + "type": "query" } ] }, @@ -1222,33 +803,7 @@ "from": "now-1h", "to": "now" }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, "timezone": "default", - "title": "Redis Enterprise node overview", - "uid": "redis-enterprise-node-overview", - "version": 0 + "title": "Redis Enterprise nodes", + "uid": "redisenterprise_nodes" } \ No newline at end of file diff --git a/redis-enterprise-mixin/dashboards_out/redis-enterprise-overview.json b/redis-enterprise-mixin/dashboards_out/redis-enterprise-overview.json index a245eb5d8..46385941b 100644 --- a/redis-enterprise-mixin/dashboards_out/redis-enterprise-overview.json +++ b/redis-enterprise-mixin/dashboards_out/redis-enterprise-overview.json @@ -1,43 +1,57 @@ { - "__inputs": [ ], - "__requires": [ ], "annotations": { "list": [ ] }, - "description": "", - "editable": false, - "gnetId": null, - "graphTooltip": 0, - "hideControls": false, - "id": null, "links": [ { - "asDropdown": false, - "icon": "external link", + "asDropdown": true, "includeVars": true, "keepTime": true, "tags": [ "redis-enterprise-mixin" ], - "targetBlank": false, - "title": "Other Redis Enterprise dashboards", - "type": "dashboards", - "url": "" + "title": "All Redis Enterprise dashboards", + "type": "dashboards" + }, + { + "title": "Redis Enterprise databases", + "type": "link", + "url": "/d/redisenterprise_databases" + }, + { + "keepTime": true, + "title": "Redis Enterprise logs", + "type": "link", + "url": "/d/redisenterprise-logs" + }, + { + "title": "Redis Enterprise nodes", + "type": "link", + "url": "/d/redisenterprise_nodes" } ], "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 0, + "x": 0, + "y": 0 + }, + "id": 1, + "panels": [ ], + "title": "Overview", + "type": "row" + }, { "datasource": { - "uid": "${prometheus_datasource}" + "type": "datasource", + "uid": "-- Mixed --" }, "description": "Up/down status for each node in the cluster.", "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, - "displayName": "${__series.name}", - "mappings": [ ], "min": 0, "thresholds": { "mode": "absolute", @@ -52,40 +66,37 @@ } ] } - }, - "overrides": [ ] + } }, "gridPos": { "h": 6, "w": 8, "x": 0, - "y": 0 + "y": 1 }, "id": 2, "options": { "displayMode": "basic", - "minVizHeight": 10, - "minVizWidth": 0, "orientation": "horizontal", "reduceOptions": { "calcs": [ "lastNotNull" - ], - "fields": "", - "values": false + ] }, "showUnfilled": true }, - "pluginVersion": "9.4.7", + "pluginVersion": "v11.4.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "node_up{redis_cluster=~\"$redis_cluster\", job=~\"$job\"}", + "expr": "node_up{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"}", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ redis_cluster }} - {{ node }}" + "instant": false, + "legendFormat": "{{ redis_cluster }} - {{ node }}", + "refId": "Node up" } ], "title": "Nodes up", @@ -93,16 +104,12 @@ }, { "datasource": { - "uid": "${prometheus_datasource}" + "type": "datasource", + "uid": "-- Mixed --" }, "description": "Up/down status for each database in the cluster.", "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, - "displayName": "${__series.name}", - "mappings": [ ], "max": 1, "min": 0, "thresholds": { @@ -118,40 +125,37 @@ } ] } - }, - "overrides": [ ] + } }, "gridPos": { "h": 6, "w": 8, "x": 8, - "y": 0 + "y": 1 }, "id": 3, "options": { "displayMode": "basic", - "minVizHeight": 10, - "minVizWidth": 0, "orientation": "horizontal", "reduceOptions": { "calcs": [ "lastNotNull" - ], - "fields": "", - "values": false + ] }, "showUnfilled": true }, - "pluginVersion": "9.4.7", + "pluginVersion": "v11.4.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "bdb_up{redis_cluster=~\"$redis_cluster\", job=~\"$job\"}", + "expr": "bdb_up{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"}", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ redis_cluster }} - bdb={{bdb}}" + "instant": false, + "legendFormat": "{{ redis_cluster }} - bdb={{ bdb }}", + "refId": "Database up" } ], "title": "Databases up", @@ -159,16 +163,12 @@ }, { "datasource": { - "uid": "${prometheus_datasource}" + "type": "datasource", + "uid": "-- Mixed --" }, "description": "Up/down status for each shard in the cluster.", "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, - "displayName": "${__series.name}", - "mappings": [ ], "min": 0, "thresholds": { "mode": "absolute", @@ -183,40 +183,37 @@ } ] } - }, - "overrides": [ ] + } }, "gridPos": { "h": 6, "w": 8, "x": 16, - "y": 0 + "y": 1 }, "id": 4, "options": { "displayMode": "basic", - "minVizHeight": 10, - "minVizWidth": 0, "orientation": "horizontal", "reduceOptions": { "calcs": [ "lastNotNull" - ], - "fields": "", - "values": false + ] }, "showUnfilled": true }, - "pluginVersion": "9.4.7", + "pluginVersion": "v11.4.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "redis_up{redis_cluster=~\"$redis_cluster\", job=~\"$job\"}", + "expr": "redis_up{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"}", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ redis_cluster }} - redis: {{ redis }} " + "instant": false, + "legendFormat": "{{ redis_cluster }} - redis: {{ redis }}", + "refId": "Shard up" } ], "title": "Shards up", @@ -224,89 +221,53 @@ }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, "description": "Total requests handled by endpoints aggregated across all nodes.", "fieldConfig": { "defaults": { - "color": { - "mode": "palette-classic" - }, "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ ] + "decimals": 1, + "noValue": "No packets", + "unit": "none" + } }, "gridPos": { "h": 6, "w": 8, "x": 0, - "y": 6 + "y": 7 }, "id": 5, "options": { "legend": { "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "displayMode": "list" }, "tooltip": { - "mode": "single", - "sort": "none" + "mode": "multi", + "sort": "desc" } }, + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "sum(node_total_req{redis_cluster=~\"$redis_cluster\", job=~\"$job\"}) by (redis_cluster, job)", + "expr": "sum(node_total_req{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"}) by (redis_cluster, job)", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ redis_cluster }}" + "instant": false, + "legendFormat": "{{ redis_cluster }}", + "refId": "Cluster total requests" } ], "title": "Cluster total requests", @@ -314,90 +275,83 @@ }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "description": "Total memory used by each across each database in the cluster", + "description": "Total memory used by each database in the cluster.", "fieldConfig": { "defaults": { - "color": { - "mode": "palette-classic" - }, "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ + "min": 0, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": ".*(T|t)otal.*" + }, + "properties": [ { - "color": "green", - "value": null + "id": "color", + "value": { + "fixedColor": "light-orange", + "mode": "fixed" + } }, { - "color": "red", - "value": 80 + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 10, + 10 + ], + "fill": "dash" + } } ] - }, - "unit": "bytes" - }, - "overrides": [ ] + } + ] }, "gridPos": { "h": 6, "w": 8, "x": 8, - "y": 6 + "y": 7 }, "id": 6, "options": { "legend": { "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "displayMode": "list" }, "tooltip": { - "mode": "single", - "sort": "none" + "mode": "multi", + "sort": "desc" } }, + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "sum(bdb_used_memory{redis_cluster=~\"$redis_cluster\", job=~\"$job\"}) by (job, bdb, redis_cluster)", + "expr": "sum(bdb_used_memory{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"}) by (job, bdb, redis_cluster)", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ redis_cluster }} - db: {{ bdb }}" + "instant": false, + "legendFormat": "{{ redis_cluster }} - db: {{ bdb }}", + "refId": "Cluster total memory used" } ], "title": "Cluster total memory used", @@ -405,90 +359,53 @@ }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, "description": "Total connections to each database in the cluster.", "fieldConfig": { "defaults": { - "color": { - "mode": "palette-classic" - }, "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" }, + "decimals": 1, + "noValue": "No packets", "unit": "none" - }, - "overrides": [ ] + } }, "gridPos": { "h": 6, "w": 8, "x": 16, - "y": 6 + "y": 7 }, "id": 7, "options": { "legend": { "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "displayMode": "list" }, "tooltip": { - "mode": "single", - "sort": "none" + "mode": "multi", + "sort": "desc" } }, + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "sum(bdb_conns{redis_cluster=~\"$redis_cluster\", job=~\"$job\"}) by (bdb, redis_cluster, job)", + "expr": "sum(bdb_conns{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"}) by (bdb, redis_cluster, job)", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ redis_cluster }} - db: {{ bdb }}" + "instant": false, + "legendFormat": "{{ redis_cluster }} - db: {{ bdb }}", + "refId": "Cluster total connections" } ], "title": "Cluster total connections", @@ -496,89 +413,51 @@ }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, "description": "Total cluster key count for each database in the cluster.", "fieldConfig": { "defaults": { - "color": { - "mode": "palette-classic" - }, "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ ] + "unit": "none" + } }, "gridPos": { "h": 6, "w": 8, "x": 0, - "y": 12 + "y": 13 }, "id": 8, "options": { "legend": { "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "displayMode": "list" }, "tooltip": { - "mode": "single", - "sort": "none" + "mode": "multi", + "sort": "desc" } }, + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "sum(bdb_no_of_keys{redis_cluster=~\"$redis_cluster\", job=~\"$job\"}) by (redis_cluster, bdb, job)", + "expr": "sum(bdb_no_of_keys{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"}) by (redis_cluster, bdb, job)", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ redis_cluster }} - db: {{ bdb }}" + "instant": false, + "legendFormat": "{{ redis_cluster }} - db: {{ bdb }}", + "refId": "Cluster total keys" } ], "title": "Cluster total keys", @@ -586,90 +465,51 @@ }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, "description": "Ratio of database cache key hits against hits and misses.", "fieldConfig": { "defaults": { - "color": { - "mode": "palette-classic" - }, "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" }, "unit": "percent" - }, - "overrides": [ ] + } }, "gridPos": { "h": 6, "w": 8, "x": 8, - "y": 12 + "y": 13 }, "id": 9, "options": { "legend": { "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "displayMode": "list" }, "tooltip": { - "mode": "single", - "sort": "none" + "mode": "multi", + "sort": "desc" } }, + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "bdb_read_hits{redis_cluster=~\"$redis_cluster\", job=~\"$job\"} / (clamp_min(bdb_read_hits{redis_cluster=~\"$redis_cluster\", job=~\"$job\"} + bdb_read_misses{redis_cluster=~\"$redis_cluster\", job=~\"$job\"}, 1)) * 100", + "expr": "bdb_read_hits{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"} / (clamp_min(bdb_read_hits{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"} + bdb_read_misses{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"}, 1)) * 100", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ redis_cluster }} - db: {{ bdb }}" + "instant": false, + "legendFormat": "{{ redis_cluster }} - db: {{ bdb }}", + "refId": "Cluster cache hit ratio" } ], "title": "Cluster cache hit ratio", @@ -677,99 +517,62 @@ }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, "description": "Sum of key evictions and expirations in the cluster by database.", "fieldConfig": { "defaults": { - "color": { - "mode": "palette-classic" - }, "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" }, "unit": "ops" - }, - "overrides": [ ] + } }, "gridPos": { "h": 6, "w": 8, "x": 16, - "y": 12 + "y": 13 }, "id": 10, "options": { "legend": { "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "displayMode": "list" }, "tooltip": { - "mode": "single", - "sort": "none" + "mode": "multi", + "sort": "desc" } }, + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "bdb_evicted_objects{redis_cluster=~\"$redis_cluster\", job=~\"$job\"}", + "expr": "bdb_evicted_objects{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"}", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ redis_cluster }} - db: {{ bdb }} - evicted" + "instant": false, + "legendFormat": "{{ redis_cluster }} - db: {{ bdb }} - evicted", + "refId": "Cluster evicted objects" }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "bdb_expired_objects{redis_cluster=~\"$redis_cluster\", job=~\"$job\"}", + "expr": "bdb_expired_objects{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"}", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ redis_cluster }} - db: {{ bdb }} - expired" + "instant": false, + "legendFormat": "{{ redis_cluster }} - db: {{ bdb }} - expired", + "refId": "Cluster expired objects" } ], "title": "Cluster evictions vs expired objects", @@ -777,106 +580,66 @@ }, { "collapsed": false, - "datasource": { - "uid": "${prometheus_datasource}" - }, "gridPos": { "h": 1, - "w": 24, + "w": 0, "x": 0, - "y": 18 + "y": 19 }, "id": 11, - "targets": [ ], + "panels": [ ], "title": "Nodes KPIs", "type": "row" }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, "description": "Endpoint request rate for each node in the cluster.", "fieldConfig": { "defaults": { - "color": { - "mode": "palette-classic" - }, "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" }, + "decimals": 1, + "noValue": "No packets", "unit": "reqps" - }, - "overrides": [ ] + } }, "gridPos": { "h": 6, "w": 6, "x": 0, - "y": 19 + "y": 20 }, "id": 12, "options": { "legend": { "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "displayMode": "list" }, "tooltip": { - "mode": "single", - "sort": "none" + "mode": "multi", + "sort": "desc" } }, + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "rate(node_total_req{redis_cluster=~\"$redis_cluster\", job=~\"$job\"}[$__rate_interval])", + "expr": "rate(node_total_req{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"}[$__rate_interval])", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ redis_cluster }} - node: {{ node }} " + "instant": false, + "legendFormat": "{{ redis_cluster }} - node: {{ node }}", + "refId": "Node requests" } ], "title": "Node requests", @@ -884,90 +647,53 @@ }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, "description": "Average latency for each node in the cluster.", "fieldConfig": { "defaults": { - "color": { - "mode": "palette-classic" - }, "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" }, + "decimals": 1, + "noValue": "No packets", "unit": "s" - }, - "overrides": [ ] + } }, "gridPos": { "h": 6, "w": 6, "x": 6, - "y": 19 + "y": 20 }, "id": 13, "options": { "legend": { "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "displayMode": "list" }, "tooltip": { - "mode": "single", - "sort": "none" + "mode": "multi", + "sort": "desc" } }, + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "node_avg_latency{redis_cluster=~\"$redis_cluster\", job=~\"$job\" }", + "expr": "node_avg_latency{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"}", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ redis_cluster }} - node: {{ node }} " + "instant": false, + "legendFormat": "{{ redis_cluster }} - node: {{ node }}", + "refId": "Node average latency" } ], "title": "Node average latency", @@ -975,90 +701,57 @@ }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, "description": "Memory utilization % for each node in the cluster.", "fieldConfig": { "defaults": { "color": { - "mode": "palette-classic" + "mode": "continuous-BlYlRd" }, "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] + "fillOpacity": 30, + "gradientMode": "scheme", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" }, + "decimals": 1, + "max": 100, + "min": 0, "unit": "percent" - }, - "overrides": [ ] + } }, "gridPos": { "h": 6, "w": 6, "x": 12, - "y": 19 + "y": 20 }, "id": 14, "options": { "legend": { "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "displayMode": "list" }, "tooltip": { - "mode": "single", - "sort": "none" + "mode": "multi", + "sort": "desc" } }, + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "(sum(redis_used_memory{redis_cluster=~\"$redis_cluster\", job=~\"$job\"}) by (redis_cluster, node, job) / clamp_min(sum(node_available_memory{redis_cluster=~\"$redis_cluster\", job=~\"$job\"}) by (redis_cluster,node, job), 1)) * 100", + "expr": "(sum(redis_used_memory{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"}) by (redis_cluster, node, job) / clamp_min(sum(node_available_memory{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"}) by (redis_cluster, node, job), 1)) * 100", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ redis_cluster }} - node: {{ node }} " + "instant": false, + "legendFormat": "{{ redis_cluster }} - node: {{ node }}", + "refId": "Node memory utilization" } ], "title": "Node memory utilization", @@ -1066,99 +759,62 @@ }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, "description": "CPU utilization for each node in the cluster.", "fieldConfig": { "defaults": { - "color": { - "mode": "palette-classic" - }, "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" }, "unit": "percent" - }, - "overrides": [ ] + } }, "gridPos": { "h": 6, "w": 6, "x": 18, - "y": 19 + "y": 20 }, "id": 15, "options": { "legend": { "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "displayMode": "list" }, "tooltip": { - "mode": "single", - "sort": "none" + "mode": "multi", + "sort": "desc" } }, + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "node_cpu_system{redis_cluster=~\"$redis_cluster\", job=~\"$job\"} * 100", + "expr": "node_cpu_system{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"} * 100", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "node: {{ node }} - system" + "instant": false, + "legendFormat": "node: {{ node }} - system", + "refId": "Node CPU system" }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "node_cpu_user{redis_cluster=~\"$redis_cluster\", job=~\"$job\"} * 100", + "expr": "node_cpu_user{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"} * 100", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "node: {{ node }} - user" + "instant": false, + "legendFormat": "node: {{ node }} - user", + "refId": "Node CPU user" } ], "title": "Node CPU utilization", @@ -1166,106 +822,64 @@ }, { "collapsed": false, - "datasource": { - "uid": "${prometheus_datasource}" - }, "gridPos": { "h": 1, - "w": 24, + "w": 0, "x": 0, - "y": 25 + "y": 26 }, "id": 16, - "targets": [ ], + "panels": [ ], "title": "Database KPIs", "type": "row" }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "description": "Rate of request handled by each database in the cluster.", + "description": "Rate of requests handled by each database in the cluster.", "fieldConfig": { "defaults": { - "color": { - "mode": "palette-classic" - }, "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" }, "unit": "ops" - }, - "overrides": [ ] + } }, "gridPos": { "h": 6, "w": 6, "x": 0, - "y": 26 + "y": 27 }, "id": 17, "options": { "legend": { "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "displayMode": "list" }, "tooltip": { - "mode": "single", - "sort": "none" + "mode": "multi", + "sort": "desc" } }, + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "sum(bdb_instantaneous_ops_per_sec{redis_cluster=~\"$redis_cluster\", job=~\"$job\"}) by (redis_cluster, bdb, job)", + "expr": "sum(bdb_instantaneous_ops_per_sec{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"}) by (redis_cluster, bdb, job)", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ redis_cluster }} - db: {{ bdb }} " + "instant": false, + "legendFormat": "{{ redis_cluster }} - db: {{ bdb }}", + "refId": "Database operations" } ], "title": "Database operations", @@ -1273,90 +887,53 @@ }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, "description": "Average latency for each database in the cluster.", "fieldConfig": { "defaults": { - "color": { - "mode": "palette-classic" - }, "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" }, + "decimals": 1, + "noValue": "No packets", "unit": "s" - }, - "overrides": [ ] + } }, "gridPos": { "h": 6, "w": 6, "x": 6, - "y": 26 + "y": 27 }, "id": 18, "options": { "legend": { "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "displayMode": "list" }, "tooltip": { - "mode": "single", - "sort": "none" + "mode": "multi", + "sort": "desc" } }, + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "sum(bdb_avg_latency{redis_cluster=~\"$redis_cluster\", job=~\"$job\"}) by (redis_cluster, job, bdb)", + "expr": "sum(bdb_avg_latency{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"}) by (redis_cluster, job, bdb)", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ redis_cluster }} - db: {{ bdb }} " + "instant": false, + "legendFormat": "{{ redis_cluster }} - db: {{ bdb }}", + "refId": "Database average latency" } ], "title": "Database average latency", @@ -1364,90 +941,51 @@ }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, "description": "Calculated memory utilization % for each database in the cluster.", "fieldConfig": { "defaults": { - "color": { - "mode": "palette-classic" - }, "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" }, "unit": "percent" - }, - "overrides": [ ] + } }, "gridPos": { "h": 6, "w": 6, "x": 12, - "y": 26 + "y": 27 }, "id": 19, "options": { "legend": { "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "displayMode": "list" }, "tooltip": { - "mode": "single", - "sort": "none" + "mode": "multi", + "sort": "desc" } }, + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "sum(bdb_used_memory{redis_cluster=~\"$redis_cluster\", job=~\"$job\"}) by (job, redis_cluster, bdb) / clamp_min(sum(bdb_memory_limit{redis_cluster=~\"$redis_cluster\", job=~\"$job\"}) by (job, redis_cluster, bdb), 1) * 100 ", + "expr": "sum(bdb_used_memory{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"}) by (job, redis_cluster, bdb) / clamp_min(sum(bdb_memory_limit{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"}) by (job, redis_cluster, bdb), 1) * 100", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ redis_cluster }} - db: {{ bdb }} " + "instant": false, + "legendFormat": "{{ redis_cluster }} - db: {{ bdb }}", + "refId": "Database memory utilization" } ], "title": "Database memory utilization", @@ -1455,90 +993,51 @@ }, { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "description": "Calculated cache hit rate for each database in the cluster", + "description": "Calculated cache hit rate for each database in the cluster.", "fieldConfig": { "defaults": { - "color": { - "mode": "palette-classic" - }, "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] + "fillOpacity": 30, + "gradientMode": "opacity", + "lineInterpolation": "smooth", + "lineWidth": 2, + "showPoints": "never" }, "unit": "percent" - }, - "overrides": [ ] + } }, "gridPos": { "h": 6, "w": 6, "x": 18, - "y": 26 + "y": 27 }, "id": 20, "options": { "legend": { "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "displayMode": "list" }, "tooltip": { - "mode": "single", - "sort": "none" + "mode": "multi", + "sort": "desc" } }, + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "expr": "sum(bdb_read_hits{redis_cluster=~\"$redis_cluster\", job=~\"$job\"}) by (job, redis_cluster, bdb) / clamp_min(sum(bdb_read_hits{redis_cluster=~\"$redis_cluster\", job=~\"$job\"}) by (job, redis_cluster, bdb) + sum(bdb_read_misses{redis_cluster=~\"$redis_cluster\", job=~\"$job\"}) by (job, redis_cluster, bdb),1) * 100", + "expr": "sum(bdb_read_hits{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"}) by (job, redis_cluster, bdb) / clamp_min(sum(bdb_read_hits{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"}) by (job, redis_cluster, bdb) + sum(bdb_read_misses{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\",instance=~\"$instance\"}) by (job, redis_cluster, bdb), 1) * 100", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ redis_cluster }} - db: {{ bdb }} " + "instant": false, + "legendFormat": "{{ redis_cluster }} - db: {{ bdb }}", + "refId": "Database cache hit ratio" } ], "title": "Database cache hit ratio", @@ -1546,68 +1045,71 @@ } ], "refresh": "1m", - "rows": [ ], - "schemaVersion": 14, - "style": "dark", + "schemaVersion": 39, "tags": [ "redis-enterprise-mixin" ], "templating": { "list": [ { - "current": { }, - "hide": 0, - "label": "Data Source", + "label": "Prometheus data source", "name": "prometheus_datasource", - "options": [ ], "query": "prometheus", - "refresh": 1, "regex": "", "type": "datasource" }, { - "allValue": "", - "current": { }, + "allValue": ".+", "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "hide": 0, "includeAll": true, "label": "Job", "multi": true, "name": "job", - "options": [ ], - "query": "label_values(node_up, job)", + "query": "label_values(node_up{job=\"integrations/redis-enterprise\"}, job)", "refresh": 2, - "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tags": [ ], - "tagsQuery": "", - "type": "query", - "useTags": false + "sort": 1, + "type": "query" }, { - "allValue": "", - "current": { }, + "allValue": ".*", "datasource": { + "type": "prometheus", "uid": "${prometheus_datasource}" }, - "hide": 0, "includeAll": true, - "label": "Redis Cluster", + "label": "Redis cluster", "multi": true, "name": "redis_cluster", - "options": [ ], - "query": "label_values(node_up, redis_cluster)\n", - "refresh": 1, + "query": "label_values(node_up{job=\"integrations/redis-enterprise\",job=~\"$job\"}, redis_cluster)", + "refresh": 2, + "sort": 1, + "type": "query" + }, + { + "allValue": ".+", + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "includeAll": true, + "label": "Instance", + "multi": true, + "name": "instance", + "query": "label_values(node_up{job=\"integrations/redis-enterprise\",job=~\"$job\",redis_cluster=~\"$redis_cluster\"}, instance)", + "refresh": 2, + "sort": 1, + "type": "query" + }, + { + "hide": 2, + "label": "Loki data source", + "name": "loki_datasource", + "query": "loki", "regex": "", - "sort": 0, - "tagValuesQuery": "", - "tags": [ ], - "tagsQuery": "", - "type": "query", - "useTags": false + "type": "datasource" } ] }, @@ -1615,33 +1117,7 @@ "from": "now-1h", "to": "now" }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, "timezone": "default", "title": "Redis Enterprise overview", - "uid": "redis-enterprise-overview", - "version": 0 + "uid": "redisenterprise_overview" } \ No newline at end of file diff --git a/redis-enterprise-mixin/g.libsonnet b/redis-enterprise-mixin/g.libsonnet new file mode 100644 index 000000000..e6a2060ee --- /dev/null +++ b/redis-enterprise-mixin/g.libsonnet @@ -0,0 +1 @@ +import 'github.com/grafana/grafonnet/gen/grafonnet-v11.4.0/main.libsonnet' diff --git a/redis-enterprise-mixin/jsonnetfile.json b/redis-enterprise-mixin/jsonnetfile.json index 93f3316ec..ed5bf7e18 100644 --- a/redis-enterprise-mixin/jsonnetfile.json +++ b/redis-enterprise-mixin/jsonnetfile.json @@ -4,8 +4,35 @@ { "source": { "git": { - "remote": "https://github.com/grafana/grafonnet-lib.git", - "subdir": "grafonnet" + "remote": "https://github.com/grafana/grafonnet", + "subdir": "gen/grafonnet-v11.4.0" + } + }, + "version": "main" + }, + { + "source": { + "git": { + "remote": "https://github.com/grafana/jsonnet-libs.git", + "subdir": "common-lib" + } + }, + "version": "master" + }, + { + "source": { + "git": { + "remote": "https://github.com/grafana/jsonnet-libs.git", + "subdir": "grafana-cloud-integration-utils" + } + }, + "version": "master" + }, + { + "source": { + "git": { + "remote": "https://github.com/grafana/jsonnet-libs.git", + "subdir": "logs-lib" } }, "version": "master" diff --git a/redis-enterprise-mixin/links.libsonnet b/redis-enterprise-mixin/links.libsonnet new file mode 100644 index 000000000..33929b5b4 --- /dev/null +++ b/redis-enterprise-mixin/links.libsonnet @@ -0,0 +1,25 @@ +local g = import './g.libsonnet'; + +{ + local link = g.dashboard.link, + new(this): { + redisEnterpriseOverview: + link.link.new('Redis Enterprise overview', '/d/' + this.grafana.dashboards['redis-enterprise-overview.json'].uid), + redisEnterpriseNodes: + link.link.new('Redis Enterprise nodes', '/d/' + this.grafana.dashboards['redis-enterprise-node-overview.json'].uid), + redisEnterpriseDatabases: + link.link.new('Redis Enterprise databases', '/d/' + this.grafana.dashboards['redis-enterprise-database-overview.jsonn'].uid), + dashboards: + link.dashboards.new('All Redis Enterprise dashboards', this.config.dashboardTags) + + link.dashboards.options.withKeepTime(true) + + link.dashboards.options.withIncludeVars(true) + + link.dashboards.options.withAsDropdown(true), + } + + + if this.config.enableLokiLogs then { + redisEnterpriseLogs: + link.link.new('Redis Enterprise logs', '/d/' + this.grafana.dashboards['redis-enterprise-logs.json'].uid) + + link.link.options.withKeepTime(true), + } + else {}, +} diff --git a/redis-enterprise-mixin/main.libsonnet b/redis-enterprise-mixin/main.libsonnet new file mode 100644 index 000000000..8c5078a64 --- /dev/null +++ b/redis-enterprise-mixin/main.libsonnet @@ -0,0 +1,49 @@ +local alerts = import './alerts.libsonnet'; +local config = import './config.libsonnet'; +local dashboards = import './dashboards.libsonnet'; +local links = import './links.libsonnet'; +local panels = import './panels.libsonnet'; +local rows = import './rows.libsonnet'; +local commonlib = import 'common-lib/common/main.libsonnet'; + +{ + withConfigMixin(config): { + config+: config, + }, + + new(): { + + local this = self, + config: config, + + signals: + { + [sig]: commonlib.signals.unmarshallJsonMulti( + this.config.signals[sig], + type=this.config.metricsSource + ) + for sig in std.objectFields(this.config.signals) + }, + + grafana: { + variables: commonlib.variables.new( + filteringSelector=this.config.filteringSelector, + groupLabels=this.config.groupLabels, + instanceLabels=this.config.instanceLabels, + varMetric='node_up', + customAllValue='.+', + enableLokiLogs=this.config.enableLokiLogs, + ), + annotations: {}, + links: links.new(this), + panels: panels.new(this), + dashboards: dashboards.new(this), + rows: rows.new(this), + }, + + prometheus: { + alerts: alerts.new(this), + recordingRules: {}, + }, + }, +} diff --git a/redis-enterprise-mixin/mixin.libsonnet b/redis-enterprise-mixin/mixin.libsonnet index 4d987cf31..04045b55d 100644 --- a/redis-enterprise-mixin/mixin.libsonnet +++ b/redis-enterprise-mixin/mixin.libsonnet @@ -1,3 +1,31 @@ -(import 'dashboards/dashboards.libsonnet') + -(import 'alerts/alerts.libsonnet') + -(import 'config.libsonnet') +local redisEnterpriseMixin = import './main.libsonnet'; +local config = (import './config.libsonnet'); +local util = import 'grafana-cloud-integration-utils/util.libsonnet'; + +local redisEnterprise = redisEnterpriseMixin.new() + + redisEnterpriseMixin.withConfigMixin( + { + filteringSelector: config.filteringSelector, + uid: config.uid, + enableLokiLogs: config.enableLokiLogs, + }, + ); + +local optional_labels = { + redis_cluster+: { + label: 'Redis cluster', + allValue: '.*', + }, +}; + +{ + grafanaDashboards+:: { + [fname]: + local dashboard = redisEnterprise.grafana.dashboards[fname]; + dashboard + util.patch_variables(dashboard, optional_labels) + + for fname in std.objectFields(redisEnterprise.grafana.dashboards) + }, + prometheusAlerts+:: redisEnterprise.prometheus.alerts, + prometheusRules+:: redisEnterprise.prometheus.recordingRules, +} diff --git a/redis-enterprise-mixin/panels.libsonnet b/redis-enterprise-mixin/panels.libsonnet new file mode 100644 index 000000000..09923e6c9 --- /dev/null +++ b/redis-enterprise-mixin/panels.libsonnet @@ -0,0 +1,469 @@ +local g = import './g.libsonnet'; +local commonlib = import 'common-lib/common/main.libsonnet'; + +{ + new(this):: + { + local signals = this.signals, + + // Overview panels - Status panels + overviewNodesUpPanel: + g.panel.barGauge.new('Nodes up') + + g.panel.barGauge.queryOptions.withTargets([ + signals.overview.nodeUp.asTarget(), + ]) + + g.panel.barGauge.panelOptions.withDescription('Up/down status for each node in the cluster.') + + g.panel.barGauge.standardOptions.withMin(0) + + g.panel.barGauge.standardOptions.thresholds.withMode('absolute') + + g.panel.barGauge.standardOptions.thresholds.withSteps([ + g.panel.barGauge.standardOptions.threshold.step.withValue(0) + g.panel.barGauge.standardOptions.threshold.step.withColor('red'), + g.panel.barGauge.standardOptions.threshold.step.withValue(1) + g.panel.barGauge.standardOptions.threshold.step.withColor('green'), + ]) + + g.panel.barGauge.options.withDisplayMode('basic') + + g.panel.barGauge.options.withOrientation('horizontal') + + g.panel.barGauge.options.reduceOptions.withCalcs(['lastNotNull']) + + g.panel.barGauge.options.withShowUnfilled(true), + + overviewDatabasesUpPanel: + g.panel.barGauge.new('Databases up') + + g.panel.barGauge.queryOptions.withTargets([ + signals.overview.databaseUp.asTarget(), + ]) + + g.panel.barGauge.panelOptions.withDescription('Up/down status for each database in the cluster.') + + g.panel.barGauge.standardOptions.withMin(0) + + g.panel.barGauge.standardOptions.withMax(1) + + g.panel.barGauge.standardOptions.thresholds.withMode('absolute') + + g.panel.barGauge.standardOptions.thresholds.withSteps([ + g.panel.barGauge.standardOptions.threshold.step.withValue(0) + g.panel.barGauge.standardOptions.threshold.step.withColor('red'), + g.panel.barGauge.standardOptions.threshold.step.withValue(1) + g.panel.barGauge.standardOptions.threshold.step.withColor('green'), + ]) + + g.panel.barGauge.options.withDisplayMode('basic') + + g.panel.barGauge.options.withOrientation('horizontal') + + g.panel.barGauge.options.reduceOptions.withCalcs(['lastNotNull']) + + g.panel.barGauge.options.withShowUnfilled(true), + + overviewShardsUpPanel: + g.panel.barGauge.new('Shards up') + + g.panel.barGauge.queryOptions.withTargets([ + signals.overview.shardUp.asTarget(), + ]) + + g.panel.barGauge.panelOptions.withDescription('Up/down status for each shard in the cluster.') + + g.panel.barGauge.standardOptions.withMin(0) + + g.panel.barGauge.standardOptions.thresholds.withMode('absolute') + + g.panel.barGauge.standardOptions.thresholds.withSteps([ + g.panel.barGauge.standardOptions.threshold.step.withValue(0) + g.panel.barGauge.standardOptions.threshold.step.withColor('red'), + g.panel.barGauge.standardOptions.threshold.step.withValue(1) + g.panel.barGauge.standardOptions.threshold.step.withColor('green'), + ]) + + g.panel.barGauge.options.withDisplayMode('basic') + + g.panel.barGauge.options.withOrientation('horizontal') + + g.panel.barGauge.options.reduceOptions.withCalcs(['lastNotNull']) + + g.panel.barGauge.options.withShowUnfilled(true), + + // Overview panels - Cluster metrics + overviewClusterTotalRequestsPanel: + commonlib.panels.network.timeSeries.base.new( + 'Cluster total requests', + targets=[signals.overview.clusterTotalRequests.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Total requests handled by endpoints aggregated across all nodes.') + + g.panel.timeSeries.standardOptions.withUnit('none'), + + overviewClusterTotalMemoryUsedPanel: + commonlib.panels.memory.timeSeries.usageBytes.new( + 'Cluster total memory used', + targets=[signals.overview.clusterTotalMemoryUsed.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Total memory used by each database in the cluster.') + + g.panel.timeSeries.standardOptions.withUnit('bytes'), + + overviewClusterTotalConnectionsPanel: + commonlib.panels.network.timeSeries.base.new( + 'Cluster total connections', + targets=[signals.overview.clusterTotalConnections.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Total connections to each database in the cluster.') + + g.panel.timeSeries.standardOptions.withUnit('none'), + + overviewClusterTotalKeysPanel: + commonlib.panels.generic.timeSeries.base.new( + 'Cluster total keys', + targets=[signals.overview.clusterTotalKeys.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Total cluster key count for each database in the cluster.') + + g.panel.timeSeries.standardOptions.withUnit('none'), + + overviewClusterCacheHitRatioPanel: + commonlib.panels.generic.timeSeries.base.new( + 'Cluster cache hit ratio', + targets=[signals.overview.clusterCacheHitRatio.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Ratio of database cache key hits against hits and misses.') + + g.panel.timeSeries.standardOptions.withUnit('percent'), + + overviewClusterEvictionsVsExpiredObjectsPanel: + commonlib.panels.generic.timeSeries.base.new( + 'Cluster evictions vs expired objects', + targets=[ + signals.overview.clusterEvictedObjects.asTarget(), + signals.overview.clusterExpiredObjects.asTarget(), + ] + ) + + g.panel.timeSeries.panelOptions.withDescription('Sum of key evictions and expirations in the cluster by database.') + + g.panel.timeSeries.standardOptions.withUnit('ops'), + + // Overview panels - Node KPIs + overviewNodeRequestsPanel: + commonlib.panels.network.timeSeries.base.new( + 'Node requests', + targets=[signals.overview.nodeRequests.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Endpoint request rate for each node in the cluster.') + + g.panel.timeSeries.standardOptions.withUnit('reqps'), + + overviewNodeAverageLatencyPanel: + commonlib.panels.network.timeSeries.base.new( + 'Node average latency', + targets=[signals.overview.nodeAverageLatency.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Average latency for each node in the cluster.') + + g.panel.timeSeries.standardOptions.withUnit('s'), + + overviewNodeMemoryUtilizationPanel: + commonlib.panels.memory.timeSeries.usagePercent.new( + 'Node memory utilization', + targets=[signals.overview.nodeMemoryUtilization.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Memory utilization % for each node in the cluster.') + + g.panel.timeSeries.standardOptions.withUnit('percent'), + + overviewNodeCPUUtilizationPanel: + commonlib.panels.cpu.timeSeries.base.new( + 'Node CPU utilization', + targets=[ + signals.overview.nodeCPUSystem.asTarget(), + signals.overview.nodeCPUUser.asTarget(), + ] + ) + + g.panel.timeSeries.panelOptions.withDescription('CPU utilization for each node in the cluster.') + + g.panel.timeSeries.standardOptions.withUnit('percent'), + + // Overview panels - Database KPIs + overviewDatabaseOperationsPanel: + commonlib.panels.generic.timeSeries.base.new( + 'Database operations', + targets=[signals.overview.databaseOperations.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Rate of requests handled by each database in the cluster.') + + g.panel.timeSeries.standardOptions.withUnit('ops'), + + overviewDatabaseAverageLatencyPanel: + commonlib.panels.network.timeSeries.base.new( + 'Database average latency', + targets=[signals.overview.databaseAverageLatency.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Average latency for each database in the cluster.') + + g.panel.timeSeries.standardOptions.withUnit('s'), + + overviewDatabaseMemoryUtilizationPanel: + commonlib.panels.memory.timeSeries.base.new( + 'Database memory utilization', + targets=[signals.overview.databaseMemoryUtilization.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Calculated memory utilization % for each database in the cluster.') + + g.panel.timeSeries.standardOptions.withUnit('percent'), + + overviewDatabaseCacheHitRatioPanel: + commonlib.panels.generic.timeSeries.base.new( + 'Database cache hit ratio', + targets=[signals.overview.databaseCacheHitRatio.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Calculated cache hit rate for each database in the cluster.') + + g.panel.timeSeries.standardOptions.withUnit('percent'), + + // Nodes dashboard panels + nodesNodeUpPanel: + commonlib.panels.generic.timeSeries.base.new( + 'Nodes up', + targets=[signals.nodes.nodeUp.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Displays up/down status for the selected node.') + + g.panel.timeSeries.standardOptions.withUnit('none'), + + nodesDatabaseUpPanel: + g.panel.barGauge.new('Database up') + + g.panel.barGauge.queryOptions.withTargets([ + signals.nodes.databaseUp.asTarget(), + ]) + + g.panel.barGauge.panelOptions.withDescription('Displays up/down status for the databases of the selected node(s).') + + g.panel.barGauge.standardOptions.withMin(0) + + g.panel.barGauge.standardOptions.thresholds.withMode('absolute') + + g.panel.barGauge.standardOptions.thresholds.withSteps([ + g.panel.barGauge.standardOptions.threshold.step.withValue(null) + g.panel.barGauge.standardOptions.threshold.step.withColor('transparent'), + g.panel.barGauge.standardOptions.threshold.step.withValue(0) + g.panel.barGauge.standardOptions.threshold.step.withColor('red'), + g.panel.barGauge.standardOptions.threshold.step.withValue(1) + g.panel.barGauge.standardOptions.threshold.step.withColor('green'), + ]) + + g.panel.barGauge.options.withDisplayMode('basic') + + g.panel.barGauge.options.withOrientation('horizontal') + + g.panel.barGauge.options.reduceOptions.withCalcs(['lastNotNull']) + + g.panel.barGauge.options.withShowUnfilled(true), + + nodesShardsUpPanel: + g.panel.barGauge.new('Shards up') + + g.panel.barGauge.queryOptions.withTargets([ + signals.nodes.shardUp.asTarget(), + ]) + + g.panel.barGauge.panelOptions.withDescription('Displays up/down status for the shards on the selected node.') + + g.panel.barGauge.standardOptions.withMin(0) + + g.panel.barGauge.standardOptions.thresholds.withMode('absolute') + + g.panel.barGauge.standardOptions.thresholds.withSteps([ + g.panel.barGauge.standardOptions.threshold.step.withValue(null) + g.panel.barGauge.standardOptions.threshold.step.withColor('transparent'), + g.panel.barGauge.standardOptions.threshold.step.withValue(0) + g.panel.barGauge.standardOptions.threshold.step.withColor('red'), + g.panel.barGauge.standardOptions.threshold.step.withValue(1) + g.panel.barGauge.standardOptions.threshold.step.withColor('green'), + ]) + + g.panel.barGauge.options.withDisplayMode('basic') + + g.panel.barGauge.options.withOrientation('horizontal') + + g.panel.barGauge.options.reduceOptions.withCalcs(['lastNotNull']) + + g.panel.barGauge.options.withShowUnfilled(true), + + nodesNodeRequestsPanel: + commonlib.panels.generic.timeSeries.base.new( + 'Node requests', + targets=[signals.nodes.nodeRequests.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Total endpoint request rate for the selected node.') + + g.panel.timeSeries.standardOptions.withUnit('none'), + + nodesNodeAverageLatencyPanel: + commonlib.panels.generic.timeSeries.base.new( + 'Node average latency', + targets=[signals.nodes.nodeAverageLatency.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Average latency for the selected node.') + + g.panel.timeSeries.standardOptions.withUnit('s'), + + nodesNodeMemoryUtilizationPanel: + commonlib.panels.generic.timeSeries.base.new( + 'Node memory utilization', + targets=[signals.nodes.nodeMemoryUtilization.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Memory utilization % for the selected node.') + + g.panel.timeSeries.standardOptions.withUnit('percent'), + + nodesNodeCPUUtilizationPanel: + commonlib.panels.generic.timeSeries.base.new( + 'Node CPU utilization', + targets=[ + signals.nodes.nodeCPUSystem.asTarget(), + signals.nodes.nodeCPUUser.asTarget(), + ] + ) + + g.panel.timeSeries.panelOptions.withDescription('CPU utilization for the selected node.') + + g.panel.timeSeries.standardOptions.withUnit('percent'), + + nodesNodeEphmeralFreeStoragePanel: + commonlib.panels.disk.timeSeries.base.new( + 'Node ephemeral free storage', + targets=[signals.nodes.nodeEphmeralFreeStorage.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Ephemeral storage available for the selected node.') + + g.panel.timeSeries.standardOptions.withUnit('bytes'), + + nodesNodePersistentFreeStoragePanel: + commonlib.panels.disk.timeSeries.base.new( + 'Node persistent free storage', + targets=[signals.nodes.nodePersistentFreeStorage.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Persistent storage available for the selected node.') + + g.panel.timeSeries.standardOptions.withUnit('bytes'), + + nodesNodeNetworkIngressPanel: + commonlib.panels.network.timeSeries.base.new( + 'Node network ingress', + targets=[signals.nodes.nodeNetworkIngress.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Network ingress for the selected node.') + + g.panel.timeSeries.standardOptions.withUnit('binBps'), + + nodesNodeNetworkEgressPanel: + commonlib.panels.network.timeSeries.base.new( + 'Node network egress', + targets=[signals.nodes.nodeNetworkEgress.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Network egress for the selected node.') + + g.panel.timeSeries.standardOptions.withUnit('binBps'), + + nodesNodeClientConnectionsPanel: + commonlib.panels.network.timeSeries.base.new( + 'Node client connections', + targets=[signals.nodes.nodeClientConnections.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Number of client connections to the selected node.') + + g.panel.timeSeries.standardOptions.withUnit('none'), + + + // Database dashboard panels + databasesDatabaseUpPanel: + commonlib.panels.generic.timeSeries.base.new( + 'Database up', + targets=[signals.databases.databaseUp.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Displays up/down status for the selected database.') + + g.panel.timeSeries.standardOptions.withUnit('none'), + + databasesShardsUpPanel: + g.panel.barGauge.new('Shards up') + + g.panel.barGauge.queryOptions.withTargets([ + signals.databases.shardUp.asTarget(), + ]) + + g.panel.barGauge.panelOptions.withDescription('Displays up/down status for each shard related to the database.') + + g.panel.barGauge.standardOptions.withMin(0) + + g.panel.barGauge.standardOptions.withMax(1) + + g.panel.barGauge.standardOptions.thresholds.withMode('absolute') + + g.panel.barGauge.standardOptions.thresholds.withSteps([ + g.panel.barGauge.standardOptions.threshold.step.withValue(null) + g.panel.barGauge.standardOptions.threshold.step.withColor('green'), + g.panel.barGauge.standardOptions.threshold.step.withValue(0) + g.panel.barGauge.standardOptions.threshold.step.withColor('red'), + g.panel.barGauge.standardOptions.threshold.step.withValue(1) + g.panel.barGauge.standardOptions.threshold.step.withColor('green'), + ]) + + g.panel.barGauge.options.withDisplayMode('basic') + + g.panel.barGauge.options.withOrientation('horizontal') + + g.panel.barGauge.options.reduceOptions.withCalcs(['lastNotNull']) + + g.panel.barGauge.options.withShowUnfilled(true), + + databasesNodesUpPanel: + commonlib.panels.generic.timeSeries.base.new( + 'Nodes up', + targets=[signals.databases.nodeUp.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Displays up/down status for each node related to the database.') + + g.panel.timeSeries.standardOptions.withUnit('none'), + + databasesDatabaseOperationsPanel: + commonlib.panels.generic.timeSeries.base.new( + 'Database operations', + targets=[ + signals.databases.databaseReadRequests.asTarget(), + signals.databases.databaseWriteRequests.asTarget(), + ] + ) + + g.panel.timeSeries.panelOptions.withDescription('Rate of read and write requests.') + + g.panel.timeSeries.standardOptions.withUnit('none'), + + databasesDatabaseLatencyPanel: + commonlib.panels.generic.timeSeries.base.new( + 'Database latency', + targets=[ + signals.databases.databaseReadLatency.asTarget(), + signals.databases.databaseWriteLatency.asTarget(), + ] + ) + + g.panel.timeSeries.panelOptions.withDescription('Average latency for read and write requests.') + + g.panel.timeSeries.standardOptions.withUnit('s'), + + databasesDatabaseKeysPanel: + commonlib.panels.generic.timeSeries.base.new( + 'Database key count', + targets=[signals.databases.databaseKeys.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Number of keys in the database.') + + g.panel.timeSeries.standardOptions.withUnit('none'), + + databasesDatabaseCacheHitRatioPanel: + commonlib.panels.generic.timeSeries.base.new( + 'Database cache hit ratio', + targets=[signals.databases.databaseCacheHitRatio.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Calculated cache hit rate for the database.') + + g.panel.timeSeries.standardOptions.withUnit('percent'), + + databasesDatabaseEvictionsVsExpiredObjectsPanel: + commonlib.panels.generic.timeSeries.base.new( + 'Database evictions vs expired objects', + targets=[ + signals.databases.databaseEvictedObjects.asTarget(), + signals.databases.databaseExpiredObjects.asTarget(), + ] + ) + + g.panel.timeSeries.panelOptions.withDescription('Number of evicted and expired objects from the database.') + + g.panel.timeSeries.standardOptions.withUnit('ops'), + + databasesDatabaseMemoryUtilizationPanel: + commonlib.panels.memory.timeSeries.usagePercent.new( + 'Database memory utilization', + targets=[signals.databases.databaseMemoryUtilization.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Calculated memory utilization % of the database compared to the limit.') + + g.panel.timeSeries.standardOptions.withUnit('percent'), + + databasesDatabaseMemoryFragmentationRatioPanel: + commonlib.panels.memory.timeSeries.base.new( + 'Database memory fragmentation ratio', + targets=[signals.databases.databaseMemoryFragmentationRatio.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('RAM fragmentation ratio between RSS and allocated RAM.') + + g.panel.timeSeries.standardOptions.withUnit('percent'), + + databasesDatabaseLUAHeapSizePanel: + commonlib.panels.memory.timeSeries.usageBytes.new( + 'Database LUA heap size', + targets=[signals.databases.databaseLUAHeapSize.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('LUA scripting heap size.') + + g.panel.timeSeries.standardOptions.withUnit('bytes'), + + databasesDatabaseNetworkIngressPanel: + commonlib.panels.network.timeSeries.base.new( + 'Database network ingress', + targets=[signals.databases.databaseNetworkIngress.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Rate of incoming network traffic.') + + g.panel.timeSeries.standardOptions.withUnit('binBps'), + + databasesDatabaseNetworkEgressPanel: + commonlib.panels.network.timeSeries.base.new( + 'Database network egress', + targets=[signals.databases.databaseNetworkEgress.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Rate of outgoing network traffic.') + + g.panel.timeSeries.standardOptions.withUnit('binBps'), + + databasesDatabaseConnectionsPanel: + commonlib.panels.network.timeSeries.base.new( + 'Database connections', + targets=[signals.databases.databaseConnections.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Number of client connections.') + + g.panel.timeSeries.standardOptions.withUnit('none'), + + databasesSyncStatusPanel: + commonlib.panels.generic.timeSeries.base.new( + 'Sync status', + targets=[signals.databases.syncStatus.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Sync status for CRDB traffic (0=in-sync, 1=syncing, 2=out of sync).') + + g.panel.timeSeries.standardOptions.withUnit('none'), + + databasesLocalLagPanel: + commonlib.panels.generic.timeSeries.base.new( + 'Local lag', + targets=[signals.databases.localLag.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Lag between source and destination for CRDB traffic.') + + g.panel.timeSeries.standardOptions.withUnit('ms'), + + databasesCRDBIngressCompressedPanel: + commonlib.panels.generic.timeSeries.base.new( + 'CRDB ingress compressed', + targets=[signals.databases.crdbIngressCompressed.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Rate of compressed network traffic to the CRDB.') + + g.panel.timeSeries.standardOptions.withUnit('binBps'), + + databasesCRDBIngressDecompressedPanel: + commonlib.panels.network.timeSeries.base.new( + 'CRDB ingress decompressed', + targets=[signals.databases.crdbIngressDecompressed.asTarget()] + ) + + g.panel.timeSeries.panelOptions.withDescription('Rate of decompressed network traffic to the CRDB.') + + g.panel.timeSeries.standardOptions.withUnit('binBps'), + }, +} diff --git a/redis-enterprise-mixin/prometheus_rules_out/prometheus_alerts.yaml b/redis-enterprise-mixin/prometheus_rules_out/prometheus_alerts.yaml index 4b6fa18d9..5bdb5a211 100644 --- a/redis-enterprise-mixin/prometheus_rules_out/prometheus_alerts.yaml +++ b/redis-enterprise-mixin/prometheus_rules_out/prometheus_alerts.yaml @@ -6,7 +6,7 @@ groups: description: Memory usage is at {{ printf "%.0f" $value }} percent on the cluster {{$labels.redis_cluster}}, which is above the configured threshold of 80% of the cluster's available memory summary: Cluster has run out of memory. expr: | - sum(redis_used_memory) by (redis_cluster, node) / sum(node_available_memory) by (redis_cluster, node) * 100 > 80 + sum(redis_used_memory{job="integrations/redis-enterprise"}) by (redis_cluster, node) / sum(node_available_memory{job="integrations/redis-enterprise"}) by (redis_cluster, node) * 100 > 80 for: 5m labels: severity: critical @@ -15,7 +15,7 @@ groups: description: The node {{$labels.node}} in {{$labels.redis_cluster}} is offline or unreachable. summary: A node in the Redis Enterprise cluster is offline or unreachable. expr: | - node_up == 0 + node_up{job="integrations/redis-enterprise"} == 0 for: 5m labels: severity: critical @@ -24,7 +24,7 @@ groups: description: The database {{$labels.bdb}} in {{$labels.redis_cluster}} is offline or unreachable. summary: A database in the Redis Enterprise cluster is offline or unreachable. expr: | - bdb_up == 0 + bdb_up{job="integrations/redis-enterprise"} == 0 for: 5m labels: severity: critical @@ -33,7 +33,7 @@ groups: description: The shard {{$labels.redis}} on database {{$labels.bdb}} running on node {{$labels.node}} in the cluster {{$labels.redis_cluster}} is offline or unreachable. summary: A shard in the Redis Enterprise cluster is offline or unreachable. expr: | - redis_up == 0 + redis_up{job="integrations/redis-enterprise"} == 0 for: 5m labels: severity: critical @@ -42,16 +42,16 @@ groups: description: The node {{$labels.node}} in cluster {{$labels.redis_cluster}} has a CPU percentage of ${{ printf "%.0f" $value }}, which exceeds the threshold 80%. summary: Node CPU usage is above the configured threshold. expr: | - (sum(node_cpu_user) by (node, redis_cluster, job) + sum(node_cpu_system) by (node, redis_cluster, job)) * 100 > 80 + (sum(node_cpu_user{job="integrations/redis-enterprise"}) by (node, redis_cluster, job) + sum(node_cpu_system{job="integrations/redis-enterprise"}) by (node, redis_cluster, job)) * 100 > 80 for: 5m labels: severity: warning - alert: RedisEnterpriseDatabaseHighMemoryUtilization annotations: - description: The database {{$labels.bdb}} in cluster {{$labels.redis_cluster}} has a memory utiliztaion of ${{ printf "%.0f" $value }}, which exceeds the threshold 80%. + description: The database {{$labels.bdb}} in cluster {{$labels.redis_cluster}} has a memory utilization of ${{ printf "%.0f" $value }}, which exceeds the threshold 80%. summary: Node memory utilization is above the configured threshold. expr: | - sum(bdb_used_memory) by (bdb, redis_cluster) / sum(bdb_memory_limit) by (bdb, redis_cluster) * 100 > 80 + sum(bdb_used_memory{job="integrations/redis-enterprise"}) by (bdb, redis_cluster) / sum(bdb_memory_limit{job="integrations/redis-enterprise"}) by (bdb, redis_cluster) * 100 > 80 for: 5m labels: severity: warning @@ -60,7 +60,7 @@ groups: description: The database {{$labels.bdb}} in cluster {{$labels.redis_cluster}} has high latency of ${{ printf "%.0f" $value }}, which exceeds the threshold of 1000 ms. summary: Operation latency is above the configured threshold. expr: | - bdb_avg_latency / 1000 > 1000 + bdb_avg_latency{job="integrations/redis-enterprise"} / 1000 > 1000 for: 5m labels: severity: warning @@ -69,7 +69,7 @@ groups: description: The database {{$labels.bdb}} in cluster {{$labels.redis_cluster}} is evicting ${{ printf "%.0f" $value }} objects, which exceeds the threshold of 1 evicted objects. summary: The number of evicted objects is greater than or equal to the configured threshold. expr: | - bdb_evicted_objects >= 1 + bdb_evicted_objects{job="integrations/redis-enterprise"} >= 1 for: 5m labels: severity: warning diff --git a/redis-enterprise-mixin/rows.libsonnet b/redis-enterprise-mixin/rows.libsonnet new file mode 100644 index 000000000..b2a351fd7 --- /dev/null +++ b/redis-enterprise-mixin/rows.libsonnet @@ -0,0 +1,106 @@ +local g = import './g.libsonnet'; + +{ + new(this): + { + local panels = this.grafana.panels, + + // Overview dashboard rows + overviewRow: + g.panel.row.new('Overview') + + g.panel.row.withCollapsed(false) + + g.panel.row.withPanels([ + panels.overviewNodesUpPanel { gridPos+: { w: 8, h: 6 } }, + panels.overviewDatabasesUpPanel { gridPos+: { w: 8, h: 6 } }, + panels.overviewShardsUpPanel { gridPos+: { w: 8, h: 6 } }, + panels.overviewClusterTotalRequestsPanel { gridPos+: { w: 8, h: 6 } }, + panels.overviewClusterTotalMemoryUsedPanel { gridPos+: { w: 8, h: 6 } }, + panels.overviewClusterTotalConnectionsPanel { gridPos+: { w: 8, h: 6 } }, + panels.overviewClusterTotalKeysPanel { gridPos+: { w: 8, h: 6 } }, + panels.overviewClusterCacheHitRatioPanel { gridPos+: { w: 8, h: 6 } }, + panels.overviewClusterEvictionsVsExpiredObjectsPanel { gridPos+: { w: 8, h: 6 } }, + ]), + + overviewNodesKPIsRow: + g.panel.row.new('Nodes KPIs') + + g.panel.row.withCollapsed(false) + + g.panel.row.withPanels([ + panels.overviewNodeRequestsPanel { gridPos+: { w: 6, h: 6 } }, + panels.overviewNodeAverageLatencyPanel { gridPos+: { w: 6, h: 6 } }, + panels.overviewNodeMemoryUtilizationPanel { gridPos+: { w: 6, h: 6 } }, + panels.overviewNodeCPUUtilizationPanel { gridPos+: { w: 6, h: 6 } }, + ]), + + overviewDatabaseKPIsRow: + g.panel.row.new('Database KPIs') + + g.panel.row.withCollapsed(false) + + g.panel.row.withPanels([ + panels.overviewDatabaseOperationsPanel { gridPos+: { w: 6, h: 6 } }, + panels.overviewDatabaseAverageLatencyPanel { gridPos+: { w: 6, h: 6 } }, + panels.overviewDatabaseMemoryUtilizationPanel { gridPos+: { w: 6, h: 6 } }, + panels.overviewDatabaseCacheHitRatioPanel { gridPos+: { w: 6, h: 6 } }, + ]), + + // Nodes dashboard rows + nodesOverviewRow: + g.panel.row.new('Node overview') + + g.panel.row.withCollapsed(false) + + g.panel.row.withPanels([ + panels.nodesNodeUpPanel { gridPos+: { w: 8, h: 6 } }, + panels.nodesDatabaseUpPanel { gridPos+: { w: 8, h: 6 } }, + panels.nodesShardsUpPanel { gridPos+: { w: 8, h: 6 } }, + ]), + + nodesMetricsRow: + g.panel.row.new('Node metrics') + + g.panel.row.withCollapsed(false) + + g.panel.row.withPanels([ + panels.nodesNodeRequestsPanel { gridPos+: { w: 8, h: 6 } }, + panels.nodesNodeAverageLatencyPanel { gridPos+: { w: 8, h: 6 } }, + panels.nodesNodeCPUUtilizationPanel { gridPos+: { w: 8, h: 6 } }, + panels.nodesNodeMemoryUtilizationPanel { gridPos+: { w: 8, h: 6 } }, + panels.nodesNodeEphmeralFreeStoragePanel { gridPos+: { w: 8, h: 6 } }, + panels.nodesNodePersistentFreeStoragePanel { gridPos+: { w: 8, h: 6 } }, + panels.nodesNodeNetworkIngressPanel { gridPos+: { w: 8, h: 6 } }, + panels.nodesNodeNetworkEgressPanel { gridPos+: { w: 8, h: 6 } }, + panels.nodesNodeClientConnectionsPanel { gridPos+: { w: 8, h: 6 } }, + ]), + + // Database dashboard rows + databasesOverviewRow: + g.panel.row.new('Database overview') + + g.panel.row.withCollapsed(false) + + g.panel.row.withPanels([ + panels.databasesDatabaseUpPanel { gridPos+: { w: 8, h: 6 } }, + panels.databasesShardsUpPanel { gridPos+: { w: 8, h: 6 } }, + panels.databasesNodesUpPanel { gridPos+: { w: 8, h: 6 } }, + ]), + + databasesMetricsRow: + g.panel.row.new('Database metrics') + + g.panel.row.withCollapsed(false) + + g.panel.row.withPanels([ + panels.databasesDatabaseOperationsPanel { gridPos+: { w: 8, h: 6 } }, + panels.databasesDatabaseLatencyPanel { gridPos+: { w: 8, h: 6 } }, + panels.databasesDatabaseConnectionsPanel { gridPos+: { w: 8, h: 6 } }, + panels.databasesDatabaseKeysPanel { gridPos+: { w: 8, h: 6 } }, + panels.databasesDatabaseCacheHitRatioPanel { gridPos+: { w: 8, h: 6 } }, + panels.databasesDatabaseMemoryUtilizationPanel { gridPos+: { w: 8, h: 6 } }, + panels.databasesDatabaseEvictionsVsExpiredObjectsPanel { gridPos+: { w: 12, h: 6 } }, + panels.databasesDatabaseMemoryFragmentationRatioPanel { gridPos+: { w: 12, h: 6 } }, + panels.databasesDatabaseLUAHeapSizePanel { gridPos+: { w: 8, h: 6 } }, + panels.databasesDatabaseNetworkIngressPanel { gridPos+: { w: 8, h: 6 } }, + panels.databasesDatabaseNetworkEgressPanel { gridPos+: { w: 8, h: 6 } }, + ]), + + databasesCRDBRow: + g.panel.row.new('Active-Active') + + g.panel.row.withCollapsed(false) + + g.panel.row.withPanels([ + panels.databasesSyncStatusPanel { gridPos+: { w: 6, h: 6 } }, + panels.databasesLocalLagPanel { gridPos+: { w: 6, h: 6 } }, + panels.databasesCRDBIngressCompressedPanel { gridPos+: { w: 6, h: 6 } }, + panels.databasesCRDBIngressDecompressedPanel { gridPos+: { w: 6, h: 6 } }, + ]), + }, +} diff --git a/redis-enterprise-mixin/signals/databases.libsonnet b/redis-enterprise-mixin/signals/databases.libsonnet new file mode 100644 index 000000000..8c12af4f1 --- /dev/null +++ b/redis-enterprise-mixin/signals/databases.libsonnet @@ -0,0 +1,298 @@ +local commonlib = import 'common-lib/common/main.libsonnet'; + +function(this) { + local legendCustomTemplate = std.join(',', std.map(function(label) '{{ ' + label + ' }}', this.databaseLabels)), + local databaseFilters = commonlib.utils.labelsToPromQLSelector(this.databaseLabels), + local nodeFilters = commonlib.utils.labelsToPromQLSelector(this.nodeLabels), + filteringSelector: this.filteringSelector, + groupLabels: this.groupLabels, + instanceLabels: this.instanceLabels, + enableLokiLogs: this.enableLokiLogs, + legendCustomTemplate: legendCustomTemplate, + aggLevel: 'none', + aggFunction: 'avg', + discoveryMetric: 'bdb_up', + signals: { + databaseUp: { + name: 'Database up', + nameShort: 'Up', + type: 'raw', + description: 'Displays up/down status for the selected database', + unit: 'none', + sources: { + prometheus: { + expr: 'bdb_up{%(queriesSelector)s, ' + databaseFilters + '}', + }, + }, + }, + + shardUp: { + name: 'Shard up', + nameShort: 'Shard up', + type: 'raw', + description: 'Displays up/down status for each shard related to the database', + unit: 'none', + sources: { + prometheus: { + expr: 'redis_up{%(queriesSelector)s, ' + databaseFilters + '}', + legendCustomTemplate: '{{ bdb }} - redis: {{ redis }}', + }, + }, + }, + + nodeUp: { + name: 'Nodes up', + nameShort: 'Nodes up', + type: 'raw', + description: 'Displays up/down status for each node related to the database', + unit: 'none', + sources: { + prometheus: { + expr: 'node_up{%(queriesSelector)s, ' + nodeFilters + '}', + legendCustomTemplate: '{{ node }}', + }, + }, + }, + + databaseReadRequests: { + name: 'Database read requests', + nameShort: 'Read requests', + type: 'raw', + description: 'Rate of read requests', + unit: 'none', + sources: { + prometheus: { + expr: 'bdb_read_req{%(queriesSelector)s, ' + databaseFilters + '}', + legendCustomTemplate: '{{ bdb }} - read', + }, + }, + }, + + databaseWriteRequests: { + name: 'Database write requests', + nameShort: 'Write requests', + type: 'raw', + description: 'Rate of write requests', + unit: 'none', + sources: { + prometheus: { + expr: 'bdb_write_req{%(queriesSelector)s, ' + databaseFilters + '}', + legendCustomTemplate: '{{ bdb }} - write', + }, + }, + }, + + databaseReadLatency: { + name: 'Database read latency', + nameShort: 'Read latency', + type: 'gauge', + description: 'Average latency for read requests', + unit: 's', + sources: { + prometheus: { + expr: 'bdb_avg_read_latency{%(queriesSelector)s, ' + databaseFilters + '}', + legendCustomTemplate: '{{ bdb }} - read', + }, + }, + }, + + databaseWriteLatency: { + name: 'Database write latency', + nameShort: 'Write latency', + type: 'gauge', + description: 'Average latency for write requests', + unit: 's', + sources: { + prometheus: { + expr: 'bdb_avg_write_latency{%(queriesSelector)s, ' + databaseFilters + '}', + legendCustomTemplate: '{{ bdb }} - write', + }, + }, + }, + + databaseKeys: { + name: 'Database key count', + nameShort: 'Keys', + type: 'gauge', + description: 'Number of keys in the database', + unit: 'none', + sources: { + prometheus: { + expr: 'bdb_no_of_keys{%(queriesSelector)s, ' + databaseFilters + '}', + }, + }, + }, + + databaseCacheHitRatio: { + name: 'Database cache hit ratio', + nameShort: 'Cache hit ratio', + type: 'raw', + description: 'Calculated cache hit rate for the database', + unit: 'percent', + sources: { + prometheus: { + expr: 'sum(bdb_read_hits{%(queriesSelector)s, ' + databaseFilters + '}) by (job, redis_cluster, bdb) / clamp_min(sum(bdb_read_hits{%(queriesSelector)s, ' + databaseFilters + '}) by (job, redis_cluster, bdb) + sum(bdb_read_misses{%(queriesSelector)s, ' + databaseFilters + '}) by (job, redis_cluster, bdb), 1) * 100', + }, + }, + }, + + databaseEvictedObjects: { + name: 'Database evicted objects', + nameShort: 'Evicted', + type: 'gauge', + description: 'Number of evicted objects from the database', + unit: 'ops', + sources: { + prometheus: { + expr: 'bdb_evicted_objects{%(queriesSelector)s, ' + databaseFilters + '}', + legendCustomTemplate: legendCustomTemplate + ' - evicted', + }, + }, + }, + + databaseExpiredObjects: { + name: 'Database expired objects', + nameShort: 'Expired', + type: 'gauge', + description: 'Number of expired objects from the database', + unit: 'ops', + sources: { + prometheus: { + expr: 'bdb_expired_objects{%(queriesSelector)s, ' + databaseFilters + '}', + legendCustomTemplate: legendCustomTemplate + ' - expired', + }, + }, + }, + + databaseMemoryUtilization: { + name: 'Database memory utilization', + nameShort: 'Memory utilization', + type: 'raw', + description: 'Calculated memory utilization % of the database compared to the limit', + unit: 'percent', + sources: { + prometheus: { + expr: 'bdb_used_memory{%(queriesSelector)s, ' + databaseFilters + '} / bdb_memory_limit{%(queriesSelector)s, ' + databaseFilters + '} * 100', + }, + }, + }, + + databaseMemoryFragmentationRatio: { + name: 'Database memory fragmentation ratio', + nameShort: 'Memory fragmentation', + type: 'gauge', + description: 'RAM fragmentation ratio between RSS and allocated RAM', + unit: 'percent', + sources: { + prometheus: { + expr: 'bdb_mem_frag_ratio{%(queriesSelector)s, ' + databaseFilters + '}', + }, + }, + }, + + databaseLUAHeapSize: { + name: 'Database LUA heap size', + nameShort: 'LUA heap', + type: 'gauge', + description: 'LUA scripting heap size', + unit: 'bytes', + sources: { + prometheus: { + expr: 'bdb_mem_size_lua{%(queriesSelector)s, ' + databaseFilters + '}', + }, + }, + }, + + databaseNetworkIngress: { + name: 'Database network ingress', + nameShort: 'Network in', + type: 'gauge', + description: 'Rate of incoming network traffic', + unit: 'binBps', + sources: { + prometheus: { + expr: 'bdb_ingress_bytes{%(queriesSelector)s, ' + databaseFilters + '}', + }, + }, + }, + + databaseNetworkEgress: { + name: 'Database network egress', + nameShort: 'Network out', + type: 'gauge', + description: 'Rate of outgoing network traffic', + unit: 'binBps', + sources: { + prometheus: { + expr: 'bdb_egress_bytes{%(queriesSelector)s, ' + databaseFilters + '}', + }, + }, + }, + + databaseConnections: { + name: 'Database connections', + nameShort: 'Connections', + type: 'gauge', + description: 'Number of client connections', + unit: 'none', + sources: { + prometheus: { + expr: 'bdb_conns{%(queriesSelector)s, ' + databaseFilters + '}', + }, + }, + }, + + syncStatus: { + name: 'Sync status', + nameShort: 'Sync status', + type: 'gauge', + description: 'Sync status for CRDB traffic (0=in-sync, 1=syncing, 2=out of sync)', + unit: 'none', + sources: { + prometheus: { + expr: 'bdb_crdt_syncer_status{%(queriesSelector)s, ' + databaseFilters + '}', + legendCustomTemplate: '{{ bdb }} - repl_id: {{ crdt_replica_id }}', + }, + }, + }, + + localLag: { + name: 'Local lag', + nameShort: 'Local lag', + type: 'gauge', + description: 'Lag between source and destination for CRDB traffic', + unit: 'ms', + sources: { + prometheus: { + expr: 'bdb_crdt_syncer_local_ingress_lag_time{%(queriesSelector)s, ' + databaseFilters + '}', + }, + }, + }, + + crdbIngressCompressed: { + name: 'CRDB ingress compressed', + nameShort: 'CRDB in (compressed)', + type: 'gauge', + description: 'Rate of compressed network traffic to the CRDB', + unit: 'binBps', + sources: { + prometheus: { + expr: 'bdb_crdt_syncer_ingress_bytes{%(queriesSelector)s, ' + databaseFilters + '}', + }, + }, + }, + + crdbIngressDecompressed: { + name: 'CRDB ingress decompressed', + nameShort: 'CRDB in (decompressed)', + type: 'gauge', + description: 'Rate of decompressed network traffic to the CRDB', + unit: 'binBps', + sources: { + prometheus: { + expr: 'bdb_crdt_ingress_bytes_decompressed{%(queriesSelector)s, ' + databaseFilters + '}', + }, + }, + }, + }, +} diff --git a/redis-enterprise-mixin/signals/nodes.libsonnet b/redis-enterprise-mixin/signals/nodes.libsonnet new file mode 100644 index 000000000..896632d9c --- /dev/null +++ b/redis-enterprise-mixin/signals/nodes.libsonnet @@ -0,0 +1,214 @@ +local commonlib = import 'common-lib/common/main.libsonnet'; + +function(this) { + local legendCustomTemplate = std.join(',', std.map(function(label) '{{ ' + label + ' }}', this.nodeLabels)), + local nodeFilters = commonlib.utils.labelsToPromQLSelector(this.nodeLabels), + filteringSelector: this.filteringSelector, + groupLabels: this.groupLabels, + instanceLabels: this.instanceLabels, + enableLokiLogs: this.enableLokiLogs, + legendCustomTemplate: legendCustomTemplate, + aggLevel: 'none', + aggFunction: 'avg', + discoveryMetric: 'node_up', + signals: { + nodeUp: { + name: 'Node up', + nameShort: 'Up', + type: 'gauge', + description: 'Displays up/down status for the selected node', + unit: 'none', + sources: { + prometheus: { + expr: 'node_up{%(queriesSelector)s, ' + nodeFilters + '}', + }, + }, + }, + + databaseUp: { + name: 'Database up', + nameShort: 'Database up', + type: 'gauge', + description: 'Displays up/down status for the databases of the selected node(s)', + unit: 'none', + sources: { + prometheus: { + expr: 'bdb_up{%(queriesSelector)s}', // intentionall no filtering on the node + legendCustomTemplate: 'db: {{ bdb }}', + }, + }, + }, + + shardUp: { + name: 'Shard up', + nameShort: 'Shard up', + type: 'gauge', + description: 'Displays up/down status for the shards on the selected node', + unit: 'none', + sources: { + prometheus: { + expr: 'redis_up{%(queriesSelector)s, ' + nodeFilters + '}', + legendCustomTemplate: 'redis: {{ redis }}', + }, + }, + }, + + nodeRequests: { + name: 'Node requests', + nameShort: 'Requests', + type: 'gauge', + description: 'Total endpoint request rate for the selected node', + unit: 'none', + sources: { + prometheus: { + expr: 'node_total_req{%(queriesSelector)s, ' + nodeFilters + '}', + }, + }, + }, + + nodeAverageLatency: { + name: 'Node average latency', + nameShort: 'Avg latency', + type: 'gauge', + description: 'Average latency for the selected node', + unit: 's', + sources: { + prometheus: { + expr: 'node_avg_latency{%(queriesSelector)s, ' + nodeFilters + '}', + }, + }, + }, + + nodeMemoryUtilization: { + name: 'Node memory utilization', + nameShort: 'Memory utilization', + type: 'raw', + description: 'Memory utilization % for the selected node', + unit: 'percent', + sources: { + prometheus: { + expr: '(sum(redis_used_memory{%(queriesSelector)s}) by (redis_cluster, node, job) / clamp_min(sum(node_available_memory{%(queriesSelector)s}) by (redis_cluster, node, job), 1)) * 100', + }, + }, + }, + + nodeCPUSystem: { + name: 'Node CPU system', + nameShort: 'CPU system', + type: 'raw', + description: 'System CPU utilization for the selected node', + unit: 'percent', + sources: { + prometheus: { + expr: 'node_cpu_system{%(queriesSelector)s, ' + nodeFilters + '} * 100', + legendCustomTemplate: legendCustomTemplate + ' - system', + }, + }, + }, + + nodeCPUUser: { + name: 'Node CPU user', + nameShort: 'CPU user', + type: 'raw', + description: 'User CPU utilization for the selected node', + unit: 'percent', + sources: { + prometheus: { + expr: 'node_cpu_user{%(queriesSelector)s, ' + nodeFilters + '} * 100', + legendCustomTemplate: legendCustomTemplate + ' - user', + }, + }, + }, + + nodeAvailableMemory: { + name: 'Node available memory', + nameShort: 'Available memory', + type: 'gauge', + description: 'Available memory for the selected node', + unit: 'bytes', + sources: { + prometheus: { + expr: 'node_available_memory{%(queriesSelector)s, ' + nodeFilters + '}', + }, + }, + }, + + nodeTotalRequests: { + name: 'Node total requests', + nameShort: 'Total requests', + type: 'gauge', + description: 'Total requests for the selected node', + unit: 'none', + sources: { + prometheus: { + expr: 'node_total_req{%(queriesSelector)s, ' + nodeFilters + '}', + }, + }, + }, + + nodeEphmeralFreeStorage: { + name: 'Node ephemeral free storage', + nameShort: 'Free storage', + type: 'gauge', + description: 'Ephemeral storage available for the selected node', + unit: 'bytes', + sources: { + prometheus: { + expr: 'node_ephemeral_storage_free{%(queriesSelector)s, ' + nodeFilters + '}', + }, + }, + }, + + nodePersistentFreeStorage: { + name: 'Node persistent free storage', + nameShort: 'Free storage', + type: 'gauge', + description: 'Persistent storage available for the selected node', + unit: 'bytes', + sources: { + prometheus: { + expr: 'node_persistent_storage_free{%(queriesSelector)s, ' + nodeFilters + '}', + }, + }, + }, + + nodeNetworkIngress: { + name: 'Node network ingress', + nameShort: 'Network ingress', + type: 'gauge', + description: 'Network ingress for the selected node', + unit: 'binBps', + sources: { + prometheus: { + expr: 'node_network_ingress{%(queriesSelector)s, ' + nodeFilters + '}', + }, + }, + }, + + nodeNetworkEgress: { + name: 'Node network egress', + nameShort: 'Network egress', + type: 'gauge', + description: 'Network egress for the selected node', + unit: 'binBps', + sources: { + prometheus: { + expr: 'node_network_egress{%(queriesSelector)s, ' + nodeFilters + '}', + }, + }, + }, + + nodeClientConnections: { + name: 'Node client connections', + nameShort: 'Client connections', + type: 'gauge', + description: 'Number of client connections to the selected node', + unit: 'none', + sources: { + prometheus: { + expr: 'node_conns{%(queriesSelector)s, ' + nodeFilters + '}', + }, + }, + }, + }, +} diff --git a/redis-enterprise-mixin/signals/overview.libsonnet b/redis-enterprise-mixin/signals/overview.libsonnet new file mode 100644 index 000000000..8255a1592 --- /dev/null +++ b/redis-enterprise-mixin/signals/overview.libsonnet @@ -0,0 +1,284 @@ +function(this) { + local legendCustomTemplate = '{{ redis_cluster }}', + local aggregationLabels = '(' + std.join(',', this.groupLabels + this.instanceLabels) + ')', + filteringSelector: this.filteringSelector, + groupLabels: this.groupLabels, + instanceLabels: this.instanceLabels, + enableLokiLogs: this.enableLokiLogs, + legendCustomTemplate: legendCustomTemplate, + aggLevel: 'none', + aggFunction: 'avg', + alertsInterval: '2m', + discoveryMetric: 'node_up', + signals: { + // Status signals + nodeUp: { + name: 'Node up', + nameShort: 'Node up', + type: 'raw', + description: 'Up/down status for each node in the cluster', + unit: 'none', + sources: { + prometheus: { + expr: 'node_up{%(queriesSelector)s}', + legendCustomTemplate: '{{ redis_cluster }} - {{ node }}', + }, + }, + }, + + databaseUp: { + name: 'Database up', + nameShort: 'Database up', + type: 'raw', + description: 'Up/down status for each database in the cluster', + unit: 'none', + sources: { + prometheus: { + expr: 'bdb_up{%(queriesSelector)s}', + legendCustomTemplate: '{{ redis_cluster }} - bdb={{ bdb }}', + }, + }, + }, + + shardUp: { + name: 'Shard up', + nameShort: 'Shard up', + type: 'raw', + description: 'Up/down status for each shard in the cluster', + unit: 'none', + sources: { + prometheus: { + expr: 'redis_up{%(queriesSelector)s}', + legendCustomTemplate: '{{ redis_cluster }} - redis: {{ redis }}', + }, + }, + }, + + // Cluster aggregate signals + clusterTotalRequests: { + name: 'Cluster total requests', + nameShort: 'Total requests', + type: 'raw', + description: 'Total requests handled by endpoints aggregated across all nodes', + unit: 'none', + sources: { + prometheus: { + expr: 'sum(node_total_req{%(queriesSelector)s}) by (redis_cluster, job)', + legendCustomTemplate: '{{ redis_cluster }}', + }, + }, + }, + + clusterTotalMemoryUsed: { + name: 'Cluster total memory used', + nameShort: 'Total memory used', + type: 'raw', + description: 'Total memory used by each database in the cluster', + unit: 'bytes', + sources: { + prometheus: { + expr: 'sum(bdb_used_memory{%(queriesSelector)s}) by (job, bdb, redis_cluster)', + legendCustomTemplate: '{{ redis_cluster }} - db: {{ bdb }}', + }, + }, + }, + + clusterTotalConnections: { + name: 'Cluster total connections', + nameShort: 'Total connections', + type: 'raw', + description: 'Total connections to each database in the cluster', + unit: 'none', + sources: { + prometheus: { + expr: 'sum(bdb_conns{%(queriesSelector)s}) by (bdb, redis_cluster, job)', + legendCustomTemplate: '{{ redis_cluster }} - db: {{ bdb }}', + }, + }, + }, + + clusterTotalKeys: { + name: 'Cluster total keys', + nameShort: 'Total keys', + type: 'raw', + description: 'Total cluster key count for each database in the cluster', + unit: 'none', + sources: { + prometheus: { + expr: 'sum(bdb_no_of_keys{%(queriesSelector)s}) by (redis_cluster, bdb, job)', + legendCustomTemplate: '{{ redis_cluster }} - db: {{ bdb }}', + }, + }, + }, + + clusterCacheHitRatio: { + name: 'Cluster cache hit ratio', + nameShort: 'Cache hit ratio', + type: 'raw', + description: 'Ratio of database cache key hits against hits and misses', + unit: 'percent', + sources: { + prometheus: { + expr: 'bdb_read_hits{%(queriesSelector)s} / (clamp_min(bdb_read_hits{%(queriesSelector)s} + bdb_read_misses{%(queriesSelector)s}, 1)) * 100', + legendCustomTemplate: '{{ redis_cluster }} - db: {{ bdb }}', + }, + }, + }, + + clusterEvictedObjects: { + name: 'Cluster evicted objects', + nameShort: 'Evicted objects', + type: 'raw', + description: 'Sum of key evictions in the cluster by database', + unit: 'ops', + sources: { + prometheus: { + expr: 'bdb_evicted_objects{%(queriesSelector)s}', + legendCustomTemplate: '{{ redis_cluster }} - db: {{ bdb }} - evicted', + }, + }, + }, + + clusterExpiredObjects: { + name: 'Cluster expired objects', + nameShort: 'Expired objects', + type: 'raw', + description: 'Sum of key expirations in the cluster by database', + unit: 'ops', + sources: { + prometheus: { + expr: 'bdb_expired_objects{%(queriesSelector)s}', + legendCustomTemplate: '{{ redis_cluster }} - db: {{ bdb }} - expired', + }, + }, + }, + + // Node KPI signals + nodeRequests: { + name: 'Node requests', + nameShort: 'Requests', + type: 'raw', + description: 'Endpoint request rate for each node in the cluster', + unit: 'reqps', + sources: { + prometheus: { + expr: 'rate(node_total_req{%(queriesSelector)s}[$__rate_interval])', + legendCustomTemplate: '{{ redis_cluster }} - node: {{ node }}', + }, + }, + }, + + nodeAverageLatency: { + name: 'Node average latency', + nameShort: 'Avg latency', + type: 'raw', + description: 'Average latency for each node in the cluster', + unit: 's', + sources: { + prometheus: { + expr: 'node_avg_latency{%(queriesSelector)s}', + legendCustomTemplate: '{{ redis_cluster }} - node: {{ node }}', + }, + }, + }, + + nodeMemoryUtilization: { + name: 'Node memory utilization', + nameShort: 'Memory utilization', + type: 'raw', + description: 'Memory utilization % for each node in the cluster', + unit: 'percent', + sources: { + prometheus: { + expr: '(sum(redis_used_memory{%(queriesSelector)s}) by (redis_cluster, node, job) / clamp_min(sum(node_available_memory{%(queriesSelector)s}) by (redis_cluster, node, job), 1)) * 100', + legendCustomTemplate: '{{ redis_cluster }} - node: {{ node }}', + }, + }, + }, + + nodeCPUSystem: { + name: 'Node CPU system', + nameShort: 'CPU system', + type: 'raw', + description: 'System CPU utilization for each node in the cluster', + unit: 'percent', + sources: { + prometheus: { + expr: 'node_cpu_system{%(queriesSelector)s} * 100', + legendCustomTemplate: 'node: {{ node }} - system', + }, + }, + }, + + nodeCPUUser: { + name: 'Node CPU user', + nameShort: 'CPU user', + type: 'raw', + description: 'User CPU utilization for each node in the cluster', + unit: 'percent', + sources: { + prometheus: { + expr: 'node_cpu_user{%(queriesSelector)s} * 100', + legendCustomTemplate: 'node: {{ node }} - user', + }, + }, + }, + + // Database KPI signals + databaseOperations: { + name: 'Database operations', + nameShort: 'Operations', + type: 'raw', + description: 'Rate of requests handled by each database in the cluster', + unit: 'ops', + sources: { + prometheus: { + expr: 'sum(bdb_instantaneous_ops_per_sec{%(queriesSelector)s}) by (redis_cluster, bdb, job)', + legendCustomTemplate: '{{ redis_cluster }} - db: {{ bdb }}', + }, + }, + }, + + databaseAverageLatency: { + name: 'Database average latency', + nameShort: 'Avg latency', + type: 'raw', + description: 'Average latency for each database in the cluster', + unit: 's', + sources: { + prometheus: { + expr: 'sum(bdb_avg_latency{%(queriesSelector)s}) by (redis_cluster, job, bdb)', + legendCustomTemplate: '{{ redis_cluster }} - db: {{ bdb }}', + }, + }, + }, + + databaseMemoryUtilization: { + name: 'Database memory utilization', + nameShort: 'Memory utilization', + type: 'raw', + description: 'Calculated memory utilization % for each database in the cluster', + unit: 'percent', + sources: { + prometheus: { + expr: 'sum(bdb_used_memory{%(queriesSelector)s}) by (job, redis_cluster, bdb) / clamp_min(sum(bdb_memory_limit{%(queriesSelector)s}) by (job, redis_cluster, bdb), 1) * 100', + legendCustomTemplate: '{{ redis_cluster }} - db: {{ bdb }}', + }, + }, + }, + + databaseCacheHitRatio: { + name: 'Database cache hit ratio', + nameShort: 'Cache hit ratio', + type: 'raw', + description: 'Calculated cache hit rate for each database in the cluster', + unit: 'percent', + sources: { + prometheus: { + expr: 'sum(bdb_read_hits{%(queriesSelector)s}) by (job, redis_cluster, bdb) / clamp_min(sum(bdb_read_hits{%(queriesSelector)s}) by (job, redis_cluster, bdb) + sum(bdb_read_misses{%(queriesSelector)s}) by (job, redis_cluster, bdb), 1) * 100', + legendCustomTemplate: '{{ redis_cluster }} - db: {{ bdb }}', + }, + }, + }, + }, +} From 0a8f29cf45b814f5342c4c23ea27a914caa6bb84 Mon Sep 17 00:00:00 2001 From: schmikei Date: Mon, 10 Nov 2025 10:59:58 -0500 Subject: [PATCH 2/3] fix lint --- redis-enterprise-mixin/alerts.libsonnet | 2 +- .../prometheus_rules_out/prometheus_alerts.yaml | 2 +- redis-enterprise-mixin/signals/nodes.libsonnet | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/redis-enterprise-mixin/alerts.libsonnet b/redis-enterprise-mixin/alerts.libsonnet index ecf7a3f44..fc641b7ef 100644 --- a/redis-enterprise-mixin/alerts.libsonnet +++ b/redis-enterprise-mixin/alerts.libsonnet @@ -92,7 +92,7 @@ }, }, { - alert: 'RedisEnterpriseDatabaseHighMemoryUtilization', + alert: 'RedisEnterpriseHighMemUtilization', expr: ||| sum(bdb_used_memory{%(filteringSelector)s}) by (bdb, redis_cluster) / sum(bdb_memory_limit{%(filteringSelector)s}) by (bdb, redis_cluster) * 100 > %(alertsDatabaseHighMemoryUtilization)s ||| % this.config, diff --git a/redis-enterprise-mixin/prometheus_rules_out/prometheus_alerts.yaml b/redis-enterprise-mixin/prometheus_rules_out/prometheus_alerts.yaml index 5bdb5a211..fb9884cb7 100644 --- a/redis-enterprise-mixin/prometheus_rules_out/prometheus_alerts.yaml +++ b/redis-enterprise-mixin/prometheus_rules_out/prometheus_alerts.yaml @@ -46,7 +46,7 @@ groups: for: 5m labels: severity: warning - - alert: RedisEnterpriseDatabaseHighMemoryUtilization + - alert: RedisEnterpriseHighMemUtilization annotations: description: The database {{$labels.bdb}} in cluster {{$labels.redis_cluster}} has a memory utilization of ${{ printf "%.0f" $value }}, which exceeds the threshold 80%. summary: Node memory utilization is above the configured threshold. diff --git a/redis-enterprise-mixin/signals/nodes.libsonnet b/redis-enterprise-mixin/signals/nodes.libsonnet index 896632d9c..77d3660b8 100644 --- a/redis-enterprise-mixin/signals/nodes.libsonnet +++ b/redis-enterprise-mixin/signals/nodes.libsonnet @@ -33,7 +33,7 @@ function(this) { unit: 'none', sources: { prometheus: { - expr: 'bdb_up{%(queriesSelector)s}', // intentionall no filtering on the node + expr: 'bdb_up{%(queriesSelector)s}', // intentionall no filtering on the node legendCustomTemplate: 'db: {{ bdb }}', }, }, From 4caf4be5a29ba8151334af9ac04d2c4ad7eaaae4 Mon Sep 17 00:00:00 2001 From: schmikei Date: Mon, 10 Nov 2025 11:06:52 -0500 Subject: [PATCH 3/3] audit signals for gauges --- .../signals/databases.libsonnet | 6 +++--- .../signals/nodes.libsonnet | 4 ++-- .../signals/overview.libsonnet | 20 +++++++++---------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/redis-enterprise-mixin/signals/databases.libsonnet b/redis-enterprise-mixin/signals/databases.libsonnet index 8c12af4f1..0832653a0 100644 --- a/redis-enterprise-mixin/signals/databases.libsonnet +++ b/redis-enterprise-mixin/signals/databases.libsonnet @@ -16,7 +16,7 @@ function(this) { databaseUp: { name: 'Database up', nameShort: 'Up', - type: 'raw', + type: 'gauge', description: 'Displays up/down status for the selected database', unit: 'none', sources: { @@ -29,7 +29,7 @@ function(this) { shardUp: { name: 'Shard up', nameShort: 'Shard up', - type: 'raw', + type: 'gauge', description: 'Displays up/down status for each shard related to the database', unit: 'none', sources: { @@ -71,7 +71,7 @@ function(this) { databaseWriteRequests: { name: 'Database write requests', nameShort: 'Write requests', - type: 'raw', + type: 'gauge', description: 'Rate of write requests', unit: 'none', sources: { diff --git a/redis-enterprise-mixin/signals/nodes.libsonnet b/redis-enterprise-mixin/signals/nodes.libsonnet index 77d3660b8..4eafd057e 100644 --- a/redis-enterprise-mixin/signals/nodes.libsonnet +++ b/redis-enterprise-mixin/signals/nodes.libsonnet @@ -95,7 +95,7 @@ function(this) { nodeCPUSystem: { name: 'Node CPU system', nameShort: 'CPU system', - type: 'raw', + type: 'gauge', description: 'System CPU utilization for the selected node', unit: 'percent', sources: { @@ -109,7 +109,7 @@ function(this) { nodeCPUUser: { name: 'Node CPU user', nameShort: 'CPU user', - type: 'raw', + type: 'gauge', description: 'User CPU utilization for the selected node', unit: 'percent', sources: { diff --git a/redis-enterprise-mixin/signals/overview.libsonnet b/redis-enterprise-mixin/signals/overview.libsonnet index 8255a1592..f739e06e9 100644 --- a/redis-enterprise-mixin/signals/overview.libsonnet +++ b/redis-enterprise-mixin/signals/overview.libsonnet @@ -15,7 +15,7 @@ function(this) { nodeUp: { name: 'Node up', nameShort: 'Node up', - type: 'raw', + type: 'gauge', description: 'Up/down status for each node in the cluster', unit: 'none', sources: { @@ -29,7 +29,7 @@ function(this) { databaseUp: { name: 'Database up', nameShort: 'Database up', - type: 'raw', + type: 'gauge', description: 'Up/down status for each database in the cluster', unit: 'none', sources: { @@ -43,7 +43,7 @@ function(this) { shardUp: { name: 'Shard up', nameShort: 'Shard up', - type: 'raw', + type: 'gauge', description: 'Up/down status for each shard in the cluster', unit: 'none', sources: { @@ -128,7 +128,7 @@ function(this) { clusterEvictedObjects: { name: 'Cluster evicted objects', nameShort: 'Evicted objects', - type: 'raw', + type: 'gauge', description: 'Sum of key evictions in the cluster by database', unit: 'ops', sources: { @@ -142,7 +142,7 @@ function(this) { clusterExpiredObjects: { name: 'Cluster expired objects', nameShort: 'Expired objects', - type: 'raw', + type: 'gauge', description: 'Sum of key expirations in the cluster by database', unit: 'ops', sources: { @@ -157,12 +157,12 @@ function(this) { nodeRequests: { name: 'Node requests', nameShort: 'Requests', - type: 'raw', + type: 'counter', description: 'Endpoint request rate for each node in the cluster', unit: 'reqps', sources: { prometheus: { - expr: 'rate(node_total_req{%(queriesSelector)s}[$__rate_interval])', + expr: 'node_total_req{%(queriesSelector)s}', legendCustomTemplate: '{{ redis_cluster }} - node: {{ node }}', }, }, @@ -171,7 +171,7 @@ function(this) { nodeAverageLatency: { name: 'Node average latency', nameShort: 'Avg latency', - type: 'raw', + type: 'gauge', description: 'Average latency for each node in the cluster', unit: 's', sources: { @@ -199,7 +199,7 @@ function(this) { nodeCPUSystem: { name: 'Node CPU system', nameShort: 'CPU system', - type: 'raw', + type: 'gauge', description: 'System CPU utilization for each node in the cluster', unit: 'percent', sources: { @@ -213,7 +213,7 @@ function(this) { nodeCPUUser: { name: 'Node CPU user', nameShort: 'CPU user', - type: 'raw', + type: 'gauge', description: 'User CPU utilization for each node in the cluster', unit: 'percent', sources: {