Seamless instrumentation of tracing, logging, and metrics in FastAPI and Starlette applications, using opentelemetry structlog, and prometheus-client.
Project description
telemify
Seamless instrumentation of tracing, logging, and metrics in FastAPI and Starlette applications, using opentelemetry, structlog, and prometheus-client.
Installation
$ pip install telemify
Usage
import uvicorn
from fastapi import FastAPI
from sqlalchemy.ext.asyncio import create_async_engine
from starlette.config import Config
from telemify.logging.configure import configure as configure_logger
from telemify.logging.filters import (
ExceptionASGIApplicationFilter,
MetricsEndpointFilter,
)
from telemify.logging.middleware import LoggerMiddleware
from telemify.logging.processors import add_open_telemetry_spans, drop_color_message_key
from telemify.metrics.configure import configure as configure_metrics
from telemify.metrics.middleware import PrometheusMiddleware
from telemify.tracing.configure import configure as configure_tracing
config = Config()
LOG_LEVEL: str = config("LOG_LEVEL", cast=str, default="info")
engine = create_async_engine("sqlite+aiosqlite:///test.db")
def configure_telemetry(app: FastAPI):
configure_logger(
json_logs=False,
additional_processors=[drop_color_message_key, add_open_telemetry_spans],
loggers_to_disable=["uvicorn.access"],
loggers_to_propagate=["uvicorn", "uvicorn.error", "sqlalchemy.engine.Engine"],
filters={
"uvicorn.error": [
ExceptionASGIApplicationFilter(),
],
"telemify.logging.middleware": [MetricsEndpointFilter()],
},
)
configure_metrics(app)
configure_tracing(
app,
instrument_httpx=True,
instrument_sqlalchemy=True,
instrument_celery=True,
instrument_botocore=True,
instrument_jinja2=True,
db_engine=engine,
)
app = FastAPI()
app.add_middleware(LoggerMiddleware)
app.add_middleware(PrometheusMiddleware)
configure_telemetry(app)
if __name__ == "__main__":
uvicorn.run(
app,
log_level=LOG_LEVEL,
)
Environment variables
# Application name to be used to mark signals
export APP_NAME=unknown
export LOG_LEVEL=info
export STATUS_4XX_LOG_LEVEL=warning
# Url to send the tracing data. It can be any tool that supports the OpenTelemetry protocol.
# ex. Grafana Tempo, Jaeger, etc.
export OTLP_GRPC_ENDPOINT=http://tempo-distributor.monitoring:4317
# Comma separated string to exclude certain urls from tracking.
# ex. "client/.*/info,healthcheck":
# This will exclude requests such as `https://site/client/123/info` and `https://site/xyz/healthcheck`.
export OTEL_PYTHON_EXCLUDED_URLS="client/.*/info,healthcheck"
Tests
To run the tests, use the following command:
$ poetry run pytest
Reference
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
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 telemify-0.5.1.tar.gz.
File metadata
- Download URL: telemify-0.5.1.tar.gz
- Upload date:
- Size: 9.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.3 CPython/3.10.6 Linux/5.14.0-1034-oem
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c9ff5b2d5bf53eab02730aded728ea1b08fdf3a2f389be04dbc9c0d82740e719
|
|
| MD5 |
2ae04c8659ed81acce2e909fe02fad89
|
|
| BLAKE2b-256 |
738b43b2e85da07bb4d2962cf1d57d036f313992ed2cad04e8ddbb8117bba18b
|
File details
Details for the file telemify-0.5.1-py3-none-any.whl.
File metadata
- Download URL: telemify-0.5.1-py3-none-any.whl
- Upload date:
- Size: 10.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.3 CPython/3.10.6 Linux/5.14.0-1034-oem
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4ca0af0aeaa5db281fec3d5a93f87a2a90f19dfc0beef81e2c1e5fd20cf5303c
|
|
| MD5 |
f54328a450a51260fd14f3031385a992
|
|
| BLAKE2b-256 |
3219ebb39ce0af90e27f8e1447d6bd20ed8b5b3fd3b359ba7bd0b0150333f002
|