Skip to main content

Integrate with Atlan

Status: shipped (outbound) — issue #415. Measured Cloud pushes validation results to Atlan as a quality signal. Inbound asset discovery (walking Atlan to JIT-create Measured Cloud assets) is a planned follow-up; today the connector is outbound-only.

Measured Cloud ships a first-party connector for Atlan that pushes every ValidationResult to the matching Atlan table asset:

  • sets Atlan's built-in assetDqStatus attribute (Passed / Failed) — the coloured quality pill the asset page renders, and
  • writes a DQ pass-rate custom-metadata attribute (plus pass/total counts, the validation 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 qualifiedName at its connection (default/<connector>/<epoch>); Measured Cloud can't derive the epoch, so you supply the connection qualifiedName per asset (see below).

Configure the integration​

Create the catalog_integrations row as a super admin or technical admin, through the 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 Measured 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. Measured Cloud appends the asset's dotted name (db.schema.table → db/schema/table) to build the full asset qualifiedName.
  • config["catalog"]["atlan_cm_set"] — (optional) the custom-metadata set name the pass-rate attribute lands under. Defaults to Measured Cloud.

An asset without atlan_connection is skipped (a structured emit_to_catalog_atlan_no_connection log line lands so you can see why) — Measured 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:

  • assetDqStatus flips to Passed or Failed (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 (the name of the validation that ran; the attribute keeps its old name), and dq_last_run.

Re-emits against the same qualifiedName overwrite in place — Atlan resolves the GUID server-side, so Measured 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.