Changeset 7820


Ignore:
Timestamp:
Jul 27, 2018, 2:16:22 PM (12 months ago)
Author:
mabarracus
Message:

Allow view custom data range with simple stats

Location:
lliurex-analytics-server/trunk/fuentes
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • lliurex-analytics-server/trunk/fuentes/debian/changelog

    r7613 r7820  
     1lliurex-analytics-server (0.4) xenial; urgency=medium
     2
     3  * Allow view custom data range with simple stats
     4
     5 -- M.Angel Juan <m.angel.juan@gmail.com>  Fri, 27 Jul 2018 14:15:19 +0200
     6
    17lliurex-analytics-server (0.3.2) xenial; urgency=medium
    28
  • lliurex-analytics-server/trunk/fuentes/lliurex-analytics-server/usr/lib/analytics-server/analytics/db.php

    r7613 r7820  
    122122         $this->times=0;
    123123     }
    124      function init_dates(){
     124     function init_dates($range=NULL){
    125125         $this->dates=array();
    126126         $this->dates['today']=date("Y-m-d");
     
    134134         $this->dates['date_very_old']="(date between '".$this->dates['first_very_old']."' and '".$this->dates['last_very_old']."')";
    135135         $this->dates['date_range_last_three_months']="(date between '".$this->dates['first_very_old']."' and '".$this->dates['today']."')";
     136
     137         if ($range != NULL){
     138            $y=intval($range['year']);
     139            $m=intval($range['month']);
     140            $w=intval($range['window']);
     141            $this->dates['init_range']=date("Y-m-01",strtotime($y.'-'.$m.'-01'));
     142            $this->dates['end_range']=date("Y-m-01",strtotime($y.'-'.$m.'-01 +'.$w.' month'));
     143            $this->dates['end_range']=date("Y-m-d",strtotime($this->dates['end_range'].' -1 day'));
     144            if (strtotime($this->dates['end_range']) > strtotime($this->dates['today'])){
     145                $this->dates['end_range']=$this->dates['today'];
     146            }
     147            $this->dates['custom_range']="(date between '".$this->dates['init_range']."' and '".$this->dates['end_range']."')";
     148         }
    136149     }
    137150     function connect(){
     
    892905     }
    893906
    894      function get_historic_data($typechart=''){
     907     function get_historic_data($typechart='',$param=NULL){
    895908         $this->load_alias();
    896909         $obj=[];
     
    903916                 $sname=$sabor['name'];
    904917                 $slike=$sabor['like'];
    905                  $obj[$dname][$sname][]=$this->get_chart($dlike,$slike,'current',$typechart);
    906                  $obj[$dname][$sname][]=$this->get_chart($dlike,$slike,'old',$typechart);
    907                  $obj[$dname][$sname][]=$this->get_chart($dlike,$slike,'very_old',$typechart);
     918                 $obj[$dname][$sname][]=$this->get_chart($dlike,$slike,'current',$typechart,$param);
     919                 if ($param == NULL){
     920                     $obj[$dname][$sname][]=$this->get_chart($dlike,$slike,'old',$typechart);
     921                     $obj[$dname][$sname][]=$this->get_chart($dlike,$slike,'very_old',$typechart);
     922                }
    908923             }
    909924         }
    910925         $obj['debug_query_time']=strval(number_format($this->times,3));
    911          
     926         if (array_key_exists('init_range',$this->dates)){
     927            $obj['debug_init_range']=strval($this->dates['init_range']);
     928         }
     929         if (array_key_exists('end_range',$this->dates)){
     930            $obj['debug_end_range']=strval($this->dates['end_range']);
     931         }
    912932         if (file_exists($this->ka_file)){
    913933             $obj['debug_keep_alive']=date('Y-m-d H:i',file_get_contents($this->ka_file));
     
    915935         return json_encode($obj);
    916936     }
    917    
    918     function get_chart($version='',$sabor='',$type='current',$typechart=''){
     937
     938    function get_chart($version='',$sabor='',$type='current',$typechart='',$param=NULL){
    919939        if ($typechart == ''){
    920940            $cache_key="$version"."_"."$sabor"."_"."$type";
     
    937957        $group=" group by app ";
    938958
    939         $where=$this->dates['date_'.$type]." $version $sabor ";
    940         $where_clients=$this->dates['date_'.$type]." $version $sabor ";
     959        if ($param == NULL){
     960            $where=$this->dates['date_'.$type]." $version $sabor ";
     961            $where_clients=$this->dates['date_'.$type]." $version $sabor ";
     962        }else{
     963            $this->init_dates($param);
     964            $cache_key.='_'.$this->dates['init_range'].'_'.$this->dates['end_range'];
     965            $where=$this->dates['custom_range']." $version $sabor ";
     966            $where_clients=$this->dates['custom_range']." $version $sabor ";
     967        }
    941968
    942969        $sql="SELECT string as app,sum(count) as count from RecvPackages where $where $and $group $order";
  • lliurex-analytics-server/trunk/fuentes/lliurex-analytics-server/usr/lib/analytics-server/analytics/functions.php

    r7577 r7820  
    9494        };
    9595}
     96function process_window_params($req){
     97    $p1=$req->param('init');
     98    $p2=$req->param('window');
     99    if ($p1 == NULL or $p2 == NULL ){
     100        return NULL;
     101    }
     102    if (! (is_numeric($p1) and is_numeric($p2))){
     103        return NULL;
     104    }
     105    $valid = false;
     106    for ($i=0;$i<12;$i++){
     107        $d = date('Yn',strtotime(date('Y-m-01 ').'-'.$i.' month'));
     108        if ($d == $p1){
     109            $p2=intval($p2);
     110            if ($p2 <= $i+1){
     111                $valid = array('year'=>intval(substr($p1,0,4)),'month'=>intval(substr($p1,4,strlen($p1)-4)),'window'=>intval($p2));
     112                break;
     113            }
     114        }
     115    }
     116    return $valid;
     117}
    96118
    97119function call_get_stats(){
    98120        return function($request,$reponse,$service){
    99 
     121                $param = process_window_params($request);
    100122                $db = new DB;
    101123                $db->connect();
    102                 echo $db->get_historic_data('');
     124                echo $db->get_historic_data('',$param);
    103125                $db->disconnect();
    104126        };
     
    107129function call_get_lliurex_stats(){
    108130        return function($request,$reponse,$service){
    109 
     131                $param = process_window_params($request);
    110132                $db = new DB;
    111133                $db->connect();
    112                 echo $db->get_historic_data('whitelist');
     134                echo $db->get_historic_data('whitelist',$param);
    113135                $db->disconnect();
    114136        };
     
    172194        google.charts.setOnLoadCallback(function(){doChart("")});
    173195    </script>
     196    <script type="text/javascript">
     197        function send_query_month(){
     198            var init_selected=$("#init_date_search>option:selected").val();
     199            var window_selected=$("#date_window_search>option:selected").val();
     200            window.location.href=window.location.pathname+"?init="+init_selected+"&window="+window_selected;
     201        }
     202        function reload_without_params(){
     203            window.location.href=window.location.pathname;
     204        }
     205        function make_month_window(){
     206            $("#date_window_search").empty()
     207            var ysel=Number($("#init_date_search>option:selected").val().substr(0,4))
     208            var msel=Number($("#init_date_search>option:selected").val().substr(4))
     209            var date=new Date()
     210            var y = date.getFullYear()
     211            var m = date.getMonth()+2
     212            var num = 0
     213            if (ysel == y){
     214                num = Math.abs(m - msel)
     215            }else{
     216                num = 12 - msel + m
     217            }
     218            for (var i=1;i<=num;i++){
     219                $("#date_window_search").append("<option value=\""+i+"\" name=\""+i+"\">"+i+"</option>");
     220            }
     221            $("#query_box>button").unbind("click");
     222            $("#query_box>button").text("Show");
     223            $("#query_box>button")[0].disabled = false;
     224            $("#query_box>button").on("click",send_query_month);
     225        }
     226        function make_query_box(){
     227            var monthNames = ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic" ];
     228            var date = new Date();
     229            var m = date.getMonth();
     230            var y = date.getFullYear();
     231            $("#query_box").append("<span>Custom date:");
     232            $("#query_box").append("Init date<span><select id=\"init_date_search\" name=\"init_date\"><option value=\"\" name=\"\"></option></select></span>");
     233            $("#query_box").append("Month window<span><select id=\"date_window_search\" name=\"date_window\"></select></span>");
     234            for (var i=0; i<12; i++){
     235                var date2 = new Date(y,m,1)
     236                var strval=date2.getFullYear().toString()+(date2.getMonth()+1).toString();
     237                var showval=monthNames[m]+"/"+date2.getFullYear().toString()
     238                $("#init_date_search").append("<option value=\""+strval+"\" name=\""+strval+"\">"+showval+"</option>");
     239                m--
     240                if (m < 0){
     241                    m=11
     242                    y--
     243                }
     244            }
     245            $("#init_date_search").on("change",make_month_window);
     246            if (window.location.search != ""){
     247                $("#query_box").append("<button>Back to normal mode</button>");
     248                $("#query_box>button").on("click",reload_without_params);
     249            }else{
     250                $("#query_box").append("<button disabled>Show range</button>");
     251            }
     252        }
     253        $(document).ready(make_query_box);
     254    </script>
    174255    <link href="ui/jquery-ui.css" rel="stylesheet">
    175256    <link href="graph.css" rel="stylesheet">
     
    178259  </head>
    179260  <body>
    180   <div id="header"><span class="title">Lliurex-Analytics <a class="go_to_other" href="ShowExtendedStats">[Extended stats]</a></span><div id="stats_box"></div></div>
     261  <div id="header"><div id="query_box"></div><span class="title">Lliurex-Analytics <a class="go_to_other" href="ShowExtendedStats">[Extended stats]</a></span><div id="stats_box"></div></div>
    181262  <div id="accordion"></div>
    182263  </body>
     
    198279    <script type="text/javascript" src="jquery.min.js"></script>
    199280    <script type="text/javascript" src="graph_min.js"></script>
    200 
    201281    <script type="text/javascript">
    202282        google.charts.load("current", {packages: ["corechart"],"language":"es"});
    203283        google.charts.setOnLoadCallback(function(){doChart("whitelist")});
     284    </script>
     285    <script type="text/javascript">
     286        function send_query_month(){
     287            var init_selected=$("#init_date_search>option:selected").val();
     288            var window_selected=$("#date_window_search>option:selected").val();
     289            window.location.href=window.location.pathname+"?init="+init_selected+"&window="+window_selected;
     290        }
     291        function reload_without_params(){
     292            window.location.href=window.location.pathname;
     293        }
     294        function make_month_window(){
     295            $("#date_window_search").empty()
     296            var ysel=Number($("#init_date_search>option:selected").val().substr(0,4))
     297            var msel=Number($("#init_date_search>option:selected").val().substr(4))
     298            var date=new Date()
     299            var y = date.getFullYear()
     300            var m = date.getMonth()+2
     301            var num = 0
     302            if (ysel == y){
     303                num = Math.abs(m - msel)
     304            }else{
     305                num = 12 - msel + m
     306            }
     307            for (var i=1;i<=num;i++){
     308                $("#date_window_search").append("<option value=\""+i+"\" name=\""+i+"\">"+i+"</option>");
     309            }
     310            $("#query_box>button").unbind("click");
     311            $("#query_box>button").text("Show");
     312            $("#query_box>button")[0].disabled = false;
     313            $("#query_box>button").on("click",send_query_month);
     314        }
     315        function make_query_box(){
     316            var monthNames = ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic" ];
     317            var date = new Date();
     318            var m = date.getMonth();
     319            var y = date.getFullYear();
     320            $("#query_box").append("<span>Custom date:");
     321            $("#query_box").append("Init date<span><select id=\"init_date_search\" name=\"init_date\"><option value=\"\" name=\"\"></option></select></span>");
     322            $("#query_box").append("Month window<span><select id=\"date_window_search\" name=\"date_window\"></select></span>");
     323            for (var i=0; i<12; i++){
     324                var date2 = new Date(y,m,1)
     325                var strval=date2.getFullYear().toString()+(date2.getMonth()+1).toString();
     326                var showval=monthNames[m]+"/"+date2.getFullYear().toString()
     327                $("#init_date_search").append("<option value=\""+strval+"\" name=\""+strval+"\">"+showval+"</option>");
     328                m--
     329                if (m < 0){
     330                    m=11
     331                    y--
     332                }
     333            }
     334            $("#init_date_search").on("change",make_month_window);
     335            if (window.location.search != ""){
     336                $("#query_box").append("<button>Back to normal mode</button>");
     337                $("#query_box>button").on("click",reload_without_params);
     338            }else{
     339                $("#query_box").append("<button disabled>Show range</button>");
     340            }
     341        }
     342        $(document).ready(make_query_box);
    204343    </script>
    205344    <link href="ui/jquery-ui.css" rel="stylesheet">
     
    208347  </head>
    209348  <body>
    210   <div id="header"><span class="title">Lliurex-Analytics <a class="go_to_other" href="ShowExtendedStats">[Extended stats]</a></span><div id="stats_box"></div></div>
     349  <div id="header"><div id="query_box"></div><span class="title">Lliurex-Analytics <a class="go_to_other" href="ShowExtendedStats">[Extended stats]</a></span><div id="stats_box"></div></div>
    211350  <div id="accordion"></div>
    212351  </body>
  • lliurex-analytics-server/trunk/fuentes/lliurex-analytics-server/usr/lib/analytics-server/analytics/graph.js

    r7577 r7820  
    10591059    return;
    10601060}
     1061function param_to_obj(param){
     1062    if (param.substr(0,1) == '?'){
     1063        param = param.substr(1)
     1064    }
     1065    if (param == ''){
     1066        return 'Undefined'
     1067    }
     1068    var items = {}
     1069    param.split("&").forEach(function(part){
     1070        var i = part.split("=");
     1071        items[i[0]] = decodeURIComponent(i[1]);
     1072    });
     1073    return items;
     1074}
    10611075function doChart(typechart=""){
     1076    var parameter=window.location.search.substr(1);
     1077    var tables_per_flavour=3;
     1078    if (parameter != ''){
     1079        parameter='?'+parameter;
     1080        params=param_to_obj(parameter)
     1081        if (!(params.hasOwnProperty('init') && params.hasOwnProperty('window'))){
     1082            parameter = ''
     1083        }else{
     1084            tables_per_flavour=1;
     1085        }
     1086    }
    10621087    end_load_time=get_time();
    1063     var datos1= new google.visualization.DataTable();
    1064     datos1.addColumn('string','App');
    1065     datos1.addColumn('number','Count');
    1066 
    1067     var datos2= new google.visualization.DataTable();
    1068     datos2.addColumn('string','App');
    1069     datos2.addColumn('number','Count');
    1070 
    1071     var datos3= new google.visualization.DataTable();
    1072     datos3.addColumn('string','App');
    1073     datos3.addColumn('number','Count');
    1074 
    10751088    start_get_time=get_time();
    10761089
    10771090    //Gets Data from DB
    10781091    $('#accordion').append('<div id="loading"></div>');
    1079     console.log(typechart)
    10801092    if (typechart == ''){
    1081         url="./GetStats"
     1093        url="./GetStats"+parameter
    10821094        limit = 10
    10831095    }else{
    1084         url="./GetLliurexStats"
     1096        url="./GetLliurexStats"+parameter
    10851097        limit = 1000
    10861098    }
     
    10961108            }
    10971109        }
    1098         max_graph=count*3;
     1110        max_graph=count*tables_per_flavour;
    10991111        obj=[];
     1112        var init_range;
     1113        var end_range;
     1114        for (distro in json){
     1115                if (distro == 'debug_init_range'){
     1116                    init_range=json[distro];
     1117                }
     1118                if (distro == 'debug_end_range'){
     1119                    end_range=json[distro];
     1120                }
     1121                if (distro == 'debug_query_time'){
     1122                    query_time=json[distro];
     1123                }
     1124                if (distro == 'debug_keep_alive'){
     1125                    keep_alive=json[distro];
     1126                }
     1127                continue;
     1128        }
    11001129        for (distro in json){
    11011130            if (distro.startsWith('debug')){
    1102                 if (distro == 'debug_query_time'){
    1103                     query_time=json[distro];
    1104                 }
    1105                 if (distro == 'debug_keep_alive'){
    1106                     keep_alive=json[distro];
    1107                 }
    11081131                continue;
    11091132            }
    11101133            for (sabor in json[distro]){
    1111                 titles=['Top apps este mes','Top apps ultimo mes','Top apps penultimo mes'];
     1134                if (tables_per_flavour == 1){
     1135                    titles=['Top apps from '+init_range+' until '+end_range]
     1136                }else{
     1137                    titles=['Top apps este mes','Top apps ultimo mes','Top apps penultimo mes'];
     1138                }
    11121139                divname='chart_'+distro+'_'+sabor;
    11131140                $('#accordion').append('<h3>Distro '+distro+'('+sabor+')</h3>');
    11141141                $('#accordion').append('<div class="'+divname+'"></h3>');
    1115                 for (i=0; i<3; i++){
     1142                for (i=0; i<tables_per_flavour; i++){
    11161143                    $('div.'+divname).append('<div id="'+divname+i+'"></div>');
    11171144                    k=0;
  • lliurex-analytics-server/trunk/fuentes/lliurex-analytics-server/usr/lib/analytics-server/analytics/graph_min.js

    r7577 r7820  
    7070d+")");f[m].releases.title="Use per month for application "+d;f[m].flavours={};f[m].flavours.graph=build_data_per_month_flavours(b[e][g].app_use,"Application use by flavour per month ("+d+")");f[m].flavours.title="Use per month for application "+d}e.startsWith("debug")&&("debug_query_time"==e&&(query_time=b[e]),"debug_keep_alive"==e&&(keep_alive=b[e]))}for(var l in f)if(f[l].title){$("#accordion").append('<h3 class="'+l+'">'+f[l].title+'</h3><div id="'+l+'"></div>');for(var n in f[l])"title"!=n&&
    7171f[l][n].graph&&($("#"+l).append("<div id="+l+"_"+n+"></div>"),b=get_sizes(l),f[l][n].graph.options.width=b.width,f[l][n].graph.options.height=b.height,(new google.visualization.LineChart(document.getElementById(l+"_"+n))).draw(f[l][n].graph.data,f[l][n].graph.options))}$("#loading").remove();$("#accordion").accordion({active:!1,collapsible:!0,heightStyle:"content",autoHeight:!1});null!=d&&$(".app_use").click();end_graph_time=get_time();print_stats(end_graph_time,query_time)},async:!0})}
    72 function doChart(g){g=void 0===g?"":g;end_load_time=get_time();var f=new google.visualization.DataTable;f.addColumn("string","App");f.addColumn("number","Count");f=new google.visualization.DataTable;f.addColumn("string","App");f.addColumn("number","Count");f=new google.visualization.DataTable;f.addColumn("string","App");f.addColumn("number","Count");start_get_time=get_time();$("#accordion").append('<div id="loading"></div>');console.log(g);""==g?(url="./GetStats",limit=10):(url="./GetLliurexStats",
    73 limit=1E3);$.getJSON(url,function(b){start_graph_time=end_get_time=get_time();count=0;for(key in b)if(!key.startsWith("debug"))for(key2 in b[key])count++;max_graph=3*count;obj=[];for(distro in b)if(distro.startsWith("debug"))"debug_query_time"==distro&&(query_time=b[distro]),"debug_keep_alive"==distro&&(keep_alive=b[distro]);else for(sabor in b[distro])for(titles=["Top apps este mes","Top apps ultimo mes","Top apps penultimo mes"],divname="chart_"+distro+"_"+sabor,$("#accordion").append("<h3>Distro "+
    74 distro+"("+sabor+")</h3>"),$("#accordion").append('<div class="'+divname+'"></h3>'),i=0;3>i;i++){$("div."+divname).append('<div id="'+divname+i+'"></div>');k=0;var d=new google.visualization.DataTable;d.addColumn("string","App");d.addColumn("number","Count");for($.each(b[distro][sabor][i][0],function(b,e){d.addRow([b,parseInt(e)]);k++});10>k;)d.addRow(["",0]),k++;obj.push(d);titles[i]=titles[i]+" (Total clients: "+b[distro][sabor][i][1].nclients+")";drawChart(obj[obj.length-1],titles[i],divname+i,
    75 k)}end_graph_time=get_time();print_stats(end_graph_time,query_time)})}num_ready=0;function ready_charts(){num_ready++;num_ready==max_graph&&($("#accordion>#loading").remove(),$("#accordion").accordion({active:!1,collapsible:!0,heightStyle:"content",autoHeight:!1}))}
     72function param_to_obj(g){"?"==g.substr(0,1)&&(g=g.substr(1));if(""==g)return"Undefined";var f={};g.split("&").forEach(function(b){b=b.split("=");f[b[0]]=decodeURIComponent(b[1])});return f}
     73function doChart(g){g=void 0===g?"":g;var f=window.location.search.substr(1),b=3;""!=f&&(f="?"+f,params=param_to_obj(f),params.hasOwnProperty("init")&&params.hasOwnProperty("window")?b=1:f="");end_load_time=get_time();start_get_time=get_time();$("#accordion").append('<div id="loading"></div>');""==g?(url="./GetStats"+f,limit=10):(url="./GetLliurexStats"+f,limit=1E3);$.getJSON(url,function(d){start_graph_time=end_get_time=get_time();count=0;for(key in d)if(!key.startsWith("debug"))for(key2 in d[key])count++;
     74max_graph=count*b;obj=[];var c,e;for(distro in d)"debug_init_range"==distro&&(c=d[distro]),"debug_end_range"==distro&&(e=d[distro]),"debug_query_time"==distro&&(query_time=d[distro]),"debug_keep_alive"==distro&&(keep_alive=d[distro]);for(distro in d)if(!distro.startsWith("debug"))for(sabor in d[distro])for(titles=1==b?["Top apps from "+c+" until "+e]:["Top apps este mes","Top apps ultimo mes","Top apps penultimo mes"],divname="chart_"+distro+"_"+sabor,$("#accordion").append("<h3>Distro "+distro+"("+
     75sabor+")</h3>"),$("#accordion").append('<div class="'+divname+'"></h3>'),i=0;i<b;i++){$("div."+divname).append('<div id="'+divname+i+'"></div>');k=0;var a=new google.visualization.DataTable;a.addColumn("string","App");a.addColumn("number","Count");for($.each(d[distro][sabor][i][0],function(b,c){a.addRow([b,parseInt(c)]);k++});10>k;)a.addRow(["",0]),k++;obj.push(a);titles[i]=titles[i]+" (Total clients: "+d[distro][sabor][i][1].nclients+")";drawChart(obj[obj.length-1],titles[i],divname+i,k)}end_graph_time=
     76get_time();print_stats(end_graph_time,query_time)})}num_ready=0;function ready_charts(){num_ready++;num_ready==max_graph&&($("#accordion>#loading").remove(),$("#accordion").accordion({active:!1,collapsible:!0,heightStyle:"content",autoHeight:!1}))}
    7677function print_stats(g,f){g=void 0===g?0:g;f=void 0===f?0:f;$("#stats_box").append('<span class="stats">Load time: '+((end_load_time-start_load_time)/1E3).toString()+" sec</span>");$("#stats_box").append('<span class="stats">Get time: '+parseFloat((end_get_time-start_get_time)/1E3-f).toFixed(3).toString()+" sec</span>");$("#stats_box").append('<span class="stats">Graph time: '+((g-start_graph_time)/1E3).toString()+" sec</span>");$("#stats_box").append('<span class="stats">Query time: '+parseFloat(f).toFixed(3).toString()+
    7778" sec</span>");$("#stats_box").append('<span class="stats">Updated: '+keep_alive.toString()+"</span>")}function get_time(){return Date.now?Date.now():(new Date).getTime()}var start_graph_time=0,end_graph_time=0,start_load_time=get_time(),end_load_time=0,start_get_time=0,end_get_time=0,query_time="",keep_alive="";
Note: See TracChangeset for help on using the changeset viewer.