Create GraphService object to manage calls to forked gnuplot process
for chart generation. Also add Graph DTO for encapsulating svg or various
other chart description languages.
---
src/app/models/graph.rb | 9 ++++++
src/app/services/graph_service.rb | 50 +++++++++++++++++++++++++++++++++++++
2 files changed, 59 insertions(+), 0 deletions(-)
create mode 100644 src/app/models/graph.rb
create mode 100644 src/app/services/graph_service.rb
diff --git a/src/app/models/graph.rb b/src/app/models/graph.rb
new file mode 100644
index 0000000..16e609e
--- /dev/null
+++ b/src/app/models/graph.rb
@@ -0,0 +1,9 @@
+class Graph
+ attr :svg
+
+ QOS_AVG_TIME_TO_SUBMIT = "qos_avg_time_to_submit"
+
+ def initialize
+ @svg = ""
+ end
+end
diff --git a/src/app/services/graph_service.rb b/src/app/services/graph_service.rb
new file mode 100644
index 0000000..8fc5bad
--- /dev/null
+++ b/src/app/services/graph_service.rb
@@ -0,0 +1,50 @@
+class GraphService
+ require 'gnuplot'
+
+ def gnuplot_open( persist=false )
+ cmd = Gnuplot.gnuplot( persist ) or raise 'gnuplot not found'
+ output_stream = IO::popen( cmd, "r+")
+ end
+
+
+ def qos_avg_time_to_submit_graph ( provider=nil, width=200, height=100 )
+
+ graph = Graph.new
+ gp = gnuplot_open
+
+ Gnuplot::Plot.new( gp ) do |plot|
+ plot.terminal "svg size #{width},#{height}"
+ plot.arbitrary_lines << "unset xtics"
+ plot.arbitrary_lines << "unset x2tics"
+ plot.arbitrary_lines << "unset ytics"
+ plot.arbitrary_lines << "unset y2tics"
+
+ #FIXME: get data from DataService for the provider.
+ #First build three equal-length arrays
+ x = (0..20).collect { |v| v.to_f }
+ y = x.collect { |v| v ** 2 }
+ c = y.collect { |v| if v > 100 then 1 else 3 end }
+
+ #The three arrays above are three columns of data for gnuplot.
+ #'c' is used for the point's color. See gnuplot docs for
+ #'lc variable' usage.
+ plot.data << Gnuplot::DataSet.new( [x, y, c] ) do |ds|
+ ds.using = "1:2:3"
+ ds.with = "lines lc variable"
+ ds.notitle
+ end
+ end
+ gp.flush
+ gp.close_write
+ gp.read(nil,graph.svg)
+ gp.close_read
+ graph
+ end
+
+ def dashboard_qos (provider = nil)
+ graphs = Hash.new
+ graphs[Graph::QOS_AVG_TIME_TO_SUBMIT] = qos_avg_time_to_submit_graph(provider)
+ graphs
+ end
+
+end
--
1.6.6.1
Show replies by date