influxdbinfluxdb-2influxqlflux-influxdb

Flux Query : iterate filter from a list


I search a way to filter by a loop/iterate from a list

is it possible?

The table tophdd contains 2 entries, but i can't filter these two entries with a regex.

tophdd = from(bucket: v.bucket)
|>range(start: v.timeRangeStart, stop: v.timeRangeStop)
|>filter(fn: (r) => r._measurement == "HDDID")
|>filter(fn: (r) => r.serial == "${Serial}")
|>filter(fn: (r) => r._field == "HDDID_IOPS")
|>highestMax(n:2,groupColumns: ["HDDID"])
|>keep(columns: ["HDDID" ])

|>from(bucket: v.bucket)
|>range(start: v.timeRangeStart, stop: v.timeRangeStop)
|>filter(fn: (r) => r._measurement == "HDDID")
|>filter(fn: (r) => r.serial == "${Serial}")
|>filter(fn: (r) => r._field == "HDDID_IOPS")
|>filter(fn: (r) => r.HDDID = =~ /"${tophdd}"/)
|>aggregateWindow(column: "_value", every: v.windowPeriod, fn: mean)

i search to filter like this:

filter(fn: (r) => r.HDDID = =~ /"${tophdd}"/)

Is it possible to filter from a list?

Many thanks,


Solution

  • You can extract column values using findColumn to an array and then use contains function in the filter. Eg.

    tophdd = from(bucket: v.bucket)
      |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
      |> ...
      |> keep(columns: ["HDDID" ])
      |> findColumn(fn: (key) => true, column: "HDDID")
    
    from(bucket: v.bucket)
      |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
      |> filter(fn: (r) => r._measurement == "HDDID")
      |> ...
      |> filter(fn: (r) => contains(set: tophdd, value: r.HDDID))
      |> aggregateWindow(column: "_value", every: v.windowPeriod, fn: mean)
    

    Please note that the performance may be suboptimal as contains() is not a pushdown op.