VectorSQL is a free analytics DBMS for IoT & Big Data, compatible with ClickHouse.

NOTICE: This project have moved to fuse-query

VectorSQL Logo


Github Actions Status Github Actions Status Github Actions Status codecov.io License

VectorSQL is a free analytics DBMS for IoT & Big Data, compatible with ClickHouse.

Features

  • High Performance
  • High Scalability
  • High Reliability

Server

$git clone https://github.com/vectorengine/vectorsql
$cd vectorsql
$make build
$./bin/vectorsql-server -c conf/vectorsql-default.toml
	
 2020/01/27 19:02:39.245654    	 [DEBUG] 	Database->Attach Table:system.tables, engine:SYSTEM_TABLES <attachTable@database_system.go:116>
 2020/01/27 19:02:39.245670    	 [DEBUG] 	Database->Attach Table:system.databases, engine:SYSTEM_DATABASES <attachTable@database_system.go:116>
 2020/01/27 19:02:39.245680    	 [INFO] 	Database->Load Database:system <[email protected]:110>
 2020/01/27 19:02:39.245794    	 [INFO] 	Listening for connections with native protocol (tcp)::9000 <[email protected]:33>
 2020/01/27 19:02:39.245806    	 [INFO] 	Servers start... <[email protected]:62>

Client

  • clickhouse-client
$clickhouse-client --compression=0
VectorSQL :) SELECT SUM(IF(status!=200, 1, 0)) AS errors, SUM(IF(status=200, 1, 0)) as success, (errors/COUNT(server)) AS error_rate,(success/COUNT(server)) as success_rate, (SUM(response_time)/COUNT(server)) AS load_avg, MIN(response_time), MAX(response_time), path, server FROM logmock(rows->15) GROUP BY server, path HAVING errors>0 ORDER BY server ASC, load_avg DESC;

SELECT 
    SUM(IF(status != 200, 1, 0)) AS errors, 
    SUM(IF(status = 200, 1, 0)) AS success, 
    errors / COUNT(server) AS error_rate, 
    success / COUNT(server) AS success_rate, 
    SUM(response_time) / COUNT(server) AS load_avg, 
    MIN(response_time), 
    MAX(response_time), 
    path, 
    server
FROM logmock(rows -> 15)
GROUP BY 
    server, 
    path
HAVING errors > 0
ORDER BY 
    server ASC, 
    load_avg DESC

┌─errors─┬─success─┬─error_rate─┬─success_rate─┬─load_avg─┬─MIN(response_time)─┬─MAX(response_time)─┬─path───┬─server──────┐
│      2 │       1 │     0.6667 │       0.3333 │       12 │                 10 │                 13 │ /login │ 192.168.0.1 │
│      1 │       5 │     0.1667 │       0.8333 │  11.1667 │                 10 │                 12 │ /index │ 192.168.0.1 │
│      1 │       3 │       0.25 │         0.75 │    11.25 │                 10 │                 14 │ /index │ 192.168.0.2 │
│      1 │       1 │        0.5 │          0.5 │       11 │                 10 │                 12 │ /login │ 192.168.0.2 │
└────────┴─────────┴────────────┴──────────────┴──────────┴────────────────────┴────────────────────┴────────┴─────────────┘
↓ Progress: 0.00 rows, 0.00 B (0.00 rows/s., 0.00 B/s.) 
4 rows in set. Elapsed: 0.005 sec. 
  • http-client
curl -XPOST http://127.0.0.1:8123 -d "SELECT SUM(IF(status!=200, 1, 0)) AS errors, SUM(IF(status=200, 1, 0)) as success, (errors/COUNT(server)) AS error_rate,(success/COUNT(server)) as success_rate, (SUM(response_time)/COUNT(server)) AS load_avg, MIN(response_time), MAX(response_time), path, server FROM logmock(rows->15) GROUP BY server, path HAVING errors>0 ORDER BY server ASC, load_avg DESC"
2	1	0.6667	0.3333	12.0000	10	13	/login	192.168.0.1
1	5	0.1667	0.8333	11.1667	10	12	/index	192.168.0.1
1	3	0.2500	0.7500	11.2500	10	14	/index	192.168.0.2
1	1	0.5000	0.5000	11.0000	10	12	/login	192.168.0.2

Query Language Features

Query language Current version Future versions Example
Scans by Value + + SELECT a,b
Scans by Expression + + SELECT IF(a>2,a,b),SUM(a)
Filter by Value + + WHERE a>10
Filter by Expression + + WHERE a>(b+10)
Group-Aggregate by Value + + GROUP BY a
Group-Aggregate by Expression + + GROUP BY (a+1)
Group-Having by Value + + HAVING count_a>2
Group-Having by Expression + + HAVING (count_a+1)>2
Order by Value + + ORDER BY a desc
Order by Expression + + ORDER BY (a+b)
Window Functions - +
Common Table Expressions - +
Join - +

Performance

  • Dataset: 10,000,000 (10 Million)
  • Hardware: 16vCPUx16G KVM Cloud Instance
  • Benchmark
Query Cost(second)
SELECT COUNT(id) FROM testdata 0.269s
SELECT COUNT(id) FROM testdata WHERE id!=0 0.438s
SELECT SUM(data1) FROM testdata 0.287s
SELECT SUM(data1) AS sum, COUNT(data1) AS count, sum/count AS avg FROM testdata 1.814s
SELECT MAX(id), MIN(id) FROM testdata 0.473s
SELECT COUNT(data1) AS count, data1 FROM testdata GROUP BY data1 ORDER BY count DESC LIMIT 10 0.728s
SELECT email FROM testdata WHERE email like '%[email protected]%' LIMIT 1 0.076s
SELECT COUNT(email) FROM testdata WHERE email like '%[email protected]%' 1.470s
SELECT data1 AS x, x - 1, x - 2, x - 3, count(data1) AS c FROM testdata GROUP BY x, x - 1, x - 2, x - 3 ORDER BY c DESC LIMIT 10 2.396s

Metrics

http://localhost:8080/debug/metrics

Comments
  • clickhouse-client connection time out

    clickhouse-client connection time out

    my docker clickhouse-client:

    leo@LEO MINGW64 ~/Desktop
    $ winpty docker run -it yandex/clickhouse-client --host 192.168.0.106 --compression=0
    ClickHouse client version 20.1.4.14 (official build).
    Connecting to 192.168.0.106:9000 as user default.
    
    
    Code: 209. DB::NetException: Timeout exceeded while reading from socket (192.168.0.106:9000)
    
    

    server log:

     2020/02/29 15:39:22.557296      [INFO]         Memory InUse: 3.3 MB    Alloc: 2.1 MB    Sys: 7.2 MB <[email protected]:80>
     2020/02/29 15:39:32.558532      [INFO]         Memory InUse: 3.3 MB    Alloc: 2.1 MB    Sys: 7.2 MB <[email protected]:80>
     2020/02/29 15:39:42.557965      [INFO]         Memory InUse: 3.3 MB    Alloc: 2.1 MB    Sys: 7.2 MB <[email protected]:80>
     2020/02/29 15:39:42.798833      [DEBUG]        Receive client hello:&{ClientName:ClickHouse client ClientVersionMajor:20 ClientVersionMinor:1 ClientRevision:54431 Database: User:default Password:} <processHello@tcp_hello.go:49>
     2020/02/29 15:39:42.799832      [ERROR]        EOF, *errors.errorString <handle@tcp_handler.go:71>
     2020/02/29 15:39:52.557393      [INFO]         Memory InUse: 3.3 MB    Alloc: 2.1 MB    Sys: 7.2 MB <[email protected]:80>
     2020/02/29 15:40:02.557775      [INFO]         Memory InUse: 3.3 MB    Alloc: 2.1 MB    Sys: 7.2 MB <[email protected]:80>
    
  • src\base\xlog\xlog.go:52:12: undefined: syslog.New

    src\base\xlog\xlog.go:52:12: undefined: syslog.New

    $ go build -v -o bin/vectorsql-server src/cmd/server.go
    base/xlog
    # base/xlog
    src\base\xlog\xlog.go:52:12: undefined: syslog.New
    src\base\xlog\xlog.go:52:23: undefined: syslog.LOG_DEBUG
    
  • sqlparser: add format clause support

    sqlparser: add format clause support

    With this pr, this works

    VectorSQL :) select * from randtable(rows->10, c1->'UInt32', c2->'String') format TSKV;
    
    SELECT *
    FROM randtable(rows -> 10, c1 -> 'UInt32', c2 -> 'String')
    FORMAT TSKV
    
    c1=6	c2=string-2
    c1=1	c2=string-9
    c1=6	c2=string-0
    c1=3	c2=string-6
    c1=9	c2=string-1
    c1=2	c2=string-5
    c1=5	c2=string-0
    c1=7	c2=string-9
    c1=8	c2=string-8
    c1=4	c2=string-3
    → Progress: 0.00 rows, 0.00 B (0.00 rows/s., 0.00 B/s.)
    10 rows in set. Elapsed: 0.050 sec.
    
  • I tried vectorsql and this is what happened.

    I tried vectorsql and this is what happened.

    I just tried it out of curiosity. I assume that this is just a development prototype, so no real expectations. Sorry to bother.

    git clone https://github.com/vectorengine/vectorsql
    cd vectorsql
    make build
    ./bin/vectorsql-server -c conf/vectorsql-default.toml
    
    clickhouse-client --compression 0
    # Cannot load data for command line suggestions: Code: 0, e.displayText() = DB::Exception: Received from localhost:9000. . Every derived table must have its own alias at position 849 near 'where'. (version 20.10.1.1)
    
    VectorSQL :) SELECT 1
    
    SELECT 1
    
    
    Received exception from server (version 19.17.1):
    Code: 0. DB::Exception: Received from localhost:9000. . Couldn't find table:dual storage.
    
    VectorSQL :) SHOW DATABASES
    
    SHOW DATABASES
    
    ┌─name───┬─engine─┬─data_path────────────┬─metadata_path────────────┐
    │ system │ SYSTEM │ data9000/data/system │ data9000/metadata/system │
    └────────┴────────┴──────────────────────┴──────────────────────────┘
    
    1 rows in set. Elapsed: 0.004 sec. 
    
    VectorSQL :) SHOW TABLES FROM system
    
    SHOW TABLES FROM system
    
    ┌─name──────┐
    │ databases │
    │ numbers   │
    │ tables    │
    └───────────┘
    
    3 rows in set. Elapsed: 0.001 sec. 
    
    VectorSQL :) SELECT count() FROM system.numbers
    
    SELECT count()
    FROM system.numbers
    
    ↙ Progress: 3.00 rows, 155.00 B (4.10 thousand rows/s., 212.08 KB/s.)  99%
    Received exception from server (version 19.17.1):
    Code: 0. DB::Exception: Received from localhost:9000. . Unsupported Expression:COUNT. 
    
    0 rows in set. Elapsed: 0.014 sec.
    
    VectorSQL :) SELECT count(*) FROM system.numbers
    
    SELECT count(*)
    FROM system.numbers
    
    
    Exception on client:
    Code: 210. DB::NetException: Connection reset by peer, while reading from socket (127.0.0.1:9000): while receiving packet from localhost:9000
    
    Connecting to localhost:9000 as user default.
    Connected to VectorSQL server version 19.17.1 revision 54428.
    
    fatal error: runtime: out of memory
    
    runtime stack:
    runtime.throw(0x9ad671, 0x16)
            /usr/lib/go-1.12/src/runtime/panic.go:617 +0x72
    runtime.sysMap(0xca68000000, 0x1f28000000, 0xe546f8)
            /usr/lib/go-1.12/src/runtime/mem_linux.go:170 +0xc7
    runtime.(*mheap).sysAlloc(0xe36e40, 0x1f26286000, 0xe36e50, 0xf93143)
            /usr/lib/go-1.12/src/runtime/malloc.go:633 +0x1cd
    runtime.(*mheap).grow(0xe36e40, 0xf93143, 0x0)
            /usr/lib/go-1.12/src/runtime/mheap.go:1222 +0x42
    runtime.(*mheap).allocSpanLocked(0xe36e40, 0xf93143, 0xe54708, 0x7f6100000000)
            /usr/lib/go-1.12/src/runtime/mheap.go:1150 +0x37f
    runtime.(*mheap).alloc_m(0xe36e40, 0xf93143, 0x100, 0x7f614d7f9dc8)
            /usr/lib/go-1.12/src/runtime/mheap.go:977 +0xc2
    runtime.(*mheap).alloc.func1()
            /usr/lib/go-1.12/src/runtime/mheap.go:1048 +0x4c
    runtime.(*mheap).alloc(0xe36e40, 0xf93143, 0xc000010100, 0xc0005e4900)
            /usr/lib/go-1.12/src/runtime/mheap.go:1047 +0x8a
    runtime.largeAlloc(0x1f262849b8, 0xc000020001, 0xdc7201)
            /usr/lib/go-1.12/src/runtime/malloc.go:1055 +0x99
    runtime.mallocgc.func1()
            /usr/lib/go-1.12/src/runtime/malloc.go:950 +0x46
    runtime.systemstack(0x7f6130000020)
            /usr/lib/go-1.12/src/runtime/asm_amd64.s:351 +0x66
    runtime.mstart()
            /usr/lib/go-1.12/src/runtime/proc.go:1153
    
    ...
    
    VectorSQL :) SELECT count(*) FROM system.numbers
    
    SELECT count(*)
    FROM system.numbers
    
    
    Exception on client:
    Code: 210. DB::NetException: Connection reset by peer, while reading from socket (127.0.0.1:9000): while receiving packet from localhost:9000
    

    Let's try with clickhouse-cli:

    $ pip3 install clickhouse-cli
    
    $ clickhouse-cli
    clickhouse-cli version: 0.3.6
    Connecting to 127.0.0.1:8123
    Error: Request failed: `SELECT version();` query failed.
    

    Let's try HTTP interface:

    $ curl http://localhost:8123/ -d 'SELECT count() FROM system.numbers'
    Unsupported Expression:COUNT
    $ curl http://localhost:8123/ -d 'SELECT count(*) FROM system.numbers'
    $ 
    $ 
    $ curl http://localhost:8123/ -d 'SELECT count(*) FROM system.numbers'
    $ curl http://localhost:8123/ -d 'SELECT count(*) FROM system.numbers'
    

    Returns immediately, server prints panic.

    VectorSQL :) CREATE TEMPORARY TABLE t (x UInt64);
    
    CREATE TEMPORARY TABLE t
    (
        `x` UInt64
    )
    
    
    Received exception from server (version 19.17.1):
    Code: 0. DB::Exception: Received from localhost:9000. . syntax error at position 23 near 'table'. 
    
    VectorSQL :) CREATE DATABASE test
    
    CREATE DATABASE test
    
    Ok.
    
    0 rows in set. Elapsed: 0.001 sec. 
    
    VectorSQL :) USE test
    
    USE test
    
    
    Exception on client:
    Code: 210. DB::NetException: Connection refused (localhost:9000)
    
    Connecting to localhost:9000 as user default.
    Code: 210. DB::NetException: Connection refused (localhost:9000)
    

    Server crashed.

    benchmark$ ./run.sh 
    01_create_table.sh
    Received exception from server (version 19.17.1):
    Code: 0. DB::Exception: Received from localhost:9000. . database:benchmark doesn't exists. 
    02_generate_data.sh
    rm: cannot remove 'data.tsv': No such file or directory
    03_load_data.sh
    clickhouse-client: ../src/DataStreams/ParallelParsingBlockInputStream.cpp:190: void DB::ParallelParsingBlockInputStream::parserThreadFunction(DB::ThreadGroupStatusPtr, size_t): Assertion `unit.is_last || !unit.block_ext.block.empty()' failed.
    ./03_load_data.sh: line 3: 15092 Broken pipe             cat data.tsv
         15093 Aborted                 (core dumped) | clickhouse-client --compression=0 --database=benchmark --query="insert into testdata FORMAT TabSeparated"
    04_run_bench.sh
    | SELECT COUNT(id) FROM testdata | 0.001s |
    | SELECT COUNT(id) FROM testdata WHERE id!=0 | 0.001s |
    | SELECT SUM(data1) FROM testdata | 0.001s |
    | SELECT SUM(data1) AS sum, COUNT(data1) AS count, sum/count AS avg FROM testdata | 0.001s |
    | SELECT MAX(id), MIN(id) FROM testdata | 0.001s |
    | SELECT COUNT(data1) AS count, data1 FROM testdata GROUP BY data1 ORDER BY count DESC LIMIT 10 | 0.001s |
    | SELECT email FROM testdata WHERE email like '%[email protected]%' LIMIT 1 | 0.001s |
    | SELECT COUNT(email) FROM testdata WHERE email like '%[email protected]%' | 0.001s |
    | SELECT data1 AS x, x - 1, x - 2, x - 3, count(data1) AS c FROM testdata GROUP BY x, x - 1, x - 2, x - 3 ORDER BY c DESC LIMIT 10 | 0.001s |
    

    Benchmark works Ok.

    But server does not return any data:

    milovidov@milovidov-desktop:~/work/vectorsql/benchmark$ clickhouse-client --compression 0
    ClickHouse client version 20.10.1.1.
    Connecting to localhost:9000 as user default.
    Connected to VectorSQL server version 19.17.1 revision 54428.
    
    ClickHouse server version is older than ClickHouse client. It may indicate that the server is out of date and can be upgraded.
    
    Cannot load data for command line suggestions: Code: 0, e.displayText() = DB::Exception: Received from localhost:9000. . Every derived table must have its own alias at position 849 near 'where'. (version 20.10.1.1)
    VectorSQL :) USE test
    
    USE test
    
    Ok.
    
    0 rows in set. Elapsed: 0.001 sec. 
    
    VectorSQL :) SHOW TABLES
    
    SHOW TABLES
    
    Ok.
    
    0 rows in set. Elapsed: 0.002 sec. 
    
    VectorSQL :) USE benchmark
    
    USE benchmark
    
    Ok.
    
    0 rows in set. Elapsed: 0.001 sec. 
    
    VectorSQL :) SHOW TABLES
    
    SHOW TABLES
    
    ┌─name─────┐
    │ testdata │
    └──────────┘
    
    1 rows in set. Elapsed: 0.003 sec. 
    
    VectorSQL :) SELECT count() FROM testdata
    
    SELECT count()
    FROM testdata
    
    Ok.
    
    0 rows in set. Elapsed: 0.001 sec. 
    
    VectorSQL :) SELECT count(*) FROM testdata
    
    SELECT count(*)
    FROM testdata
    
    
    Exception on client:
    Code: 210. DB::NetException: Connection reset by peer, while reading from socket (127.0.0.1:9000): while receiving packet from localhost:9000
    
    Connecting to database benchmark at localhost:9000 as user default.
    Connected to VectorSQL server version 19.17.1 revision 54428.
    
    ClickHouse server version is older than ClickHouse client. It may indicate that the server is out of date and can be upgraded.
    
    VectorSQL :) SELECT count(ID) FROM testdata
    
    SELECT count(ID)
    FROM testdata
    
    Ok.
    
    0 rows in set. Elapsed: 0.002 sec. 
    
    VectorSQL :) Bye.
    milovidov@milovidov-desktop:~/work/vectorsql/benchmark$ clickhouse-client --compression 0 --query "SELECT count(ID) FROM testdata"
    Received exception from server (version 19.17.1):
    Code: 0. DB::Exception: Received from localhost:9000. . Couldn't find table:testdata storage. 
    milovidov@milovidov-desktop:~/work/vectorsql/benchmark$ clickhouse-client --compression 0 --database benchmark --query "SELECT count(ID) FROM testdata"
    milovidov@milovidov-desktop:~/work/vectorsql/benchmark$ 
    milovidov@milovidov-desktop:~/work/vectorsql/benchmark$ clickhouse-client --compression 0 --database benchmark --query "SELECT count(ID) FROM testdata"
    milovidov@milovidov-desktop:~/work/vectorsql/benchmark$
    
  • [feature] implement CASE expression

    [feature] implement CASE expression

    Summary

    Syntax:

    CASE <cond>
      WHEN <condval1> THEN <expr1>
      [ WHEN <condvalx> THEN <exprx> ] ...
      [ ELSE <expr2> ]
    END
    

    For example:

    SELECT CustomerName, City, Country
    FROM Customers
    ORDER BY
    (CASE
        WHEN City IS NULL THEN Country
        ELSE City
    END);
    
  • [feature] implement WITH (Common Table Expressions)

    [feature] implement WITH (Common Table Expressions)

    Summary

    MySQL 8.0 CTE:

    WITH
      cte1 AS (SELECT a, b FROM table1),
      cte2 AS (SELECT c, d FROM table2)
    SELECT b, d FROM cte1 JOIN cte2
    WHERE cte1.a = cte2.c;
    

    https://dev.mysql.com/doc/refman/8.0/en/with.html#common-table-expressions

Fast thread-safe inmemory cache for big number of entries in Go. Minimizes GC overhead

fastcache - fast thread-safe inmemory cache for big number of entries in Go Features Fast. Performance scales on multi-core CPUs. See benchmark result

Dec 30, 2022
Scalable datastore for metrics, events, and real-time analytics

InfluxDB InfluxDB is an open source time series platform. This includes APIs for storing and querying data, processing it in the background for ETL or

Jan 5, 2023
Scalable datastore for metrics, events, and real-time analytics

InfluxDB InfluxDB is an open source time series platform. This includes APIs for storing and querying data, processing it in the background for ETL or

Jan 4, 2023
A GPU-powered real-time analytics storage and query engine.
A GPU-powered real-time analytics storage and query engine.

AresDB AresDB is a GPU-powered real-time analytics storage and query engine. It features low query latency, high data freshness and highly efficient i

Jan 7, 2023
TiDB is an open source distributed HTAP database compatible with the MySQL protocol
TiDB is an open source distributed HTAP database compatible with the MySQL protocol

Slack Channel Twitter: @PingCAP Reddit Mailing list: lists.tidb.io For support, please contact PingCAP What is TiDB? TiDB ("Ti" stands for Titanium) i

Jan 9, 2023
A MySQL-compatible relational database with a storage agnostic query engine. Implemented in pure Go.

go-mysql-server is a SQL engine which parses standard SQL (based on MySQL syntax) and executes queries on data sources of your choice. A simple in-memory database and table implementation are provided, and you can query any data source you want by implementing a few interfaces.

Dec 27, 2022
Redis compatible server framework for Go
Redis compatible server framework for Go

Redis compatible server framework for Go Features Create a Fast custom Redis compatible server in Go Simple interface. One function ListenAndServe and

Dec 28, 2022
Efficient cache for gigabytes of data written in Go.

BigCache Fast, concurrent, evicting in-memory cache written to keep big number of entries without impact on performance. BigCache keeps entries on hea

Jan 4, 2023
:handbag: Cache arbitrary data with an expiration time.

cache Cache arbitrary data with an expiration time. Features 0 dependencies About 100 lines of code 100% test coverage Usage // New cache c := cache.N

Jan 5, 2023
A simple, fast, embeddable, persistent key/value store written in pure Go. It supports fully serializable transactions and many data structures such as list, set, sorted set.

NutsDB English | 简体中文 NutsDB is a simple, fast, embeddable and persistent key/value store written in pure Go. It supports fully serializable transacti

Jan 1, 2023
Lightweight RESTful database engine based on stack data structures
Lightweight RESTful database engine based on stack data structures

piladb [pee-lah-dee-bee]. pila means stack or battery in Spanish. piladb is a lightweight RESTful database engine based on stack data structures. Crea

Nov 27, 2022
Distributed reliable key-value store for the most critical data of a distributed system

etcd Note: The master branch may be in an unstable or even broken state during development. Please use releases instead of the master branch in order

Jan 9, 2023
datatable is a Go package to manipulate tabular data, like an excel spreadsheet.
datatable is a Go package to manipulate tabular data, like an excel spreadsheet.

datatable is a Go package to manipulate tabular data, like an excel spreadsheet. datatable is inspired by the pandas python package and the data.frame R structure. Although it's production ready, be aware that we're still working on API improvements

Nov 23, 2022
This is a mongodb data comparison tool.

mongo-compare This is a mongodb data comparison tool. In the mongodb official tools, mongodb officially provides a series of tools such as mongodump,

Sep 13, 2022
Membin is an in-memory database that can be stored on disk. Data model smiliar to key-value but values store as JSON byte array.

Membin Docs | Contributing | License What is Membin? The Membin database system is in-memory database smiliar to key-value databases, target to effici

Jun 3, 2021
Distributed cache and in-memory key/value data store.

Distributed cache and in-memory key/value data store. It can be used both as an embedded Go library and as a language-independent service.

Dec 30, 2022
Owl is a db manager platform,committed to standardizing the data, index in the database and operations to the database, to avoid risks and failures.

Owl is a db manager platform,committed to standardizing the data, index in the database and operations to the database, to avoid risks and failures. capabilities which owl provides include Process approval、sql Audit、sql execute and execute as crontab、data backup and recover .

Nov 9, 2022
Mantil-template-form-to-dynamodb - Receive form data and write it to a DynamoDB table
Mantil-template-form-to-dynamodb - Receive form data and write it to a DynamoDB table

This template is an example of serverless integration between Google Forms and DynamoDB

Jan 17, 2022
Analytics box a simple and privacy focused analytics tool written in go like google analytics
Analytics box a simple and privacy focused analytics tool written in go like google analytics

Analytics box is analytics tool like google analytics but instead of ripping user's privacy off them like google it respects their privacy and doesn't collect any unnecessary information.

Nov 27, 2022
Collects many small inserts to ClickHouse and send in big inserts

ClickHouse-Bulk Simple Yandex ClickHouse insert collector. It collect requests and send to ClickHouse servers. Installation Download binary for you pl

Dec 28, 2022