Skip to main content

Framework-agnostic metrics and structured log collection with hexagonal architecture

Project description

observabilipy

Framework-agnostic metrics and structured log collection with hexagonal architecture.

Develop observability features decoupled from your infrastructure. Use embedded storage (SQLite, in-memory) during development, then optionally expose endpoints for scraping by Prometheus, Grafana Alloy, or other observability platforms when you're ready.

Features

  • Prometheus-style metrics - /metrics endpoint in text format
  • Structured logs - /logs endpoint in NDJSON (Grafana Alloy compatible)
  • Framework adapters - FastAPI, Django, generic ASGI
  • Storage backends - In-memory, SQLite (with WAL), Ring buffer
  • Retention policies - Automatic cleanup with EmbeddedRuntime

Installation

git clone https://github.com/PhilHem/observabilipy.git
cd observabilipy
uv sync

For framework support:

uv sync --extra fastapi
uv sync --extra django

Quick Start

from fastapi import FastAPI
from observability.adapters.frameworks.fastapi import create_observability_router
from observability.adapters.storage.in_memory import (
    InMemoryLogStorage,
    InMemoryMetricsStorage,
)

app = FastAPI()
log_storage = InMemoryLogStorage()
metrics_storage = InMemoryMetricsStorage()

app.include_router(create_observability_router(log_storage, metrics_storage))

Run with uvicorn and visit /metrics and /logs.

Recording Metrics and Logs

import time
from observability.core.models import LogEntry, MetricSample

# Record a log entry
await log_storage.write(
    LogEntry(
        timestamp=time.time(),
        level="INFO",
        message="User logged in",
        attributes={"user_id": 123, "ip": "192.168.1.1"},
    )
)

# Record a metric sample
await metrics_storage.write(
    MetricSample(
        name="http_requests_total",
        timestamp=time.time(),
        value=1.0,
        labels={"method": "GET", "path": "/api/users"},
    )
)

Storage Backends

Backend Use Case
InMemoryLogStorage / InMemoryMetricsStorage Development and testing
SQLiteLogStorage / SQLiteMetricsStorage Persistent storage with WAL mode for concurrent access
RingBufferLogStorage / RingBufferMetricsStorage Fixed-size buffer for memory-constrained environments

All backends implement the same port interfaces and are interchangeable.

Examples

See the examples/ directory:

Example Description
minimal_example.py Dummy metrics and logs generator for testing
cgroups_example.py Container CPU and memory metrics from cgroups v2
fastapi_example.py Basic FastAPI setup with in-memory storage
django_example.py Django integration
asgi_example.py Generic ASGI middleware
sqlite_example.py Persistent storage with SQLite
ring_buffer_example.py Fixed-size storage for constrained environments
embedded_runtime_example.py Background retention cleanup

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

observabilipy-0.8.3.tar.gz (61.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

observabilipy-0.8.3-py3-none-any.whl (18.3 kB view details)

Uploaded Python 3

File details

Details for the file observabilipy-0.8.3.tar.gz.

File metadata

  • Download URL: observabilipy-0.8.3.tar.gz
  • Upload date:
  • Size: 61.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for observabilipy-0.8.3.tar.gz
Algorithm Hash digest
SHA256 9f7b075a70db89da48b62877833f8033ac740a4938d5b7e13f3fbb541c03823b
MD5 a08a4bd8ad03177b3e71fcf5affec9bf
BLAKE2b-256 e04c376b78f91f768b243b69e9c30a72092175dd6571213b36a6bce457d7ce03

See more details on using hashes here.

Provenance

The following attestation bundles were made for observabilipy-0.8.3.tar.gz:

Publisher: release.yml on PhilHem/observabilipy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file observabilipy-0.8.3-py3-none-any.whl.

File metadata

  • Download URL: observabilipy-0.8.3-py3-none-any.whl
  • Upload date:
  • Size: 18.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for observabilipy-0.8.3-py3-none-any.whl
Algorithm Hash digest
SHA256 4c58e75b4cb5b8283cb39e5a37e2938fd6e2b49f83bee9a65d2c7c15f654de47
MD5 0c0934a00bd97551538d60d66248a179
BLAKE2b-256 398615b2aae15136e6fd7929c24cf9d5aec6b95696583a143a525c6be3be1b59

See more details on using hashes here.

Provenance

The following attestation bundles were made for observabilipy-0.8.3-py3-none-any.whl:

Publisher: release.yml on PhilHem/observabilipy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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