Sifflet
Connect Sifflet; the Data quality module ingests its rules, runs and asset health, and verdicts can be written back.
Sifflet is a hosted data-observability service. The Sifflet tool (nistor-tool-sifflet, tool id sifflet) connects
Nistor to a Sifflet tenant, so that the monitors you already run appear beside your lineage, runs and incidents.
The package carries the Alpha classifier and its README states no other status (see the overview).
What needs an Enterprise module#
The pull from Sifflet is not in the open-source tool. The ingester that reads rules, rule runs and asset health, mirrors them as checks, and opens and closes Nistor incidents from them, is part of the Data quality module (Nistor Enterprise). So is the migration provider that proposes Nistor checks from Sifflet rules, and the action that records a verdict.
| Open source | Data quality module | |
|---|---|---|
| Create and test a Sifflet connection | yes | |
Store rules, runs and asset health in the tool_sifflet tables, and serve them under /api/v1/sifflet |
the tables and routes | the scheduled ingest that fills them |
Fetch one rule's run history on demand and archive it (POST /api/v1/sifflet/rules/{rule_id}/sync-mirror) |
yes | mirroring the runs as checks and reconciling incidents |
| Open and close Nistor incidents from Sifflet failures | yes | |
| Write a verdict back to Sifflet | the client call, off by default | the qualify action that triggers it |
Nothing in this repository starts a Sifflet rule run. The tool only reads from Sifflet, except for the verdict write-back below.
Create the connection#
Create a connection of type sifflet in the web shell (Connections, /admin/connections) or with
POST /api/v1/connections:
| Field | Required | Meaning |
|---|---|---|
base_url |
yes | The tenant's address, without the /api path: the address its web app opens at. |
| Secret | Required | Meaning |
|---|---|---|
api_token |
yes | A Sifflet API token (a JWT) that can read. A Viewer-role token is enough. Surrounding whitespace is stripped. |
write_api_token |
no | A token of a higher role (Editor or Admin) for the verdict write-back. |
The test sends one authenticated request, GET /api/v1/rules?page=0&itemsPerPage=1, and waits up to 8 seconds. It
answers healthy only when Sifflet returns the rules listing. Everything else is unhealthy, with the cause: a refused
token (401 or 403), a wrong address (404, or a reply that is not a Sifflet tenant), throttling (429), a certificate that
is not trusted, a host that does not resolve, or a timeout. The probe never answers degraded.
Where credentials are read today#
Today only the test reads the connection. The ingest, the rule reads and the write-back read these environment variables:
| Variable | Meaning |
|---|---|
SIFFLET_BASE_URL |
The tenant's address. |
SIFFLET_API_TOKEN |
The read token. |
SIFFLET_WRITE_API_TOKEN |
The write token. |
Set them on the backend and jobs roles. The reference Terraform root does it for you when you set sifflet_base_url: it
creates the Secret Manager secret sifflet-api-token-<env>, gives the backend and jobs accounts access to it, and sets
SIFFLET_BASE_URL and SIFFLET_API_TOKEN on both roles. You add the token yourself, so that it never appears in a
variable file or in the state:
gcloud secrets versions add sifflet-api-token-prod --data-file=<token-file>
An empty sifflet_base_url switches the integration off: no secret, no variable, no ingest. The root does not wire a
write token.
What the ingester stores#
With the Data quality module installed, the daily ingest fills five tables in the tool_sifflet schema: rules, the
datasets each rule watches, asset health, rule runs, and an ingest log. A dataset is matched to a graph node by its
Sifflet bigquery: address, which becomes a BigqueryTable node, so a failing monitor shows on the table it watches.
The tool is written for a BigQuery warehouse. The ingest also:
- re-checks every open Sifflet incident against the rule's current state, closes the ones that recovered, and flags
rules that stopped reporting (
SIFFLET_INCIDENT_SWEEP_ENABLED); - projects the owners that Sifflet assigns to an asset into the catalog's ownership tables
(
SIFFLET_OWNER_PROJECTION_ENABLED), which also needs the Catalog module.
The open-source routes add one estimate of their own. Sifflet runs its rules in its own Google Cloud project, so Nistor
sees only a lightweight read event for them, with no billed bytes. GET /api/v1/sifflet/cost-estimate multiplies the
number of reads by the median billed bytes of reads on the same tables and by the BigQuery on-demand price. It is
labelled an estimate. Nistor finds Sifflet's reads by the account that matches SIFFLET_BQ_PRINCIPAL_PATTERN.
Write verdicts back#
When a person qualifies a Sifflet-mirrored point in Nistor, as a real error or as acceptable, Nistor can send the verdict
to the incident in Sifflet so that its anomaly detection learns from it. This is off by default
(SIFFLET_WRITE_ENABLED=false).
- It needs an Editor or Admin token, in
SIFFLET_WRITE_API_TOKENor, if that is empty, inSIFFLET_API_TOKEN. A Viewer token is refused by Sifflet's write endpoints. - It calls
POST /api/v1/incidents/{issue}/qualificationwith one ofFALSE_POSITIVE,EXPECTED,FIXEDorQUALIFIED. - It never undoes the Nistor verdict. If the call fails, the verdict and the closing of the Nistor incident stand.
- The code notes that the exact path and body have not been confirmed against a tenant with a write-capable token. Test it on a non-production tenant first.
Permissions on the Sifflet side#
| Use | Sifflet token role |
|---|---|
| Test the connection, ingest, read run history | Viewer |
| Write verdicts back | Editor or Admin |
In Nistor, reading Sifflet data needs dataquality:view, and the on-demand actions (sync-mirror, reconcile-runs,
compute-metric-values) need dataquality:write.
Settings#
| Variable | Default | Meaning |
|---|---|---|
SIFFLET_BASE_URL, SIFFLET_API_TOKEN |
empty | Empty means the ingest is off. |
SIFFLET_WRITE_ENABLED |
false |
Send verdicts to Sifflet. |
SIFFLET_WRITE_API_TOKEN |
empty | Write token; falls back to SIFFLET_API_TOKEN. |
SIFFLET_BQ_PRINCIPAL_PATTERN |
sa-sifflet@% |
SQL LIKE pattern for the account that runs Sifflet's BigQuery queries. Empty turns the cost estimate off. |
SIFFLET_PAGE_SIZE |
100 |
Page size of Sifflet list calls. |
SIFFLET_HTTP_TIMEOUT_S |
30 |
Timeout of each Sifflet call. |
SIFFLET_INCIDENT_SWEEP_ENABLED |
true |
Re-check open incidents each ingest. |
SIFFLET_INCIDENT_STALE_AFTER_DAYS |
14 |
A failing rule whose last run is older than this is "dormant": its incident is flagged and kept open. |
SIFFLET_INCIDENT_AUTOCLOSE_DORMANT_DAYS |
0 |
Close dormant incidents older than this many days. 0 never closes them. |
SIFFLET_INCIDENT_SWEEP_LIVE_VERIFY_CAP |
25 |
The most live run-history calls one sweep makes. |
SIFFLET_OWNER_PROJECTION_ENABLED |
true |
Project Sifflet owners into the ownership graph. |
NISTOR_TOOL_LIMIT_SIFFLET |
24 |
Concurrent Sifflet requests per process. |