Appearance
Imports
Most teams already have some semantic or lineage assets. Keel can take them in so a model does not start from zero.
Available in v1.0
| What | How | Result |
|---|---|---|
| OpenLineage run events | POST /api/v1/lineage/openlineage (API key with admin:*, or a user with ?workspaceId=) | Dataset and column lineage (inputs, outputs, the column-lineage facet) in scope openlineage:{namespace}/{job}. FAIL and ABORT events change nothing. |
dbt manifest.json | POST …/lineage/dbt | Model dependencies as dataset-level lineage, mapped onto scanned tables (dbt:{project}); unmapped datasets are listed. |
| Glossary CSV / JSON | Glossary › ··· › Import or POST …/glossary:import | Terms (Draft), with counts and row errors. |
External datasets are matched to scanned tables by the last parts of their name (db.schema.table), narrowed by the namespace's host, port and database; anything unmatched stays external. Imports are audited.
Model imports: dbt, LookML, Cube
Bootstrap a model from what your BI layer already defines. Open Import from the model bar's model menu, or Import from dbt / LookML / Cube on the Change requests page, pick the format and upload the files or a zip of the project. Preview shows what each object would do; Import opens a change request.
| Format | Read | Reported, not guessed |
|---|---|---|
| dbt Semantic Layer (MetricFlow YAML + model SQL) | semantic models, entities → joins, dimensions, measures, simple / ratio / derived / cumulative metrics, config.meta.keel | other aggregations, conversion metrics, saved queries, Jinja SQL (imported verbatim, flagged) |
| LookML | views (sql_table_name, derived-table SQL), dimensions, dimension groups (grains), measures and filters, type: number measures as ratio / derived metrics, explore joins (roles from from:) | parameters, filter fields, Liquid, extends / refinements, access grants, datagroups, aggregate tables, cross-view field references |
| Cube (YAML) | cubes, dimensions, measures and filters, calculated measures as metrics, segments, hierarchies, joins | views, pre-aggregations, access policies, extends, JavaScript models, templated SQL |
- Every imported object is a proposal: origin
Imported, a confidence (lower when approximated) and thefile:lineit came from as evidence. - Tables bind to the model's scanned sources by schema and table name; a table that is not in the latest scan is imported without a source and reported.
- The import lands on its own branch,
keel/import-{format}-{id}, with a change request intomain. Objectsmainalready has identically change nothing. Objectsmainhas differently are kept as conflicts: when merging, choose per object whether to keepmain's version or take the imported one. Nothing onmainchanges without that decision. - The report lists every construct that was skipped or approximated, and every file that could not be read, with its line. Uploads: up to 10 MB (20 MB unzipped), text model files only.
- API:
POST …/models/{id}/imports:preview,POST …/models/{id}/imports(multipartformat+files; EditModels),GET …/models/{id}/imports. Imports are audited.
Data-quality imports: dbt tests, Great Expectations
On Data quality › Import dbt tests / GE suite, choose the source the checks describe and upload dbt schema YAML files or Great Expectations suites (JSON), or a zip. Each check that maps onto a scanned table and column becomes a suggested rule (origin Imported, with its file and line) in Suggested rules — nothing runs until a Steward accepts it.
| dbt | Great Expectations | Keel rule |
|---|---|---|
not_null, dbt_utils.not_null_proportion | expect_column_values_to_not_be_null | Not null |
unique, dbt_utils.unique_combination_of_columns | expect_column_values_to_be_unique, expect_compound_columns_to_be_unique | Unique |
accepted_values | expect_column_values_to_be_in_set | Accepted values |
relationships | — | Referential integrity |
dbt_utils.accepted_range, dbt_expectations.expect_column_values_to_be_between | expect_column_values_to_be_between | Range |
dbt_expectations.expect_column_values_to_match_regex | expect_column_values_to_match_regex | Pattern |
dbt_utils.recency | — | Freshness |
dbt_utils.expression_is_true, expect_table_row_count_to_be_between | expect_table_row_count_to_be_between / _to_equal | Custom SQL (read-only) |
dbt severity: warn (or a GE .warning suite) becomes a Warning rule, otherwise Critical. Checks that do not map (an unknown table or column, an unsupported test) are listed with their line; importing again refreshes undecided suggestions, and a check Keel already suggested from the scan is not proposed twice. API: POST /api/v1/workspaces/{ws}/quality/rules:import (multipart format = dbt or great_expectations, dataSourceId, files; Govern).