Lightweight metadata extraction probes — 135 probes across 35 data sources
Project description
metapod
Lightweight metadata and quality probes for the target platform. Runs inside your network (VPN, Azure, on-prem) and extracts only metadata — no raw data leaves the perimeter.
Quick start (Python)
# Install
pip install -e ".[oracle]"
# Create config
python cli.py init
# Edit config.yaml with your Oracle credentials
# List available probes
python cli.py list-probes
# Run all Oracle metadata probes
python cli.py run "oracle.metadata.*" --schema RISK_MGMT
# Run all probes (metadata + quality)
python cli.py run "oracle.*" --schema RISK_MGMT
# Run a single probe
python cli.py run oracle.metadata.tables --schema RISK_MGMT
# Run and push results to target platform
python cli.py run "oracle.*" --schema RISK_MGMT --push
Quick start (Docker)
docker build -t metapod .
docker run -v $(pwd)/config.yaml:/app/config.yaml -v $(pwd)/output:/app/output \
metapod "oracle.metadata.*"
Available probes
Oracle metadata (9 probes)
| Probe | Source | Extracts |
|---|---|---|
oracle.metadata.tables |
ALL_TABLES | Table names, row counts, tablespace |
oracle.metadata.columns |
ALL_TAB_COLUMNS | Column names, types, nullable, position |
oracle.metadata.views |
ALL_VIEWS | View SQL definitions |
oracle.metadata.source_code |
ALL_SOURCE | PL/SQL: procedures, functions, packages, triggers |
oracle.metadata.synonyms |
ALL_SYNONYMS | Private + public synonym mappings |
oracle.metadata.db_links |
ALL_DB_LINKS | Database link definitions |
oracle.metadata.constraints |
ALL_CONSTRAINTS | PK, FK, unique constraints with columns |
oracle.metadata.indexes |
ALL_INDEXES | Index types and column compositions |
oracle.metadata.comments |
ALL_TAB/COL_COMMENTS | Business descriptions |
Oracle quality (5 probes)
| Probe | Method | Measures |
|---|---|---|
oracle.quality.null_ratio |
Sampled COUNT | NULL % per column |
oracle.quality.distinct_count |
Oracle stats | Cardinality per column |
oracle.quality.min_max |
Oracle stats | Value ranges for numeric/date |
oracle.quality.freshness |
LAST_ANALYZED | Data staleness in days |
oracle.quality.pattern_check |
REGEXP_LIKE | PII patterns (email, phone, SSN, IBAN) |
Architecture
Customer network (VPN / Azure / on-prem)
┌─────────────────────────────────────────┐
│ metapod │
│ ├── oracle.metadata.* → local JSON │
│ ├── oracle.quality.* → local JSON │
│ └── --push → HTTPS to target platform API │
└────────────────┬────────────────────────┘
│ outbound HTTPS only
▼
┌─────────────────────────────────────────┐
│ the target platform Platform │
│ └── Metastore (MinIO) │
│ └── probes/oracle/metadata/*.json │
└─────────────────────────────────────────┘
- Zero inbound access — only outbound HTTPS to target platform API
- No raw data — only metadata (schema structure, statistics, descriptions)
- Local-first — results written to
./output/before optional push - Config-driven — YAML file, no code changes per deployment
Configuration
source:
type: oracle
host: prod-db.example.com
port: 1521
service_name: ORCLPDB1
username: metadata_reader
password: "${ORACLE_PASSWORD}"
schema_name: RISK_MGMT
target:
url: https://your-platform.example.com
api_key: "${METAPOD_API_KEY}"
project: default
output_dir: ./output
Output format
Every probe produces a standard JSON envelope:
{
"probe": "oracle.metadata.tables",
"source": {"type": "oracle", "id": "prod-db:1521/ORCLPDB1/RISK_MGMT"},
"timestamp": "2026-03-27T23:00:00Z",
"records": [...],
"record_count": 42,
"duration_ms": 350
}
Adding probes
Create a new file in probes/oracle/metadata/ or probes/oracle/quality/:
from core.base_probe import BaseProbe
from core.registry import register
@register
class MyProbe(BaseProbe):
@staticmethod
def probe_name() -> str:
return "oracle.metadata.my_probe"
@staticmethod
def description() -> str:
return "What this probe extracts"
def execute(self, connection, schema: str, **kwargs) -> list[dict]:
with connection.cursor() as cur:
cur.execute("SELECT ... FROM all_... WHERE owner = :schema", schema=schema.upper())
return [{"col": row[0]} for row in cur.fetchall()]
License
Apache 2.0
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file metapod_probes-0.1.1.tar.gz.
File metadata
- Download URL: metapod_probes-0.1.1.tar.gz
- Upload date:
- Size: 82.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a7deff6b3ad6aaf31059af643d163ee4ba1eee4a228f51ddd5726dded63fa6ce
|
|
| MD5 |
68e17ca0b06ad801f93e6fb4a8974773
|
|
| BLAKE2b-256 |
b1da0d32f917a3908eac24bc0214fcb5636b83deba2606ffe40474cfcd60b9e1
|
File details
Details for the file metapod_probes-0.1.1-py3-none-any.whl.
File metadata
- Download URL: metapod_probes-0.1.1-py3-none-any.whl
- Upload date:
- Size: 185.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
47c5540e77d8aeaebbb9d932efcddcf75cfc3c768885a1aecb775a07e99c61fc
|
|
| MD5 |
eec45fe0f5e1632e26e1df5bd3244aa3
|
|
| BLAKE2b-256 |
141ca40cc80dea4919825e3f0a200f1d84d619d987d9bdecdeb55beed14b598e
|