一、influxdb安裝教程
下載地址:https://portal.influxdata.com/downloads/
我是在window環境下安裝的,所以下載的是window客戶端,下載解壓後的內容如下:
修改配置文件的內容
配置文件修改好了,雙擊運行influxd.exe
然後雙擊influx.exe程序啓動CLI控制檯:
之後就可以對influxdb操作了。
二、influxdb增刪改查操作
1. influxdb的數據格式
在InfluxDB中的數據是通過“時間序列組織的“,時序數據中包括瞭如下內容:
(1)time(一個時間戳)
(2)measurement(可測量變量,指標值,例如cpu_load和溫度,可以理解爲關係數據庫裏面的表)
(3)至少一個key=value格式的field(描述指標的數值,例如“value=0.34”或者“temperature=33.2”)
(4)零個或者多個tag(一般是對於這個指標值的元數據,例如“host=server01”,"region=“beijing”,使用這個可以方便分組,加快查詢)
在概念上,你可以把一個measurement看做是一個SQL表,主索引一直都是時間。tags和fields實際上是表中的列。tags會被索引,但是fields不會。區別是,使用InfluxDB,你可以有百萬個測量變量,但是不需要設計前面的架構,空值不會被存儲。
將數據點寫入InfluxDB,只需要遵守如下的行協議(注意tag是用逗號分隔的,fileld前後用空格分隔):
<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]
2. 插入一個數據
格式:
insert <measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]
3.待續
三、grafana安裝
下載地址:https://grafana.com/docs/grafana/latest/installation/windows/
下載後解壓,找到.\conf\defaults.ini文件(或者sample.ini文件也行),複製然後重命名爲custom.ini。這樣就會找我們自定義的配置文件custom.ini,修改custom.ini裏面的配置即可。主要是端口,我這裏改成了13000。
默認是3000,之前遇到過坑,所以不建議自定義端口小於10000.
改完保存之後,直接運行bin文件夾中的grafana-server.exe,雙擊grafana-server.exe運行或者命令行運行,最好是用命令行的方式運行(start+空格+要運行的程序的絕對路徑和程序名)。
啓動服務後訪問地址: http://localhost:13000 ,賬號密碼均爲 “admin” ,登錄成功要求更改密碼纔可訪問。
登錄之後直接就會提示更改密碼:
四、grafana添加influxdb
1. 在首頁點擊Add data source,之後選擇influxdb,進入到如下界面
其中主要需要關注的是Name、Type、HTTP Settings,以及InfluxDB Details:
Name 數據源名稱,建議以數據源類型+用途命名
Type 數據源類型,選擇對應的InfluxDB即可
URL 填寫InfluxDB對應的API地址即可,如果Grafana跟InfluxDB不在同一臺機器,將localhost換成IP即可
Access API訪問方式,一共有Direct和Proxy兩個選項。建議選擇Proxy
Access-Direct 瀏覽器直連數據源API,然後由Grafana解析返回的數據
Access-Proxy Grafana後端通過API訪問數據源,然後返回給瀏覽器展示
Database InfluxDB數據源對應數據庫名稱
User InfluxDB數據源賬號密碼
2. 成功添加數據庫後,新建dashboard錶盤
儀表盤(Dashboard),顧名思義,就是管理各種圖表的地方。
儀表盤由行(Row)+圖表面板(Panel)組成。
Panel主要支持:Graph,Singlestat,Dashlist,Table和Text。
儀表盤(Dashboard)添加入口:
http://localhost:13000/dashboard/new
添加儀表盤(Dashboard),寫好語句,類似SQL,,形成的圖表如下所示
五、使用c# 操作influxdb
1.使用nuget包管理器添加相關第三方庫
注意::influxData.Net這個庫不支持.net framework 4.5.2以下的項目,如果需要使用的話,最好先進行一下升級,使用4.6.1就行了。
2. 使用influxData.net庫
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using InfluxData.Net.Common.Enums;
using InfluxData.Net.InfluxDb;
using InfluxData.Net.InfluxDb.Models;
namespace InfluxDbDemo
{
public class InfoController
{
//聲明InfluxDbClient
private InfluxDbClient clientDb;
public InfoController()
{
//連接InfluxDb的API地址、賬號、密碼
var infuxUrl = "http://localhost:8086/";
var infuxUser = "admin";
var infuxPwd = "admin";
//創建InfluxDbClient實例
clientDb = new InfluxDbClient(infuxUrl, infuxUser, infuxPwd, InfluxDbVersion.Latest);
}
/// <summary>
/// 從InfluxDB中讀取數據
/// </summary>
public async void GetData()
{
//傳入查詢命令,支持多條
var queries = new[]{" SELECT * FROM LogInfo WHERE time> now() - 24h "};
var dbName = "DBTest";
//從指定庫中查詢數據
var response = await clientDb.Client.QueryAsync(queries, dbName);
//得到Serie集合對象(返回執行多個查詢的結果)
var series = response.ToList();
//取出第一條命令的查詢結果,是一個集合
var list = series[0].Values;
//從集合中取出第一條數據
var info_model = list.FirstOrDefault();
}
/// <summary>
/// 往InfluxDB中寫入數據
/// </summary>
public void AddData(Object message)
{
//基於InfluxData.Net.InfluxDb.Models.Point實體準備數據
for (int i = 0; i < 100; ++i)
{
var point_model = new Point()
{
Name = "logInfo2",//表名
Tags = new Dictionary<string, object>() { { "productName", "GDQ" }, { "cichennal", "cinchennal" } },
Fields = new Dictionary<string, object>() { { "message", message.ToString() + "___" + i.ToString() } },
Timestamp = DateTime.UtcNow
};
var dbName = "DBTest";
//從指定庫中寫入數據,支持傳入多個對象的集合
var response = clientDb.Client.WriteAsync(point_model, dbName);
Thread.Sleep(50);
}
}
}
class Program
{
static void Main(string[] args)
{
InfoController infoController = new InfoController();
Console.WriteLine("In Main: Creating the Child thread");
List<Thread> threadPool = new List<Thread>();
for(int i = 0; i < 1000; ++i)
{
Thread childThread = new Thread(new ParameterizedThreadStart(infoController.AddData));
threadPool.Add(childThread);
childThread.Start(i);
}
for(int i = 0; i < threadPool.Count(); ++i)
{
threadPool[i].Join();
}
Console.WriteLine("ok");
Console.ReadKey();
}
}
}
最後實現的效果如圖: