Skip to main content
detectkit

PyPI version Python Docs & playground

Metric monitoring with automatic anomaly detection.

detectkit is a Python library for data analysts and engineers to monitor time-series metrics with automatic anomaly detection and alerting. dbt-like project structure and CLI.

Website, docs & live playground → dtk.pipelab.dev

Features

  • Pure numpy arrays — no pandas dependency in core logic
  • Statistical detectors — Z-Score, MAD, IQR, Manual Bounds, and a prediction-based Autoreg (AR) detector for fast-moving, non-seasonal metrics
  • Trend & seasonality handling — seasonality grouping, recency weighting (half_life), robust linear detrending for slowly drifting metrics
  • Multi-channel alerting — Mattermost, Slack, Telegram, Email, Webhook
  • @mentions — tag users/groups in alerts, each channel formats natively
  • Alert lifecycle — consecutive anomalies, fraction-of-window rule (anomaly_window + min_anomaly_share), cooldown, recovery notifications, no-data alerts
  • Project-level error alerts — catch DB outages and pipeline crashes once per run
  • Database agnostic — ClickHouse, PostgreSQL, MySQL
  • Idempotent — resume from interruptions, no duplicate processing
  • CLIdtk init, dtk run --select, dtk unlock, dtk clean, tag-based selectors
  • AI-native onboardingdtk init-claude sets up Claude Code context (CLAUDE.md + rules + three skills) so an assistant can scaffold metrics, configure databases, and file feedback upstream

Installation

pip install detectkit

With database drivers:

pip install detectkit[clickhouse]   # ClickHouse
pip install detectkit[all-db]       # All databases

Quick Start

CLI (Recommended)

# Create project
dtk init my_monitoring
cd my_monitoring

# Optional: set up Claude Code context so an AI assistant can help you
# write metrics, tune detectors and configure alerts (re-run after upgrades)
dtk init-claude

# Configure database in profiles.yml, then:
dtk run --select cpu_usage
dtk run --select tag:critical
dtk run --select cpu_usage --steps load,detect
dtk run --select cpu_usage --from 2024-01-01

# Clear a stuck lock left by a crashed run (e.g. DB restarted mid-run)
dtk unlock --select cpu_usage

# Prune data orphaned by config edits (dry-run; add --execute to apply)
dtk clean --select cpu_usage

Metric Configuration

# metrics/api_errors.yml
name: api_error_rate
interval: "5min"

query: |
  SELECT
    toStartOfInterval(timestamp, INTERVAL 5 MINUTE) AS timestamp,
    countIf(status_code >= 500) / count() * 100 AS value
  FROM http_requests
  WHERE timestamp >= '{{ dtk_start_time }}' AND timestamp < '{{ dtk_end_time }}'
  GROUP BY timestamp ORDER BY timestamp

detectors:
  - type: mad
    params:
      threshold: 3.0                 # in sigma-equivalents
      window_size: 2016              # 7 days of 5-min points
      window_weights: exponential    # optional: favor recent data
      half_life: "1d"                # weight halves every day of age

alerting:
  enabled: true
  channels: [mattermost_ops]
  consecutive_anomalies: 3
  direction: "up"
  mentions: [oncall_engineer, here]
  alert_cooldown: "30min"
  notify_on_recovery: true
  suppress_until: "2026-04-11 18:00:00"  # Suppress alerts until this UTC time

Python API

import numpy as np
from detectkit.detectors.statistical import ZScoreDetector

detector = ZScoreDetector(threshold=3.0, window_size=100)
results = detector.detect({
    'timestamp': np.array([...], dtype='datetime64[ms]'),
    'value': np.array([1.0, 2.0, 1.5, 10.0, 1.8]),
})

for r in results:
    if r.is_anomaly:
        print(f"Anomaly at {r.timestamp}: {r.value}")

Documentation

Requirements

  • Python 3.10+
  • numpy >= 1.24.0
  • pydantic >= 2.0.0
  • click >= 8.0
  • PyYAML >= 6.0
  • Jinja2 >= 3.0

License

MIT License — see LICENSE for details.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

detectkit-0.52.1.tar.gz (381.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

detectkit-0.52.1-py3-none-any.whl (454.8 kB view details)

Uploaded Python 3

File details

Details for the file detectkit-0.52.1.tar.gz.

File metadata

  • Download URL: detectkit-0.52.1.tar.gz
  • Upload date:
  • Size: 381.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for detectkit-0.52.1.tar.gz
Algorithm Hash digest
SHA256 f05bdd89800764fe1582623a8cecdf38e797284f6354a8698fd3b23c3de99b4a
MD5 8ee2a5ea2f047068b9cafd91bc66def8
BLAKE2b-256 be25021a1c208e8f2d08c0c24f15b95d140c665cef4de513b19be6a7550da7ab

See more details on using hashes here.

Provenance

The following attestation bundles were made for detectkit-0.52.1.tar.gz:

Publisher: publish.yml on alexeiveselov92/detectkit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file detectkit-0.52.1-py3-none-any.whl.

File metadata

  • Download URL: detectkit-0.52.1-py3-none-any.whl
  • Upload date:
  • Size: 454.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for detectkit-0.52.1-py3-none-any.whl
Algorithm Hash digest
SHA256 79e8f1b489d1e58142ffd4ad7e713bd46ce25d41795e7c2b4017a31286192eee
MD5 36f7e52917cd7d97ed2c33aadc8e1fcd
BLAKE2b-256 c83f2eb02c0ddecc890f4d6e994ddcd13d0806178b895a0a42eec0932404072c

See more details on using hashes here.

Provenance

The following attestation bundles were made for detectkit-0.52.1-py3-none-any.whl:

Publisher: publish.yml on alexeiveselov92/detectkit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page