Primeiros passos no InfluxDB

June 04, 2017 | 6 Minute Read
Manipular o InfluxDB pode parecer uma missão muito difícil inicialmente, mas quem está acostumado com SQL verá que não é tão diferente disso.

Eu já falei sobre a estrutura do InfluxDB e sobre o que é uma série temporal em outro post aqui no blog. Desta vez, quero mostrar a manipulação dos dados no banco, então bora colocar a mão na massa!

Setup rápido

Eu sugiro rodar o InfluxDB num docker container pra facilitar a diversão:

$ docker run --name influxzinho influxdb # use a opção -d pra rodar na opção detached

Mas você pode instalar o InfluxDB normalmente seguindo o manual de instalação oficial :)

Então, é só abrir o client do banco dentro do container, vamos logo começar a festa:

$ docker exec -it influxzinho bash
# Dentro do container:
$ influx

É importante ressaltar que, por padrão, o InfluxDB roda na porta 8086.

O InfluxDB possui uma sintaxe própria para manipular suas estruturas de dados: o InfluxQL (InfluxDB Query Language). A partir daqui, é somente ele que utilizo para manipular o banco.

Databases

Para listar as databases existentes:

> SHOW DATABASES
name: databases
name
----
_internal

>

O nome da database padrão do InfluxDB é a _internal.

Para criar uma database nova basta usar o comando

> CREATE DATABASE test
>

Uma vez criada, basta então alternar entre as databases:

> USE test
Using database test
>

Inserção de dados

E agora? Vamos criar uma tabela? Determinar as colunas? E também os Fields, as Tags e os seus tipos? Nada disso é necessário, jovem Padawan. A sintaxe da inserção de dados é responsável por definir toda a estrutura dos dados.

O comando de criação de um ponto (registro) no banco é o INSERT (use ele com cuidado e carinho) que é descrito da seguinte maneira:

<measurement>[,<tag_key>=<tag_value>[,<tag_key>=<tag_value>]] <field_key>=<field_value>[,<field_key>=<field_value>] [<timestamp>]

O measurement é obrigatório, por isso é que está envolvido pelos sinais <>. O que está entre colchetes simboliza que o seu conteúdo é opcional.

Na prática, os comandos têm baixa complexidade. Vamos tomar o exemplo de medições de temperaturas no meu banco:

> INSERT temperature celcius=25.4
>

temperature será a minha measurement e celcius com seu valor(25.4) será um field. Caso eu queira adicionar mais um field, basta utilizar uma vírgula(,) para separar os elementos:

> INSERT temperature celcius=25.4,fahrenheit=77.54
>

Além disso, é fundamental utilizar as tags para indexar a busca e filtrar os registros inseridos na base, como já visto no episódio anterior. Para fazer isso, é só incluir a tag após o measurement separados por uma vírgula(,) e deixar um espaço ( ) no final pra separá-la dos fields:

> INSERT temperature,city=Marília celcius=25.4,fahrenheit=77.54
>

Caso queira ter mais de uma tag, basta repetir a regra dos fields: separe eles com uma vírgula

> INSERT temperature,city=Marília,state=SP celcius=25.4,fahrenheit=77.54
>

Em todos os cenários anteriores o timestamp é definido automaticamente com o valor do instante em que o registro é inserido. Entretanto, é possível determinar o valor do timestamp:

> INSERT temperature,city=Marília,state=SP celcius=25.4,fahrenheit=77.54 1496510681952374020
>

Consulta de dados

Para exibir todos os registros de uma measurement, o comando em InfluxQL é muito parecido com SQL:

> SELECT * FROM temperature
name: temperature
time                celcius city      fahrenheit state
----                ------- ----      ---------- -----
1496510104709742573 25.4
1496510114111767822 25.4              77.54
1496510533023926338 25.4    Marília   77.54
1496510681952374018 25.4    Marília   77.54      SP
1496510681952374020 25.4    Marília   77.54      SP

>

Você pode olhar os fields definidos pra essa measurement:

> SHOW FIELD KEYS FROM temperature
name: temperature
fieldKey   fieldType
--------   ---------
celcius    float
fahrenheit float

>

E também as tags:

> SHOW TAG KEYS FROM temperature
name: temperature
tagKey
------
city
state

>

O comando SELECT aceita também os condicionais de WHERE para filtrar os resultados:

> SELECT * FROM temperature WHERE city='Marília'
name: temperature
time                celcius city    fahrenheit state
----                ------- ----    ---------- -----
1496510533023926338 25.4    Marília 77.54
1496510681952374018 25.4    Marília 77.54      SP
1496510681952374020 25.4    Marília 77.54      SP

>

Considerações finais

Caso seja de seu interesse se aprofundar nos conceitos do InfluxQL, eu sugiro uma boa lida no manual de referência da linguagem.

Fora essa integração via client influx, o InfluxDB também já possui uma integração HTTP. Existem bibliotecas em várias linguagens que já integram com esse banco de dados, então o caminho já está trilhado.

Eu não falei sobre autenticação para enfatizar a manipulação dos dados. Entretanto, o usuário padrão do InfluxDB é o admin, cuja senha também é admin. Você deve criar os seus usuários de acordo com a necessidade de suas aplicações (seja cuidadoso com segurança sempre). Utilize o comando CREATE USER seguindo as indicações do manual.

Essa ferramenta é muito poderosa, use ela com cuidado! Use as tags pra indexação e fields pros dados que realmente são a sua série temporal.

Espero que esse post ajude em sua jornada, jovem. Contribuições são bem vindas :)

Bom dia e boa sorte!