Commit Graph

70 Commits

Author SHA1 Message Date
mo d05fe403a2 fix(datasources): MySQL browser race + slow row counts
When switching source engine, the sample effect fired with the previous
engine selected object (e.g. public.sales_orders against MySQL), surfacing
"Table hr.sales_orders doesn't exist". Track which engine the selected
object belongs to and only sample when it matches the active engine, plus
guard against stale responses overwriting newer ones.

Row-count for the browser used an exact count(*) which full-scanned huge
tables (~30s on 24M rows). Use planner/statistics estimates and only run a
time-bounded exact count for small (<=50k) tables.
2026-06-28 10:10:17 +00:00
mo 1432a8429a feat(storage): inline preview for json/csv/log/text files
Add a /preview endpoint that range-reads the first chunk of an object and
returns it as text. Browser gets an eye action (list + gallery) opening a
modal that pretty-prints JSON, renders CSV/TSV as a table, and shows logs/
text/yaml/xml verbatim, with a truncation note and download link.
2026-06-27 23:08:59 +00:00
mo a408ed4423 feat(storage): image gallery with thumbnails + lightbox
Add a List/Gallery toggle to the bucket browser that auto-switches to a
thumbnail grid when a listing is mostly images, and a keyboard-navigable
lightbox (prev/next/esc) for full-size previews. Download endpoint serves
inline with the correct image/* content-type (ECS stores octet-stream) so
previews render instead of forcing a download.
2026-06-27 22:59:50 +00:00
mo 930cd15f87 feat(storage): breadth-first analytics + recursive browse/search
Analytics now walks every top-level prefix with its own budget instead of a
flat alphabetical scan, so a single huge prefix (kafka/ CDC json) no longer
hides the rest — composition now correctly reflects images, logs, csv,
parquet and avro, and reports true total size.

Browser gains recursive (whole-subtree) listing, free-text name search,
file-type filter chips, type column and Load-more pagination so every object
across all folders is discoverable.
2026-06-27 22:12:04 +00:00
mo 3a6ee8e2b0 feat(storage): rich Object Storage analytics dashboard
Add /api/storage/s3/analytics endpoint that scans buckets (bounded +
cached) to compute total size/objects, per-bucket distribution, file-type
and size-class breakdowns, cumulative data-growth timeline and largest /
recent objects. Track every S3 op routed through the API for a live
storage-activity timeline.

Rebuild StorageView into a tabbed view: Overview (KPI cards + SVG charts:
growth area, bucket donut, type/size bars, activity sparkline, top folders,
largest & recent objects) and the original bucket Browser.
2026-06-27 21:30:45 +00:00
mo cdc8aa4bf7 feat(pii): masking for Cassandra & Neo4j (graph nodes + live property read) + MongoDB payload/free-text 2026-06-27 21:10:16 +00:00
mo e2ac114863 feat(pii): add masking toggle for Hadoop nodes + entity-identifier (quasi-PII) classification 2026-06-27 21:04:30 +00:00
mo 0bdc10ae78 feat(kafka): show Hadoop (HDFS3) sink connector in Kafka Connect panel 2026-06-27 20:53:58 +00:00
mo 46b9c50e73 feat: Spark Workbench everywhere, autonomous Hadoop offload & LLM masking-aware
- Data Hub with Hadoop tab (HDFS/Iceberg browser, Spark, pipeline)
- Databricks-style Lakehouse Workbench (Trino engine, live exec matrix,
  materialize to Iceberg/S3); reused & embedded in every source-DB UI
- HDFS -> Kafka -> Spark -> Iceberg/S3 pipeline; WebHDFS hostname resolver
- Data Flow master pulse switch (Run/Pause/Stop) gating animated edges
- Data Custodian autonomous Hadoop offload loop (batch counterpart to CDC),
  pulsing source -> HDFS edges; toggle in Data Flow
- LLM now autonomously aware of all latest platform changes (live platform
  context) and enforces masking policy: never reveals masked PII, still
  answers helpfully with aggregates/explanations
2026-06-27 19:37:50 +00:00
mo 5828113f53 feat(ui): Neo4j graph explorer with interactive relationship visualization
Add Graph sub-tab in Data Sources UI for Neo4j: force-directed SVG view of
Product-Supplier nodes and SUPPLIES/RELATED_TO/PART_OF/COMPATIBLE_WITH edges.
Backend GET /api/sql/graph/neo4j with rel_type filter and edge limit.
2026-06-27 15:48:56 +00:00
mo a4c9b60079 feat(ui): Data Sources UI — enterprise browser for all 5 source databases
New "Data Sources UI" tab with per-database Browser (catalog + sample data),
Query Console (SqlWorkbench) and embedded interactive Shell (DbShell via SSH).

Backend:
- Extend sql_console.py with Cassandra (CQL) + Neo4j (Cypher) engines
- Add GET /api/sql/catalog/{engine} and GET /api/sql/sample/{engine}
- ssh_terminal: optional initial_command for auto-launching DB CLIs

Frontend:
- DataSourcesView with 5-DB rail, health dots, Browser/Console/Shell sub-tabs
- DbShell embedded xterm terminal with docker exec CLI per engine
- Deep-link topology DB nodes to Data Sources UI (no SQL dock on platform)
- WorkbenchPanel restricted to agent mode only — frees dashboard space
2026-06-27 15:42:37 +00:00
mo b8a5b10bc4 feat(openmetadata): populate Data Insights dashboard
Assign owners to all 177 tables and descriptions + tier tags to the 18
business tables, then trigger SearchIndexing + DataInsights apps so the
platform Data Insights page shows real totals, description coverage and
tier distribution instead of empty plots.
2026-06-27 15:17:02 +00:00
mo 28821e8b04 feat(openmetadata): direct-API enrichment for real sample data, profiles & end-to-end lineage
OM connectors/profiler stored data but its denormalized read path left
Sample Data/Lineage tabs effectively empty. This script populates OM directly:
- real 50-row sample data for source + iceberg curated tables
- table/column profiles (column profiles read back correctly in UI)
- full traceable lineage: generator -> source -> Debezium/Kafka CDC topic
  -> S3 archive + Iceberg curated -> Trino query layer
2026-06-27 15:03:13 +00:00
mo 21af36a591 feat(openmetadata): profiler + data-quality tests for data insight
Profiler:
- pg/mysql: table-level metrics via DB statistics (exact-ish row counts) only;
  source tables hold 24-53M rows and OM's column profiler full-scans per column
  (no TABLESAMPLE pushdown), which would hammer the live CDC source.
- trino/iceberg: full column metrics + sample data on the small (20-25k row)
  curated_masked + hadoop tables.

Data quality: 16 test cases across 5 tables (row counts on big sources; row
count + uniqueness/not-null/range on curated/masked + historical), all passing.
This populates OM's Data Quality dashboard (coverage, healthy assets,
dimensions, test results).
2026-06-27 14:55:48 +02:00
mo 8aa2324211 fix(openmetadata): relocate MySQL datadir to 32GB data disk
The OM MySQL datadir was bind-mounted on the 448MB /opt partition and kept
filling up. Moved db-data to /var/lib/docker/openmetadata-db-data (32GB, ~31GB
free) and kept binlog disabled + redo log capped. /opt back to 7% used.
2026-06-27 13:48:49 +02:00
mo e8ff760cd1 feat(openmetadata): backfill Airflow task detail + dataset lineage
OM 1.13 cannot deserialize Airflow 3.0.6 serialized DAGs, so pipelines had no
tasks. af_tasks.py parses serialized_dag and PATCHes task lists; af_lineage.py
adds generator->table and mask_to_curated/hadoop_to_trino lineage edges.

Note: OM MySQL datadir lives on the 448MB /opt partition which had filled up
(103MB binlog). Disabled binary logging + shrank redo log capacity in the OM
docker-compose to restore headroom.
2026-06-27 13:30:08 +02:00
mo 79888dc617 feat(openmetadata): ingest Elasticsearch (search) + Airflow (pipelines)
- ES: connect over https with verify_certs=false (self-signed CA); 16 indexes incl source_data
- Airflow: ingest 8 DAGs as pipelines from SQLite metadata DB snapshot
- es_run.py: standalone runner that pins the working ES TLS config
- Command Center API now wired with ELASTIC_PASSWORD
2026-06-27 12:49:30 +02:00
mo b7965f98f4 fix(openmetadata): ES ingestion - disable self-signed cert verification (boolean) 2026-06-27 12:38:45 +02:00
mo 99ca01c4d9 chore(openmetadata): add inventory probe; full-stack ingestion verified (177 tables, +Kafka/S3/Superset) 2026-06-27 12:29:44 +02:00
mo b7dab19590 feat(openmetadata): ingest full stack - Trino all catalogs + Kafka, S3, Superset, ES
Widen Trino ingestion to every catalog (postgres_sales/mysql_hr/mongodb/iceberg)
and add messaging (Kafka), storage (S3 object store), dashboards (Superset) and
search (Elasticsearch) service ingestion configs so OpenMetadata reflects the
whole running platform. Secrets are injected at run time, not committed.
2026-06-27 12:25:51 +02:00
mo ca05e04f8c fix(dataflow): clean left-to-right stage layout for the topology
Align nodes into pipeline columns (producers -> sources -> CDC -> lakehouse ->
Trino) with governance centred at the bottom, so lineage reads in order instead
of Iceberg/Trino floating mid-canvas.
2026-06-27 12:07:25 +02:00
mo 05794906a7 perf(pii): native source-DB lookups for masking enforcement
Query postgres/mysql/mongo directly (fast, early LIMIT) instead of full Trino
table scans; Trino remains the path for the curated lakehouse + as a fallback.
2026-06-27 11:44:16 +02:00
mo 215ce111f1 feat(pii): self-service per-column masking policy enforced for the LLM
- pii_catalog: persistent per-column masking policy (default masked); GET/POST
  /api/pii/policy and POST /api/pii/lookup which redacts masked values server-side.
- get_pii masked flag now reflects the policy; dataflow exposes the dataset key.
- Data Flow PII inspector: per-column lock/unlock toggles + mask-all/unmask-all,
  so operators control exactly which data the assistant may reveal.
2026-06-27 11:36:36 +02:00
mo 9fb5b0a780 feat(llm): approval-gated movement executor + rag-api agent wiring + agent UI
- decide_approval now executes the underlying data movement when an approved
  request carries an executor=movement payload (real human-gated executor).
- rag-api service gets OPENMETADATA_* (via atc.env) + COMMAND_CENTER_URL so it can
  sync the catalog and call platform tools.
- Knowledge Chat gains an Agent-mode toggle (SSE tool-loop with step chips) and a
  'Sync catalog' button.
2026-06-27 03:28:18 +02:00
mo 8263a03190 feat(llm): add governance context (CDC/movements/PII/lineage) to lab snapshot
lab_context now includes an in-process governance section so the LLM knows the
live CDC volume, data movements + last-run state, the PII catalog (OM+heuristic)
with masked/unmasked status, and source->masked lineage.
2026-06-27 03:17:35 +02:00
mo c3cacc141d feat(masking): mask_to_curated DAG + OpenMetadata lineage + versioned OM artifacts
- deploy/airflow/mask_to_curated_dag.py: Trino-SQL masking (hash/redact/generalize)
  of PII from postgres/mysql sources into iceberg.curated_masked.* (verified:
  14k+11k masked rows, all PII masked).
- OM source->masked lineage edges created; curated tables cataloged.
- Version OM compose + ingestion configs + om_api helper under deploy/openmetadata.
2026-06-27 03:13:16 +02:00
mo 944635ffe1 feat(masking): add PII columns to generators + backfill (Faker-style, no deps)
Source generators (postgres/mysql/mongodb) now emit realistic PII
(name/email/phone/ip/iban/address/national_id/dob). deploy/mask_pii_setup.py
ALTERs the source tables and backfills a bounded sample so Debezium CDC and
OpenMetadata PII auto-classification see real sensitive values.
2026-06-27 02:50:28 +02:00
mo c70639c46d feat(dataflow): add OpenMetadata governance node + catalog edges + UI link
Data Flow graph now shows OpenMetadata as a governance node linked to all
sources and Trino (catalog edges); node inspector exposes an 'Open in
OpenMetadata' deep link and PII-columns-cataloged metric.
2026-06-27 02:43:22 +02:00
mo 3b247fa2bd feat(om): OpenMetadata integration — registry node, link, PII tag source
Add OpenMetadata node (atc-docker02 .47) to node_registry with UI links.
pii_catalog now reads OM column PII tags (Presidio auto-classification) as the
authoritative source, merged with the name heuristic; OPENMETADATA_URL wired
into the api service (token via atc.env).
2026-06-27 02:40:27 +02:00
mo 6f20e24b8b feat(ui): Data Flow tab — live lineage graph + PII overlay + movement triggers
New DataFlowView (topology-style): nodes positioned from /api/dataflow with
measured-anchor SVG edges and animated particles (active CDC + running
movements). PII overlay shows shield badges + per-column detail inspector.
Bottom strip triggers ETL movements and toggles the ETL agent. Wired into
SideNav (Data Flow) and App routing; added types + api helpers.
2026-06-27 02:09:38 +02:00
mo ee9357aa31 feat(dataflow): live Data Flow graph API + PII catalog
api/dataflow.py: node-link landscape (generators->sources->CDC/Kafka->sinks,
HDFS->Iceberg, sources->curated_masked) with live overlays (movement run state,
CDC volume, Trino counts) and PII overlay. api/pii_catalog.py: column PII
classification via Trino information_schema (OM-ready). Endpoints /api/dataflow,
/api/dataflow/{id}/run, /api/pii.
2026-06-27 02:04:46 +02:00
mo a724615a9a feat(etl): Hadoop->Trino movement DAG + movements registry + autonomous ETL-agents
- DAG hadoop_to_trino (deployed to Airflow) + worker hadoop_to_trino.py (on the
  Hadoop master) move HDFS historical_sales -> iceberg.hadoop.historical_sales_hdfs.
- api/movements.py: movement registry, Airflow trigger+watch, run tracking
  (state/duration/rows), endpoints /api/movements, /{id}/run, /runs.
- agent_ops.py: ETL-agent loop autonomously triggers movements on an interval
  and logs each run; /api/agent-ops/etl/toggle + etl status.
2026-06-27 01:59:35 +02:00
mo 921342442f feat(ui): Live Changes (CDC) tab — real-time Debezium stream with filters, volume bars and before/after diff 2026-06-27 01:44:26 +02:00
mo 1a454f76cf feat(cdc): live Debezium CDC consumer + /api/changes for the Changes dashboard
Add api/cdc_consumer.py: aiokafka background consumer subscribes to the CDC
topics (postgres_sales/mysql_hr/mongodb_supplychain + cassandra/neo4j), parses
Debezium before/after envelopes, keeps a ring buffer and publishes each change
live as type=cdc_change. Endpoints /api/changes, /api/changes/stats, /status.
2026-06-27 01:31:18 +02:00
mo 5147538b05 fix(agents): use in-memory PK pools for DML (avoid full-table scans on 54M-row tables) 2026-06-27 01:27:56 +02:00
mo 3c9661e7f9 feat(agents): autonomous guard-railed DML on source DBs for Debezium CDC
Add api/agent_ops.py: background loop performs small INSERT/UPDATE/DELETE on
public.sales_orders (PG), hr.employee_events (MySQL) and supplychain.events
(Mongo). Agent rows are tagged (notes/atc_agent); UPDATE/DELETE only ever touch
agent-created rows. Env kill-switch + interval + per-tick row cap. Endpoints
/api/agent-ops/{status,toggle,run-once}. Loop started in lifespan.
2026-06-27 01:25:08 +02:00
mo 96d490807a feat(hadoop): real Hive engine + filterable, detailed analytics with lineage
Deploys Apache Hive 3.1.3 (Derby metastore + external table over the HDFS
historical CSV, MapReduce exec) on the Hadoop master, so the engine comparison
shows a REAL measured Hive latency (~5.2s) next to live Trino (~0.3s); Impala
stays clearly-labelled representative. The API re-measures Hive over SSH on a
30-min TTL (cached + persisted, with a committed seed). Adds filters
(year/region/category/channel), a region×category heatmap, Trino exec stats,
and a "where is this data read from" lineage panel (Trino->S3/Iceberg/Parquet
with snapshot+files, Hive->HDFS/CSV with namenode+files). Mounts host SSH key
read-only into the api container for the live Hive benchmark.
2026-06-26 17:08:57 +00:00
mo 71a64d5a21 feat(hadoop): embedded lakehouse analytics + Impala/Hive vs Trino comparison
Adds an Analytics sub-tab to the Hadoop view with live KPIs and revenue
breakdowns (by year/region/category/channel) queried from Trino over
iceberg.hadoop.historical_sales, plus a query-engine comparison panel. Trino
latency is measured live; Impala and Hive are shown as clearly-labelled
representative figures (those engines are not deployed). New cached endpoints
/api/hadoop/analytics and /api/hadoop/engines.
2026-06-26 15:44:43 +00:00
mo 1147826dee fix(superset): disable Secure session cookie over HTTP so mo/bart can log in
Talisman forced Secure on the session cookie while Superset is served over
plain HTTP, so browsers never returned the cookie and every login failed CSRF
validation ("CSRF session token is missing"). Set session_cookie_secure=False
(+ SESSION_COOKIE_SECURE/WTF_CSRF_SSL_STRICT). Also rename S3 lakehouse prefix
iceberg-warehouse -> hadoop (Trino iceberg.hadoop.historical_sales) and repoint
the Superset dataset. Adds sanitized infra backup scripts.
2026-06-26 15:27:34 +00:00
mo 2d14eae55f feat(historical): offload historical_sales to S3 (Iceberg/Parquet on Dell ECS), repoint dashboard, drop Postgres copy 2026-06-26 11:38:30 +00:00
mo 8437ded990 topology: add direct source->Trino federated-query edges 2026-06-26 11:16:13 +00:00
mo 37c03b6881 feat(historical): durable Postgres-backed historical_sales + repoint Superset dashboard (no Trino downtime) 2026-06-26 09:43:21 +00:00
mo be2bbcbd92 feat(cdc): app-level Cassandra+Neo4j change events to Kafka (->S3) on generate 2026-06-26 09:21:17 +00:00
mo f4cd33b784 infra: historical sales -> iceberg.historical (Trino) + Superset dashboard scripts 2026-06-26 09:04:33 +00:00
mo 88ca338f5a feat: neo4j in topology + agent-driven datagen with activity log; fix all-sources generate 2026-06-26 08:51:39 +00:00
mo 9cbdccb403 infra: fix mongodb uuid encoding + combined DAG honors rows conf 2026-06-26 08:41:44 +00:00
mo 897ccaa9f3 api: non-blocking /sync via background refresher (full-scan counts cached) 2026-06-26 01:39:53 +00:00
mo d26698a0c7 infra: hadoop historical sales loader (HDFS partitioned by year) 2026-06-26 01:26:43 +00:00
mo 2f2cecd16f infra: neo4j generator creates indexes for fast relationship MERGE 2026-06-26 01:24:56 +00:00
mo 89b31c680a infra: fix cassandra (prepared stmt) + neo4j (drop APOC, grouped MERGE) generators 2026-06-26 01:24:06 +00:00