Skip to main content

Python SDK for DuckStat monitoring API

Project description

duckstat

Python SDK для DuckStat — мониторинг серверов, сайтов и сервисов.

Установка

pip install duckstat

Или напрямую из репозитория:

pip install git+https://github.com/duckstat/python-sdk.git

Быстрый старт

from duckstat import DuckStat

ds = DuckStat("ds_live_ваш_ключ")

# Проверка подключения
ds.ping()

# Список серверов
for agent in ds.agents():
    print(f"{agent.name}: {'online' if agent.online else 'offline'}")
    if agent.cpu is not None:
        print(f"  CPU: {agent.cpu}%  RAM: {agent.ram_pct}%  Disk: {agent.disk_pct}%")

Серверы (Agents)

# Все серверы
agents = ds.agents()

# Конкретный сервер (с docker, ports, processes)
server = ds.agent("uuid")

# История метрик (последний час)
metrics = ds.agent_metrics("uuid", limit=60)
for m in metrics:
    print(f"{m.timestamp}: CPU {m.cpu_usage}%")

# Удобные шорткаты
offline = ds.offline_agents()
hot = ds.overloaded_agents(cpu_threshold=85)

Мониторы

# Все мониторы
monitors = ds.monitors()
for m in monitors:
    print(f"{m.name} ({m.type}): {'UP' if m.is_up else 'DOWN'}")

# История проверок
checks = ds.monitor_checks("uuid", limit=50)

# Аптайм за 7 дней
uptime = ds.monitor_uptime("uuid", range="7d")
print(f"Uptime: {uptime.uptime_pct}%  Avg response: {uptime.avg_response_ms}ms")

# Кто упал?
down = ds.all_down()

Инциденты

# Открытые инциденты
for inc in ds.incidents(status="OPEN"):
    print(f"{inc.monitor_name}: {inc.cause}{inc.started_at})")

# Все инциденты
all_incidents = ds.incidents(limit=100)

Webhooks

Для проверки подписи входящих вебхуков:

from duckstat import verify_webhook

# Flask пример
@app.route("/webhook", methods=["POST"])
def handle_webhook():
    sig = request.headers["X-DuckStat-Signature"]
    if not verify_webhook("whsec_ваш_секрет", request.data, sig):
        abort(401)

    event = request.json
    if event["event"] == "incident.open":
        send_alert(event["data"]["monitor"]["name"])
    return "ok"

Примеры

Скрипт мониторинга в cron

from duckstat import DuckStat
import smtplib

ds = DuckStat("ds_live_...")

# Алерт если что-то упало
down = ds.all_down()
if down:
    names = ", ".join(m.name for m in down)
    print(f"DOWN: {names}")
    # send_email(...)

# Алерт если сервер перегружен
for a in ds.overloaded_agents(cpu_threshold=90):
    print(f"OVERLOAD: {a.name} CPU={a.cpu}%")

Сбор метрик в CSV

import csv
from duckstat import DuckStat

ds = DuckStat("ds_live_...")

with open("metrics.csv", "w", newline="") as f:
    w = csv.writer(f)
    w.writerow(["timestamp", "server", "cpu", "ram_pct", "disk_pct", "load"])
    for agent in ds.agents():
        metrics = ds.agent_metrics(agent.id, limit=1000, since="2025-01-01T00:00:00Z")
        for m in metrics:
            w.writerow([m.timestamp, agent.name, m.cpu_usage, m.ram_pct, m.disk_pct, m.load_avg1])

Grafana / Prometheus bridge

from prometheus_client import Gauge, start_http_server
from duckstat import DuckStat
import time

ds = DuckStat("ds_live_...")
cpu_gauge = Gauge("duckstat_cpu", "CPU usage", ["server"])
ram_gauge = Gauge("duckstat_ram_pct", "RAM %", ["server"])

start_http_server(9100)
while True:
    for a in ds.agents():
        if a.cpu is not None:
            cpu_gauge.labels(server=a.name).set(a.cpu)
        if a.ram_pct is not None:
            ram_gauge.labels(server=a.name).set(a.ram_pct)
    time.sleep(30)

API Reference

Метод Описание
ds.ping() Проверка ключа
ds.agents() Список серверов
ds.agent(id) Детали сервера
ds.agent_metrics(id, limit, since) История метрик
ds.monitors() Список мониторов
ds.monitor(id) Детали монитора
ds.monitor_checks(id, limit, since) История проверок
ds.monitor_uptime(id, range) Аптайм
ds.incidents(status, limit) Инциденты
ds.incident(id) Детали инцидента
ds.all_down() Упавшие мониторы
ds.offline_agents() Офлайн серверы
ds.overloaded_agents(cpu) Перегруженные серверы
verify_webhook(secret, payload, sig) Проверка подписи вебхука

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

duckstat-0.1.0.tar.gz (7.3 kB view details)

Uploaded Source

Built Distribution

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

duckstat-0.1.0-py3-none-any.whl (7.6 kB view details)

Uploaded Python 3

File details

Details for the file duckstat-0.1.0.tar.gz.

File metadata

  • Download URL: duckstat-0.1.0.tar.gz
  • Upload date:
  • Size: 7.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for duckstat-0.1.0.tar.gz
Algorithm Hash digest
SHA256 c6cad50e56c9805ee2c36fdf52f37bbb049d3062117ed4f27653958a08f2d39a
MD5 9e6a04d8317227565eb18bf18c0e2abb
BLAKE2b-256 828b4513a524431507f4e7d8af8520bff2bfdd08b809ff1525ba3b3bdac230d1

See more details on using hashes here.

File details

Details for the file duckstat-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: duckstat-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 7.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for duckstat-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4f01b9b833840bbd6fec4ab01c4d7e08c39eba5302ba1793705f8b48178820ad
MD5 a2f921fa1d0b8f6aafeee4e39bcc8557
BLAKE2b-256 79c9bf2aa266ba9826c93402f1ad16f30d3e16c22ee8f5e34b16e89b1d6e8800

See more details on using hashes here.

Supported by

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