influxDB 0.9 C# 读写类

 

目前influxdb官网推荐的C#读写类是针对0.8版本的,截至本文写作之前,尚未发现有针对0.9的读写类。

我使用influxdb的是用于保存服务器的运行数据,程序需要以windows service的形式运行。

influxdb提供了基于http的接口。一开始我使用的是httpClient来作为http客户端,但是发现程序以windows serive的形式运行的时候,居然无法发起http请求!而当windows service附在其它进程上,或者以window form形式运行时,却是正常的。试了多种方法,包括更改windows service的运行权限、更改.net的运行时版本、更换机器等,都不行,百思不行其解,说多了都是泪。园里的大大们,谁能告诉我为什么?最后只能将http客户端换成WebClient。

回到正题,本读写类对influxdb提供的http api进行了封装。目前实现了:

(1)读数据。

(2)写数据。包括批量写入。

(3)身份认证。

代码

核心类:

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6 using System.Net.Http;
7 using System.Security.Cryptography.X509Certificates;
8
9 public class InfluxDBClient
10 {
11 string _baseAddress;
12 string _username;
13 string _password;
14 16
17 /// <summary>
18 /// 构造函数
19 /// </summary>
20 /// <param name="baseAddress"></param>
21 /// <param name="username"></param>
22 /// <param name="password"></param>
23 public InfluxDBClient(string baseAddress, string username, string password)
24 {
25 this._baseAddress = baseAddress;
26 this._username = username;
27 this._password = password;
28 }
29
30
31
32 /// <summary>
33 /// 读
34 /// </summary>
35 /// <param name="database"></param>
36 /// <param name="sql"></param>
37 /// <returns></returns>
38 public string Query(string database, string sql)
39 {
40 string pathAndQuery = string.Format("/query?db={0}&q={1}", database, sql);
41 string url = _baseAddress + pathAndQuery;
42
43 string result = HttpHelper.Get(url, _username, _password);
44 return result;
45 }
46
49
50
51
52 /// <summary>
53 /// 写
54 /// </summary>
55 /// <param name="database"></param>
56 /// <param name="sql"></param>
57 /// <returns></returns>
58 public string Write(string database, string sql)
59 {
60 string pathAndQuery = string.Format("/write?db={0}&precision=s", database);
61 string url = _baseAddress + pathAndQuery;
62
63 string result = HttpHelper.Post(url, sql, _username, _password);
64 return result;
65 }
66 }

http帮助类

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Net;
5 using System.Text;
6 using System.Threading.Tasks;
7
9 public class HttpHelper
10 {
13 /// <summary>
14 ///
15 /// </summary>
16 /// <param name="uri"></param>
17 /// <param name="username"></param>
18 /// <param name="password"></param>
19 /// <returns></returns>
20 public static string Get(string uri, string username, string password)
21 {
22 string result = string.Empty;
23
24 WebClient client = new WebClient();
25
26 if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))
27 {
28 client.Credentials = GetCredentialCache(uri, username, password);
29 client.Headers.Add("Authorization", GetAuthorization(username, password));
30 }
31 return client.DownloadString(uri);
32 }
33
34
35
36
37 /// <summary>
38 ///
39 /// </summary>
40 /// <param name="uri"></param>
41 /// <param name="paramStr"></param>
42 /// <param name="username"></param>
43 /// <param name="password"></param>
44 /// <returns></returns>
45 public static string Post(string uri, string paramStr, string username, string password)
46 {
47 string result = string.Empty;
48
49 WebClient client = new WebClient();
50
51 // 采取POST方式必须加的Header
52 client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
53
54 byte[] postData = Encoding.UTF8.GetBytes(paramStr);
55
56 if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))
57 {
58 client.Credentials = GetCredentialCache(uri, username, password);
59 client.Headers.Add("Authorization", GetAuthorization(username, password));
60 }
61
62 byte[] responseData = client.UploadData(uri, "POST", postData); // 得到返回字符流
63 return Encoding.UTF8.GetString(responseData);// 解码
64 }
65
66
67
68
69
70
71 private static CredentialCache GetCredentialCache(string uri, string username, string password)
72 {
73 string authorization = string.Format("{0}:{1}", username, password);
74 CredentialCache credCache = new CredentialCache();
75 credCache.Add(new Uri(uri), "Basic", new NetworkCredential(username, password));
76 return credCache;
77 }
78
79
80
81
82 private static string GetAuthorization(string username, string password)
83 {
84 string authorization = string.Format("{0}:{1}", username, password);
85 return "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(authorization));
86 }
87
88
89
90 }

日期转换的扩展方法

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7
8 public static class Extentions
9 {
10
11 /// <summary>
12 /// 将当前时间转换成unix时间戳形式
13 /// </summary>
14 /// <param name="datetime"></param>
15 /// <returns></returns>
16 public static long ToUnixTimestamp(this DateTime datetime)
17 {
18 return (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;
19 }
20
21 }

注:influxdb的日期使用的是unix时间戳格式

使用方法

        InfluxDBClient client = new InfluxDBClient("http://110.124.149.123:8086", username, password);
long timestamp = DateTime.Now.ToUnixTimestamp();
List<string> list = new List<string>();
list.Add(string.Format("requestsQueued value={0} {1}", 20, timestamp)); //requestsQueued为指标的名称
list.Add(string.Format("currentConnections value={0} {1}", 10, timestamp));
list.Add(string.Format("bytesReceivedPerSec value={0} {1}", 100, timestamp));
string sql = string.Join("\n", list);
var result = client.Write("server01", sql);

需要进一步完善的地方

(1)目前读取数据的时候,当前返回的是一个字符串,这只是body中的信息,而其http头中还有部分信息。需要对这些信息进行封装。

(2)在使用这个类的时候,需要对influxdb的读写语法有一定的了解。而理想状态下,是不需要这样的。比如写数据,使用者只需要传入一个键值对(指标,指标值),而不需要传入类似于“requestsQueued value={0} {1}"这样的包含了influxdb语法的字符串。

有兴趣的同学可以对这个类进行改写。

适用范围

如果只是为了配合grafana来使用的话,这个读写类足够了,因为grafana可以直接读取influxdb的数据,我们要做的只是往influxdb中写入数据。

参考资料

InfluxDB Docs v0.8    https://influxdb.com/docs/v0.8/introduction/overview.html

InfluxDB.Net             https://github.com/ziyasal/InfluxDB.Net

influxDB 0.9 C# 读写类的更多相关文章

  1. 实用的WPF Xml的简易读写类以及用法示例

    转自:http://www.silverlightchina.net/html/study/WPF/2012/0808/17980.html 最近真是写博客写的不可收拾,今天再来一篇. 因为做一些程序 ...

  2. 利用Spring.Net技术打造可切换的分布式缓存读写类

    利用Spring.Net技术打造可切换的Memcached分布式缓存读写类 Memcached是一个高性能的分布式内存对象缓存系统,因为工作在内存,读写速率比数据库高的不是一般的多,和Radis一样具 ...

  3. Csv读写类

    <?php /** * CSV 文件读写类 * * 示例: $header = array('name' => '名字', 'age' =>'年龄', 'idcard' => ...

  4. QT学习之文件系统读写类

    #QT学习之文件系统读写类 QIODevice QFileDevice QBuffer QProcess 和 QProcessEnvironment QFileDevice QFile QFileIn ...

  5. [IO] C# INI文件读写类与源码下载 (转载)

    /// <summary> /// 类说明:INI文件读写类. /// 编 码 人:苏飞 /// 联系方式:361983679 /// 更新网站:[url]http://www.sufei ...

  6. 使用asp.net 2.0中的SqlBulkCopy类批量复制数据

    介绍:在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用. 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据. ASP.NET 2.0有一个Sq ...

  7. AS3.0 自定义右键菜单类

    AS3.0 自定义右键菜单类: /** * 自定义右键菜单类 * 自定义菜单项不得超过15个,每个标题必须至少包含一个可见字符. * 标题字符不能超过100个,并且开头的空白字符会被忽略. * 与任何 ...

  8. ASP.NET2.0 Newtonsoft.Json 操作类分享

    JSON 是现在比较流行的数据交互格式,NET3.0+有自带类处理JSON,2.0的话需要借助Newtonsoft.Json来完成,不然自己写的话,很麻烦. 网上搜索下载 Newtonsoft.Jso ...

  9. 避免在ASP.NET Core 3.0中为启动类注入服务

    本篇是如何升级到ASP.NET Core 3.0系列文章的第二篇. Part 1 - 将.NET Standard 2.0类库转换为.NET Core 3.0类库 Part 2 - IHostingE ...

随机推荐

  1. json与cjson

    json安装: http://blog.csdn.net/u011641885/article/details/46755225 tar xvf json-c-0.9.tar.gz cd json-c ...

  2. Oracle数据库select语句

    select * from EMp--all data in EMP table select * from EMP where ename in('SMITH')--the data where e ...

  3. 数据库和redis的一致性

    之前的讲解,主要是在讲解redis如何支撑海量数据.高并发读写.高可用服务的架构 从这一讲开始,正式开始做业务系统的开发 商品详情页,缓存架构,90%是大量的业务(没有什么级数含量),10%最有级数含 ...

  4. Kaggle:Home Credit Default Risk 特征工程构建及可视化(2)

    博主在之前的博客 Kaggle:Home Credit Default Risk 数据探索及可视化(1) 中介绍了 Home Credit Default Risk 竞赛中一个优秀 kernel 关于 ...

  5. 3D 网页,webgl ,threejs 实例

    http://learningthreejs.com/blog/2013/04/30/closing-the-gap-between-html-and-webgl/ http://adndevblog ...

  6. N!的近似值_斯特林公式

    公式: N! ~=  sqrt(2 * PI * n) * ((n / e) ^n) 题目类型不慌都.

  7. 关于Adaboost——样本抽样的权值的实际意义

    看这篇文章的前提:已经看了PRML中的Adaboost的算法流程 看懂下面的内容必须牢牢记住:Adaboost使用的误差函数是指数误差 文章主要目的:理解样本抽样的权值是为什么那样变化的. 得出的结论 ...

  8. animate.css动画

    添加类名的时间不要只添加动画的类名,也要加上animated,使用的时间可以把自己需要的效果复制出来

  9. CH4901 关押罪犯

    题意 4901 关押罪犯 0x49「数据结构进阶」练习 描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时 ...

  10. Android USB gadget configfs学习笔记总结

    1.一个config_item 是通过显式用户空间mkdir操作创建的,通过rmdir销毁.属性(文件)在mkdir之后出现,可以通过read和write读取或修改属性文件.与sysfs一样,read ...