PageRenderTime 26ms CodeModel.GetById 8ms RepoModel.GetById 0ms app.codeStats 0ms

/demo/scalr_newui/app/www/server/statistics.php

https://github.com/kennethjiang/Wolke
PHP | 191 lines | 161 code | 24 blank | 6 comment | 21 complexity | 16a94d3e1e944521afe8694b2b5c708a MD5 | raw file
  1. <?
  2. require(dirname(__FILE__)."/../../src/prepend.inc.php");
  3. Core::Load("IO/PCNTL/interface.IProcess.php");
  4. require_once(dirname(__FILE__)."/../../cron/watchers/class.SNMPWatcher.php");
  5. require_once(dirname(__FILE__)."/../../cron/watchers/class.CPUSNMPWatcher.php");
  6. require_once(dirname(__FILE__)."/../../cron/watchers/class.LASNMPWatcher.php");
  7. require_once(dirname(__FILE__)."/../../cron/watchers/class.MEMSNMPWatcher.php");
  8. require_once(dirname(__FILE__)."/../../cron/watchers/class.NETSNMPWatcher.php");
  9. if ($req_task == "get_stats_image_url")
  10. {
  11. $farmid = (int)$req_farmid;
  12. $watchername = $req_watchername;
  13. $graph_type = $req_graph_type;
  14. $role_name = ($req_role_name) ? $req_role_name : $req_role;
  15. if ($req_version == 2)
  16. {
  17. if ($role_name != 'FARM' && !stristr($role_name, "INSTANCE_"))
  18. $role_name = "FR_{$role_name}";
  19. }
  20. $farminfo = $db->GetRow("SELECT status, id, env_id FROM farms WHERE id=?", array($farmid));
  21. if ($farminfo["status"] != FARM_STATUS::RUNNING)
  22. $result = array("type" => "error", "msg" => _("Statistics not available for terminated farm"));
  23. else
  24. {
  25. if ($farminfo['clientid'] != 0)
  26. {
  27. define("SCALR_SERVER_TZ", date("T"));
  28. $env = Scalr_Model::init(Scalr_Model::ENVIRONMENT)->loadById($farminfo['env_id']);
  29. $tz = $env->getPlatformConfigValue(ENVIRONMENT_SETTINGS::TIMEZONE);
  30. if ($tz)
  31. date_default_timezone_set($tz);
  32. }
  33. $graph_info = GetGraphicInfo($graph_type);
  34. $image_path = APPPATH."/cache/stats/{$farmid}/{$role_name}.{$watchername}.{$graph_type}.gif";
  35. $farm_rrddb_dir = CONFIG::$RRD_DB_DIR."/{$farminfo['id']}";
  36. $rrddbpath = "{$farm_rrddb_dir}/{$role_name}/{$watchername}/db.rrd";
  37. CONFIG::$RRD_GRAPH_STORAGE_TYPE = RRD_STORAGE_TYPE::LOCAL_FS;
  38. if (file_exists($rrddbpath))
  39. {
  40. try
  41. {
  42. GenerateGraph($farmid, $role_name, $rrddbpath, $watchername, $graph_type, $image_path);
  43. $url = str_replace(array("%fid%","%rn%","%wn%"), array($farmid, $role_name, $watchername), CONFIG::$RRD_STATS_URL);
  44. $url = "{$url}{$graph_type}.gif";
  45. $result = array("type" => "ok", "msg" => $url);
  46. }
  47. catch(Exception $e)
  48. {
  49. $result = array("type" => "error", "msg" => $e->getMessage());
  50. }
  51. }
  52. else
  53. $result = array("type" => "error", "msg" => _("Statistics not available yet"));
  54. }
  55. }
  56. print json_encode($result);
  57. function GenerateGraph($farmid, $role_name, $rrddbpath, $watchername, $graph_type)
  58. {
  59. if (CONFIG::$RRD_GRAPH_STORAGE_TYPE == RRD_STORAGE_TYPE::AMAZON_S3)
  60. $image_path = APPPATH."/cache/stats/{$farmid}/{$role_name}.{$watchername}.{$graph_type}.gif";
  61. else
  62. $image_path = CONFIG::$RRD_GRAPH_STORAGE_PATH."/{$farmid}/{$role_name}_{$watchername}.{$graph_type}.gif";
  63. @mkdir(dirname($image_path), 0777, true);
  64. $graph_info = GetGraphicInfo($graph_type);
  65. if (file_exists($image_path))
  66. {
  67. clearstatcache();
  68. $time = filemtime($image_path);
  69. if ($time > time()-$graph_info['update_every'])
  70. return;
  71. }
  72. // Plot daily graphic
  73. try
  74. {
  75. $Reflect = new ReflectionClass("{$watchername}Watcher");
  76. $PlotGraphicMethod = $Reflect->getMethod("PlotGraphic");
  77. $PlotGraphicMethod->invoke(NULL, $rrddbpath, $image_path, $graph_info);
  78. }
  79. catch(Exception $e)
  80. {
  81. Logger::getLogger('STATS')->fatal("Cannot plot graphic: {$e->getMessage()}");
  82. return;
  83. }
  84. // Save graphic
  85. if (CONFIG::$RRD_GRAPH_STORAGE_TYPE == RRD_STORAGE_TYPE::AMAZON_S3)
  86. {
  87. // Get S3Client object
  88. $S3Client = new AmazonS3(CONFIG::$AWS_ACCESSKEY_ID, CONFIG::$AWS_ACCESSKEY);
  89. // Check statistics folder for farm. If not exists - create it
  90. try
  91. {
  92. $S3Client->GetObjectMetaData("{$farmid}_\$folder\$", CONFIG::$RRD_GRAPH_STORAGE_PATH);
  93. }
  94. catch(Exception $e)
  95. {
  96. // folder not exists try to create
  97. try
  98. {
  99. $S3Client->CreateFolder($farmid, CONFIG::$RRD_GRAPH_STORAGE_PATH);
  100. }
  101. catch(Exception $e)
  102. {
  103. Logger::getLogger('STATS')->fatal("Cannot create folder for farm statistics. {$e->getMessage()}");
  104. return;
  105. }
  106. }
  107. try
  108. {
  109. // Upload graph to S3
  110. $S3Client->CreateObject(
  111. "{$farmid}/{$role_name}_{$watchername}.{$graph_type}.gif",
  112. CONFIG::$RRD_GRAPH_STORAGE_PATH,
  113. $image_path,
  114. "image/gif"
  115. );
  116. }
  117. catch (Exception $e)
  118. {
  119. Logger::getLogger('STATS')->fatal("Cannot upload graph. {$e->getMessage()}");
  120. return;
  121. }
  122. }
  123. }
  124. function GetGraphicInfo($type)
  125. {
  126. switch($type)
  127. {
  128. case GRAPH_TYPE::DAILY:
  129. $r = array(
  130. "start" => "-1d5min",
  131. "end" => "-5min",
  132. "step" => 180,
  133. "update_every" => 600,
  134. "x_grid" => "HOUR:1:HOUR:2:HOUR:2:0:%H"
  135. );
  136. break;
  137. case GRAPH_TYPE::WEEKLY:
  138. $r = array(
  139. "start" => "-1wk5min",
  140. "end" => "-5min",
  141. "step" => 1800,
  142. "update_every" => 7200,
  143. "x_grid" => "HOUR:12:HOUR:24:HOUR:24:0:%a"
  144. );
  145. break;
  146. case GRAPH_TYPE::MONTHLY:
  147. $r = array(
  148. "start" => "-1mon5min",
  149. "end" => "-5min",
  150. "step" => 7200,
  151. "update_every" => 43200,
  152. "x_grid" => "DAY:2:WEEK:1:WEEK:1:0:week %V"
  153. );
  154. break;
  155. case GRAPH_TYPE::YEARLY:
  156. $r = array(
  157. "start" => "-1y",
  158. "end" => false,
  159. "step" => 86400,
  160. "update_every" => 86400,
  161. "x_grid" => "MONTH:1:MONTH:1:MONTH:1:0:%b"
  162. );
  163. break;
  164. }
  165. return $r;
  166. }
  167. ?>