Skip to main content

Shared runtime library for Wholeshoot services

Project description

wshtlib

Lightweight observability library for AWS Lambda and FastAPI. Zero external dependencies.

A focused alternative to aws-powertools — covers structured logging, CloudWatch metrics (EMF), request context propagation, and Lambda handler boilerplate. Nothing more.

Install

pip install wshtlib

FastAPI/Starlette middleware is optional:

pip install wshtlib[fastapi]

Usage

Lambda handler

from wshtlib import bootstrap, get_logger

logger = get_logger("my-service")

@bootstrap
def handler(event, context):
    logger.info("invoked", path=event.get("path"))
    return {"statusCode": 200}

The decorator handles:

  • Warming events ("source": "lambda-warming") — returns 200 early
  • Context init and structured log enrichment
  • Unhandled exceptions — logs error, returns 500

Structured logging

from wshtlib import get_logger

logger = get_logger("my-service")
logger.info("user signed in", user_id="u_123", plan="pro")

Output is JSON to stdout, enriched with level, timestamp, service, location, runtime fields, and Lambda context on invocation.

CloudWatch metrics (EMF)

from wshtlib.metrics import metrics

metrics.count("OrderPlaced")
metrics.put("Duration", 142.5, unit="Milliseconds")
metrics.flush()

metrics is a module-level MetricsContext instance. For isolated contexts (e.g. per-request), instantiate MetricsContext() directly.

Namespace defaults to the METRICS_NAMESPACE env var, falling back to "Wholeshoot".

Request context

from wshtlib import get_context, set_user_id

set_user_id(claims["sub"])
ctx = get_context()  # {"trace_id": ..., "correlation_id": ..., "user_id": ...}

Context is stored in a ContextVar — safe for concurrent async handlers.

FastAPI middleware

from fastapi import FastAPI
from wshtlib.middleware import WshtlibMiddleware

app = FastAPI()
app.add_middleware(WshtlibMiddleware)

Initialises request context, logs method, path, status, duration_ms per request, and injects X-Trace-Id into the response.

Utilities

from wshtlib import require_env, require_https_url, require_secret

db_url = require_env("DATABASE_URL")          # raises RuntimeError if missing/empty
endpoint = require_https_url(require_env("API_URL"))  # raises ValueError if not https
api_key = require_secret("api/key")           # raises RuntimeError if missing/empty, cached

Environment variables

Variable Default Description
LOG_LEVEL INFO Logger level
METRICS_NAMESPACE Wholeshoot CloudWatch namespace
ENVIRONMENT Added as a metrics dimension if set

Development

uv sync --group dev
uv run pytest
uv run mypy wshtlib
uv run ruff check wshtlib

License

MIT

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

wshtlib-0.1.2.tar.gz (43.4 kB view details)

Uploaded Source

Built Distribution

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

wshtlib-0.1.2-py3-none-any.whl (10.6 kB view details)

Uploaded Python 3

File details

Details for the file wshtlib-0.1.2.tar.gz.

File metadata

  • Download URL: wshtlib-0.1.2.tar.gz
  • Upload date:
  • Size: 43.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for wshtlib-0.1.2.tar.gz
Algorithm Hash digest
SHA256 679a1a5afaa8181cbe90d206d6f075336c0fd72b8b0f1ee66e572769668ea811
MD5 3c01327ff28f24fd089757e18b0f6b69
BLAKE2b-256 37884fe48425412a7ce3348ba7cb6ae3a9f80c0e35844d1c23052ab490cc6f5e

See more details on using hashes here.

Provenance

The following attestation bundles were made for wshtlib-0.1.2.tar.gz:

Publisher: ci.yml on pjosols/wshtlib

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

File details

Details for the file wshtlib-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: wshtlib-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 10.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for wshtlib-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 b33acdfc59cd8d618c6e2f3670ccdf573624cde8ac093ec771120643b9b6a576
MD5 370b185d8817b2c05dcf80e5cbd413f5
BLAKE2b-256 b1d75d4ff16800dc18aeb801782ba0c8f7f664b35934ee028127f05e3956574f

See more details on using hashes here.

Provenance

The following attestation bundles were made for wshtlib-0.1.2-py3-none-any.whl:

Publisher: ci.yml on pjosols/wshtlib

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