C#中通过InfluxDB.LineProtocol往数据库写数据
程序员文章站
2022-05-17 18:39:17
...
使用InfluxDB.LineProtocol库往InfluxDB写数据
源码地址
此库提供两种生成InfluxDB数据格式的字符串,另一种是创建point对象集合的方式创建,性能比较慢。可以在源码的sample/Benchmark中进行测试,运行时一定要以release的方式运行,否则运行不起来。
Nuget InfluxDB.LineProtocol
引入命名空间
using InfluxDB.LineProtocol.Client;
using InfluxDB.LineProtocol;
创建client连接
var client = new LineProtocolClient(new Uri("http://192.168.1.132:8086"), "mydata");//mydata是要连接的数据库名
创建LineProtocolWriter生成Line
//参数指定Precision时间精度,通过Precision enum设定
var writer = new LineProtocolWriter(Precision.Nanoseconds);
通过writer
生成数据字符串
writer.Measurement("measurement name").Tag("key", "value").Field("key",value).Timestamp(lone or DataTime);
-
Measurement
方法生成Measurement字符串,返回writer自身对象。必须按照influxDB LineProtocol格式顺序添加。 -
Tag
方法,可以用.Tag("key", "value").Tag("key", "value")
的方式添加多个Tag。 -
Field
方法添加字段,如Tag
方法一样可以添加多个字段。 -
TimeStamp
方法有多个重载,可以传递long
型的纳秒时间戳,如果不是纳秒必须后面添加0补齐。也可以接受DataTime
类型的参数,但是必须是UniversalTime。可以用DateTime.Now.ToUniversalTime()
或者DateTime.UtcNow
. -
writer
对象在遇到下一个Measurement
方法时自动会添加"\n
"符,所以可以在循环中生成InfluxDB格式数据。
注意
DateTime.Now.ticks
不是Unix epoch,需要减去1970-1-1的ticks
var unixTime = new DateTime(1970,1,1); //生成Unix纪元基准时间
var unixNowTicks = DateTime.Now.Ticks - unixTime.Ticks;//现在的时间戳减去Unix纪元基准时间戳,得到以Unix纪元为基准的时间戳。
重要注意:
DateTime
的Ticks
是100ns为单位计数。传递到Timestamp
参数时需要乘以100.否则时间不准确。
示例代码:
using System;
using System.Threading.Tasks;
using InfluxDB.LineProtocol.Client;
using InfluxDB.LineProtocol;
namespace influxdbAPItest
{
class Program
{
static void Main(string[] args)
{
run().Wait();
Console.ReadLine();
}
private static async Task run()
{
var client = new LineProtocolClient(new Uri("http://192.168.1.132:8086"), "mydata");
var writer = new LineProtocolWriter(Precision.Nanoseconds);
var tim = new DateTime(1970, 1, 1);
var tim2 = new DateTime(2020, 6, 5);
for(int i = 0; i < 100000; i++)
{
writer.Measurement("msd").Tag("index", "0").Field("current",Math.Sin(2*Math.PI+i)).Timestamp((tim2.Ticks - tim.Ticks) * 100L+i*1000000L);//以1毫秒的间隔存储数据,以便在chronograf中观察。chronograf的图表时间精度是1ms。
}
var result = await client.SendAsync(writer);
System.Console.WriteLine(result.Success);
Console.ReadLine();
}
}
}