GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GeezerVison is showing github.com — feat: [Backend] Data Quality Monitoring with native compute, multi-backend support, REST API, CLI by jyejare · Pull Request #6202 · feast-dev/feast Conversation
|
| Backend | Compute | Storage | Dialect highlights |
|---|---|---|---|
| PostgreSQL | SQL push-down | INSERT ON CONFLICT |
PERCENTILE_CONT, WIDTH_BUCKET |
| Snowflake | SQL push-down | MERGE with VARIANT JSON |
APPROX_PERCENTILE, WIDTH_BUCKET |
| BigQuery | SQL push-down | MERGE into BQ tables |
APPROX_QUANTILES, parameterized queries |
| Redshift | SQL push-down | MERGE via Data API |
APPROXIMATE PERCENTILE_DISC |
| Spark | SparkSQL push-down | Parquet tables | PERCENTILE_APPROX, spark.sql() |
| Oracle | SQL via Ibis | MERGE FROM DUAL |
PERCENTILE_CONT WITHIN GROUP |
| DuckDB | In-memory SQL | Parquet files | QUANTILE_CONT, HISTOGRAM |
| Dask | PyArrow compute | Parquet files | pyarrow.compute + numpy |
daily, weekly, biweekly, monthly, quarterlybatch_source via OfflineStore.pull_all_from_table_or_query()FeatureService.logging_config destination, using __log_timestamp as event timestampdriver_stats__conv_rate) are parsed back to their original feature_view_name + feature_name for storage compatibility and drift detectiondata_source_type column (batch / log) differentiates metrics in storageMonitoringService)OfflineStore instance for performanceNaN/Inf float values that break JSON serialization:
opt_float() in monitoring_utils.py — sanitizes at SQL result parsing_sanitize_floats() in monitoring_service.py — final safety net on all API read pathsOut of range float values are not JSON compliant: nanmonitoring_utils.py)monitoring_table_meta(), opt_float(), empty_numeric_metric(), empty_categorical_metric(), normalize_monitoring_row(), build_view_aggregate()DQMJobManager)compute, baseline, auto_compute)feast_monitoring_jobs tableset_baseline to the compute engine/monitoring/)| Method | Endpoint | Description |
|---|---|---|
POST |
/monitoring/compute |
Submit batch DQM job |
POST |
/monitoring/auto_compute |
Auto-detect dates, all granularities |
POST |
/monitoring/compute/transient |
On-demand compute (not stored) |
POST |
/monitoring/compute/log |
Compute from serving logs |
POST |
/monitoring/auto_compute/log |
Auto-detect log dates, all granularities |
GET |
/monitoring/jobs/{job_id} |
DQM job status |
GET |
/monitoring/metrics/features |
Per-feature metrics |
GET |
/monitoring/metrics/feature_views |
Per-view aggregates |
GET |
/monitoring/metrics/feature_services |
Per-service aggregates |
GET |
/monitoring/metrics/baseline |
Baseline distribution retrieval |
GET |
/monitoring/metrics/timeseries |
Time-series data for trend analysis |
All endpoints support cascading filters: project, feature_service_name, feature_view_name, feature_name, granularity, data_source_type, date range.
RBAC enforced using existing AuthzedAction.DESCRIBE (read) and AuthzedAction.UPDATE (compute).
feast monitor run)Options:
--feature-view TEXT Feature view name (omit for all)
--feature-service TEXT Feature service name (required for --source-type log with explicit dates)
--feature-name TEXT Feature name(s), repeatable
--start-date TEXT Start date YYYY-MM-DD (omit for auto-detect)
--end-date TEXT End date YYYY-MM-DD (omit for auto-detect)
--granularity TEXT daily | weekly | biweekly | monthly | quarterly
--set-baseline Mark this computation as baseline
--source-type TEXT batch | log | all (default: batch)
feast applyfeast applyfeature_store.yaml:data_quality_monitoring: auto_baseline: false
DataQualityMonitoringConfig added to FeatureStoreSpecdata_quality_monitoring section in feature_store.yaml when config is setmake generateapiVersion: feast.dev/v1 kind: FeatureStore spec: feastProject: my_project dataQualityMonitoring: autoBaseline: false
docs/how-to-guides/feature-monitoring.md — Production setup, CLI usage, REST API reference, orchestrator integration (Airflow, KFP, cron, K8s CronJob), backend compatibility tableexamples/monitoring/monitoring-quickstart.ipynb — 12-step hands-on walkthrough with visualization examplesdocs/SUMMARY.md updated with links to bothDesign decisions:
OfflineStore compute + storage — Each backend implements its own SQL push-down for metrics calculation and uses its native UPSERT/MERGE for storage. No separate monitoring database needed./monitoring/ route rather than extending existing /metrics/ — The existing metrics route serves registry inventory metadata; monitoring serves statistical feature quality data with a different data path.data_quality_monitoring config — Sits alongside materialization and openlineage in RepoConfig, reflecting that it spans offline store compute/storage + apply trigger + server API.Partially Fixes #5919
git commit -s)Test coverage (all passing):
| Test Suite | Count | Covers |
|---|---|---|
test_metrics_calculator.py |
30+ | Numeric/categorical computation, edge cases (empty, all-null, single value, high cardinality), type classification, PyArrow type classification, NaN/Inf sanitization, JSON serializability |
test_compute_correctness.py |
40+ | Per-backend metric accuracy for all 8 offline stores (DuckDB, Dask, PostgreSQL, Snowflake, BigQuery, Redshift, Oracle, Spark) — numeric stats, histograms, categorical counts |
test_monitoring_integration.py |
16+ | End-to-end batch/log computation, baseline flow, view/service aggregation, native storage dispatch, log feature name normalization, REST API endpoints, CLI, RBAC enforcement |
repo_config_test.go |
92 | Operator repo config generation including DataQualityMonitoring config with auto_baseline disabled, YAML serialization verification |
Snyk SAST scan: 0 vulnerabilities across all new files.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
4340dbb to
940a4af
Compare
d0b45bb to
c06853e
Compare
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
| (feast_feature_freshness_seconds).""" | ||
|
|
||
|
|
||
| class DqmInitialDistributionConfig(FeastConfigBaseModel): |
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
I think these configs should also live at top instead of feature_server. It uses the offline store, not the online server. This field is more similar to materialization, which is top-level config.
#feature_store.yaml
feature_monitoring:
auto_baseline: false
This matches the pattern: materialization: spans offline+online stores, openlineage: spans apply+materialize - feature_monitoring: spans offline store (compute/storage) + apply trigger + server API.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
This could be due to the existing metrics config is residing under server config. The metrics(even operational metrics) could also be computed for offline store. So I think its good if we move both operational metrics and dqm metrics under the parent monitoring config.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
- Forward set_baseline parameter in DQMJobManager.execute_job for compute jobs so user intent to mark a computation as baseline is no longer silently dropped. - Add "1=1" fallback when ts_filter is empty (both start_date and end_date are None) in BigQuery, PostgreSQL, and Snowflake monitoring compute to prevent invalid SQL generation. Signed-off-by: Jitendra Yejare <[email protected]>
0fe6970 to
d114171
Compare
- Forward set_baseline parameter in DQMJobManager.execute_job for compute jobs so user intent to mark a computation as baseline is no longer silently dropped. - Add "1=1" fallback when ts_filter is empty (both start_date and end_date are None) in BigQuery, PostgreSQL, and Snowflake monitoring compute to prevent invalid SQL generation. Signed-off-by: Jitendra Yejare <[email protected]>
462da5b to
1d61e7c
Compare
|
@jyejare please resolve conflicts |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
Signed-off-by: Jitendra Yejare <[email protected]>
Signed-off-by: Jitendra Yejare <[email protected]>
Signed-off-by: Jitendra Yejare <[email protected]>
Signed-off-by: Jitendra Yejare <[email protected]>
Signed-off-by: Jitendra Yejare <[email protected]>
Signed-off-by: Jitendra Yejare <[email protected]>
Signed-off-by: Jitendra Yejare <[email protected]>
Signed-off-by: Jitendra Yejare <[email protected]>
Signed-off-by: Jitendra Yejare <[email protected]>
Signed-off-by: Jitendra Yejare <[email protected]>
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Looks good
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
# [0.64.0](v0.63.0...v0.64.0) (2026-06-13) ### Bug Fixes * Add async_supported property to RedisOnlineStore ([9b088fe](9b088fe)) * Add missing feast init templates to operator CRD and enhance persistence documentation ([1941d4d](1941d4d)) * Allow to publish from reference branch ([5458ec8](5458ec8)) * API calls list ([4203eb7](4203eb7)) * **bigquery:** Enable list inference for parquet loads in offline_write_batch ([9243497](9243497)), closes [#5845](#5845) * Bump grpcio dependencies ([07b4782](07b4782)) * **compute-engine/local:** Honor field_mapping on join keys in dedup + join nodes ([#6395](#6395)) ([bd01824](bd01824)) * **dynamodb:** Avoid tag race condition by using diff-based tag updates ([#6479](#6479)) ([bad2b7d](bad2b7d)), closes [#6418](#6418) * **dynamodb:** Fix mypy type for _build_projection_expression return ([217b4da](217b4da)) * Fix intermittent async test failures for DynamoDB and Redis ([63c5eb1](63c5eb1)) * Fix mongodb blog title ([57d28d4](57d28d4)) * Fix shared SQL registry crash - avoid unnecessary UDF deserialization in proto cache building ([ac588d7](ac588d7)) * Fix SparkRetrievalJob.persist() failing for SparkSource ([209d7cd](209d7cd)) * Fixed formatting and image for mongo blog ([#6377](#6377)) ([f8389fb](f8389fb)) * Fixes for ray source ([7f592a4](7f592a4)) * **go:** skip registry refresh when cache_ttl_seconds <= 0 ([97ed40c](97ed40c)) * Handle array of strings columns in Athena materialization ([#6324](#6324)) ([4ed0278](4ed0278)) * make milvus VARCHAR max_length configurable, remove hardcoded 512 limit ([3b98c22](3b98c22)) * **operator:** Set appProtocol: grpc on registry gRPC Service ([#6367](#6367)) ([c9ae2b4](c9ae2b4)) * PyJWT 2.10+ added validation that rejects empty HMAC keys ([e756ffe](e756ffe)) * RemoteOnlineStore sends all features in a single HTTP request ([8f187dd](8f187dd)) * Remove registry proto dump to enforce RBAC and add permission checks to Commit/Refresh RPCs ([328431f](328431f)) * Remove selector migration job - no longer needed ([51c325e](51c325e)) * replace broken .claude skill symlink with correct relative path ([4541690](4541690)) * Replace selector label strip patch with migration Job for upgrade-safe selector uniqueness ([00dea50](00dea50)) * Scope feature view name conflict check to current project in file-based registry ([#6369](#6369)) ([a4fde83](a4fde83)), closes [#6209](#6209) * **snowflake:** Stop double-quoting connection identifiers ([#6462](#6462)) ([e914d59](e914d59)) * **spark:** S3/GCS PyArrow filesystem resolution for staging paths ([#6442](#6442)) ([ae50414](ae50414)) * **trino:** Clean up temporary entity tables after retrieval ([#6381](#6381)) ([d86b13d](d86b13d)), closes [#6306](#6306) * Update go-feature-server base image to Go 1.25 and fix operator Dockerfile COPY permissions ([86ef0bc](86ef0bc)) ### Features * [Backend] Data Quality Monitoring with native compute, multi-backend support, REST API, CLI ([#6202](#6202)) ([5458c37](5458c37)) * Add apache flink compute engine ([#6476](#6476)) ([9636d6a](9636d6a)) * Add demo noteboooks for users ([e362173](e362173)) * Add enabled/disabled toggle for feature views ([#6401](#6401)) ([5f1fa0d](5f1fa0d)), closes [#6395](#6395) * Add Label View to init template ([ec272d5](ec272d5)) * Add mTLS support to remote registry gRPC client ([#6474](#6474)) ([c9602d8](c9602d8)) * Add Prometheus gauges for FeatureStore installation telemetry ([#6354](#6354)) ([1b681b7](1b681b7)) * Adds registry REST API endpoints for managing entities, data sources, and feature views ([#6413](#6413)) ([f77bd1d](f77bd1d)) * Allow CRUD on entities, data sources, and feature views from UI ([#6412](#6412)) ([2321c07](2321c07)) * Allow default openlineage configuration ([#6467](#6467)) ([276b6df](276b6df)) * **bigquery:** Support DATE-type event timestamp columns ([#6362](#6362)) ([753dee5](753dee5)), closes [#2530](#2530) * **cli:** Add `feast projects delete` command (closes [#5095](#5095)) ([#6318](#6318)) ([1a4b96c](1a4b96c)) * Data Quality Monitoring added in feast UI ([#6422](#6422)) ([fa271be](fa271be)) * **dynamodb:** Use ProjectionExpression when requested_features is set ([0adc906](0adc906)), closes [#6058](#6058) * Enhance DataSource and FeatureView modals with error handling and submission states ([96d7169](96d7169)) * Expose registry endpoints on feature server for MCP access ([f77981c](f77981c)) * Feast First-Class LabelView Implementation ([#6292](#6292)) ([c0e7e5d](c0e7e5d)) * Feast-MLflow Integration ([#6235](#6235)) ([7279c75](7279c75)) * Operational metrics for offline store and SOX metrics for both ([#6340](#6340)) ([65b1b80](65b1b80)) * Pre-compute feature service ([8011550](8011550)) * REST API-backed UI for RBAC compatibility and per-page lazy loading ([#6414](#6414)) ([6ae80af](6ae80af)) * Support non-string map key types ([#6382](#6382)) ([#6383](#6383)) ([728aa2e](728aa2e)) * Update FeatureStore CRD with DRA Fields ([01241e4](01241e4)) ### Performance Improvements * Cache feature view resolution in get_online_features to reduce per-request overhead ([55c2f18](55c2f18)) * Optimize feature serving latency with batched async Redis, cached checks fix ([103809a](103809a)) * Replace MessageToDict with optimized custom dict builder ([#6015](#6015)) ([9902064](9902064))
# [0.64.0](feast-dev/feast@v0.63.0...v0.64.0) (2026-06-13) ### Bug Fixes * Add async_supported property to RedisOnlineStore ([9b088fe](feast-dev@9b088fe)) * Add missing feast init templates to operator CRD and enhance persistence documentation ([1941d4d](feast-dev@1941d4d)) * Allow to publish from reference branch ([5458ec8](feast-dev@5458ec8)) * API calls list ([4203eb7](feast-dev@4203eb7)) * **bigquery:** Enable list inference for parquet loads in offline_write_batch ([9243497](feast-dev@9243497)), closes [feast-dev#5845](feast-dev#5845) * Bump grpcio dependencies ([07b4782](feast-dev@07b4782)) * **compute-engine/local:** Honor field_mapping on join keys in dedup + join nodes ([feast-dev#6395](feast-dev#6395)) ([bd01824](feast-dev@bd01824)) * **dynamodb:** Avoid tag race condition by using diff-based tag updates ([feast-dev#6479](feast-dev#6479)) ([bad2b7d](feast-dev@bad2b7d)), closes [feast-dev#6418](feast-dev#6418) * **dynamodb:** Fix mypy type for _build_projection_expression return ([217b4da](feast-dev@217b4da)) * Fix intermittent async test failures for DynamoDB and Redis ([63c5eb1](feast-dev@63c5eb1)) * Fix mongodb blog title ([57d28d4](feast-dev@57d28d4)) * Fix shared SQL registry crash - avoid unnecessary UDF deserialization in proto cache building ([ac588d7](feast-dev@ac588d7)) * Fix SparkRetrievalJob.persist() failing for SparkSource ([209d7cd](feast-dev@209d7cd)) * Fixed formatting and image for mongo blog ([feast-dev#6377](feast-dev#6377)) ([f8389fb](feast-dev@f8389fb)) * Fixes for ray source ([7f592a4](feast-dev@7f592a4)) * **go:** skip registry refresh when cache_ttl_seconds <= 0 ([97ed40c](feast-dev@97ed40c)) * Handle array of strings columns in Athena materialization ([feast-dev#6324](feast-dev#6324)) ([4ed0278](feast-dev@4ed0278)) * make milvus VARCHAR max_length configurable, remove hardcoded 512 limit ([3b98c22](feast-dev@3b98c22)) * **operator:** Set appProtocol: grpc on registry gRPC Service ([feast-dev#6367](feast-dev#6367)) ([c9ae2b4](feast-dev@c9ae2b4)) * PyJWT 2.10+ added validation that rejects empty HMAC keys ([e756ffe](feast-dev@e756ffe)) * RemoteOnlineStore sends all features in a single HTTP request ([8f187dd](feast-dev@8f187dd)) * Remove registry proto dump to enforce RBAC and add permission checks to Commit/Refresh RPCs ([328431f](feast-dev@328431f)) * Remove selector migration job - no longer needed ([51c325e](feast-dev@51c325e)) * replace broken .claude skill symlink with correct relative path ([4541690](feast-dev@4541690)) * Replace selector label strip patch with migration Job for upgrade-safe selector uniqueness ([00dea50](feast-dev@00dea50)) * Scope feature view name conflict check to current project in file-based registry ([feast-dev#6369](feast-dev#6369)) ([a4fde83](feast-dev@a4fde83)), closes [feast-dev#6209](feast-dev#6209) * **snowflake:** Stop double-quoting connection identifiers ([feast-dev#6462](feast-dev#6462)) ([e914d59](feast-dev@e914d59)) * **spark:** S3/GCS PyArrow filesystem resolution for staging paths ([feast-dev#6442](feast-dev#6442)) ([ae50414](feast-dev@ae50414)) * **trino:** Clean up temporary entity tables after retrieval ([feast-dev#6381](feast-dev#6381)) ([d86b13d](feast-dev@d86b13d)), closes [feast-dev#6306](feast-dev#6306) * Update go-feature-server base image to Go 1.25 and fix operator Dockerfile COPY permissions ([86ef0bc](feast-dev@86ef0bc)) ### Features * [Backend] Data Quality Monitoring with native compute, multi-backend support, REST API, CLI ([feast-dev#6202](feast-dev#6202)) ([5458c37](feast-dev@5458c37)) * Add apache flink compute engine ([feast-dev#6476](feast-dev#6476)) ([9636d6a](feast-dev@9636d6a)) * Add demo noteboooks for users ([e362173](feast-dev@e362173)) * Add enabled/disabled toggle for feature views ([feast-dev#6401](feast-dev#6401)) ([5f1fa0d](feast-dev@5f1fa0d)), closes [feast-dev#6395](feast-dev#6395) * Add Label View to init template ([ec272d5](feast-dev@ec272d5)) * Add mTLS support to remote registry gRPC client ([feast-dev#6474](feast-dev#6474)) ([c9602d8](feast-dev@c9602d8)) * Add Prometheus gauges for FeatureStore installation telemetry ([feast-dev#6354](feast-dev#6354)) ([1b681b7](feast-dev@1b681b7)) * Adds registry REST API endpoints for managing entities, data sources, and feature views ([feast-dev#6413](feast-dev#6413)) ([f77bd1d](feast-dev@f77bd1d)) * Allow CRUD on entities, data sources, and feature views from UI ([feast-dev#6412](feast-dev#6412)) ([2321c07](feast-dev@2321c07)) * Allow default openlineage configuration ([feast-dev#6467](feast-dev#6467)) ([276b6df](feast-dev@276b6df)) * **bigquery:** Support DATE-type event timestamp columns ([feast-dev#6362](feast-dev#6362)) ([753dee5](feast-dev@753dee5)), closes [feast-dev#2530](feast-dev#2530) * **cli:** Add `feast projects delete` command (closes [feast-dev#5095](feast-dev#5095)) ([feast-dev#6318](feast-dev#6318)) ([1a4b96c](feast-dev@1a4b96c)) * Data Quality Monitoring added in feast UI ([feast-dev#6422](feast-dev#6422)) ([fa271be](feast-dev@fa271be)) * **dynamodb:** Use ProjectionExpression when requested_features is set ([0adc906](feast-dev@0adc906)), closes [feast-dev#6058](feast-dev#6058) * Enhance DataSource and FeatureView modals with error handling and submission states ([96d7169](feast-dev@96d7169)) * Expose registry endpoints on feature server for MCP access ([f77981c](feast-dev@f77981c)) * Feast First-Class LabelView Implementation ([feast-dev#6292](feast-dev#6292)) ([c0e7e5d](feast-dev@c0e7e5d)) * Feast-MLflow Integration ([feast-dev#6235](feast-dev#6235)) ([7279c75](feast-dev@7279c75)) * Operational metrics for offline store and SOX metrics for both ([feast-dev#6340](feast-dev#6340)) ([65b1b80](feast-dev@65b1b80)) * Pre-compute feature service ([8011550](feast-dev@8011550)) * REST API-backed UI for RBAC compatibility and per-page lazy loading ([feast-dev#6414](feast-dev#6414)) ([6ae80af](feast-dev@6ae80af)) * Support non-string map key types ([feast-dev#6382](feast-dev#6382)) ([feast-dev#6383](feast-dev#6383)) ([728aa2e](feast-dev@728aa2e)) * Update FeatureStore CRD with DRA Fields ([01241e4](feast-dev@01241e4)) ### Performance Improvements * Cache feature view resolution in get_online_features to reduce per-request overhead ([55c2f18](feast-dev@55c2f18)) * Optimize feature serving latency with batched async Redis, cached checks fix ([103809a](feast-dev@103809a)) * Replace MessageToDict with optimized custom dict builder ([feast-dev#6015](feast-dev#6015)) ([9902064](feast-dev@9902064))
There was an error while loading. Please reload this page.
Successfully merging this pull request may close these issues.
Revamp Data Quality Monitoring
There was an error while loading. Please reload this page.