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.14.0.tar.gz (89.2 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.14.0-py3-none-any.whl (23.8 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for observabilipy-0.14.0.tar.gz
Algorithm Hash digest
SHA256 20de9c6be1aeb7dd1e0bee9d24cd2136aa32398c69a297a71dbf75c5d7ba9918
MD5 daf70d5e38f464c0ca11365578b2fd96
BLAKE2b-256 55f6d4d319657c2a2910bba3d276e5d1d627059a74ce535eef487d712c01c0d2

See more details on using hashes here.

Provenance

The following attestation bundles were made for observabilipy-0.14.0.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.14.0-py3-none-any.whl.

File metadata

  • Download URL: observabilipy-0.14.0-py3-none-any.whl
  • Upload date:
  • Size: 23.8 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.14.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e78e062ac8d80f46cfdab6bd38609bb3de487fc19494cd763d8836e3c7864db7
MD5 15b7ea9f701c02b6395db9699bf266e7
BLAKE2b-256 7a4112ddc99bbff49fca1f3ac3b2b9beb543ff420defdb328dcc4b50f655aa17

See more details on using hashes here.

Provenance

The following attestation bundles were made for observabilipy-0.14.0-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