feat: OpenLineage lineage server and operator support - #6759
Conversation
|
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ 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
Continue to review full report in Codecov by Harness.
🚀 New features to boost your workflow:
|
e352b49 to
40e1f0d
Compare
8600452 to
4fa2ca7
Compare
jyejare
left a comment
There was a problem hiding this comment.
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.
| Lineage string `json:"lineage,omitempty"` | ||
| } | ||
|
|
There was a problem hiding this comment.
[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:
| 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
left a comment
There was a problem hiding this comment.
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.
jyejare
left a comment
There was a problem hiding this comment.
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 *int32json:"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 *LineageServerConfigjson:"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 stringjson:"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 +WhenlineageServeris 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 producertransport_urlon 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>
4fa2ca7 to
ee4f556
Compare
|
@jyejare handled the docs related concerns, other things are implemented already |
What this PR does / why we need it:
feast-openlineage-configConfigMap in the controller namespace, so external producers can discover the consumer endpoint without manual configuration.