技術筆記 / 監控工具

InfluxDB Flux 常用 functions

基本查詢和序列操作

```javascript= from(bucket: "quote") |> range(start: v.timeRangeStart, stop:v.timeRangeStop) |> filter(fn: (r) => r._measurement == "realtime" and r.symbol == "${symbolSel}" and r._field == "volume_24h" )


### 兩個序列 join

```javascript=
join(tables: {t1: t1, t2: t2}, on: ["_time"])
    |> map(fn: (r) => ({ r with _value: (r._value_t1 - r._value_t2)/r._value_t2     }))
    |>map(fn: (r) => ({ r with alias: "120d 投資比" }))     

pivot 同序列不同欄位 join

```javascript= |> pivot(rowKey:["_time"], columnKey: ["valmean"], valueColumn: "_value") |> map(fn: (r) => ({ r with _value: r.volume / r.open }))



### union 聯集

```javascript=
union(tables: [t1, t2])

透過 union 增加 fields

```javascript= import "influxdata/influxdb/v1" import "array" extend_fields = array.from(rows: [{_value: "test"}]) exist_fields= v1.tagValues( bucket: v.bucket, tag: "_field", predicate: (r) => r._measurement == "mark" and r._field != "h1sdQ2" and r._field != "m5sdQ2" , start: -1y ) union(tables: [extend_fields, exist_fields])



### 今天到現在 range
```javascript=
import "date"
from(bucket: "quote")
  |> range(start: duration(v: string(v: -date.hour(t: now())) +"h")   )

取得最後15筆

```javascript= |> sort(columns: [ "_time"],desc: true) |> limit(n: 15)


### duplicate 欄位
```javascript=
    |> duplicate(column: "tag", as: "tag_dup")

移動平均 / window 相關

By 個數

```javascript= |> movingAverage(n: 2 )

### By 時間
```javascript=
    |> timedMovingAverage(every: 1y, period: 5y)

每一小平均

```javascript= from(bucket: "quote") |> range(start: v.timeRangeStart, stop:v.timeRangeStop) |> filter(fn: (r) => r._measurement == "realtime" and r.symbol == "ETH" and r._field == "price" ) |> window(every: 1h) |> mean()
|> duplicate(column: "_stop", as: "_time") |> window(every: inf)


## Time

### 時間粗化
```javascript=
  import "date"
  ...
  |> map(fn: (r) => ({ r with _time: date.truncate(t: r._time, unit: 1d)    }))

一定時間內的Min / Max

```javascript= t1 = from(bucket: "quote") |> range(start: v.timeRangeStart, stop:v.timeRangeStop) |> filter(fn: (r) => r._measurement == "realtime" and r._field == "price" and r.symbol == "${symbolSel}" ) |> window(every: 1h) |> max()
|> window(every: inf) |> map(fn: (r) => ({ r with alias:"1h max" }))

t1


### 時間shift
```javascript=
  |> timeShift(duration: 120d)

時間增加...用在range()

```javascript= maShiftDuration= duration(v: "-"+string(v: (5*${y1_ma_n})) +"m")

ser= from(bucket: "quote") |> range(start: date.add(d: maShiftDuration , to : v.timeRangeStart ) , stop:v.timeRangeStop) ...


## value function / map 常用
### IF ... Else...
```javascript=
 |>map(fn: (r) => ({ r with alias: if r._field == "quote" then "Ordered-"+r.side else "StartOrder-"+r.side}))   

Math.abs

```javascript= import "math" math.abs(x: -1.22)


### findColumn Example
```javascript=
a=  from(bucket: "quote")
  |> range(start: v.timeRangeStart, stop:v.timeRangeStop)
   |> filter(fn: (r) =>
    r._measurement == "realtime" and
    r.symbol == "${symbol}" and
    r._field == "price"
  )
  |>max()
  |> findColumn(
      fn: (key) => key._field == "price",
      column: "_value"
    )


from(bucket: "quote")
  |> range(start: v.timeRangeStart, stop:v.timeRangeStop)
   |> filter(fn: (r) =>
    r._measurement == "realtime" and
    r.symbol == "${symbol}" and
    r._field == "price"
  )
  |>map(fn: (r) => ({ r with _value: a[0] }))   

string

string replace

```javascript= import "strings" ... |> movingAverage(n: int( v: strings.replaceAll(v: "${period}", t: "m", u: ""))/5 )


## object to stream
```javascript=
import "experimental"
import "array"
import "experimental/record"
user = {firstName: "John", lastName: "Doe", age: "42"}

dKeys= experimental.objectKeys(o: user)// Returns [firstName, lastName, age]
showKeys = dKeys |> array.map(fn: (x) => ({_value: x}))
showKV =  dKeys |> array.map(fn: (x) => ({field: x , val : record.get(r: user, key: x, default: "") }))

array.from(rows: showKV )
tags: influx grafana

在 GitHub 看原文