Skip to content

feat: OpenLineage lineage server and operator support - #6759

Merged
ntkathole merged 1 commit into
feast-dev:masterfrom
ntkathole:lineage_operator
Aug 20, 2026
Merged

feat: OpenLineage lineage server and operator support#6759
ntkathole merged 1 commit into
feast-dev:masterfrom
ntkathole:lineage_operator

Conversation

@ntkathole

Copy link
Copy Markdown
Member

What this PR does / why we need it:

  • Introduces automatic producer discovery via a centralized feast-openlineage-config ConfigMap in the controller namespace, so external producers can discover the consumer endpoint without manual configuration.
  • Adds feast serve_lineage CLI command to run the OpenLineage consumer as an independent FastAPI server, enabling separate scaling and deployment from the Feast registry/UI server.
  • Extends the Feast Operator CRD with lineageServer configuration under openlineage.consumer, allowing the operator to deploy a dedicated lineage server Deployment and Service in Kubernetes.
  • Adds standalone_server config flag to delegate the retention background task exclusively to the lineage server while keeping the full consumer API available on both the UI/registry and lineage servers.

@ntkathole ntkathole self-assigned this Aug 18, 2026
@ntkathole
ntkathole requested a review from a team as a code owner August 18, 2026 17:16
@codecov-commenter

codecov-commenter commented Aug 18, 2026

Copy link
Copy Markdown

⚠️ Please install the 'codecov app svg image' to ensure uploads and comments are reliably processed by Codecov.

Codecov Report

❌ Patch coverage is 32.95455% with 118 lines in your changes missing coverage. Please review.
✅ Project coverage is 46.95%. Comparing base (aade119) to head (ee4f556).
⚠️ Report is 1 commits behind head on master.

Files with missing lines Patch % Lines
sdk/python/feast/lineage_server.py 32.57% 83 Missing and 6 partials ⚠️
sdk/python/feast/api/registry/rest/__init__.py 5.26% 18 Missing ⚠️
sdk/python/feast/cli/serve.py 38.88% 11 Missing ⚠️
❗ Your organization needs to install the Codecov GitHub app to enable full functionality.
Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##           master    #6759      +/-   ##
==========================================
- Coverage   46.98%   46.95%   -0.04%     
==========================================
  Files         418      419       +1     
  Lines       51675    51839     +164     
  Branches     7485     7515      +30     
==========================================
+ Hits        24281    24339      +58     
- Misses      25666    25766     +100     
- Partials     1728     1734       +6     
Flag Coverage Δ
go-feature-server 30.58% <ø> (ø)
python-unit 48.24% <32.95%> (-0.05%) ⬇️
Files with missing lines Coverage Δ
sdk/python/feast/api/registry/rest/lineage.py 87.80% <100.00%> (ø)
sdk/python/feast/cli/cli.py 55.34% <100.00%> (+0.17%) ⬆️
sdk/python/feast/constants.py 100.00% <100.00%> (ø)
sdk/python/feast/openlineage/config.py 67.12% <100.00%> (+3.23%) ⬆️
sdk/python/feast/openlineage/consumer.py 68.36% <100.00%> (ø)
sdk/python/feast/repo_config.py 79.03% <100.00%> (+0.10%) ⬆️
sdk/python/feast/cli/serve.py 53.12% <38.88%> (-3.29%) ⬇️
sdk/python/feast/api/registry/rest/__init__.py 36.25% <5.26%> (-1.50%) ⬇️
sdk/python/feast/lineage_server.py 32.57% <32.57%> (ø)

Continue to review full report in Codecov by Harness.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update e79bd33...ee4f556. Read the comment docs.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@ntkathole
ntkathole force-pushed the lineage_operator branch 5 times, most recently from e352b49 to 40e1f0d Compare August 19, 2026 09:55
@ntkathole
ntkathole force-pushed the lineage_operator branch 11 times, most recently from 8600452 to 4fa2ca7 Compare August 20, 2026 11:05

@jyejare jyejare left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This PR adds comprehensive OpenLineage lineage server and operator support to Feast, introducing standalone lineage server deployment, producer discovery mechanisms, and enhanced configuration options. The implementation is well-structured with proper CRD schema extensions and documentation, though there are some concerns around configuration validation and default value handling.

Comment thread infra/feast-operator/api/v1/featurestore_types.go
Comment thread docs/reference/openlineage.md
Comment on lines +1125 to 1127
Lineage string `json:"lineage,omitempty"`
}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Suggestion] Add validation comment for Lineage hostname

The new Lineage field in ServiceHostnames should have a comment explaining its format and when it's populated, similar to other hostname fields.

Suggested:

Suggested change
Lineage string `json:"lineage,omitempty"`
}
+ Registry string `json:"registry,omitempty"`
+ RegistryRest string `json:"registryRest,omitempty"`
+ UI string `json:"ui,omitempty"`
+ // Lineage hostname is populated when consumer.lineageServer is configured
+ Lineage string `json:"lineage,omitempty"`

@jyejare jyejare left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This PR adds comprehensive OpenLineage lineage server and operator support to Feast, including producer/consumer capabilities, standalone lineage server deployment, Kubernetes operator integration with discovery ConfigMaps, and extensive documentation. The implementation is well-structured with proper separation of concerns, but has some missing unit test coverage for critical registry/lineage server integration scenarios and potential performance considerations that need verification.

Comment thread docs/reference/openlineage.md
Comment thread docs/reference/openlineage.md
Comment thread infra/feast-operator/api/v1/featurestore_types.go
Comment thread docs/reference/openlineage.md
Comment thread docs/reference/openlineage.md

@jyejare jyejare left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Few more..


[Critical] Missing LineageReadyType in operator reconciliation loop

infra/feast-operator/api/v1/featurestore_types.go (lines + LineageReadyType = "Lineage")

The LineageReadyType constant is added but there's no evidence in the diff that the operator reconciliation controller actually manages this condition. The operator must handle lineage server deployment, set this condition appropriately, and include it in the overall ready status calculation. Without proper reconciliation logic, lineage servers won't be deployed or monitored.

+	LineageReadyType       = "Lineage"
+	ReadyType              = "FeatureStore"
+	AuthorizationReadyType = "Authorization"

[Warning] Retention configuration validation needs operator integration

infra/feast-operator/api/v1/featurestore_types.go (lines + RetentionDays *int32 json:"retentionDays,omitempty"

  • // RetentionCheckIntervalHours is how often the background pruning task runs, in hours.
  • // +kubebuilder:default=6
  • // +kubebuilder:validation:Minimum=1
  • // +optional
  • RetentionCheckIntervalHours *int32 json:"retentionCheckIntervalHours,omitempty")

The retention fields are added to the CRD but the operator needs to pass these values to the lineage server deployment. These should be converted to environment variables or config file entries in the lineage pod spec. Also consider validating that retention_days > 0 when retention_check_interval_hours is set (or vice versa) to prevent misconfiguration.

+	// RetentionDays is the number of days to retain OpenLineage events and runs.
+	// Events older than this are automatically pruned. Set to 0 to disable pruning.
+	// +kubebuilder:default=30
+	// +kubebuilder:validation:Minimum=0
+	// +optional
+	RetentionDays *int32 `json:"retentionDays,omitempty"`
+	// RetentionCheckIntervalHours is how often the background pruning task runs, in hours.
+	// +kubebuilder:default=6
+	// +kubebuilder:validation:Minimum=1
+	// +optional
+	RetentionCheckIntervalHours *int32 `json:"retentionCheckIntervalHours,omitempty"`

[Critical] LineageServerConfig missing validation and operator reconciliation

infra/feast-operator/api/v1/featurestore_types.go (lines + LineageServer *LineageServerConfig json:"lineageServer,omitempty")

The LineageServerConfig is added to the consumer configuration but the operator reconciliation logic needs to handle this new deployment mode. The operator must: 1) Create a separate Deployment when lineageServer is specified, 2) Auto-configure the producer transportUrl to point to the lineage Service, 3) Handle TLS configuration properly between services, 4) Update the ready conditions appropriately. Without this logic, the lineageServer configuration will be ignored.

+	// LineageServer enables a separate Deployment for the OpenLineage consumer.
+	// When set, the consumer is removed from the UI/registry Pod and runs
+	// independently with its own scaling. The Feast producer transport is
+	// auto-configured to send events to the lineage Service.
+	// +optional
+	LineageServer *LineageServerConfig `json:"lineageServer,omitempty"`

[Warning] ServiceHostnames lineage field needs status controller updates

infra/feast-operator/api/v1/featurestore_types.go (lines + Lineage string json:"lineage,omitempty")

The lineage hostname is added to ServiceHostnames status but the operator controller needs to populate this field when the lineage service is created. Ensure the reconciliation loop updates status.serviceHostnames.lineage with the correct service FQDN when a lineage server is deployed.

+	Lineage      string `json:"lineage,omitempty"`

[Warning] Auto-transport configuration requires operator implementation

docs/reference/openlineage.md (lines +When lineageServer is configured:

+1. Separate Deployment: The operator creates a feast-<name>-lineage Deployment

  • running feast serve_lineage, with its own Service on port 6580.
    +2. Auto-transport: The producer transport_url on the main Feast Deployment is
  • automatically configured to point to the lineage Service
  • (http://feast-<name>-lineage.<namespace>.svc.cluster.local:6580).)

The documentation promises that the operator automatically configures the producer transport_url to point to the lineage Service, but this requires complex reconciliation logic that's not evident in the diff. The operator must: 1) Detect when lineageServer is configured, 2) Override the transportUrl in the main deployment's feature_store.yaml ConfigMap, 3) Handle service naming and namespace resolution correctly, 4) Update configurations when the lineage service changes. This is a significant operator enhancement that needs careful implementation.

+2. **Auto-transport**: The producer `transport_url` on the main Feast Deployment is
+   automatically configured to point to the lineage Service
+   (`http://feast-<name>-lineage.<namespace>.svc.cluster.local:6580`).

[Suggestion] RBAC considerations for cross-namespace ConfigMap access

docs/reference/openlineage.md (lines +#### Cross-Namespace Access

+The discovery ConfigMap is created in the controller namespace. Producers in other
+namespaces reference it by specifying the namespace:
+
+```yaml
+volumes:

    • name: ol-config
  • configMap:
  •  name: feast-openlineage-config
    
  •  namespace: feast-operator-system  # controller namespace
    

+```)

Cross-namespace ConfigMap access requires proper RBAC configuration. The documentation mentions that the operator creates a Role + RoleBinding granting system:authenticated read access, but this should be more specific. Consider documenting the exact RBAC resources created and any security implications of granting broad read access to the discovery ConfigMap.

+> **Note:** Cross-namespace ConfigMap references in volume mounts require the Pod's
+> ServiceAccount to have `get` access to the ConfigMap. The operator creates a Role
+> and RoleBinding granting `system:authenticated` read access to the discovery ConfigMap.

Signed-off-by: ntkathole <nikhilkathole2683@gmail.com>
@ntkathole

Copy link
Copy Markdown
Member Author

@jyejare handled the docs related concerns, other things are implemented already

@ntkathole
ntkathole requested a review from jyejare August 20, 2026 12:55
@ntkathole
ntkathole merged commit bf1e54a into feast-dev:master Aug 20, 2026
33 of 34 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants