[][src]Crate kairosdb

A Client for KairosBD REST API

The Client itself is used as the central access point, from which numerous operations are defined implementing each of the specific KairosDB APIs.

use kairosdb::Client;
let client = Client::new("localhost", 8080);

A main job of a time series database is collecting and querying data. To add data to KairosDB we have to create a Datapoints struct and add the data to the object.

use kairosdb::datapoints::Datapoints;

let mut datapoints = Datapoints::new("myMetric", 0);
datapoints.add_ms(1000, 11.0);
datapoints.add_ms(2000, 12.0);
datapoints.add_ms(3000, 13.0);
datapoints.add_tag("test", "first");
let result = client.add(&datapoints);
assert!(result.is_ok());

To query data we have to create a Query Object with the start and end of the query. The start and the end can be a relative time. Check the 'Time' structure for more information.

use std::collections::HashMap;
use kairosdb::query::{Query, Time, Metric, Tags};

let mut query = Query::new(
   Time::Nanoseconds(1000),
   Time::Nanoseconds(2000));

let metric = Metric::new("myMetric", Tags::new(), vec![]);
query.add(metric);

let result = client.query(&query).unwrap();

assert!(result.contains_key("myMetric"));
assert_eq!(result["myMetric"].len(), 2);
assert_eq!(result["myMetric"][0].time, 1000);
assert_eq!(result["myMetric"][0].value, 11.0);
assert_eq!(result["myMetric"][1].time, 2000);
assert_eq!(result["myMetric"][1].value, 12.0);

Optionally you can specify aggregators. Aggregators perform an operation on data points. For example, you can sum all data points that exist in 5 minute periods. Aggregators can be combined together. E.g you could sum all data points in 5 minute periods then calculate the average of them for a week period. Aggregators are processed in the order they are specified in the vector for the metric constructor.

use kairosdb::query::*;
use kairosdb::datapoints::Datapoints;
for i in 0..10 {
   let mut datapoints = Datapoints::new("myMetric", 0);
   datapoints.add_ms(i * 500, i as f64);
   datapoints.add_tag("test", "first");
   let result = client.add(&datapoints);
   assert!(result.is_ok());
}

let mut query = Query::new(
   Time::Nanoseconds(0),
   Time::Nanoseconds(10*500));

let aggregator = Aggregator::new(
    AggregatorType::AVG,
    RelativeTime::new(1, TimeUnit::SECONDS));
let metric = Metric::new("myMetric", Tags::new(), vec![aggregator]);
query.add(metric);

let result = client.query(&query).unwrap();
assert!(result.contains_key("myMetric"));
assert_eq!(result["myMetric"].len(), 5);
assert_eq!(result["myMetric"][0].time, 0);
assert_eq!(result["myMetric"][0].value, 0.5);

Deleting data is like querying data.

use kairosdb::query::{Query, Time, Metric, Tags};

let mut query = Query::new(
   Time::Nanoseconds(1000),
   Time::Nanoseconds(2000));

let mut tags = Tags::new();
tags.insert("test".to_string(), vec!["first".to_string()]);
let metric = Metric::new("myMetric", tags, vec![]);
query.add(metric);

let result = client.delete(&query);
assert!(result.is_ok());

Getting the current set of metric names is a simple function call.

let result = client.list_metrics();
assert!(result.unwrap().contains(&"myMetric".to_string()));

To get information about the current tags and tag values you can use the tagsnames and tagvalues method.

let tagnames = client.tagnames();
let tagvalues = client.tagvalues();
assert!(tagnames.unwrap().contains(&"test".to_string()));
assert!(tagvalues.unwrap().contains(&"first".to_string()));

Delete a metric by name

let result = client.delete_metric(&"myMetric");
assert!(result.is_ok());

Server status

To get the health status of the KairosDB Server

let response = client.health();
let result = response.unwrap();
assert_eq!(result[0], "JVM-Thread-Deadlock: OK");
assert_eq!(result[1], "Datastore-Query: OK");

Get the version of the KairosDB Server

Modules

datapoints
query

Several structs to create and parse queries

result

Structs

Client

The core of the kairosdb client, owns a HTTP connection.