Append calculated field (percentage) and combine with results from different datasets, in Influx Flux
Asked Answered
P

0

6

I'm struggling with an Influx 2 query in Flux on how to join and map data from two differents sets (tables) into a specific desired output.

My current Flux query is this:

data = from(bucket: "foo")
    |> range(start:-1d)
    |> filter(fn: (r) => r._measurement == "io")
    |> filter(fn: (r) => r["device_id"] == "12345")
    |> filter(fn: (r) => r._field == "status_id" )

    # count the total points
    totals = data
    |> count(column: "_value")
    |> toFloat()
    |> set(key: "_field", value: "total_count")

    # calculate the amount of onlines points (e.g. status = '1')
    onlines = data
    |> filter(fn: (r) => r._value == 1)
    |> count(column: "_value")
    |> toFloat()
    |> set(key: "_field", value: "online_count")

    union(tables: [totals, onlines])

This returns as output:

    [{'online_count': 58.0}, {'total_count': 60.0}]

I would like to have appended to this output a percentage calculated from this. Something like:

    [{'online_count': 58.0}, {'total_count': 60.0}, {'availability': 0.96666667}]    

I've tried combining this using .map(), but to no avail:

    # It feels like the map() is what I need, but can't find the right 
    # combination with .join/union(), .map(), .set()., .keep() etc.
    union(tables: [totals, onlines])
    |> map(fn: (r) => ({ r with percentage_online: r.onlines.online_count / r.totals.total_count * 100 }))

How can I append the (calculated) percentage as new field 'availability' in this Flux query?

Or, alternatively, is there a different Flux query approach to achieve this outcome?

N.B. I am aware of the Calculate percentages with Flux article from the docs, which I can't get working into this specific scenario. But it's close.

Petaliferous answered 7/10, 2021 at 9:17 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.