feat: Added support for OpenLineage integration#5884
Conversation
|
|
||
| ## Lineage Visualization | ||
|
|
||
| Use [Marquez](https://marquezproject.ai/) to visualize your Feast lineage: |
There was a problem hiding this comment.
oh this is a weird name for openlineage's visualization but this is the name of it. leaving a comment for future
4eef1b9 to
73dafb6
Compare
d87c190 to
b743c1e
Compare
b743c1e to
e1ddd6b
Compare
f5640a8 to
ce3ec64
Compare
b51e87a to
40a8559
Compare
e350360 to
29194d7
Compare
| if progress_ctx: | ||
| progress_ctx.cleanup() | ||
|
|
||
| # Emit OpenLineage events for applied objects | ||
| self._emit_openlineage_apply_diffs(registry_diff) | ||
|
|
||
| def _emit_openlineage_apply_diffs(self, registry_diff: RegistryDiff): | ||
| """Emit OpenLineage events for objects applied via diffs.""" | ||
| if self._openlineage_emitter is None: | ||
| return | ||
|
|
||
| # Collect all objects that were added or updated | ||
| objects: List[Any] = [] | ||
| for feast_object_diff in registry_diff.feast_object_diffs: | ||
| if feast_object_diff.new_feast_object is not None: | ||
| objects.append(feast_object_diff.new_feast_object) | ||
|
|
||
| if objects: | ||
| self._emit_openlineage_apply(objects) | ||
|
|
There was a problem hiding this comment.
🟡 OpenLineage apply events emitted even when _apply_diffs fails
FeatureStore._apply_diffs() emits OpenLineage apply events unconditionally after the try/finally block.
- Actual: If
infra_diff.update(...),apply_diff_to_registry(...), orupdate_infra(...)raises, the exception propagates but_emit_openlineage_apply_diffs(registry_diff)still runs, emitting lineage for objects that were not successfully applied. - Expected: Apply lineage should only be emitted after a successful apply/commit, or at least be gated on success.
Click to expand
In sdk/python/feast/feature_store.py:859-905, the OpenLineage emission is outside the try and will run even on failure:
try:
infra_diff.update(...)
apply_diff_to_registry(...)
self._registry.update_infra(..., commit=True)
finally:
...
# always runs, even if the try-block raised
self._emit_openlineage_apply_diffs(registry_diff)Impact: Produces incorrect lineage (false positives) in OpenLineage/Marquez, which can mislead debugging, auditing, and governance workflows.
(Refers to lines 859-905)
Recommendation: Move _emit_openlineage_apply_diffs(...) into the success path (after commit) or guard it with a success flag set only when the apply/commit completes without exception.
Was this helpful? React with 👍 or 👎 to provide feedback.
| def to_openlineage_config(self): | ||
| """Convert to feast.openlineage.OpenLineageConfig.""" | ||
| from feast.openlineage.config import OpenLineageConfig as OLConfig | ||
|
|
||
| return OLConfig( | ||
| enabled=self.enabled, | ||
| transport_type=self.transport_type, | ||
| transport_url=self.transport_url, | ||
| transport_endpoint=self.transport_endpoint, | ||
| api_key=self.api_key, | ||
| namespace=self.namespace, | ||
| producer=self.producer, | ||
| emit_on_apply=self.emit_on_apply, | ||
| emit_on_materialize=self.emit_on_materialize, | ||
| ) |
There was a problem hiding this comment.
🚩 additional_config field lost during OpenLineageConfig conversion
The OpenLineageConfig dataclass (in openlineage/config.py) defines an additional_config: Dict[str, Any] field for transport-specific settings like Kafka bootstrap servers. However, the OpenLineageConfig pydantic model (in repo_config.py) doesn't define this field, and to_openlineage_config() doesn't pass it during conversion.
This means users cannot specify additional_config in feature_store.yaml, and any programmatically-set additional_config would be lost during conversion. If additional_config is only meant for programmatic use (not YAML config), this is fine. Otherwise, the pydantic model should include this field.
See sdk/python/feast/repo_config.py:236-250 (conversion) and sdk/python/feast/openlineage/config.py:51 (field definition).
Was this helpful? React with 👍 or 👎 to provide feedback.
| progress_ctx.cleanup() | ||
|
|
||
| # Emit OpenLineage events for applied objects | ||
| self._emit_openlineage_apply_diffs(registry_diff) |
There was a problem hiding this comment.
we should only emit if it's successful, right? here we could have an exception and still emit a lineage event
There was a problem hiding this comment.
yes, and it's not emitting if apply failed. _emit_openlineage_apply_diffs() only executes if the entire try block completes successfully without raising an exception. I think devin is confused with try/finally code block here.
348187d to
e8b524b
Compare
e8b524b to
b7fd6b5
Compare
Signed-off-by: ntkathole <nikhilkathole2683@gmail.com>
Signed-off-by: ntkathole <nikhilkathole2683@gmail.com>
Signed-off-by: ntkathole <nikhilkathole2683@gmail.com>
Signed-off-by: ntkathole <nikhilkathole2683@gmail.com>
Co-authored-by: Francisco Javier Arceo <arceofrancisco@gmail.com>
026da68 to
01d69a1
Compare
* feat: Added support for OpenLineage integration Signed-off-by: ntkathole <nikhilkathole2683@gmail.com> * feat: Added openlineage in requirements Signed-off-by: ntkathole <nikhilkathole2683@gmail.com> * feat: Keep event type as complete instead of other Signed-off-by: ntkathole <nikhilkathole2683@gmail.com> * feat: Added blog post for OpenLineage integration Signed-off-by: ntkathole <nikhilkathole2683@gmail.com> * Update docs/reference/openlineage.md Co-authored-by: Francisco Javier Arceo <arceofrancisco@gmail.com> --------- Signed-off-by: ntkathole <nikhilkathole2683@gmail.com> Co-authored-by: Francisco Javier Arceo <arceofrancisco@gmail.com> Signed-off-by: yassinnouh21 <yassinnouh21@gmail.com>
* feat: Added support for OpenLineage integration Signed-off-by: ntkathole <nikhilkathole2683@gmail.com> * feat: Added openlineage in requirements Signed-off-by: ntkathole <nikhilkathole2683@gmail.com> * feat: Keep event type as complete instead of other Signed-off-by: ntkathole <nikhilkathole2683@gmail.com> * feat: Added blog post for OpenLineage integration Signed-off-by: ntkathole <nikhilkathole2683@gmail.com> * Update docs/reference/openlineage.md Co-authored-by: Francisco Javier Arceo <arceofrancisco@gmail.com> --------- Signed-off-by: ntkathole <nikhilkathole2683@gmail.com> Co-authored-by: Francisco Javier Arceo <arceofrancisco@gmail.com> Signed-off-by: yassinnouh21 <yassinnouh21@gmail.com>
# [0.60.0](v0.59.0...v0.60.0) (2026-02-17) ### Bug Fixes * Added a flag to correctly download the go binaries ([0f77135](0f77135)) * Adds mapping of date Trino's type into string Feast's type ([531e839](531e839)) * **ci:** Use uv run for pytest in master_only benchmark step ([#5957](#5957)) ([5096010](5096010)) * Disable materialized odfvs for historical retrieval ([#5880](#5880)) ([739d28a](739d28a)) * Fix linting and formatting issues ([#5907](#5907)) ([42ca14a](42ca14a)) * Make timestamp field handling compatible with Athena V3 ([#5936](#5936)) ([e2bad34](e2bad34)) * Support pgvector under non-default schema ([#5970](#5970)) ([c636cd4](c636cd4)) * unit tests not running on main branch ([#5909](#5909)) ([62fe664](62fe664)) * Update java dep which blocking release ([#5903](#5903)) ([a5b8186](a5b8186)) * Update the dockerfile with golang 1.24.12. ([#5918](#5918)) ([be1b522](be1b522)) * Use context.Background() in client constructors ([#5897](#5897)) ([984f93a](984f93a)) ### Features * Add blog post for PyTorch ecosystem announcement ([#5906](#5906)) ([d2eb629](d2eb629)) * Add blog post on Feast dbt integration ([#5915](#5915)) ([b3c8138](b3c8138)) * Add DynamoDB in-place list update support for array-based features ([#5916](#5916)) ([aa5973f](aa5973f)) * Add HTTP connection pooling for remote online store client ([#5895](#5895)) ([e022bf8](e022bf8)) * Add integration tests for dbt import ([#5899](#5899)) ([a444692](a444692)) * Add lazy initialization and feature service caching ([#5924](#5924)) ([b37b7d0](b37b7d0)) * Add multiple entity support to dbt integration ([#5901](#5901)) ([05a4fb5](05a4fb5)), closes [#5872](#5872) * Add PostgreSQL online store support for Go feature server ([#5963](#5963)) ([b8c6f3d](b8c6f3d)) * Add publish docker image of Go feature server. ([#5923](#5923)) ([759d8c6](759d8c6)) * Add Set as feature type ([#5888](#5888)) ([52458fc](52458fc)) * Added online server worker config support in operator ([#5926](#5926)) ([193c72a](193c72a)) * Added support for OpenLineage integration ([#5884](#5884)) ([df70d8d](df70d8d)) * Adjust ray offline store to support abfs(s) ADLS Azure Storage ([#5911](#5911)) ([d6c0b2d](d6c0b2d)) * Batch_engine config injection in feature_store.yaml through operator ([#5938](#5938)) ([455d56c](455d56c)) * Consolidate Python packaging - remove setup.py/setup.cfg, standardize on pyproject.toml and uv ([16696b8](16696b8)) * **go:** Add MySQL registry store support for Go feature server ([#5933](#5933)) ([19f9bb8](19f9bb8)) * Improve local dev experience with file-aware hooks and auto parallelization ([#5956](#5956)) ([839b79e](839b79e)) * Modernize precommit hooks and optimize test performance ([#5929](#5929)) ([ea7d4fa](ea7d4fa)) * Optimize container infrastructure for production ([#5881](#5881)) ([5ebdac8](5ebdac8)) * Optimize DynamoDB online store for improved latency ([#5889](#5889)) ([fcc8274](fcc8274))
# [0.60.0](feast-dev/feast@v0.59.0...v0.60.0) (2026-02-17) ### Bug Fixes * Added a flag to correctly download the go binaries ([0f77135](feast-dev@0f77135)) * Adds mapping of date Trino's type into string Feast's type ([531e839](feast-dev@531e839)) * **ci:** Use uv run for pytest in master_only benchmark step ([feast-dev#5957](feast-dev#5957)) ([5096010](feast-dev@5096010)) * Disable materialized odfvs for historical retrieval ([feast-dev#5880](feast-dev#5880)) ([739d28a](feast-dev@739d28a)) * Fix linting and formatting issues ([feast-dev#5907](feast-dev#5907)) ([42ca14a](feast-dev@42ca14a)) * Make timestamp field handling compatible with Athena V3 ([feast-dev#5936](feast-dev#5936)) ([e2bad34](feast-dev@e2bad34)) * Support pgvector under non-default schema ([feast-dev#5970](feast-dev#5970)) ([c636cd4](feast-dev@c636cd4)) * unit tests not running on main branch ([feast-dev#5909](feast-dev#5909)) ([62fe664](feast-dev@62fe664)) * Update java dep which blocking release ([feast-dev#5903](feast-dev#5903)) ([a5b8186](feast-dev@a5b8186)) * Update the dockerfile with golang 1.24.12. ([feast-dev#5918](feast-dev#5918)) ([be1b522](feast-dev@be1b522)) * Use context.Background() in client constructors ([feast-dev#5897](feast-dev#5897)) ([984f93a](feast-dev@984f93a)) ### Features * Add blog post for PyTorch ecosystem announcement ([feast-dev#5906](feast-dev#5906)) ([d2eb629](feast-dev@d2eb629)) * Add blog post on Feast dbt integration ([feast-dev#5915](feast-dev#5915)) ([b3c8138](feast-dev@b3c8138)) * Add DynamoDB in-place list update support for array-based features ([feast-dev#5916](feast-dev#5916)) ([aa5973f](feast-dev@aa5973f)) * Add HTTP connection pooling for remote online store client ([feast-dev#5895](feast-dev#5895)) ([e022bf8](feast-dev@e022bf8)) * Add integration tests for dbt import ([feast-dev#5899](feast-dev#5899)) ([a444692](feast-dev@a444692)) * Add lazy initialization and feature service caching ([feast-dev#5924](feast-dev#5924)) ([b37b7d0](feast-dev@b37b7d0)) * Add multiple entity support to dbt integration ([feast-dev#5901](feast-dev#5901)) ([05a4fb5](feast-dev@05a4fb5)), closes [feast-dev#5872](feast-dev#5872) * Add PostgreSQL online store support for Go feature server ([feast-dev#5963](feast-dev#5963)) ([b8c6f3d](feast-dev@b8c6f3d)) * Add publish docker image of Go feature server. ([feast-dev#5923](feast-dev#5923)) ([759d8c6](feast-dev@759d8c6)) * Add Set as feature type ([feast-dev#5888](feast-dev#5888)) ([52458fc](feast-dev@52458fc)) * Added online server worker config support in operator ([feast-dev#5926](feast-dev#5926)) ([193c72a](feast-dev@193c72a)) * Added support for OpenLineage integration ([feast-dev#5884](feast-dev#5884)) ([df70d8d](feast-dev@df70d8d)) * Adjust ray offline store to support abfs(s) ADLS Azure Storage ([feast-dev#5911](feast-dev#5911)) ([d6c0b2d](feast-dev@d6c0b2d)) * Batch_engine config injection in feature_store.yaml through operator ([feast-dev#5938](feast-dev#5938)) ([455d56c](feast-dev@455d56c)) * Consolidate Python packaging - remove setup.py/setup.cfg, standardize on pyproject.toml and uv ([16696b8](feast-dev@16696b8)) * **go:** Add MySQL registry store support for Go feature server ([feast-dev#5933](feast-dev#5933)) ([19f9bb8](feast-dev@19f9bb8)) * Improve local dev experience with file-aware hooks and auto parallelization ([feast-dev#5956](feast-dev#5956)) ([839b79e](feast-dev@839b79e)) * Modernize precommit hooks and optimize test performance ([feast-dev#5929](feast-dev#5929)) ([ea7d4fa](feast-dev@ea7d4fa)) * Optimize container infrastructure for production ([feast-dev#5881](feast-dev#5881)) ([5ebdac8](feast-dev@5ebdac8)) * Optimize DynamoDB online store for improved latency ([feast-dev#5889](feast-dev#5889)) ([fcc8274](feast-dev@fcc8274)) Signed-off-by: soojin <soojin@dable.io>
What this PR does / why we need it:
Added support for OpenLineage integration
Fixes #5882