influxdb 2

09/03/2021

install with docker

influxdb:
        image: influxdb
        container_name: influxdb
        restart: always
        volumes:
            - ./influxdb/data:/var/lib/influxdb2
            - ./influxdb/config:/etc/influxdb2
        labels:
            - traefik.enable=true
            - traefik.http.routers.influxdb.rule=Host(`influxdb.${DOMAIN}`)
            - traefik.http.routers.influxdb.tls.certresolver=le
            - traefik.http.routers.influxdb.entrypoints=websecure
            - traefik.http.routers.influxdb.middlewares=securityheaders

create an organisation

docker exec -it influxdb influx setup

to create another bucket

docker exec -ti influxdb  influx bucket create --name mydb --org x --retention 360d
docker exec -ti influxdb  influx bucket list
docker exec -ti influxdb  influx bucket delete --name mydb --org x

to get a powerful token

docker exec -ti influxdb influx auth create -o x  --read-buckets --read-checks --read-dashboards --read-dbrps --read-notificationEndpoints --read-notificationRules --read-orgs --read-tasks --read-telegrafs --read-user --write-buckets --write-checks --write-dashboards --write-dbrps --write-notificationEndpoints --write-notificationRules --write-orgs --write-tasks --write-telegrafs --write-user

insert data :

curl -X POST "http://localhost:8086/api/v2/write?org=x&bucket=bucket&precision=s" --header "Authorization: Token xxxxxxxxxx" --data-raw "mem,host=host1 used_percent=23.43234543 1556896326"

explore data

goto https://influxdb.${DOMAIN}

delete data

docker exec -ti influxdb influx delete --org x --bucket bucket --start 1970-01-01T00:00:00Z --stop $(date +"%Y-%m-%dT%H:%M:%SZ") --predicate '_measurement="dockerupdate"'

flux

curl --request POST https://influxdb.${DOMAIN}/api/v2/query?org=x  \
--header 'Authorization: Token TOKEN' \
--header 'Accept: application/csv' \
--header 'Content-type: application/vnd.flux' \
--data 'from(bucket:"bucket")
    |> range(start: -12h)
    |> aggregateWindow(every: 1h, fn: mean)'


from(bucket: "bucket")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "dockerevents")
  |> filter(fn: (r) => r["_field"] == "nb")
  |> drop(columns: ["hostname", "containerName", "action", "type"])
|> aggregateWindow(every: 1h, fn: sum)
  |> yield(name: "mean")

si on a une table remplie comme ça :

dockerbackup,backuphost=host,hostname=host,driver=driver name=all,db=- error=0,ms=123,size=234,sizeTransfert=456

Cette requete renvoie une ligne par field :
backuphost=host,hostname=host,driver=driver name=all,db=- error=0
backuphost=host,hostname=host,driver=driver name=all,db=- ms=123
...

from(bucket: "bucket")
|> range(start: -1d)
|> filter(fn: (r) => r["_measurement"] == "dockerbackup")
|> filter(fn: (r) => r["_field"] == "error" and r["_value"] == 1)
|> filter(fn: (r) => r["driver"] == "rsync")
|> sort(columns:["_time"], desc: true)

|> pivot

Pour avoir sur chaque ligne une colone qui porte le nom du field (donc error, ms, size, sizeTransfert) il faut utiliser pivot

from(bucket: "bucket")
|> range(start: -1d)
|> filter(fn: (r) => r["_measurement"] == "dockerbackup")
|> filter(fn: (r) => r["_field"] == "error" and r["_value"] == 1)
|> filter(fn: (r) => r["driver"] == "rsync")
|> pivot(rowKey: ["_time"], columnKey: ["_field"], valueColumn: "_value")
|> filter(fn: (r) => r["ms"] > "${maxms}")
|> sort(columns:["_time"], desc: true)

|> group

Si on a plusieurs tags, mais qu'on veut faire la somme sans distinguer par tag il faut

from(bucket: "bucket")
|> range(start: -1d)
|> group()
|> sort(columns:["_time"], desc: true)

le group par defaut est suremment

|> group(columns: ["_measurement", "_field"])