Commit 9e0014ed authored by Dominik Hebeler's avatar Dominik Hebeler

Erstes Admin Interface für die Üebrwachung der Fetcher

parent cca6a9c0
......@@ -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()
......
......@@ -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
......@@ -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');
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment