`
sjsky
  • 浏览: 921326 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SNMP之JRobin Core学习

    博客分类:
  • SNMP
阅读更多
    blog迁移至:http://www.micmiu.com

最近接触一个流量统计和网管的系统,对相关信息和技术做了一些了解和学习,在此记录,以供自己日后回顾,同时也方便给刚接触的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
package com.snmp.jrobin;

import org.jrobin.core.DsDef;
import org.jrobin.core.DsTypes;
import org.jrobin.core.FetchData;
import org.jrobin.core.FetchRequest;
import org.jrobin.core.RrdDb;
import org.jrobin.core.RrdDef;
import org.jrobin.core.Sample;
import org.jrobin.core.Util;

/**
 * JRobin Core学习
 * @author Michael sun
 */
public class TestCoreRrd {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // 2010-10-01:1285862400L 2010-11-01:1288540800L
        long startTime = Util.getTimestamp(2010, 10 - 1, 1);
        long endTime = Util.getTimestamp(2010, 11 - 1, 1);

        TestCoreRrd test = new TestCoreRrd();
        String rootPath = "d:/test/jrobin/";
        String rrdName = "demo_flow.rrd";
        // 测试创建RrdDef
        RrdDef rrdDef = test.createRrdDef(rootPath, rrdName, startTime);
        // 测试创建RRD文件 初始数据
        test.createRRDInitData(startTime, endTime, rootPath, rrdName, rrdDef);
        // 测试获取RrdDb的方法
        test.getRrdDbMethod(rootPath);
        // 测试FetchData获取RRD
        test.fetchRrdData(rootPath, rrdName);
    }

    /**
     * 创建RRDDef
     */
    private RrdDef createRrdDef(String rootPath, String rrdName, long startTime) {
        try {

            String rrdPath = rootPath + rrdName;
            RrdDef rrdDef = new RrdDef(rrdPath, startTime - 1, 300);
            // DsTypes: GAUGE COUNTER DERIVE ABSOLUTE
            DsDef dsDef = new DsDef("input", DsTypes.DT_COUNTER, 600, 0,
                    Double.NaN);
            rrdDef.addDatasource(dsDef);

            rrdDef.addDatasource("output", DsTypes.DT_COUNTER, 600, 0,
                    Double.NaN);

            rrdDef.addArchive("AVERAGE", 0.5, 1, 600);
            rrdDef.addArchive("AVERAGE", 0.5, 6, 700);
            rrdDef.addArchive("AVERAGE", 0.5, 24, 797);
            rrdDef.addArchive("AVERAGE", 0.5, 288, 775);
            rrdDef.addArchive("MAX", 0.5, 1, 600);
            rrdDef.addArchive("MAX", 0.5, 6, 700);
            rrdDef.addArchive("MAX", 0.5, 24, 797);
            rrdDef.addArchive("MAX", 0.5, 288, 775);

            // RRD file definition is completed

            rrdDef.exportXmlTemplate(rootPath + rrdName + "_template.xml");
            System.out.println("[RrdDef Template  export xml success]");

            return rrdDef;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 通过RrdDef创建RRD文件并初始化数据
     */
    private void createRRDInitData(long startTime, long endTime,
            String rootPath, String rrdName, RrdDef rrdDef) {
        try {

            RrdDb rrdDb = new RrdDb(rrdDef);
            // / by this point, rrd file can be found on your disk

            // 模拟一些测试数据
            //Math.sin(2 * Math.PI * (t / 86400.0)) * baseval;
            int baseval = 50;
            for (long t = startTime; t < endTime; t += 300) {
                Sample sample = rrdDb.createSample(t);
                double tmpval = Math.random() * baseval;
                double tmpval2 = Math.random() * baseval;
                sample.setValue("input", tmpval + 50);
                sample.setValue("output", tmpval2 + 50);
                sample.update();
            }
            System.out.println("[RrdDb init data success]");
            System.out.println("[Rrd path]:" + rrdDef.getPath());

            // rrdDb.dumpXml(rootPath + rrdName + "_rrd.xml")
            rrdDb.exportXml(rootPath + rrdName + ".xml");

            // If your RRD files are updated rarely, open them only when
            // necessary and close them as soon as possible.
            rrdDb.close();

            System.out.println("[RrdDb export xml success]");
        } catch (Exception e) {
            e.printStackTrace();

        }
    }

    /**
     * 除根据RrdDef以外获取RrdDb的其他方法
     */
    private void getRrdDbMethod(String rootPath) {
        try {

            // 根据RRD文件获取RrdDb
            String rrdFullPath = rootPath + "demo_flow.rrd";
            RrdDb rrdDb = new RrdDb(rrdFullPath);
            System.out.println("[info:]" + rrdDb.getInfo() + "[path:]"
                    + rrdDb.getPath());
            rrdDb.close();

            // 根据XML文件获取RrdDb
            rrdDb = new RrdDb(rootPath + "copy.rrd", rootPath
                    + "demo_flow_rrd.xml");
            System.out.println("[info:]" + rrdDb.getInfo() + "[path:]"
                    + rrdDb.getPath());
            rrdDb.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 
     */
    private void fetchRrdData(String rootPath, String rrdName) {
        try {
            // open the file
            RrdDb rrd = new RrdDb(rootPath + rrdName);

            // create fetch request using the database reference
            FetchRequest request = rrd.createFetchRequest("AVERAGE", Util
                    .getTimestamp(2010, 10 - 1, 1), Util.getTimestamp(2010,
                    10 - 1, 2));

            System.out.println("[requet dump:]" + request.dump());

            // filter the datasources you really need
            // String[] filterDataSource = { "input", "output" };
            // request.setFilter(filterDataSource);

            // if you want only the "input" datasource use:
            // request.setFilter("input");

            // execute the request
            FetchData fetchData = request.fetchData();
            int columnCount = fetchData.getColumnCount();
            int rowCount = fetchData.getRowCount();
            long[] timestamps = fetchData.getTimestamps();
            System.out.println("[data column count:]" + columnCount);
            System.out.println("[data row count:]" + rowCount);

            // System.out.println("[fetch data dump:]" + fetchData.dump());
            // 循环获取数据
            double[][] values = fetchData.getValues();
            StringBuffer buffer = new StringBuffer("");
            for (int row = 0; row < rowCount; row++) {
                buffer.append(timestamps[row]);
                buffer.append(":  ");
                for (int dsIndex = 0; dsIndex < columnCount; dsIndex++) {
                    buffer.append(Util.formatDouble(values[dsIndex][row]));
                    buffer.append("  ");
                }
                buffer.append("\n");
            }
            System.out.println("[fetch data display :]\n" + buffer);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

RRD定义的模板导出XML:
<rrd_def>
   <path>d:/test/jrobin/demo_flow.rrd</path>
   <step>300</step>
   <start>1285862399</start>
   <datasource>
      <name>input</name>
      <type>COUNTER</type>
      <heartbeat>600</heartbeat>
      <min>+0.0000000000E00</min>
      <max>U</max>
   </datasource>
   <datasource>
      <name>output</name>
      <type>COUNTER</type>
      <heartbeat>600</heartbeat>
      <min>+0.0000000000E00</min>
      <max>U</max>
   </datasource>
   <archive>
      <cf>AVERAGE</cf>
      <xff>+5.0000000000E-01</xff>
      <steps>1</steps>
      <rows>600</rows>
   </archive>
   <archive>
      <cf>AVERAGE</cf>
      <xff>+5.0000000000E-01</xff>
      <steps>6</steps>
      <rows>700</rows>
   </archive>
   <archive>
      <cf>AVERAGE</cf>
      <xff>+5.0000000000E-01</xff>
      <steps>24</steps>
      <rows>797</rows>
   </archive>
   <archive>
      <cf>AVERAGE</cf>
      <xff>+5.0000000000E-01</xff>
      <steps>288</steps>
      <rows>775</rows>
   </archive>
   <archive>
      <cf>MAX</cf>
      <xff>+5.0000000000E-01</xff>
      <steps>1</steps>
      <rows>600</rows>
   </archive>
   <archive>
      <cf>MAX</cf>
      <xff>+5.0000000000E-01</xff>
      <steps>6</steps>
      <rows>700</rows>
   </archive>
   <archive>
      <cf>MAX</cf>
      <xff>+5.0000000000E-01</xff>
      <steps>24</steps>
      <rows>797</rows>
   </archive>
   <archive>
      <cf>MAX</cf>
      <xff>+5.0000000000E-01</xff>
      <steps>288</steps>
      <rows>775</rows>
   </archive>
</rrd_def>

RRD文件转换成XML文件的片段
<rrd>
   <!-- JRobin, version 0.1 -->
   <version>0001</version>
   <!-- Seconds -->
   <step>300</step>
   <!-- Sun Oct 31 23:55:00 CST 2010 -->
   <lastupdate>1288540500</lastupdate>
   <ds>
      <name>input</name>
      <type>COUNTER</type>
      <minimal_heartbeat>600</minimal_heartbeat>
      <min>+0.0000000000E00</min>
      <max>NaN</max>
      <!-- PDP Status -->
      <last_ds>+6.9973544356E01</last_ds>
      <value>+0.0000000000E00</value>
      <unknown_sec>0</unknown_sec>
   </ds>
   <ds>
      <name>output</name>
      <type>COUNTER</type>
      <minimal_heartbeat>600</minimal_heartbeat>
      <min>+0.0000000000E00</min>
      <max>NaN</max>
      <!-- PDP Status -->
      <last_ds>+9.4423065918E01</last_ds>
      <value>+0.0000000000E00</value>
      <unknown_sec>0</unknown_sec>
   </ds>
   <rra>
      <cf>AVERAGE</cf>
      <!-- 300 seconds -->
      <pdp_per_row>1</pdp_per_row>
      <xff>+5.0000000000E-01</xff>
      <cdp_prep>
         <ds>
            <value>NaN</value>
            <unknown_datapoints>0</unknown_datapoints>
         </ds>
         <ds>
            <value>NaN</value>
            <unknown_datapoints>0</unknown_datapoints>
         </ds>
      </cdp_prep>
      <database>
         <!-- Fri Oct 29 22:00:00 CST 2010 / 1288360800 -->
         <row>
            <v>+1.4316557626E07</v>
            <v>+1.2619069495E-01</v>
         </row>
         <!-- Fri Oct 29 22:05:00 CST 2010 / 1288361100 -->
         <row>
            <v>+1.4063324411E-02</v>
            <v>+1.4316557534E07</v>
         </row>
        <!-- 省略部分信息-->
         ...........................
       </database>
     </rra>
     <!-- 省略部分信息-->
     ...............................
  </rrd>


1
0
分享到:
评论

相关推荐

    jrobin学习例子程序

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

    snmp-tutorial:SNMP教程:Jrobin、SNMP4j

    Jrobin、SNMP4jsnmp4j-1x-demoSNMP4j实现同步和异步的GET的示例SNMP4j实现同步和异步的Walk的示例SNMP4j实现Trap的示例SNMP4j实现SET的示例SNMP4j实现GETBLUK的示例robin-demoJRobin Core学习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;/* ...可以进入到监控页面

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

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

    RRD环形数据库操作.rar

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

    基于Web的网络管理系统.pptx

    4. **JRobin与RRDTool**:JRobin是RRDTool的一个Java实现,用于存储和分析网络性能数据,支持高效、空间优化的数据记录。 【系统设计与实现】 1. **拓扑信息搜索模块**:负责收集网络设备信息,构建和更新网络拓扑...

    开源 tomcat 性能查看工具

    本文将详细介绍这种工具的主要特点和使用方法,以及与之相关的技术知识点。 首先,我们关注的是"jira-javamelody.jar"这个文件。JavaMelody是一个广泛使用的开源监控解决方案,它可以集成到各种Java应用中,包括...

    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使用率等,以便后续分析。 ...

Global site tag (gtag.js) - Google Analytics