Service Level Indicator (SLI) Formulas | Honeycomb

Service Level Indicator (SLI) Formulas

Note
This feature is available as part of the Honeycomb Enterprise and Pro plans.

These examples show how to identify different types of criteria and qualifiers when creating SLIs.

Each example includes how to formulate the SLI when using the Build Query mode or the Write Formula mode.

No Qualifier 

For all events, return true if duration_ms < 1000.

Build Query 

Total (Valid) Events Successful Events
duration_ms < 1000

Write Formula as a Derived Column 

LT($duration_ms, 1000)

Qualifier is trace roots 

A trace root does not have a parent. This SLI returns true for trace roots whose response duration is under 100, false for trace roots whose duration is over 100, and null for non-roots.

Build Query 

Total (Valid) Events Successful Events
trace.parent_id does-not-exist duration_ms < 100

Write Formula as a Derived Column 

IF(
  NOT(EXISTS($trace.parent_id)),
  LT($duration_ms, 100)
)

Criterion is Based on Both Duration and Error 

Our qualifier here is whether request.path is /home. If it is, then this SLI only returns true if both duration_ms is under 100, and there is no error message.

Build Query 

Total (Valid) Events Successful Events
request.path = /home duration_ms < 100
app.error does-not-exist

Write Formula as a Derived Column 

IF(
  EQUALS($request.path, "/home"),
  AND(
    LT($duration_ms, 100),
    NOT(EXISTS($app.error)),
  )
)

Complex Criterion, Complex Qualifier 

The qualifier here is events that hit the /main endpoint, using the method POST, and are not marked as error code 401.

The criterion is that events must have a status code of 200. In addition, if they are part of a batch, then data processing must have taken less than 5 ms per item.

Build Query 

This example is not supported in the Build Query mode because the DIV() and IF() operators are only supported within a derived column.

Write Formula as a Derived Column 

IF(
  AND(
    EQUALS($request.path, "main"),
    EQUALS($request.method, "POST"),
    NOT(EQUALS($response.status_code, 401))
  ),
  AND(
    EQUALS($response.status_code, 200),
    LT(
      DIV(
        $duration_ms,
        IF($app.batch, $app.batch_total_datapoints, 5)
      ),
      5
    )
  )
)