Metadata-Version: 2.4
Name: boolean-otel-sdk
Version: 0.1.0
Summary: Bootstrap estandar de OpenTelemetry para apps Python de Boolean (Django, Celery, FastAPI): no-op sin endpoint, defaults de plataforma y correlacion de logs
Author: Boolean
License: MIT
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Operating System :: OS Independent
Classifier: Intended Audience :: Developers
Classifier: Topic :: System :: Monitoring
Requires-Python: >=3.9
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: opentelemetry-distro==0.65b0
Requires-Dist: opentelemetry-exporter-otlp-proto-http==1.44.0
Requires-Dist: opentelemetry-instrumentation-logging==0.65b0
Provides-Extra: django
Requires-Dist: opentelemetry-instrumentation-django==0.65b0; extra == "django"
Provides-Extra: celery
Requires-Dist: opentelemetry-instrumentation-celery==0.65b0; extra == "celery"
Provides-Extra: psycopg2
Requires-Dist: opentelemetry-instrumentation-psycopg2==0.65b0; extra == "psycopg2"
Provides-Extra: psycopg
Requires-Dist: opentelemetry-instrumentation-psycopg==0.65b0; extra == "psycopg"
Provides-Extra: redis
Requires-Dist: opentelemetry-instrumentation-redis==0.65b0; extra == "redis"
Provides-Extra: requests
Requires-Dist: opentelemetry-instrumentation-requests==0.65b0; extra == "requests"
Requires-Dist: opentelemetry-instrumentation-urllib3==0.65b0; extra == "requests"
Provides-Extra: fastapi
Requires-Dist: opentelemetry-instrumentation-fastapi==0.65b0; extra == "fastapi"
Provides-Extra: dev
Requires-Dist: pytest>=7.4; extra == "dev"
Dynamic: license-file

# boolean-otel-sdk (Python)

Bootstrap estandar de OpenTelemetry para apps Python de Boolean. Reemplaza el
`config/otel.py` + filtro de logging que antes se copiaba en cada repo (patron
original: `juzgado.back`).

Contrato:

- **No-op total** si falta `OTEL_EXPORTER_OTLP_ENDPOINT` o `OTEL_SDK_DISABLED=true`
  (dev local y tests no cambian).
- Defaults de plataforma (`http/protobuf`, `OTEL_LOGS_EXPORTER=none`, correlacion de
  logs). Las variables ya definidas **ganan**: el gestor inyecta `OTEL_SERVICE_NAME`,
  `OTEL_RESOURCE_ATTRIBUTES` y `OTEL_EXPORTER_OTLP_ENDPOINT` en ambients production.
- Un error al inicializar se loguea y la app arranca igual, sin telemetria.
- Idempotente por proceso; se re-inicializa tras un fork.

## Instalacion

```
boolean-otel-sdk[django,celery,psycopg2,redis,requests]==0.1.0
```

Extras: `django`, `celery`, `psycopg2`, `psycopg`, `redis`, `requests` (incluye urllib3),
`fastapi`. **Las instrumentaciones salen de los extras**: el build del gestor no corre
`opentelemetry-bootstrap`, asi que lo que no este instalado no se instrumenta.
Las versiones de `opentelemetry-*` estan fijadas por el SDK; no las listes aparte.

## Django + Celery

```python
# config/wsgi.py  (antes de get_wsgi_application)
from boolean_otel_sdk import init
init("mi-servicio")          # default si nadie definio OTEL_SERVICE_NAME

# config/celery.py
from boolean_otel_sdk.celery import init_celery_worker
init_celery_worker("mi-servicio")   # inicializa en cada proceso worker (post-fork)
```

Logging (correlacion `trace_id=` que Loki linkea a Tempo):

```python
from boolean_otel_sdk import TRACE_LOG_FORMAT_BRACES

LOGGING = {
    "filters": {"otel_trace_context": {"()": "boolean_otel_sdk.OtelTraceContextFilter"}},
    "formatters": {"detailed": {
        "format": "{levelname} {asctime} {module} " + TRACE_LOG_FORMAT_BRACES + " {message}",
        "style": "{",
    }},
    # en cada handler: "filters": ["otel_trace_context"]
}
```

## Desarrollo

```
pip install -e ".[django,celery,dev]" && pytest
python -m build
```
