Skip to content

Add machine-readable tool metadata: tool-metadata.json and multiplex.json for all tools #653

Description

@atheurer

Problem

Crucible benchmarks have multiplex.json for parameter definitions (presets, validations), but tools have no equivalent metadata. Tool parameters, subtool declarations, and descriptions exist only as bash comments and getopt strings inside *-start scripts — not machine-readable.

This makes it impossible for automation (including AI agents) to discover:

  • What tools exist and what they do
  • Which tools have subtools (and what those subtools are)
  • What parameters each tool accepts and their valid values
  • Which tools/subtools produce CDM-indexed metrics vs raw file output only

Current state

File What it has What it's missing
rickshaw.json Tool name, start/stop scripts, endpoint whitelist/blacklist Description, params, subtools
workshop.json Build dependencies (packages, source tarballs) Everything semantic
*-start scripts Params as bash getopt longopts; subtool lists as bash comments Not machine-readable
multiplex.json Does not exist for tools (only benchmarks) Everything

Tools with subtools today

Discovered by reading bash scripts — this should be in metadata:

  • kernel → turbostat, perf, speed-select-util, trace-cmd, sysfs-trace (params: --subtools, --interval, --record-opts, --base-freq, --turbo-freq, --core-power, --trace-cmd-record-opts, --sysfs-trace-setup, --sysfs-trace-cleanup)
  • sysstat → mpstat, sar, iostat, pidstat (params: --subtools, --interval)
  • ethtool — no subtools (params: --interval, --interfaces)
  • forkstat — no subtools (params: --events)
  • ftrace — no subtools (params: --record-opts)
  • mlxreg — no subtools (params: --devices, --sensors, --interval)
  • nvidia — no subtools (params: --interval)
  • ovs — no subtools (params: --interval)
  • power — no subtools (params: --interval, --username, --password, --endpoints, --plugin)
  • procstat — no subtools (params: --files, --interval)
  • rt-trace-bpf — no subtools (params: --cpu-list)

Proposed changes

1. Add tool-metadata.json to each tool subproject

New file alongside rickshaw.json and workshop.json:

{
  "tool": "kernel",
  "description": "Linux kernel performance tools — CPU frequency, power, hardware counters, and tracing",
  "subtools": [
    {
      "name": "turbostat",
      "description": "CPU frequency, power, and thermal monitoring via MSR polling",
      "cdm_indexed": false,
      "output_files": ["turbostat-stdout.txt"]
    },
    {
      "name": "perf",
      "description": "Hardware performance counter sampling (IPC, cache misses, branch stats)",
      "cdm_indexed": false,
      "output_files": ["perf-stat-stdout.txt"]
    },
    {
      "name": "speed-select-util",
      "description": "Intel Speed Select Technology configuration and monitoring",
      "cdm_indexed": false,
      "output_files": ["settings.txt"]
    },
    {
      "name": "trace-cmd",
      "description": "Ftrace-based kernel event tracing",
      "cdm_indexed": false,
      "output_files": ["trace.dat"]
    },
    {
      "name": "sysfs-trace",
      "description": "Sysfs attribute polling for hardware-specific counters",
      "cdm_indexed": false,
      "output_files": []
    }
  ]
}

For tools without subtools:

{
  "tool": "procstat",
  "description": "Per-process and per-CPU interrupt and softirq statistics from /proc",
  "cdm_indexed": true,
  "cdm_sources": [
    {"source": "procstat", "types": ["interrupts-sec", "processed-sec"]}
  ]
}

The cdm_indexed and cdm_sources fields tell consumers which metrics will appear in CDM after post-processing, and which will only be available as raw files.

2. Add multiplex.json to each tool subproject

Same format as benchmark multiplex.json:

{
  "presets": {
    "basic": [
      {"arg": "subtools", "vals": ["turbostat"]},
      {"arg": "interval", "vals": ["10"]}
    ]
  },
  "validations": {
    "subtools": {
      "description": "comma-separated list of kernel subtools to run",
      "args": ["subtools"],
      "vals": "^(turbostat|perf|speed-select-util|trace-cmd|sysfs-trace)(,(turbostat|perf|speed-select-util|trace-cmd|sysfs-trace))*$"
    },
    "positive_integer": {
      "description": "a whole number greater than 0",
      "args": ["interval"],
      "vals": "[1-9][0-9]*"
    }
  }
}

3. Schema validation

Add JSON schemas for both new files under schema/ so they can be validated alongside existing rickshaw.json and workshop.json schemas.

Files to add/modify

Per tool subproject (11 tools):

  • Add tool-metadata.json
  • Add multiplex.json

Crucible core:

  • schema/tool-metadata.json — JSON schema for validation
  • schema/multiplex.json — JSON schema (may already exist for benchmarks)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions