influxdbchronograf

How to get a query variable on InfluxDB 2.0 dashboard?


I read the documentation https://docs.influxdata.com/influxdb/v2.0/visualize-data/variables/
I thought great that will be a piece of cake.
I take a look at an existing query variable named bucket:

buckets()
  |> filter(fn: (r) => r.name !~ /^_/)
  |> rename(columns: {name: "_value"})
  |> keep(columns: ["_value"])

It returns this data:

#group,false,false,false
#datatype,string,long,string
#default,_result,,
,result,table,_value
,,0,pool
,,0,test

The bucket variable works and I can refer to it as v.bucket in the cell queries of any dashboard.
Building on this example I craft the following query:

from(bucket: "pool")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r._measurement == "minerstat")
  |> keep(columns: ["account"])
  |> distinct(column: "account")
  |> keep(columns: ["_value"])

That returns this data:

#group,false,false,false
#datatype,string,long,string
#default,_result,,
,result,table,_value
,,0,0x04ff4e0c05c0feacccf93251c52a78639e0abef4
,,0,0x201f1a58f31801dcd09dc75616fa40e07a70467f
,,0,0x80475710b08ef41f5361e07ad5a815eb3b11ed7b
,,0,0xa68a71f0529a864319082c2475cb4e495a5580fd

And I save it as a query variable with the name account.
Then I use it in a dashboard cell query like this:

from(bucket: "pool")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "minerstat")
  |> filter(fn: (r) => r["account"] == v.account)
  |> filter(fn: (r) => r["_field"] == "currentHashrate" or r["_field"] == "hashrate")
  |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false)
  |> yield(name: "last")

But this returns no data. And the dropdown menu for the account variable on the dashboard view is empty.
If I replace v.account above with one of the value returned by the query behind the variable:

from(bucket: "pool")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "minerstat")
  |> filter(fn: (r) => r["account"] == "0x04ff4e0c05c0feacccf93251c52a78639e0abef4")
  |> filter(fn: (r) => r["_field"] == "currentHashrate" or r["_field"] == "hashrate")
  |> aggregateWindow(every: v.windowPeriod, fn: last, createEmpty: false)
  |> yield(name: "last")

That works as intended and display a nice graph.

What am I missing here?

SOLUTION: you cannot use variables inside the definition of a variable.
I replaced
start: v.timeRangeStart, stop: v.timeRangeStop
with
start: -1d
in the variable definition:

from(bucket: "pool")
  |> range(start: -1d)
  |> filter(fn: (r) => r._measurement == "minerstat")
  |> keep(columns: ["account"])
  |> distinct(column: "account")
  |> keep(columns: ["_value"])

Solution

  • I don't think you can use variables within variables, so things like v.timeRangeStart that you can use in a dashboard query can't be used to define another dashboard variable.

    You can use duration literals though, like -5d or -2h in your range() call though.