Skip to main content

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 keyDataIdentifierUsed by
scribe_category(default, no identifier)generic LOG writes
node_scribe_categoryNODEslurm_job_monitor
job_scribe_categoryJOBslurm_job_monitor
statvfs_scribe_categorySTATVFSsacct_publish
pure_scribe_categoryPUREsacct_publish
sdiag_scribe_categorySDIAGslurm_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:

  1. DMV allowlist — register the category for Graph API writes from your app_id. Without this, writes return INVALID_CATEGORY.
  2. 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-all ERROR from mapScribeWriteResultToResponseCode, and the writer-side reject reason surfaces as ERROR_FILTERED_OUT_BY_PRIVACYLIB in the scribe_graph_api_failures Scuba dataset.
  3. 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.