Эх сурвалжийг харах

HUE-6857 [metadata] Add skeleton of troubleshooting API

Romain Rigaux 8 жил өмнө
parent
commit
4a0c75e

+ 13 - 0
apps/jobbrowser/src/jobbrowser/templates/job_browser.mako

@@ -813,6 +813,10 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
 
 
 <script type="text/html" id="dataeng-job-page${ SUFFIX }">
+  <button class="btn" title="${ _('Troubleshoot') }" data-bind="click: troubleshoot">
+    <i class="fa fa-tachometer"></i> ${ _('Troubleshoot') }
+  </button>
+
   <!-- ko if: type() == 'dataeng-job-HIVE' -->
     <div data-bind="template: { name: 'dataeng-job-hive-page${ SUFFIX }', data: $root.job() }"></div>
   <!-- /ko -->
@@ -1771,6 +1775,15 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
         }
       }
 
+      self.troubleshoot = function (action) {
+        $.post('/metadata/api/workload_analytics/get_operation_execution_details', {
+          operation_id: ko.mapping.toJSON(self.id())
+        }, function(data) {
+          console.log(ko.mapping.toJSON(data));
+        });
+      }
+
+
       self.workflowGraphLoaded = false;
 
       self.lastArrowsPosition = {

+ 6 - 0
desktop/libs/metadata/src/metadata/urls.py

@@ -57,3 +57,9 @@ urlpatterns += patterns('metadata.optimizer_api',
   url(r'^api/optimizer/query_compatibility/?$', 'query_compatibility', name='query_compatibility'),
   url(r'^api/optimizer/similar_queries/?$', 'similar_queries', name='similar_queries'),
 )
+
+
+# Workload Analytics API
+urlpatterns += patterns('metadata.workload_analytics_api',
+  url(r'^api/workload_analytics/get_operation_execution_details/?$', 'get_operation_execution_details', name='get_operation_execution_details'),
+)

+ 63 - 0
desktop/libs/metadata/src/metadata/workload_analytics_api.py

@@ -0,0 +1,63 @@
+#!/usr/bin/env python
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import logging
+import json
+
+from django.utils.translation import ugettext as _
+from django.views.decorators.http import require_POST
+
+from desktop.lib.django_util import JsonResponse
+from desktop.lib.i18n import force_unicode
+
+from metadata.workload_analytics_client import WorkfloadAnalyticsClient
+
+
+LOG = logging.getLogger(__name__)
+
+
+def error_handler(view_fn):
+  def decorator(*args, **kwargs):
+    try:
+      return view_fn(*args, **kwargs)
+    except Exception, e:
+      LOG.exception(e)
+      response = {
+        'status': -1,
+        'message': force_unicode(e)
+      }
+    return JsonResponse(response, status=500)
+  return decorator
+
+
+@require_POST
+@error_handler
+def get_operation_execution_details(request):
+  response = {'status': -1}
+
+  operation_id = json.loads(request.POST.get('operation_id'))
+
+  client = WorkfloadAnalyticsClient(request.user)
+  data = client.get_operation_execution_details(operation_id=operation_id)
+
+  if data:
+    response['status'] = 0
+    response['data'] = data
+  else:
+    response['message'] = 'Workload Analytics: %s' % data['details']
+
+  return JsonResponse(response)

+ 66 - 0
desktop/libs/metadata/src/metadata/workload_analytics_client.py

@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import logging
+import json
+import subprocess
+
+from django.utils.translation import ugettext as _
+
+from desktop.lib.exceptions_renderable import PopupException
+
+
+LOG = logging.getLogger(__name__)
+
+
+def _exec(args):
+  try:
+    data = subprocess.check_output([
+        'altus',
+        'wa',
+       ] +
+       args
+    )
+  except Exception, e:
+    raise PopupException(e, title=_('Error accessing'))
+
+  response = json.loads(data)
+
+  return response
+
+
+class WorkfloadAnalyticsClient():
+
+  def __init__(self, user):
+    self.user = user
+
+  def get_operation_execution_details(self, operation_id):
+
+    return WorkloadAnalytics(self.user).get_operation_execution_details(operation_id=operation_id, include_tree=True)
+
+
+class WorkloadAnalytics():
+
+  def __init__(self, user): pass
+
+  def get_operation_execution_details(self, operation_id, include_tree=False):
+    args = ['get-operation-execution-details', '--id', operation_id]
+
+    if include_tree:
+      args.append('--include-tree')
+
+    return _exec(args)