Skip to content

Instantly share code, notes, and snippets.

@reinaldocoelho
Last active July 12, 2023 20:39
Show Gist options
  • Save reinaldocoelho/4566a1172fc87334682fc346934595f6 to your computer and use it in GitHub Desktop.
Save reinaldocoelho/4566a1172fc87334682fc346934595f6 to your computer and use it in GitHub Desktop.
Documento sobre queries no InfluxDB, explicando algumas formas de organizar.

Telegraf

  • O telegraf é o sistema que recupera, processa e dispara registros de fontes para os destinos.

O telegraf é dividido na seguinte estrutura:

  1. Configurações - Configurações gerais de comportamento
  2. Inputs - Processadores de Input que vão ler alguma estrutura de entrada, seja arquivo, banco ou log.
  3. Processors - Podem
  4. Aggregators
  5. Output

Influx 1.x

Influx 2.x

Sobre o InfluxDB

  • Existe uma diferença grande sobre o InfluxDB 1 e 2, vamos manter nesse documento somente informações sobre a versão 2 para evitar confusão.
  • O InfluxDB tem como finalidade principal ser um Hub de pesquisa e transformação permitindo que vc faça diversas pesquisas em fontes diversas, mesclando os resultados e calculando e entregando um resultado único.

Organização do InfluxDB

  • Bucket [Banco de dados]
  • Measurement [Tabela]
  • Tag [Campos indexados para filtro]
  • Field/Value [Campos e valores para calculo]

Dica: É possível no Telegraf, tratar e transformar dados para chegar ao InfluxDB mais preparado: https://docs.influxdata.com/telegraf/v1.22/configure_plugins/aggregator_processor/

Estruturas

  • Bucket - Seria como um banco de dados no servidor, que pode ter diversas estruturas internas a serem trabalhadas.
  • Estrutura de pesquisa - Normalmente utiliza todas as estruturas abaixo, porém não é uma necessidade
    • Source - Fonte da origem dos dados, pode ser InfluxDb, arquivo CSV, SQL e etc (Obrigatório).
    • Filter - Filtro aplicado aos dados para recuperação e tratamento posterior. (Legal ter algum, nem que um filtro de data).
    • Shape - Calculo aplicado, seja contagem, média, sumarização, agrupamento ou outros. (Opcional).
    • Process - Processo final para retornar a estrutura dos dados (Obrigatorio).

Exemplo de estrutura:

from(bucket: "example-bucket")              // ── Source
    |> range(start: -1d)                    // ── Filter on time
    |> filter(fn: (r) => r._field == "foo") // ── Filter on column values
    |> group(columns: ["sensorID"])         // ── Shape
    |> mean()                               // ── Process

Explorando estrutura

É possível dentro do Influx explorar a estrutura de dados existente, como é efetuado no SQL.

Para listas os buckets (bancos) do servidor pode-se utilizar:

import "influxdata/influxdb/schema"
// List buckets
buckets()

Exibe a seguinte saida:

#group,false,false,false,false,true,false,false
#datatype,string,long,string,string,string,string,long
#default,_result,,,,,,
,result,table,name,id,organizationID,retentionPolicy,retentionPeriod
,,0,_monitoring,2d668a4439cfffe6,9d2d14719fae72dc,,604800000000000
,,0,_tasks,e5f03c53a670be12,9d2d14719fae72dc,,259200000000000
,,0,logs,2dddf3d5b2fe3aac,9d2d14719fae72dc,,604800000000000

Mais detalhes em: https://docs.influxdata.com/influxdb/cloud/query-data/flux/explore-schema/

Transformação de dados

Como é estruturado o dado no InfluxDB

Best Practices

Formas de mudar a estrutura ao retornar dados

Schemas

Pesquisas

Pesquisa simples

  • Query simples como um SELECT * FROM BANCO.TABELA num Bucket do InfluxDB:
from(bucket: "BANCO")
  |> range(start: -10h) // -- Filtro pegar registro das ultimas 10 horas
  |> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value") // -- Transforma todas as estruturas de Chave/Valor da base em uma visão de tabela ("PIVOTANDO")

Pesquisa simples com filtro

  • Query simples com filtro numa das colunas SELECT * FROM BANCO.TABELA WHERE STATUS = "200":
from(bucket: "BANCO")
  |> range(start: -10h)
  |> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value")
  |> filter(fn: (r) => r.http_status == "200") // -- Efetua o filtro na coluna "http_status" com valor "200"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment