Unified wrapper for Elven logs interception and OpenTelemetry instrumentation in Python.
Project description
Unified Observability Py
Pacote unificado para juntar:
elven-logs-interceptor-pythonelven-opentelemetry-instrumentation-py
com uma experiência única de bootstrap, config por env e API manual em Python.
Instalação
Base:
pip install elven-unified-observability-py
Com extras completos do logger:
pip install "elven-unified-observability-py[full]"
Para desenvolvimento:
pip install -e ".[dev]"
O que a lib entrega
init(...)manual com config Python-firstinit_from_env()para bootstrap por ambientelogger,traceremetricsreexportados como proxies seguros- preload zero-code via
sitecustomize - CLI
elven-unified-observability -- <command> - shutdown e flush coordenados
- auto-bridge para libs de logging suportadas (
loguru,structlog) - fallback
LOKI_*paraLOGS_* - aliases legados
ENABLE_LOGGING,ENABLE_METRICS,ENABLE_TRACING
Quick Start Manual
from elven_unified_observability import init, logger, metrics, tracer
handle = init(
{
"service": {
"serviceName": "billing-service",
"serviceVersion": "1.2.3",
"environment": "production",
},
"logging": {
"transport": {
"url": "https://loki.example.com/loki/api/v1/push",
"tenantId": "tenant-a",
"authToken": "token",
"compression": "gzip",
},
"interceptConsole": True,
},
"telemetry": {
"metrics": {"exportIntervalMillis": 15000},
"privacy": {"redactDbStatement": True},
},
"enableLogging": True,
"enableMetrics": True,
"enableTracing": True,
}
)
logger.info("service started", {"service": "billing-service"})
metrics.increment("bootstrap.success", 1)
tracer.with_span("startup", lambda span: span.set_attribute("boot.ready", True))
handle.force_flush()
handle.shutdown()
Quick Start Zero-Code
- Crie um
.envcom a identidade do serviço e os endpoints. - Rode a app com a CLI:
elven-unified-observability -- python app.py
Também funciona com:
elven-unified-observability -- uvicorn app:app
elven-unified-observability -- celery -A worker.app worker
elven-unified-observability -- python -m my_service
Como a precedence funciona
- Config explícita passada para
init(...) - Env da wrapper (
UO_*) - Env dos componentes (
LOGS_*,LOKI_*,OTEL_*) - Defaults das libs-base
Variáveis da wrapper
| Variável | Descrição |
|---|---|
UO_ENABLED |
Liga/desliga tudo por default |
UO_ENABLE_LOGGING |
Override unificado para logs |
UO_ENABLE_METRICS |
Override unificado para métricas |
UO_ENABLE_TRACING |
Override unificado para tracing |
UO_STRICT |
Falha o bootstrap se qualquer componente falhar |
UO_LOAD_DOTENV |
Controla leitura de .env no preload/CLI |
UO_DOTENV_PATH |
Caminho alternativo para o .env |
UO_LOGGING_INTEGRATIONS |
Auto-instala bridges de logging: auto, loguru, structlog, none |
UO_LOGGING_EXCLUDE_PREFIXES |
Prefixos globais de bibliotecas barulhentas para ignorar nos bridges |
UO_ENABLE_LOGURU_BRIDGE |
Override específico para bridge de loguru |
UO_ENABLE_STRUCTLOG_BRIDGE |
Override específico para bridge de structlog |
UO_LOGURU_LEVEL |
Nível do sink loguru instalado pela wrapper |
UO_LOGURU_ENQUEUE |
Ativa enqueue no sink loguru |
UO_LOGURU_BACKTRACE |
Ativa backtrace no sink loguru |
UO_LOGURU_DIAGNOSE |
Ativa diagnose no sink loguru |
UO_LOGURU_EXCLUDE_PREFIXES |
Prefixos extras para ignorar especificamente no bridge de loguru |
Aliases legados suportados:
ENABLE_LOGGINGENABLE_METRICSENABLE_TRACING
Identidade unificada
A identidade do serviço é sempre derivada nesta ordem:
OTEL_SERVICE_NAMELOGS_APP_NAMEouLOKI_APP_NAME- default
unknown-service
Versão:
OTEL_SERVICE_VERSIONLOGS_APP_VERSIONouLOKI_APP_VERSION- default
1.0.0
Ambiente:
OTEL_DEPLOYMENT_ENVIRONMENTLOGS_ENVIRONMENTouLOKI_ENVIRONMENTENVIRONMENTAPP_ENV- default
development
Logging
Prefixo principal: LOGS_*
Fallback suportado: LOKI_*
Exemplos mais usados:
LOGS_URL=https://loki.example.com/loki/api/v1/push
LOGS_TENANT=my-tenant
LOGS_TOKEN=secret
LOGS_COMPRESSION=gzip
LOGS_BUFFER_MAX_SIZE=500
LOGS_FILTER_LEVELS=info,warn,error
LOGS_INTERCEPT_CONSOLE=true
LOGS_ENABLE_METRICS=true
LOGS_ENABLE_METRICS controla apenas as métricas internas do logger. Se ele não estiver definido, o pacote usa o valor unificado de UO_ENABLE_METRICS.
Logging Bridges
Quando a aplicação usa bibliotecas de logging além do logging padrão do Python, a wrapper pode instalar bridges automaticamente no bootstrap.
Hoje os bridges suportados são:
logurustructlog
No caso de loguru, a wrapper também reaplica o bridge automaticamente quando a aplicação chama logger.configure(...) ou logger.remove(), evitando perder o sink da observabilidade durante o bootstrap da app.
Habilitar autodetecção para todas as bibliotecas suportadas:
UO_LOGGING_INTEGRATIONS=auto
Filtros padrão já silenciam bibliotecas barulhentas como httpx, httpcore, urllib3, h11, h2, hpack e opentelemetry.
Habilitar apenas loguru:
UO_LOGGING_INTEGRATIONS=loguru
Forçar override granular:
UO_ENABLE_LOGURU_BRIDGE=true
UO_ENABLE_STRUCTLOG_BRIDGE=false
Refinar exclusões globais:
UO_LOGGING_EXCLUDE_PREFIXES=httpx,httpcore,urllib3,h11,h2,hpack,opentelemetry
Adicionar exclusões extras só para loguru:
UO_LOGURU_EXCLUDE_PREFIXES=botocore,boto3
Para apps loguru-first, a recomendação é manter o bridge ligado e usar LOGS_INTERCEPT_CONSOLE=false quando você não quiser capturar print() da aplicação.
Telemetry
A wrapper reaproveita os OTEL_* já suportados pela lib-base.
Mais comuns:
OTEL_SERVICE_NAME=billing-service
OTEL_SERVICE_VERSION=1.2.3
OTEL_DEPLOYMENT_ENVIRONMENT=production
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
OTEL_TRACES_EXPORTER=otlp
OTEL_METRICS_EXPORTER=otlp
OTEL_METRIC_EXPORT_INTERVAL=15000
OTEL_PRIVACY_REDACT_DB_STATEMENT=true
OTEL_INSTR_FASTAPI=true
OTEL_INSTR_REQUESTS=true
Framework examples
FastAPI
elven-unified-observability -- uvicorn app:app --host 0.0.0.0 --port 8000
Flask
elven-unified-observability -- flask --app app run
Celery
elven-unified-observability -- celery -A worker.app worker -l info
API pública
init(config=None)init_from_env(strict=None)load_config_from_env(env=None)get_handle()is_initialized()force_flush()shutdown()loggertracermetrics
Build e publish
Validação local:
ruff check .
pyright
pytest
python -m build
python -m twine check dist/*
Publish local:
./publish.sh --repository testpypi --dry-run
./publish.sh --repository testpypi
./publish.sh --repository pypi
Tokens esperados:
TEST_PYPI_API_TOKENPYPI_API_TOKEN
Segurança
- Não versione
.envreal - Não grave token em arquivo
- Use secrets de CI ou variáveis de ambiente locais
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file elven_unified_observability_py-0.1.5.tar.gz.
File metadata
- Download URL: elven_unified_observability_py-0.1.5.tar.gz
- Upload date:
- Size: 55.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
45e8d33d6240c2ea67fca14144fb02e54f512f8c839cae98c9e282fa93e436c3
|
|
| MD5 |
8d194097614c3aa7e9db6d1e631d6fe7
|
|
| BLAKE2b-256 |
16fdab9afd6eb92cf6c18709ce9e2d8aaf376abb06bac968a72cb6c47da290f9
|
File details
Details for the file elven_unified_observability_py-0.1.5-py3-none-any.whl.
File metadata
- Download URL: elven_unified_observability_py-0.1.5-py3-none-any.whl
- Upload date:
- Size: 20.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d4d84475cf94dc880fd42c21754b4e61856e7ba9875987a9e9fd5d15102f6c8d
|
|
| MD5 |
6ad6c60cb9c5569e29ec7dbe04de5ac3
|
|
| BLAKE2b-256 |
aa3b8fc151e67ee69019bd802541c57470b6045848783bc4ace5c8fd88ad542c
|