Skip to content

kumo.time.start_timer(LABEL)

Since: Dev Builds Only

The functionality described in this section requires a dev build of KumoMTA. You can obtain a dev build by following the instructions in the Installation section.

Starts a timer with a specific label and returns a timer object.

The timer object can be used to update a latency histogram that is reported in the prometheus metrics for the server to track how long it takes for a certain operation to complete.

The most basic usage looks like this:

local timer = kumo.time.start_timer 'my-operation'

-- do something here
kumo.time.sleep(1.5)

-- And record the latency
timer:done()

After this runs, you will see the following metrics:

$ curl -s 'http://127.0.0.1:8000/metrics' | grep user_lua
# HELP user_lua_latency how long something user-defined took to run in your lua policy
# TYPE user_lua_latency histogram
user_lua_latency_bucket{label="my-operation",le="0.005"} 1
user_lua_latency_bucket{label="my-operation",le="0.01"} 1
user_lua_latency_bucket{label="my-operation",le="0.025"} 1
user_lua_latency_bucket{label="my-operation",le="0.05"} 1
user_lua_latency_bucket{label="my-operation",le="0.1"} 1
user_lua_latency_bucket{label="my-operation",le="0.25"} 1
user_lua_latency_bucket{label="my-operation",le="0.5"} 1
user_lua_latency_bucket{label="my-operation",le="1"} 1
user_lua_latency_bucket{label="my-operation",le="2.5"} 1
user_lua_latency_bucket{label="my-operation",le="5"} 1
user_lua_latency_bucket{label="my-operation",le="10"} 1
user_lua_latency_bucket{label="my-operation",le="+Inf"} 1
user_lua_latency_sum{label="my-operation"} 1.5
user_lua_latency_count{label="my-operation"} 1

You can use the <close> feature of lua to automatically trigger the :done() call when the timer object falls out of scope. This is useful for example to track how long it takes to run a function:

local function mything()
  -- This `timer` will automatically report the duration of the `mything`
  -- function when it returns, so you don't need to litter the function
  -- with timer:done() calls for each return case below
  local timer <close> = kumo.time.start_timer("mything")

  if something then
    return
  end

  if something_else then
    return
  end

end

The timer:done() method returns the number of seconds that have elapsed since the timer was started.