An InfluxDB Node.js Client.
$ npm install influxdb-nodejs
View the ./examples directory for working examples.
// no auth
const Influx = require('influxdb-nodejs');
const client = new Influx('http://127.0.0.1:8086/mydb');
// normal auth (user and password will be added to URL query parameters)
const Influx = require('influxdb-nodejs');
const client = new Influx('http://user:pwd@127.0.0.1:8086/mydb');
// basic auth (will be used http basic auth)
const Influx = require('influxdb-nodejs');
const client = new Influx('http://user:pwd@127.0.0.1:8086/mydb?auth=basic');
const Influx = require('influxdb-nodejs');
const client = new Influx('http://127.0.0.1:8086/mydb');
// i --> integer
// s --> string
// f --> float
// b --> boolean
const fieldSchema = {
use: 'i',
bytes: 'i',
url: 's',
};
const tagSchema = {
spdy: ['speedy', 'fast', 'slow'],
method: '*',
// http stats code: 10x, 20x, 30x, 40x, 50x
type: ['1', '2', '3', '4', '5'],
};
client.schema('http', fieldSchema, tagSchema, {
// default is false
stripUnknown: true,
});
client.write('http')
.tag({
spdy: 'fast',
method: 'GET',
type: '2',
})
.field({
use: 300,
bytes: 2312,
url: 'https://github.com/vicanso/influxdb-nodejs',
})
.then(() => console.info('write point success'))
.catch(console.error);
const Influx = require('influxdb-nodejs');
const client = new Influx('http://127.0.0.1:8086/mydb');
client.query('http')
.where('spdy', '1')
.where('method', ['GET', 'POST'])
.where('use', 300, '>=')
.then(console.info)
.catch(console.error);
// => influx ql: select * from "http" where "spdy" = '1' and "use" >= 300 and ("method" = 'GET' or "method" = 'POST')
Query influxdb using functon
const Influx = require('influxdb-nodejs');
const client = new Influx('http://127.0.0.1:8086/mydb');
client.query('http')
.where('spdy', '1')
.addFunction('count', 'url')
.then(console.info)
.catch(console.error);
// => select count("url") from "http" where "spdy" = '1'
client.query('http')
.where('spdy', '1')
.addFunction('bottom', 'use', 5)
.then(console.info)
.catch(console.error);
// select bottom("use",5) from "http" where "spdy" = '1'
const Influx = require('influxdb-nodejs');
const client = new Influx('http://127.0.0.1:8086/mydb');
function loginStatus(account, ip, type) {
client.write('login')
.tag({
type,
})
.field({
account,
ip,
})
.queue();
if (client.writeQueueLength >= 10) {
client.syncWrite()
.then(() => console.info('sync write queue success'))
.catch(err => console.error(`sync write queue fail, ${err.message}`));
}
}
setInterval(() => {
loginStatus('vicanso', '127.0.0.1', 'vip');
}, 5000);
const Influx = require('influxdb-nodejs');
const client = new Influx('http://127.0.0.1:8086/mydb');
client.query('http')
.addFunction('max', 'use')
.addGroup('type')
.subQuery()
.addFunction('sum', 'max')
.then((data) => {
// { name: 'http', columns: [ 'time', 'sum' ], values: [ [ '1970-01-01T00:00:00Z', 904 ] ] }
console.info(data.results[0].series[0]);
}).catch(console.error);
const Influx = require('influxdb-nodejs');
const client = new Influx('http://127.0.0.1:8086/mydb');
const reader = client.query('request');
reader.set({
limit: 2,
});
reader.multiQuery();
reader.measurement = 'login';
reader.set({
limit: 1,
tz: 'America/Chicago',
});
reader.set({
format: 'json',
});
reader.then(data => {
console.info(JSON.stringify(data));
}).catch(console.error);
const express = require('express');
const app = express();
const _ = require('lodash');
const Influx = require('influxdb-nodejs');
const client = new Influx('http://127.0.0.1:8086/mydb');
const onHeaders = require('on-headers');
// set the http stats schema
client.schema('http', {
use: 'integer',
code: 'integer',
bytes: 'integer',
url: 'string',
});
client.on('writeQueue', () => {
// sync write queue if the length is 100
if (client.writeQueueLength === 100) {
client.syncWrite()
.then(() => {
console.info('sync write success');
})
.catch(console.error);
}
});
function httpStats(req, res, next) {
const start = Date.now();
onHeaders(res, () => {
const code = res.statusCode;
const use = Date.now() - start;
const method = req.method;
const bytes = parseInt(res.get('Content-Length') || 0, 10);
const tags = {
spdy: _.sortedIndex([100, 300, 1000, 3000], use),
type: code / 100 | 0,
method,
};
const fields = {
use,
code,
bytes,
url: req.url,
route: req.route.path
};
// use queue for better performance
client.write('http')
.tag(tags)
.field(fields)
.queue();
});
next();
}
client.createDatabase().catch(err => {
console.error('create database fail err:', err);
});
app.use(httpStats);
app.use((req, res, next) => {
setTimeout(next, _.random(0, 5000));
});
app.get('/users/me', (req, res) => {
res.json({
account: 'vicanso',
name: 'Tree Xie',
});
});
app.get('/book/:id', (req, res) => {
const {
id,
} = req.params;
res.json({
id: id,
name: 'my book',
author: 'vicanso',
});
});
app.get('/order/:id', (req, res) => {
res.status(400).json({
error: 'The id is not valid',
});
});
app.get('/author/:id', (req, res) => {
res.status(500).json({
error: 'The database is disconnected',
});
});
let server;
const finish = () => {
console.info(`listen on http://127.0.0.1:${server.address().port}/`);
};
if (process.env.PORT) {
server = app.listen(process.env.PORT, finish);
} else {
server = app.listen(finish);
}
HTTP Spdy(experss demo)
HTTP Type(experss demo)
HTTP Error(experss demo)
influx
It's complex for me. Before developing this module, I used influx, which was not straightforward; and its batch function can not be saved as queue. What's more, the function of query is too simple, just like I write influx ql.
influent
I have never used this module, but I have read its API. In my opinion, this module is not so convenient.
MIT