chops
ClickHouse Operations CLI — health checks, data quality profiling, schema migrations, and observability from your terminal.
No more copy-pasting system table queries. One command to check cluster health, profile data quality, manage schema migrations, or find slow queries.
Quick Start
# Run directly with uvx (no install needed)
uvx chops health summary
# Or install with pip
pip install chops
Configuration
Set environment variables or pass flags:
export CLICKHOUSE_HOST=localhost
export CLICKHOUSE_PORT=8123
export CLICKHOUSE_USER=default
export CLICKHOUSE_PASSWORD=
Or use flags: chops --host myserver --user admin health summary
Config File
Create chops.toml (or .chops.toml) in your project directory, or ~/.config/chops/config.toml for global settings:
host = "localhost"
user = "default"
[profiles.prod]
host = "prod-cluster.example.com"
user = "admin"
password = "secret"
database = "analytics"
[profiles.staging]
host = "staging.example.com"
user = "readonly"
Use profiles with --profile or the CHOPS_PROFILE env var:
chops --profile prod health summary
CHOPS_PROFILE=staging chops dq profile events
Commands
Health & Observability
| Command | Description |
|---|---|
chops health summary |
Cluster overview: version, uptime, databases, tables, parts, merges, queries |
chops health table-sizes |
Disk usage by table, sorted by size |
chops health slow-queries |
Top N slowest queries from query log |
chops health merges |
Currently running merge operations |
chops health running-queries |
Active queries with elapsed time and memory |
chops health replication |
Replication status with lag and queue metrics |
chops health partitions |
Partition analysis: detect merge pressure |
Data Quality
| Command | Description |
|---|---|
chops dq profile <table> |
Column-level profiling: null rates, cardinality, min/max |
chops dq drift <table> |
Detect schema and data quality drift vs last snapshot |
chops dq check <table> |
Run quality checks with configurable thresholds (CI-friendly exit codes) |
chops dq freshness <table> |
Time since last row — OK/WARNING/CRITICAL with exit codes |
chops dq anomalies <table> |
Detect anomalies in daily row counts vs historical baseline |
chops dq compare <t1> <t2> |
Compare schema and row counts between two tables |
Ad-hoc Query
| Command | Description |
|---|---|
chops query <sql> |
Run any SQL query with table, JSON, or CSV output |
Schema Migrations
| Command | Description |
|---|---|
chops migrate init |
Create migrations directory |
chops migrate new <name> |
Generate a timestamped migration file with up/down sections |
chops migrate status |
Show applied vs pending migrations |
chops migrate up |
Apply pending migrations (all or --steps N) |
chops migrate down --confirm |
Revert most recent migration(s) |
chops migrate validate |
Validate migration files: structure, naming, content |
Examples
# Quick cluster health check
chops health summary
# Find which tables are eating disk
chops health table-sizes --limit 10
# Slowest queries in the last 6 hours
chops health slow-queries --hours 6
# Profile a table's data quality
chops dq profile mydb.events
# Run quality checks in CI (non-zero exit on failure)
chops dq check mydb.events --max-null-pct 5 --min-rows 1000
# Check if a streaming table is still receiving data
chops dq freshness mydb.events --warn 60 --critical 1440
# Detect row count anomalies (z-score based)
chops dq anomalies mydb.events --days 14
# Compare schemas between tables
chops dq compare mydb.events mydb.events_v2
# Ad-hoc query with different output formats
chops query "SELECT database, count() FROM system.tables GROUP BY database"
chops query "SELECT * FROM mydb.events LIMIT 10" --format json
chops query "SELECT * FROM mydb.events LIMIT 10" --format csv
# JSON output for automation
chops dq profile mydb.events --output json
# Schema migrations
chops migrate init
chops migrate new "add_user_scores_table"
chops migrate up
chops migrate status
chops migrate down --confirm
Migration files use a simple format with -- migrate:up and -- migrate:down sections:
-- migrate:up
CREATE TABLE mydb.user_scores (
user_id UInt64,
score Float32,
updated_at DateTime DEFAULT now()
)
ENGINE = ReplacingMergeTree(updated_at)
ORDER BY user_id;
-- migrate:down
DROP TABLE IF EXISTS mydb.user_scores;
CI/CD Integration
chops dq check and chops dq freshness return non-zero exit codes on failure, making them usable in CI pipelines:
- name: Data quality gate
run: |
chops dq check production.orders --max-null-pct 2 --min-rows 10000
chops dq freshness production.orders --warn 30 --critical 120
Development
git clone https://github.com/antonio-mello-ai/chops.git
cd chops
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
# Run tests
pytest
# Lint
ruff check src/ tests/
# Type check
mypy src/
License
MIT
Metadata
Release files for chops 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| chops-1.0.0.tar.gz | 63.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| chops-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 85.7 kB
Release files / chops-1.0.0.tar.gz
| Download URL | chops-1.0.0.tar.gz |
|---|---|
| Size | 63.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
831f95f5c306c7d3126c29698605b95ce03f5b2e201de630ae3467d09a186fbf
|
|
BLAKE2b-256 checksum How to use checksums |
c4b145dbcac1efd46dc8d33fcbc020086469080aca7d344a6eea8d98c83a121b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Mar 10, 2026.
Transparency logRelease files / chops-1.0.0-py3-none-any.whl
| Download URL | chops-1.0.0-py3-none-any.whl |
|---|---|
| Size | 21.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
fc4e52caabb674ac012c65b2ec47a921de5eacd7018d992faf363455daaad397
|
|
BLAKE2b-256 checksum How to use checksums |
037dd71f72743162b8352fe0d4ce0b29be00c7340502e6ce6378b7b0c679d871
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Mar 10, 2026.
Transparency log