Skip to main content

Logforma SDK package for observability event logging

Project description

logforma.ru — Визуализация и трассировка процессов внутри систем

pip install logforma-sdk

1. Быстрый Старт (минимум)

Шаг 1. Инициализация (один раз при старте сервиса)

from logforma import logforma_init

logforma_init(
    service_name="candidate_eval_service",
    service_instance_id="candidate_eval_service-1",
    queue_name="candidate_eval_service_inbound",
    log_db_queries=True,
    mask_fields={"token", "password", "email"},
    trace_level="standard",
)

Шаг 2. Декорируйте бизнес-функции

from logforma import logforma_trace

@logforma_trace()
async def validate_candidate(payload: dict) -> dict:
    return {"valid": True}

Шаг 3. Для consume-сервиса используйте logforma_consume(...)

import asyncio
from logforma import logforma_consume, logforma_trace

@logforma_trace()
async def handle_event(event: dict) -> bool:
    return True

def process_queue_event(event: dict) -> bool:
    return asyncio.run(logforma_consume(event, handle_event, seq_offset=2_000_000))

Что делает logforma_consume(...):

  • ставит consume-контекст (transaction_id, seq_no, path, flow);
  • связывает вложенные вызовы SDK в одну трассу;
  • убирает необходимость вручную писать with logforma_with_consume_event(...).

2. Какие Функции Автоматические, А Какие Нет

2.1 Автоматические (рекомендуемый путь)

Этого достаточно для большинства сервисов:

  • logforma_init(...)
  • @logforma_trace()
  • logforma_consume(...) для queue-consumer

Что SDK заполнит автоматически:

  • command.function.name (из <module>.<qualname>);
  • call_id, seq_no, тайминги;
  • service.name, service.instance.id, queue.name (из init/config/context);
  • trace_id, span_id, parent_span_id (если trace включен);
  • db_queries_preview (если включено DB-логирование и DB-клиент инструментирован).

2.2 Неавтоматические (используются вручную по необходимости)

Используйте только если внутри функции есть отдельный шаг маршрута:

  • logforma_log_publish(...) — шаг отправки в очередь;
  • logforma_log_db(...) — ручной шаг SQL (fallback, если нет instrumentation);
  • logforma_log_http(...) — шаг внешнего HTTP;
  • logforma_log_service_step(...) — ручной сервисный шаг;
  • logforma_with_context(...) — ручная установка runtime-контекста;
  • logforma_with_consume_event(...) — низкоуровневый consume-контекст (edge-cases);
  • logforma_config_module(...) — локальный override конфигурации;
  • logforma_current_context() — чтение текущего контекста;
  • logforma_instrument(...), logforma_instrument_db_cursor(...), logforma_instrument_psycopg2_connection(...), logforma_record_db_query(...) — инструментация БД;
  • legacy-совместимость: logforma_log_call(...), logforma_log_event(...).

Пример ручных внутренних шагов:

from logforma import logforma_log_publish, logforma_log_db, logforma_log_http, logforma_trace

@logforma_trace()
async def process_candidate(payload: dict) -> dict:
    candidate_id = payload["candidate_id"]
    await logforma_log_publish("scoring_worker_service_inbound")
    await logforma_log_db(
        "SELECT id, score FROM candidates WHERE id = %s",
        params_preview=[candidate_id],
        db_alias="CandidateDB",
    )
    await logforma_log_http("POST", "https://risk-service.local/check", status_code=200)
    return {"ok": True}

Если отдельного шага маршрута внутри функции нет, достаточно одного @logforma_trace().

3. Правила Интеграции (важно)

  • logforma_init(...) вызывайте ровно один раз в entrypoint сервиса.
  • Во внутренних модулях повторно logforma_init(...) не вызывайте.
  • Сигнатуры бизнес-функций ради SDK не меняйте.
  • Ручной _logforma_context и ручной ctx["db_queries"] не используйте.
  • Для локальных override применяйте logforma_config_module(...).

4. HTTP И Queue Сценарии

HTTP entrypoint

  • logforma_consume(...) не нужен.
  • Обычно достаточно @logforma_trace().
  • Helper-функции (logforma_log_publish/logforma_log_db/logforma_log_http) добавляйте только если есть реальный отдельный шаг.

Queue-consumer entrypoint

  • Используйте logforma_consume(...) + @logforma_trace().
  • Низкоуровневый logforma_with_consume_event(...) оставлен для edge-cases.

5. Flow И Transaction ID

flow

  • Для consume-сессии приоритет: command.action -> flow.name -> logforma_init(flow_name=...).
  • В helper-вызовах можно передать flow_name=..., если нужно переопределение только для конкретного события.

transaction.id

  • Рекомендуется передавать внешний transaction.id для сквозной корреляции.
  • Если не передан, SDK сгенерирует fallback tx-<uuid>.

6. DB Логирование (пошагово)

Самое важное: как включить DB-логирование без ручных SQL-текстов

Чтобы SQL попадали в логи автоматически (без logforma_log_db("SELECT ...") вручную), нужны только 2 действия:

  1. Включить флаг:
logforma_init(..., log_db_queries=True)
  1. Инструментировать DB-подключение/курсор через SDK:
from logforma import logforma_instrument
conn = logforma_instrument(conn, db_alias="MainDB")

После этого SDK сам перехватывает execute(...)/executemany(...) и пишет SQL в db_queries_preview.

Шаг 1. Включите логирование

  • Через logforma_init(log_db_queries=True) или logforma_config_module(log_db_queries=True).
  • Приоритет: параметр декоратора -> logforma_config_module(...) -> logforma_init(...).

Шаг 2. Инструментируйте DB-клиент

Instrumentation = обёртка connection/cursor через SDK, чтобы перехватывать execute(...) и писать SQL в runtime-контекст.

Пример для psycopg2:

import psycopg2
from psycopg2.extras import RealDictCursor
from logforma import logforma_instrument

def connect():
    conn = psycopg2.connect(dsn, cursor_factory=RealDictCursor)
    return logforma_instrument(conn, db_alias="LogformaDB")

Поведение logforma_instrument(...):

  • если коннектор распознан, применяется инструментатор;
  • если не распознан, SDK вернёт исходный объект (passthrough, без падения).

Шаг 3. Проверяйте db_queries_preview

В деталях function step в UI появится список:

  • statement
  • params_preview
  • db_alias

Пример:

[
  {
    "statement": "SELECT id, score FROM candidates WHERE id = %s",
    "params_preview": ["cand-1001"],
    "db_alias": "LogformaDB"
  }
]

Если instrumentation нет, используйте fallback:

await logforma_log_db("SELECT ...", params_preview=[candidate_id], db_alias="CandidateDB")

7. Trace Level

trace_level задается в logforma_init(...):

  • off — trace-блок не добавляется;
  • basic, standard, verbose — trace включен.

8. Legacy Совместимость

  • logforma_log_call(...) и logforma_log_event(...) поддерживаются.
  • Для нового кода целевой стиль: logforma_init(...) + @logforma_trace() + короткие helper-вызовы по необходимости.

9. Пилот На Тестовых Сервисах

  • Контур test-* описан в docs/project/12-sdk-pilot.md.
  • Быстрый прогон:
    • python scripts/trigger_sdk_pilot.py
  • Скрипт запускает сценарии happy/error/warning/missing tx/unsupported connector и печатает transaction_id, flow nodes/edges.

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

logforma_sdk-0.1.1.tar.gz (16.5 kB view details)

Uploaded Source

Built Distribution

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

logforma_sdk-0.1.1-py3-none-any.whl (12.7 kB view details)

Uploaded Python 3

File details

Details for the file logforma_sdk-0.1.1.tar.gz.

File metadata

  • Download URL: logforma_sdk-0.1.1.tar.gz
  • Upload date:
  • Size: 16.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.10

File hashes

Hashes for logforma_sdk-0.1.1.tar.gz
Algorithm Hash digest
SHA256 7d0068d6f72279406b1f6d62d97dba4eeb6f154672c53d4a313e5b42f20b86f9
MD5 30b47c31940d5b1311a3259a47b989a6
BLAKE2b-256 fa782d632b6d98976bb00a653c4ae0c18d44c7c6f3dff7df17d3c56b6470c042

See more details on using hashes here.

File details

Details for the file logforma_sdk-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: logforma_sdk-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 12.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.10

File hashes

Hashes for logforma_sdk-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 da3e6beea0fab9a0f9b177e0e4d4f7866bbb2313e254e900c530534a2118be0e
MD5 e25a914963ec21f0464be7f2ca5b1aed
BLAKE2b-256 3cc04dd5bc2bcc1273293789cc7c23f6dc3b98cd83396fb6c59246c7ef9b55ac

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