OpenMetadata
Core pluginmarmotdata/openmetadata
Import tables, topics, dashboards, pipelines, models, glossary and lineage from an OpenMetadata instance
The OpenMetadata plugin imports an entire OpenMetadata instance in one run: tables, views, stored procedures, topics, buckets, dashboards, charts, pipelines, models, search indices, API endpoints, drive files and spreadsheets, the business glossary, and the lineage between them.
OpenMetadata is a catalog, so everything in it describes something that lives somewhere else. This plugin catalogues each entity as the technology it belongs to rather than as an OpenMetadata thing: a table under a Postgres service becomes a PostgreSQL asset in Marmot, addressed exactly as Marmot's own PostgreSQL plugin would address it.
Supported OpenMetadata Versions
OpenMetadata 1.4 or newer. The plugin negotiates the field list with the server on the first call to each endpoint: fields the server does not know are dropped from later requests, so one plugin binary works across every version in that range. Entity kinds a server predates (drives, API collections, and so on) are skipped without failing the run.
Getting a Token
The plugin authenticates as a bot or as a user, with a JWT.
For a bot, open Settings → Bots in OpenMetadata, pick a bot such as ingestion-bot, and copy its token. For a user, open Settings → Members, pick the user, and create a personal access token. The token needs read access to the entities you want to import.
Cutting Over from OpenMetadata
Moving off OpenMetadata is not a single switch, so this plugin is built to run on a schedule for as long as the move takes. Each run brings across whatever changed in OpenMetadata; re-running is safe, and assets that have not changed are left alone.
Anything written in Marmot survives every re-sync. A description edited in Marmot is stored separately from the one the run imported, so the next sync refreshes the imported side and never overwrites the edit. The same holds for tags, owners and glossary terms added in Marmot.
When you are ready to catalogue a system directly, add its own pipeline (for example the PostgreSQL plugin against the database OpenMetadata was describing). Imported assets and native ones share an MRN, so the native run takes over the assets that already exist instead of creating a second copy. Nothing needs to be deleted or re-pointed.
When you are done, stop scheduling the run. The imported assets stay exactly as they are. Do not use marmot ingest --destroy: it deletes every asset the pipeline ever created, including ones another pipeline has since taken over.
Running Alongside Native Plugins
By default an imported asset lands on the same MRN the technology's native Marmot plugin would use, so the two runs contribute to one asset instead of creating two. A Postgres table becomes mrn://table/postgresql/orders whether Marmot read it from OpenMetadata or from the database itself.
This means names drop the levels the native plugin does not use. Marmot's own plugins for Postgres, MySQL, BigQuery, MongoDB, ClickHouse, Glue and Iceberg all name a table by its bare name, so public.orders and staging.orders resolve to one asset, as do two OpenMetadata services holding the same table name. Set naming: qualified to keep them apart instead, at the cost of no longer merging with native runs.
Technologies Marmot has no plugin for yet, such as Snowflake or Looker, are imported under their own provider name. Nothing is invented: an entity is only imported when Marmot already has an asset type that means the same thing.
Container Prefixes and Drives
Object storage comes across as the bucket alone. OpenMetadata models the prefixes inside a bucket as containers of their own, but Marmot's S3, GCS and Azure Blob plugins catalogue the bucket and nothing below it, so an imported prefix would sit in the catalog forever without a native run ever updating it. Set include_container_prefixes: true to import the hierarchy anyway, worth doing when nothing else is going to catalogue that bucket.
Drives are different: a drive really is a tree of folders and Marmot's GoogleDrive plugin catalogues it as one, so folders come across in full.
In the UI
Point-and-click, no config file needed.
- 1 Open
Runs→Create Pipeline - 2 Pick OpenMetadata from the plugin list.
- 3 Fill in the wizard, set a schedule, save.
With the CLI
Save a YAML config, then run marmot ingest.
name: my-openmetadata-pipeline
runs:
- openmetadata:
host: "<host>"
jwt_token: "***"marmot ingest -c ingest.yaml Not using plugins? Other ways to populate Marmot
Configuration
37 top-level fields.
tags multiselect Tags to apply to discovered assets
external_links object[] External links to show on all assets
name string Display name for the link
icon string Icon identifier for the link
url string URL to the external resource
filter object Filter discovered assets by name (regex)
include multiselect Include patterns for resource names (regex)
exclude multiselect Exclude patterns for resource names (regex)
host string OpenMetadata server URL, for example https://openmetadata.company.com
jwt_token password Bot token or personal access token from OpenMetadata
timeout_seconds int Per-request timeout
60 insecure_skip_verify bool Skip TLS certificate verification
false services multiselect Only import these OpenMetadata services (all if empty)
exclude_services multiselect OpenMetadata services to skip
service_types multiselect Only import these OpenMetadata service types, for example Postgres or Kafka (all if empty)
exclude_service_types multiselect OpenMetadata service types to skip
include_deleted bool Import entities OpenMetadata has soft deleted
false include_tables bool Import databases, tables and views
true include_stored_procedures bool Import stored procedures as functions
true include_topics bool Import messaging topics
true include_containers bool Import object storage buckets and containers
true include_container_prefixes bool Also import the prefixes and folders inside a storage container. Marmot's own object storage plugins catalogue only the container itself
false include_drives bool Import drive directories, files, spreadsheets and worksheets
true include_dashboards bool Import dashboards, charts and dashboard data models
true include_pipelines bool Import orchestration pipelines
true include_tasks bool Import the individual tasks of each pipeline
true include_run_history bool Import recent pipeline executions as run history
true run_history_days int How many days of pipeline executions to import
7 run_history_limit int Maximum executions to import per pipeline
50 include_mlmodels bool Import machine learning models
true include_search_indexes bool Import search indices
true include_apis bool Import API collections and endpoints
true include_columns bool Import column, field and feature definitions
true include_lineage bool Import lineage between imported assets
true include_glossary bool Import the business glossary as Marmot glossary terms, and assign them to the assets they are curated onto
true naming select native names assets the way Marmot's own plugin for each technology names them, so a later native run merges with the imported assets. qualified uses the full OpenMetadata path, which keeps two services of the same technology apart
native tags_from_openmetadata bool Copy OpenMetadata classification tags onto assets
true glossary_terms_as_tags bool Also copy assigned glossary terms onto assets as tags. They are imported as glossary terms either way
false link_to_openmetadata bool Add a link back to the entity in OpenMetadata on every asset
true source_priority int Priority of OpenMetadata against other sources of the same asset. Lower wins
2 page_size int Entities per API request
250 concurrency int Parallel lineage requests
8 Assets Emitted
Metadata fields this plugin attaches to each discovered asset.
Open Metadata
OpenMetadataFieldsOpenMetadataFields records where in OpenMetadata an asset came from. It is set on every asset this plugin creates.
openmetadata.id stringOpenMetadata entity id
openmetadata.fqn stringFully qualified name of the entity in OpenMetadata
openmetadata.service stringOpenMetadata service the entity belongs to
openmetadata.service_type stringOpenMetadata service type, for example Postgres or Looker
openmetadata.updated_at stringWhen the entity last changed in OpenMetadata
openmetadata.url stringAddress of the entity in the OpenMetadata UI
Curation
CurationFieldsCurationFields represents the curated context OpenMetadata holds that a Marmot ingestion run cannot yet create as first class objects, so it travels with the asset instead.
owners string[]Users or teams that own the entity in OpenMetadata
domains string[]OpenMetadata domains the entity belongs to
data_products string[]OpenMetadata data products the entity belongs to
glossary_terms string[]Glossary terms assigned to the entity
Table
TableFieldsTableFields represents metadata on tables, views and stored procedures. The field names match Marmot's own database plugins so a merged asset reads the same whichever run contributed it.
database stringDatabase name
schema stringSchema name
table_name stringObject name
object_type stringOpenMetadata table type, for example Regular, View or MaterializedView
column_count intNumber of columns
row_count intRow count from the OpenMetadata profiler
size intSize in bytes from the OpenMetadata profiler
weekly_query_count intQueries against the table in the last week
primary_key string[]Columns forming the primary key
procedure_type stringStored procedure type
Topic
TopicFieldsTopicFields represents metadata on messaging topics.
partitions intNumber of partitions
replication_factor intReplication factor
retention_size intRetention size in bytes
retention_ms intRetention time in milliseconds
max_message_size intMaximum message size in bytes
cleanup_policies string[]Topic cleanup policies
schema_type stringMessage schema type, for example Avro or JSON
Container
ContainerFieldsContainerFields represents metadata on object storage containers.
bucket stringTop level container the object lives in
prefix stringPath prefix within the bucket
size intSize in bytes
object_count intNumber of objects
file_formats string[]File formats found in the container
partitioned boolWhether the container is partitioned
Dashboard
DashboardFieldsDashboardFields represents metadata on dashboards, charts and dashboard data models.
dashboard_type stringDashboard type reported by the BI tool
chart_type stringChart type reported by the BI tool
data_model_type stringData model type reported by the BI tool
project stringProject or workspace the dashboard belongs to
chart_count intNumber of charts on the dashboard
Pipeline
PipelineFieldsPipelineFields represents metadata on pipelines and their tasks.
schedule_interval stringSchedule the pipeline runs on
concurrency intMaximum concurrent runs
task_count intNumber of tasks in the pipeline
pipeline stringPipeline a task belongs to
task_type stringTask type, for example the Airflow operator
downstream_tasks string[]Tasks that run after this one
ML Model
MLModelFieldsMLModelFields represents metadata on machine learning models.
algorithm stringAlgorithm the model uses
target stringColumn the model predicts
server stringAddress the model is served from
feature_count intNumber of features
storage stringWhere the model artefact is stored
image_repository stringRepository holding the model image
Search Index
SearchIndexFieldsSearchIndexFields represents metadata on search indices.
index_type stringIndex type
field_count intNumber of fields in the index
API
APIFieldsAPIFields represents metadata on API collections and endpoints.
collection stringAPI collection the endpoint belongs to
method stringHTTP method
endpoint_url stringURL of the endpoint
path stringRequest path
Drive
DriveFieldsDriveFields represents metadata on drive directories, files, spreadsheets and worksheets.
path stringPath within the drive
directory_type stringDrive directory type
file_type stringDrive file type, for example Document or Spreadsheet
file_extension stringDrive file extension
mime_type stringDrive file MIME type
file_version stringDrive file version
checksum stringDrive file checksum
shared boolWhether the drive directory or file is shared
spreadsheet stringSpreadsheet a worksheet belongs to