本文主要记录下学习如何运用JRboin画图的一些测试代码。
本次测试画图用到的测试数据demo_flow.rrd文件,是来自之前写的SNMP系列之(一)JRobin Core学习中的方法生成的,可供大家参考。
JRboin的画图主要从下面两方面:
- 直接定义RrdGraphDef对象画图
- 根据定义好的模板XML文件生成图片
先看下两中方法生成的图片效果图:
下面是我写demo时生成图片的测试代码以及定义的模板XML文件:
1 | package com.snmp.jrobin; |
2 |
3 | import java.awt.Color; |
4 | import java.awt.Font; |
5 | import java.awt.image.BufferedImage; |
6 | import java.io.File; |
7 |
8 | import javax.imageio.ImageIO; |
9 |
10 | import org.jrobin.core.Util; |
11 | import org.jrobin.graph.RrdGraph; |
12 | import org.jrobin.graph.RrdGraphDef; |
13 | import org.jrobin.graph.RrdGraphDefTemplate; |
14 | import org.xml.sax.InputSource; |
15 |
16 | /** |
17 | * @author Michael |
18 | * |
19 | */ |
20 | public class TestGraphCommon { |
21 |
22 | /** |
23 | * @param args |
24 | */ |
25 | public static void main(String[] args) { |
26 | String rootPath = "d:/test/jrobin/"; |
27 | String imgFileName = "demo_graph_rrd.png"; |
28 |
29 | TestGraphCommon test = new TestGraphCommon(); |
30 |
31 | // 测试直接定义画图模板生成图片 |
32 | test.graphByGraphDef(rootPath, imgFileName); |
33 |
34 | String tempName = "graph-def-template.xml"; |
35 | // 测试根据定义的XML模板文件生成图片 |
36 | test.graphByTemplate(rootPath, tempName); |
37 | } |
38 |
39 | /** |
40 | * 直接定义画图模板生成图片 |
41 | * @param rootPath |
42 | * @param imgFileName |
43 | */ |
44 | private void graphByGraphDef(String rootPath, String imgFileName) { |
45 | try { |
46 | System.out.println("[rrd graph by RrdGraphDef start...]"); |
47 | // 2010-10-01:1285862400L 2010-11-01:1288540800L |
48 | long startTime = Util.getTimestamp(2010, 10 - 1, 1); |
49 | long endTime = Util.getTimestamp(2010, 10 - 1, 31); |
50 |
51 | RrdGraphDef rgdef = new RrdGraphDef(); |
52 | // If the filename is set to '-' the image will be created only in |
53 | // memory (no file will be created). |
54 | // rgdef.setFilename("-"); |
55 | rgdef.setFilename(rootPath + imgFileName); |
56 |
57 | // "PNG", "GIF" or "JPG" |
58 | rgdef.setImageFormat("PNG"); |
59 | // rgdef.setTimeSpan(startTime, endTime); |
60 | rgdef.setStartTime(startTime); |
61 | rgdef.setEndTime(endTime); |
62 |
63 | rgdef.setAntiAliasing(false); |
64 | rgdef.setSmallFont(new Font("Monospaced", Font.PLAIN, 11)); |
65 | rgdef.setLargeFont(new Font("SansSerif", Font.BOLD, 14)); |
66 |
67 | rgdef.setTitle("JRobin graph by RrdGraphDef demo"); |
68 | // default 400 |
69 | rgdef.setWidth(500); |
70 | // default 100 |
71 | rgdef.setHeight(200); |
72 |
73 | // 一般不需要设置这个参数 |
74 | // rgdef.setStep(86400); |
75 |
76 | rgdef.setVerticalLabel("transfer speed [bits/sec]"); |
77 |
78 | rgdef.datasource("in", rootPath + "demo_flow.rrd", "input", |
79 | "AVERAGE"); |
80 | rgdef.datasource("out", rootPath + "demo_flow.rrd", "output", |
81 | "AVERAGE"); |
82 | rgdef.datasource("in8", "in,8,*"); |
83 | rgdef.datasource("out8", "out,8,*"); |
84 | // PS:先画域的再画线的,否则线会被域遮盖 |
85 | rgdef.area("out8", new Color(0, 206, 0), "output traffic"); |
86 | rgdef.line("in8", Color.BLUE, "input traffic\\l"); |
87 |
88 | // \\l->左对齐 \\c->中间对齐 \\r->右对齐 \\j->自适应 |
89 | // \\s-> \\g->glue \\J-> |
90 | rgdef.gprint("in8", "MAX", "maxIn=%.2f %sbits/sec"); |
91 | rgdef.gprint("out8", "MAX", "maxOut=%.2f %sbits/sec\\l"); |
92 | rgdef.gprint("in8", "AVERAGE", "avgIn=%.2f %sbits/sec"); |
93 | rgdef.gprint("out8", "AVERAGE", "avgOut=%.2f %sbits/sec\\l"); |
94 | rgdef.gprint("in8", "TOTAL", "totalIn=%.2f %sbits/sec"); |
95 | rgdef.gprint("out8", "TOTAL", "totalOut=%.2f %sbits/sec\\s"); |
96 | rgdef.comment("画图测试"); |
97 |
98 | RrdGraph graph = new RrdGraph(rgdef); |
99 | System.out.println("[rrd graph info:]" |
100 | + graph.getRrdGraphInfo().dump()); |
101 | // 如果filename没有设置,只是在内存中,可以调用下面的方法再次生成图片文件 |
102 | if ("-".equals(graph.getRrdGraphInfo().getFilename())) { |
103 | createImgFile(graph, rootPath + imgFileName); |
104 | } |
105 | System.out.println("[rrd graph by RrdGraphDef success.]"); |
106 | } catch (Exception e) { |
107 | e.printStackTrace(); |
108 | } |
109 | } |
110 |
111 | /** |
112 | * ImageIO 生成图片文件 |
113 | */ |
114 | private void createImgFile(RrdGraph graph, String imgFileFullName) { |
115 |
116 | try { |
117 | BufferedImage image = new BufferedImage(graph.getRrdGraphInfo() |
118 | .getWidth(), graph.getRrdGraphInfo().getHeight(), |
119 | BufferedImage.TYPE_INT_RGB); |
120 | graph.render(image.getGraphics()); |
121 | File imgFile = new File(imgFileFullName); |
122 | ImageIO.write(image, "PNG", imgFile); |
123 | } catch (Exception e) { |
124 | e.printStackTrace(); |
125 | } |
126 | } |
127 |
128 | /** |
129 | * 根据定义的XML模板生成图片 |
130 | * @param rootPath |
131 | * @param imgFileName |
132 | */ |
133 | private void graphByTemplate(String rootPath, String tempName) { |
134 | try { |
135 | System.out.println("[rrd graph by xml template start...]"); |
136 | RrdGraphDefTemplate defTemplate = new RrdGraphDefTemplate( |
137 | new InputSource(rootPath + tempName)); |
138 | // setVariable 设置XML template的变量 |
139 | defTemplate.setVariable("startTime", "20101001 00:00"); |
140 | defTemplate.setVariable("endTime", "20101031 23:59"); |
141 | defTemplate.setVariable("in_rrd_file", rootPath + "demo_flow.rrd"); |
142 | defTemplate.setVariable("out_rrd_file", rootPath + "demo_flow.rrd"); |
143 | RrdGraph graph = new RrdGraph(defTemplate.getRrdGraphDef()); |
144 |
145 | BufferedImage image = new BufferedImage(graph.getRrdGraphInfo() |
146 | .getWidth(), graph.getRrdGraphInfo().getHeight(), |
147 | BufferedImage.TYPE_INT_RGB); |
148 | graph.render(image.getGraphics()); |
149 | File imgFile = new File(rootPath + "demo_graph_tmp.PNG"); |
150 | ImageIO.write(image, "PNG", imgFile);// |
151 | System.out.println("[rrd graph by xml template success.]"); |
152 | } catch (Exception e) { |
153 | e.printStackTrace(); |
154 | } |
155 | } |
156 |
157 | } |
模板XML文件:
1 | <?xml version="1.0" encoding="GB2312"?> |
2 | <rrd_graph_def> |
3 | <span> |
4 | <start>${startTime}</start> |
5 | <end>${endTime}</end> |
6 | </span> |
7 | <filename>-</filename> |
8 | <options> |
9 | <anti_aliasing>off</anti_aliasing> |
10 | <fonts> |
11 | <small_font> |
12 | <name>Monospaced</name> |
13 | <style>PLAIN</style> |
14 | <size>11</size> |
15 | </small_font> |
16 | <large_font> |
17 | <name>SansSerif</name> |
18 | <style>BOLD</style> |
19 | <size>14</size> |
20 | </large_font> |
21 | </fonts> |
22 | <title>JRobin graph by xml template demo</title> |
23 | <vertical_label>transfer speed [bits/sec]</vertical_label> |
24 | <width>500</width> |
25 | <height>200</height> |
26 | <base>1024</base> |
27 | </options> |
28 | <datasources> |
29 | <def> |
30 | <name>in</name> |
31 | <rrd>${in_rrd_file}</rrd> |
32 | <source>input</source> |
33 | <cf>AVERAGE</cf> |
34 | </def> |
35 | <def> |
36 | <name>out</name> |
37 | <rrd>${out_rrd_file}</rrd> |
38 | <source>output</source> |
39 | <cf>AVERAGE</cf> |
40 | </def> |
41 | </datasources> |
42 | <graph> |
43 | <area> |
44 | <datasource>in</datasource> |
45 | <color>#00ce00</color> |
46 | <legend>入速率</legend> |
47 | </area> |
48 | <line> |
49 | <datasource>out</datasource> |
50 | <color>#0000FF</color> |
51 | <legend>出速率\l</legend> |
52 | </line> |
53 | <gprint> |
54 | <datasource>in</datasource> |
55 | <cf>MAX</cf> |
56 | <format>入速率最大值:%7.2f %sbits/sec</format> |
57 | </gprint> |
58 | <gprint> |
59 | <datasource>out</datasource> |
60 | <cf>MAX</cf> |
61 | <format>出速率最大值:%7.2f %sbits/sec\l</format> |
62 | </gprint> |
63 | <gprint> |
64 | <datasource>in</datasource> |
65 | <cf>AVERAGE</cf> |
66 | <format>入速率平均值:%7.2f %sbits/sec</format> |
67 | </gprint> |
68 | <gprint> |
69 | <datasource>out</datasource> |
70 | <cf>AVERAGE</cf> |
71 | <format>出速率平均值:%7.2f %sbits/sec\l</format> |
72 | </gprint> |
73 | <gprint> |
74 | <datasource>in</datasource> |
75 | <cf>TOTAL</cf> |
76 | <format>总入流量:%7.2f %sbits</format> |
77 | </gprint> |
78 | <gprint> |
79 | <datasource>out</datasource> |
80 | <cf>TOTAL</cf> |
81 | <format>总出流量:%7.2f %sbits\l</format> |
82 | </gprint> |
83 | <comment>测试画图\l</comment> |
84 | </graph> |
85 | </rrd_graph_def> |

本文介绍使用JRobin库进行网络监控数据可视化的方法,包括直接定义模板和使用XML配置文件两种方式,并展示了实际绘制的数据图表效果。


1万+





