mirror of https://github.com/ceph/ceph
493 lines
15 KiB
Plaintext
493 lines
15 KiB
Plaintext
local g = import 'grafonnet/grafana.libsonnet';
|
|
|
|
local info_rbd_stats = std.join(
|
|
'',
|
|
[
|
|
'RBD per-image IO statistics are disabled by default.\n\n',
|
|
'Please refer to ',
|
|
'https://docs.ceph.com/en/latest/mgr/prometheus/#rbd-io-statistics ',
|
|
'for information about how to enable those optionally.',
|
|
]
|
|
);
|
|
|
|
(import 'utils.libsonnet') {
|
|
'rbd-details.json':
|
|
local RbdDetailsPanel(title, description, formatY1, expr1, expr2, x, y, w, h) =
|
|
$.graphPanelSchema({},
|
|
title,
|
|
description,
|
|
'null as zero',
|
|
false,
|
|
formatY1,
|
|
formatY1,
|
|
null,
|
|
null,
|
|
0,
|
|
1,
|
|
'$datasource')
|
|
.addTargets(
|
|
[
|
|
$.addTargetSchema(expr1,
|
|
'{{pool}} Write'),
|
|
$.addTargetSchema(expr2, '{{pool}} Read'),
|
|
]
|
|
) + { type: 'timeseries' } + { fieldConfig: { defaults: { unit: formatY1, custom: { fillOpacity: 8, showPoints: 'never' } } } } + { gridPos: { x: x, y: y, w: w, h: h } };
|
|
|
|
$.dashboardSchema(
|
|
'RBD Details',
|
|
'Detailed Performance of RBD Images (IOPS/Throughput/Latency)',
|
|
'YhCYGcuZz',
|
|
'now-1h',
|
|
'30s',
|
|
16,
|
|
$._config.dashboardTags,
|
|
''
|
|
)
|
|
.addAnnotation(
|
|
$.addAnnotationSchema(
|
|
1,
|
|
'-- Grafana --',
|
|
true,
|
|
true,
|
|
'rgba(0, 211, 255, 1)',
|
|
'Annotations & Alerts',
|
|
'dashboard'
|
|
)
|
|
)
|
|
.addRequired(
|
|
type='grafana', id='grafana', name='Grafana', version='5.3.3'
|
|
)
|
|
.addRequired(
|
|
type='panel', id='graph', name='Graph', version='5.0.0'
|
|
)
|
|
.addTemplate(
|
|
g.template.datasource('datasource', 'prometheus', 'default', label='Data Source')
|
|
)
|
|
.addTemplate(
|
|
$.addClusterTemplate()
|
|
)
|
|
.addTemplate(
|
|
$.addTemplateSchema('pool',
|
|
'$datasource',
|
|
'label_values(ceph_rbd_read_ops{%(matchers)s}, pool)' % $.matchers(),
|
|
1,
|
|
false,
|
|
0,
|
|
'',
|
|
'')
|
|
)
|
|
|
|
.addTemplate(
|
|
$.addTemplateSchema('image',
|
|
'$datasource',
|
|
'label_values(ceph_rbd_read_ops{%(matchers)s, pool="$pool"}, image)' % $.matchers(),
|
|
1,
|
|
false,
|
|
0,
|
|
'',
|
|
'')
|
|
)
|
|
.addPanels([
|
|
RbdDetailsPanel(
|
|
'IOPS',
|
|
info_rbd_stats,
|
|
'iops',
|
|
'rate(ceph_rbd_write_ops{pool="$pool", image="$image", %(matchers)s}[$__rate_interval])' % $.matchers()
|
|
,
|
|
'rate(ceph_rbd_read_ops{pool="$pool", image="$image", %(matchers)s}[$__rate_interval])' % $.matchers(),
|
|
0,
|
|
0,
|
|
8,
|
|
9
|
|
),
|
|
RbdDetailsPanel(
|
|
'Throughput',
|
|
info_rbd_stats,
|
|
'Bps',
|
|
'rate(ceph_rbd_write_bytes{pool="$pool", image="$image", %(matchers)s}[$__rate_interval])' % $.matchers(),
|
|
'rate(ceph_rbd_read_bytes{pool="$pool", image="$image", %(matchers)s}[$__rate_interval])' % $.matchers(),
|
|
8,
|
|
0,
|
|
8,
|
|
9
|
|
),
|
|
RbdDetailsPanel(
|
|
'Average Latency',
|
|
info_rbd_stats,
|
|
'ns',
|
|
|||
|
|
rate(ceph_rbd_write_latency_sum{pool="$pool", image="$image", %(matchers)s}[$__rate_interval]) /
|
|
rate(ceph_rbd_write_latency_count{pool="$pool", image="$image", %(matchers)s}[$__rate_interval])
|
|
||| % $.matchers(),
|
|
|||
|
|
rate(ceph_rbd_read_latency_sum{pool="$pool", image="$image", %(matchers)s}[$__rate_interval]) /
|
|
rate(ceph_rbd_read_latency_count{pool="$pool", image="$image", %(matchers)s}[$__rate_interval])
|
|
||| % $.matchers(),
|
|
16,
|
|
0,
|
|
8,
|
|
9
|
|
),
|
|
]),
|
|
'rbd-overview.json':
|
|
local RbdOverviewPanel(title,
|
|
description,
|
|
formatY1,
|
|
expr1,
|
|
expr2,
|
|
legendFormat1,
|
|
legendFormat2,
|
|
x,
|
|
y,
|
|
w,
|
|
h) =
|
|
$.graphPanelSchema({},
|
|
title,
|
|
description,
|
|
'null as zero',
|
|
false,
|
|
formatY1,
|
|
'short',
|
|
null,
|
|
null,
|
|
0,
|
|
1,
|
|
'$datasource')
|
|
.addTargets(
|
|
[
|
|
$.addTargetSchema(expr1,
|
|
legendFormat1),
|
|
$.addTargetSchema(expr2,
|
|
legendFormat2),
|
|
]
|
|
) + { type: 'timeseries' } + { fieldConfig: { defaults: { unit: formatY1, custom: { fillOpacity: 8, showPoints: 'never' } } } } + { gridPos: { x: x, y: y, w: w, h: h } };
|
|
|
|
$.dashboardSchema(
|
|
'RBD Overview',
|
|
'',
|
|
'41FrpeUiz',
|
|
'now-1h',
|
|
'30s',
|
|
16,
|
|
$._config.dashboardTags + ['overview'],
|
|
''
|
|
)
|
|
.addAnnotation(
|
|
$.addAnnotationSchema(
|
|
1,
|
|
'-- Grafana --',
|
|
true,
|
|
true,
|
|
'rgba(0, 211, 255, 1)',
|
|
'Annotations & Alerts',
|
|
'dashboard'
|
|
)
|
|
)
|
|
.addRequired(
|
|
type='grafana', id='grafana', name='Grafana', version='5.4.2'
|
|
)
|
|
.addRequired(
|
|
type='panel', id='graph', name='Graph', version='5.0.0'
|
|
)
|
|
.addRequired(
|
|
type='datasource', id='prometheus', name='Prometheus', version='5.0.0'
|
|
)
|
|
.addRequired(
|
|
type='panel', id='table', name='Table', version='5.0.0'
|
|
)
|
|
.addTemplate(
|
|
g.template.datasource('datasource', 'prometheus', 'default', label='Data Source')
|
|
)
|
|
.addTemplate(
|
|
$.addClusterTemplate()
|
|
)
|
|
.addPanels([
|
|
RbdOverviewPanel(
|
|
'IOPS',
|
|
info_rbd_stats,
|
|
'short',
|
|
'round(sum(rate(ceph_rbd_write_ops{%(matchers)s}[$__rate_interval])))' % $.matchers(),
|
|
'round(sum(rate(ceph_rbd_read_ops{%(matchers)s}[$__rate_interval])))' % $.matchers(),
|
|
'Writes',
|
|
'Reads',
|
|
0,
|
|
0,
|
|
8,
|
|
7
|
|
),
|
|
RbdOverviewPanel(
|
|
'Throughput',
|
|
info_rbd_stats,
|
|
'Bps',
|
|
'round(sum(rate(ceph_rbd_write_bytes{%(matchers)s}[$__rate_interval])))' % $.matchers(),
|
|
'round(sum(rate(ceph_rbd_read_bytes{%(matchers)s}[$__rate_interval])))' % $.matchers(),
|
|
'Write',
|
|
'Read',
|
|
8,
|
|
0,
|
|
8,
|
|
7
|
|
),
|
|
RbdOverviewPanel(
|
|
'Average Latency',
|
|
info_rbd_stats,
|
|
'ns',
|
|
|||
|
|
round(
|
|
sum(rate(ceph_rbd_write_latency_sum{%(matchers)s}[$__rate_interval])) /
|
|
sum(rate(ceph_rbd_write_latency_count{%(matchers)s}[$__rate_interval]))
|
|
)
|
|
||| % $.matchers(),
|
|
|||
|
|
round(
|
|
sum(rate(ceph_rbd_read_latency_sum{%(matchers)s}[$__rate_interval])) /
|
|
sum(rate(ceph_rbd_read_latency_count{%(matchers)s}[$__rate_interval]))
|
|
)
|
|
||| % $.matchers(),
|
|
'Write',
|
|
'Read',
|
|
16,
|
|
0,
|
|
8,
|
|
7
|
|
),
|
|
|
|
$.addTableExtended(
|
|
datasource='${datasource}',
|
|
title='Highest IOPS',
|
|
description='RBD per-image IO statistics are disabled by default.\n\nPlease refer to https://docs.ceph.com/en/latest/mgr/prometheus/#rbd-io-statistics for information about how to enable those optionally.',
|
|
gridPosition={ h: 7, w: 8, x: 0, y: 7 },
|
|
options={
|
|
footer: {
|
|
fields: '',
|
|
reducer: ['sum'],
|
|
countRows: false,
|
|
enablePagination: false,
|
|
show: false,
|
|
},
|
|
frameIndex: 1,
|
|
showHeader: true,
|
|
},
|
|
custom={ align: 'null', cellOptions: { type: 'auto' }, filterable: true, inspect: false },
|
|
thresholds={
|
|
mode: 'absolute',
|
|
steps: [
|
|
{ color: 'green', value: null },
|
|
{ color: 'red', value: 80 },
|
|
],
|
|
},
|
|
overrides=[
|
|
{
|
|
matcher: { id: 'byName', options: 'pool' },
|
|
properties: [
|
|
{ id: 'displayName', value: 'Pool' },
|
|
{ id: 'unit', value: 'short' },
|
|
{ id: 'decimals', value: 2 },
|
|
{ id: 'custom.align', value: null },
|
|
],
|
|
},
|
|
{
|
|
matcher: { id: 'byName', options: 'image' },
|
|
properties: [
|
|
{ id: 'displayName', value: 'Image' },
|
|
{ id: 'unit', value: 'short' },
|
|
{ id: 'decimals', value: 2 },
|
|
{ id: 'custom.align', value: null },
|
|
],
|
|
},
|
|
{
|
|
matcher: { id: 'byName', options: 'Value' },
|
|
properties: [
|
|
{ id: 'displayName', value: 'IOPS' },
|
|
{ id: 'unit', value: 'iops' },
|
|
{ id: 'decimals', value: 2 },
|
|
{ id: 'custom.align', value: null },
|
|
],
|
|
},
|
|
],
|
|
pluginVersion='10.4.0'
|
|
)
|
|
.addTransformations([
|
|
{
|
|
id: 'merge',
|
|
options: { reducers: [] },
|
|
},
|
|
]).addTarget(
|
|
$.addTargetSchema(
|
|
|||
|
|
topk(10,
|
|
(
|
|
sort((
|
|
rate(ceph_rbd_write_ops{%(matchers)s}[$__rate_interval]) +
|
|
on (image, pool, namespace) rate(ceph_rbd_read_ops{%(matchers)s}[$__rate_interval])
|
|
))
|
|
)
|
|
)
|
|
||| % $.matchers(),
|
|
'',
|
|
'table',
|
|
1,
|
|
true
|
|
)
|
|
),
|
|
|
|
$.addTableExtended(
|
|
datasource='${datasource}',
|
|
title='Highest Throughput',
|
|
description='RBD per-image IO statistics are disabled by default.\n\nPlease refer to https://docs.ceph.com/en/latest/mgr/prometheus/#rbd-io-statistics for information about how to enable those optionally.',
|
|
gridPosition={ h: 7, w: 8, x: 8, y: 7 },
|
|
options={
|
|
footer: {
|
|
fields: '',
|
|
reducer: ['sum'],
|
|
countRows: false,
|
|
enablePagination: false,
|
|
show: false,
|
|
},
|
|
frameIndex: 1,
|
|
showHeader: true,
|
|
},
|
|
custom={ align: 'null', cellOptions: { type: 'auto' }, filterable: true, inspect: false },
|
|
thresholds={
|
|
mode: 'absolute',
|
|
steps: [
|
|
{ color: 'green', value: null },
|
|
{ color: 'red', value: 80 },
|
|
],
|
|
},
|
|
overrides=[
|
|
{
|
|
matcher: { id: 'byName', options: 'pool' },
|
|
properties: [
|
|
{ id: 'displayName', value: 'Pool' },
|
|
{ id: 'unit', value: 'short' },
|
|
{ id: 'decimals', value: 2 },
|
|
{ id: 'custom.align', value: null },
|
|
],
|
|
},
|
|
{
|
|
matcher: { id: 'byName', options: 'image' },
|
|
properties: [
|
|
{ id: 'displayName', value: 'Image' },
|
|
{ id: 'unit', value: 'short' },
|
|
{ id: 'decimals', value: 2 },
|
|
{ id: 'custom.align', value: null },
|
|
],
|
|
},
|
|
{
|
|
matcher: { id: 'byName', options: 'Value' },
|
|
properties: [
|
|
{ id: 'displayName', value: 'Throughput' },
|
|
{ id: 'unit', value: 'Bps' },
|
|
{ id: 'decimals', value: 2 },
|
|
{ id: 'custom.align', value: null },
|
|
],
|
|
},
|
|
],
|
|
pluginVersion='10.4.0'
|
|
)
|
|
.addTransformations([
|
|
{
|
|
id: 'merge',
|
|
options: { reducers: [] },
|
|
},
|
|
]).addTarget(
|
|
$.addTargetSchema(
|
|
|||
|
|
topk(10,
|
|
sort(
|
|
sum(
|
|
rate(ceph_rbd_read_bytes{%(matchers)s}[$__rate_interval]) +
|
|
rate(ceph_rbd_write_bytes{%(matchers)s}[$__rate_interval])
|
|
) by (pool, image, namespace)
|
|
)
|
|
)
|
|
||| % $.matchers(),
|
|
'',
|
|
'table',
|
|
1,
|
|
true
|
|
)
|
|
),
|
|
|
|
$.addTableExtended(
|
|
datasource='${datasource}',
|
|
title='Highest Latency',
|
|
description='RBD per-image IO statistics are disabled by default.\n\nPlease refer to https://docs.ceph.com/en/latest/mgr/prometheus/#rbd-io-statistics for information about how to enable those optionally.',
|
|
gridPosition={ h: 7, w: 8, x: 16, y: 7 },
|
|
options={
|
|
footer: {
|
|
fields: '',
|
|
reducer: ['sum'],
|
|
countRows: false,
|
|
enablePagination: false,
|
|
show: false,
|
|
},
|
|
frameIndex: 1,
|
|
showHeader: true,
|
|
},
|
|
custom={ align: 'null', cellOptions: { type: 'auto' }, filterable: true, inspect: false },
|
|
thresholds={
|
|
mode: 'absolute',
|
|
steps: [
|
|
{ color: 'green', value: null },
|
|
{ color: 'red', value: 80 },
|
|
],
|
|
},
|
|
overrides=[
|
|
{
|
|
matcher: { id: 'byName', options: 'pool' },
|
|
properties: [
|
|
{ id: 'displayName', value: 'Pool' },
|
|
{ id: 'unit', value: 'short' },
|
|
{ id: 'decimals', value: 2 },
|
|
{ id: 'custom.align', value: null },
|
|
],
|
|
},
|
|
{
|
|
matcher: { id: 'byName', options: 'image' },
|
|
properties: [
|
|
{ id: 'displayName', value: 'Image' },
|
|
{ id: 'unit', value: 'short' },
|
|
{ id: 'decimals', value: 2 },
|
|
{ id: 'custom.align', value: null },
|
|
],
|
|
},
|
|
{
|
|
matcher: { id: 'byName', options: 'Value' },
|
|
properties: [
|
|
{ id: 'displayName', value: 'Latency' },
|
|
{ id: 'unit', value: 'ns' },
|
|
{ id: 'decimals', value: 2 },
|
|
{ id: 'custom.align', value: null },
|
|
],
|
|
},
|
|
],
|
|
pluginVersion='10.4.0'
|
|
)
|
|
.addTransformations([
|
|
{
|
|
id: 'merge',
|
|
options: { reducers: [] },
|
|
},
|
|
]).addTarget(
|
|
$.addTargetSchema(
|
|
|||
|
|
topk(10,
|
|
sum(
|
|
rate(ceph_rbd_write_latency_sum{%(matchers)s}[$__rate_interval]) /
|
|
clamp_min(rate(ceph_rbd_write_latency_count{%(matchers)s}[$__rate_interval]), 1) +
|
|
rate(ceph_rbd_read_latency_sum{%(matchers)s}[$__rate_interval]) /
|
|
clamp_min(rate(ceph_rbd_read_latency_count{%(matchers)s}[$__rate_interval]), 1)
|
|
) by (pool, image, namespace)
|
|
)
|
|
||| % $.matchers(),
|
|
'',
|
|
'table',
|
|
1,
|
|
true
|
|
)
|
|
),
|
|
]),
|
|
}
|