Changeset 5560


Ignore:
Timestamp:
Jul 19, 2017, 12:05:17 PM (22 months ago)
Author:
mabarracus
Message:

Complete code rewrite
New database model
Improved performance & optimization
Extended information about clients
Fixed older bugs
New testing framework
Fix postinst exit code

Location:
lliurex-analytics-server/trunk/fuentes
Files:
10 added
2 deleted
9 edited

Legend:

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

    r5136 r5560  
     1lliurex-analytics-server (0.2.0) xenial; urgency=medium
     2
     3  * Complete code rewrite
     4  * New database model
     5  * Improved performance & optimization
     6  * Extended information about clients
     7  * Fixed older bugs
     8  * New testing framework
     9
    110lliurex-analytics-server (0.1.7-3) xenial; urgency=medium
    211
  • lliurex-analytics-server/trunk/fuentes/debian/control

    r3378 r5560  
    33Priority: extra
    44Maintainer: M.Angel Juan <m.angel.juan@gmail.com>
    5 Build-Depends: debhelper (>= 5),quilt
     5Build-Depends: debhelper (>= 5),quilt,dh-systemd
    66
    77Package: lliurex-analytics-server
     
    99Depends: ${shlibs:Depends}, ${misc:Depends},
    1010        debconf (>= 0.5) | debconf-2.0, po-debconf,
    11         ucf, python3, python-daemon, apache2, libapache2-mod-php7.0, php7.0-mysql, mysql-server, dialog, perl
     11        ucf, python, python-daemon, apache2, libapache2-mod-php7.0, php7.0-mysql, mysql-server, dialog, perl, python-mysqldb, python-psutil
    1212Recommends:
    1313Suggests:
  • lliurex-analytics-server/trunk/fuentes/debian/postinst

    r5136 r5560  
    149149
    150150# UPDATE DB FROM OLDER VERSIONS
     151    is_version_1=0
     152    is_version_1_4=0
     153
    151154    tables=$(mysql $rootuser $rootpass -s -N -Danalytics -e "show tables" 2>/dev/null || true)
    152155    if [ -n "$tables" ]; then
    153         tables=$(echo $tables|grep historico_clients||true)
    154         dump_old_data=yes
    155     else
    156         dump_old_data=no
    157     fi
    158     keys=$(mysqldump $rootuser $rootpass analytics 2>/dev/null|egrep '^[[:space:]]*KEY'|wc -l)
    159     dumpfile="/usr/lib/analytics-server/analytics-0_1_3-to-0_1_4.sql"
     156        tables=$(echo $tables|grep historico_clients || true)
     157        if [ -n "$tables" ]; then
     158            is_version_1_4=1
     159        else
     160            is_version_1=1
     161        fi
     162    fi
     163    if [ "$is_version_1" = "1" ]; then
     164        echo "Updating database from version 1"
     165        mysql $rootuser $rootpass < /usr/lib/analytics-server/migrate_from_1.sql || true
     166        create_db="no"
     167    fi
     168    if [ "$is_version_1_4" = "1" ]; then
     169        echo "Updating database from version 1.4"
     170        mysql $rootuser $rootpass < /usr/lib/analytics-server/migrate_from_1_4.sql || true
     171        create_db="no"
     172    fi
     173
     174    dumpfile="/usr/lib/analytics-server/analytics2.sql"
     175
     176    #keys=$(mysqldump $rootuser $rootpass analytics 2>/dev/null|egrep '^[[:space:]]*KEY'|wc -l)
     177    #dumpfile="/usr/lib/analytics-server/analytics-0_1_3-to-0_1_4.sql"
    160178
    161179    #UPDATE FROM 0.1.3 to 0.1.4
    162180
    163     older_version="$2"
    164     target_update="0.1.4"
    165 
    166     need_update_to_0_1_4=no
    167     dpkg --compare-versions "$older_version" lt "$target_update" && need_update_to_0_1_4=yes
    168     if [ -z "$tables" -o $keys -ne 12 ]; then
    169         need_update_to_0_1_4=yes
    170         echo "failed database test for table historico_clients or keys"
    171     fi
    172     if [ "x$need_update_to_0_1_4" = "xyes" ]; then
    173         echo Updating to database version upper than 0.1.4
    174         if [ "x$dump_old_data" = "xyes" ]; then
    175             mysqldump $rootuser $rootpass --no-create-info analytics > /tmp/__analytics_tmp__ 2>/dev/null
    176         fi
    177         mysql $rootuser $rootpass -s -N -e "drop database if exists analytics"
    178         mysql $rootuser $rootpass < $dumpfile
    179         mysql $rootuser $rootpass analytics < /tmp/__analytics_tmp__
    180     else
    181         echo "Seems that database is newer than 0.1.4, skipping database migration"
    182     fi
     181    #older_version="$2"
     182    #target_update="0.1.4"
     183
     184    #need_update_to_0_1_4=no
     185    #dpkg --compare-versions "$older_version" lt "$target_update" && need_update_to_0_1_4=yes
     186    #if [ -z "$tables" -o $keys -ne 12 ]; then
     187    #    need_update_to_0_1_4=yes
     188    #    echo "failed database test for table historico_clients or keys"
     189    #fi
     190    #if [ "x$need_update_to_0_1_4" = "xyes" ]; then
     191    #    echo Updating to database version upper than 0.1.4
     192    #    if [ "x$dump_old_data" = "xyes" ]; then
     193    #        mysqldump $rootuser $rootpass --no-create-info analytics > /tmp/__analytics_tmp__ 2>/dev/null
     194    #    fi
     195    #    mysql $rootuser $rootpass -s -N -e "drop database if exists analytics"
     196    #    mysql $rootuser $rootpass < $dumpfile
     197    #    mysql $rootuser $rootpass analytics < /tmp/__analytics_tmp__
     198    #else
     199    #    echo "Seems that database is newer than 0.1.4, skipping database migration"
     200    #fi
    183201
    184202
  • lliurex-analytics-server/trunk/fuentes/debian/rules

    r3366 r5560  
    33#
    44%:
    5         dh $@
     5        dh $@ --with systemd
  • lliurex-analytics-server/trunk/fuentes/lliurex-analytics-server/usr/lib/analytics-server/analytics/config.php

    r4990 r5560  
    1414    {
    1515      "name": "15",
    16       "like": "LIKE \'15.05%\'",
     16      "like": "15",
    1717      "sabor": [
    1818        {
    1919          "name": "desktop",
    20           "like": "NOT LIKE \'%server%\' and sabor NOT LIKE \'%client%\' and sabor LIKE \'%desktop%\'"
     20          "like": "desktop"
    2121        },
    2222        {
    2323          "name": "server",
    24           "like": "LIKE \'%server%\'"
     24          "like": "server"
    2525        },
    2626        {
    2727          "name": "client",
    28           "like": "LIKE \'%client%\'"
     28          "like": "client"
    2929        }
    3030      ]
     
    3232    {
    3333      "name": "16",
    34       "like": "LIKE \'16%\'",
     34      "like": "16",
    3535      "sabor": [
    3636        {
    3737          "name": "desktop",
    38           "like": "LIKE \'%desktop%\'"
     38          "like": "desktop"
    3939        },
    4040        {
    4141          "name": "server",
    42           "like": "LIKE \'%server%\'"
     42          "like": "server"
    4343        },
    4444        {
    4545          "name": "client",
    46           "like": "LIKE \'%client%\'"
     46          "like": "client"
     47        }
     48      ]
     49    },
     50    {
     51      "name": "other",
     52      "like": "",
     53      "sabor": [
     54        {
     55            "name": "other",
     56            "like": "other"
    4757        }
    4858      ]
     
    5161}
    5262';
     63
    5364function debug_json(){
    5465global $distros;
  • lliurex-analytics-server/trunk/fuentes/lliurex-analytics-server/usr/lib/analytics-server/analytics/db.php

    r5128 r5560  
    1919                $this->alias=array();
    2020                $this->info_distro=json_decode($distros,true);
     21                if ($this->info_distro == NULL){
     22                    die('Error: Wrong json in Config.php');
     23                }
    2124                $this->init_dates();
     25                $this->times=0;
    2226        }
    2327        function init_dates(){
    2428                $this->dates=array();
    2529                $this->dates['today']=date("Y-m-d");
    26                 $this->dates['tomorrow']=date("Y-m-d",strtotime('tomorrow'));
    27                 $this->dates['first_this_month']=date("Y-m-").'01';
    28                 $this->dates['last_one_month_ago']=date("Y-m-d",strtotime($this->dates['first_this_month']." -1 days"));
    29                 $this->dates['first_one_month_ago']=date("Y-m-d",strtotime($this->dates['first_this_month']." -1 months"));
    30                 $this->dates['last_two_month_ago']=date("Y-m-d",strtotime($this->dates['first_one_month_ago']." -1 days"));
    31                 $this->dates['first_two_month_ago']=date("Y-m-d",strtotime($this->dates['first_one_month_ago']." -1 months"));
     30                $this->dates['first_current']=date("Y-m-").'01';
     31                $this->dates['last_old']=date("Y-m-d",strtotime($this->dates['first_current']." -1 days"));
     32                $this->dates['first_old']=date("Y-m-",strtotime($this->dates['today']. "-1 months")).'01';
     33                $this->dates['last_very_old']=date("Y-m-d",strtotime($this->dates['first_old']." -1 days"));
     34                $this->dates['first_very_old']=date("Y-m-",strtotime($this->dates['first_old']." -1 days")).'01';
     35                $this->dates['date_current']="(date between '".$this->dates['first_current']."' and '".$this->dates['today']."')";
     36                $this->dates['date_old']="(date between '".$this->dates['first_old']."' and '".$this->dates['last_old']."')";
     37                $this->dates['date_very_old']="(date between '".$this->dates['first_very_old']."' and '".$this->dates['last_very_old']."')";
     38                $this->dates['date_range_last_three_months']="(date between '".$this->dates['first_very_old']."' and '".$this->dates['today']."')";
    3239
    3340        }
     
    3542                $this->dbconn=new mysqli($this->dbhost, $this->dbuser , $this->dbpass, $this->dbname);
    3643                if ($this->dbconn->connect_error) {
    37                 die('Connect Error:'. $this->dbconn->connect_error);
     44                    die('Connect Error:'. $this->dbconn->connect_error);
    3845                }
    3946        }
     
    4552                $this->dbconn->begin_transaction(MYSQLI_TRANS_START_READ_WRITE);
    4653        }
    47         function insert_data($user,$date,$version,$sabor){
    48                 $sql = "INSERT INTO clients (user,lastlogin,version,sabor) VALUES (?,?,?,?) ON DUPLICATE KEY UPDATE lastlogin = VALUES(lastlogin)";
    49                 $query=$this->dbconn->prepare($sql);
    50                 if (! $query)
    51                         throw new Exception($this->dbconn->error);
    52                 $query->bind_param("ssss",$user,$date,$version,$sabor);
    53                 $query->execute();
    54                 if ( $query->affected_rows < 0 ){
    55                         throw new Exception($this->dbconn->error);
    56                 }else{
    57                         $id=$this->dbconn->insert_id;
    58                         $query->close();
    59                         return $id;
    60                 }
    61                 return false;
    62         }
    63         function update_data($data='',$version='',$sabor=''){
    64                 $sql="INSERT INTO packages (app,count,version,sabor) VALUES (?,?,?,?) ON DUPLICATE KEY UPDATE count = count + ?";
    65                 $query=$this->dbconn->prepare($sql);
    66                 $query->bind_param("sssss",$k,$v,$version,$sabor,$v);
    67                 if (! $query)
    68                         throw new Exception($this->dbconn->error);
    69                 foreach ($data as $k => $v){
    70                         $noerr=$query->execute();
    71                         if (! $noerr){
    72                                 throw new Exception($this->dbconn->error);
    73                         }
    74                 }
    75                 $query->close();
    76         }
     54
     55        function send_data($user,$version,$sabor,$apps,$date=''){
     56            if ($date == ''){
     57                $sql="INSERT INTO tmp_clients(user,version,sabor,status) values ('$user','$version','$sabor',0)";
     58            }else{
     59                $sql="INSERT INTO tmp_clients(user,version,sabor,status,date) values ('$user','$version','$sabor',0,'$date')";
     60            }
     61            $retry=1;
     62            $done=false;
     63            $cli_id=false;
     64            while (! $done and $retry < 4){
     65                $res=$this->dbconn->query($sql);
     66                if ($res){
     67                    $cli_id=$this->dbconn->insert_id;
     68                    $done=true;
     69                }else{
     70                    $retry+=1;
     71                    sleep($retry);
     72                }
     73            }
     74            if ($retry == 4 or $cli_id == false)
     75                    throw new Exception('Error sending client data: '.$this->dbconn->error);
     76            $err_apps=false;
     77            $err_exception=false;
     78            if (count($apps) != 0){
     79                if ($date == ''){
     80                    $sql="insert into tmp_packages(client,app,value) values";
     81                }else{
     82                    $sql="insert into tmp_packages(client,app,value,date) values";
     83                }
     84                $values=array();
     85                foreach ($apps as $app => $value){
     86                    if (trim($app) == '' or trim($value) == ''){
     87                        $err_apps=true;
     88                        $err_exception=new Exception('Wrong application values');
     89                        continue;
     90                    }
     91                    if ($date == ''){
     92                        $values[]="($cli_id,'$app',$value)";
     93                    }else{
     94                        $values[]="($cli_id,'$app',$value,'$date')";
     95                    }
     96                }
     97                if (count($values) > 0){
     98                    $sql.=implode(',',$values);
     99                    $done=false;
     100                    $retry=1;
     101                    while (! $done and $retry < 4){
     102                        $res=$this->dbconn->query($sql);
     103                        if ($res){
     104                            $done=true;
     105                        }else{
     106                            $retry += 1;
     107                            sleep($retry);
     108                        }
     109                    }
     110                    if ($retry == 4 or ! $done){
     111                        $err_apps=true;
     112                        $err_exception=new Exception('Error sending client app data: '.$this->dbconn->error.' QUERY='.$sql);
     113                    }
     114                }
     115            }
     116            //End operations
     117            $sql = "Update tmp_clients set status=1 where id = $cli_id and status=0";
     118            $retry=1;
     119            $done=false;
     120            while (! $done and $retry < 4){
     121                $res=$this->dbconn->query($sql);
     122                if ($res){
     123                    $done=true;
     124                }else{
     125                    $retry+=1;
     126                    sleep($retry);
     127                }
     128            }
     129            if ($retry == 4 or $cli_id == false){
     130                throw new Exception('Error commiting client data: '.$this->dbconn->error);
     131            }
     132            if ($err_apps){
     133                throw $err_exception;
     134            }
     135        }
     136
    77137        private function load_alias(){
    78                 $sql="SELECT name,alias from alias";
     138                $sql="SELECT name,alias from Alias";
    79139                $result=$this->dbconn->query($sql);
    80140                while($row=$result->fetch_array(MYSQLI_ASSOC)){
     
    82142                }
    83143        }
    84         function rotate(){
    85                 $sql="select max(fecha) from historico;";
    86                 $thismonth=intval(date("Ym"));
    87                 $lastmonth=$thismonth;
    88                 if ($result=$this->dbconn->query($sql)){
    89                         while($row=$result->fetch_row()){
    90                                 if(empty($row[0])){
    91                                         $sql="insert into historico(app,count,fecha,version,sabor) values (?,?,?,?,?)";
    92                                         $query=$this->dbconn->prepare($sql);
    93                                         $name='dummy'; $value=0; $today=date("Y-m-d");
    94                                         $query->bind_param('sdsss',$name,$value,$today,$name,$name);
    95                                         $query->execute();
    96                                         $query->close();
    97                                 }else{
    98                                         $lastmonth=intval(explode('-',$row[0])[0].explode('-',$row[0])[1]);
    99                                 }
    100                         }
    101                 }
    102                 if ($thismonth > $lastmonth){
    103                         $dummy_new_date=$this->dates['first_this_month'];
    104                         $sql="update historico set fecha ='$dummy_new_date' where app = 'dummy'";
    105                         $this->dbconn->query($sql);
    106                         $date_to_history=$this->dates['last_one_month_ago'];
    107                         $sql="insert into historico(app,count,fecha,version,sabor) select app,count,'$date_to_history',version,sabor from packages";
    108                         $this->dbconn->query($sql);
    109                         $sql="truncate packages;";
    110                         $this->dbconn->query($sql);
    111                         $delete_before=$this->dates['first_two_month_ago'];
    112                         $sql="delete from historico where app != 'dummy' and fecha < '$delete_before'";
    113                         $this->dbconn->query($sql);
    114 
    115                         $sql=$this->prepare_rotate_clients();
    116                         foreach ($this->info_distro['distros'] as $distro) {
    117                                 $dname=$distro['name'];
    118                                 foreach ($distro['sabor'] as $sabor) {
    119                                         $sname=$sabor['name'];
    120                                         foreach (array('insert','delete') as $op) {
    121                                                 $this->dbconn->query($sql[$dname][$sname][$op]);
    122                                         }
    123                                 }
    124                                 foreach (array('insert','delete') as $op) {
    125                                         $this->dbconn->query($sql[$dname]['others'][$op]);
    126                                 }
    127                         }
    128                 }
    129         }
    130         function prepare_rotate_clients(){
    131                 $date_clients='BETWEEN \''.$this->dates['first_one_month_ago'].'\' and \''.$this->dates['first_this_month'].'\'';
    132                 foreach ($this->info_distro['distros'] as $distro) {
    133                         $dname=$distro['name'];
    134                         $dlike=$distro['like'];
    135                         $sql_clients[$dname]=array();
    136                         $sql_where_other_clients=array();
    137                         $version_in_history='';
    138                         if ($dname == '15')
    139                                 $version_in_history='15.05';
    140                         else
    141                                 $version_in_history='16';
    142                         $date_to_history=$this->dates['last_one_month_ago'];
    143 
    144                         foreach ($distro['sabor'] as $sabor) {
    145                                 $sname=$sabor['name'];
    146                                 $slike=$sabor['like'];
    147                                 $sql_where_other_clients[]='( sabor '.$slike.')';
    148                                 $where_select="lastlogin $date_clients and version $dlike and (sabor $slike)";
    149                                 $sql_clients[$dname][$sname]['delete']="delete from clients where $where_select ;";
    150                                 $sql_clients[$dname][$sname]['insert']="insert into historico_clients(version,sabor,fecha,nclients) (select '$version_in_history','$sname','$date_to_history',count(id) from clients where $where_select );";
    151                         }
    152                         //others
    153                         $sql_sabor_where_other_clients=implode(' or ',$sql_where_other_clients);
    154                         $where_other_clients="lastlogin $date_clients and version $dlike and not ($sql_sabor_where_other_clients)";
    155                         $sql_clients[$dname]['others']['insert']="insert into historico_clients(version,sabor,fecha,nclients) (select '$version_in_history','others','$date_to_history',count(id) from clients where  $where_other_clients);";
    156                         $sql_clients[$dname]['others']['delete']="delete from clients where $where_other_clients;";
    157                 }
    158                 return $sql_clients;
    159         }
     144        function get_extended_data($app){
     145            $today=date("Y-m-d");
     146            $min_date=date("Y-m",strtotime($today." -1 year")).'-01';
     147            $this->times=0;
     148            // CLIENTS DISTRIBUTION PER RELEASE/FLAVOUR
     149            $sql="select year(date) as year,month(date) as month,Releases_name,Flavours_name,count(*) as num_hosts from (select distinct Client_uid,date,Releases_name,Flavours_name from Client_Versions where date >= '$min_date' )t group by year,month,Releases_name,Flavours_name order by year Desc,month desc,Releases_name asc,num_hosts desc";
     150            $stime=microtime(true);
     151            $result=$this->dbconn->query($sql);
     152            if ($result){
     153                $this->times+=microtime(true)-$stime;
     154                $clients_month=[];
     155                $tmp=[];
     156                while($row=$result->fetch_array(MYSQLI_ASSOC)){
     157                    $date=$row['year'].'_'.$row['month'];
     158                    $tmp[$date][$row['Releases_name']][$row['Flavours_name']]=intval($row['num_hosts']);
     159                }
     160                foreach ($tmp as $date){
     161                    $clients_month[]=$date;
     162                }
     163            }else{
     164                $clients_month=$this->dbconn->error;
     165            }
     166            // CLIENT UPDATES
     167            $sql="select year,month,count(*) as nclients,sum(cnt)-count(*) as nclients_updated from (select Client_uid,count(Client_uid) as cnt,year(date) as year,month(date) as month from Client_Versions where date >= '$min_date' GROUP by Client_uid,year,month having count(Client_uid) >= 1 ) t group by year,month order by year desc,month desc";
     168            $sql="select year,month,count(*) as nclients,sum(cnt)-count(*) as nclients_updated,Releases_name as rel,Flavours_name as fla from (select Client_uid,count(Client_uid) as cnt,year(date) as year,month(date) as month,Releases_name,Flavours_name from Client_Versions where date >= '$min_date' GROUP by Client_uid,year,month,Releases_name,Flavours_name having count(Client_uid) >= 1 ) t group by year,month,Releases_name,Flavours_name order by year desc,month desc";
     169            $stime=microtime(true);
     170            $result=$this->dbconn->query($sql);
     171            if ($result){
     172                $this->times+=microtime(true)-$stime;
     173                $i=0;
     174                $tmp=[];
     175                while($row=$result->fetch_array(MYSQLI_ASSOC)){
     176                    $date=$row['year'].'_'.$row['month'];
     177                    $tmp[$date][$row['rel']][$row['fla']]=intval($row['nclients_updated']);
     178                }
     179                foreach($tmp as $date){
     180                    $num_updates_month[]=$date;
     181                }
     182            }else{
     183                $num_updates_month=$this->dbconn->error;
     184            }
     185            // CLIENT CHANGE RELEASE
     186            $sql="select year,month,count(*) as upgrades_en_mes from (select year,month,Client_uid as cliente_upgradeado from (select Client_uid,year(date) as year,month(date) as month from Client_Versions where date >= '$min_date' GROUP by Client_uid,Releases_name,year,month)t group by month,year,Client_uid having(count(*))>1)t group by year,month order by year desc,month desc limit 12";
     187            $stime=microtime(true);
     188            $result=$this->dbconn->query($sql);
     189            if ($result){
     190                $this->times+=microtime(true)-$stime;
     191                $change_releases=[0,0,0,0,0,0,0,0,0,0,0,0];
     192                $i=0;
     193                while($row=$result->fetch_array(MYSQLI_ASSOC)){
     194                    $change_releases[$i++]=intval($row['upgrades_en_mes']);
     195                }
     196            }else{
     197                $change_releases=$this->dbconn->error;
     198            }
     199            // CLIENT CHANGE FLAVOUR
     200            $sql="select year,month,count(*) as cambio_sabor_en_mes from (select year,month,Client_uid as cliente_upgradeado from (select Client_uid,year(date) as year,month(date) as month from Client_Versions where date >= '$min_date' GROUP by Client_uid,Flavours_name,year,month)t group by month,year,Client_uid having(count(*))>1)t group by year,month order by year desc,month desc limit 12";
     201            $stime=microtime(true);
     202            $result=$this->dbconn->query($sql);
     203            if ($result){
     204                $this->times+=microtime(true)-$stime;
     205                $i=0;
     206                $change_flavour=[0,0,0,0,0,0,0,0,0,0,0,0];
     207                while($row=$result->fetch_array(MYSQLI_ASSOC)){
     208                    $change_flavour[$i++]=intval($row['cambio_sabor_en_mes']);
     209                }
     210            }else{
     211                $change_flavour=$this->dbconn->error;
     212            }
     213           
     214            //sanitize input
     215            if ($app != NULL){
     216                $app=preg_grep('/^[a-zA-Z0-9\-_]+$/',array($app));
     217                if ($app != NULL and isset($app[0])){
     218                    $app=$this->dbconn->real_escape_string($app[0]);
     219                    $stats['apps']=[];
     220                    $stats['apps']['app']=$app;
     221                    $sql="select year(date) as year,month(date) as month,string,Releases_name as rel,Flavours_name as fla,sum(count) as count from RecvPackages where string='$app' and date >= '$min_date' group by year,month,Releases_name,Flavours_name order by year desc,month desc,sum(count) desc";
     222                    $stime=microtime(true);
     223                    $result=$this->dbconn->query($sql);
     224                    if ($result){
     225                        $this->times+=microtime(true)-$stime;
     226                        $tmp=[];
     227                        while($row=$result->fetch_array(MYSQLI_ASSOC)){
     228                            $date=$row['year'].'_'.$row['month'];
     229                            $tmp[$date][$row['rel']][$row['fla']]=intval($row['count']);
     230                        }
     231                        foreach($tmp as $date){
     232                            $app_use[]=$date;
     233                        }
     234                        $stats['apps']['app_use']=$app_use;
     235                    }else{
     236                        $app_use=$this->dbconn->error;
     237                    }
     238                }
     239            }
     240            // FINALIZATION & WRITE STRUCTURE
     241            if (isset($clients_month)){
     242                $stats['clients']['clients_per_month']=$clients_month;
     243            }
     244            if (isset($num_updates_month)){
     245                $stats['clients']['freq_updates_per_month']=$num_updates_month;
     246            }
     247            if (isset($change_releases)){
     248                $stats['clients']['change_releases']=$change_releases;
     249            }
     250            if (isset($change_flavour)){
     251                $stats['clients']['change_flavours']=$change_flavour;
     252            }
     253            $stats['debug_query_time']=strval(number_format($this->times,5));
     254            return json_encode($stats);
     255        }
     256
    160257        function get_historic_data(){
    161                 $this->rotate();
    162258                $this->load_alias();
    163                 //echo $today.' '.$first_this_month.' '.$first_one_month_ago.' '.$last_one_month_ago.' '.$first_two_month_ago.' '.$last_two_month_ago.' EOL';
    164259                $obj=[];
    165                 //4 Debugging only
    166                 //$dbg_obj=[];
    167                 $other_sql=array();
     260                $this->times=0;
    168261                foreach ($this->info_distro['distros'] as $distro){
    169262                        $dname=$distro['name'];
    170263                        $dlike=$distro['like'];
    171264                        $obj[$dname]=array();
    172                         //4 Debugging only
    173                         //$dbg_obj[$dname]=array();
    174265                        foreach ($distro['sabor'] as $sabor){
    175266                                $sname=$sabor['name'];
    176267                                $slike=$sabor['like'];
    177                                 $obj[$dname][$sname][]=$this->get_current_chart($dlike,$slike);
    178                                 $obj[$dname][$sname][]=$this->get_old_chart($dlike,$slike);
    179                                 $obj[$dname][$sname][]=$this->get_very_old_chart($dlike,$slike);
    180                                 $other_sql[]=$this->get_current_chart($dlike,$slike,'yes');
    181                                 $other_sql[]=$this->get_old_chart($dlike,$slike,'yes');
    182                                 $other_sql[]=$this->get_very_old_chart($dlike,$slike,'yes');
    183                                
    184                                 //4 Debugging only
    185                                 //$dbg_obj[$dname][$sname][]=$this->get_current_chart($dlike,$slike,'yes');
    186                                 //$dbg_obj[$dname][$sname][]=$this->get_old_chart($dlike,$slike,'yes');
    187                                 //$dbg_obj[$dname][$sname][]=$this->get_very_old_chart($dlike,$slike,'yes');
     268                                $obj[$dname][$sname][]=$this->get_chart($dlike,$slike,'current');
     269                                $obj[$dname][$sname][]=$this->get_chart($dlike,$slike,'old');
     270                                $obj[$dname][$sname][]=$this->get_chart($dlike,$slike,'very_old');
    188271                        }
    189272                }
    190                 //4 Debugging only
    191                 //file_put_contents('/tmp/graph_sql',str_replace('\\','',var_export($dbg_obj,true)));
    192                 //file_put_contents('/tmp/other_sql',str_replace('\\','',var_export($this->gen_other($other_sql),true)));
    193                 $sql_other_sentences=$this->gen_other($other_sql);
    194                 //4 Debugging only
    195                 //file_put_contents('/tmp/rotate_sql',str_replace('\\','',var_export($this->prepare_rotate_clients(),true)));
    196                
    197                 $obj['other']['other'][]=array($this->get_result_from_sql($sql_other_sentences['current']),$this->get_clients_from_sql($sql_other_sentences['current_clients']));
    198                 $obj['other']['other'][]=array($this->get_result_from_sql($sql_other_sentences['old']),$this->get_clients_from_sql($sql_other_sentences['old_clients']));
    199                 $obj['other']['other'][]=array($this->get_result_from_sql($sql_other_sentences['very_old']),$this->get_clients_from_sql($sql_other_sentences['very_old_clients']));
     273                $obj['debug_query_time']=strval(number_format($this->times,3));
    200274                return json_encode($obj);
    201275        }
    202         function gen_other($other_data){
    203             $sql=array('current' =>'','old'=>'', 'very_old'=>'', 'current_clients' => '', 'old_clients' => '', 'very_old_clients' => '');
    204 
    205             $sql['current']="select app,sum(count) as count from (select app,count from packages where (app,version,sabor) not in ( select app,version,sabor from packages where (";
    206             $sql['old']="select app,sum(count) as count,fecha from historico where";
    207             $sql['very_old']="select app,sum(count) as count,fecha from historico where";
    208             $where_current=array();
    209             $where_old=array();
    210             $where_very_old=array();
    211             foreach($other_data as $odata){
    212                 switch($odata['type']){
    213                     case 'current':
    214                         $date_current=$odata['date'];
    215                         $where_current[]=$odata['where'];
    216                     break;
    217                     case 'old':
    218                         $date_old=$odata['date'];
    219                         $where_old[]=$odata['where'];
    220                     break;
    221                     case 'very_old':
    222                         $date_very_old=$odata['date'];
    223                         $where_very_old[]=$odata['where'];
    224                     break;
    225                 }
    226             }
    227             $sql['current'].=implode(' or ',$where_current);
    228             $sql['current'].=")) UNION ALL select app,count from historico where app in ( select app from historico where ";
    229             $sql['current'].="fecha ".$date_current.  " and not (";
    230             $sql['current'].=implode(' or ',$where_current);
    231             $sql['current'].=")) and app not like 'dummy' ) tabla group by app order by count DESC LIMIT 30";
    232             $sql['old'].=' fecha '.$date_old." and not (";
    233             $sql['old'].=implode(' or ',$where_old);
    234             $sql['old'].=") group by app order by sum(count) DESC LIMIT 30";
    235             $sql['very_old'].=' fecha '.$date_very_old." and not(";
    236             $sql['very_old'].=implode(' or ',$where_very_old);
    237             $sql['very_old'].=") group by app order by sum(count) DESC LIMIT 30";
    238            
    239             $sql['current_clients'].="select coalesce(sum(suma_parcial),0) as count from (";
    240             $sql['current_clients'].="select count(id) as suma_parcial from clients where lastlogin $date_current and not ( ".implode(' or ',$where_current);
    241             $sql['current_clients'].=") UNION ALL select nclients as suma_parcial from historico_clients where fecha $date_current and not ( ".implode(' or ',$where_current);
    242             $sql['current_clients'].=") ) tabla";
    243 
    244             $sql['old_clients'].="select coalesce(sum(nclients),0) as count from historico_clients where fecha $date_old and not(";
    245             $sql['old_clients'].=implode(' or ',$where_old). ')';
    246 
    247             $sql['very_old_clients'].="select coalesce(sum(nclients),0) as count from historico_clients where fecha $date_very_old and not(";
    248             $sql['very_old_clients'].=implode(' or ',$where_very_old). ')';
    249             return $sql;
    250         }
    251         function get_current_chart($version='',$sabor='',$dumpsql='no'){
    252                 $date1=$this->dates['first_this_month'];
    253                 $date2=$this->dates['tomorrow'];
    254                 if ($version != '' and $sabor != ''){
    255                         $where="version $version and sabor $sabor";
    256                 }else{
    257                         $where='';
    258                 }
    259                 $range_dates="BETWEEN '$date1' and '$date2' ";
    260                 $sql="select app,sum(count) as count from (SELECT app,count from packages where $where UNION ALL SELECT app,count from historico where fecha $range_dates and $where) tabla group by app order by count DESC LIMIT 30";
    261                 $sql_clients = "select count(user) as count from clients where (lastlogin $range_dates) and $where";
    262                 if($dumpsql == "yes")
    263                         return array('type'=>'current','date' => "$range_dates",'where' => '('.$where.')','clients'=>"$sql_clients",'sql'=>$sql);
    264                
     276        function get_chart($version='',$sabor='',$type='current'){
     277                if ($version != ''){
     278                    $version = " and Releases_name = '$version' ";
     279                }
     280                if ($sabor != ''){
     281                    $sabor = " and Flavours_name = '$sabor' ";
     282                }
     283                $order=" order by count desc limit 10 ";
     284                $group=" group by app ";
     285               
     286                $where=$this->dates['date_'.$type]." $version $sabor ";
     287                $where_clients=$this->dates['date_'.$type]." $version $sabor ";
     288
     289                $sql="SELECT string as app,sum(count) as count from RecvPackages where $where $group $order";
     290                $sql_clients = "select count(distinct Client_uid) as count from Client_Versions where $where_clients $order";
     291
    265292                return array($this->get_result_from_sql($sql),$this->get_clients_from_sql($sql_clients));
    266293        }
    267294        function get_clients_from_sql($sql){
     295                $stime=microtime(true);
    268296                if ($result=$this->dbconn->query($sql)){
     297                        $etime=microtime(true);
     298                        $this->times+=($etime-$stime);
    269299                        while($row=$result->fetch_array(MYSQLI_ASSOC)){
    270300                                if (isset($row['count'])){
     
    274304                        return array('nclients'=>'not available');
    275305                }else{
    276                         return array('nclients'=>'Query error');
    277                 }
     306                        return array('nclients'=>$this->dbconn->error);
     307                }
     308               
    278309        }
    279310        function get_result_from_sql($sql){
     311                $stime=microtime(true);
    280312                if ($result=$this->dbconn->query($sql)){
     313                        $etime=microtime(true);
     314                        $this->times+=($etime-$stime);
    281315                        $obj2=[];
    282316                        $nobj=0;
     
    295329                        }
    296330                        return $obj2;
    297                 }
    298                 return false;
    299         }
    300         function get_old_chart($version='',$sabor='',$dumpsql='no'){
    301                 $date1=$this->dates['first_one_month_ago'];
    302                 $date2=$this->dates['last_one_month_ago'];
    303                 if ($version != '' and $sabor != ''){
    304                         $where_a="version $version and sabor $sabor";
    305331                }else{
    306                         $where_a='';
    307                 }
    308                 $range_dates="BETWEEN '$date1' and '$date2'";
    309                 $sql="SELECT app,sum(count) as count,fecha from historico where fecha $range_dates and $where_a group by app order by sum(count) DESC LIMIT 30";
    310                 $sql_clients = "select nclients as count from historico_clients where (fecha $range_dates) and $where_a";
    311                 if($dumpsql == "yes")
    312                         return array('type'=>'old','date'=> "$range_dates",'where'=>'('.$where_a.')','clients'=>"$sql_clients",'sql'=>$sql);
    313                 return array($this->get_result_from_sql($sql),$this->get_clients_from_sql($sql_clients));
    314         }
    315         function get_very_old_chart($version='',$sabor='',$dumpsql='no'){
    316                 $date1=$this->dates['first_two_month_ago'];
    317                 $date2=$this->dates['last_two_month_ago'];
    318                 if ($version != '' and $sabor != ''){
    319                         $where_a="version $version and sabor $sabor";
    320                 }else{
    321                         $where_a='';
    322                 }
    323                 $range_dates="BETWEEN '$date1' and '$date2'";
    324                 $sql="SELECT app,sum(count) as count,fecha from historico where fecha $range_dates and $where_a group by app order by sum(count) DESC LIMIT 30";
    325                 $sql_clients = "select nclients as count from historico_clients where (fecha $range_dates) and $where_a";
    326                 if($dumpsql == "yes")
    327                         return array('type'=>'very_old','date' => "$range_dates",'where' => '('.$where_a.')','clients'=>"$sql_clients",'sql'=>$sql);
    328                
    329                 return array($this->get_result_from_sql($sql),$this->get_clients_from_sql($sql_clients));
    330         }
     332                    return $this->dbconn->error;
     333                }
     334        }
     335
    331336}
    332337
  • lliurex-analytics-server/trunk/fuentes/lliurex-analytics-server/usr/lib/analytics-server/analytics/functions.php

    r747 r5560  
    33        return function($request,$response,$service){
    44                $data=json_decode($request->stats,true);
    5        
     5               
    66                $db = new DB;
    77                $db->connect();
    8                 $db->init_trans();
    98                try{
    10                         if (isset($data['vers']))
    11                             $version=$data['vers'];
    12                         else
    13                             $version='Nada';
    14                         if (isset($data['sab']))
    15                             $sabor=$data['sab'];
    16                         else
    17                             $sabor='Nada';
    18                         $id=$db->insert_data($data['uid'],date("Y-m-d H:i:s"),$version,$sabor);
    19                         $db->update_data(json_decode($data['stats'],true),$version,$sabor);
     9                        if (isset($data['vers'])){
     10                            $version=trim($data['vers']);
     11                        }else{
     12                            return 'NOK';
     13                        }
     14                        if (isset($data['sab'])){
     15                            $sabor=trim($data['sab']);
     16                        }else{
     17                            return 'NOK';
     18                        }
     19                        if (isset($data['uid'])){
     20                            $uid=trim($data['uid']);
     21                        }else{
     22                            return 'NOK';
     23                        }
     24                        if ($version == '' or $sabor == '' or $uid == ''){
     25                            return 'NOK';
     26                        }
     27                        if (isset($data['date'])){
     28                            $db->send_data($uid,$version,$sabor,json_decode($data['stats'],true),$data['date']);
     29                        }else{
     30                            $db->send_data($uid,$version,$sabor,json_decode($data['stats'],true));
     31                        }
    2032                }catch (Exception $e){
    21                         $db->dbconn->rollback();
     33                        error_log($e);
    2234                        $db->disconnect();
    2335                        return 'NOK';
    2436                }
    25                 $db->dbconn->commit();
    2637                $db->disconnect();
    2738                return 'OK';
     
    3849}
    3950
     51function call_get_extended_stats(){
     52        return function($request,$reponse,$service){
     53                $app=$request->param('app');
     54                $db = new DB;
     55                $db->connect();
     56                echo $db->get_extended_data($app);
     57                $db->disconnect();
     58        };
     59}
    4060
    4161function call_show_stats(){
     
    4363return function($request,$reponse,$service){
    4464
    45 echo "<html>
     65echo '<html>
    4666  <head>
    4767    <!--Load the AJAX API-->
    48     <script type='text/javascript' src='https://www.google.com/jsapi'></script>
    49     <script type='text/javascript' src='jquery.min.js'></script>
    50     <script type='text/javascript' src='graph.js'></script>
    51     <link href='ui/jquery-ui.css' rel='stylesheet'>
    52     <script type='text/javascript' src='ui/jquery-ui.js'></script>
     68    <!--<script type="text/javascript" src="https://www.google.com/jsapi"></script>-->
     69    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
     70    <script type="text/javascript" src="jquery.min.js"></script>
     71    <script type="text/javascript" src="graph.js"></script>
     72
     73    <script type="text/javascript">
     74        google.charts.load("current", {packages: ["corechart"],"language":"es"});
     75        google.charts.setOnLoadCallback(doChart);
     76    </script>
     77    <script type="text/javascript" src="jquery.min.js"></script>
     78    <script type="text/javascript" src="graph.js"></script>
     79    <link href="ui/jquery-ui.css" rel="stylesheet">
     80    <link href="graph.css" rel="stylesheet">
     81    <script type="text/javascript" src="ui/jquery-ui.js"></script>
    5382  </head>
    5483  <body>
    55   <div style='text-align:center; font-size:2em;'>Lliurex-Analytics</div><hr/>
    56   <div id='accordion'></div>
     84  <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>
     85  <div id="accordion"></div>
    5786  </body>
    5887</html>
    59 ";
     88';
     89
     90};
     91
     92}
     93
     94function call_show_extended_stats(){
     95
     96return function($request,$reponse,$service){
     97
     98echo '<html>
     99  <head>
     100    <!--Load the AJAX API-->
     101    <!--<script type="text/javascript" src="https://www.google.com/jsapi"></script>-->
     102    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
     103    <script type="text/javascript" src="jquery.min.js"></script>
     104    <script type="text/javascript" src="graph.js"></script>
     105
     106    <script type="text/javascript">
     107        google.charts.load("current", {packages: ["corechart"],"language":"es"});
     108        google.charts.setOnLoadCallback(doExtendedChart);
     109    </script>
     110    <script type="text/javascript" src="jquery.min.js"></script>
     111    <script type="text/javascript" src="graph.js"></script>
     112    <link href="ui/jquery-ui.css" rel="stylesheet">
     113    <link href="graph.css" rel="stylesheet">
     114    <script type="text/javascript" src="ui/jquery-ui.js"></script>
     115    <script type="text/javascript">$(document).ready(function(){function send_query(){window.location.href=window.location.pathname+"?app="+$("#query_box>input").val()};$("#query_box>input").on("keyup",function(e){if (e.keyCode == 13){send_query()}});$("#query_box>button").click(send_query)});</script>
     116  </head>
     117  <body>
     118  <div id="header"><div id="query_box"><span>Search by app:</span><input type="search" name="app_search"></input><button>Search</button></div><span class="title">Lliurex-Analytics <a class="go_to_other" href="ShowStats">[Simple stats]</a></span><div id="stats_box"></div></div>
     119  <div id="accordion"></div>
     120  </body>
     121</html>
     122';
    60123
    61124};
     
    64127
    65128
    66 
    67129?>
  • lliurex-analytics-server/trunk/fuentes/lliurex-analytics-server/usr/lib/analytics-server/analytics/graph.js

    r4854 r5560  
    1 function initChart(){
    2   // Load the Visualization API and the piechart package.
    3   google.load('visualization', '1.0', {'packages':['corechart']});
    4 
    5   // Set a callback to run when the Google Visualization API is loaded.
    6   google.setOnLoadCallback(doChart);
    7  
    8 }
    9 
    101function drawChart(datos,title,id) {
    11   var custom_width=$('#'+id).parent().width()*0.9;
    12   var custom_height=$(window).height()/3*0.75;
     2  var custom_width=$('#'+id).parent().width()*0.95;
     3  var custom_height=$(window).height()/3*0.60;
    134
    145  // Set chart options
    15   var options = {'title':title,
    16                  'width': custom_width,
    17                  'height':custom_height,
    18                  'fontSize': 10,
    19                  'hAxis': {
     6  var options = {title:title,
     7                 width: custom_width,
     8                 height:custom_height,
     9                 fontSize: 10,
     10                 hAxis: {
    2011                    viewWindow:{
    2112                        min:0
    2213                    }
    23                  }
     14                 },
     15                chartArea:{left:'10%',right:'10%'},
    2416                };
    2517
     
    3729}
    3830
    39 // Callback that creates and populates a data table,
    40 // instantiates the pie chart, passes in the data and
    41 // draws it.
     31function get_sizes(id){
     32    var custom_width=$('#'+id).parent().width()*0.90;
     33    var custom_height=$(window).height()*0.72/2;
     34    return {'width':custom_width,'height':custom_height};
     35}
     36
     37function build_data_per_month_releases(data,title){
     38    var total=[];
     39    for (i=0 ; i < 12; i++){
     40        total[i]={'15':0,'16':0,'all':0};
     41        if (! data[i]){
     42            continue;
     43        }
     44        for (rel in data[i]){
     45            if (rel == '15'){
     46                for (fla in data[i][rel]){
     47                    total[i][rel]+=data[i][rel][fla];
     48                }
     49            }
     50            if (rel == '16'){
     51                for (fla in data[i][rel]){
     52                    total[i][rel]+=data[i][rel][fla];
     53                }
     54            }
     55        }
     56        total[i]['all']=total[i]['15']+total[i]['16'];
     57    }
     58    var dates_axis=[];
     59    var d= new Date();
     60    var data_table = new google.visualization.DataTable();
     61    data_table.addColumn({type:'date',role:'domain'},'Release');
     62    data_table.addColumn('number','Total Release 15');
     63    data_table.addColumn({type:'string',role:'style'},'Style Release 15');
     64    data_table.addColumn('number','Total Release 16');
     65    data_table.addColumn({type:'string',role:'style'},'Style Release 16');
     66    data_table.addColumn('number','Total ALL Releases');
     67    data_table.addColumn({type:'string',role:'style'},'Style ALL Releases');
     68    date_values=[];
     69    for (i=1;i <= 12;i++){
     70        month=d.getMonth();
     71        year=d.getFullYear();
     72        date_to_add=new Date(year,month)
     73        dates_axis.push(date_to_add);
     74        date_values.push([date_to_add,total[i-1]['15'],'color:blue',total[i-1]['16'],'color:red',total[i-1]['all'],'color:grey'])
     75        d.setMonth(month-1);
     76    }
     77    data_table.addRows(date_values);
     78    var options= {  title: title,
     79                    curveType: 'function',
     80                    isStacked: false,
     81                    hAxis:{title:'Months',ticks:dates_axis,format:'MMM'},
     82                    vAxis:{title:'Num hosts'},
     83                    legend:{textStyle:{fontSize: 12}},
     84                    chartArea:{left:'10%',right:'10%'},
     85                    focusTarget: 'category',
     86                    colors:['blue','red','grey'],
     87                    lineWidth: 5,
     88                    };
     89    return {data:data_table,options:options}
     90}
     91function build_data_per_month_flavours(data,title){
     92    var total=[];
     93    for (i=0 ; i < 12; i++){
     94        total[i]={'server':0,'client':0,'desktop':0,'other':0,'all':0};
     95        if (! data[i]){
     96            continue;
     97        }
     98        for (rel in data[i]){
     99            for (fla in data[i][rel]){
     100                total[i][fla]+=data[i][rel][fla];
     101                total[i]['all']+=data[i][rel][fla];
     102            }
     103        }
     104    }
     105    var dates_axis=[];
     106    var d= new Date();
     107    var data_table = new google.visualization.DataTable();
     108    data_table.addColumn({type:'date',role:'domain'},'Flavour');
     109    data_table.addColumn('number','Total Server');
     110    data_table.addColumn({type:'string',role:'style'},'Style Server');
     111    data_table.addColumn('number','Total Client');
     112    data_table.addColumn({type:'string',role:'style'},'Style Client');
     113    data_table.addColumn('number','Total Desktop');
     114    data_table.addColumn({type:'string',role:'style'},'Style Desktop');
     115    data_table.addColumn('number','Total Other');
     116    data_table.addColumn({type:'string',role:'style'},'Style Other');
     117    data_table.addColumn('number','Total ALL Flavours');
     118    data_table.addColumn({type:'string',role:'style'},'Style Total ALL Flavours');
     119    date_values=[];
     120    for (i=1;i <= 12;i++){
     121        month=d.getMonth();
     122        year=d.getFullYear();
     123        date_to_add=new Date(year,month)
     124        dates_axis.push(date_to_add);
     125        date_values.push([date_to_add,total[i-1]['server'],'color:purple',total[i-1]['client'],'color:teal',total[i-1]['desktop'],'color:gold',total[i-1]['other'],'color:olive',total[i-1]['all'],'color:grey'])
     126        d.setMonth(month-1);
     127    }
     128    data_table.addRows(date_values);
     129    var options= {  title: title,
     130                    curveType: 'function',
     131                    isStacked: false,
     132                    hAxis:{title:'Months',ticks:dates_axis,format:'MMM'},
     133                    vAxis:{title:'Num hosts'},
     134                    legend:{textStyle:{fontSize: 12}},
     135                    chartArea:{left:'10%',right:'10%'},
     136                    focusTarget: 'category',
     137                    colors: ['purple','teal','gold','olive','grey'],
     138                    lineWidth: 5,
     139                    };
     140    return {data:data_table,options:options}
     141}
     142function build_data_from_array(data,title){
     143    var dates_axis=[];
     144    var d= new Date();
     145    var data_table = new google.visualization.DataTable();
     146    data_table.addColumn({type:'date',role:'domain'},'Nhosts');
     147    data_table.addColumn('number',title);
     148    date_values=[];
     149    for (i=1;i <= 12;i++){
     150        month=d.getMonth();
     151        year=d.getFullYear();
     152        date_to_add=new Date(year,month)
     153        dates_axis.push(date_to_add);
     154        date_values.push([date_to_add,data[i-1]])
     155        d.setMonth(month-1);
     156    }
     157    data_table.addRows(date_values);
     158    var options= {  title: title,
     159                    curveType: 'function',
     160                    isStacked: false,
     161                    hAxis:{title:'Months',ticks:dates_axis,format:'MMM'},
     162                    vAxis:{title:'Num hosts',minValue: 0,maxValue:'automatic',viewWindowMode:'pretty',viewWindow:{min:0,max:'auto'}},
     163                    legend:{textStyle:{fontSize: 12}},
     164                    chartArea:{left:'10%',right:'10%'},
     165                    focusTarget: 'category',
     166                    lineWidth: 5,
     167                    };
     168    return {data:data_table,options:options}
     169}
     170function doExtendedChart(){
     171    end_load_time=get_time();
     172    var parameter=window.location.search.substr(1);
     173    if (parameter != ''){
     174        parameter='?'+parameter;
     175    }
     176    var chart_data={};
     177    start_get_time=get_time();
     178    $('#accordion').append('<div id="loading"></div>');
     179    $.getJSON( "./GetExtendedStats"+parameter, function( json ) {
     180    $('#loading').remove();
     181    end_get_time=get_time();
     182    start_graph_time=end_get_time;
     183    var app=null;
     184    for (key in json){
     185        if (key == 'clients'){
     186            for (type in json[key]){
     187                switch(type){
     188                    case 'clients_per_month':
     189                        chart_data[type]={};
     190                        chart_data[type]['title']='Machines';
     191                        chart_data[type]['releases']={};
     192                        chart_data[type]['releases']['graph']=build_data_per_month_releases(json[key][type],'Number machines by release per month')
     193                        chart_data[type]['releases']['title']='Number machines by release per month';
     194                        chart_data[type]['flavours']={};
     195                        chart_data[type]['flavours']['graph']=build_data_per_month_flavours(json[key][type],'Number machines by flavour per month')
     196                        chart_data[type]['flavours']['title']='Number machines by flavour per month';
     197                        break;
     198                    case 'freq_updates_per_month':
     199                        chart_data[type]={};
     200                        chart_data[type]['title']='Updates';
     201                        chart_data[type]['releases']={};
     202                        chart_data[type]['releases']['graph']=build_data_per_month_releases(json[key][type],'Number updates by release per month')
     203                        chart_data[type]['releases']['title']='Number updates by release per month';
     204                        chart_data[type]['flavours']={};
     205                        chart_data[type]['flavours']['graph']=build_data_per_month_flavours(json[key][type],'Number updates by flavour per month')
     206                        chart_data[type]['flavours']['title']='Number updates by flavour per month';
     207                        break;
     208                    case 'change_releases':
     209                        if (! chart_data['changes']){
     210                            chart_data['changes']={};
     211                            chart_data['changes']['title']='Changes';
     212                        }
     213                        if (! chart_data['changes']['releases'])
     214                            chart_data['changes']['releases']={};
     215                        chart_data['changes']['releases']['graph']=build_data_from_array(json[key][type],'Change releases per month')
     216                        chart_data['changes']['releases']['title']='Change releases per month';
     217                        break;
     218                    case 'change_flavours':
     219                        if (! chart_data['changes']){
     220                            chart_data['changes']={};
     221                            chart_data['changes']['title']='Changes';
     222                        }
     223                        if (! chart_data['changes']['flavours'])
     224                            chart_data['changes']['flavours']={};
     225                        chart_data['changes']['flavours']['graph']=build_data_from_array(json[key][type],'Change flavours per month')
     226                        chart_data['changes']['flavours']['title']='Change flavours per month';
     227                        break;
     228                }
     229            }
     230        }
     231        if (key == 'apps'){
     232            for (type in json['apps']){
     233                switch(type){
     234                    case 'app':
     235                        app=json['apps'][type];
     236                        break;
     237                    case 'app_use':
     238                        if (json[key][type]){
     239                            chart_data[type]={};
     240                            chart_data[type]['title']='Application usage';
     241                            chart_data[type]['releases']={};
     242                            chart_data[type]['releases']['graph']=build_data_per_month_releases(json[key][type],'Application use by release per month ('+app+')');
     243                            chart_data[type]['releases']['title']='Use per month for application '+app;
     244                            chart_data[type]['flavours']={};
     245                            chart_data[type]['flavours']['graph']=build_data_per_month_flavours(json[key][type],'Application use by flavour per month ('+app+')');
     246                            chart_data[type]['flavours']['title']='Use per month for application '+app;
     247                        }
     248                        break;
     249                }
     250            }
     251        }
     252        if (key.startsWith('debug')){
     253            if (key == 'debug_query_time'){
     254                query_time=json[key];
     255            }
     256        }
     257    }
     258
     259    for (chart_type in chart_data){
     260        if (! chart_data[chart_type]['title']){
     261            continue;
     262        }
     263
     264        for (chart_variant in chart_data[chart_type]){
     265            if (chart_variant == 'title'){
     266                $('#accordion').append('<h3 class="'+chart_type+'">'+chart_data[chart_type]['title']+'</h3><div id="'+chart_type+'"></div>');
     267                continue;
     268            }
     269            if (chart_data[chart_type][chart_variant]['graph']){
     270                $('#'+chart_type).append('<div id='+chart_type+'_'+chart_variant+'></div>');
     271                var sizes=get_sizes(chart_type);
     272                chart_data[chart_type][chart_variant]['graph']['options']['width']=sizes['width'];
     273                chart_data[chart_type][chart_variant]['graph']['options']['height']=sizes['height'];
     274                var chart = new google.visualization.LineChart(document.getElementById(chart_type+'_'+chart_variant));
     275                chart.draw(chart_data[chart_type][chart_variant]['graph']['data'], chart_data[chart_type][chart_variant]['graph']['options']);
     276            }
     277        }
     278    }
     279
     280
     281    $('#accordion').accordion({active:false,collapsible:true});
     282    if (app != null){
     283        $('.app_use').click();
     284    }
     285    end_graph_time=get_time();
     286    print_stats(end_graph_time,query_time);
     287
     288    });
     289    return;
     290}
    42291function doChart(){
     292    end_load_time=get_time();
    43293    var datos1= new google.visualization.DataTable();
    44294    datos1.addColumn('string','App');
     
    53303    datos3.addColumn('number','Count');
    54304
     305    start_get_time=get_time();
     306
    55307    //Gets Data from DB
     308    $('#accordion').append('<div id="loading"></div>');
    56309    $.getJSON( "./GetStats", function( json ) {
    57         //  j=json;
     310        $('#loading').remove();
     311        end_get_time=get_time();
     312        start_graph_time=end_get_time;
    58313        count=0;
    59         for (key in json)
    60             for (key2 in json[key])
    61                 count++;
     314        for (key in json){
     315            if (! key.startsWith('debug')){
     316                for (key2 in json[key]){
     317                    count++;
     318                }
     319            }
     320        }
    62321        max_graph=count*3;
    63322        obj=[];
    64323        for (distro in json){
     324            if (distro.startsWith('debug')){
     325                if (distro == 'debug_query_time'){
     326                    query_time=json[distro];
     327                }
     328               
     329                continue;
     330            }
    65331            for (sabor in json[distro]){
    66332                titles=['Top apps este mes','Top apps ultimo mes','Top apps penultimo mes'];
     
    70336                for (i=0; i<3; i++){
    71337                    $('div.'+divname).append('<div id="'+divname+i+'"></div>');
    72                     //k=0;
     338                    k=0;
    73339                    var datos=new google.visualization.DataTable();
    74340                    datos.addColumn('string','App');
     
    77343                        //console.log( i+':'+k+'->'+key + " : " + value );
    78344                        datos.addRow([key,parseInt(value)]);
    79                         //k++;
     345                        k++;
    80346                    })
    81                     while (datos.Nf.length < 10)
    82                         datos.addRow(['',0])
     347                    while (k < 10){
     348                        datos.addRow(['',0]);
     349                        k++;
     350                    }
    83351                    obj.push(datos);
    84352                    //console.log('drawing:'+titles[i]+' into '+divname+i);
     
    88356            }
    89357        }
     358        end_graph_time=get_time();
     359        print_stats(end_graph_time,query_time);
    90360        return;
    91361    });
     
    94364function ready_charts(){
    95365    num_ready++;
    96     if (num_ready != max_graph){
    97         //console.log('not now')
    98         //console.log('ready '+num_ready);
    99     }else{
    100         //console.log('now ready');
     366    if (num_ready == max_graph){
    101367        $('#accordion').accordion({active:false,collapsible:true});
    102368    }
    103369}
    104 
    105 $(document).ready(initChart());
     370function print_stats(gr_time=0,q_time=0){
     371    $('#stats_box').append('<span class="stats">Load time: '+((end_load_time-start_load_time)/1000).toString()+' sec</span>')
     372    $('#stats_box').append('<span class="stats">Get time: '+parseFloat(((end_get_time-start_get_time)/1000)-q_time).toFixed(3).toString()+' sec</span>')
     373    $('#stats_box').append('<span class="stats">Graph time: '+((gr_time-start_graph_time)/1000).toString()+' sec</span>')
     374    $('#stats_box').append('<span class="stats">Query time: '+parseFloat(q_time).toFixed(3).toString()+' sec</span>')
     375}
     376function get_time(){
     377    return (Date.now ? Date.now() : new Date().getTime()) ;
     378}
     379var start_graph_time=0;
     380var end_graph_time=0;
     381var start_load_time=get_time();
     382var end_load_time=0;
     383var start_get_time=0;
     384var end_get_time=0;
     385var query_time='';
  • lliurex-analytics-server/trunk/fuentes/lliurex-analytics-server/usr/lib/analytics-server/analytics/reports.php

    r350 r5560  
    1515$klein->respond('GET','/ShowStats',call_show_stats());
    1616$klein->respond('GET','/GetStats',call_get_stats());
     17$klein->respond('GET','/ShowExtendedStats',call_show_extended_stats());
     18$klein->respond('GET','/GetExtendedStats',call_get_extended_stats());
    1719$klein->respond('POST','/notify',call_bd());
    1820
Note: See TracChangeset for help on using the changeset viewer.