A Clojure client for InfluxDB, a scalable open-source time-series events and metrics database.
Follow the [download instructions on influxdb.org] (http://influxdb.org/download/) to install the latest version of InfluxDB.
Capacitor is distributed via Clojars. Add the
following to your dependencies in project.clj
:
:dependencies [[capacitor "0.4.3"]]
(require '[capacitor.core :as influx])
(def client
(influx/make-client {:db "my-new-db"}))
The default-client
options are:
{ :host "localhost"
:scheme "http"
:port 8086
:username "root"
:password "root"
:db "default-db" }
(influx/create-db client)
;=> 201
Returns HTTP status code 201
on success.
(influx/delete-db client)
;=> 204
Returns HTTP status code 204
on success.
(influx/create-db-user client "myuser" "mypassword")
;=> 200
Returns HTTP status code 200
on success.
(def c
(influx/make-client {
:db "my-new-db"
:username "myuser"
:password "mypassword" }))
(influx/post-points c "logins" [
{:email "john@gmail.com"}
{:email "john@yahoo.com"}
{:email "john@hotmail.com"}
{:email "jill@gmail.com"}
{:email "jason@gmail.com"}
{:email "alice@yahoo.com"}
{:email "bob@mac.com"} ])
;=> 200
Returns an HTTP status code 200
on success.
(def query-00
(str
"SELECT COUNT(email) "
"FROM logins "
"GROUP BY time(10m) "
"WHERE email =~ /.*gmail\\.com/"))
(def query-01
(str
"SELECT COUNT(email) "
"FROM logins "
"GROUP BY time(1m)"))
(influx/get-query c query-00)
Returns:
[{:name "logins", :count 3, :sequence_number 1, :time 1384662000000}
{:name "logins", :count 3, :sequence_number 1, :time 1384661400000}]
(influx/get-query c query-01)
Returns:
[{:name "logins", :count 7, :sequence_number 1, :time 1384662540000}
{:name "logins", :count 7, :sequence_number 1, :time 1384661760000}]
See [examples/basic.clj] (https://github.com/olauzon/capacitor/blob/master/examples/basic.clj) for these examples in one file.
Capacitor has an asynchronous API for event batch accumulation and submission.
;; Base InfluxDB library
(require '[capacitor.core :as influx])
;; Async API
(require '[capacitor.async :as influx-async])
(def c
(influx/make-client {
:db "my-new-db"
:username "myuser"
:password "mypassword" }))
(def events-in (influx-async/make-chan))
(def resp-out (influx-async/make-chan))
With a batch size of max 10 events and max 5 seconds
(influx-async/run! events-in resp-out c 10 5000)
(influx-async/enqueue events-in {
:series "logins"
:email "paul@gmail.com" })
(influx-async/enqueue events-in {
:series "signups"
:email "john@gmail.com" })
(influx-async/enqueue events-in {
:series "logins"
:email "ringo@gmail.com" })
(influx-async/enqueue events-in {
:series "logins"
:email "george@gmail.com" })
(influx-async/enqueue events-in {
:series "signups"
:email "syd@hotmail.com" })
(influx-async/enqueue events-in {
:series "logins"
:email "roger@hotmail.com" })
(influx-async/enqueue events-in {
:series "logins"
:email "nick@hotmail.com" })
(influx-async/enqueue events-in {
:series "logins"
:email "rick@hotmail.com" })
(influx-async/enqueue events-in {
:series "logins"
:email "david@hotmail.com" })
(influx-async/enqueue events-in {
:series "signups"
:email "sting@yahoo.com" })
(dotimes [i 12]
(influx-async/enqueue events-in {
:series "logins"
:email (str "i" i "@i.com") }))
(def query-00
(str
"SELECT COUNT(email) "
"FROM logins "
"GROUP BY time(1s)"))
(influx/get-query c query-00)
;; Require core.async
(require '[clojure.core.async :as async])
(async/close! events-in)
See [examples/async.clj] (https://github.com/olauzon/capacitor/blob/master/examples/async.clj) for these examples in one file.
API docs (codox) | API docs (Marginalia)
Copyright © 2013–2014 Olivier Lauzon
Distributed under the Eclipse Public License.