Skip to main content

Create a Meter

Meters define how events are aggregated into metrics.
from limitry import Limitry

client = Limitry()

# Sum of tokens
meter = client.meters.create(
    name="Total Tokens",
    aggregation="sum",
    field="values.total_tokens",
    event_filter={
        "event_type": "llm.completion"
    }
)

print(f"Created meter: {meter.id}")

Aggregation Types

# Sum - add up all values
meter = client.meters.create(
    name="Total Tokens",
    aggregation="sum",
    field="values.total_tokens",
    event_filter={"event_type": "llm.completion"}
)

# Count - count number of events
meter = client.meters.create(
    name="Request Count",
    aggregation="count",
    field="*",  # Use "*" for count
    event_filter={"event_type": "llm.completion"}
)

# Max - highest value seen
meter = client.meters.create(
    name="Peak Concurrent Users",
    aggregation="max",
    field="values.concurrent",
    event_filter={"event_type": "user.active"}
)

# Latest - most recent value (for gauges)
meter = client.meters.create(
    name="Active Agents",
    aggregation="latest",
    field="values.count",
    event_filter={"event_type": "agent.count"}
)

Event Filters

Filter which events are included using event_filter:
# Only count GPT-4 tokens
meter = client.meters.create(
    name="GPT-4 Tokens",
    aggregation="sum",
    field="values.total_tokens",
    event_filter={
        "event_type": "llm.completion",
        "dimensions": {"model": "gpt-4"}
    }
)

# Count premium feature usage
meter = client.meters.create(
    name="Premium Features",
    aggregation="count",
    field="*",
    event_filter={
        "event_type": "feature.usage",
        "dimensions": {"tier": "premium"}
    }
)

# Multiple dimension filters (AND logic)
meter = client.meters.create(
    name="GPT-4 Chat Tokens",
    aggregation="sum",
    field="values.total_tokens",
    event_filter={
        "event_type": "llm.completion",
        "dimensions": {
            "model": "gpt-4",
            "feature": "chat"
        }
    }
)

Query Meter Value

Query the current value of a meter:
from datetime import datetime, timedelta

# Query with optional filters
result = client.meters.query(
    id="mtr_abc123",
    customer_id="cust_123",
    start_date=datetime.now() - timedelta(days=7),
    end_date=datetime.now()
)

print(f"Meter: {result.meter_name}")
print(f"Value: {result.value}")
print(f"Aggregation: {result.aggregation}")

# Query with dimension filters
result = client.meters.query(
    id="mtr_abc123",
    customer_id="cust_123",
    dimensions={"model": "gpt-4"}
)

List Meters

# List all meters
meters = client.meters.list()

for meter in meters.data:
    print(f"{meter.name} ({meter.id})")
    print(f"  {meter.aggregation}({meter.field})")
    if meter.event_filter:
        print(f"  Filter: {meter.event_filter}")

# Include global default meters
meters = client.meters.list(include_defaults="true")

# Pagination
meters = client.meters.list(limit=50)
if meters.has_more:
    next_page = client.meters.list(cursor=meters.next_cursor)

Get a Meter

meter = client.meters.retrieve("mtr_abc123")

print(f"Name: {meter.name}")
print(f"Aggregation: {meter.aggregation}")
print(f"Field: {meter.field}")
print(f"Event Filter: {meter.event_filter}")

Update a Meter

meter = client.meters.update(
    "mtr_abc123",
    name="Updated meter name"
)
You cannot change the aggregation, field, or event_filter of an existing meter. Create a new meter instead.

Delete a Meter

result = client.meters.delete("mtr_abc123")

if result.success:
    print("Meter deleted")
Deleting a meter will also delete any limits that reference it.