Create a Meter
Meters define how events are aggregated into metrics.Copy
import Limitry from '@limitry/sdk';
const client = new Limitry();
// Sum of tokens
const meter = await client.meters.create({
name: "Total Tokens",
aggregation: "sum",
field: "values.total_tokens",
eventFilter: {
eventType: "llm.completion"
}
});
console.log(`Created meter: ${meter.id}`);
Aggregation Types
Copy
// Sum - add up all values
const meter = await client.meters.create({
name: "Total Tokens",
aggregation: "sum",
field: "values.total_tokens",
eventFilter: { eventType: "llm.completion" }
});
// Count - count number of events
const meter = await client.meters.create({
name: "Request Count",
aggregation: "count",
field: "*", // Use "*" for count
eventFilter: { eventType: "llm.completion" }
});
// Max - highest value seen
const meter = await client.meters.create({
name: "Peak Concurrent Users",
aggregation: "max",
field: "values.concurrent",
eventFilter: { eventType: "user.active" }
});
// Latest - most recent value (for gauges)
const meter = await client.meters.create({
name: "Active Agents",
aggregation: "latest",
field: "values.count",
eventFilter: { eventType: "agent.count" }
});
Event Filters
Filter which events are included usingeventFilter:
Copy
// Only count GPT-4 tokens
const meter = await client.meters.create({
name: "GPT-4 Tokens",
aggregation: "sum",
field: "values.total_tokens",
eventFilter: {
eventType: "llm.completion",
dimensions: { model: "gpt-4" }
}
});
// Count premium feature usage
const meter = await client.meters.create({
name: "Premium Features",
aggregation: "count",
field: "*",
eventFilter: {
eventType: "feature.usage",
dimensions: { tier: "premium" }
}
});
// Multiple dimension filters (AND logic)
const meter = await client.meters.create({
name: "GPT-4 Chat Tokens",
aggregation: "sum",
field: "values.total_tokens",
eventFilter: {
eventType: "llm.completion",
dimensions: {
model: "gpt-4",
feature: "chat"
}
}
});
Query Meter Value
Query the current value of a meter:Copy
const now = new Date();
const weekAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);
// Query with optional filters
const result = await client.meters.query("mtr_abc123", {
customerId: "cust_123",
startDate: weekAgo.toISOString(),
endDate: now.toISOString()
});
console.log(`Meter: ${result.meterName}`);
console.log(`Value: ${result.value}`);
console.log(`Aggregation: ${result.aggregation}`);
// Query with dimension filters
const result = await client.meters.query("mtr_abc123", {
customerId: "cust_123",
dimensions: { model: "gpt-4" }
});
List Meters
Copy
// List all meters
const meters = await client.meters.list();
for (const meter of meters.data) {
console.log(`${meter.name} (${meter.id})`);
console.log(` ${meter.aggregation}(${meter.field})`);
if (meter.eventFilter) {
console.log(` Filter: ${JSON.stringify(meter.eventFilter)}`);
}
}
// Include global default meters
const meters = await client.meters.list({ includeDefaults: "true" });
// Pagination
const meters = await client.meters.list({ limit: 50 });
if (meters.hasMore) {
const nextPage = await client.meters.list({ cursor: meters.nextCursor });
}
Get a Meter
Copy
const meter = await client.meters.retrieve("mtr_abc123");
console.log(`Name: ${meter.name}`);
console.log(`Aggregation: ${meter.aggregation}`);
console.log(`Field: ${meter.field}`);
console.log(`Event Filter: ${JSON.stringify(meter.eventFilter)}`);
Update a Meter
Copy
const meter = await client.meters.update("mtr_abc123", {
name: "Updated meter name"
});
You cannot change the
aggregation, field, or eventFilter of an existing meter. Create a new meter instead.Delete a Meter
Copy
const result = await client.meters.delete("mtr_abc123");
if (result.success) {
console.log("Meter deleted");
}
Deleting a meter will also delete any limits that reference it.