“C# RRDtool 钩子”






4.79/5 (24投票s)
C# (.NET and Mono) library provider for RRDtool


引言
NHawk 是一个旨在为 .NET 和 Mono 框架提供一个轻量级、完整的 RRDtool 提供程序的项目。该项目的目标是通过适当的 .NET / Mono 对象模型语义,为本地 RRDtool 功能提供 C# 接口,同时保留一种直观的语法,能够自然地融入 .NET / Mono 范式,并与本地 RRDtool 的语法非常相似。通过这样做,NHawk 致力于提供一个强大的时间序列分析工具库,填补了 .NET 和 Mono 框架中的一大空白。我们希望提供一个能够提高生产力、健壮性和表达力的工具集;使熟练的 C# 开发人员能够轻松地(并且直观地)与本地 RRDtool 脚本进行代码互操作。NHawk 的一个目标是通过允许客户端仅参考本地 RRDtool 文档资源来提高生产力,从而大大缩短学习曲线(在大多数情况下,如果开发人员熟悉 RRDtool 和 C#)。接下来的示例代码片段将说明基本概念。请特别注意语法相似之处,并特别关注突出显示序列化、反序列化和深层复制的部分,因为它们构成了强大的架构实用功能,包括对面向 Web 服务的应用程序的支持,以及对现有(本地)RRDtool 脚本的生成和互操作的支持。
背景
接下来的示例摘自随源代码和二进制文件 1.0 版本一起包含的扩展教程。
请注意,以下示例材料摘自最初由 Alex van den Bogaerdt(邮箱:alex@ergens.op.het.net)创建的教程,可在 http://oss.oetiker.ch/rrdtool/tut/rrdtutorial.en.html 上查看。
RRDtool 由 Tobias Oetiker(邮箱:tobi@oetiker.ch)编写,可在 http://oss.oetiker.ch/rrdtool/index.en.html 上找到。
*** 有关当前代码修订版的联系方式以及开发和状态信息,请参阅本文档末尾。 ***
Using the Code
定义和创建 RRD 的 RRDtool 语法
rrdtool create test.rrd --start 920804400
DS:speed:COUNTER:600:U:U
RRA:AVERAGE:0.5:1:24
RRA:AVERAGE:0.5:6:10
NHawk (C#) 定义和创建 RRD 的语法
RRD rrd1 = new RRD("test.rrd", 920804400);
rrd1.addDS(new DS("speed", DS.TYPE.COUNTER, 600, DS.U, DS.U));
rrd1.addRRA(new RRA(RRA.CF.AVERAGE, 0.5, 1, 24));
rrd1.addRRA(new RRA(RRA.CF.AVERAGE, 0.5, 6, 10));
rrd1.create(true);
RRDtool 更新语法
rrdtool update test.rrd 920804700:12345
NHawk (C#) 更新语法
NHawk 提供了一种通过将预期的 DS(数据源)参数打包到 object 或 string 类型的数组中来更新 RRD 的方法。应使用以下 C# 方法重载之一。
注意:类型为 object 的版本(在内部)被显式转换为 string
,因为更新命令被序列化并发送给 rrdtool 进行处理。目的是让您(在可能的情况下)无需显式转换。当无法转换时,您将需要使用 string
版本。除此之外,这两种方法是等效的。
rrd1.update(920804700, new object[] { 12345 });
rrd1.update(920804700, new string[] { “12345” });
string[] args = new string[1];
args[0] = “12345”;
rrd1.update(920804700, args);
可以通过调用:“rrd1.CurrentUpdateStr
” 来检索(当前)序列化的更新 string
,如下面的示例所示
Console.WriteLine("{0}", rrd1.CurrentUpdateStr);
结果如下控制台输出…
rrdtool update test.rrd 920804700:12345
注意:“CurrentUpdateStr
” 应在每次调用“rrd1.update(…)
” 后调用,因为序列化是在那里完成的。
RRDtool 图形语法
rrdtool graph speed4.png
--start 920804400 --end 920808000
--vertical-label km/h
DEF:myspeed=test.rrd:speed:AVERAGE
"CDEF:kmh=myspeed,3600,*"
CDEF:fast=kmh,100,GT,100,0,IF
CDEF:over=kmh,100,GT,kmh,100,-,0,IF
CDEF:good=kmh,100,GT,0,kmh,IF
HRULE:100#0000FF:"Maximum allowed"
AREA:good#00FF00:"Good speed"
AREA:fast#550000:"Too fast"
STACK:over#FF0000:"Over speed"
NHawk(C#) 图形语法
GRAPH gr4 = new GRAPH("speed4.png", "920804400", "920808000");
gr4.yaxislabel = "km/h";
gr4.addDEF(new DEF("myspeed", rrd1, "speed", RRA.CF.AVERAGE));
gr4.addCDEF(new CDEF("kmh", "myspeed,3600,*"));
gr4.addCDEF(new CDEF("fast", "kmh,100,GT,kmh,0,IF"));
gr4.addCDEF(new CDEF("over", "kmh,100,GT,kmh,100,-,0,IF"));
gr4.addCDEF(new CDEF("good", "kmh,100,GT,0,kmh,IF"));
gr4.addGELEM(new HRULE("100", Color.Blue, "Maximum allowed"));
gr4.addGELEM(new AREA("good", Color.Green, "Good speed"));
gr4.addGELEM(new AREA("fast", Color.Brown, "Too fast"));
gr4.addGELEM(new AREA("over", Color.Red, "Over speed",true));
gr4.graph();
注意:NHAWK 代码行
gr4.addGELEM(new AREA("over", Color.Red, "Over speed",true));
在语义上等同于
STACK:over#FF0000:"Over speed"
NHAWK 使用较新的语法结构,因为 STACK 结构作为直接图形元素已在 RRDTool 1.3 中弃用。
架构特性:序列化、反序列化和深层复制
所有 NHAWK 结构都构建为复合结构,合同规定每个结构必须能够自行序列化、反序列化和深层复制(请参阅源代码下载中提供的 UML 架构图)。换句话说,更高级别的结构(如 GRAPH
类)会通过要求其所有复合结构自行序列化来序列化自身。这是一个强大的特性,因为它开启了一个全新的功能级别。这包括与(本地)RRDTool 脚本的生成和互操作,以及与面向服务架构(如 Web 服务应用程序)的易用性。下面我们用 GRAPH
类的示例来说明。
GRAPH gr5 = new GRAPH(gr4.ToString(), ".\\");
Console.WriteLine("{0}", gr5.ToString());
上面的代码片段执行以下操作
graph
对象g4
被序列化并传递给GRAPH
类的反序列化(提升)构造函数。graph
对象g5
通过反序列化对象g4
的(string
)形式来实例化。- 对象
g5
被序列化并写入控制台,如下所示…graph speed4.png --start 920804400 --end 920808000 --vertical-label "km/h" DEF:myspeed=test.rrd:speed:AVERAGE CDEF:kmh=myspeed,3600,* CDEF:fast=kmh,100,GT,kmh,0,IF CDEF:over=kmh,100,GT,kmh,100,-,0,IF CDEF:good=kmh,100,GT,0,kmh,IF HRULE:100#0000FF:"Maximum allowed" AREA:good#008000:"Good speed" AREA:fast#A52A2A:"Too fast" AREA:over#FF0000:"Over speed"
深层复制及其重要性
GRAPH gr6 = GRAPH.DeepClone(gr5);
Console.WriteLine("\n{0}", gr6.ToString());
上面的对象 gr6
是 gr5
的一个(新内存)副本。本质上,NHawk 只是大量的解析,因此每个聚合的类成员要么是 string
,要么是值类型。值类型默认会被深层复制,尽管 string
是引用类型,NHawk 使用临时的 StringBuilders
来返回新构建的(新内存)string
对象。这在许多情况下可能很有用,因为它在基于不具有对象身份的对象的对象模型中提供了有限的对象身份(浅层引用)的保留。最后,仅为完整起见,下面的代码片段说明了通常的浅层复制。
GRAPH gr7 = gr6;
当前代码库进度:修订版:1.0
DEF (Graph Definitions) == 100%
CDEF (Graph Calc Definitions) == 100%
RRD (Defining, creating, and loading existing Round Robin Database files).
DS (data source) == 100%
RRA (round robin archives) == 100%
GRAPHING ELEMENTS
LINE == 100%
AREA == 100%
VRULE == 100%
HRULE == 100%
SHIFT == 100%
GRAPH == 90% (approx. needs VDEF, PRINT Elements)
当前待办事项列表(我计划接下来实现的功能)。
时间表:2-4 周。注意:一旦完成下面的列表、进行测试并添加了已完成的工作,那么绝大多数主要的 rrdtool 功能将完成。这是一个非常可行的项目。
- VDEF
- PRINT 元素
- RRDFetch
编译说明和库使用
请参阅源代码下载中包含的用户手册。
入门
为了快速入门,请参阅源代码中包含的教程,位于:“NHawk\tutorials\rrdtutorial.en.html”。
源代码可以从文件夹:“NHawk\tutorials\rrdtutorial1_code” 进行编译和执行。
RRDtool 可从 http://oss.oetiker.ch/rrdtool/pub/ 下载。
Windows 和 Netware 二进制文件的良好站点是 http://www.gknw.net/mirror/rrdtool/
(最新版本 == rrdtool-1.2.28-bin-w32.zip)。
作者联系方式
Michael Corley
mwcorley79@gmail.com
历史
- 2008 年 8 月 22 日 -- 发布修订版 1.0
- 2010 年 5 月 26 日 -- 尚未添加新功能...修复了 CLS 合规性问题