apiVersion: influxdata.com/v2alpha1 kind: Label metadata: name: shiny-chatelet-9b6001 spec: color: '#F95F53' name: ceph --- apiVersion: influxdata.com/v2alpha1 kind: Variable metadata: name: cranky-allen-db6001 spec: language: flux name: bucket query: |- buckets() |> filter(fn: (r) => r.name !~ /^_/) |> rename(columns: {name: "_value"}) |> keep(columns: ["_value"]) type: query --- apiVersion: influxdata.com/v2alpha1 kind: Dashboard metadata: name: optimistic-feynman-db6001 spec: charts: - height: 2 kind: Markdown name: Name this Cell note: |- # Ceph Cluster It is compatible with a Rook Ceph cluster and possibly also most Ceph Cluster with the Ceph MGR Prometheus module enabled. The Telegraf Prometheus input plugin needs to scrape the Ceph MGR(s) Prometheus Metrics Endpoints. width: 4 - colors: - hex: '#7CE490' id: base name: honeydew type: background - hex: '#FFD255' id: 54d4f688-00b3-421e-b1a5-aee54f09d0b2 name: thunder type: background value: 1 - hex: '#F95F53' id: 083348b3-2600-4c36-9122-6f48b8585485 name: curacao type: background value: 2 decimalPlaces: 0 height: 1 kind: Single_Stat name: Cluster Health Status queries: - query: "from(bucket: v.bucket)\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"prometheus\")\n \ |> filter(fn: (r) => r[\"_field\"] == \"ceph_health_status\") \n \ |> yield()" width: 2 yPos: 2 - height: 1 kind: Markdown name: Name this Cell note: '## OSDs' width: 2 yPos: 3 - colors: - hex: '#00C9FF' id: base name: laser type: text decimalPlaces: 1 height: 1 kind: Single_Stat name: PGs per OSD queries: - query: |- num_pg = from(bucket: v.bucket) |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_osd_numpg") |> aggregateWindow(every: v.windowPeriod, fn: last) |> group(columns: ["_time", "_stop", "_start", "host", "_measurement"], mode:"by") |> sum(column: "_value") num_osd = from(bucket: v.bucket) |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_osd_metadata") |> aggregateWindow(every: v.windowPeriod, fn: last) |> group(columns: ["_time", "_stop", "_start", "host", "_measurement"], mode:"by") |> sum(column: "_value") join(tables: {pgs:num_pg, osds:num_osd}, on: ["_time", "_stop", "_start", "host"]) |> map(fn: (r) => ({ _time: r._time, _value: (r._value_pgs / r._value_osds) }) ) suffix: ' PGs/OSD' width: 4 yPos: 4 - colors: - hex: '#00C9FF' id: base name: laser type: background decimalPlaces: 0 height: 1 kind: Single_Stat name: OSDs Total queries: - query: |- from(bucket: v.bucket) |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_osd_metadata") |> group(columns: ["_field", "_measurement", "_time"]) |> count() |> yield(name: "count") suffix: ' OSDs' width: 2 yPos: 5 - colors: - hex: '#F95F53' id: base name: curacao type: background - hex: '#383846' id: e415d0a8-8ab1-457e-9e7f-713e42634d77 name: pepper type: background value: 1 - hex: '#7CE490' id: 717e0ba2-d16d-4d40-ad9a-1d4535309157 name: honeydew type: background value: 2 decimalPlaces: 0 height: 1 kind: Single_Stat name: OSDs In queries: - query: |- from(bucket: v.bucket) |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_osd_in") |> group(columns: ["_time", "_measurement", "_field"]) |> aggregateWindow(every: v.windowPeriod, fn: sum, createEmpty: false) |> yield(name: "sum") suffix: ' In' width: 2 yPos: 6 - colors: - hex: '#FFD255' id: base name: thunder type: background - hex: '#7CE490' id: daa462ee-5f11-45b0-9242-32755810cb5a name: honeydew type: background value: 2 decimalPlaces: 0 height: 1 kind: Single_Stat name: OSDs Up queries: - query: |- from(bucket: v.bucket) |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_osd_up") |> group(columns: ["_time", "_measurement", "_field"]) |> aggregateWindow(every: v.windowPeriod, fn: sum, createEmpty: false) |> yield(name: "sum") suffix: ' Up' width: 2 yPos: 7 - height: 1 kind: Markdown name: Name this Cell note: '## MONs' width: 2 yPos: 8 - colors: - hex: '#F95F53' id: base name: curacao type: background - hex: '#FFD255' id: 317466dc-92b6-40f9-a493-1960d1d6eb3e name: thunder type: background value: 1 - hex: '#7CE490' id: daa462ee-5f11-45b0-9242-32755810cb5a name: honeydew type: background value: 2 decimalPlaces: 0 height: 1 kind: Single_Stat name: MON Quorum Status queries: - query: |- from(bucket: v.bucket) |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_mon_quorum_status") |> group(columns: ["_time", "_measurement", "_field"]) |> aggregateWindow(every: v.windowPeriod, fn: sum, createEmpty: false) |> yield(name: "sum") suffix: ' In Quorum' width: 2 yPos: 9 - colors: - hex: '#F95F53' id: base name: curacao type: background - hex: '#FFD255' id: 317466dc-92b6-40f9-a493-1960d1d6eb3e name: thunder type: background value: 1 - hex: '#7CE490' id: daa462ee-5f11-45b0-9242-32755810cb5a name: honeydew type: background value: 2 decimalPlaces: 0 height: 1 kind: Single_Stat name: MON Quorum Total queries: - query: |- from(bucket: v.bucket) |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_mon_quorum_status") |> group(columns: ["_time", "_measurement", "_field"]) |> count() |> yield(name: "count") suffix: ' In Total' width: 2 yPos: 10 - colors: - hex: '#ffffff' id: base name: white type: text - hex: '#F95F53' id: f50310d1-f341-4153-ab4a-a93699f8689d name: curacao type: text value: 1 - hex: '#ffffff' id: ef9e459e-4159-4ea2-b098-578a7c75fae7 name: white type: text value: 75 decimalPlaces: 0 height: 1 kind: Single_Stat name: Cluster Health Status queries: - query: "from(bucket: v.bucket)\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"prometheus\")\n \ |> filter(fn: (r) => r[\"_field\"] == \"ceph_health_status\") \n \ |> toString()\n |> map(fn: (r) => ({ r with _value: \n if r._value == \"0\"\n then \"HEALTH_OK\"\n else if r._value == \"1\"\n then \"HEALTH_WARN\"\n else \"HEALTH_ERROR\"\n \ }))\n |> yield()" width: 2 xPos: 2 yPos: 2 - height: 1 kind: Markdown name: Name this Cell note: '## PGs' width: 2 xPos: 2 yPos: 3 - colors: - hex: '#00C9FF' id: base name: laser type: background decimalPlaces: 0 height: 1 kind: Single_Stat name: PGs Total queries: - query: |- from(bucket: v.bucket) |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_pg_total") |> group(columns: ["_field", "_measurement", "_time", "_stop", "_start"]) |> aggregateWindow(every: v.windowPeriod, fn: sum, createEmpty: false) |> yield(name: "sum") suffix: ' PGs' width: 2 xPos: 2 yPos: 5 - colors: - hex: '#7CE490' id: base name: honeydew type: background decimalPlaces: 0 height: 1 kind: Single_Stat name: PGs Active queries: - query: |- from(bucket: v.bucket) |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_pg_active") |> group(columns: ["_field", "_measurement", "_time", "_stop", "_start"]) |> aggregateWindow(every: v.windowPeriod, fn: sum, createEmpty: false) |> yield(name: "sum") suffix: ' Active' width: 2 xPos: 2 yPos: 6 - colors: - hex: '#7CE490' id: base name: honeydew type: text - hex: '#FFD255' id: 523bf8ce-a739-43e9-ac03-597a79d0478c name: thunder type: text value: 1 decimalPlaces: 0 height: 1 kind: Single_Stat name: PGs Down queries: - query: |- from(bucket: v.bucket) |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_pg_down") |> group(columns: ["_field", "_measurement", "_time", "_stop", "_start"]) |> aggregateWindow(every: v.windowPeriod, fn: sum, createEmpty: false) |> yield(name: "sum") suffix: ' Down' width: 2 xPos: 2 yPos: 7 - colors: - hex: '#7CE490' id: base name: honeydew type: text - hex: '#FFB94A' id: c09ffecf-2494-4aef-b374-62da0832be6e name: pineapple type: text value: 1 decimalPlaces: 0 height: 1 kind: Single_Stat name: PGs Undersized queries: - query: |- from(bucket: v.bucket) |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_pg_undersized") |> group(columns: ["_field", "_measurement", "_time", "_stop", "_start"]) |> aggregateWindow(every: v.windowPeriod, fn: sum, createEmpty: false) |> yield(name: "sum") suffix: ' Undersized' width: 2 xPos: 2 yPos: 8 - colors: - hex: '#7CE490' id: base name: honeydew type: text - hex: '#FFD255' id: dd7a19b3-88b9-4231-ad94-a5b670996d2c name: thunder type: text value: 1 decimalPlaces: 0 height: 1 kind: Single_Stat name: PGs Degraded queries: - query: |- from(bucket: v.bucket) |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_pg_degraded") |> group(columns: ["_field", "_measurement", "_time", "_stop", "_start"]) |> aggregateWindow(every: v.windowPeriod, fn: sum, createEmpty: false) |> yield(name: "sum") suffix: ' Degraded' width: 2 xPos: 2 yPos: 9 - colors: - hex: '#7CE490' id: base name: honeydew type: text - hex: '#FFD255' id: 612b6132-79d4-4abe-b8df-f7b8bd97e0f2 name: thunder type: text value: 1 decimalPlaces: 0 height: 1 kind: Single_Stat name: PGs Inconsistent queries: - query: |- from(bucket: v.bucket) |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_pg_inconsistent") |> group(columns: ["_field", "_measurement", "_time", "_stop", "_start"]) |> aggregateWindow(every: v.windowPeriod, fn: sum, createEmpty: false) |> yield(name: "sum") suffix: ' Inconsistent' width: 2 xPos: 2 yPos: 10 - height: 1 kind: Markdown name: Name this Cell note: '## Cluster Latency' width: 2 xPos: 4 - axes: - base: "10" name: x scale: linear - base: "10" name: y scale: linear suffix: ' ms' colors: - hex: '#8F8AF4' id: 7cb1c6f3-f015-4872-9aea-be96ed91ac2b name: Do Androids Dream of Electric Sheep? type: scale - hex: '#A51414' id: 1b7af10d-2b32-4890-9318-929473a7bc67 name: Do Androids Dream of Electric Sheep? type: scale - hex: '#F4CF31' id: 44279c3e-4168-433d-88d6-ab822150f805 name: Do Androids Dream of Electric Sheep? type: scale geom: monotoneX height: 2 hoverDimension: auto kind: Xy legendOpacity: 1 legendOrientationThreshold: 10 name: OSD Apply Latency position: overlaid queries: - query: |- from(bucket: v.bucket) |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_osd_apply_latency_ms") |> group(columns: ["ceph_daemon"]) |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> yield(name: "mean") shade: true width: 2 xCol: _time xPos: 4 yCol: _value yPos: 1 - axes: - base: "10" name: x scale: linear - base: "10" name: y scale: linear suffix: ' ms' colors: - hex: '#8F8AF4' id: 7cb1c6f3-f015-4872-9aea-be96ed91ac2b name: Do Androids Dream of Electric Sheep? type: scale - hex: '#A51414' id: 1b7af10d-2b32-4890-9318-929473a7bc67 name: Do Androids Dream of Electric Sheep? type: scale - hex: '#F4CF31' id: 44279c3e-4168-433d-88d6-ab822150f805 name: Do Androids Dream of Electric Sheep? type: scale geom: monotoneX height: 2 hoverDimension: auto kind: Xy legendOpacity: 1 legendOrientationThreshold: 10 name: OSD Commit Latency position: overlaid queries: - query: |- from(bucket: v.bucket) |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_osd_commit_latency_ms") |> group(columns: ["ceph_daemon"]) |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false) |> yield(name: "mean") shade: true width: 2 xCol: _time xPos: 4 yCol: _value yPos: 3 - colors: - hex: '#00C9FF' id: base name: laser type: text decimalPlaces: 1 height: 1 kind: Single_Stat name: OSD Apply Latency Average 10m queries: - query: |- from(bucket: v.bucket) |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_osd_apply_latency_ms") |> group(columns: ["ceph_daemon"]) |> timedMovingAverage(every: 1m, period: 10m) suffix: ' ms' width: 2 xPos: 4 yPos: 5 - colors: - hex: '#00C9FF' id: base name: laser type: text decimalPlaces: 1 height: 1 kind: Single_Stat name: OSD Commit Latency Average 10m queries: - query: |- from(bucket: v.bucket) |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_osd_commit_latency_ms") |> group(columns: ["ceph_daemon"]) |> timedMovingAverage(every: 1m, period: 10m) suffix: ' ms' width: 2 xPos: 4 yPos: 6 - height: 1 kind: Markdown name: Name this Cell note: '## Cluster Pools' width: 2 xPos: 4 yPos: 7 - colors: - hex: '#00C9FF' id: base name: laser type: background decimalPlaces: 0 height: 1 kind: Single_Stat name: PGs Total queries: - query: |- from(bucket: v.bucket) |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_pool_metadata") |> group(columns: ["_field", "_measurement", "_time"]) |> count() |> yield(name: "count") suffix: ' Pools' width: 2 xPos: 4 yPos: 8 - colors: - hex: '#ffffff' id: base name: white type: text fieldOptions: - displayName: _time fieldName: _time visible: true - displayName: _field fieldName: _field visible: true - displayName: _measurement fieldName: _measurement visible: true - displayName: _value fieldName: _value visible: true - displayName: pool_id fieldName: pool_id visible: true - displayName: _start fieldName: _start visible: true - displayName: _stop fieldName: _stop visible: true - displayName: address fieldName: address visible: true - displayName: host fieldName: host visible: true - displayName: name fieldName: name visible: true - displayName: url fieldName: url visible: true height: 2 kind: Table name: Pools queries: - query: |- from(bucket: v.bucket) |> range(start: -1m) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_pool_metadata") |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false) |> group(columns: ["_time"]) |> keep(columns: ["name", "pool_id", "name"]) tableOptions: sortBy: pool_id verticalTimeAxis: true timeFormat: YYYY-MM-DD HH:mm:ss width: 2 xPos: 4 yPos: 9 - height: 1 kind: Markdown name: Name this Cell note: '## Cluster Capacity' width: 3 xPos: 6 - colors: - hex: '#00C9FF' id: "0" name: laser type: min - hex: '#DC4E58' id: "1" name: fire type: max value: 100 decimalPlaces: 1 height: 3 kind: Gauge name: Capacity Used In % queries: - query: |- bytes_used = from(bucket: v.bucket) |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_osd_stat_bytes_used") |> aggregateWindow(every: v.windowPeriod, fn: last) |> group(columns: ["_time", "_stop", "_start", "host", "_measurement"], mode:"by") |> sum(column: "_value") bytes_total = from(bucket: v.bucket) |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_osd_stat_bytes") |> aggregateWindow(every: v.windowPeriod, fn: last) |> group(columns: ["_time", "_stop", "_start", "host", "_measurement"], mode:"by") |> sum(column: "_value") join(tables: {used:bytes_used, total:bytes_total}, on: ["_time", "_stop", "_start", "host"]) |> map(fn: (r) => ({ _time: r._time, _value: (r._value_used / r._value_total) * 100.0 }) ) suffix: '%' tickSuffix: "true" width: 5 xPos: 6 yPos: 1 - height: 1 kind: Markdown name: Name this Cell note: '## Cluster I/O' width: 3 xPos: 6 yPos: 4 - axes: - base: "10" name: x scale: linear - base: "2" name: y scale: linear suffix: Bps colors: - hex: '#8F8AF4' id: 7cb1c6f3-f015-4872-9aea-be96ed91ac2b name: Do Androids Dream of Electric Sheep? type: scale - hex: '#A51414' id: 1b7af10d-2b32-4890-9318-929473a7bc67 name: Do Androids Dream of Electric Sheep? type: scale - hex: '#F4CF31' id: 44279c3e-4168-433d-88d6-ab822150f805 name: Do Androids Dream of Electric Sheep? type: scale geom: monotoneX height: 2 hoverDimension: auto kind: Xy legendOpacity: 1 legendOrientationThreshold: 10 name: Throughput position: overlaid queries: - query: "from(bucket: v.bucket)\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"prometheus\")\n \ |> filter(fn: (r) => r[\"_field\"] == \"ceph_osd_op_w_in_bytes\" or r[\"_field\"] == \"ceph_osd_op_r_out_bytes\" or r[\"_field\"] == \"ceph_osd_op_rw_in_bytes\") \n |> group(columns: [\"_field\"], mode:\"by\")\n \ |> aggregateWindow(every: v.windowPeriod, fn: sum, createEmpty: false)\n |> derivative(unit: 1s, nonNegative: true, columns: [\"_value\"], timeColumn: \"_time\")" shade: true width: 3 xCol: _time xPos: 6 yCol: _value yPos: 5 - axes: - base: "10" name: x scale: linear - name: y scale: linear colors: - hex: '#8F8AF4' id: 7cb1c6f3-f015-4872-9aea-be96ed91ac2b name: Do Androids Dream of Electric Sheep? type: scale - hex: '#A51414' id: 1b7af10d-2b32-4890-9318-929473a7bc67 name: Do Androids Dream of Electric Sheep? type: scale - hex: '#F4CF31' id: 44279c3e-4168-433d-88d6-ab822150f805 name: Do Androids Dream of Electric Sheep? type: scale geom: monotoneX height: 2 hoverDimension: auto kind: Xy legendOpacity: 1 legendOrientationThreshold: 10 name: IOPS position: overlaid queries: - query: "from(bucket: v.bucket)\n |> range(start: v.timeRangeStart, stop: v.timeRangeStop)\n |> filter(fn: (r) => r[\"_measurement\"] == \"prometheus\")\n \ |> filter(fn: (r) => r[\"_field\"] == \"ceph_osd_op_r\" or r[\"_field\"] == \"ceph_osd_op_w\" or r[\"_field\"] == \"ceph_osd_op_rw\") \n |> group(columns: [\"_field\"], mode:\"by\")\n |> aggregateWindow(every: v.windowPeriod, fn: sum, createEmpty: false)\n |> derivative(unit: 1s, nonNegative: true, columns: [\"_value\"], timeColumn: \"_time\")" shade: true width: 3 xCol: _time xPos: 6 yCol: _value yPos: 7 - axes: - base: "10" name: x scale: linear - base: "2" name: y scale: linear suffix: Op/s colors: - hex: '#8F8AF4' id: 7cb1c6f3-f015-4872-9aea-be96ed91ac2b name: Do Androids Dream of Electric Sheep? type: scale - hex: '#A51414' id: 1b7af10d-2b32-4890-9318-929473a7bc67 name: Do Androids Dream of Electric Sheep? type: scale - hex: '#F4CF31' id: 44279c3e-4168-433d-88d6-ab822150f805 name: Do Androids Dream of Electric Sheep? type: scale geom: monotoneX height: 2 hoverDimension: auto kind: Xy legendOpacity: 1 legendOrientationThreshold: 10 name: Recovery Rate position: overlaid queries: - query: |- from(bucket: v.bucket) |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_osd_recovery_ops") |> group(columns: ["pool_id"]) |> aggregateWindow(every: v.windowPeriod, fn: sum, createEmpty: false) |> derivative(unit: 1s, nonNegative: true, columns: ["_value"], timeColumn: "_time") shade: true width: 3 xCol: _time xPos: 6 yCol: _value yPos: 9 - colors: - hex: '#00C9FF' id: base name: laser type: text decimalPlaces: 1 height: 1 kind: Single_Stat name: Capacity Total GB queries: - query: |- from(bucket: v.bucket) |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_osd_stat_bytes") |> group(columns: ["_field", "_measurement", "_time", "_stop", "_start"]) |> aggregateWindow(every: v.windowPeriod, fn: sum, createEmpty: false) |> map(fn: (r) => ({ r with _value: r._value / 1073741824.0 })) suffix: ' GB' width: 1 xPos: 9 - height: 1 kind: Markdown name: Name this Cell note: '## Objects' width: 2 xPos: 9 yPos: 4 - axes: - base: "10" name: x scale: linear - base: "10" name: y scale: linear colors: - hex: '#00C9FF' id: base name: laser type: text - hex: '#8F8AF4' id: eaba9af5-31b5-44c4-aec4-aac18b8d78ee name: Do Androids Dream of Electric Sheep? type: scale - hex: '#A51414' id: 2fcab4d3-ea8e-4d34-87f2-f3f97367cf0d name: Do Androids Dream of Electric Sheep? type: scale - hex: '#F4CF31' id: 996ca3aa-0738-489b-be67-bcd913e0fccf name: Do Androids Dream of Electric Sheep? type: scale decimalPlaces: 0 height: 2 hoverDimension: auto kind: Single_Stat_Plus_Line legendOpacity: 1 legendOrientationThreshold: 10 name: Objects In Pools position: overlaid queries: - query: |- from(bucket: v.bucket) |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_pool_objects") |> group(columns: ["_field"]) |> aggregateWindow(every: v.windowPeriod, fn: sum, createEmpty: false) |> yield(name: "sum") shade: true width: 2 xCol: _time xPos: 9 yCol: _value yPos: 5 - axes: - base: "10" name: x scale: linear - base: "10" name: y scale: linear colors: - hex: '#31C0F6' id: 58262bed-f65a-4f87-8b0f-598eca74964a name: Nineteen Eighty Four type: scale - hex: '#A500A5' id: 324f44e9-a15d-4b63-90e2-c6c3e9251f32 name: Nineteen Eighty Four type: scale - hex: '#FF7E27' id: 9ec0304b-96a3-47f7-bdbc-f4b2f8a093dd name: Nineteen Eighty Four type: scale geom: line height: 2 hoverDimension: auto kind: Xy legendOpacity: 1 legendOrientationThreshold: 10 name: Objects - Status position: overlaid queries: - query: |- from(bucket: "demo") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_num_objects_degraded" or r["_field"] == "ceph_num_objects_misplaced" or r["_field"] == "ceph_num_objects_unfound") |> group(columns: ["_field"]) |> aggregateWindow(every: v.windowPeriod, fn: sum, createEmpty: false) |> yield(name: "sum") shade: true width: 2 xCol: _time xPos: 9 yCol: _value yPos: 7 - axes: - base: "10" name: x scale: linear - base: "2" name: y scale: linear suffix: Bps colors: - hex: '#8F8AF4' id: 7cb1c6f3-f015-4872-9aea-be96ed91ac2b name: Do Androids Dream of Electric Sheep? type: scale - hex: '#A51414' id: 1b7af10d-2b32-4890-9318-929473a7bc67 name: Do Androids Dream of Electric Sheep? type: scale - hex: '#F4CF31' id: 44279c3e-4168-433d-88d6-ab822150f805 name: Do Androids Dream of Electric Sheep? type: scale geom: monotoneX height: 2 hoverDimension: auto kind: Xy legendOpacity: 1 legendOrientationThreshold: 10 name: Egress / Ingress position: overlaid queries: - query: |- from(bucket: v.bucket) |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_pool_stored") |> group(columns: ["pool_id"]) |> aggregateWindow(every: v.windowPeriod, fn: sum, createEmpty: false) |> derivative(unit: 1s, nonNegative: true, columns: ["_value"], timeColumn: "_time") shade: true width: 2 xCol: _time xPos: 9 yCol: _value yPos: 9 - colors: - hex: '#00C9FF' id: base name: laser type: text decimalPlaces: 1 height: 1 kind: Single_Stat name: Capacity Used GB queries: - query: |- from(bucket: v.bucket) |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "prometheus") |> filter(fn: (r) => r["_field"] == "ceph_osd_stat_bytes_used") |> group(columns: ["_field", "_measurement", "_time", "_stop", "_start"]) |> aggregateWindow(every: v.windowPeriod, fn: sum, createEmpty: false) |> map(fn: (r) => ({ r with _value: r._value / 1073741824.0 })) suffix: ' GB' width: 1 xPos: 10 description: Ceph cluster running in Kubernetes monitored by Prometheus metrics name: Ceph Cluster --- apiVersion: influxdata.com/v2alpha1 kind: Telegraf metadata: name: relaxed-euclid-db6001 spec: config: "# Configuration for telegraf agent\n[agent]\n ## Default data collection interval for all inputs\n interval = \"1m\"\n ## Rounds collection interval to 'interval'\n ## ie, if interval=\"10s\" then always collect on :00, :10, :20, etc.\n round_interval = true\n\n ## Telegraf will send metrics to outputs in batches of at most\n ## metric_batch_size metrics.\n ## This controls the size of writes that Telegraf sends to output plugins.\n metric_batch_size = 10000\n\n ## For failed writes, telegraf will cache metric_buffer_limit metrics for each\n ## output, and will flush this buffer on a successful write. Oldest metrics\n ## are dropped first when this buffer fills.\n ## This buffer only fills when writes fail to output plugin(s).\n metric_buffer_limit = 100000\n\n ## Collection jitter is used to jitter the collection by a random amount.\n ## Each plugin will sleep for a random time within jitter before collecting.\n ## This can be used to avoid many plugins querying things like sysfs at the\n ## same time, which can have a measurable effect on the system.\n \ collection_jitter = \"0s\"\n\n ## Default flushing interval for all outputs. Maximum flush_interval will be\n ## flush_interval + flush_jitter\n flush_interval = \"10s\"\n ## Jitter the flush interval by a random amount. This is primarily to avoid\n ## large write spikes for users running a large number of telegraf instances.\n ## ie, a jitter of 5s and interval 10s means flushes will happen every 10-15s\n flush_jitter = \"0s\"\n\n ## By default or when set to \"0s\", precision will be set to the same\n ## timestamp order as the collection interval, with the maximum being 1s.\n ## ie, when interval = \"10s\", precision will be \"1s\"\n ## when interval = \"250ms\", precision will be \"1ms\"\n ## Precision will NOT be used for service inputs. It is up to each individual\n ## service input to set the timestamp at the appropriate precision.\n ## Valid time units are \"ns\", \"us\" (or \"µs\"), \"ms\", \"s\".\n precision = \"\"\n\n ## Logging configuration:\n ## Run telegraf with debug log messages.\n debug = false\n ## Run telegraf in quiet mode (error log messages only).\n quiet = false\n ## Specify the log file name. The empty string means to log to stderr.\n logfile = \"\"\n\n ## Override default hostname, if empty use os.Hostname()\n hostname = \"\"\n ## If set to true, do no set the \"host\" tag in the telegraf agent.\n omit_hostname = false\n[[outputs.influxdb_v2]]\t\n ## The URLs of the InfluxDB cluster nodes.\n ##\n ## Multiple URLs can be specified for a single cluster, only ONE of the\n ## urls will be written to each interval.\n ## urls exp: http://127.0.0.1:9999\n \ urls = [\"$INFLUX_HOST\"]\n\n ## Token for authentication.\n token = \"$INFLUX_TOKEN\"\n\n \ ## Organization is the name of the organization you wish to write to; must exist.\n organization = \"$INFLUX_ORG\"\n\n ## Destination bucket to write into.\n bucket = \"$INFLUX_BUCKET\"\n\n# Read metrics from one or many prometheus clients\n[[inputs.prometheus]]\n ## An array of urls to scrape metrics from.\n \ # urls = [\"http://localhost:9100/metrics\"]\n\n ## Metric version controls the mapping from Prometheus metrics into\n ## Telegraf metrics. When using the prometheus_client output, use the same\n ## value in both plugins to ensure metrics are round-tripped without\n ## modification.\n ##\n ## example: metric_version = 1; deprecated in 1.13\n ## metric_version = 2; recommended version\n metric_version = 2\n\n ## An array of Kubernetes services to scrape metrics from.\n ## \n kubernetes_services = [\"$CEPH_MGR_SVC_URLS\"]\n\n \ ## Kubernetes config file to create client from.\n # kube_config = \"/path/to/kubernetes.config\"\n\n \ ## Scrape Kubernetes pods for the following prometheus annotations:\n ## - prometheus.io/scrape: Enable scraping for this pod\n ## - prometheus.io/scheme: If the metrics endpoint is secured then you will need to\n ## set this to `https` & most likely set the tls config.\n ## - prometheus.io/path: If the metrics path is not /metrics, define it with this annotation.\n ## - prometheus.io/port: If port is not 9102 use this annotation\n monitor_kubernetes_pods = false\n ## Restricts Kubernetes monitoring to a single namespace\n ## \ ex: monitor_kubernetes_pods_namespace = \"default\"\n # monitor_kubernetes_pods_namespace = \"\"\n # label selector to target pods which have the label\n # kubernetes_label_selector = \"env=dev,app=nginx\"\n # field selector to target pods\n # eg. To scrape pods on a specific node\n # kubernetes_field_selector = \"spec.nodeName=$HOSTNAME\"\n\n \ ## Use bearer token for authorization. ('bearer_token' takes priority)\n \ bearer_token = \"/run/secrets/kubernetes.io/serviceaccount/token\"\n ## OR\n # bearer_token_string = \"abc_123\"\n\n ## HTTP Basic Authentication username and password. ('bearer_token' and\n ## 'bearer_token_string' take priority)\n # username = \"\"\n # password = \"\"\n\n ## Specify timeout duration for slower prometheus clients (default is 3s)\n # response_timeout = \"3s\"\n\n ## Optional TLS Config\n # tls_ca = /path/to/cafile\n # tls_cert = /path/to/certfile\n # tls_key = /path/to/keyfile\n ## Use TLS but skip chain & host verification\n # insecure_skip_verify = false\n" description: using ceph-mgr's built-in prometheus exporter name: ceph-prometheus