Skip to main content

maping-client

Zero-config RED-metrics client for FastAPI/Starlette services, reporting to a mAPI-ng collector.

Open source. Start free on the hosted service (no card), or self-host the complete MIT stack.

Aggregates per-endpoint rate/errors/duration into a DDSketch client-side and ships batched summaries over the Connect unary protocol, matching the wire contract used by mAPI-ng's Go clients (maping/client). No MAPING_KEY set means the middleware is a no-op: safe to add to any app.

Hosted or self-hosted

This client behaves identically either way: only the env vars you set differ.

  • Hosted, forever free, no card. Sign up at mapi-ng.com, create a key, set MAPING_KEY. That is the whole setup: the client already defaults to the hosted ingest endpoint, so MAPING_ENDPOINT is not needed.
  • Self-hosted. Run the complete MIT stack yourself (make local for dev, make up for prod, see arhuman/maping). Set MAPING_KEY for your own instance and MAPING_ENDPOINT to point at it.

Nothing here is held back to push you toward the hosted plan: the wire contract, the server, and this client are all MIT. Start hosted and move to self-hosting later, or the reverse, at any time. Convenience, not lock-in.

Status

Early development. Wire contract is pinned from arhuman/maping's proto/maping/v1/maping.proto via scripts/sync-proto.sh; see that repo's docs/adr/ for the design rationale behind the wire format (DDSketch, ADR-0001; Connect protocol, ADR-0002).

Quickstart

Set your credentials (pick one; see "Hosted or self-hosted" above):

# Hosted (forever free, no card)
export MAPING_KEY="mk_live_..."

# Self-hosted
export MAPING_KEY="mk_live_..."
export MAPING_ENDPOINT="https://your-collector.internal"

Then the same code either way:

from contextlib import asynccontextmanager

from fastapi import FastAPI
from maping import Recorder
from maping.asgi import MapingMiddleware

recorder = Recorder()  # reads MAPING_KEY, and MAPING_ENDPOINT if self-hosting, from env


@asynccontextmanager
async def lifespan(_: FastAPI):
    await recorder.start()
    yield
    await recorder.shutdown()  # must run AFTER the server stops accepting requests


fastapi_app = FastAPI(lifespan=lifespan)

# Wrap the WHOLE app -- not app.add_middleware() -- so this sits outside
# Starlette's ServerErrorMiddleware and observes the real final status even
# after an unhandled exception. See src/maping/asgi.py for why.
app = MapingMiddleware(fastapi_app, recorder=recorder)

See examples/fastapi_app.py for a fuller quickstart, including labelled errors, aborted requests, and downstream-call timing.

Running tests

git clone https://github.com/arhuman/maping-python.git
cd maping-python
pip install -e ".[dev,zstd]"

ruff check src/ tests/ examples/
mypy src/
pytest tests/ -v

Same three commands the CI workflow runs on every push and PR (see .github/workflows/_test.yml, the reusable workflow both ci.yml and release.yml call).

Contributing

  • Open an issue or PR against arhuman/maping-python.
  • Keep changes scoped: one concern per PR, with tests. ruff check, mypy, and pytest all have to pass before review; CI enforces this on every PR.
  • The wire contract under src/maping/proto/v1/ is pinned from the core arhuman/maping repo via scripts/sync-proto.sh (see PINNED_REF for the exact pin). Don't hand-edit the generated maping_pb2.py/maping_pb2.pyi; change the pin and re-run the sync script instead.

Fidelity notes

  • RED metrics (rate, errors, duration, DDSketch percentiles) match the Go client's wire contract exactly.
  • InstanceWindow/USE gauges (CPU, memory, GC, goroutine-equivalents) are best-effort approximations of the Go runtime stats the field names were originally defined for; Python's GC/concurrency model has no exact equivalent to Go's runtime introspection. See src/maping/_sampler.py.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

maping_client-0.1.1.tar.gz (58.2 kB view details)

Uploaded Source

Built Distribution

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

maping_client-0.1.1-py3-none-any.whl (43.2 kB view details)

Uploaded Python 3

File details

Details for the file maping_client-0.1.1.tar.gz.

File metadata

  • Download URL: maping_client-0.1.1.tar.gz
  • Upload date:
  • Size: 58.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for maping_client-0.1.1.tar.gz
Algorithm Hash digest
SHA256 010f9c1226c474fe344b80310c6c5800a597b6d10d3a87b3629900dfda2aaa35
MD5 c1d5acd670fa6f753e9a5f1e707e3014
BLAKE2b-256 be73337a0434bd275afabc9e2d45f119da3a9738eee7d5e9f5341429236e1fb2

See more details on using hashes here.

Provenance

The following attestation bundles were made for maping_client-0.1.1.tar.gz:

Publisher: release.yml on arhuman/maping-python

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

File details

Details for the file maping_client-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: maping_client-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 43.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for maping_client-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 be74bd98e3bb1d82e40eaab3abe801306d70c31878db7586e4638a55574bd832
MD5 676b12a55515a8f03afb7e9adad0f04c
BLAKE2b-256 9b32fe8c77f0fbf84098900d6bad865625c62f3f97657c22dd158d810260b94d

See more details on using hashes here.

Provenance

The following attestation bundles were made for maping_client-0.1.1-py3-none-any.whl:

Publisher: release.yml on arhuman/maping-python

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

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page