{ "uid": "turingpi-bmc", "title": "Turing Pi 2 BMC", "tags": [ "bmc", "turingpi", "hardware" ], "timezone": "browser", "schemaVersion": 39, "version": 1, "refresh": "1m", "time": { "from": "now-6h", "to": "now" }, "editable": true, "description": "The BMC of a Turing Pi 2 running the excavador-turing firmware fork. Every panel reads a metric the board publishes at /metrics; the catalogue and a scrape config are at https://turing.excavador.xyz/reference/metrics/", "panels": [ { "type": "row", "title": "Board", "gridPos": { "x": 0, "y": 0, "w": 24, "h": 1 }, "collapsed": false, "panels": [], "id": 1 }, { "type": "stat", "title": "Scrape", "id": 2, "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "gridPos": { "x": 0, "y": 1, "w": 3, "h": 4 }, "targets": [ { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "up{job=\"turingpi-bmc\"}", "refId": "A", "instant": true, "legendFormat": "{{instance}}" } ], "description": "1 when your scraper last reached the board's /metrics. Everything else on this dashboard is meaningless when this is 0 -- read it first.", "options": { "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "colorMode": "background", "graphMode": "none", "textMode": "value" }, "fieldConfig": { "defaults": { "custom": {}, "thresholds": { "mode": "absolute", "steps": [ { "color": "red", "value": null }, { "color": "green", "value": 1 } ] } }, "overrides": [ { "matcher": { "id": "byType", "options": "number" }, "properties": [ { "id": "mappings", "value": [ { "type": "value", "options": { "0": { "text": "DOWN", "index": 0 }, "1": { "text": "UP", "index": 1 } } } ] } ] } ] } }, { "type": "stat", "title": "Daemon", "id": 3, "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "gridPos": { "x": 3, "y": 1, "w": 4, "h": 4 }, "targets": [ { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "bmcd_build_info", "refId": "A", "legendFormat": "{{instance}} {{version}}", "instant": true } ], "description": "bmcd's own version, from bmcd_build_info.", "options": { "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "colorMode": "none", "graphMode": "none", "textMode": "name" }, "fieldConfig": { "defaults": { "custom": {}, "thresholds": { "mode": "absolute", "steps": [ { "color": "text", "value": null } ] } }, "overrides": [] } }, { "type": "stat", "title": "BMC uptime", "id": 4, "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "gridPos": { "x": 7, "y": 1, "w": 4, "h": 4 }, "targets": [ { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "bmcd_uptime_seconds", "refId": "A", "instant": true, "legendFormat": "{{instance}}" } ], "description": "Seconds since the BMC booted. A reset here without a firmware flash is worth explaining.", "options": { "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "colorMode": "none", "graphMode": "area", "textMode": "value" }, "fieldConfig": { "defaults": { "custom": {}, "unit": "s", "thresholds": { "mode": "absolute", "steps": [ { "color": "text", "value": null } ] } }, "overrides": [] } }, { "type": "stat", "title": "Fan step", "id": 5, "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "gridPos": { "x": 11, "y": 1, "w": 4, "h": 4 }, "targets": [ { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "bmcd_cooling_state", "refId": "A", "instant": true, "legendFormat": "{{instance}}" } ], "description": "The fan is driven by the kernel thermal zone and takes SEVEN discrete steps (0-6), not a percentage. The device tree's cooling-levels are 0 16 32 64 102 170 254, so the steps are not evenly spaced in duty.", "options": { "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "colorMode": "value", "graphMode": "none", "textMode": "value" }, "fieldConfig": { "defaults": { "custom": {}, "min": 0, "max": 6, "decimals": 0, "thresholds": { "mode": "absolute", "steps": [ { "color": "blue", "value": null }, { "color": "green", "value": 2 }, { "color": "yellow", "value": 4 }, { "color": "red", "value": 6 } ] } }, "overrides": [] } }, { "type": "stat", "title": "SoC temperature", "id": 6, "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "gridPos": { "x": 15, "y": 1, "w": 4, "h": 4 }, "targets": [ { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "bmcd_temperature_celsius", "refId": "A", "instant": true, "legendFormat": "{{instance}}" } ], "description": "The T113s thermal sensor. Mainline describes no THS node for this SoC, so this reads at all only because the board DTS in this fork adds one.", "options": { "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "colorMode": "value", "graphMode": "area", "textMode": "value" }, "fieldConfig": { "defaults": { "custom": {}, "unit": "celsius", "decimals": 1, "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null }, { "color": "yellow", "value": 60 }, { "color": "orange", "value": 70 }, { "color": "red", "value": 85 } ] } }, "overrides": [] } }, { "type": "stat", "title": "NAND free", "id": 7, "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "gridPos": { "x": 19, "y": 1, "w": 5, "h": 4 }, "targets": [ { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "bmcd_nand_eraseblocks{state=\"available\"} or bmcd_nand_available_bytes", "refId": "A", "instant": true, "legendFormat": "{{instance}}" } ], "description": "Unallocated space on the BMC's NAND. It only ever goes down; a sudden drop means something is writing to flash that should not be.", "options": { "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "colorMode": "none", "graphMode": "none", "textMode": "value" }, "fieldConfig": { "defaults": { "custom": {}, "unit": "bytes", "thresholds": { "mode": "absolute", "steps": [ { "color": "text", "value": null } ] } }, "overrides": [] } }, { "type": "timeseries", "title": "Thermal loop — temperature against fan step", "id": 8, "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "gridPos": { "x": 0, "y": 5, "w": 24, "h": 8 }, "targets": [ { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "bmcd_temperature_celsius", "refId": "A", "legendFormat": "{{instance}} temperature (C)" }, { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "bmcd_cooling_state", "refId": "B", "legendFormat": "{{instance}} fan step (0-6)" } ], "description": "The pair that says whether the thermal loop actually works. The fan is stepped by the kernel from trips at 20/45/60/70 C with a floor at step 3, and the sensor is the BMC SoC while the fan cools the MODULES -- so expect the fan to lead temperature, not track it. A flat fan line while temperature climbs means the zone is not driving the cooling device.", "options": { "legend": { "displayMode": "list", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "none" } }, "fieldConfig": { "defaults": { "custom": { "drawStyle": "line", "lineWidth": 2, "fillOpacity": 8, "showPoints": "never", "axisPlacement": "left" }, "thresholds": { "mode": "absolute", "steps": [ { "color": "text", "value": null } ] } }, "overrides": [ { "matcher": { "id": "byName", "options": "fan step (0-6)" }, "properties": [ { "id": "custom.axisPlacement", "value": "right" }, { "id": "max", "value": 6 }, { "id": "min", "value": 0 }, { "id": "custom.drawStyle", "value": "line" }, { "id": "custom.lineInterpolation", "value": "stepAfter" }, { "id": "custom.fillOpacity", "value": 20 }, { "id": "color", "value": { "mode": "fixed", "fixedColor": "orange" } } ] }, { "matcher": { "id": "byName", "options": "temperature (C)" }, "properties": [ { "id": "unit", "value": "celsius" } ] } ] } }, { "type": "row", "title": "Compute modules", "gridPos": { "x": 0, "y": 13, "w": 24, "h": 1 }, "collapsed": false, "panels": [], "id": 9 }, { "type": "state-timeline", "title": "Node power rails", "id": 10, "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "gridPos": { "x": 0, "y": 14, "w": 12, "h": 6 }, "targets": [ { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "bmcd_node_power_state", "refId": "A", "legendFormat": "{{instance}} {{node}}" } ], "description": "The four RK1 rails. A firmware flash must NOT change these: bmcd reads the live rail state on start and adopts it rather than re-applying what bmcd.bin persisted.", "options": { "legend": { "displayMode": "list", "placement": "bottom", "showLegend": true }, "mergeValues": true, "showValue": "never" }, "fieldConfig": { "defaults": { "custom": { "fillOpacity": 80, "lineWidth": 0 }, "min": 0, "max": 1, "thresholds": { "mode": "absolute", "steps": [ { "color": "text", "value": null } ] } }, "overrides": [ { "matcher": { "id": "byType", "options": "number" }, "properties": [ { "id": "mappings", "value": [ { "type": "value", "options": { "0": { "text": "off", "color": "red", "index": 0 }, "1": { "text": "on", "color": "green", "index": 1 } } } ] } ] } ] } }, { "type": "timeseries", "title": "Time since each module was powered", "id": 11, "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "gridPos": { "x": 12, "y": 14, "w": 12, "h": 6 }, "targets": [ { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "bmcd_node_power_on_seconds", "refId": "A", "legendFormat": "{{instance}} {{node}}" } ], "description": "Elapsed seconds since the rail came up -- a DURATION the daemon reports, not a timestamp. It only clears on a real power cycle: the web UI's RESTART sends type=reset, which does not drop the rail, so a node can show a long power-on time and a short OS uptime.", "options": { "legend": { "displayMode": "list", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi" } }, "fieldConfig": { "defaults": { "custom": { "drawStyle": "line", "lineWidth": 2, "fillOpacity": 0, "showPoints": "never" }, "unit": "s", "thresholds": { "mode": "absolute", "steps": [ { "color": "text", "value": null } ] } }, "overrides": [] } }, { "type": "timeseries", "title": "A node's switch port is down while its rail is ON", "id": 12, "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "gridPos": { "x": 0, "y": 20, "w": 24, "h": 6 }, "targets": [ { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "label_replace(bmcd_switch_port_link{port=~\"node.*\"}, \"node\", \"$1\", \"port\", \"(.*)\") == 0 and on(node) bmcd_node_power_state == 1", "refId": "A", "legendFormat": "{{instance}} {{node}}" } ], "description": "The 'node NIC dead' signal, and the reason SQU-107 exists: nothing else in this estate can see it. A powered module whose switch port has no carrier is islanded -- it is up, and unreachable.\n\nEMPTY IS THE HEALTHY STATE. This panel draws nothing when all is well, which is deliberate; the join was verified by inverting it (== 1 returns exactly four series).\n\nThe port filter is by NAME (port=~\"node.*\") and not by kind=\"node\", because only bmcd_switch_port_present carries a kind label -- link, speed and the byte counters do not.", "options": { "legend": { "displayMode": "list", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi" } }, "fieldConfig": { "defaults": { "custom": { "drawStyle": "bars", "lineWidth": 2, "fillOpacity": 70, "showPoints": "never" }, "min": 0, "max": 1, "thresholds": { "mode": "absolute", "steps": [ { "color": "red", "value": null } ] } }, "overrides": [] } }, { "type": "row", "title": "Switch", "gridPos": { "x": 0, "y": 26, "w": 24, "h": 1 }, "collapsed": false, "panels": [], "id": 13 }, { "type": "state-timeline", "title": "Per-port carrier", "id": 14, "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "gridPos": { "x": 0, "y": 27, "w": 12, "h": 6 }, "targets": [ { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "bmcd_switch_port_link", "refId": "A", "legendFormat": "{{instance}} {{port}}" } ], "description": "All six RTL8370MB-CG ports: four to the modules, ge0 and ge1 the uplinks. ge1 reading down is expected on this board -- only one uplink is cabled.", "options": { "legend": { "displayMode": "list", "placement": "bottom", "showLegend": true }, "mergeValues": true, "showValue": "never" }, "fieldConfig": { "defaults": { "custom": { "fillOpacity": 80, "lineWidth": 0 }, "min": 0, "max": 1, "thresholds": { "mode": "absolute", "steps": [ { "color": "text", "value": null } ] } }, "overrides": [ { "matcher": { "id": "byType", "options": "number" }, "properties": [ { "id": "mappings", "value": [ { "type": "value", "options": { "0": { "text": "down", "color": "red", "index": 0 }, "1": { "text": "up", "color": "green", "index": 1 } } } ] } ] } ] } }, { "type": "timeseries", "title": "Per-port traffic", "id": 15, "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "gridPos": { "x": 12, "y": 27, "w": 12, "h": 6 }, "targets": [ { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "rate(bmcd_switch_port_rx_bytes_total[5m])*8", "refId": "A", "legendFormat": "{{instance}} {{port}} rx" }, { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "rate(bmcd_switch_port_tx_bytes_total[5m])*8", "refId": "B", "legendFormat": "{{instance}} {{port}} tx" } ], "description": "Counters straight off the switch. This is also how each port was mapped to its module: correlating a traffic delta per port against each node's own NIC, which matched within 2-5% with identical ordering.", "options": { "legend": { "displayMode": "list", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi" } }, "fieldConfig": { "defaults": { "custom": { "drawStyle": "line", "lineWidth": 1, "fillOpacity": 5, "showPoints": "never" }, "unit": "bps", "thresholds": { "mode": "absolute", "steps": [ { "color": "text", "value": null } ] } }, "overrides": [] } }, { "type": "timeseries", "title": "Per-port errors", "id": 16, "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "gridPos": { "x": 0, "y": 33, "w": 24, "h": 5 }, "targets": [ { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "rate(bmcd_switch_port_rx_errors_total[5m])", "refId": "A", "legendFormat": "{{instance}} {{port}} rx errors" }, { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "rate(bmcd_switch_port_tx_errors_total[5m])", "refId": "B", "legendFormat": "{{instance}} {{port}} tx errors" } ], "description": "Flat at zero is the expected state. Anything sustained here is a cable or a port, and it will show up as retransmits long before anything else in the estate notices.", "options": { "legend": { "displayMode": "list", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi" } }, "fieldConfig": { "defaults": { "custom": { "drawStyle": "line", "lineWidth": 1, "fillOpacity": 10, "showPoints": "never" }, "unit": "pps", "thresholds": { "mode": "absolute", "steps": [ { "color": "text", "value": null } ] } }, "overrides": [] } }, { "type": "row", "title": "BMC health", "gridPos": { "x": 0, "y": 38, "w": 24, "h": 1 }, "collapsed": false, "panels": [], "id": 17 }, { "type": "timeseries", "title": "Load average", "id": 18, "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "gridPos": { "x": 0, "y": 39, "w": 6, "h": 6 }, "targets": [ { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "bmcd_load1", "refId": "A", "legendFormat": "{{instance}} 1m" }, { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "bmcd_load5", "refId": "B", "legendFormat": "{{instance}} 5m" }, { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "bmcd_load15", "refId": "C", "legendFormat": "{{instance}} 15m" } ], "description": "A single-core-class SoC with 116 MB of RAM. Sustained load here is usually a firmware upload or a serial console.", "options": { "legend": { "displayMode": "list", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi" } }, "fieldConfig": { "defaults": { "custom": { "drawStyle": "line", "lineWidth": 1, "fillOpacity": 5, "showPoints": "never" }, "decimals": 2, "thresholds": { "mode": "absolute", "steps": [ { "color": "text", "value": null } ] } }, "overrides": [] } }, { "type": "timeseries", "title": "Memory", "id": 19, "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "gridPos": { "x": 6, "y": 39, "w": 6, "h": 6 }, "targets": [ { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "bmcd_memory_total_bytes", "refId": "A", "legendFormat": "{{instance}} total" }, { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "bmcd_memory_available_bytes", "refId": "B", "legendFormat": "{{instance}} available" }, { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "bmcd_memory_free_bytes", "refId": "C", "legendFormat": "{{instance}} free" }, { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "bmcd_process_resident_bytes", "refId": "D", "legendFormat": "{{instance}} bmcd (resident)" } ], "description": "116 MB total. This is why firmware staging was moved off /tmp: a 58 MB tmpfs on a 116 MB board could not hold a 37 MB image plus the daemon's buffers.\n\nWatch `available` against `bmcd (resident)`. On 2026-09-09 available fell about 1 MB a minute under sustained polling and the board stopped answering at 70 MB; the daemon's own resident set did not exist yet, so nothing here could say what was consuming it. That is what the fourth series is for. SQU-172.", "options": { "legend": { "displayMode": "list", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi" } }, "fieldConfig": { "defaults": { "custom": { "drawStyle": "line", "lineWidth": 1, "fillOpacity": 5, "showPoints": "never" }, "unit": "bytes", "thresholds": { "mode": "absolute", "steps": [ { "color": "text", "value": null } ] } }, "overrides": [] } }, { "type": "timeseries", "title": "Clock offset from true time", "id": 20, "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "gridPos": { "x": 12, "y": 39, "w": 6, "h": 6 }, "targets": [ { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "bmcd_clock_offset_seconds", "refId": "A", "legendFormat": "{{instance}} offset" } ], "description": "The BMC's clock minus true time, negative when the board is behind. It has no battery-backed sync on boot, so expect a step at every reboot and a settle afterwards. Timestamps in the promotion log come from this clock.", "options": { "legend": { "displayMode": "list", "placement": "bottom", "showLegend": false }, "tooltip": { "mode": "single" } }, "fieldConfig": { "defaults": { "custom": { "drawStyle": "line", "lineWidth": 1, "fillOpacity": 5, "showPoints": "never" }, "unit": "s", "decimals": 6, "thresholds": { "mode": "absolute", "steps": [ { "color": "text", "value": null } ] } }, "overrides": [] } }, { "type": "row", "title": "Firmware", "id": 21, "collapsed": false, "gridPos": { "x": 0, "y": 46, "w": 24, "h": 1 }, "panels": [] }, { "type": "stat", "title": "Promotions", "id": 22, "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "gridPos": { "x": 0, "y": 47, "w": 4, "h": 5 }, "targets": [ { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "bmcd_firmware_promotion_total{result=\"promoted\"}", "refId": "A", "legendFormat": "{{instance}} promoted" } ], "description": "Boots the health gate kept. Derived as attempts minus rollbacks, because the gate writes no single line meaning 'kept' -- a board cut off mid-gate counts here.", "fieldConfig": { "defaults": { "unit": "short", "thresholds": { "mode": "absolute", "steps": [ { "color": "green", "value": null } ] } }, "overrides": [] }, "options": { "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "colorMode": "value", "graphMode": "none", "textMode": "auto", "justifyMode": "auto" } }, { "type": "stat", "title": "Rollbacks", "id": 23, "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "gridPos": { "x": 4, "y": 47, "w": 4, "h": 5 }, "targets": [ { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "bmcd_firmware_promotion_total{result=\"rolled_back\"}", "refId": "A", "legendFormat": "{{instance}} rolled back" } ], "description": "Boots the gate refused. A rollback is not a fault in itself -- it is the gate doing its job -- but one you did not expect is worth reading /mnt/overlay/postupdate.log for.", "fieldConfig": { "defaults": { "unit": "short", "thresholds": { "mode": "absolute", "steps": [ { "color": "text", "value": null }, { "color": "orange", "value": 1 } ] } }, "overrides": [] }, "options": { "reduceOptions": { "calcs": [ "lastNotNull" ], "fields": "", "values": false }, "colorMode": "value", "graphMode": "none", "textMode": "auto", "justifyMode": "auto" } }, { "type": "timeseries", "title": "The gate, over time", "id": 24, "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "gridPos": { "x": 8, "y": 47, "w": 16, "h": 5 }, "targets": [ { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "increase(bmcd_firmware_promotion_total{result=\"promoted\"}[1h])", "refId": "A", "legendFormat": "{{instance}} promoted" }, { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "increase(bmcd_firmware_promotion_total{result=\"rolled_back\"}[1h])", "refId": "B", "legendFormat": "{{instance}} rolled back" } ], "description": "A step on 'rolled back' is the board refusing an image and returning to the one it had. The reason is in /mnt/overlay/postupdate.log, which survives that reboot -- both images mount that volume.", "fieldConfig": { "defaults": { "custom": { "drawStyle": "bars", "lineWidth": 1, "fillOpacity": 40, "showPoints": "never", "axisPlacement": "auto" }, "unit": "short", "thresholds": { "mode": "absolute", "steps": [ { "color": "text", "value": null } ] } }, "overrides": [] }, "options": { "legend": { "displayMode": "list", "placement": "bottom", "showLegend": true, "calcs": [] }, "tooltip": { "mode": "multi", "sort": "none" } } }, { "type": "timeseries", "title": "Threads", "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "id": 25, "gridPos": { "x": 18, "y": 39, "w": 6, "h": 6 }, "description": "Threads the daemon has, beside the memory panel to its left. That pairing is the point: a heap leak grows the resident set with this flat, while a leaked task or an unreaped blocking thread grows both, because every thread carries a stack.\n\nOn 2026-09-09 the board lost about a megabyte a minute and neither series existed, so the two could not be told apart. SQU-172.", "targets": [ { "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, "expr": "bmcd_process_threads", "refId": "A", "legendFormat": "{{instance}} threads" } ], "fieldConfig": { "defaults": { "custom": { "drawStyle": "line", "lineWidth": 1, "fillOpacity": 10, "showPoints": "never", "axisPlacement": "auto" }, "unit": "short", "thresholds": { "mode": "absolute", "steps": [ { "color": "text", "value": null } ] } }, "overrides": [] }, "options": { "legend": { "displayMode": "list", "placement": "bottom", "showLegend": false, "calcs": [] }, "tooltip": { "mode": "single", "sort": "none" } } } ], "annotations": { "list": [] }, "templating": { "list": [] }, "__inputs": [ { "name": "DS_PROMETHEUS", "label": "Prometheus", "description": "Whatever scrapes your BMC: Prometheus, VictoriaMetrics, Mimir.", "type": "datasource", "pluginId": "prometheus", "pluginName": "Prometheus" } ] }