meridian-plugin-usage
Meridian V1's open-source Usage plugin provides immutable metering events, exact unit normalization, bounded queries, deterministic window aggregation, retention inputs, and OpenTelemetry/Evidence correlation over logical Meridian Resources.
This distribution is a Python library and Meridian plugin. It is not a service or a Usage Catalog. It owns no database, provisions no engine, accepts no engine credentials, calculates no prices, and uses only released mapping-first Meridian Expressions.
Install
python -m pip install meridian-plugin-usage==2.0.2
See decimal replay compatibility for the storage roundtrip fix, unchanged v1 event fingerprints and legacy verification.
Python 3.12, 3.13, and 3.14 are supported. Runtime Meridian dependencies are exactly pinned to the compatible releases listed in compatibility.
Record immutable usage
Platform IaC renders the Meridian runtime, logical Resource placements, identity/ACL, migrations, retention, and engine lifecycle. Application code only creates the ready runtime and uses this library:
from datetime import UTC, datetime
from decimal import Decimal
from meridian_storage.plugins.usage import (
DimensionSpec,
MeterV1,
UnitTransform,
Usage,
UsageEvent,
UsageScope,
UsageWindow,
)
usage = Usage(ready_meridian)
meter = MeterV1(
meter_id="api.requests",
version=1,
quantity="requests",
canonical_unit="request",
transforms={"kilorequest": UnitTransform(Decimal("1000"))},
dimensions=(DimensionSpec("region", required=True),),
scale=6,
active_from=datetime(2026, 1, 1, tzinfo=UTC),
)
usage.repository.register_meter(meter)
event = UsageEvent(
event_id="publisher-event-0001",
scope=UsageScope({"tenant": "acme", "environment": "prod"}),
subject_id="account-42",
meter_id=meter.meter_id,
meter_version=meter.version,
window=UsageWindow(
datetime(2026, 8, 26, 10, 0, tzinfo=UTC),
datetime(2026, 8, 26, 10, 1, tzinfo=UTC),
),
value=Decimal("2"),
unit="kilorequest",
dimensions={"region": "us-west"},
source="publisher",
)
receipt = usage.recorder.record(event)
assert receipt.event.value == Decimal("2000.000000")
An identical replay returns RecordStatus.REPLAYED. The same scoped
event_id with different normalized content raises the stable
MERIDIAN_USAGE_IMMUTABLE_CONFLICT error. Corrections are new signed
events referencing correction_of; existing events are never mutated.
Query and aggregate
page = usage.queries.events(
event.scope,
datetime(2026, 8, 26, 10, 0, tzinfo=UTC),
datetime(2026, 8, 26, 11, 0, tzinfo=UTC),
where={"meterId": meter.meter_id},
).page(limit=100).execute()
Every query is scope-bound, time-bounded, cursor-paginated, and exposed both as
a mapping-first Expression and a serialized Query 1.0.0 logical plan.
Aggregation is a library worker with deterministic claims, immutable aggregate
versions, and compare-and-set watermark checkpoints. Retrying after a crash
replays identical outputs; late events create a new version that names the
version it supersedes.
Batch profiles
partitionedrecords deterministic per-event outcomes and is portable to append-oriented placements such as ClickHouse.atomicopens one Meridian transaction on the events Resource and is accepted only when the rendered placement advertises the transaction capability.
Batch manifests and aggregation control records are logical structured Resources. They are not a private database.
Contracts and evidence
The package ships released Semantics schemas, plugin/schema-provider entry points, JSON Schema compatibility evidence, deterministic golden fingerprints, unit/integration/conformance tests, reproducible build checks, and Apache-2.0 LICENSE/NOTICE material.
See architecture, recording, aggregation, configuration, compatibility, and conformance.
Licensed under the Apache License, Version 2.0.
Metadata
Release files for meridian-plugin-usage 2.0.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| meridian_plugin_usage-2.0.2.tar.gz | 137.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| meridian_plugin_usage-2.0.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 179.9 kB
Release files / meridian_plugin_usage-2.0.2.tar.gz
| Download URL | meridian_plugin_usage-2.0.2.tar.gz |
|---|---|
| Size | 137.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e3e0fee1127597fc88b2bfd7bb92e005ecaeff5f9a947947376491abedde7b95
|
|
BLAKE2b-256 checksum How to use checksums |
f1135cac31a2d1cd87beb1b844f477b39e6e9b40a47fc97419b1e7845831d2be
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.
Transparency logRelease files / meridian_plugin_usage-2.0.2-py3-none-any.whl
| Download URL | meridian_plugin_usage-2.0.2-py3-none-any.whl |
|---|---|
| Size | 42.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6fb59aa340794e6104950ba9bfae135881ad721d0e07346ba9169c4f32e9f8c2
|
|
BLAKE2b-256 checksum How to use checksums |
d8f22f65517f059634741f1d977cec8353421c8ff949aec130a4bd6211a2c39b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.
Transparency log