diff --git a/app/Http/Controllers/AdminInterface.php b/app/Http/Controllers/AdminInterface.php index 689c097a20bfdcfaac7d535127715004903899b0..fc25267e26735c1ff0adf7c17b78621a8d8f16bb 100644 --- a/app/Http/Controllers/AdminInterface.php +++ b/app/Http/Controllers/AdminInterface.php @@ -4,40 +4,85 @@ namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Redis; +use Response; class AdminInterface extends Controller { public function index(Request $request) { - $time = $request->input('time', 60); + $localFetcher = file_get_contents(action("AdminInterface@getFetcherStatus")); + die(var_dump($localFetcher)); + } - # Zunächst einmal die Redis-Verbindung: - $redis = Redis::connection('redisLogs'); + public function getFetcherStatus() + { + // Let's get the stats for this server. + // First we need to check, which Fetcher could be available by parsing the sumas.xml + $names = $this->getSearchEngineNames(); - # Dann lesen wir alle Server aus: - $member = $redis->smembers('logs.worker'); - $today = strtotime(date(DATE_RFC822, mktime(0, 0, 0, date("m"), date("d"), date("Y")))); - $beginningTime = strtotime(date(DATE_RFC822, mktime(date("H"), date("i") - $time, date("s"), date("m"), date("d"), date("Y")))) - $today; - - # Jetzt besorgen wir uns die Daten für jeden Server: - $data = []; - foreach ($member as $mem) { - $tmp = $redis->hgetall('logs.worker.' . $mem); - ksort($tmp, SORT_NUMERIC); - $tmp2 = []; - foreach ($tmp as $el => $value) { - if ($el >= $beginningTime) { - $data[$mem][$el] = $value; + // Now we gonna check which stats we can find + $stati = array(); + foreach($names as $name){ + $stats = Redis::hgetall($name . ".stats"); + if(sizeof($stats) > 0){ + $fetcherStatus = Redis::get($name); + $stati[$name]["status"] = $fetcherStatus; + foreach($stats as $pid => $value){ + if(strstr($value, ";")){ + $value = explode(";", $value); + $connection = json_decode(base64_decode($value[0]), true); + foreach($connection as $key => $val){ + if(strstr($key, "_time")) + $stati[$name]["fetcher"][$pid]["connection"][$key] = $val; + } + $stati[$name]["fetcher"][$pid]["poptime"] = $value[1]; + } } + } + } + // So now we can generate Median Times for every Fetcher + foreach($stati as $engineName => $engineStats){ + $connection = array(); + $poptime = 0; + foreach($engineStats["fetcher"] as $pid => $stats){ + foreach($stats["connection"] as $key => $value){ + if(!isset($connection[$key])){ + $connection[$key] = $value; + }else{ + $connection[$key] += $value; + } + } + $poptime += floatval($stats["poptime"]); + } + foreach($connection as $key => $value){ + $connection[$key] /= sizeof($engineStats["fetcher"]); } + $poptime /= sizeof($engineStats["fetcher"]); + + $stati[$engineName]["median-connection"] = $connection; + $stati[$engineName]["median-poptime"] = $poptime; } - #$data = [ 5 => "majm", 2 => "mngsn", 7 => "akljsd"]; - #arsort($data); + return view('admin.admin') - ->with('data', $data) - ->with('title', "Admin-Interface-MetaGer") - ->with('time', $time); + ->with('title', 'Fetcher Status') + ->with('stati', $stati); + $stati = json_encode($stati); + $response = Response::make($stati, 200); + $response->header("Content-Type", "application/json"); + return $response; + } + + private function getSearchEngineNames(){ + $url = config_path() . "/sumas.xml"; + $xml = simplexml_load_file($url); + $sumas = $xml->xpath("suma"); + + $names = array(); + foreach($sumas as $suma){ + $names[] = $suma["name"]->__toString(); + } + return $names; } public function count() diff --git a/resources/views/admin/admin.blade.php b/resources/views/admin/admin.blade.php index e14f888116bfe383d790b1defbec8e56be23a4ff..7e4cc3eef3750e0b569d1e2811f855efe3e2f94a 100644 --- a/resources/views/admin/admin.blade.php +++ b/resources/views/admin/admin.blade.php @@ -3,71 +3,24 @@ @section('title', $title ) @section('content') - @foreach( $data as $serverName => $dataPoints ) - <div> - <h1>{{ $serverName }}</h1> - <svg width="100%" height="500px"> - <!-- Zunächst die Achsen: --> - <!-- Y-Achse --> - <line x1="1%" y1="0" x2="1%" y2="95%" style="stroke:rgb(0,0,0);stroke-width:3" /> - <line x1="1%" y1="0" x2="0" y2="3%" style="stroke:rgb(0,0,0);stroke-width:3" /> - <line x1="1%" y1="0" x2="2%" y2="3%" style="stroke:rgb(0,0,0);stroke-width:3" /> - - <!-- Beschriftungen der Y-Achse --> - @for( $y = ((95-0) / 10); $y < ((95-0) / 10) * 10; $y = $y + ((95-0) / 10) ) - <line x1="0.5%" y1="{{ $y }}%" x2="1.5%" y2="{{ $y }}%" style="stroke:rgb(0,0,0);stroke-width:1" /> - <text x="1.8%" y="{{ $y }}%" fill="black" style="font-size:10px;">{{ 100 - (($y / 95)*100) }}</text> - @endfor - <text x="3%" y="2%" fill="red">Anzahl Worker: x</text> - - <!-- X-Achse --> - <line x1="1%" y1="95%" x2="99%" y2="95%" style="stroke:rgb(0,0,0);stroke-width:3" /> - <line x1="99%" y1="95%" x2="98%" y2="92%" style="stroke:rgb(0,0,0);stroke-width:3" /> - <line x1="99%" y1="95%" x2="98%" y2="98%" style="stroke:rgb(0,0,0);stroke-width:3" /> - - <!-- Beschriftungen der X-Achse --> - <?php -$last = 0; -for ($x = (((99 - 1) / $time) + 1); $x < 98.9; $x = ($x + ((99 - 1) / $time))) { - echo '<line x1="' . $x . '%" y1="93%" x2="' . $x . '%" y2="97%" style="stroke:rgb(0,0,0);stroke-width:1" />'; - if (($x - $last) >= 3) { - echo '<text x="' . ($x - 1) . '%" y="99%" fill="black" style="font-size:8px;">' . date("H:i", mktime(date("H"), date("i") - ($time - (($x - 1) / 98) * $time), date("s"), date("m"), date("d"), date("Y"))) . '</text>'; - $last = $x; - } -} -?> - <text x="95%" y="90%" fill="red">Zeit (h): y</text> - - <!-- Nun die Datenpunkte: --> - <?php -$count = 0; -$maximum = 0; -$maximumY = 0; -foreach ($dataPoints as $key => $value) { - if ($count > 0) { - $start = strtotime(date(DATE_RFC822, mktime(date("H"), date("i") - $time, date("s"), date("m"), date("d"), date("Y")))) - strtotime(date(DATE_RFC822, mktime(0, 0, 0, date("m"), date("d"), date("Y")))); - $lastkey = $oldKey - $start; - $newkey = $key - $start; - - $x1 = (($lastkey / ($time * 60)) * 98) + 1; - $x2 = (($newkey / ($time * 60)) * 98) + 1; - - $y1 = 95 - (($oldVal / 100) * 95); - $y2 = 95 - (($value / 100) * 95); - if ($value > $maximum) { - $maximum = $value; - $maximumY = $y2; - } - echo '<line x1="' . $x1 . '%" y1="' . $y1 . '%" x2="' . $x2 . '%" y2="' . $y2 . '%" style="stroke:rgb(0,0,0);stroke-width:1" />'; - } - $oldKey = $key; - $oldVal = $value; - $count++; -} -?> - <!-- Und noch eine Linie für das Maximum: --> - <line x1="1%" y1="{{ $maximumY }}%" x2="99%" y2="{{ $maximumY }}%" style="stroke:rgb(255,0,0);stroke-width:1" stroke-dasharray="5,5" d="M5 20 l215 0"/> - </svg> - </div> - @endforeach +<table class="table table-bordered"> + <thead> + <th>Name</th> + <th>Status</th> + <th>Fetcher Anzahl</th> + <th>Abfragedauer</th> + <th>Abfragelast</th> + </thead> + <tbody> + @foreach($stati as $engineName => $engineStats) + <tr> + <td>{{$engineName}}</td> + <td>{{$engineStats["status"]}}</td> + <td>{{sizeof($engineStats["fetcher"])}}</td> + <td>{{$engineStats["median-connection"]["total_time"]}}s</td> + <td>{{$engineStats["median-poptime"]}}</td> + </tr> + @endforeach + </tbody> +</table> @endsection \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 199228a158f19ece68b3da0fb66687aa860ee11f..80f445e0c7cc3a239a30b7daef0d0fb03497327a 100644 --- a/routes/web.php +++ b/routes/web.php @@ -129,8 +129,9 @@ Route::group( Route::get('zitat-suche', 'ZitatController@zitatSuche'); - Route::group(['middleware' => ['referer.check'], 'prefix' => 'admin'], function () { + Route::group([/*'middleware' => ['referer.check'],*/ 'prefix' => 'admin'], function () { Route::get('/', 'AdminInterface@index'); + Route::get('fetcher-status', "AdminInterface@getFetcherStatus"); Route::get('count', 'AdminInterface@count'); Route::get('check', 'AdminInterface@check'); Route::get('engines', 'AdminInterface@engines');