Commit 02ee7c6d authored by Paul Asmuth's avatar Paul Asmuth
Browse files

bars_widget

parent f153133f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -128,6 +128,7 @@ require "fnordmetric/worker"
require "fnordmetric/widget"
require "fnordmetric/timeline_widget"
require "fnordmetric/numbers_widget"
require "fnordmetric/bars_widget"
require "fnordmetric/toplist_widget"
require "fnordmetric/namespace"
require "fnordmetric/gauge_modifiers"
+26 −0
Original line number Diff line number Diff line
class FnordMetric::BarsWidget  < FnordMetric::Widget

  def data
    super.merge(
      :gauges => gauges.map(&:name),
      :gauge_titles => gauge_titles,
      :autoupdate => (@opts[:autoupdate] || 60),
      :order_by => (@opts[:order_by] || 'value'),
      :plot_style => (@opts[:plot_style] || 'vertical'),
      :tick => tick
    )
  end

  def gauge_titles
    {}.tap do |_hash|
      gauges.each do |gauge|
        _hash.merge!(gauge.name => gauge.title)
      end
    end
  end

  def has_tick?
    false
  end

end
 No newline at end of file
+131 −0
Original line number Diff line number Diff line
@@ -450,6 +450,136 @@ var FnordMetric = (function(){

  };


  var barsWidget = function(){
    
    function render(opts){
      
      var widget_uid = getNextWidgetUID();
      var chart=false;
      var max_y=0;

      function redraw(first_time, silent){
        if(!silent){ $(opts.elem).css('opacity', 0.5); }
        max_y=0;
        $(opts.gauges).each(function(i,gauge){
          $.ajax({
            url: '/'+currentNamespace+'/gauge/'+gauge, 
            success: redrawGauge(first_time, gauge)
          });         
        });
      }

      function redrawGauge(first_time, gauge){
        return (function(json){                   
          var raw_data = JSON.parse(json);
          var series_data = [];
          var series_type;
          var label_data = [];

          if(opts.plot_style == 'horizontal'){
            series_type = 'bar';
          } else {
            series_type = 'column';
          }

          if(opts.order_by == 'field'){
            raw_data.values.sort(function(a,b){
              if(a[0] == b[0]){
                return 0;
              }else if(a[0] > b[0]){ 
                return 1;
              } else {
                return -1;
              }
            });
          }
          
          for(p in raw_data.values){ 
            label_data.push(raw_data.values[p][0]||'?'); 
            series_data.push(parseInt(raw_data.values[p][1]||0)); 
            //max_y = Math.max(max_y, raw_data[p]);
          }
  
          chart = new Highcharts.Chart({     
            chart: { 
              renderTo: 'container-'+widget_uid, 
              defaultSeriesType: series_type, 
              height: 270 
            },
            series: [],
            title: { text: '' },
            xAxis: {       
             categories: label_data
            },
            yAxis: {
              title: { text: '' }
            },
            legend: {
              layout: 'horizontal',
              align: 'top',
              verticalAlign: 'top',
              x: -5,
              y: -3,
              margin: 25,
              borderWidth: 0
            },
            plotOptions: {
              column: {
                animation: first_time,
              }
            },
            series: [
              {
                name: opts.gauge_titles[gauge],
                data: series_data
              }
            ]
          });

          //chart.redraw();
          $(opts.elem).css('opacity', 1);
        });
      }
    
      function drawLayout(){
        $(opts.elem).append( $('<div></div>').attr('class', 'headbar').append(
          $('<div></div>').attr('class', 'button mr').append($('<span></span>').html('refresh')).click(
            function(){ redraw(); }
          )
        ).append(
          $('<h2></h2>').html(opts.title)
        ) ).append( 
          $('<div></div>').attr('id', 'container-'+widget_uid).css({
            height: 256,
            marginBottom: 20,
            overflow: 'hidden'
          })
        );
      }

      drawLayout();
      redraw(true);

      if(opts.autoupdate){  
        var autoupdate_interval = window.setInterval(function(){
          redraw(false, true);
        }, opts.autoupdate*1000);

        $('body').bind('fm_dashboard_close', function(){
          window.clearInterval(autoupdate_interval);
        });  
      }

    }

    return {
      render: render  
    };

  };


  var sessionView = (function(){
    
    var listElem = $('<ul class="session_list"></ul>');
@@ -746,6 +876,7 @@ var FnordMetric = (function(){
      var widget = widgets[wkey];
      /* argh... */
      if(widget.klass=='TimelineWidget'){ timelineWidget().render(widget); }
      if(widget.klass=='BarsWidget'){ barsWidget().render(widget); }
      if(widget.klass=='NumbersWidget'){ numbersWidget().render(widget); }
      if(widget.klass=='ToplistWidget'){ toplistWidget().render(widget); }
    };
+8 −3
Original line number Diff line number Diff line
@@ -135,11 +135,17 @@ call these methods from the event-handler block

=== Widgets

[autoupdate] auto-refresh the timeline every n secs (0 turns autoupdate off)

==== Widget-Options: TimelineWidget

[plot_style] one of: line, areaspline
[include_current] show the current tick?
[autoupdate] auto-refresh the timeline every n secs (0 turns autoupdate off)

==== Widget-Options: BarsWidget

[plot_style] one of: vertical, horizontal
[order_by]: order bars/columns by: value, field

==== Widget-Options: Numbers-Widget

@@ -290,7 +296,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

== Todos

  -> bars-widget
  -> pie-widget, funnel-widget
  -> combine/calculation gauges via opts_gauge({}, &block) (+calculate ctr)
  -> timeline_widget: 'compare mode': compate gauge to yesterday
  -> fix include_current
@@ -298,7 +304,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  -> make redis-addr and redis-prefix + listen-ports configurable
  -> referal tracking fu (parse googlequeries)  
  -> trend detection
  -> funnel-widget, pie-widget
  -> opt_event options: :increment => gauge_name
  -> preconfigured default-dashboard (like google analytics)
  -> pagview+ref-tracking via js-tracking-pixel