Skip to content

Metrics

Upstream's firmware exposes no metrics. This fork serves 34 families at /metrics, in Prometheus text format.

This page is generated from the daemon's source, so it cannot describe a metric the daemon does not emit. The authority is always the board:

$ curl -s http://<board>:9110/metrics

Its own port, and no credential

/metrics is served on port 9110, plain HTTP, and takes no credential.

That is a change from earlier releases, which put it on :443 beside the API behind a token of its own. The token existed for one reason: so that a credential sitting in a scrape config could not also reach /api/bmc and power four compute modules off. On a listener that serves nothing but /metrics there is nothing else to reach, so the property survives and the mechanism is a port instead of a secret — one fewer thing to mint, store, rotate and leak.

The TLS went with it. It was always scraped with verification disabled, because the board's certificate is expired and carries no subject-alternative name, so nothing could verify it. Unverified TLS is a handshake per scrape on a Cortex-A7 in exchange for nothing.

What protects the endpoint is the network. It binds the same address as the API, so restricting the daemon to a management network restricts both. And there is nothing secret in it: temperatures, fan steps, port counters, power state, NAND wear and slot versions.

On a board older than v2.15.0

/metrics is on :443 and wants a token, which tpi metrics show printed. That command is gone, along with the token; if you are scraping an older board, keep the old config until you update it.

A Grafana dashboard over every family below ships with each release; see monitor it.

Scraping it

scrape_configs:
  - job_name: turingpi-bmc
    static_configs:
      - targets: ["<board>:9110"]
        labels:
          instance: <the board's hostname>

The instance label follows the hostname

Renaming the board changes the instance label on every series, so a history does not follow it across the rename — and renaming back does not rejoin them. Both tpi hostname and the Settings tab say so before they do it.

The families

The daemon

metric type what it is
bmcd_build_info gauge Version of the daemon that produced these metrics. Always 1; the answer is in the version label.

Read this one first when a number looks wrong. Every other family below is produced by the daemon this names, and a metric that does not exist in an older build is simply absent rather than zero.

Temperature and cooling

metric type what it is
bmcd_cooling_state gauge Step a cooling device is currently at.
bmcd_cooling_state_max gauge Highest step a cooling device accepts.
bmcd_cooling_overridden gauge 1 while a fan is held at a step and its zone's governor is paused.
bmcd_temperature_celsius gauge Temperature reported by a kernel thermal zone.

The switch

metric type what it is
bmcd_switch_port_link gauge Whether a switch port has carrier.
bmcd_switch_port_present gauge Whether the kernel has a netdev for this switch port.
bmcd_switch_port_rx_bytes_total counter Bytes received on a switch port.
bmcd_switch_port_rx_errors_total counter Receive errors on a switch port.
bmcd_switch_port_speed_bits_per_second gauge Negotiated line rate of a switch port.
bmcd_switch_port_tx_bytes_total counter Bytes transmitted on a switch port.
bmcd_switch_port_tx_errors_total counter Transmit errors on a switch port.

Compute modules

metric type what it is
bmcd_node_power_on_seconds gauge Seconds since a compute module was powered on.
bmcd_node_power_state gauge Whether a compute module is powered on.

The BMC itself

metric type what it is
bmcd_load1 gauge 1-minute load average of the BMC.
bmcd_load15 gauge 15-minute load average of the BMC.
bmcd_load5 gauge 5-minute load average of the BMC.
bmcd_memory_available_bytes gauge Memory available to a new allocation on the BMC, reclaim included.
bmcd_memory_free_bytes gauge Free memory of the BMC.
bmcd_memory_total_bytes gauge Total memory of the BMC.
bmcd_process_resident_bytes gauge This daemon's own resident set. Board memory says the board is being consumed; only this says by whom.
bmcd_process_threads gauge Threads this daemon has. Read beside the resident set: a heap leak grows memory with this flat, while a leaked task or an unreaped blocking thread grows both, because every thread carries a stack.
bmcd_uptime_seconds gauge Seconds since the BMC booted.

NAND

metric type what it is
bmcd_nand_available_bytes gauge Unallocated space on the BMC's NAND.
bmcd_nand_eraseblock_size_bytes gauge Size of one logical eraseblock of the BMC's NAND.
bmcd_nand_eraseblocks gauge Eraseblocks of the BMC's NAND, by what UBI counts them as.

Clock

metric type what it is
bmcd_clock_offset_seconds gauge The BMC's system clock minus true time; negative when the board is behind.
bmcd_clock_stratum gauge Stratum of the time source the BMC is synchronised to.
bmcd_clock_synchronised gauge Whether the BMC's system clock is disciplined. Absent when that cannot be determined.
bmcd_rtc_info gauge A real-time clock the kernel registered on the BMC.
bmcd_rtc_present gauge Whether the BMC has a real-time clock at all.

Firmware

metric type what it is
bmcd_firmware_promotion_total counter Boots that ran the firmware health gate, by what the gate decided. promoted is derived as attempts minus rollbacks, because the gate has no single line meaning kept; a board cut off mid-gate therefore counts as promoted.
bmcd_firmware_slot_info gauge A firmware slot on the BMC's NAND. The rollback slot is not mounted, so it has no version.
bmcd_firmware_slot_size_bytes gauge Size of the firmware in a slot.
bmcd_firmware_update_staged gauge Whether a firmware update is staged for the next boot. Absent when the U-Boot environment cannot be read.

A gauge that is absent is not a zero

Several of these are omitted rather than sent as 0 when the board cannot answer: bmcd_clock_synchronised on a board with no chrony, bmcd_firmware_update_staged when the boot environment cannot be read, bmcd_process_resident_bytes on a kernel without /proc/self/statm, bmcd_process_threads on one without /proc/self/status. An absent series means not known; a zero would be a claim.