Skip to content

Commit cce9d55

Browse files
committed
Add Render automatic dashboards
Add automatic dashboards for HTTP requests, Postgres and Redis.
1 parent a79e232 commit cce9d55

5 files changed

Lines changed: 519 additions & 0 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ Automated Dashboards can be found in the `dashboards/` sub directory. Each direc
1717
- [Oban](/dashboards/oban/)
1818
- [Puma](/dashboards/puma/)
1919
- [PostgreSQL](/dashboards/postgresql/) (via Vector)
20+
- [Render](/dashboards/render/)
2021
- [Ruby VM](/dashboards/ruby_vm/)
2122
- [Sidekiq](/dashboards/sidekiq/)
2223
- [Karafka](/dashboards/karafka/)

dashboards/render/README.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# Render automated dashboards
2+
3+
[Render](https://render.com/) is a cloud platform-as-a-service for running web services, background workers, persistent disks, Postgres databases and Key Value (Valkey/Redis) instances.
4+
5+
These dashboards display data emitted by Render's [OpenTelemetry metrics stream](https://render.com/docs/metrics-streams), forwarded to AppSignal through the AppSignal collector. The collector's Render router converts CPU, memory, disk usage, disk I/O and network I/O metrics into host metrics; the remaining `render.*` metrics are exposed as custom metrics and power these dashboards.
6+
7+
The following automated dashboards may appear:
8+
9+
- [HTTP automated dashboard](#http-automated-dashboard)
10+
- [Postgres automated dashboard](#postgres-automated-dashboard)
11+
- [Key Value automated dashboard](#key-value-automated-dashboard)
12+
13+
All three dashboards are currently marked Beta.
14+
15+
## HTTP automated dashboard
16+
17+
The "Render/HTTP" dashboard shows request volume and latency for Render web services. Render aggregates these metrics across all instances of a service, so each line corresponds to a host/status_code combination across the whole service rather than to a specific replica.
18+
19+
The following graphs are displayed in this automated dashboard:
20+
21+
- HTTP requests (broken down by status code and host)
22+
- HTTP latency (p50/p95/p99 broken down by host and status code)
23+
24+
These graphs display values from the `render.service.http.requests.total` and `render.service.http.requests.latency` metrics.
25+
26+
## Postgres automated dashboard
27+
28+
The "Render/Postgres" dashboard shows information about Render Postgres instances.
29+
30+
The following graphs are displayed in this automated dashboard:
31+
32+
- Connections (active connections per database, compared against the connection limit)
33+
- Storage size (database size and indexes size per database)
34+
- Transaction volume
35+
- Sequential table scans (per database)
36+
- Transaction exhaustion (per database)
37+
- Slow locks
38+
- Slow lock wait time
39+
- Replication lag (per replica host)
40+
41+
These graphs display values from the `render.postgres.*` metrics.
42+
43+
## Key Value automated dashboard
44+
45+
The "Render/Key Value" dashboard shows connection metrics for Render Key Value (Valkey/Redis) services. CPU, memory, disk and network usage for Key Value services are reported as host metrics and appear on the host metrics dashboard instead.
46+
47+
The following graphs are displayed in this automated dashboard:
48+
49+
- Connections (active connections compared against the connection limit)
50+
51+
This graph displays values from the `render.keyvalue.connections` and `render.keyvalue.connection.limit` metrics.

dashboards/render/http.json

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
{
2+
"metric_keys": ["render.service.http.requests.total"],
3+
"dashboard": {
4+
"title": "Render/HTTP",
5+
"description": "HTTP request volume and latency for Render web services",
6+
"visuals": [
7+
{
8+
"type": "timeseries",
9+
"display": "LINE",
10+
"title": "HTTP requests",
11+
"description": "Number of HTTP requests received, broken down by host and status code.",
12+
"line_label": "%status_code% %host% %service.name%",
13+
"format": "number",
14+
"draw_null_as_zero": true,
15+
"metrics": [
16+
{
17+
"name": "render.service.http.requests.total",
18+
"fields": [
19+
{
20+
"field": "COUNTER"
21+
}
22+
],
23+
"tags": [
24+
{
25+
"key": "service.instance.id",
26+
"value": "*"
27+
},
28+
{
29+
"key": "service.name",
30+
"value": "*"
31+
},
32+
{
33+
"key": "host",
34+
"value": "*"
35+
},
36+
{
37+
"key": "status_code",
38+
"value": "*"
39+
}
40+
]
41+
}
42+
]
43+
},
44+
{
45+
"type": "timeseries",
46+
"display": "LINE",
47+
"title": "HTTP latency",
48+
"description": "Response latency at the p50, p95 and p99 percentiles, broken down by host and status code.",
49+
"line_label": "p%quantile% %status_code% %host% %service.name%",
50+
"format": "duration",
51+
"draw_null_as_zero": false,
52+
"metrics": [
53+
{
54+
"name": "render.service.http.requests.latency",
55+
"fields": [
56+
{
57+
"field": "GAUGE"
58+
}
59+
],
60+
"tags": [
61+
{
62+
"key": "service.instance.id",
63+
"value": "*"
64+
},
65+
{
66+
"key": "service.name",
67+
"value": "*"
68+
},
69+
{
70+
"key": "host",
71+
"value": "*"
72+
},
73+
{
74+
"key": "status_code",
75+
"value": "*"
76+
},
77+
{
78+
"key": "quantile",
79+
"value": "*"
80+
}
81+
]
82+
}
83+
]
84+
}
85+
]
86+
}
87+
}

dashboards/render/key_value.json

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
{
2+
"metric_keys": ["render.keyvalue.connections"],
3+
"dashboard": {
4+
"title": "Render/Key Value",
5+
"description": "Key Value (Valkey/Redis) metrics from Render's OpenTelemetry metrics stream",
6+
"visuals": [
7+
{
8+
"type": "timeseries",
9+
"display": "LINE",
10+
"title": "Connections",
11+
"description": "Number of active connections to the Key Value instance, alongside the instance's connection limit.",
12+
"line_label": "%name% %service.name%",
13+
"format": "number",
14+
"draw_null_as_zero": false,
15+
"metrics": [
16+
{
17+
"name": "render.keyvalue.connections",
18+
"fields": [
19+
{
20+
"field": "GAUGE"
21+
}
22+
],
23+
"tags": [
24+
{
25+
"key": "service.instance.id",
26+
"value": "*"
27+
},
28+
{
29+
"key": "service.name",
30+
"value": "*"
31+
}
32+
]
33+
},
34+
{
35+
"name": "render.keyvalue.connection.limit",
36+
"fields": [
37+
{
38+
"field": "GAUGE"
39+
}
40+
],
41+
"tags": [
42+
{
43+
"key": "service.instance.id",
44+
"value": "*"
45+
},
46+
{
47+
"key": "service.name",
48+
"value": "*"
49+
}
50+
]
51+
}
52+
]
53+
}
54+
]
55+
}
56+
}

0 commit comments

Comments
 (0)