Skip to content
Snippets Groups Projects
Commit 9e0014ed authored by Dominik Hebeler's avatar Dominik Hebeler
Browse files

Erstes Admin Interface für die Üebrwachung der Fetcher

parent cca6a9c0
No related branches found
No related tags found
2 merge requests!859Development,!844Erstes Admin Interface für die Üebrwachung der Fetcher
......@@ -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');
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment