1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-12-22 13:30:55 +01:00

Add a basic Conduit log view

Summary:
The conduit access to Differential kind of sucks and we want to break
back-compat in order to fix it (see D1114).

To make it easier to pull this off, I want to build out the Conduit logging a
bit so administrators can identify which users are making deprecated calls.

We should probably build a little more infrastructure around this too (API
versions?), but this is at least a reasonable step forward which gives us more
insight into the use of Conduit and more tools to smooth the deprecation
process.

This initial commit is super basic but the interface currently says "stuff",
I'll build this out a little more in a bit.

Test Plan: Looked at call logs.

Reviewers: btrahan, nh, jungejason

Reviewed By: btrahan

CC: aran, btrahan

Differential Revision: 1144
This commit is contained in:
epriestley 2011-11-30 15:17:37 -08:00
parent c53511e9b4
commit 77a5a3ab00
3 changed files with 121 additions and 4 deletions

View file

@ -83,6 +83,7 @@ class AphrontDefaultApplicationConfiguration
'$' => 'PhabricatorConduitConsoleController', '$' => 'PhabricatorConduitConsoleController',
'method/(?P<method>[^/]+)$' => 'PhabricatorConduitConsoleController', 'method/(?P<method>[^/]+)$' => 'PhabricatorConduitConsoleController',
'log/$' => 'PhabricatorConduitLogController', 'log/$' => 'PhabricatorConduitLogController',
'log/view/(?P<view>[^/]+)/$' => 'PhabricatorConduitLogController',
'token/$' => 'PhabricatorConduitTokenController', 'token/$' => 'PhabricatorConduitTokenController',
), ),
'/api/(?P<method>[^/]+)$' => 'PhabricatorConduitAPIController', '/api/(?P<method>[^/]+)$' => 'PhabricatorConduitAPIController',

View file

@ -21,11 +21,116 @@
*/ */
class PhabricatorConduitLogController extends PhabricatorConduitController { class PhabricatorConduitLogController extends PhabricatorConduitController {
public function processRequest() { private $view;
return $this->buildStandardPageResponse('stuff', array( public function willProcessRequest(array $data) {
'title' => 'Conduit Logs', $this->view = idx($data, 'view');
'tab' => 'logs', }
public function processRequest() {
$request = $this->getRequest();
$nav = new AphrontSideNavView();
$links = array(
'calls' => 'All Calls',
);
if (empty($links[$this->view])) {
$this->view = key($links);
}
foreach ($links as $slug => $name) {
$nav->addNavItem(
phutil_render_tag(
'a',
array(
'href' => '/conduit/log/view/'.$slug.'/',
'class' => ($slug == $this->view)
? 'aphront-side-nav-selected'
: null,
),
phutil_escape_html($name)));
}
$conn_table = new PhabricatorConduitConnectionLog();
$call_table = new PhabricatorConduitMethodCallLog();
$conn_r = $call_table->establishConnection('r');
$pager = new AphrontPagerView();
$pager->setOffset($request->getInt('page'));
$calls = $call_table->loadAllWhere(
'1 = 1 ORDER BY id DESC LIMIT %d, %d',
$pager->getOffset(),
$pager->getPageSize() + 1);
$calls = $pager->sliceResults($calls);
$pager->setURI(new PhutilURI('/conduit/log/view/'.$this->view.'/'), 'page');
$min = $pager->getOffset() + 1;
$max = ($min + count($calls) - 1);
$conn_ids = array_filter(mpull($calls, 'getConnectionID'));
$conns = array();
if ($conn_ids) {
$conns = $conn_table->loadAllWhere(
'id IN (%Ld)',
$conn_ids);
}
$table = $this->renderCallTable($calls, $conns);
$panel = new AphrontPanelView();
$panel->setHeader('Conduit Method Calls ('.$min.'-'.$max.')');
$panel->appendChild($table);
$panel->appendChild($pager);
$nav->appendChild($panel);
return $this->buildStandardPageResponse(
$nav,
array(
'title' => 'Conduit Logs',
'tab' => 'logs',
)); ));
} }
private function renderCallTable(array $calls, array $conns) {
$user = $this->getRequest()->getUser();
$rows = array();
foreach ($calls as $call) {
$conn = idx($conns, $call->getConnectionID());
if (!$conn) {
// If there's no connection, use an empty object.
$conn = new PhabricatorConduitConnectionLog();
}
$rows[] = array(
$call->getConnectionID(),
phutil_escape_html($conn->getUserName()),
phutil_escape_html($call->getMethod()),
phutil_escape_html($call->getError()),
number_format($call->getDuration()).' us',
phabricator_datetime($call->getDateCreated(), $user),
);
}
$table = new AphrontTableView($rows);
$table->setHeaders(
array(
'Connection',
'User',
'Method',
'Error',
'Duration',
'Date',
));
$table->setColumnClasses(
array(
'',
'',
'wide',
'',
'n',
'right',
));
return $table;
}
} }

View file

@ -7,6 +7,17 @@
phutil_require_module('phabricator', 'applications/conduit/controller/base'); phutil_require_module('phabricator', 'applications/conduit/controller/base');
phutil_require_module('phabricator', 'applications/conduit/storage/connectionlog');
phutil_require_module('phabricator', 'applications/conduit/storage/methodcalllog');
phutil_require_module('phabricator', 'view/control/pager');
phutil_require_module('phabricator', 'view/control/table');
phutil_require_module('phabricator', 'view/layout/panel');
phutil_require_module('phabricator', 'view/layout/sidenav');
phutil_require_module('phabricator', 'view/utils');
phutil_require_module('phutil', 'markup');
phutil_require_module('phutil', 'parser/uri');
phutil_require_module('phutil', 'utils');
phutil_require_source('PhabricatorConduitLogController.php'); phutil_require_source('PhabricatorConduitLogController.php');