Graph API
The Graph API exporter is a Meta-specific sink that writes monitoring data and health check results to Meta's internal backends.
Per-DataIdentifier scribe routing
graph_api accepts one scribe category per DataIdentifier, set via --sink-opts:
--sink-opts key | DataIdentifier | Used by |
|---|---|---|
scribe_category | (default, no identifier) | generic LOG writes |
node_scribe_category | NODE | slurm_job_monitor |
job_scribe_category | JOB | slurm_job_monitor |
statvfs_scribe_category | STATVFS | sacct_publish |
pure_scribe_category | PURE | sacct_publish |
sdiag_scribe_category | SDIAG | slurm_monitor (sdiag dual-publish) |
sdiag_scribe_category is the LOG-path target for the slurm_monitor collector's dual-publish; the METRIC-path ODS write is unaffected. If a collector emits DataIdentifier.SDIAG and sdiag_scribe_category is unset, graph_api._write_log raises AssertionError("scribe_category argument is missing") rather than silently dropping the row.
Adding a new scribe category (Meta-internal)
Writes to a new perfpipe category from gcm (or any non-www environment) require three gates to be open before scribe_logs returns OK:
- DMV allowlist — register the category for Graph API writes from your app_id. Without this, writes return
INVALID_CATEGORY. - PrivacyLib artifact + AllowList entry + Capella schema — generated by running
privacylib asset://scribe.category/<your_category>from a www checkout. Without this, writes return the catch-allERRORfrommapScribeWriteResultToResponseCode, and the writer-side reject reason surfaces asERROR_FILTERED_OUT_BY_PRIVACYLIBin thescribe_graph_api_failuresScuba dataset. - Scribe oncall / ScribeShell Activate — LogDevice shard/split mapping must be set; the Scuba dataset must be activated.
Full step-by-step is at Scribe Wiki: Allowlist your category. When debugging a failed write, the ScribeErrorWithAcks exception now surfaces the unique reject codes in its message so the gate that's still closed is identifiable from logs alone.