You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					178 lines
				
				4.5 KiB
			
		
		
			
		
	
	
					178 lines
				
				4.5 KiB
			| 
								 
											12 years ago
										 
									 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @link http://www.yiiframework.com/
							 | 
						||
| 
								 | 
							
								 * @copyright Copyright (c) 2008 Yii Software LLC
							 | 
						||
| 
								 | 
							
								 * @license http://www.yiiframework.com/license/
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace yii\elasticsearch;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use yii\debug\Panel;
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
								use yii\helpers\ArrayHelper;
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
								use yii\log\Logger;
							 | 
						||
| 
								 | 
							
								use yii\helpers\Html;
							 | 
						||
| 
								 | 
							
								use yii\web\View;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Debugger panel that collects and displays elasticsearch queries performed.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @author Carsten Brandt <mail@cebe.cc>
							 | 
						||
| 
								 | 
							
								 * @since 2.0
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								class DebugPanel extends Panel
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									public $db = 'elasticsearch';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function init()
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										$this->actions['elasticsearch-query'] = [
							 | 
						||
| 
								 | 
							
											'class' => 'yii\\elasticsearch\\DebugAction',
							 | 
						||
| 
								 | 
							
											'panel' => $this,
							 | 
						||
| 
								 | 
							
											'db' => $this->db,
							 | 
						||
| 
								 | 
							
										];
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									public function getName()
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										return 'Elasticsearch';
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function getSummary()
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										$timings = $this->calculateTimings();
							 | 
						||
| 
								 | 
							
										$queryCount = count($timings);
							 | 
						||
| 
								 | 
							
										$queryTime = 0;
							 | 
						||
| 
								 | 
							
										foreach ($timings as $timing) {
							 | 
						||
| 
								 | 
							
											$queryTime += $timing[3];
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										$queryTime = number_format($queryTime * 1000) . ' ms';
							 | 
						||
| 
								 | 
							
										$url = $this->getUrl();
							 | 
						||
| 
								 | 
							
										$output = <<<EOD
							 | 
						||
| 
								 | 
							
								<div class="yii-debug-toolbar-block">
							 | 
						||
| 
								 | 
							
									<a href="$url" title="Executed $queryCount elasticsearch queries which took $queryTime.">
							 | 
						||
| 
								 | 
							
										ES <span class="label">$queryCount</span> <span class="label">$queryTime</span>
							 | 
						||
| 
								 | 
							
									</a>
							 | 
						||
| 
								 | 
							
								</div>
							 | 
						||
| 
								 | 
							
								EOD;
							 | 
						||
| 
								 | 
							
										return $queryCount > 0 ? $output : '';
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function getDetail()
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										$timings = $this->calculateTimings();
							 | 
						||
| 
								 | 
							
										ArrayHelper::multisort($timings, 3, SORT_DESC);
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										$rows = [];
							 | 
						||
| 
								 | 
							
										$i = 0;
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										foreach ($timings as $logId => $timing) {
							 | 
						||
| 
								 | 
							
											$duration = sprintf('%.1f ms', $timing[3] * 1000);
							 | 
						||
| 
								 | 
							
											$message = $timing[1];
							 | 
						||
| 
								 | 
							
											$traces = $timing[4];
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
											if (($pos = mb_strpos($message, "#")) !== false) {
							 | 
						||
| 
								 | 
							
												$url = mb_substr($message, 0, $pos);
							 | 
						||
| 
								 | 
							
												$body = mb_substr($message, $pos + 1);
							 | 
						||
| 
								 | 
							
											} else {
							 | 
						||
| 
								 | 
							
												$url = $message;
							 | 
						||
| 
								 | 
							
												$body = null;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
											$traceString = '';
							 | 
						||
| 
								 | 
							
											if (!empty($traces)) {
							 | 
						||
| 
								 | 
							
												$traceString .= Html::ul($traces, [
							 | 
						||
| 
								 | 
							
													'class' => 'trace',
							 | 
						||
| 
								 | 
							
													'item' => function ($trace) {
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
														return "<li>{$trace['file']}({$trace['line']})</li>";
							 | 
						||
| 
								 | 
							
													},
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
												]);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
											$ajaxUrl = Html::url(['elasticsearch-query', 'logId' => $logId, 'tag' => $this->tag]);
							 | 
						||
| 
								 | 
							
											\Yii::$app->view->registerJs(<<<JS
							 | 
						||
| 
								 | 
							
								$('#elastic-link-$i').on('click', function() {
							 | 
						||
| 
								 | 
							
									var result = $('#elastic-result-$i');
							 | 
						||
| 
								 | 
							
									result.html('Sending request...');
							 | 
						||
| 
								 | 
							
									result.parent('tr').show();
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									$.ajax({
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										type: "POST",
							 | 
						||
| 
								 | 
							
										url: "$ajaxUrl",
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										success: function( data ) {
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
											$('#elastic-time-$i').html(data.time);
							 | 
						||
| 
								 | 
							
											$('#elastic-result-$i').html(data.result);
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										},
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
										error: function(jqXHR, textStatus, errorThrown) {
							 | 
						||
| 
								 | 
							
											$('#elastic-time-$i').html('');
							 | 
						||
| 
								 | 
							
											$('#elastic-result-$i').html('<span style="color: #c00;">Error: ' + errorThrown + ' - ' + textStatus + '</span><br />' + jqXHR.responseText);
							 | 
						||
| 
								 | 
							
										},
							 | 
						||
| 
								 | 
							
										dataType: "json"
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return false;
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								JS
							 | 
						||
| 
								 | 
							
								, View::POS_READY);
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
											$runLink = Html::a('run query', '#', ['id' => "elastic-link-$i"]) . '<br/>';
							 | 
						||
| 
								 | 
							
											$rows[] = <<<HTML
							 | 
						||
| 
								 | 
							
								<tr>
							 | 
						||
| 
								 | 
							
									<td style="width: 10%;">$duration</td>
							 | 
						||
| 
								 | 
							
									<td style="width: 75%;"><div><b>$url</b><br/><p>$body</p>$traceString</div></td>
							 | 
						||
| 
								 | 
							
									<td style="width: 15%;">$runLink</td>
							 | 
						||
| 
								 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								<tr style="display: none;"><td id="elastic-time-$i"></td><td colspan="3" id="elastic-result-$i"></td></tr>
							 | 
						||
| 
								 | 
							
								HTML;
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
											$i++;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										$rows = implode("\n", $rows);
							 | 
						||
| 
								 | 
							
										return <<<HTML
							 | 
						||
| 
								 | 
							
								<h1>Elasticsearch Queries</h1>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<table class="table table-condensed table-bordered table-striped table-hover" style="table-layout: fixed;">
							 | 
						||
| 
								 | 
							
								<thead>
							 | 
						||
| 
								 | 
							
								<tr>
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									<th style="width: 10%;">Time</th>
							 | 
						||
| 
								 | 
							
									<th style="width: 75%;">Url / Query</th>
							 | 
						||
| 
								 | 
							
									<th style="width: 15%;">Run Query on node</th>
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
								</tr>
							 | 
						||
| 
								 | 
							
								</thead>
							 | 
						||
| 
								 | 
							
								<tbody>
							 | 
						||
| 
								 | 
							
								$rows
							 | 
						||
| 
								 | 
							
								</tbody>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								HTML;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									private $_timings;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									public function calculateTimings()
							 | 
						||
| 
								 
											12 years ago
										 
									 | 
							
									{
							 | 
						||
| 
								 | 
							
										if ($this->_timings !== null) {
							 | 
						||
| 
								 | 
							
											return $this->_timings;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										$messages = $this->data['messages'];
							 | 
						||
| 
								 | 
							
										$timings = [];
							 | 
						||
| 
								 | 
							
										$stack = [];
							 | 
						||
| 
								 | 
							
										foreach ($messages as $i => $log) {
							 | 
						||
| 
								 | 
							
											list($token, $level, $category, $timestamp) = $log;
							 | 
						||
| 
								 | 
							
											$log[5] = $i;
							 | 
						||
| 
								 | 
							
											if ($level == Logger::LEVEL_PROFILE_BEGIN) {
							 | 
						||
| 
								 | 
							
												$stack[] = $log;
							 | 
						||
| 
								 | 
							
											} elseif ($level == Logger::LEVEL_PROFILE_END) {
							 | 
						||
| 
								 | 
							
												if (($last = array_pop($stack)) !== null && $last[0] === $token) {
							 | 
						||
| 
								 | 
							
													$timings[$last[5]] = [count($stack), $token, $last[3], $timestamp - $last[3], $last[4]];
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										$now = microtime(true);
							 | 
						||
| 
								 | 
							
										while (($last = array_pop($stack)) !== null) {
							 | 
						||
| 
								 | 
							
											$delta = $now - $last[3];
							 | 
						||
| 
								 | 
							
											$timings[$last[5]] = [count($stack), $last[0], $last[2], $delta, $last[4]];
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										ksort($timings);
							 | 
						||
| 
								 | 
							
										return $this->_timings = $timings;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									public function save()
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										$target = $this->module->logTarget;
							 | 
						||
| 
								 | 
							
										$messages = $target->filterMessages($target->messages, Logger::LEVEL_PROFILE, ['yii\elasticsearch\Connection::httpRequest']);
							 | 
						||
| 
								 | 
							
										return ['messages' => $messages];
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |