Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Grafana - InfluxDB 2 - Label/Alias data

I am in the processing of migrating my panels from using the SQL syntax (from InfluxDB version 1.X) to the new influx syntax (InfluxDB version 2).

There is an issue with the labels of the data. It includes the attributes that I used to filter it. For example, if I select data from a range that contains 2 days, it splits the data up. See the screenshot below:

enter image description here

This completely messes the chart up. The base code looks like this:

from(bucket: "main")
  |> range(start: v.timeRangeStart, stop:v.timeRangeStop)
  |> filter(fn: (r) =>
      r._measurement == "POWER" and
      r._field == "value" and
      r.device == "living_room"
  )
  |> aggregateWindow(every: v.windowPeriod, fn: sum)

It should obviously just be "POWER" and "CURRENT".

I tried a dozen of different approaches, but cannot come up with a working solution.

For example, if I do:

from(bucket: "main")
  |> range(start: v.timeRangeStart, stop:v.timeRangeStop)
  |> filter(fn: (r) =>
      r._measurement == "POWER" and
      r._field == "value" and
      r.device == "living_room"
  )
  |> aggregateWindow(every: v.windowPeriod, fn: sum)
  |> map(fn: (r) => ({ POWER: r._value }))

it says "Data does not have a time field".

I also tried using

from(bucket: "main")
  |> range(start: v.timeRangeStart, stop:v.timeRangeStop)
  |> filter(fn: (r) =>
      r._measurement == "POWER" and
      r._field == "value" and
      r.device == "living_room"
  )
  |> aggregateWindow(every: v.windowPeriod, fn: sum)
  |> yield(name: "POWER")

that does not work either. I tried many other things without success.

How can I fix this?

like image 421
TheNiceGuy Avatar asked Jun 24 '21 20:06

TheNiceGuy


2 Answers

After hours of trial and error, I was able to produce a working solution. I imagine that other users may stumble upon the same issue, I will therefore not delete the question and instead provide my solution.

I basically had to map the required fields and tags and assign the desired label, instead of just mapping the value that should be displayed (because then the date/time data is missing).

The solution looks like this:

from(bucket: "main")
  |> range(start: v.timeRangeStart, stop:v.timeRangeStop)
  |> filter(fn: (r) =>
      r._measurement == "POWER" and
      r._field == "value" and
      r.device == "living_room"
      )
  |> aggregateWindow(every: v.windowPeriod, fn: max)
  |> map(fn: (r) => ({ _value:r._value, _time:r._time, _field:"Power (W)" }))

Power (W) is the label/alias that is going to be used.

I wish that Influx would provide an easier way to alias the desired field. The current approach is not very intuitive.

like image 88
TheNiceGuy Avatar answered Nov 15 '22 11:11

TheNiceGuy


A bit similar to Sebastian Kollmar's suggestion, but I'm not sure if this is exactly what he meant - a colleague of mine came up with this:

figure1

With few or no changes, this will probably achieve what you were looking for.

like image 32
ffi Avatar answered Nov 15 '22 09:11

ffi