I wanted to test out InfluxDB for a project so I though "whats the easiest way I can play around with it in 30 mintues"
I chose to use Docker as I had it installed on my machine and it just makes things easy...
So here is what I found
Here we are going to run the InfluxDB container and then attach to the running container in order to use the InfluxDB CLI.
Continer Info can be found here - https://hub.docker.com/_/influxdb
One caviat before we begin, yes you will need to have docker installed or alternatively you can install InfluxDB on a machine.
docker run -p 8086:8086 influxdb in your terminal, if you don't have the latest image downloaded then you'll see that docker pulls it from docker hub.
laptop:adam.jarvis$ docker run -p 8086:8086 influxdb Using default tag: latest latest: Pulling from library/influxdb 6f2f362378c5: Pull complete 494c27a8a6b8: Pull complete 7596bb83081b: Pull complete 058194e87993: Pull complete e59ecfe2e49e: Pull complete 0e92dec1b17d: Pull complete f53096159982: Pull complete 0cf0c73a3724: Pull complete Digest: sha256:81270b10e58ce1aa448b3d4ab2ba9d55b6b1fa35e7815ae38d5f346206f17c57 Status: Downloaded newer image for influxdb:latest
Once the container is downloaded, the container will start - I am using InfluxDB version: 1.7.7.
-p 8086:8086 command isn't necessary for this but if you want to connect an external service such as Grafana you need this port open.
Once the container has started run to
docker ps command which should give you this output.
laptop:adam.jarvis$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 10733ba6d014 influxdb "/entrypoint.sh infl…" 8 seconds ago Up 7 seconds 8086/tcp agitated_colden
From here we need to connect to the container so that we can access it's CLI.
docker exec -it <CONTAINER ID> /bin/bash command, this attachs us to the container and delivers us to the bash promt
laptop:adam.jarvis$ docker exec -it 10733ba6d014 /bin/bash root@10733ba6d014:/# root@10733ba6d014:/#
We are now able to access the InfluxDB containers CLI, the Docker part is complete...
To enter the InfluxDB CLI simply type
influx into the the container terminal that we just attached too.
root@10733ba6d014:/# root@10733ba6d014:/# influx Connected to http://localhost:8086 version 1.7.7 InfluxDB shell version: 1.7.7 > >
Now we are in the InfluxDB CLI the first thing to do is to create a database, this is done by running the
create database <database name> statement.
> > create database myFirstInfluxDb >
To make sure it's created run
> show databases name: databases name ---- _internal myFirstInfluxDb >
Before we can insert data into the DB we first need to swtich to it, this is done using the
use <database name> command.
> use myFirstInfluxDb Using database myFirstInfluxDb >
Now that we are using the database we want to create a table and add data but first we must understand the InfluxDB Line Protocol
The InfluxDB line protocol is a text based format for writing points to the database.
A single line of text in line protocol format represents one data point in InfluxDB. It informs InfluxDB of the point’s measurement, tag set, field set, and timestamp. The following code block shows a sample of line protocol and breaks it into its individual components:
weather,location=us-midwest temperature=82 1465839830100400200 | -------------------- -------------- | | | | | | | | | +-----------+--------+-+---------+-+---------+ |measurement|,tag_set| |field_set| |timestamp| +-----------+--------+-+---------+-+---------+
The way I see it
The insert statements look like
insert <measurement>,<tag_set>=<tag_set value> <field_set>=<field_set value>. Insert the values below so that we can manipulate these after.
insert tempratureRecord,location="Garden" temp=32i insert tempratureRecord,location="Garden" temp=12i insert tempratureRecord,location="Garden" temp=19i insert tempratureRecord,location=“Bedroom” temp=18i insert tempratureRecord,location=“Bedroom” temp=17i insert tempratureRecord,location=“Bedroom” temp=21i insert tempratureRecord,location=“Garage” temp=20i,humidity=65i insert tempratureRecord,location=“Garage” temp=30i,humidity=53i insert tempratureRecord,location=“Garage” temp=40i,humidity=47i
Notice the letter
i after each number - this is used to signal that the value is an integer. Normally with a relational SQL database you would define the data type in advance but not with InfluxDB this is done when we insert data.
Now we have data in the database we can begin to manipulate it. The query syntax has a strong resembilance to SQL so to get all the data from the the tempratureRecord table we run
select * from tempratureRecord.
> > select * from tempratureRecord name: tempratureRecord time humidity location temp ---- -------- -------- ---- 1562158793803208700 Garden 40 1562158793814101500 Garden 12 1562158793817141000 Garden 19 1562158793820141300 Bedroom 18 1562158793823133500 Bedroom 17 1562158793825951200 Bedroom 21 1562158793829004000 65 Garage 20 1562158793836015300 53 Garage 30 1562158794478890100 47 Garage 40 >
This, like SQL, selects all the data in the measurement (table)
tempratureRecord including both the tag and field sets.
From here we can select specific columns from the measurement (table) by specifiying the field/tag set. In this example we are selecting the all the records that have the humidity filed set. This is done by typing
select humidity from tempratureRecord.
> select humidity from tempratureRecord name: tempratureRecord time humidity ---- -------- 1562158793829004000 65 1562158793836015300 53 1562158794478890100 47 >
As you can see only three entries are shown as when we inserted the data only three records had the humidity field attribute.
And finally as you'd expect you can select multiple fields at once. Here we are selecting both the
humidity field and not the
location tag set attribute
> > select temp, humidity from tempratureRecord name: tempratureRecord time temp humidity ---- ---- -------- 1562158793803208700 40 1562158793814101500 12 1562158793817141000 19 1562158793820141300 18 1562158793823133500 17 1562158793825951200 21 1562158793829004000 20 65 1562158793836015300 30 53 1562158794478890100 40 47 >
The 'where' statements are important when we want to minipulate the data that we have.
You can do
where clauses on both the tag sets and field sets. Firstly we are going to select all the data that came from the garden sensor using
select temp from tempratureRecord where location='Garden'
Notice because the tag set is a string we need to put the word in quotes -
> > select temp from tempratureRecord where location='Garden' name: tempratureRecord time temp ---- ---- 1562158793803208700 40 1562158793814101500 12 1562158793817141000 19 >
We then get all the data from just the garden sensor as expected and now to get data from a field set. Good news this is exactly the same!
This time we are going to return all the tempratures that were over 19 Degrees (Celsius).
> > select temp from tempratureRecord where temp > 19 name: tempratureRecord time temp ---- ---- 1562158793803208700 40 1562158793825951200 21 1562158793829004000 20 1562158793836015300 30 1562158794478890100 40 >
So that's it for now! Next I'll try this with Grafana so that we can visualise the data we've inserted into this database.