Skip to main content

Quick and easy monitoring setup for ASGI application

Project description

asgi-monitor logo

PyPI version Test Supported versions Downloads License

asgi-monitor

A library for easy and fast configuration of logging, tracing and metrics for ASGI applications.

Purpose

Quickly add minimal features for flexible application monitoring.

Features:

Info

At this stage, the library is being tested and be careful in using it, your participation in the development will be appreciated!

Installation

pip install asgi-monitor

Quickstart

Logging and metrics

import logging

from asgi_monitor.integrations.fastapi import setup_metrics
from asgi_monitor.logging import configure_logging
from asgi_monitor.logging.uvicorn import build_uvicorn_log_config
from fastapi import FastAPI
from uvicorn import run

logger = logging.getLogger(__name__)
app = FastAPI(debug=True)


def run_app() -> None:
    log_config = build_uvicorn_log_config(level=logging.INFO, json_format=True, include_trace=False)

    configure_logging(level=logging.INFO, json_format=True, include_trace=False)
    setup_metrics(app, app_name="fastapi", include_metrics_endpoint=True, include_trace_exemplar=False)

    logger.info("App is ready to start")

    run(app, host="127.0.0.1", port=8000, log_config=log_config)


if __name__ == "__main__":
    run_app()

In this example, all logs will be presented in JSON format and the following metrics will be set for the application:

  1. fastapi_app_info - ASGI application information
  2. fastapi_requests_total - Total count of requests by method and path
  3. fastapi_responses_total - Total count of responses by method, path and status codes
  4. fastapi_request_duration_seconds - Histogram of request duration by path, in seconds
  5. fastapi_requests_in_progress - Gauge of requests by method and path currently being processed
  6. fastapi_requests_exceptions_total - Total count of exceptions raised by path and exception type

And these metrics are available by endpoint /metrics, but you can import get_latest_metrics from asgi_monitor.metrics to create a custom endpoint.

Warning

If you are using Gunicorn, then you need to set the environment variable "PROMETHEUS_MULTIPROC_DIR" with the path to the directory where the consistent metrics will be stored.

This approach will block the event loop when recording metrics!

See the prometheus_client documentation for adding your custom metrics.

Tracing

You can also add query tracing and your logic using opentelemetry.

from asgi_monitor.integrations.fastapi import TracingConfig, setup_tracing
from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor

resource = Resource.create(
    attributes={
        "service.name": "asgi-monitor",
        "compose_service": "asgi-monitor",
    },
)
tracer = TracerProvider(resource=resource)
trace.set_tracer_provider(tracer)
tracer.add_span_processor(BatchSpanProcessor(OTLPSpanExporter(endpoint="http://asgi-monitor.tempo:4317")))
config = TracingConfig(tracer_provider=tracer)

setup_tracing(app=app, config=config)

Create your TracerProvider with the necessary settings and add it to the TracingConfig, also include tracing in others setup functions.

After that, you can profile the payload of the application.

with trace.get_tracer("asgi-monitor").start_as_current_span("sleep 0.1"):
    await asyncio.sleep(0.1)

See example to understand the tracing setup.
This example also contains all the infrastructure configs to evaluate the capabilities of the application, carefully study them and customize them to your needs.

API Metrics dashboard

Dashboard

Tempo traces from dashboard logs

Traces

Warning

Do not use these configs in production, as authorization and long-term data storage are not configured there!

The library originates from structlog-asgi, tnx @nkhitrov

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

asgi-monitor-0.1.0.tar.gz (15.9 kB view details)

Uploaded Source

Built Distribution

asgi_monitor-0.1.0-py3-none-any.whl (19.4 kB view details)

Uploaded Python 3

File details

Details for the file asgi-monitor-0.1.0.tar.gz.

File metadata

  • Download URL: asgi-monitor-0.1.0.tar.gz
  • Upload date:
  • Size: 15.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: pdm/2.12.3 CPython/3.12.2

File hashes

Hashes for asgi-monitor-0.1.0.tar.gz
Algorithm Hash digest
SHA256 43beb10a2c19263ea701879e3acfe5544b5a32e2af89833e94e51ef7e75e816c
MD5 1966788ad4ef88f06e8e46d65b7bb450
BLAKE2b-256 c763c7319f465bdb7d677d22ece2ffb5e456d1865d2b6662a75848b109dbbed6

See more details on using hashes here.

Provenance

File details

Details for the file asgi_monitor-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for asgi_monitor-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3725eba2d936a5eb32feee4272989911a51eb971c27477249dafd625aba3af7f
MD5 7b808957331fa4276e8580aba30c97d2
BLAKE2b-256 12c904ab19fe1d762eaa8340ee86a70c80c2939dce67eab8e8335f375aa267dc

See more details on using hashes here.

Provenance

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page