Skip to content

Commit c6539e1

Browse files
committed
fix: Review comments fixed
Signed-off-by: Jitendra Yejare <11752425+jyejare@users.noreply.github.com>
1 parent d8e42ea commit c6539e1

4 files changed

Lines changed: 33 additions & 29 deletions

File tree

docs/how-to-guides/feature-monitoring.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,16 @@ Done!
4343
The baseline reads all available source data and stores the resulting statistics with `is_baseline=TRUE`. This serves as the reference distribution for future drift detection.
4444

4545
Baseline computation is:
46-
- **Non-blocking**`feast apply` returns immediately; computation runs asynchronously
46+
- **Threaded**runs in a background thread but completes before `feast apply` exits
4747
- **Idempotent** — only features without existing baselines are computed; re-running `feast apply` won't recompute existing baselines
4848

49-
### Disabling auto-baseline
49+
### Enabling auto-baseline
5050

51-
To skip automatic baseline computation on `feast apply`, set the DQM config in `feature_store.yaml`:
51+
To enable automatic baseline computation on `feast apply`, set the DQM config in `feature_store.yaml`:
5252

5353
```yaml
54-
DataQualityMonitoring:
55-
auto_baseline: false
54+
data_quality_monitoring:
55+
auto_baseline: true
5656
```
5757
5858
When using the Feast operator, set this in the `FeatureStore` CR:
@@ -63,9 +63,11 @@ kind: FeatureStore
6363
spec:
6464
feastProject: my_project
6565
dataQualityMonitoring:
66-
autoBaseline: false
66+
autoBaseline: true
6767
```
6868

69+
To disable it, set `auto_baseline: false` (or `autoBaseline: false` in the CR).
70+
6971
## 3. Scheduled monitoring with the CLI
7072

7173
### Auto mode (recommended for production)

sdk/python/feast/ui_server.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def _setup_rest_mode(app: FastAPI, store: "feast.FeatureStore"):
8181
grpc_handler = RegistryServer(store.registry)
8282

8383
rest_app = FastAPI(root_path="/api/v1")
84-
register_all_routes(rest_app, grpc_handler)
84+
register_all_routes(rest_app, grpc_handler, store=store)
8585

8686
class PushRequest(BaseModel):
8787
push_source_name: str

ui/src/pages/Sidebar.tsx

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -185,15 +185,6 @@ const SideNav = () => {
185185
),
186186
isSelected: useMatchSubpath(`${baseUrl}/monitoring`),
187187
},
188-
{
189-
name: "Data Labeling",
190-
id: htmlIdGenerator("dataLabeling")(),
191-
icon: <EuiIcon type="documentEdit" color="#006BB4" />,
192-
renderItem: (props) => (
193-
<Link {...props} to={`${baseUrl}/data-labeling`} />
194-
),
195-
isSelected: useMatchSubpath(`${baseUrl}/data-labeling`),
196-
},
197188
{
198189
name: "Permissions",
199190
id: htmlIdGenerator("permissions")(),

ui/src/pages/monitoring/components/TimeSeriesAnalysis.tsx

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ const niceYTicks = (min: number, max: number, count = 5): number[] => {
7575
interface LineSeriesData {
7676
label: string;
7777
color: string;
78+
dashArray?: string;
7879
points: { x: number; y: number; date: string; value: number }[];
7980
}
8081

@@ -176,14 +177,16 @@ const renderMultiLineChart = (
176177
.join(" ");
177178
return (
178179
<g key={si}>
179-
<path d={pathD} fill="none" stroke={s.color} strokeWidth={2} />
180+
<path d={pathD} fill="none" stroke={s.color} strokeWidth={2} strokeDasharray={s.dashArray} />
180181
{sorted.map((p, i) => (
181182
<circle
182183
key={i}
183184
cx={scaleX(p.x)}
184185
cy={scaleY(p.value)}
185-
r={3}
186+
r={s.dashArray ? 4 : 3}
186187
fill={s.color}
188+
stroke={s.dashArray ? "#fff" : undefined}
189+
strokeWidth={s.dashArray ? 1 : undefined}
187190
/>
188191
))}
189192
</g>
@@ -292,7 +295,7 @@ const renderAreaChart = (
292295
);
293296
};
294297

295-
const Legend = ({ items }: { items: { label: string; color: string }[] }) => (
298+
const Legend = ({ items }: { items: { label: string; color: string; dashed?: boolean }[] }) => (
296299
<div
297300
style={{
298301
display: "flex",
@@ -304,14 +307,20 @@ const Legend = ({ items }: { items: { label: string; color: string }[] }) => (
304307
>
305308
{items.map((item, i) => (
306309
<div key={i} style={{ display: "flex", alignItems: "center", gap: 4 }}>
307-
<div
308-
style={{
309-
width: 12,
310-
height: 12,
311-
backgroundColor: item.color,
312-
borderRadius: 2,
313-
}}
314-
/>
310+
{item.dashed ? (
311+
<svg width={16} height={12}>
312+
<line x1={0} y1={6} x2={16} y2={6} stroke={item.color} strokeWidth={2} strokeDasharray="4,2" />
313+
</svg>
314+
) : (
315+
<div
316+
style={{
317+
width: 12,
318+
height: 12,
319+
backgroundColor: item.color,
320+
borderRadius: 2,
321+
}}
322+
/>
323+
)}
315324
<span style={{ fontSize: 12, color: "#343741" }}>{item.label}</span>
316325
</div>
317326
))}
@@ -392,9 +401,11 @@ const NumericTimeSeries = ({
392401
label: string,
393402
color: string,
394403
accessor: (m: FeatureMetric) => number | null,
404+
dashArray?: string,
395405
): LineSeriesData => ({
396406
label,
397407
color,
408+
dashArray,
398409
points: metrics
399410
.filter((m) => accessor(m) !== null)
400411
.map((m) => ({
@@ -405,7 +416,7 @@ const NumericTimeSeries = ({
405416
})),
406417
});
407418
return [
408-
build("Mean", COLORS[0], (m) => m.mean),
419+
build("Mean", COLORS[0], (m) => m.mean, "6,3"),
409420
build("P50", COLORS[1], (m) => m.p50),
410421
build("P95", COLORS[2], (m) => m.p95),
411422
];
@@ -431,7 +442,7 @@ const NumericTimeSeries = ({
431442
</div>
432443
<Legend
433444
items={[
434-
{ label: "Mean", color: COLORS[0] },
445+
{ label: "Mean", color: COLORS[0], dashed: true },
435446
{ label: "P50", color: COLORS[1] },
436447
{ label: "P95", color: COLORS[2] },
437448
]}

0 commit comments

Comments
 (0)