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==0.1.0
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
telemify-0.2.1.tar.gz
(8.8 kB
view details)
Built Distribution
telemify-0.2.1-py3-none-any.whl
(10.3 kB
view details)
File details
Details for the file telemify-0.2.1.tar.gz
.
File metadata
- Download URL: telemify-0.2.1.tar.gz
- Upload date:
- Size: 8.8 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 | b7cfb63cfe7f366aa4e70e856164a822c15705e114cdf5927607b37b088a542b |
|
MD5 | 93b7a8623c835c56adcf8b32412aa018 |
|
BLAKE2b-256 | fabcb85260aa40e6a4db6319a440999778a608a257c34066dd75cd201af6d257 |
File details
Details for the file telemify-0.2.1-py3-none-any.whl
.
File metadata
- Download URL: telemify-0.2.1-py3-none-any.whl
- Upload date:
- Size: 10.3 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 | 97afa66db746c41caa88c534c9f27332b14d1b5ab0c55b047573342964f9961a |
|
MD5 | 2bc0fcd6c0e1e9d57f0afd8e03d694bd |
|
BLAKE2b-256 | 432698e616eff4c72f03692bb7ac5973888009ff78b287e144d2797666a5ccfb |