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

http帮助类

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

日期转换的扩展方法

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

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

使用方法

  1. InfluxDBClient client = new InfluxDBClient("http://110.124.149.123:8086", username, password);
  2. long timestamp = DateTime.Now.ToUnixTimestamp();
  3. List<string> list = new List<string>();
  4. list.Add(string.Format("requestsQueued value={0} {1}", 20, timestamp)); //requestsQueued为指标的名称
  5. list.Add(string.Format("currentConnections value={0} {1}", 10, timestamp));
  6. list.Add(string.Format("bytesReceivedPerSec value={0} {1}", 100, timestamp));
  7. string sql = string.Join("\n", list);
  8. 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. 微信小程序中时间转化为时间戳(安卓和苹果兼容性)

    在IOS中时间显示NAN,后来才知道是由于安卓和IOS时间解析时间的时间格式不一致: 在安卓机中2018-06-21 16:00:21 IOS识别的格式是 2018/06/21: 所以在处理IOS机器 ...

  2. thinkphp5.0自定义验证器

    虽然我早就会些php基础语法,我套过数据,自己写的控制器层,不是用的api方式,那个公司是为了锻炼我,所以才那样做的,基本上的东西都是用的框架自带的,重来自己没有去封装过这些东西,所以编程思想上,还很 ...

  3. Python 3.5 in win10 pip install Orange3

    http://www.lfd.uci.edu/%7Egohlke/pythonlibs/ 下载Orange3 以及 依赖包 注意网页上标出的Orange 的依赖,以及 https://github.c ...

  4. 给新创建的用户 赋予所有的权利 *.* 查看权限 删除用户 ---------DCL用户权限管理篇

    第一步:进入数据库以后,先用 show databases; 再use mysql;    再 show tables;    再 select user,host from mysql.user; ...

  5. day29akka

    PS:AKKA之前要实现并发编程,通常要借用netty框架,现在如果又要高并发又要分布式就使用akka框架这个akka在客户端和服务端每一端都相当于一个actor,尤其是服务端需要一个总管进行管理 P ...

  6. SQLite数据库下载

    一:SQLite简介 SQLite是一种嵌入式数据库,它的数据库就是一个文件.体积很小,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成. 要操作关系数据库,首先需要连接到 ...

  7. NYOJ 483 Nightmare 【广搜】+【无标记】

    版权声明:长风原创 https://blog.csdn.net/u012846486/article/details/31032479 Nightmare 时间限制:1000 ms  |  内存限制: ...

  8. 用Promise对象实现的 Ajax 操作

  9. Bubble Sort冒泡排序

    冒泡排序是一种简单的排序算法. 它每次重复的访问过要排序的数列, 一次比较两个元素, 如果他们的顺错误, 就把他们交换过来. 下面这种图很清晰的解释了什么是冒泡算法. 具体算法描述如下: 1. 比较相 ...

  10. tp5闭包子查询传参方法

    在channel表中查询status,channel_id,channel_name,account_level这些字段,且这些字段的channel_id不在adv_id为$id的表adv_chann ...