Skip to content

Releases

v0.3.1

Choose a tag to compare

@Marice Marice released this 19 Oct 17:10

Changed

  • The process is named ps5-exporter.elf. Started through an ELF loader's port it showed as payload.elf in
    process lists such as pldmgr's and PayLoader's.

ps5-exporter v0.3.0

Choose a tag to compare

@Marice Marice released this 18 Oct 18:56

Added

  • Power per rail. ps5_power_rail_watts, _volts and _amperes for the 8 rails of sceKernelGetSocPowerConsumption, and ps5_power_watts, their sum (the SoC and its memory; not checked against a wall meter). Rail 0 is the GPU core.
  • Clocks. ps5_soc_clock_hertz (26 domains; 20 is the GPU) and ps5_cpu_core_clock_hertz.
  • The running game and its FPS. ps5_game_info{title_id} and ps5_fps, from the display's flip counter.
  • Memory and devices. Swap, wired memory and page tables; address, MAC and MTU per network interface; USB and disc drive power.
  • Scrape timing. ps5_exporter_scrape_seconds and ps5_exporter_collect_seconds{group}.
  • Grafana. Panels for power (total and GPU), FPS, GPU and memory clocks, and power per rail.
  • A version marker in the ELF file (PS5EXPORTER_VER:0.3.0).

Changed

  • CPU usage comes from the idle threads, per logical CPU (16).
  • Getters beyond the SDK's own samples are looked up on first use. A function a firmware does not export now costs only its metric, instead of stopping the payload at load.

Fixed

  • CPU usage was always empty: sceKernelGetCpuUsageAll answers 0x80020016 on 13.60.
  • ps5_soc_power_watts was never published. It is replaced by the rails; ps5_soc_power_raw_value stays, deprecated, for readers of 0.2.0.

Notes

  • Tested on one console: PS5 Pro (CFI-7121), firmware 13.60. Other firmware: likely, not verified.
  • Tools that read only the first word of the power call (shown as "SoC power") show rail 0, the GPU core.
  • Thanks to drakmor/ps5-hwinfo (power layout, clocks, CPU load), erickdavestech/ps5-hud-dualsense-overlay (telemetry notes), Common FPS for PS5 (the flip counter) and phantomptr/ps5upload (the call's buffer size).

Files

  • ps5-exporter.elf: the payload.
  • ps5-exporter-grafana-dashboard.json: the dashboard.
  • SHA256SUMS: checksums.

v0.2.0

Choose a tag to compare

@Marice Marice released this 06 Oct 15:20

Fixed

  • Buffer overflow when ShadowMount reported more games than fitted in the
    output buffer: the append helpers counted what they would have written
    instead of what they did, so the length ran past the capacity and the
    next collector wrote outside the buffer. All output now goes through one
    append-only buffer that cannot overflow, confirmed by a test with 900
    games under AddressSanitizer.
  • Per-core CPU usage printed the wrong value because the core index was
    missing from the format arguments.
  • A slow client could hold the single-threaded server indefinitely: reading
    a request and writing a response now have wall-clock deadlines.
  • An unusable listening socket (which suspending and resuming the console
    can cause) made the accept loop spin forever instead of rebinding.
  • JSON parsing read past the end of the response on truncated escapes and
    short true/false values.
  • Per-process metrics were missing on firmware 13.60: its process records
    are 1096 bytes while the SDK header describes 1088, so the record size
    now comes from the kernel instead of the header.

Changed

  • ps5_fan_duty_percent and ps5_cpu_usage_percent are now
    ps5_fan_duty_ratio and ps5_cpu_usage_ratio (0 to 1, the Prometheus
    convention). ps5_fan_duty_raw is gone, ps5_soc_power_raw is now
    ps5_soc_power_raw_value.
  • ps5_cpu_usage_ratio no longer carries a core="all" sample: an
    aggregate inside the same family makes sum() double-count. Use avg().
  • Process metrics are aggregated per executable name instead of per pid,
    which keeps the number of time series bounded. Adds
    ps5_process_instances.
  • The ShadowMount game list is cached for five minutes and all its calls
    share a four second budget, so a scrape stays inside Prometheus' timeout.
  • /quit only answers on loopback.
  • The version now comes from the Makefile, so the binary and the release
    tag cannot disagree.

Added

  • Dashboard: the game library table now joins the per-title state onto the
    info metric, so names, platform and source show up; panels for metrics
    firmware 13.60 refuses say so instead of "No data".
  • ps5_filesystem_free_bytes, ps5_exporter_collector_success,
    ps5_shadowmount_games_cache_age_seconds, ps5_process_record_bytes,
    ps5_process_instances.
  • make test: host tests with sanitizers, no console needed.

Added

  • Fan speed (ps5_fan_duty_percent, raw 0..1024 scale from the kernel).
  • Per-core CPU usage and the average (ps5_cpu_usage_percent{core}).
  • SoC power draw and the lifetime counters: hours powered on and power
    cycles since new.
  • Dashboard: SoC power and lifetime panels; the fan and CPU panels now have
    data.
  • All SoC temperature sensors the kernel answers for (not only 0..3).
  • Direct memory pool size and largest free block.
  • Per-process CPU time and resident memory from the process table, checked
    against ki_structsize so a different kernel layout only drops them.
  • Dashboard: fan, CPU usage, top processes by CPU and by memory, direct
    memory panels (fan and CPU usage fill in once the exporter reports them).
  • make probe: development build with a /probe/<name> endpoint for
    working out undocumented kernel calls on hardware (not in releases).

Install: load ps5-exporter.elf with Payload Manager (add it to the autoload list) or send it to elfldr. Metrics on port 9100. Import ps5-exporter-grafana-dashboard.json in Grafana.

Verified on a CFI-7121, firmware 13.60: temperatures (17 sensors), fan speed, filesystems, direct memory, per-process CPU and memory, and the ShadowMountPlus storage and game list all work. Per-core CPU usage, SoC power and the lifetime counters are refused for payloads on this firmware; those metrics are left out and ps5_exporter_collector_success reports 0 for them rather than publishing guessed values.

v0.1.1

Choose a tag to compare

@Marice Marice released this 04 Oct 18:26

Added

  • Grafana dashboard (grafana/ps5-exporter.json).
  • ps5_info gets a firmware label from the kernel version; system_version
    (the spoofable user-space value) stays alongside it.

Install: load ps5-exporter.elf with Payload Manager (add it to the autoload list) or send it to elfldr. Metrics on port 9100. Import grafana/ps5-exporter.json in Grafana.

v0.1.0

Choose a tag to compare

@Marice Marice released this 04 Oct 17:57

Added

  • Prometheus exporter payload serving /metrics on port 9100.
  • Temperatures (CPU, SoC sensors), CPU frequency, uptime, boot time, model
    and system version, filesystems, process count.
  • ShadowMountPlus integration over its local JSON API: version, storage
    overview, game list with mounted/installed/source state.
  • /health and /quit endpoints, a start-up notification with the port,
    and the port configurable by argument or EXPORTER_PORT.

Install: load ps5-exporter.elf with Payload Manager (add it to the autoload list) or send it to elfldr. Metrics on port 9100.