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
deltacloud-devel@lists.fedorahosted.org