Skip to main content

Expose your business metrics to Found with a few lines — no manual snapshot endpoint.

Project description

found-sdk

Отдавай метрики своего бизнеса в Found в несколько строк — без ручного endpoint'а, без возни с авторизацией и форматом JSON.

pip install found-sdk[fastapi]   # или found-sdk[flask]

Не на Python? Есть Node/TypeScript-версия: npm install found-sdk (в этом репозитории — папка node/).

Как это работает

Found читает (pull) метрики с твоего бэкенда: раз в N часов делает GET <твой_url>/api/found/snapshot с заголовком Authorization: Bearer <ключ>. found-sdk поднимает этот endpoint за тебя: проверяет ключ, собирает самодокументируемый JSON и отдаёт его Found. Всё, что делаешь ты — описываешь метрики.

Быстрый старт (FastAPI)

import os
from fastapi import FastAPI
from found_sdk import FoundSnapshot

app = FastAPI()
found = FoundSnapshot.from_env()          # читает BUSINESS_API_KEY / BUSINESS_NAME / ...

@found.kpi("active_subscribers", label="Активные подписчики", delta="+1")
def subs():
    return db.count_active()

@found.kpi("mrr_rub", label="MRR", unit="₽")
def mrr():
    return billing.mrr()

@found.custom("server_load_pct", label="Загрузка серверов", unit="%")
def load():
    return monitoring.avg_cpu()

@found.issues
def issues():
    return [{"severity": "warning", "text": "Сервер Germany #2 CPU 94%"}]

app.include_router(found.fastapi_router())   # монтирует GET /api/found/snapshot

Flask

from flask import Flask
from found_sdk import FoundSnapshot

app = Flask(__name__)
found = FoundSnapshot.from_env()

@found.kpi("mrr_rub", label="MRR", unit="₽")
def mrr():
    return 2740

app.register_blueprint(found.flask_blueprint())

Любой другой фреймворк

Используй handle() напрямую — он сам делает авторизацию и сборку:

status, body = found.handle(request.headers, remote_addr=request.remote_addr)
return JSONResponse(body, status_code=status)

Настройка

FoundSnapshot.from_env() читает переменные из блока .env, который выдаёт Found:

Переменная Назначение
BUSINESS_API_KEY Ключ из Found (обязательно)
BUSINESS_SNAPSHOT_PATH Путь endpoint'а (по умолчанию /api/found/snapshot)
BUSINESS_NAME Название бизнеса
FOUND_SANDBOX 1/true → режим только чтения

Либо явно:

found = FoundSnapshot(
    api_key=os.environ["BUSINESS_API_KEY"],
    business_name="SkyVPN",
    sandbox=True,
    allowed_ips=["203.0.113.10"],   # необязательно: разрешить только egress-IP Found
    provider_timeout=5.0,           # мягкий тайм-аут на каждый провайдер метрики
)

Безопасность

  • Сравнение ключа через hmac.compare_digest — без тайм-атак.
  • Ключ никогда не логируется и не попадает в текст ошибок.
  • Sandbox (FOUND_SANDBOX=1) → meta.sandbox=true, Found только читает.
  • Read-only: endpoint ничего не меняет в твоём бизнесе by design.
  • IP-allowlist (опционально): ограничь доступ egress-адресом Found.
  • Изоляция сбоев: если один провайдер метрики упал или завис — он пропускается, остальной snapshot отдаётся. Один кривой запрос не роняет весь endpoint.

Запускай endpoint только по HTTPS.

Формат ответа

SDK собирает самодокументируемый JSON, который Found понимает автоматически:

{
  "meta":   { "synced_at": "2026-06-30T15:00:00+00:00", "sandbox": true },
  "business_name": "SkyVPN",
  "period": "last_24h",
  "health": "warning",
  "kpis":   { "mrr_rub": { "value": 2740, "label": "MRR", "unit": "₽" } },
  "custom": { "server_load_pct": { "value": 72, "label": "Загрузка серверов", "unit": "%" } },
  "issues": [{ "severity": "warning", "text": "Germany #2 CPU 94%" }]
}

Агент видит кастомные поля как business.custom.server_load_pct — добавлять новые метрики можно без правок кода Found.

Разработка

pip install -e .[dev]
pytest

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

found_sdk-0.1.0.tar.gz (12.6 kB view details)

Uploaded Source

Built Distribution

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

found_sdk-0.1.0-py3-none-any.whl (10.8 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for found_sdk-0.1.0.tar.gz
Algorithm Hash digest
SHA256 7be02cb0b832d9a12fb44f4ee994b15ccf473f9541b69de588512a49deb76371
MD5 e856d6677c8e1d46bc1e655d35046f58
BLAKE2b-256 413051da8e81e1e0ea0800ab453032b8225f7625dbbe9971c10bf1dba0794806

See more details on using hashes here.

Provenance

The following attestation bundles were made for found_sdk-0.1.0.tar.gz:

Publisher: python-release.yml on nikitadyachkov1970-pixel/found-sdk

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

File details

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

File metadata

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

File hashes

Hashes for found_sdk-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 5fad93e1f6405ae4ae32833cae2ec23f10aafdc7e0de17488cd5b27d3d39bdc2
MD5 a9a797312441c94b8bc34378666da151
BLAKE2b-256 00093e3e71b29f3567673de30817098432e35757bad49a0a96ba41174dbe5b3e

See more details on using hashes here.

Provenance

The following attestation bundles were made for found_sdk-0.1.0-py3-none-any.whl:

Publisher: python-release.yml on nikitadyachkov1970-pixel/found-sdk

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

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