TimescaleDB
TimescaleDB is a category-defining relational database for time-series data. Packaged as a PostgreSQL extension, TimescaleDB is designed to be easy to use, easy to get started, and easy to maintain.
Download this sample dataset by Timescale
Docker Compose
1mkdir /tmp/prest+timescaledb
2cd /tmp/prest+timescaledb
3cat <<YML > docker-compose.yml
4---
5version: "3"
6services:
7 timescaledb:
8 image: timescale/timescaledb:latest-pg12
9 volumes:
10 - "./data:/var/lib/postgresql/data"
11 - "/tmp:/var/tmp"
12 environment:
13 - POSTGRES_USER=prest
14 - POSTGRES_DB=prest
15 - POSTGRES_PASSWORD=prest
16 ports:
17 - "5432:5432"
18 prest:
19 image: prest/prest:latest
20 links:
21 - "timescaledb:timescaledb"
22 environment:
23 - PREST_DEBUG=true # remove comment for enable DEBUG mode (disable JWT)
24 - PREST_PG_HOST=timescaledb
25 - PREST_PG_USER=prest
26 - PREST_PG_PASS=prest
27 - PREST_PG_DATABASE=prest
28 - PREST_PG_PORT=5432
29 - PREST_JWT_DEFAULT=false # remove if need jwt
30 - PREST_SSL_MODE=disable
31 depends_on:
32 - timescaledb
33 ports:
34 - "3000:3000"
35YML
Starting up the containers
1docker-compose pull
2docker-compose up -d
Creating database structure
1curl https://timescaledata.blob.core.windows.net/datasets/devices_small.tar.gz -o /tmp/devices_small.tar.gz
2tar -C /tmp -xzvf /tmp/devices_small.tar.gz
3docker-compose exec -T timescaledb psql -U prest -f /var/tmp/devices.sql
Loading data
1docker-compose exec -T timescaledb psql -U prest <<SQL
2COPY device_info FROM '/var/tmp/devices_small_device_info.csv' WITH (FORMAT CSV);
3COPY readings FROM '/var/tmp/devices_small_readings.csv' WITH (FORMAT CSV);
4SQL
Simple Query
SQL execution:
1docker-compose exec -T timescaledb psql -U prest <<SQL
2SELECT
3 time, device_id, battery_temperature
4FROM
5 readings
6WHERE
7 battery_status = 'charging'
8ORDER BY
9 time DESC
10LIMIT
11 10;
12SQL
prestd execution:
1curl -G http://localhost:3000/prest/public/readings \
2 -d battery_status='$eq.charging' \
3 -d _select=time,device_id,battery_temperature \
4 -d _order=-time \
5 -d _page=1 \
6 -d _page_size=10
Joining tables
SQL execution:
1docker-compose exec -T timescaledb psql -U prest <<SQL
2SELECT
3 time, readings.device_id, cpu_avg_1min,
4 battery_level, battery_status, device_info.model
5FROM
6 readings
7 JOIN device_info ON readings.device_id = device_info.device_id
8WHERE
9 battery_level < 33
10 AND battery_status = 'discharging'
11ORDER BY
12 cpu_avg_1min DESC, time DESC
13LIMIT
14 5;
15SQL
prestd execution:
1curl -G http://localhost:3000/prest/public/readings \
2 -d battery_level='$lt.33' \
3 -d battery_status='$eq.discharging' \
4 -d _select='time,readings.device_id,cpu_avg_1min,battery_level,battery_status,device_info.model' \
5 -d _join='inner:device_info:readings.device_id:$eq:device_info.device_id' \
6 -d _order='-cpu_avg_1min,-time' \
7 -d _page=1 \
8 -d _page_size=5
Using VIEWs
Creating VIEW named battery_level_by_hour
:
1docker-compose exec -T timescaledb psql -U prest <<SQL
2CREATE VIEW battery_level_by_hour AS
3SELECT
4 time_bucket('1 hour', time) AS "hour",
5 model,
6 min(battery_level) AS min_battery_level,
7 max(battery_level) AS max_battery_level
8FROM
9 readings
10 JOIN device_info ON readings.device_id = device_info.device_id
11GROUP BY
12 "hour", model;
13SQL
Aggregating data over battery_level_by_hour
view:
1docker-compose exec -T timescaledb psql -U prest <<SQL
2SELECT
3 hour, min(min_battery_level), max(max_battery_level)
4FROM
5 battery_level_by_hour
6WHERE
7 model IN ('pinto', 'focus')
8GROUP BY
9 hour
10ORDER BY
11 hour ASC
12LIMIT
13 12;
14SQL
prestd execution:
1curl -G http://localhost:3000/prest/public/battery_level_by_hour \
2 -d model='$in.pinto,focus' \
3 -d _select='hour,min:min_battery_level,max:max_battery_level' \
4 -d _groupby='hour' \
5 -d _order='hour'
Simple SELECT over battery_level_by_hour
view:
1docker-compose exec -T timescaledb psql -U prest <<SQL
2SELECT
3 hour, min_battery_level, max_battery_level
4FROM
5 battery_level_by_hour
6WHERE
7 model = 'mustang'
8LIMIT
9 5;
10SQL
**prestd execution over battery_level_by_hour
view:
1curl -G http://localhost:3000/prest/public/battery_level_by_hour \
2 -d model='$eq.mustang' \
3 -d _select='hour,min_battery_level,max_battery_level' \
4 -d _order='hour' \
5 -d _page='1' \
6 -d _page_size='5'
Batch Insert data
Using default INSERT statement WITH returning inserted data:
1curl http://localhost:3000/batch/prest/public/readings \
2 -H "Content-Type: application/json" \
3 -d @- << JSON
4 [
5 {"time": "2020-10-17T20:19:30+00:00", "device_id": "demo000000", "battery_level": 43, "battery_status": "discharging", "battery_temperature": 89.8, "bssid": "01:02:03:04:05:06", "cpu_avg_1min": 28.84, "cpu_avg_5min": 16.9047812612903, "cpu_avg_15min": 10.8993036332756, "mem_free": 420023054, "mem_used": 579976946, "rssi": -40, "ssid": "demo-net"},
6 {"time": "2020-10-17T20:19:30+00:00", "device_id": "demo000001", "battery_level": 27, "battery_status": "discharging", "battery_temperature": 89.3, "bssid": "A0:B1:C5:D2:E0:F3", "cpu_avg_1min": 4.89, "cpu_avg_5min": 6.63334573320236, "cpu_avg_15min": 9.25968056754939, "mem_free": 717784757, "mem_used": 282215243, "rssi": -41, "ssid": "stealth-net"},
7 {"time": "2020-10-17T20:19:30+00:00", "device_id": "demo000002", "battery_level": 29, "battery_status": "discharging", "battery_temperature": 93.7, "bssid": "A0:B1:C5:D2:E0:F3", "cpu_avg_1min": 8.29, "cpu_avg_5min": 6.78591150918263, "cpu_avg_15min": 7.37546420066158, "mem_free": 634081377, "mem_used": 365918623, "rssi": -54, "ssid": "stealth-net"},
8 {"time": "2020-10-17T20:19:30+00:00", "device_id": "demo000003", "battery_level": 14, "battery_status": "discharging", "battery_temperature": 93.1, "bssid": "01:02:03:04:05:06", "cpu_avg_1min": 8.83, "cpu_avg_5min": 8.18492270691781, "cpu_avg_15min": 11.3986054360923, "mem_free": 563352328, "mem_used": 436647672, "rssi": -30, "ssid": "demo-net"},
9 {"time": "2020-10-17T20:19:30+00:00", "device_id": "demo000004", "battery_level": 58, "battery_status": "discharging", "battery_temperature": 93.2, "bssid": "22:32:A2:B3:05:98", "cpu_avg_1min": 8.79, "cpu_avg_5min": 10.3900175308572, "cpu_avg_15min": 13.5103326842724, "mem_free": 642162250, "mem_used": 357837750, "rssi": -62, "ssid": "demo-5ghz"}
10 ]
11JSON
Using COPY statement WITHOUT returning inserted data:
1curl http://localhost:3000/batch/prest/public/readings \
2 -H "Content-Type: application/json" \
3 -H "Prest-Batch-Method: copy" \
4 -d @- << JSON
5 [
6 {"time": "2020-10-17T20:19:30+00:00", "device_id": "demo000000", "battery_level": 43, "battery_status": "discharging", "battery_temperature": 89.8, "bssid": "01:02:03:04:05:06", "cpu_avg_1min": 28.84, "cpu_avg_5min": 16.9047812612903, "cpu_avg_15min": 10.8993036332756, "mem_free": 420023054, "mem_used": 579976946, "rssi": -40, "ssid": "demo-net"},
7 {"time": "2020-10-17T20:19:30+00:00", "device_id": "demo000001", "battery_level": 27, "battery_status": "discharging", "battery_temperature": 89.3, "bssid": "A0:B1:C5:D2:E0:F3", "cpu_avg_1min": 4.89, "cpu_avg_5min": 6.63334573320236, "cpu_avg_15min": 9.25968056754939, "mem_free": 717784757, "mem_used": 282215243, "rssi": -41, "ssid": "stealth-net"},
8 {"time": "2020-10-17T20:19:30+00:00", "device_id": "demo000002", "battery_level": 29, "battery_status": "discharging", "battery_temperature": 93.7, "bssid": "A0:B1:C5:D2:E0:F3", "cpu_avg_1min": 8.29, "cpu_avg_5min": 6.78591150918263, "cpu_avg_15min": 7.37546420066158, "mem_free": 634081377, "mem_used": 365918623, "rssi": -54, "ssid": "stealth-net"},
9 {"time": "2020-10-17T20:19:30+00:00", "device_id": "demo000003", "battery_level": 14, "battery_status": "discharging", "battery_temperature": 93.1, "bssid": "01:02:03:04:05:06", "cpu_avg_1min": 8.83, "cpu_avg_5min": 8.18492270691781, "cpu_avg_15min": 11.3986054360923, "mem_free": 563352328, "mem_used": 436647672, "rssi": -30, "ssid": "demo-net"},
10 {"time": "2020-10-17T20:19:30+00:00", "device_id": "demo000004", "battery_level": 58, "battery_status": "discharging", "battery_temperature": 93.2, "bssid": "22:32:A2:B3:05:98", "cpu_avg_1min": 8.79, "cpu_avg_5min": 10.3900175308572, "cpu_avg_15min": 13.5103326842724, "mem_free": 642162250, "mem_used": 357837750, "rssi": -62, "ssid": "demo-5ghz"}
11 ]
12JSON