`
beyond429
  • 浏览: 95707 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JRobin Core学习

    博客分类:
  • java
阅读更多

原文地址: http://www.micmiu.com/enterprise-app/snmp/snmp-jrobin-core-demo/

 

最近接触一个流量统计和网管的系统,对相关信息和技术做了一些了解和学习,在此记录,以供自己日后回顾,同时也方便给刚接触的TX们一些参考。

MRTG(Multi Router Traffic Grapher,MRTG),相信接触过网络管理的人,应该不会对它陌生的。MRTG是比较早的技术了,后来在此基础上发展了RRD技术,相比MRTG而言更加灵活方便。

JRobin(基于LGPL授权的开源技术)就是RRD的一个Java实现的版本。JRobin支持在RRD(Round Robin Database)上的所有标准操作:CREATE, UPDATE, FETCH, LAST, DUMP, XPORT和GRAPH。JRobin的API适合于那些熟悉RRDTool的概念与逻辑,但更喜欢使用纯Java实现的人。如果你提供相同的数据给RRDTool与JRobin,你将会得到相同的结果与图形。

ps:JRobin的官网:
http://oldwww.jrobin.org/
http://www.jrobin.org/index.php/Main_Page

先从Core API 开始了解学习如何定义RRD模板、如何创建RRD文件、如何获取RrdDb、如何将RRD文件和XML之间转换以及如何从RRD文件里读取数据等基础内容,下面是学习时写的一些测试代码:TestCoreRrd.java

1 package com.snmp.jrobin;
2
3 import org.jrobin.core.DsDef;
4 import org.jrobin.core.DsTypes;
5 import org.jrobin.core.FetchData;
6 import org.jrobin.core.FetchRequest;
7 import org.jrobin.core.RrdDb;
8 import org.jrobin.core.RrdDef;
9 import org.jrobin.core.Sample;
10 import org.jrobin.core.Util;
11
12 /**
13  * JRobin Core学习
14  * @author Michael sun
15  */
16 public class TestCoreRrd {
17     /**
18      * @param args
19      */
20     public static void main(String[] args) {
21         // 2010-10-01:1285862400L 2010-11-01:1288540800L
22         long startTime = Util.getTimestamp(201010 11);
23         long endTime = Util.getTimestamp(201011 11);
24
25         TestCoreRrd test = new TestCoreRrd();
26         String rootPath = "d:/test/jrobin/";
27         String rrdName = "demo_flow.rrd";
28         // 测试创建RrdDef
29         RrdDef rrdDef = test.createRrdDef(rootPath, rrdName, startTime);
30         // 测试创建RRD文件 初始数据
31         test.createRRDInitData(startTime, endTime, rootPath, rrdName, rrdDef);
32         // 测试获取RrdDb的方法
33         test.getRrdDbMethod(rootPath);
34         // 测试FetchData获取RRD
35         test.fetchRrdData(rootPath, rrdName);
36     }
37
38     /**
39      * 创建RRDDef
40      */
41     private RrdDef createRrdDef(String rootPath, String rrdName, long startTime) {
42         try {
43
44             String rrdPath = rootPath + rrdName;
45             RrdDef rrdDef = new RrdDef(rrdPath, startTime - 1300);
46             // DsTypes: GAUGE COUNTER DERIVE ABSOLUTE
47             DsDef dsDef = new DsDef("input", DsTypes.DT_COUNTER, 6000,
48                     Double.NaN);
49             rrdDef.addDatasource(dsDef);
50
51             rrdDef.addDatasource("output", DsTypes.DT_COUNTER, 6000,
52                     Double.NaN);
53
54             rrdDef.addArchive("AVERAGE"0.51600);
55             rrdDef.addArchive("AVERAGE"0.56700);
56             rrdDef.addArchive("AVERAGE"0.524797);
57             rrdDef.addArchive("AVERAGE"0.5288775);
58             rrdDef.addArchive("MAX"0.51600);
59             rrdDef.addArchive("MAX"0.56700);
60             rrdDef.addArchive("MAX"0.524797);
61             rrdDef.addArchive("MAX"0.5288775);
62
63             // RRD file definition is completed
64
65             rrdDef.exportXmlTemplate(rootPath + rrdName + "_template.xml");
66             System.out.println("[RrdDef Template  export xml success]");
67
68             return rrdDef;
69         catch (Exception e) {
70             e.printStackTrace();
71             return null;
72         }
73     }
74
75     /**
76      * 通过RrdDef创建RRD文件并初始化数据
77      */
78     private void createRRDInitData(long startTime, long endTime,
79             String rootPath, String rrdName, RrdDef rrdDef) {
80         try {
81
82             RrdDb rrdDb = new RrdDb(rrdDef);
83             // / by this point, rrd file can be found on your disk
84
85             // 模拟一些测试数据
86             //Math.sin(2 * Math.PI * (t / 86400.0)) * baseval;
87             int baseval = 50;
88             for (long t = startTime; t < endTime; t += 300) {
89                 Sample sample = rrdDb.createSample(t);
90                 double tmpval = Math.random() * baseval;
91                 double tmpval2 = Math.random() * baseval;
92                 sample.setValue("input", tmpval + 50);
93                 sample.setValue("output", tmpval2 + 50);
94                 sample.update();
95             }
96             System.out.println("[RrdDb init data success]");
97             System.out.println("[Rrd path]:" + rrdDef.getPath());
98
99             // rrdDb.dumpXml(rootPath + rrdName + "_rrd.xml")
100             rrdDb.exportXml(rootPath + rrdName + ".xml");
101
102             // If your RRD files are updated rarely, open them only when
103             // necessary and close them as soon as possible.
104             rrdDb.close();
105
106             System.out.println("[RrdDb export xml success]");
107         catch (Exception e) {
108             e.printStackTrace();
109
110         }
111     }
112
113     /**
114      * 除根据RrdDef以外获取RrdDb的其他方法
115      */
116     private void getRrdDbMethod(String rootPath) {
117         try {
118
119             // 根据RRD文件获取RrdDb
120             String rrdFullPath = rootPath + "demo_flow.rrd";
121             RrdDb rrdDb = new RrdDb(rrdFullPath);
122             System.out.println("[info:]" + rrdDb.getInfo() + "[path:]"
123                     + rrdDb.getPath());
124             rrdDb.close();
125
126             // 根据XML文件获取RrdDb
127             rrdDb = new RrdDb(rootPath + "copy.rrd", rootPath
128                     "demo_flow_rrd.xml");
129             System.out.println("[info:]" + rrdDb.getInfo() + "[path:]"
130                     + rrdDb.getPath());
131             rrdDb.close();
132         catch (Exception e) {
133             e.printStackTrace();
134         }
135     }
136
137     /**
138      *
139      */
140     private void fetchRrdData(String rootPath, String rrdName) {
141         try {
142             // open the file
143             RrdDb rrd = new RrdDb(rootPath + rrdName);
144
145             // create fetch request using the database reference
146             FetchRequest request = rrd.createFetchRequest("AVERAGE", Util
147                     .getTimestamp(201010 11), Util.getTimestamp(2010,
148                     10 12));
149
150             System.out.println("[requet dump:]" + request.dump());
151
152             // filter the datasources you really need
153             // String[] filterDataSource = { "input", "output" };
154             // request.setFilter(filterDataSource);
155
156             // if you want only the "input" datasource use:
157             // request.setFilter("input");
158
159             // execute the request
160             FetchData fetchData = request.fetchData();
161             int columnCount = fetchData.getColumnCount();
162             int rowCount = fetchData.getRowCount();
163             long[] timestamps = fetchData.getTimestamps();
164             System.out.println("[data column count:]" + columnCount);
165             System.out.println("[data row count:]" + rowCount);
166
167             // System.out.println("[fetch data dump:]" + fetchData.dump());
168             // 循环获取数据
169             double[][] values = fetchData.getValues();
170             StringBuffer buffer = new StringBuffer("");
171             for (int row = 0; row < rowCount; row++) {
172                 buffer.append(timestamps[row]);
173                 buffer.append(":  ");
174                 for (int dsIndex = 0; dsIndex < columnCount; dsIndex++) {
175                     buffer.append(Util.formatDouble(values[dsIndex][row]));
176                     buffer.append("  ");
177                 }
178                 buffer.append("\n");
179             }
180             System.out.println("[fetch data display :]\n" + buffer);
181         catch (Exception e) {
182             e.printStackTrace();
183         }
184
185     }
186 }

RRD定义的模板导出XML:

1 <rrd_def>
2    <path>d:/test/jrobin/demo_flow.rrd</path>
3    <step>300</step>
4    <start>1285862399</start>
5    <datasource>
6       <name>input</name>
7       <type>COUNTER</type>
8       <heartbeat>600</heartbeat>
9       <min>+0.0000000000E00</min>
10       <max>U</max>
11    </datasource>
12    <datasource>
13       <name>output</name>
14       <type>COUNTER</type>
15       <heartbeat>600</heartbeat>
16       <min>+0.0000000000E00</min>
17       <max>U</max>
18    </datasource>
19    <archive>
20       <cf>AVERAGE</cf>
21       <xff>+5.0000000000E-01</xff>
22       <steps>1</steps>
23       <rows>600</rows>
24    </archive>
25    <archive>
26       <cf>AVERAGE</cf>
27       <xff>+5.0000000000E-01</xff>
28       <steps>6</steps>
29       <rows>700</rows>
30    </archive>
31    <archive>
32       <cf>AVERAGE</cf>
33       <xff>+5.0000000000E-01</xff>
34       <steps>24</steps>
35       <rows>797</rows>
36    </archive>
37    <archive>
38       <cf>AVERAGE</cf>
39       <xff>+5.0000000000E-01</xff>
40       <steps>288</steps>
41       <rows>775</rows>
42    </archive>
43    <archive>
44       <cf>MAX</cf>
45       <xff>+5.0000000000E-01</xff>
46       <steps>1</steps>
47       <rows>600</rows>
48    </archive>
49    <archive>
50       <cf>MAX</cf>
51       <xff>+5.0000000000E-01</xff>
52       <steps>6</steps>
53       <rows>700</rows>
54    </archive>
55    <archive>
56       <cf>MAX</cf>
57       <xff>+5.0000000000E-01</xff>
58       <steps>24</steps>
59       <rows>797</rows>
60    </archive>
61    <archive>
62       <cf>MAX</cf>
63       <xff>+5.0000000000E-01</xff>
64       <steps>288</steps>
65       <rows>775</rows>
66    </archive>
67 </rrd_def>

RRD文件转换成XML文件的片段:

1 <rrd>
2    <!-- JRobin, version 0.1 -->
3    <version>0001</version>
4    <!-- Seconds -->
5    <step>300</step>
6    <!-- Sun Oct 31 23:55:00 CST 2010 -->
7    <lastupdate>1288540500</lastupdate>
8    <ds>
9       <name>input</name>
10       <type>COUNTER</type>
11       <minimal_heartbeat>600</minimal_heartbeat>
12       <min>+0.0000000000E00</min>
13       <max>NaN</max>
14       <!-- PDP Status -->
15       <last_ds>+6.9973544356E01</last_ds>
16       <value>+0.0000000000E00</value>
17       <unknown_sec>0</unknown_sec>
18    </ds>
19    <ds>
20       <name>output</name>
21       <type>COUNTER</type>
22       <minimal_heartbeat>600</minimal_heartbeat>
23       <min>+0.0000000000E00</min>
24       <max>NaN</max>
25       <!-- PDP Status -->
26       <last_ds>+9.4423065918E01</last_ds>
27       <value>+0.0000000000E00</value>
28       <unknown_sec>0</unknown_sec>
29    </ds>
30    <rra>
31       <cf>AVERAGE</cf>
32       <!-- 300 seconds -->
33       <pdp_per_row>1</pdp_per_row>
34       <xff>+5.0000000000E-01</xff>
35       <cdp_prep>
36          <ds>
37             <value>NaN</value>
38             <unknown_datapoints>0</unknown_datapoints>
39          </ds>
40          <ds>
41             <value>NaN</value>
42             <unknown_datapoints>0</unknown_datapoints>
43          </ds>
44       </cdp_prep>
45       <database>
46          <!-- Fri Oct 29 22:00:00 CST 2010 / 1288360800 -->
47          <row>
48             <v>+1.4316557626E07</v>
49             <v>+1.2619069495E-01</v>
50          </row>
51          <!-- Fri Oct 29 22:05:00 CST 2010 / 1288361100 -->
52          <row>
53             <v>+1.4063324411E-02</v>
54             <v>+1.4316557534E07</v>
55          </row>
56         <!-- 省略部分信息-->
57          ...........................
58        </database>
59      </rra>
60      <!-- 省略部分信息-->
61      ...............................
62   </rrd>

 

分享到:
评论

相关推荐

    jrobin学习例子程序

    学习用jrobin绘图的绝佳例子程序 学习用jrobin绘图的绝佳例子程序

    RRD与JRobin

    在IT监控领域,RRD(Round Robin Database)和JRobin是两种常见的时序数据库,用于存储和...通过学习和掌握这些工具,你可以构建出能够实时反映IT环境健康状况的监控系统,及时发现并解决问题,确保业务的稳定运行。

    jrobin-1.5.14.jar和源代码

    JRobin-1.5.14.jar是这个项目的一个稳定版本,而其源代码的提供则为开发者提供了深入学习和定制的机会。 1. **JRobin介绍** JRobin是一个纯Java实现的RPM存储引擎,它的设计目标是高效、低内存占用和快速读写。...

    jrobin-1.5.9-API文档-中文版.zip

    赠送jar包:jrobin-1.5.9.jar; 赠送原API文档:jrobin-1.5.9-javadoc.jar; 赠送源代码:jrobin-1.5.9-sources.jar; 赠送Maven依赖信息文件:jrobin-1.5.9.pom; 包含翻译后的API文档:jrobin-1.5.9-javadoc-API...

    jrobin-1.5.9-API文档-中英对照版.zip

    赠送jar包:jrobin-1.5.9.jar; 赠送原API文档:jrobin-1.5.9-javadoc.jar; 赠送源代码:jrobin-1.5.9-sources.jar; 赠送Maven依赖信息文件:jrobin-1.5.9.pom; 包含翻译后的API文档:jrobin-1.5.9-javadoc-API...

    JRobin 流量报表

    **JRobin 流量报表详解** JRobin 是一个基于 Java 的开源项目,专门设计用于生成和展示流量数据的图形报表。作为一个轻量级框架,它为监控系统性能提供了直观、实时的图表展示功能,尤其在处理网络流量、系统资源...

    jrobin流量监控代码

    **Jrobin流量监控代码详解** Jrobin是一种开源的、轻量级的时序数据存储库,专门用于性能监控和日志记录。它被设计为Rrdtool(Round Robin Database Tool)的一个替代品,Rrdtool是由Tobi Oetiker开发的用于存储和...

    JavaMelody javamelody-core-1.52.0.jar jrobin-1.5.9.jar

    在本案例中,我们关注的是两个核心的JAR文件:`javamelody-core-1.52.0.jar`和`jrobin-1.5.9.jar`。 `javamelody-core-1.52.0.jar`是JavaMelody的核心组件,包含了实现监控功能的主要类和接口。这个版本的Java...

    javaMelody+jrobin jar文件 .rar

    它集成了JRobin,一个高效的数据存储库,用于收集和展示监控数据。本篇将深入探讨JavaMelody和JRobin的核心功能以及它们在Java运行时监控中的作用。 JavaMelody的核心功能主要包括以下几个方面: 1. **性能指标...

    JRobin-开源

    JRobin是RRDTool的100%纯Java替代品,具有几乎完全相同的规格。 如果向RRDTool和JRobin提供相同的数据,则将获得完全相同的结果和图形。 支持所有标准RRDTool操作。

    javamelody.jar和 jrobin.jar

    监控器需要的jar,需在web.xml中配置 &lt;filter-name&gt;monitoring &lt;filter-class&gt;net.bull.javamelody.MonitoringFilter&lt;/filter-class&gt; &lt;filter-name&gt;monitoring &lt;url-pattern&gt;/* ...可以进入到监控页面

    snmp-tutorial:SNMP教程:Jrobin、SNMP4j

    Jrobin、SNMP4jsnmp4j-1x-demoSNMP4j实现同步和异步的GET的示例SNMP4j实现同步和异步的Walk的示例SNMP4j实现Trap的示例SNMP4j实现SET的示例SNMP4j实现GETBLUK的示例robin-demoJRobin Core学习JRobin基础画图JRobin...

    jrobin-1.5.9.jar中文-英文对照文档.zip

    注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 ...

    RRD环形数据库操作.rar

    在深入学习RRD和JRobin时,需要理解RRD的数据模型、归档策略以及如何优化存储和查询效率。此外,熟悉相关工具(如RRDTool)和库(如JRobin)的API,对于开发监控和分析系统至关重要。通过"RRD环形数据库操作"的示例...

    开源 tomcat 性能查看工具

    "jrobin-1.5.9.1.jar"是Java Robin(JRobin)的组件,它是JavaMelody的一个依赖库,用于存储和检索监控数据。JRobin是一个纯Java实现的RMON(Remote Monitoring)兼容的数据存储系统,它能够高效地记录和分析时间...

    javamelody资料包

    2. **jrobin**: JRobin是用于存储性能数据的二进制日志库,它是基于RMON(Remote Monitoring)标准的,能够高效地存储和检索性能历史数据。 3. **msyh.ttc** 和 **msyhbd.ttc**: 这两个文件可能包含的是中文字体,...

    JavaMelody 监测java或javaEE应用服务器

    另一个`jrobin-1.5.9.1.jar`则是JRobin库,它是JavaMelody用来存储和读取性能数据的持久化组件,提供了类似于RRDTool(Round Robin Database)的功能,以高效的方式存储时间序列数据。 在使用JavaMelody时,通常会...

    监控JAVA应用的好工具javamelody

    这个工具的核心组件包括javamelody.jar和jrobin-1.5.9.1.jar,这两个JAR文件在Java应用的监控中扮演着重要角色。 javamelody.jar是JavaMelody的主要实现库,它提供了全面的监控功能。这个库能够集成到任何基于...

    javamelody性能监控jar和war

    2. **jrobin-1.5.9.1.jar**: JRobin是一个轻量级的、纯Java实现的RPN(Reverse Polish Notation)图绘制库,用于存储和读取性能数据。JavaMelody利用JRobin来持久化监控数据,如内存、CPU使用率等,以便后续分析。 ...

    jribin-1.5

    JRobin is just an API. With this API you are free to optimize your code so that RRD files are open or closed only when necessary. This could lead to huge performance benefits.

Global site tag (gtag.js) - Google Analytics