Skip to main content

Create a Meter

Meters define how events are aggregated into metrics.
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

// 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 using eventFilter:
// 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:
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

// 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

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

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

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.