Procházet zdrojové kódy

HUE-8777 [jb] Improve diagnostics display on yarnv2 jobs

jdesjean před 6 roky
rodič
revize
c8b5de5cc5

+ 5 - 1
apps/jobbrowser/src/jobbrowser/apis/job_api.py

@@ -192,6 +192,7 @@ class YarnApi(Api):
       if hasattr(job, 'metrics'):
         common['metrics'] = job.metrics
     elif app['applicationType'] == 'YarnV2':
+      common['applicationType'] = app.get('type')
       common['properties'] = {
         'startTime': job.startTime,
         'finishTime': job.finishTime,
@@ -229,7 +230,10 @@ class YarnApi(Api):
           logs = parseResponse.get('logs')
           logs_list = parseResponse.get('logsList')
           if logs and len(logs) == 4:
-            logs = logs[1]
+            if app_type == 'YarnV2' and logs[0]: #logs[0] is diagnostics
+              logs = logs[0]
+            else:
+              logs = logs[1]
         else:
           response = job_attempt_logs_json(MockDjangoRequest(self.user), job=appid, name=log_name, is_embeddable=is_embeddable)
           logs = json.loads(response.content).get('log')

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
apps/jobbrowser/src/jobbrowser/static/jobbrowser/css/jobbrowser-embeddable.css


+ 10 - 1
apps/jobbrowser/src/jobbrowser/static/jobbrowser/less/jobbrowser-embeddable.less

@@ -36,7 +36,6 @@
     padding-right: 10px;
   }
 }
-
 .jobbrowser-components {
   .hue-uncheck::before {
     padding-left: 2px;
@@ -386,4 +385,14 @@
     overflow-x: auto;
     white-space: pre;
   }
+  .nav.nav-tabs.scrollable {
+    height: 50px;
+    overflow-x: auto;
+    overflow-y: hidden;
+    white-space: nowrap;
+  }
+  .nav.nav-tabs > li {
+    display: inline-block;
+    float: initial;
+  }
 }

+ 7 - 10
apps/jobbrowser/src/jobbrowser/templates/job_browser.mako

@@ -863,7 +863,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
           <li class="nav-header">${ _('Id') }</li>
           <li class="break-word"><span data-bind="text: id"></span></li>
           <li class="nav-header">${ _('Type') }</li>
-          <li><span data-bind="text: type"></span></li>
+          <li><span data-bind="text: applicationType"></span></li>
           <li class="nav-header">${ _('Progress') }</li>
           <li><span data-bind="text: progress"></span>%</li>
           <li>
@@ -881,10 +881,6 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
             <li><span data-bind="moment: {data: finishTime, format: 'LLL'}"></span></li>
             <li class="nav-header">${ _('Elapsed time') }</li>
             <li><span data-bind="text: elapsedTime().toHHMMSS()"></span></li>
-            <!-- ko if: diagnostics -->
-              <li class="nav-header">${ _('Diagnostics') }</li>
-              <li><span data-bind="text: diagnostics, attr: { title: diagnostics }"></span>%</li>
-            <!-- /ko -->
           <!-- /ko -->
           <!-- /ko -->
         </ul>
@@ -900,7 +896,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
 
       <div class="tab-content">
         <div class="tab-pane active" id="job-yarnv2-page-logs${ SUFFIX }">
-          <ul class="nav nav-tabs" data-bind="foreach: logsList">
+          <ul class="nav nav-tabs scrollable" data-bind="foreach: logsList">
             <li data-bind="css: { 'active': $data == $parent.logActive() }"><a href="javascript:void(0)" data-bind="click: function(data, e) { $parent.fetchLogs($data); $parent.logActive($data); }, text: $data"></a></li>
           </ul>
           <pre data-bind="html: logs, logScroller: logs"></pre>
@@ -917,7 +913,6 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
               <th>${_('Finish Time')}</th>
               <th>${_('Node Http Address')}</th>
               <th>${_('Blacklisted Nodes')}</th>
-              <th>${_('Nodes Blacklisted By System')}</th>
             </tr>
             </thead>
             <tbody data-bind="foreach: properties['attempts']()['task_list']">
@@ -929,7 +924,6 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
                 <td data-bind="moment: {data: finishedTime, format: 'LLL'}"></td>
                 <td data-bind="text: nodeHttpAddress"></td>
                 <td data-bind="text: blacklistedNodes"></td>
-                <td data-bind="text: nodesBlacklistedBySystem"></td>
               </tr>
             </tbody>
           </table>
@@ -2341,6 +2335,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
       self.doc_url = ko.observableDefault(job.doc_url);
       self.name = ko.observableDefault(job.name || job.id);
       self.type = ko.observableDefault(job.type);
+      self.applicationType = ko.observableDefault(job.applicationType || '');
 
       self.status = ko.observableDefault(job.status);
       self.apiStatus = ko.observableDefault(job.apiStatus);
@@ -2358,7 +2353,8 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
 
       self.logActive = ko.observable('default');
       self.logsByName = ko.observable({});
-      self.logsList = ko.observable(['default', 'stdout', 'stderr', 'syslog']);
+      self.logsListDefaults = ko.observable(['default', 'stdout', 'stderr', 'syslog']);
+      self.logsList = ko.observable(self.logsListDefaults());
       self.logs = ko.pureComputed(function() {
         return self.logsByName()[self.logActive()];
       });
@@ -2671,7 +2667,8 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
             result[name] = data.logs.logs;
             self.logsByName(result);
             if (data.logs.logsList && data.logs.logsList.length) {
-              self.logsList(['default'].concat(data.logs.logsList));
+              var logsListDefaults = self.logsListDefaults();
+              self.logsList(logsListDefaults.concat(data.logs.logsList.filter(function(log) { return logsListDefaults.indexOf(log) < 0; })));
             }
             if ($('.jb-panel pre:visible').length > 0){
               $('.jb-panel pre:visible').css('overflow-y', 'auto').height(Math.max(200, $(window).height() - $('.jb-panel pre:visible').offset().top - $('.page-content').scrollTop() - 75));

+ 4 - 1
apps/jobbrowser/src/jobbrowser/views.py

@@ -196,6 +196,7 @@ def massage_job_for_json(job, request=None, user=None):
     'desiredMaps': job.desiredMaps,
     'desiredReduces': job.desiredReduces,
     'applicationType': hasattr(job, 'applicationType') and job.applicationType or None,
+    'type': hasattr(job, 'type') and job.type or None,
     'mapsPercentComplete': int(job.maps_percent_complete) if job.maps_percent_complete else '',
     'finishedMaps': job.finishedMaps,
     'finishedReduces': job.finishedReduces,
@@ -526,7 +527,9 @@ def single_task_attempt_logs(request, job, taskid, attemptid, offset=LOG_OFFSET_
 
   try:
     # Add a diagnostic log
-    if job_link.is_mr2:
+    if hasattr(task, 'job') and hasattr(task.job, 'diagnostics'):
+      diagnostic_log = task.job.diagnostics
+    elif job_link.is_mr2:
       diagnostic_log = attempt.diagnostics
     else:
       diagnostic_log =  ", ".join(task.diagnosticMap[attempt.attemptId])

+ 1 - 1
apps/jobbrowser/src/jobbrowser/yarn_models.py

@@ -545,7 +545,7 @@ class Attempt:
     attempt = self.task.job.job_attempts['jobAttempt'][-1]
     log_link = attempt['logsLink']
     if not log_link:
-      return log_link
+      return log_link, None
 
     # Generate actual task log link from logsLink url
     if self.task.job.status in ('NEW', 'SUBMITTED', 'RUNNING'):

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů