Prechádzať zdrojové kódy

HUE-8674 [jb] Fix timeline for multicluster.

jdesjean 6 rokov pred
rodič
commit
5e78413553

+ 5 - 3
apps/impala/src/impala/api.py

@@ -130,7 +130,7 @@ def alanize(request):
   cluster = json.loads(request.POST.get('cluster', '{}'))
   query_id = json.loads(request.POST.get('query_id'))
 
-  api = _get_api(request.user, cluster)
+  api = _get_api(request.user, cluster=cluster)
 
   if query_id:
     LOG.debug("Attempting to get Impala query profile for query ID: %s" % (query_id))
@@ -159,7 +159,7 @@ def alanize_metrics(request):
   cluster = json.loads(request.POST.get('cluster', '{}'))
   query_id = json.loads(request.POST.get('query_id'))
 
-  api = _get_api(request.user, cluster)
+  api = _get_api(request.user, cluster=cluster)
 
   if query_id:
     LOG.debug("Attempting to get Impala query profile for query ID: %s" % (query_id))
@@ -175,6 +175,7 @@ def alanize_metrics(request):
 @error_handler
 def alanize_fix(request):
   response = {'status': -1}
+  cluster = json.loads(request.POST.get('cluster', '{}'))
   fix = json.loads(request.POST.get('fix'))
   start_time = json.loads(request.POST.get('start_time'), '-1')
   if fix['id'] == 0:
@@ -184,7 +185,8 @@ def alanize_fix(request):
       statement='compute stats %(data)s' % fix,
       status='ready',
       last_executed=start_time,
-      is_task=True
+      is_task=True,
+      compute=cluster
     )
     response['details'] = { 'task': notebook.execute(request, batch=True) }
     response['status'] = 0

+ 2 - 1
apps/impala/src/impala/dbms.py

@@ -25,6 +25,7 @@ from beeswax.server import dbms
 from beeswax.server.dbms import HiveServer2Dbms, QueryServerException, QueryServerTimeoutException,\
   get_query_server_config as beeswax_query_server_config
 
+from desktop.conf import CLUSTER_ID
 from impala import conf
 
 
@@ -53,7 +54,7 @@ def get_query_server_config(cluster_config=None):
 
 
 def _get_server_name(cluster_config):
-  return 'impala' + ('-' + cluster_config.get('name') if cluster_config else '')
+  return 'impala' + ('-' + cluster_config.get('name') if cluster_config and cluster_config.get('name') != CLUSTER_ID.get() else '')
 
 
 class ImpalaDbms(HiveServer2Dbms):

+ 2 - 2
apps/jobbrowser/src/jobbrowser/apis/query_api.py

@@ -25,13 +25,13 @@ from django.utils.translation import ugettext as _
 
 from jobbrowser.apis.base_api import Api
 
-
 LOG = logging.getLogger(__name__)
 
 
 try:
   from beeswax.models import Session
   from impala.server import get_api as get_impalad_api, _get_impala_server_url
+  from impala.dbms import _get_server_name
 except Exception, e:
   LOG.exception('Some application are not enabled: %s' % e)
 
@@ -40,7 +40,7 @@ def _get_api(user, cluster=None):
   if cluster and cluster.get('type') == 'altus-dw':
     server_url = 'http://impala-coordinator-%(name)s:25000' % cluster
   else:
-    session = Session.objects.get_session(user, application='impala')
+    session = Session.objects.get_session(user, application=_get_server_name(cluster))
     server_url = _get_impala_server_url(session)
   return get_impalad_api(user=user, url=server_url)
 

+ 19 - 17
apps/jobbrowser/src/jobbrowser/static/jobbrowser/js/impala_dagre.js

@@ -232,6 +232,9 @@ function impalaDagre(id) {
 
   function renderTimeline(key) {
     var datum = getTimelineData(key);
+    if (!datum.length) {
+      return '';
+    }
     var end = _impalaDagree._metrics && _impalaDagree._metrics['max'] || 10;
     var divider = end > 33554428 ? 1000000 : 1; // values are in NS, scaling to MS as max pixel value is 33554428px ~9h in MS
     var html = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ' + (end / divider) + ' 10" class="timeline" preserveAspectRatio="none">';
@@ -244,21 +247,19 @@ function impalaDagre(id) {
 
   function renderTimelineLegend(key) {
     var datum = getTimelineData(key);
-    var html = '';
-    if (datum) {
-      html += datum.map(function(time, index) {
-        return '<li><div class="legend-icon" style="background-color:' + time.color +' "></div><div class="metric-name">' + time.name + '</div> <div class="metric-value">' + ko.bindingHandlers.numberFormat.human(time.duration, time.unit) + '</div></li>';
-      }).join('');
+    if (!datum.length) {
+      return '';
     }
-    html += '';
-    return html;
+    return datum.map(function(time, index) {
+      return '<li><div class="legend-icon" style="background-color:' + time.color +' "></div><div class="metric-name">' + time.name + '</div> <div class="metric-value">' + ko.bindingHandlers.numberFormat.human(time.duration, time.unit) + '</div></li>';
+    }).join('');
   }
 
   function showDetail(id) {
     var data;
     if (_impalaDagree._metrics[id] && _impalaDagree._metrics[id]['averaged']['metrics']) {
       data = _impalaDagree._metrics[id]['averaged']['metrics'];
-    } else if (_impalaDagree._metrics[id]['metrics']) {
+    } else if (_impalaDagree._metrics[id] && _impalaDagree._metrics[id]['metrics']) {
       data = _impalaDagree._metrics[id]['metrics'][Object.keys(_impalaDagree._metrics[id]['metrics'])[0]];
     }
     d3.select('.query-plan').classed('open', true);
@@ -266,17 +267,18 @@ function impalaDagre(id) {
     var key = getKey(id);
     details.html('<header class="metric-title">' + getIcon(states_by_name[key].icon) + '<h3>' + states_by_name[key].label+ '</h3></div>')
     var detailsContent = details.append('div').classed('details-content', true);
-    var timelineSection = detailsContent.append('div').classed('details-section', true);
 
-    var timelineTitle = timelineSection.append('header');
-    timelineTitle.append('svg').classed('hi', true).append('use').attr('xlink:href', '#hi-access-time');
-    timelineTitle.append('h4').text(window.HUE_I18n.profile.timeline);
+    var timeline = renderTimeline(key, '');
+    if (timeline) {
+      var timelineSection = detailsContent.append('div').classed('details-section', true);
+      var timelineTitle = timelineSection.append('header');
+      timelineTitle.append('svg').classed('hi', true).append('use').attr('xlink:href', '#hi-access-time');
+      timelineTitle.append('h4').text(window.HUE_I18n.profile.timeline);
+      timelineSection.node().appendChild($.parseXML(renderTimeline(key, '')).children[0]);
 
-    timelineSection.node().appendChild($.parseXML(renderTimeline(key, '')).children[0]);
-
-    timelineSection.append('ol').classed('', true).html(renderTimelineLegend(key));
-
-    detailsContent.append('div').classed('divider', true);
+      timelineSection.append('ol').classed('', true).html(renderTimelineLegend(key));
+      detailsContent.append('div').classed('divider', true);
+    }
 
     var metricsSection = detailsContent.append('div').classed('details-section', true);
 

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

@@ -2710,8 +2710,10 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
       };
 
       self.fetchMetrics = function (name, callback) {
-        ApiHelper.getInstance().fetchQueryExecutionStatistics({ queryId: self.id(), compute: '' })
-        .done(function(data) {
+        ApiHelper.getInstance().fetchQueryExecutionStatistics({
+          queryId: self.id(),
+          cluster: vm.compute()
+        }).done(function(data) {
           self.properties['metrics'](data);
         });
       };
@@ -3225,6 +3227,9 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
 
       self.cluster = ko.observable();
       self.compute = ko.observable();
+      self.compute.subscribe(function () {
+        self.jobs.fetchJobs();
+      });
 
       self.availableInterfaces = ko.pureComputed(function () {
         var jobsInterfaceCondition = function () {

+ 2 - 2
desktop/core/src/desktop/static/desktop/js/apiHelper.js

@@ -2086,8 +2086,8 @@ var ApiHelper = (function () {
     var self = this;
     var url = '/impala/api/query/alanize/fix';
     var deferred = $.Deferred();
-
     var request = self.simplePost(url, {
+      cluster: JSON.stringify(options.compute),
       fix: JSON.stringify(options.fix),
       start_time: options.start_time
       }, {
@@ -2111,7 +2111,7 @@ var ApiHelper = (function () {
     var deferred = $.Deferred();
 
     var request = self.simplePost(url, {
-      'cluster': JSON.stringify(options.compute),
+      'cluster': JSON.stringify(options.cluster),
       'query_id': '"' + options.queryId + '"'
       }, {
       silenceErrors: options.silenceErrors,

+ 1 - 1
desktop/core/src/desktop/templates/ko_components/ko_execution_analysis.mako

@@ -221,7 +221,7 @@ from desktop.views import _ko
 
       ExecutionAnalysis.prototype.handleFix = function (fix) {
         var self = this;
-        ApiHelper.getInstance().fixQueryExecutionAnalysis({ fix: fix, start_time: ko.mapping.toJSON((new Date()).getTime()) })
+        ApiHelper.getInstance().fixQueryExecutionAnalysis({ fix: fix, start_time: ko.mapping.toJSON((new Date()).getTime()), compute: self.details().compute })
         .done(function(resp) {
           huePubSub.publish('notebook.task.submitted', resp.task.history_uuid);
           fix.fixed = true;