Integrate with Atlan
Status: shipped (outbound) — issue #415. DQ Cloud pushes validation results to Atlan as a quality signal. Inbound asset discovery (walking Atlan to JIT-create DQ Cloud assets) is a planned follow-up; today the connector is outbound-only.
DQ Cloud ships a first-party connector for Atlan
that pushes every ValidationResult to the matching Atlan table asset:
- sets Atlan's built-in
assetDqStatusattribute (Passed/Failed) — the coloured quality pill the asset page renders, and - writes a DQ pass-rate custom-metadata attribute (plus pass/total counts, the suite name, and the last-run timestamp) under a named custom-metadata set.
The connector talks to Atlan's metadata API directly over HTTP — no
pyatlan SDK dependency in the worker image.
Prerequisites
- An Atlan instance and its base URL (e.g.
https://tenant.atlan.com), reachable from the worker process. - An API token (Atlan → Admin → API tokens) with permission to update entities and custom metadata.
- The connection qualifiedName for the assets you want stamped.
Atlan roots every asset's
qualifiedNameat its connection (default/<connector>/<epoch>); DQ Cloud can't derive the epoch, so you supply the connection qualifiedName per asset (see below).
Configure the integration
Create the catalog_integrations row through the org-admin settings
API (or the Settings → Catalog integrations page):
curl -X POST "$BASE_URL/api/v1/organizations/$ORG_ID/catalog-integrations" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"kind": "atlan",
"endpoint": "https://tenant.atlan.com",
"auth_token": "<atlan-api-token>"
}'
The auth token is AES-256-GCM-encrypted under the org's DEK before it hits Postgres; the API never returns it back. The endpoint goes through the same SSRF guard as the other catalog connectors.
Map a DQ Cloud asset to an Atlan asset
For each asset you want pushed, set the Atlan connection qualifiedName on the asset's catalog config:
config["catalog"]["atlan_connection"]— the connection qualifiedName, e.g.default/postgres/1700000000. DQ Cloud appends the asset's dotted name (db.schema.table→db/schema/table) to build the full assetqualifiedName.config["catalog"]["atlan_cm_set"]— (optional) the custom-metadata set name the pass-rate attribute lands under. Defaults toDQ Cloud.
An asset without atlan_connection is skipped (a structured
emit_to_catalog_atlan_no_connection log line lands so you can see
why) — DQ Cloud won't invent a qualifiedName it can't verify.
What it looks like in Atlan
After every ValidationResult commit, the emit_to_catalog ARQ job
upserts the table entity via POST /api/meta/entity/bulk:
assetDqStatusflips toPassedorFailed(the pill on the asset page),- the named custom-metadata set gets
dq_pass_rate(0–100),dq_passed,dq_total,dq_status,dq_suite, anddq_last_run.
Re-emits against the same qualifiedName overwrite in place — Atlan
resolves the GUID server-side, so DQ Cloud never duplicates the asset.
Verify
- In the Settings → Catalog integrations page, the Atlan row shows Enabled and (after a run) a recent quality push.
- On the Atlan asset, the quality pill reflects the most recent run and the custom-metadata panel shows the pass rate.