Browse Source

HUE-2227 [oozie] Add a limit=N and recent=M when fetching job logs

krish 10 years ago
parent
commit
592ce4b

+ 24 - 3
apps/oozie/src/oozie/templates/dashboard/list_oozie_coordinator.mako

@@ -361,6 +361,15 @@ ${ layout.menubar(section='coordinators', dashboard=True) }
             </div>
 
             <div class="tab-pane" id="log">
+              <div class="pull-left">
+                ${ _("Recent") } <input type="text" class="input-medium" data-bind="value: logFilterRecent" placeholder="${_('2h:30m or 5h:5m')}">
+                ${ _("Limit") } <input type="text" class="input-medium" data-bind="value: logFilterLimit" placeholder="${_('Number of lines, Ex: 10')}">
+              </div>
+              <div class="pull-right">
+                <button data-bind="enable: isLogFilterSet()" class="btn log-refresh">  ${ _('Refresh') } </button>
+              </div>
+
+              <div class="clearfix"></div>
               <pre></pre>
             </div>
 
@@ -492,7 +501,7 @@ ${ layout.menubar(section='coordinators', dashboard=True) }
     };
   };
 
-  var RunningCoordinatorActionsModel = function (actions) {
+  var RunningCoordinatorModel = function (actions) {
     var self = this;
     this.isLoading = ko.observable(true);
 
@@ -506,6 +515,14 @@ ${ layout.menubar(section='coordinators', dashboard=True) }
 
     this.searchFilter = ko.observable('');
 
+    this.logFilterRecent = ko.observable('');
+
+    this.logFilterLimit = ko.observable('100');
+
+    this.isLogFilterSet = function () {
+      return this.logFilterRecent() || this.logFilterLimit();
+    }
+
     this.select = function (filter) {
       ko.utils.arrayFilter(self.actions(), function(action) {
         if (action.status.toLowerCase() === filter) {
@@ -610,7 +627,7 @@ ${ layout.menubar(section='coordinators', dashboard=True) }
     });
   };
 
-  var viewModel = new RunningCoordinatorActionsModel([]);
+  var viewModel = new RunningCoordinatorModel([]);
   ko.applyBindings(viewModel);
 
   var CHART_LABELS = {
@@ -689,6 +706,10 @@ ${ layout.menubar(section='coordinators', dashboard=True) }
       refreshView();
     });
 
+    $('#log-refresh, .log-refresh').click(function () {
+      refreshLogs();
+    });
+
     $("a.btn-actions-pagination").on("click", function () {
       if (!$(this).parent().hasClass("disabled")) {
         var _additionalOffset = 0;
@@ -817,7 +838,7 @@ ${ layout.menubar(section='coordinators', dashboard=True) }
 
     var logsAtEnd = true;
     function refreshLogs() {
-      $.getJSON("${ url('oozie:get_oozie_job_log', job_id=oozie_coordinator.id) }", function (data) {
+      $.getJSON("${ url('oozie:get_oozie_job_log', job_id=oozie_coordinator.id) }" + "?format=json&recent=" + viewModel.logFilterRecent() + "&limit=" + viewModel.logFilterLimit(), function (data) {
         var _logsEl = $("#log pre");
         _logsEl.text(data.log);
 

+ 15 - 4
apps/oozie/src/oozie/views/dashboard.py

@@ -525,12 +525,23 @@ def list_oozie_workflow_action(request, action):
 
 @show_oozie_error
 def get_oozie_job_log(request, job_id):
-  oozie_job = check_job_access_permission(request, job_id)
+  oozie_api = get_oozie(request.user, api_version="v2")
+  check_job_access_permission(request, job_id)
+  kwargs = {'logfilter' : []}
+
+  if request.GET.get('format') == 'json':
+    if request.GET.get('recent'):
+      kwargs['logfilter'].extend([('recent', val) for val in request.GET.get('recent').split(':')])
+    if request.GET.get('limit'):
+      kwargs['logfilter'].extend([('limit', request.GET.get('limit'))])
+
+  status_resp = oozie_api.get_job_status(job_id)
+  log = oozie_api.get_job_log(job_id, **kwargs)
 
   return_obj = {
-    'id': oozie_job.id,
-    'status':  oozie_job.status,
-    'log': oozie_job.log,
+    'id': job_id,
+    'status': status_resp['status'],
+    'log': log,
   }
 
   return JsonResponse(return_obj, encoder=JSONEncoderForHTML)

+ 20 - 3
desktop/libs/liboozie/src/liboozie/oozie_api.py

@@ -88,6 +88,7 @@ class OozieApi(object):
     return defaults
 
   VALID_JOB_FILTERS = ('name', 'user', 'group', 'status', 'startcreatedtime')
+  VALID_LOG_FILTERS = {'recent', 'limit'}
 
   def get_jobs(self, jobtype, offset=None, cnt=None, filters=None):
     """
@@ -172,15 +173,31 @@ class OozieApi(object):
     """
     params = self._get_params()
     params['show'] = 'definition'
-    xml = self._root.get('job/%s' % (jobid,), params)
-    return xml
+    return self._root.get('job/%s' % (jobid,), params)
+
 
-  def get_job_log(self, jobid):
+  def get_job_log(self, jobid, logfilter=None):
     """
     get_job_log(jobid) -> Log (xml string)
     """
     params = self._get_params()
     params['show'] = 'log'
+
+    filter_list = []
+    if logfilter is None:
+      logfilter = {}
+    for key, val in logfilter:
+      if key not in OozieApi.VALID_LOG_FILTERS:
+        raise ValueError('"%s" is not a valid filter for job logs' % (key,))
+      filter_list.append('%s=%s' % (key, val))
+    params['logfilter'] = ';'.join(filter_list)
+    return self._root.get('job/%s' % (jobid,), params)
+
+
+  def get_job_status(self, jobid):
+    params = self._get_params()
+    params['show'] = 'status'
+
     xml = self._root.get('job/%s' % (jobid,), params)
     return xml