プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2019/06/22

[C#] InfluxDB へのデータ書き込み

event_note2019/06/22 1:35

C# で作成したアプリケーションから InfluxDB をデータを書き込んでみました。

まずは .NET 用のクライアントを探してみました。
一応以下が公式のクライアントになるようです。

しかし、微妙なので、もっと使いやすそうなクライアントを探した結果、以下を使うことにしてみました。

基本的な使い方

GitHub で解説されているので、そちらを参照したほうが早いかと。

とりあえず適当なデータを作成

InfluxDB を用意してみたものの、とりあえずデータがないと Chronograf や Grafana を試すこともできないので、C# で適当なデータ入れるプログラムを作成してみました。

用意したデータ

  • CPU の状態ネットワーク使用量 を記録する想定(Measurement で区別)
  • CPU と EtherNet はそれぞれ2つあると想定(Tags で区別)
  • 値はランダム
  • 30秒ごとにデータを記録している想定で1日分のデータを書き込む

時間の間隔などはデータの書き込み量に応じて適当に決めています。

サンプルコード

static async Task Main(string[] args)
{
    var randam = new Random();

    var influxDbClient = new InfluxDbClient("http://localhost:8086/", "root", "root", InfluxDbVersion.Latest);

    // データベースの新規作成
    var dbName = "TestDb";
    var response = await influxDbClient.Database.CreateDatabaseAsync(dbName);

    // とりあえず適当なデータを1日分書き込む
    var dataTimeBase = DateTime.Today.AddDays(-1);// データの書き込み開始日時(昨日からにする)
    var interval = 30;// 30秒ごとにデータを記録する
    var count = 24 * 60 * 60 / interval;// 1日分の書き込み回数
    var lastProc = 0;
    var proc = 0;

    for (int i = 0; i < count; i++)
    {
        await influxDbClient.Client.WriteAsync(CreateCpuPoint(1, i), dbName);
        await influxDbClient.Client.WriteAsync(CreateCpuPoint(2, i), dbName);
        await influxDbClient.Client.WriteAsync(CreateNetworkPoint(1, i), dbName);
        await influxDbClient.Client.WriteAsync(CreateNetworkPoint(2, i), dbName);

        // 書き込む量が多いので、進捗率を表示する
        proc = i * 100 / count;
        if (proc != lastProc)
        {
            Console.WriteLine($"{proc}% ({i}/{count})");
            lastProc = proc;
        }
    }

    Console.WriteLine("Completed");
    Console.ReadLine();


    // CPU の状態を作成
    Point CreateCpuPoint(int id, int index)
    {
        return new Point()
        {
            // 所属する Measurement の名前
            Name = "CPU",
            Tags = new Dictionary<string, object>()
                {
                    { "CpuId", id },
                },
            Fields = new Dictionary<string, object>()
                {
                    { "Used", randam.Next(0, 100) },// CPU 使用率
                    { "Temperature", randam.Next(10, 50) },// 温度
                },
            // タイムスタンプを指定しなかった場合はサーバー側のタイムスタンプで記録される
            Timestamp = dataTimeBase.AddSeconds(index * interval),// 時間をずらして記録
        };
    }

    // ネットワーク使用量を作成
    Point CreateNetworkPoint(int id, int index)
    {
        return new Point()
        {
            // 所属する Measurement の名前
            Name = "Network",
            Tags = new Dictionary<string, object>()
                {
                    { "EthernetId", id },
                },
            Fields = new Dictionary<string, object>()
                {
                    { "Send", randam.Next(0, 10000) },// 送信量
                    { "Recv", randam.Next(0, 10000) },// 受信量
                },
            // タイムスタンプを指定しなかった場合はサーバー側のタイムスタンプで記録される
            Timestamp = dataTimeBase.AddSeconds(index * interval),// 時間をずらして記録
        };
    }
}