不积跬步,无以至千里;不积小流,无以成江海。

Dean's blog

  • Join Us on Facebook!
  • Follow Us on Twitter!
  • LinkedIn
  • Subcribe to Our RSS Feed

InfluxDB .NET类库

最近计划使用InfluxDB套件作为监控系统工具,今天对官方推荐的.NET库做了测试。官方推荐的四个库分别是:

InfluxDB.Client.Net
        Maintained by Adarsha (mvadu)
        Supports .Net and .Net Core
InfluxData.Net
        Maintained by Tijhomir Kit (pootzko)
InfluxDB Client for .NET
        Maintained by Mikael Guldborg Rask Andersen (MikaelGRA)
InfluxClient
        Maintained by Dan Esparza (danesparza)

由于InfluxClient打开后发现只是influxdb-ui,暂时不需要UI工具,因些只对其它三个库做了简单的测试。以下通过代码演练,熟悉和了解下相关库的使用。

InfluxDB.Client.Net

支持的环境

.Net Standard 2.0
.Net Framework 4.5.1

演练代码

public static async Task TestAdysTechInfluxDBClientNet()
{
    InfluxDBClient client = new InfluxDBClient(influxUrl, dbUName, dbpwd);

    //创建数据库
    bool success = await client.CreateDatabaseAsync(dbName);

    var rand = new Random();
    var time = DateTime.Now;

    //插入数据
    for(var i = 0; i < 10; i++)
    {
        var valMixed = new InfluxDatapoint<InfluxValueField>();
        valMixed.UtcTimestamp = DateTime.UtcNow;
        valMixed.Tags.Add("TestDate", time.ToShortDateString());
        valMixed.Tags.Add("TestTime", time.ToShortTimeString());
        valMixed.Fields.Add("Doublefield", new InfluxValueField(rand.NextDouble()));
        valMixed.Fields.Add("Stringfield", new InfluxValueField(DataGen.RandomString()));
        valMixed.Fields.Add("Boolfield", new InfluxValueField(true));
        valMixed.Fields.Add("Int Field", new InfluxValueField(rand.Next()));
        valMixed.MeasurementName = measurementName;
        //valMixed.Precision = TimePrecision.Seconds;
        //valMixed.Retention = new InfluxRetentionPolicy() { Name = "Test2" };

        var res = await client.PostPointAsync(dbName, valMixed);
    }

    //查询数据 
    var count = 0;
    var values = await client.QueryMultiSeriesAsync(dbName, $"select * from {measurementName}");
    foreach(var value in values)
    {
        count += value?.Entries?.Count ?? 0;
    }

    //分块返回
    count = 0;
    var chunks = await client.QueryMultiSeriesAsync(dbName, $"select * from {measurementName}", 5);
    foreach (var value in chunks)
    {
        count += value?.Entries?.Count ?? 0;
    }

    //删除数据库
    success = await client.DropDatabaseAsync(new InfluxDatabase(dbName));
}

优点

代码更新频率高;支持批量增加;查询返回的数据默认以dynamic对象返回,dynamic对象的属性与结果集列名相同,使用时,直接序列化为Json即可,使用方便

缺少

不支持返回多结果集

InfluxData.Net

支持的环境

.Net Framework v4.6.1
.Net Standard v2.0

演练代码

public static async Task TestInfluxDataNet()
{
    //连接
    var influxDbClient = new InfluxDbClient(influxUrl, dbUName, dbpwd, InfluxDbVersion.v_1_3);

    //创建数据库
    var dataApiResponse = await influxDbClient.Database.CreateDatabaseAsync(dbName);

    var rand = new Random();
    var time = DateTime.Now;

    //添加数据
    for (var i = 0; i < 10; i++)
    {
        var pointToWrite = new Point()
        {
            Name = measurementName,
            Tags = new Dictionary<string, object>()
            {
                { "SensorId", rand.Next() },
                { "SerialNumber", DataGen.RandomString() }
            },
            Fields = new Dictionary<string, object>()
            {
                { "SensorState", DataGen.RandomString() },
                { "Humidity", rand.Next() },
                { "Temperature", rand.Next() },
                { "Resistance", rand.Next() }
            },
            Timestamp = DateTime.UtcNow
        };
        dataApiResponse = await influxDbClient.Client.WriteAsync(pointToWrite, dbName);
    }

    //返回单个集合
    int count = 0;
    var query = $"SELECT * FROM {measurementName}";
    var response = await influxDbClient.Client.QueryAsync(query, dbName);
    foreach(var item in response)
    {
        count += item.Values?.Count ?? 0;
    }

    //返回多个集合
    var queries = new[]
    {
        $"SELECT TOP(Humidity, 5) AS TopHumidity FROM {measurementName}",
        $"SELECT BOTTOM(Humidity, 5) AS BottomHumidity FROM {measurementName}"
    };
    count = 0;
    var multiResponse = await influxDbClient.Client.MultiQueryAsync(queries, dbName);
    foreach (var single in multiResponse)
    {
        foreach(var serie in single)
        {
            count += serie.Values?.Count ?? 0;
        }
    }

    //删除数据库
    dataApiResponse = await influxDbClient.Database.DropDatabaseAsync(dbName);
}

优点

支持返回多结果集,这个在有些场景还是很实用的

缺少

查询结果以IList<IList<objet>>格式返回,结果集需要额外处理

InfluxDB Client for .NET

支持的环境

.Net Framework v4.5
.Net Standard v2.0

演练代码

private static ComputerInfo[] CreateTypedRowsStartingAt(DateTime start, int rows)
{
    var rng = new Random();
    var regions = new[] { "west-eu", "north-eu", "west-us", "east-us", "asia" };
    var hosts = new[] { "some-host", "some-other-host" };

    var timestamp = start;
    var infos = new ComputerInfo[rows];
    for (int i = 0; i < rows; i++)
    {
        long ram = rng.Next(int.MaxValue);
        double cpu = rng.NextDouble();
        string region = regions[rng.Next(regions.Length)];
        string host = hosts[rng.Next(hosts.Length)];

        var info = new ComputerInfo { Timestamp = timestamp, CPU = cpu, RAM = ram, Host = host, Region = region };
        infos[i] = info;

        timestamp = timestamp.AddSeconds(1);
    }

    return infos;
}

private static DynamicInfluxRow[] CreateDynamicRowsStartingAt(DateTime start, int rows)
{
    var rng = new Random();
    var regions = new[] { "west-eu", "north-eu", "west-us", "east-us", "asia" };
    var hosts = new[] { "some-host", "some-other-host" };

    var timestamp = start;
    var infos = new DynamicInfluxRow[rows];
    for (int i = 0; i < rows; i++)
    {
        long ram = rng.Next(int.MaxValue);
        double cpu = rng.NextDouble();
        string region = regions[rng.Next(regions.Length)];
        string host = hosts[rng.Next(hosts.Length)];

        var info = new DynamicInfluxRow();
        info.Fields.Add("cpu", cpu);
        info.Fields.Add("ram", ram);
        info.Tags.Add("host", host);
        info.Tags.Add("region", region);
        info.Timestamp = timestamp;

        infos[i] = info;

        timestamp = timestamp.AddSeconds(1);
    }
    return infos;
}

public static async Task TestInfluxDBClientForNET()
{
    var client = new InfluxClient(new Uri(influxUrl), dbUName, dbpwd);

    //创建数据库
    await client.CreateDatabaseAsync(dbName);

    //POCO方式添加
    var infos = CreateTypedRowsStartingAt(new DateTime(2020, 1, 14, 20, 45, 54, DateTimeKind.Utc), 500);
    await client.WriteAsync(dbName, measurementName, infos);

    //动态对象创建
    var dynamics = CreateDynamicRowsStartingAt(new DateTime(2020, 1, 14, 21, 45, 54, DateTimeKind.Utc), 500);
    await client.WriteAsync(dbName, measurementName, dynamics);

    //查询数据
    var count = 0;
    var resultSet = await client.ReadAsync<ComputerInfo>(dbName, $"SELECT * FROM {measurementName}");
    foreach(var result in resultSet.Results)
    {
        foreach(var series in result.Series)
        {
            count += series?.Rows?.Count ?? 0;
        }
    }

    count = 0;
    resultSet = await client.ReadAsync<ComputerInfo>(dbName, $"SELECT * FROM {measurementName};SELECT * FROM {measurementName};");
    foreach (var result in resultSet.Results)
    {
        foreach (var series in result.Series)
        {
            count += series?.Rows?.Count ?? 0;
        }
    }

    //删除数据库
    await client.DropDatabaseAsync(dbName);
}

public class ComputerInfo
{
    [InfluxTimestamp]
    public DateTime Timestamp { get; set; }

    [InfluxTag("host")]
    public string Host { get; set; }

    [InfluxTag("region")]
    public string Region { get; set; }

    [InfluxField("cpu")]
    public double CPU { get; set; }

    [InfluxField("ram")]
    public long RAM { get; set; }
}

优点

github上示例丰富;支持POCO和动态类型添加数据;查询数据时,支持将数据映射到POCO对象

缺少

支持将返回的数据映射到POCO也是一个缺点,因为这个类库只支持这一种方式,不够灵活。

演练使用的其它类

public class DataGen
{
    static string charts = "1234567890QWERTYUIOPASDFGHJKLZXCVBNM";
    public static string RandomString()
    {
        var rand = new Random();
        var len = rand.Next(20);
        var str = "";
        for(var i = 0; i < len; i++)
        {
            str += charts[rand.Next(charts.Length)];
        }
        return str;
    }
}

 

不允许评论
粤ICP备17049187号-1