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),// 時間をずらして記録
};
}
}