Quickstart

Watch our video on how to quickstart with OpenMeter.

Clone the repository:

git clone [email protected]:openmeterio/openmeter.git
cd openmeter/quickstart

Launch OpenMeter

Launch OpenMeter and its dependencies locally via Docker Compose:

docker-compose up -d

Ingest usage event(s)

Ingest usage events in CloudEvents format:

curl -X POST http://localhost:8888/api/v1/events \
-H "Expect:" \
-H 'Content-Type: application/cloudevents+json' \
--data-raw '
{
  "specversion" : "1.0",
  "type": "api-calls",
  "id": "00001",
  "time": "2023-01-01T00:00:00.001Z",
  "source": "service-0",
  "subject": "customer-1",
  "data": {
    "duration_ms": "1",
    "method": "GET",
    "path": "/hello"
  }
}
'

To learn more about the event format, see the Event ingestion page.

Note how ID is different:

curl -X POST http://localhost:8888/api/v1/events \
-H "Expect:" \
-H 'Content-Type: application/cloudevents+json' \
--data-raw '
{
  "specversion" : "1.0",
  "type": "api-calls",
  "id": "00002",
  "time": "2023-01-01T00:00:00.001Z",
  "source": "service-0",
  "subject": "customer-1",
  "data": {
    "duration_ms": "1",
    "method": "GET",
    "path": "/hello"
  }
}
'

Note how ID and time are different:

curl -X POST http://localhost:8888/api/v1/events \
-H "Expect:" \
-H 'Content-Type: application/cloudevents+json' \
--data-raw '
{
  "specversion" : "1.0",
  "type": "api-calls",
  "id": "00003",
  "time": "2023-01-02T00:00:00.001Z",
  "source": "service-0",
  "subject": "customer-1",
  "data": {
    "duration_ms": "1",
    "method": "GET",
    "path": "/hello"
  }
}
'

Configure additional meter(s)

Configure how OpenMeter should process your usage events. In this example we will meter the execution duration per API invocation, groupped by method and path. You can think about it how AWS Lambda charges by execution duration on a millisecond level.

# config.yaml
# ...

meters:
  - slug: m1
    description: API calls
    eventType: api-calls
    valueProperty: $.duration_ms
    aggregation: SUM
    groupBy:
      method: $.method
      path: $.path

The events will be processed and aggregated by OpenMeter using the duration_ms property, groupped by method and path properties.

Query Usage

Query the usage hourly (jq is used to format the JSON output.):

curl http://localhost:8888/api/v1/meters/m1/query?windowSize=HOUR | jq
{
  "values": [
    {
      "subject": "customer-1",
      "windowStart": "2023-01-01T00:00:00Z",
      "windowEnd": "2023-01-01T01:00:00Z",
      "value": 2,
      "groupBy": {
        "method": "GET",
        "path": "/hello"
      }
    },
    {
      "subject": "customer-1",
      "windowStart": "2023-01-02T00:00:00Z",
      "windowEnd": "2023-01-02T01:00:00Z",
      "value": 1,
      "groupBy": {
        "method": "GET",
        "path": "/hello"
      }
    }
  ]
}

Cleanup

Once you are done, stop any running instances:

docker-compose down -v
Last edited on December 5, 2023