Skip to content

Examples

Two ways to use DDQB:

1) Building queries from scratch 2) Parsing and updating existing queries

1) Building queries from scratch

A. Simple metric

q, err := ddqb.Metric().
  Metric("system.cpu.idle").
  Build()

B. Aggregation + time window

q, err := ddqb.Metric().
  Aggregator("avg").
  TimeWindow("5m").
  Metric("system.cpu.idle").
  Build()

C. Basic filters and grouping

q, err := ddqb.Metric().
  Metric("system.cpu.user").
  Filter(ddqb.Filter("env").Equal("prod")).
  Filter(ddqb.Filter("service").Equal("api")).
  GroupBy("host", "availability-zone").
  Build()

D. Regex, IN/NOT IN, and NotEqual filters

q, err := ddqb.Metric().
  Metric("system.disk.in_use").
  Filter(ddqb.Filter("device").Regex("/dev/nvme.*")).
  Filter(ddqb.Filter("env").NotEqual("staging")).
  Filter(ddqb.Filter("availability-zone").In("us-east-1a", "us-east-1b")).
  Filter(ddqb.Filter("service").NotIn("batch", "etl")).
  GroupBy("device", "host").
  Build()

E. Functions (fill, rollup, as_rate, as_count)

q, err := ddqb.Metric().
  Metric("nginx.net.request_per_s").
  ApplyFunction(ddqb.Function("fill").WithArg("0")).
  ApplyFunction(ddqb.Function("rollup").WithArgs("60", "sum")).
  ApplyFunction(ddqb.Function("as_rate")).
  Build()

F. Explicit boolean logic with filter groups

group := ddqb.FilterGroup().
  OR(ddqb.Filter("availability-zone").Equal("us-east-1a")).
  OR(ddqb.Filter("availability-zone").Equal("us-east-1c"))

q, err := ddqb.Metric().
  Metric("system.cpu.user").
  Filter(ddqb.Filter("env").Equal("staging")).
  Filter(group).
  GroupBy("availability-zone").
  Build()

G. Advanced combined example

complexGroup := ddqb.FilterGroup().
  AND(ddqb.Filter("team").Equal("core")).
  AND(
    ddqb.FilterGroup().
      OR(ddqb.Filter("service").Equal("api")).
      OR(ddqb.Filter("service").Equal("web")),
  )

q, err := ddqb.Metric().
  Aggregator("avg").
  TimeWindow("10m").
  Metric("system.mem.used").
  Filter(ddqb.Filter("env").Equal("prod")).
  Filter(ddqb.Filter("region").In("us-east-1", "us-west-2")).
  Filter(complexGroup).
  GroupBy("service", "host").
  ApplyFunction(ddqb.Function("fill").WithArg("0")).
  ApplyFunction(ddqb.Function("rollup").WithArgs("300", "avg")).
  Build()

2) Parsing and updating queries

A. Simple parse and tweak

b, err := ddqb.FromQuery("avg(5m):system.cpu.idle{host:web-1}")
if err != nil { panic(err) }

q, err := b.
  TimeWindow("10m").
  Filter(ddqb.Filter("env").Equal("prod")).
  Build()

B. Add grouping and functions

b, err := ddqb.FromQuery("sum:nginx.net.request_per_s{service:shop} by {resource_name}")
if err != nil { panic(err) }

q, err := b.
  GroupBy("resource_name", "host").
  ApplyFunction(ddqb.Function("as_rate")).
  ApplyFunction(ddqb.Function("rollup").WithArgs("120", "sum")).
  Build()

C. Modify boolean groups in-place

package main

import (
  "strings"
  "github.com/jonwinton/ddqb"
  "github.com/jonwinton/ddqb/metric"
)

func main() {
  // Start with a query using an OR group across AZs
  start := "avg:system.cpu.user{env:staging AND (availability-zone:us-east-1a OR availability-zone:us-east-1c)} by {availability-zone}"
  b, err := ddqb.FromQuery(start)
  if err != nil { panic(err) }

  // Find the OR group and add another AZ to it
  g := b.FindGroup(func(gr metric.FilterGroupBuilder) bool {
    built, _ := gr.Build()
    return strings.Contains(built, "availability-zone")
  })

  b = b.AddToGroup(g, ddqb.Filter("availability-zone").Equal("us-east-1b"))

  q, err := b.Build()
  if err != nil { panic(err) }
  _ = q
}

D. Complex end-to-end edits

original := "avg(5m):system.mem.used{env:prod, team:core} by {service}.fill(0).rollup(60, sum)"
b, err := ddqb.FromQuery(original)
if err != nil { panic(err) }

// Adjust aggregator window, add filters, and expand grouping
q, err := b.
  TimeWindow("15m").
  Filter(ddqb.Filter("region").In("us-east-1", "us-west-2")).
  GroupBy("service", "host").
  ApplyFunction(ddqb.Function("as_rate")).
  Build()