欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C#中通过InfluxDB.LineProtocol往数据库写数据

程序员文章站 2022-05-17 18:39:17
...

使用InfluxDB.LineProtocol库往InfluxDB写数据

源码地址
此库提供两种生成InfluxDB数据格式的字符串,另一种是创建point对象集合的方式创建,性能比较慢。可以在源码的sample/Benchmark中进行测试,运行时一定要以release的方式运行,否则运行不起来。

Nuget InfluxDB.LineProtocol

C#中通过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纪元为基准的时间戳。

重要注意:DateTimeTicks是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();
        }
    }
}

相关标签: 数据库 c#