Reuse of targets, queries

For InfluxDB some extra possibilities were added. Let’s take the three queries below.

from(bucket: "ath01")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r["_measurement"] == "weather")
|> filter(fn: (r) => r["_field"] == "temp")
|> aggregateWindow(every: $__interval, fn: max)

from(bucket: "ath01")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r["_measurement"] == "weather")
|> filter(fn: (r) => r["_field"] == "temp")
|> aggregateWindow(every: 5m, fn: max)
|> aggregateWindow(every: $__interval, fn: mean)

import "timezone"
import "experimental"
option location = timezone.location(name: "Europe/Brussels")
hstart = experimental.subDuration(d: 5h, from: v.timeRangeStop)
from(bucket: "ath01")
|> range(start: hstart, stop: v.timeRangeStop)
|> filter(fn: (r) => r["_measurement"] == "weather")
|> filter(fn: (r) => r["_field"] == "temp")
|> last()

This in fact always the same data-source, with every time some other range, aggregation, … A target can be split in some parts: headers, calculations, bucket, range, query and aggregation(s).

# headers
import "timezone"
import "experimental"
# calculations
option location = timezone.location(name: "Europe/Brussels")
hstart = experimental.subDuration(d: 5h, from: v.timeRangeStop)
# bucket
from(bucket: "ath01")
# range
|> range(start: hstart, stop: v.timeRangeStop)
# query
|> filter(fn: (r) => r["_measurement"] == "weather")
|> filter(fn: (r) => r["_field"] == "temp")
# aggregation
|> last()

Below the options for the targetInfluxDB class are discussed.

d_tgt = TargetBag()
d_tgt.addDatasource('influx', {'uid': 'rifn6UOGz', 'type': 'influxdb'})
d_tgt.addTarget('weather', 'temperature', targetInfluxDB(b='mybucket', q=textwrap.dedent('''
    |> filter(fn: (r) => r["_measurement"] == "weather")
    |> filter(fn: (r) => r["_field"] == "temp")
    ''')))

set range and aggregation

tgt1 = targetInfluxDB(t=d_tgt.getTarget('weather', 'temperature'), r='default', a=['last'])
Results in:
    from(bucket: "mybucket")
    |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
    |> filter(fn: (r) => r["_measurement"] == "weather")
    |> filter(fn: (r) => r["_field"] == "temp")
    |> last()

set timezone, range and aggregation

d_set['tz'] = 'Europe/Brussels'
tgt1 = targetInfluxDB(t=d_tgt.getTarget('weather', 'temperature'), tz= d_set['tz'], r='default', a=['last'])
Results in:
    import "timezone"
    option location = timezone.location(name: "Europe/Brussels")
    from(bucket: "mybucket")
    |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
    |> filter(fn: (r) => r["_measurement"] == "weather")
    |> filter(fn: (r) => r["_field"] == "temp")
    |> last()

Range options

set range and two aggregations

tgt1 = targetInfluxDB(t=d_tgt.getTarget('weather', 'temperature'), r='5h', a=['max()', 'last()'])
Results in:
    import "experimental"
    hstart = experimental.subDuration(d: {self.r}, from: v.timeRangeStop)
    from(bucket: "mybucket")
    |> range(start: hstart, stop: v.timeRangeStop)
    |> filter(fn: (r) => r["_measurement"] == "weather")
    |> filter(fn: (r) => r["_field"] == "temp")
    |> max()
    |> last()

set range start and stop; start is translated as v.timeRangeStart; stop is translated as v.timeRangeStop

tgt1 = targetInfluxDB(t=d_tgt.getTarget('weather', 'temperature'), r=['start', 'stop'], a=['last()'])
Results in:
    from(bucket: "mybucket")
    |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
    |> filter(fn: (r) => r["_measurement"] == "weather")
    |> filter(fn: (r) => r["_field"] == "temp")
    |> max()
    |> last()

set range start and stop; other strings are taken literally; here as start

tgt1 = targetInfluxDB(t=d_tgt.getTarget('weather', 'temperature'), r=['-5d', 'stop'], a=['last()'])
Results in:
    from(bucket: "mybucket")
    |> range(start: -5d, stop: v.timeRangeStop)
    |> filter(fn: (r) => r["_measurement"] == "weather")
    |> filter(fn: (r) => r["_field"] == "temp")
    |> max()
    |> last()

set range start and stop; other strings are taken literally; here as stop (and also both is possible)

tgt1 = targetInfluxDB(t=d_tgt.getTarget('weather', 'temperature'), r=['start', '-2h'], a=['last()'])
Results in:
    from(bucket: "mybucket")
    |> range(start: v.timeRangeStart, stop: -2h)
    |> filter(fn: (r) => r["_measurement"] == "weather")
    |> filter(fn: (r) => r["_field"] == "temp")
    |> max()
    |> last()

set range start and stop: dictionary {‘t’: ‘truncate’, ‘s’: ‘starttime’ , ‘d’: ‘duration’}; all keys are optional

tgt1 = targetInfluxDB(t=d_tgt.getTarget('weather', 'temperature'), r={'s':'1mo', 'd':'5dh'}, a=['last()'])
Results in:
    import "experimental"
    htruncs = v.timeRangeStop
    htrunce = v.timeRangeStop
    hstart = experimental.subDuration(d: 1mo, from: htrunce)
    hstop  = experimental.addDuration(d: 5d, to: hstart)
    from(bucket: "mybucket")
    |> range(start: hstart, stop: hstop)
    |> filter(fn: (r) => r["_measurement"] == "weather")
    |> filter(fn: (r) => r["_field"] == "temp")
    |> max()
    |> last()

set range trucate, start and stop

tgt1 = targetInfluxDB(t=d_tgt.getTarget('weather', 'temperature'), r={'t': '1d', s:'1mo', d:'5dh'}, a=['last()'])
Results in:
    import "date"
    import "experimental"
    htruncs = date.truncate(t: v.timeRangeStart, unit: 1d)
    htrunce = date.truncate(t: v.timeRangeStop, unit: 1d)
    hstart = experimental.subDuration(d: 1mo, from: htrunce)
    hstop  = experimental.addDuration(d: 5d, to: hstart)
    from(bucket: "mybucket")
    |> range(start: hstart, stop: hstop)
    |> filter(fn: (r) => r["_measurement"] == "weather")
    |> filter(fn: (r) => r["_field"] == "temp")
    |> max()
    |> last()

Aggregation options

set

tgt1 = targetInfluxDB(t=d_tgt.getTarget('weather', 'temperature'), r='default', a=['last()'])
Results in:
    from(bucket: "mybucket")
    |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
    |> filter(fn: (r) => r["_measurement"] == "weather")
    |> filter(fn: (r) => r["_field"] == "temp")
    |> last()

Example use im a panel

hdashboard.addPanel(
    PanelStat(title='Temperature', gridpos=PropGridPos(3, 2, 0, 0),
        datasource=d_tgt.getDatasource('influx'),
        targets=[targetInfluxDB(t=d_tgt.getTarget('weather', 'temperature'), r=d_set['tlast'], a=['last()'])],
    )
)