A light-weight library to write datas to InfluxDB v2 and query it.
It is created with simple goals in mind: be simple, efficient and easy to use.
If you like it, please star it! 🥰
Note that
InfluxDB-v2
is compatible with InfluxDB v2 only. It does NOT work with InfluxDB v1.
InfluxDB-v2
is sponsored by Stackhero.
If you are looking for powerful managed services, you should seriously consider Stackhero 🤓
With NPM: npm install --save influxdb-v2
With Yarn: yarn add influxdb-v2
const Influxdb = require('influxdb-v2');
(async () => {
const influxdb = new Influxdb({
host: 'influxdb.example.com',
token: 'myInfluxdbToken'
});
await influxdb.write(
{
org: 'myOrganization',
bucket: 'myBucket'
},
[{
measurement: 'web',
fields: {
load: 12.34
}
}]
);
const result = await influxdb.query(
{ org: 'myOrganization' },
{ query: 'from(bucket: "myBucket") |> range(start: -1h)' }
);
console.log(result);
})().catch(error => {
console.error('\n🐞 An error occurred!', error);
process.exit(1);
});
Import the library and initialize it:
const Influxdb = require('influxdb-v2');
const influxdb = new Influxdb({
host: '', // [Required] your server IP or domain name, like `influxdb.example.com`
// protocol: 'https', // `http` or `https`, default to `https`
// port: 443, // if different than 80 (for http) or 443 (for https). Probably 8086 or 9999.
token: '' // [Required] your InfluxDB token. You can create one in InfluxDB console in "Settings"/"Tokens"/"Generate".
// fetchOptions: {} // Option passed to node-fetch
});
You can write datas to InfluxDB simply like this:
influxdb.write(
{
org: '', // [Required] your organization. You can set `orgID` if you prefer to use the ID
bucket: '', // [Required] your bucket
},
[{
measurement: '', // [Required] your measurement
fields: {
load: 12.34 // a field named "load" as an example, with a value of 12.34
}
}]
);
By default, the time recorded in InfluxDB is the time when you sent the request. This is probably not what you want to do. You can add a timestamp like this:
influxdb.write(
{
org: '', // [Required] your organization. You can set `orgID` if you prefer to use the ID
bucket: '', // [Required] your bucket
precision: 'ms' // precision of timestamp. Can be `ns` (nanoseconds), `us` (microseconds), `ms` (milliseconds) or `s` (seconds). The default is `ns`
},
[{
measurement: '', // [Required] your measurement
fields: {
load: 12.34 // a field named "load" as an example, with a value of 12.34
},
timestamp: Date.now() // the timestamp in milliseconds, as defined in `precision`
}]
);
You can add tags and multiple fields like this:
influxdb.write(
{
org: '', // [Required] your organization
bucket: '', // [Required] your bucket
},
[{
measurement: 'host', // [Required] your measurement
// Define tags
tags: {
deviceId: 'gyh43',
version: '1.2.3',
location: 'factory-1'
},
// Define fields
fields: {
load: 12.34, // a field named "load" as an example, with a value of 12.34
cpu: 42, // another name "cpu"
battery: 65 // etc...
}
}]
);
And finally, you can send multiple datas at a same time:
influxdb.write(
{
org: '', // [Required] your organization. You can set `orgID` if you prefer to use the ID
bucket: '', // [Required] your bucket
precision: 's' // timestamp in seconds
},
[
{
measurement: '', // [Required] your measurement
fields: {
load: 12.34
},
timestamp: 1569513823
},
{
measurement: '', // [Required] your measurement
fields: {
load: 23.45
},
timestamp: 1569513838
}
]
);
You can write flux queries simply like this:
const result = await influxdb.query(
{
org: '', // [Required] your organization. You can set `orgID` if you prefer to use the ID
},
{
query: 'from(bucket: "myBucket") |> range(start: -1h)' // [Required] your flux query
}
);
console.log(result);
/*
[
[
{ result: '_result',
table: '0',
_start: 2019-09-26T16:36:48.868Z,
_stop: 2019-09-26T16:37:48.868Z,
_time: 2019-09-26T16:37:47.795Z,
_value: 12.34,
_field: 'fieldname1',
_measurement: 'myMeasurement',
tagname1: 'myTagvalue1',
tagname2: 'myTagvalue2'
}
],
[
{ result: '_result',
table: '1',
_start: 2019-09-26T16:36:48.868Z,
_stop: 2019-09-26T16:37:48.868Z,
_time: 2019-09-26T16:37:47.795Z,
_value: 23.45,
_field: 'fieldname2',
_measurement: 'myMeasurement',
tagname1: 'myTagvalue1',
tagname2: 'myTagvalue2'
}
]
]
*/
By default InfluxDB-v2
will parse the result of queries.
If you prefer to get the RAW result (CSV), just set the parameter csv
to true.
const result = await influxdb.query(
{
org: '', // [Required] your organization. You can set `orgID` if you prefer to use the ID
csv: true // get the plain text (CSV) result
},
{
query: 'from(bucket: "myBucket") |> range(start: -1h)' // [Required] your flux query
}
);
console.log(result); // plain text (CSV) result
/*
,result,table,_start,_stop,_time,_value,_field,_measurement,tagname1,tagname2
,_result,0,2019-09-26T16:36:48.868439105Z,2019-09-26T16:37:48.868439105Z,2019-09-26T16:37:47.795Z,12.34,fieldname1,myMeasurement,myTagvalue1,myTagvalue2
,result,table,_start,_stop,_time,_value,_field,_measurement,tagname1,tagname2
,_result,1,2019-09-26T16:36:48.868439105Z,2019-09-26T16:37:48.868439105Z,2019-09-26T16:37:47.795Z,23.45,fieldname2,myMeasurement,myTagvalue1,myTagvalue2
*/
influxdb-v2
uses fetch
to communicate with InfluxDB API.
You can pass options to fetch
using fetchOptions
in the constructor.
You can use a defined CA certificate like this:
const https = require('https');
const influxdb = new Influxdb({
host: '',
token: '',
fetchOptions: {
agent: new https.Agent({
ca: [ fs.readFileSync('yourCaFile.ca') ],
})
}
});
You can ignore certificate checks too.
const https = require('https');
const influxdb = new Influxdb({
host: '',
token: '',
fetchOptions: {
agent: new https.Agent({
rejectUnauthorized: false
})
}
});