bf2343b7e4
Integration Tests - MySQL + Elasticsearch / Detect Changes (push) Has been cancelled
Integration Tests - MySQL + Elasticsearch / integration-tests-mysql-elasticsearch (push) Has been cancelled
Integration Tests - PostgreSQL + Elasticsearch + Redis / Detect Changes (push) Has been cancelled
Integration Tests - PostgreSQL + Elasticsearch + Redis / integration-tests-postgres-elasticsearch-redis (push) Has been cancelled
Integration Tests - PostgreSQL + OpenSearch / Detect Changes (push) Has been cancelled
Integration Tests - PostgreSQL + OpenSearch / integration-tests-postgres-opensearch (push) Has been cancelled
Java Checkstyle / java-checkstyle (push) Has been cancelled
Maven Collate Tests / maven-collate-ci (push) Has been cancelled
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests-status (push) Has been cancelled
Publish Package to Maven Central Repository / publish-maven-packages (push) Has been cancelled
OpenMetadata Service Unit Tests / Detect Changes (push) Has been cancelled
OpenMetadata Service Unit Tests / openmetadata-service-unit-tests (push) Has been cancelled
OpenMetadata Service Unit Tests / k8s_operator-unit-tests (push) Has been cancelled
3.7 KiB
3.7 KiB
OpenMetadata Connector Standards
Architecture: Schema-First
OpenMetadata connectors follow a schema-first architecture. One JSON Schema definition cascades through 6 layers:
JSON Schema (single source of truth)
├── Python Pydantic models (make generate)
├── Java models (mvn install -pl openmetadata-spec)
├── TypeScript types (yarn parse-schema)
├── UI config forms (RJSF auto-renders from schema)
├── API request validation (server uses Java models)
└── Test fixtures (tests import Pydantic models)
Never hand-write config classes. Define the JSON Schema; everything else is generated.
Connector Anatomy
Every connector lives at ingestion/src/metadata/ingestion/source/{service_type}/{name}/ and has:
| File | Purpose | Required |
|---|---|---|
__init__.py |
Module marker | Always |
connection.py |
Create and test connections | Always |
metadata.py |
Extract metadata from the source | Always |
service_spec.py |
Register connector with the framework | Always |
client.py |
REST/SDK client wrapper | Non-database |
queries.py |
SQL query templates | Database |
lineage.py |
Lineage extraction | If lineage capability |
usage.py |
Usage extraction | If usage capability |
query_parser.py |
Query log parsing | If lineage or usage |
CONNECTOR_CONTEXT.md |
AI implementation brief | Generated by scaffold |
Service Types
| Service Type | Base Class | Reference |
|---|---|---|
database |
CommonDbSourceService |
mysql/ |
dashboard |
DashboardServiceSource |
metabase/ |
pipeline |
PipelineServiceSource |
airflow/ |
messaging |
MessagingServiceSource |
kafka/ |
mlmodel |
MlModelServiceSource |
mlflow/ |
storage |
StorageServiceSource |
s3/ |
search |
SearchServiceSource |
elasticsearch/ |
api |
ApiServiceSource |
rest/ |
Connection Types (Database Only)
| Type | Base Class | Pattern |
|---|---|---|
sqlalchemy |
BaseConnection[Config, Engine] |
SQLAlchemy dialect + engine |
rest_api |
get_connection() / test_connection() |
Custom REST client |
sdk_client |
get_connection() / test_connection() |
Vendor SDK wrapper |
Non-database connectors always use get_connection() / test_connection() functions.
ServiceSpec System
Every connector declares a ServiceSpec in service_spec.py:
- Database:
DefaultDatabaseSpec(metadata_source_class=..., connection_class=..., lineage_source_class=..., usage_source_class=...) - All others:
BaseSpec(metadata_source_class=...)
The framework resolves specs dynamically via: metadata.ingestion.source.{service_type}.{name}.service_spec.ServiceSpec
Registration Checklist
To register a new connector, modify these files:
- Service enum:
openmetadata-spec/.../entity/services/{serviceType}Service.json— add type to enum + connectiononeOf - Test connection:
openmetadata-service/.../testConnections/{serviceType}/{name}.json— create file - UI utils:
openmetadata-ui/.../utils/{ServiceType}ServiceUtils.tsx— import schema + add switch case - Localization:
openmetadata-ui/.../locale/languages/— add i18n display name keys
Code Generation Commands
source env/bin/activate
make generate # Python Pydantic models
mvn clean install -pl openmetadata-spec # Java models
cd openmetadata-ui/src/main/resources/ui && yarn parse-schema # UI schemas
make py_format # Format Python
mvn spotless:apply # Format Java