Skip to content

Conversation

@schmikei
Copy link
Contributor

This PR refactors the Redis-Enterprise mixin to use the signals API to create its dashboards and follow best practices using g.libsonnet and commonlib.

If you need access for testdata we can provide it at keithschmitty.grafana.net

Screenshots with minimal setup (no loadgen so some metrics will not be populated in these screenshots)

Screenshots Overview image image

Nodes
image
image

Database

image image

Logs
image
The way my lab was configured didn't allow for logs but it should work

@schmikei schmikei marked this pull request as ready for review November 10, 2025 16:02
@schmikei schmikei requested a review from a team as a code owner November 10, 2025 16:02
Copy link

@aalhour aalhour left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

First pass, no linting errors locally, a few typos and an issue with alerts, everything else is minor.

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),
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo? .jsonn --> .json

refresh,
period,
),
'redis-enterprise-database-overview.jsonn':
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo? .jsonn --> .json

clusterTotalRequests: {
name: 'Cluster total requests',
nameShort: 'Total requests',
type: 'raw',
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this also be of type gauge?

clusterTotalMemoryUsed: {
name: 'Cluster total memory used',
nameShort: 'Total memory used',
type: 'raw',
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this also be of type gauge?

clusterTotalConnections: {
name: 'Cluster total connections',
nameShort: 'Total connections',
type: 'raw',
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this also be of type gauge?

databaseReadRequests: {
name: 'Database read requests',
nameShort: 'Read requests',
type: 'raw',
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this also be of type gauge?

databaseCacheHitRatio: {
name: 'Database cache hit ratio',
nameShort: 'Cache hit ratio',
type: 'raw',
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this also be of type gauge?

databaseMemoryUtilization: {
name: 'Database memory utilization',
nameShort: 'Memory utilization',
type: 'raw',
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this also be of type gauge?

expr: |||
bdb_avg_latency / 1000 > %(alertsDatabaseHighLatencyMs)s
||| % $._config,
bdb_avg_latency{%(filteringSelector)s} / 1000 > %(alertsDatabaseHighLatencyMs)s
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we divide by 1000 that would convert the value to seconds, but the alert threshold is in milliseconds - alertsDatabaseHighLatencyMs.

+ g.panel.timeSeries.standardOptions.withUnit('percent'),

nodesNodeCPUUtilizationPanel:
commonlib.panels.generic.timeSeries.base.new(
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What are your thoughts on how this would look versus the commonlib.panels.cpu.timeSeries.base.new? I see that the base is empty in the common lib but it has utilization by core and mode overrides.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants