Skip to content

Commit e8f2000

Browse files
docs: Add DQM monitoring blog post (#6559)
* docs: add DQM monitoring blog post Signed-off-by: Francisco Javier Arceo <farceo@redhat.com> * docs: Clarify PR title convention Signed-off-by: Francisco Javier Arceo <farceo@redhat.com> * docs: Add DQM UI screenshots Signed-off-by: Francisco Javier Arceo <farceo@redhat.com> * docs: Add DQM blog coauthor Signed-off-by: Francisco Javier Arceo <farceo@redhat.com> --------- Signed-off-by: Francisco Javier Arceo <farceo@redhat.com>
1 parent 141c08c commit e8f2000

6 files changed

Lines changed: 225 additions & 1 deletion

File tree

AGENTS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ Architecture & design intent: `docs/getting-started/architecture/` (overview, wr
9292

9393
- Use type hints on all Python function signatures
9494
- Follow existing patterns in the module you are modifying
95-
- PR titles must follow semantic conventions: `feat:`, `fix:`, `ci:`, `chore:`, `docs:`
95+
- PR titles must follow conventional commit conventions with a lowercase type and a capitalized subject after the colon: `feat: Add ...`, `fix: Correct ...`, `ci: Update ...`, `chore: Refresh ...`, `docs: Add ...`
9696
- Sign off commits with `git commit -s` (DCO requirement)
9797
- Uses `ruff` for Python linting and formatting; Go uses standard `gofmt`
9898
- Recompile protos after making changes to `.proto` files (`make protos`)
Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,224 @@
1+
---
2+
title: Data Quality Monitoring in Feast 0.64
3+
description: Feast 0.64 adds native data quality monitoring with baseline metrics, batch and serving-log analysis, REST APIs, CLI workflows, and a built-in monitoring UI.
4+
date: 2026-06-26
5+
authors: ["Jitendra Yejare", "Nikhil Kathole", "Francisco Javier Arceo"]
6+
---
7+
8+
<div class="hero-image">
9+
<img src="/images/blog/feast-dqm-monitoring-hero.png" alt="Feast Data Quality Monitoring" loading="lazy">
10+
</div>
11+
12+
# Data Quality Monitoring in Feast 0.64
13+
14+
Serving ML models in production is extremely hard.
15+
16+
The reason is simple: production models depend on data from many different places. Every source system has some probability of operational error: a delayed pipeline, a schema change, a column that starts producing nulls, a categorical value that changes meaning, a late partition, a silent backfill, or a service that behaves differently under production traffic.
17+
18+
The more data sources a model depends on, the more chances there are for one of those systems to drift, fail, or change underneath you. That creates a basic tension in ML systems. Models are data hungry and often benefit from orthogonal features from many upstream systems, but every additional upstream dependency increases operational risk. What ML wants for predictive power can conflict with what engineering wants for reliability.
19+
20+
The only way to manage that tension is to monitor what is actually happening in production. Feature quality problems rarely arrive as neat exceptions. A model may keep serving predictions while one upstream table starts producing nulls, a batch pipeline shifts a numeric distribution, or production requests drift away from the training baseline. By the time these issues show up in model metrics, the debugging path usually crosses feature definitions, data sources, materialization jobs, and serving logs.
21+
22+
Feast 0.64 adds a native data quality monitoring system that brings those signals directly into the feature store. Instead of relying on a separate validation framework, Feast can now compute, store, serve, and visualize feature-level statistics across batch data and logged serving data.
23+
24+
The biggest change is that monitoring is now a first-class Feast workflow:
25+
26+
- `feast apply` can compute baseline metrics for registered feature views
27+
- `feast monitor run` can compute scheduled daily, weekly, biweekly, monthly, and quarterly metrics
28+
- REST endpoints expose monitoring jobs, per-feature metrics, aggregate feature-view and feature-service metrics, baselines, and time series
29+
- the Feast UI includes a Monitoring page with filters, summary tabs, feature drilldowns, histograms, and time-series charts
30+
- compute is pushed into supported offline stores where possible, with a Python fallback for other backends
31+
32+
## From validation to monitoring
33+
34+
Feast previously supported a Great Expectations-based DQM path for validating historical retrievals. That integration was useful, but it lived outside the normal feature store workflow: users had to install the `feast[ge]` extra, write profiler code, and run validation against saved datasets.
35+
36+
That original integration proved the need for data quality inside Feast. It helped answer an important question: after generating a training dataset, does this dataset satisfy the expectations we care about?
37+
38+
But production feature quality problems usually happen after the training dataset is generated. A pipeline may keep running while an upstream producer changes a column, shifts a distribution, starts sending nulls, or changes the meaning of a categorical value. In those cases, the feature code may be perfectly correct while the data feeding it has changed.
39+
40+
Feast needed monitoring that was closer to the system that actually computes and serves features. By coupling DQM to Feast's compute engines and offline stores, Feast can compute quality metrics where the data already lives, reuse feature metadata, compare batch and serving-log distributions, and expose the results through the same CLI, REST API, and UI used to operate the feature store.
41+
42+
This also helps when teams maintain multiple feature execution paths. For example, a feature may be generated one way for training and another way for low-latency serving or streaming. DQM is not a formal proof that two implementations are equivalent, but distribution metrics, baselines, and serving-log comparisons provide an early warning when those paths start producing meaningfully different values.
43+
44+
The new system is broader and more operational. It automatically computes statistical profiles for registered features, stores them in monitoring tables, and makes them available to the CLI, REST API, and UI. This gives teams the kind of feature health view they need after features are already in production, not only during one historical retrieval.
45+
46+
For each feature, Feast can track:
47+
48+
| Metric family | Examples |
49+
|---|---|
50+
| completeness | row count, null count, null rate |
51+
| numeric profile | mean, standard deviation, min, max |
52+
| percentiles | p50, p75, p90, p95, p99 |
53+
| distributions | numeric histograms or categorical top values |
54+
| aggregate health | feature-view and feature-service summaries |
55+
56+
## Baselines start at registration
57+
58+
The simplest way to turn on monitoring is to enable DQM in `feature_store.yaml`:
59+
60+
```yaml
61+
data_quality_monitoring:
62+
auto_baseline: true
63+
```
64+
65+
When `auto_baseline` is enabled, `feast apply` computes baseline metrics for feature views that do not already have one. The baseline is marked as the reference distribution and can be compared with later scheduled metrics.
66+
67+
That matters because the baseline lives next to the feature definitions. When a feature view is registered, Feast can also capture what "normal" looked like at registration time. Later monitoring runs can answer whether the current data still resembles that baseline.
68+
69+
For Feast Operator deployments, the same setting is available on the `FeatureStore` custom resource:
70+
71+
```yaml
72+
apiVersion: feast.dev/v1
73+
kind: FeatureStore
74+
spec:
75+
feastProject: my_project
76+
dataQualityMonitoring:
77+
autoBaseline: true
78+
```
79+
80+
## Scheduled monitoring with the CLI
81+
82+
For ongoing monitoring, schedule:
83+
84+
```bash
85+
feast monitor run
86+
```
87+
88+
In auto mode, Feast detects the latest event timestamp in the source data and computes metrics across the supported granularities: daily, weekly, biweekly, monthly, and quarterly.
89+
90+
You can also scope monitoring to a specific feature view:
91+
92+
```bash
93+
feast monitor run --feature-view driver_stats
94+
```
95+
96+
Or compute a specific window and mark it as a baseline:
97+
98+
```bash
99+
feast monitor run \
100+
--feature-view driver_stats \
101+
--start-date 2025-01-01 \
102+
--end-date 2025-03-31 \
103+
--granularity daily \
104+
--set-baseline
105+
```
106+
107+
This makes the CLI easy to wire into Airflow, Kubeflow Pipelines, cron, or any scheduler that already runs Feast materialization jobs.
108+
109+
## Monitoring serving logs
110+
111+
Batch data tells you whether source features look healthy. Serving logs tell you what your models actually received.
112+
113+
If a `FeatureService` has logging configured, Feast can compute monitoring metrics from the logged online features:
114+
115+
```bash
116+
feast monitor run --source-type log
117+
```
118+
119+
You can also run batch and log monitoring together:
120+
121+
```bash
122+
feast monitor run --source-type all
123+
```
124+
125+
Log metrics are stored with `data_source_type="log"` alongside batch metrics. Feast normalizes logged feature names back to the feature view and feature name, which lets the UI and API compare batch and serving distributions without forcing users to maintain a separate mapping.
126+
127+
## The new Monitoring UI
128+
129+
The most visible 0.64 improvement is the Monitoring page in the Feast UI. It turns DQM from a background job into something feature owners can inspect without leaving Feast.
130+
131+
The page includes three main tabs:
132+
133+
| Tab | What it shows |
134+
|---|---|
135+
| Features | per-feature metrics such as null rate, row count, freshness, and health |
136+
| Feature Views | aggregate quality summaries per feature view |
137+
| Feature Services | aggregate quality summaries for model-facing feature services |
138+
139+
At the top of the page, users can filter by feature view, granularity, source type, and date range. Baseline is treated as its own view because it represents all baseline data rather than a normal date window. The page also includes a Compute Metrics action that triggers DQM computation from the UI, plus Refresh for reloading already computed results.
140+
141+
<div class="content-image">
142+
<img src="/images/blog/feast-dqm-ui-all-features.png" alt="Feast DQM Monitoring dashboard showing feature metrics, filters, histograms, and health status" loading="lazy">
143+
</div>
144+
145+
Clicking a feature opens a detail page with:
146+
147+
- a distribution chart for numeric histograms or categorical values
148+
- a statistics panel with null rate, mean, standard deviation, min, max, and percentiles
149+
- a granularity selector that can switch between computed windows and baseline
150+
- time-series charts for metric drift, including aggregate statistics and null-rate trends
151+
152+
<div class="content-image">
153+
<img src="/images/blog/feast-dqm-ui-numeric-feature.png" alt="Feast DQM numeric feature detail page with distribution chart, statistics, and time-series analysis" loading="lazy">
154+
</div>
155+
156+
<div class="content-image">
157+
<img src="/images/blog/feast-dqm-ui-categorical-feature.png" alt="Feast DQM categorical feature detail page with category distribution and statistics" loading="lazy">
158+
</div>
159+
160+
This is the workflow we wanted: feature owners can start from a table of health signals, filter down to the part of the feature store they care about, and then drill into the exact feature whose distribution changed.
161+
162+
## How compute engines fit in
163+
164+
DQM is intentionally tied to Feast's compute and offline-store architecture. The goal is to compute metrics where the data already lives whenever possible, then store the results in backend-specific monitoring tables.
165+
166+
Supported backends push computation into the underlying system:
167+
168+
| Backend | Compute path | Storage path |
169+
|---|---|---|
170+
| PostgreSQL | SQL push-down | `INSERT ON CONFLICT` |
171+
| Snowflake | SQL push-down | `MERGE` with JSON metrics |
172+
| BigQuery | SQL push-down | BigQuery `MERGE` |
173+
| Redshift | SQL push-down | Data API-backed writes |
174+
| Spark | SparkSQL push-down | Parquet-backed tables |
175+
| Oracle | SQL through Ibis | `MERGE` |
176+
| DuckDB | in-memory SQL | Parquet files |
177+
| Dask | PyArrow compute | Parquet files |
178+
179+
For backends without native monitoring support, Feast falls back to pulling data through the offline store and computing metrics with PyArrow and NumPy. That fallback keeps the API consistent while still allowing mature warehouse and distributed engines to do the heavy lifting.
180+
181+
This design is especially important for larger feature stores. A null-rate or histogram job should not require exporting a warehouse table into a separate monitoring system. If the feature data already lives in Snowflake, BigQuery, Spark, Redshift, or another supported backend, Feast can push the computation closer to that data.
182+
183+
Feast 0.64 also adds the Apache Flink compute engine, continuing the broader move toward a unified compute-engine model. DQM follows the same direction: feature quality checks should be part of the feature platform's execution model, not a sidecar that every team wires up differently.
184+
185+
## REST APIs for automation
186+
187+
The UI and CLI are built on top of monitoring APIs that can also be used by external systems:
188+
189+
| Method | Endpoint | Use |
190+
|---|---|---|
191+
| `POST` | `/monitoring/compute` | submit a batch DQM job |
192+
| `POST` | `/monitoring/auto_compute` | auto-detect dates and compute all granularities |
193+
| `POST` | `/monitoring/compute/transient` | compute ad hoc metrics without storing them |
194+
| `POST` | `/monitoring/compute/log` | compute metrics from serving logs |
195+
| `POST` | `/monitoring/auto_compute/log` | auto-compute log metrics |
196+
| `GET` | `/monitoring/jobs/{job_id}` | read DQM job status |
197+
| `GET` | `/monitoring/metrics/features` | read per-feature metrics |
198+
| `GET` | `/monitoring/metrics/feature_views` | read feature-view summaries |
199+
| `GET` | `/monitoring/metrics/feature_services` | read feature-service summaries |
200+
| `GET` | `/monitoring/metrics/baseline` | read baseline metrics |
201+
| `GET` | `/monitoring/metrics/timeseries` | read trend data for charts and alerts |
202+
203+
The transient compute endpoint is useful for exploration. If someone wants to inspect a very specific date range, Feast can compute fresh metrics and return them directly without storing them as part of the scheduled monitoring history.
204+
205+
## Production shape
206+
207+
A typical production setup now looks like this:
208+
209+
1. Add `data_quality_monitoring.auto_baseline: true` to `feature_store.yaml`
210+
2. Run `feast apply` to register features and compute baseline metrics
211+
3. Schedule `feast monitor run` for batch metrics
212+
4. Enable feature-service logging and schedule `feast monitor run --source-type log` for production serving metrics
213+
5. Use the UI to investigate feature health and distribution changes
214+
6. Use REST APIs to connect monitoring results to alerting, orchestration, or custom dashboards
215+
216+
Monitoring also respects Feast's existing authorization model. Compute operations require update permissions, while reads and transient exploration require describe permissions. That keeps the new DQM surface aligned with the rest of the registry and feature-store API.
217+
218+
## What's next
219+
220+
Feast 0.64 makes DQM part of the feature store instead of an integration around it. The release adds the backend compute path, the CLI, the REST API, and the UI surface in one coherent workflow.
221+
222+
The next step for users is simple: enable baselines, run monitoring jobs on the same cadence as your data pipelines, and use the UI to make feature quality visible to the teams that own production models.
223+
224+
For setup details, see the [Feature Quality Monitoring guide](/docs/how-to-guides/feature-monitoring) and the [0.64.0 changelog](https://github.com/feast-dev/feast/blob/master/CHANGELOG.md#0640-2026-06-13).
3.29 MB
Loading
682 KB
Loading
521 KB
Loading
484 KB
Loading

0 commit comments

Comments
 (0)