From b4e76236a754a267d3e409fca03ff62655b7ed4a Mon Sep 17 00:00:00 2001 From: Maxime Date: Fri, 7 Aug 2015 23:25:19 +0000 Subject: [PATCH] Adding query time --- app/models.py | 62 +++++++++++++++---------- app/templates/panoramix/datasource.html | 11 ++++- app/viz.py | 7 +-- 3 files changed, 52 insertions(+), 28 deletions(-) diff --git a/app/models.py b/app/models.py index 81b9803155e..8ffdca798ef 100644 --- a/app/models.py +++ b/app/models.py @@ -10,12 +10,18 @@ from pydruid import client from pydruid.utils.filters import Dimension, Filter from copy import deepcopy, copy +from collections import namedtuple +from datetime import datetime import logging import json import requests +import textwrap from app import db, get_session +QueryResult = namedtuple('namedtuple', ['df', 'query', 'duration']) + + class Queryable(object): @property def column_names(self): @@ -84,6 +90,7 @@ class Table(Model, Queryable, AuditMixin): is_timeseries=True, timeseries_limit=15, row_limit=None): from pandas import read_sql_query + qry_start_dttm = datetime.now() metrics_exprs = [ "{} AS {}".format(m.expression, m.metric_name) for m in self.metrics if m.metric_name in metrics] @@ -128,33 +135,36 @@ class Table(Model, Queryable, AuditMixin): if timeseries_limit and groupby: inner_select = ", ".join(["{g} as __{g}".format(g=g) for g in inner_groupby_exprs]) inner_groupby_exprs = ", ".join(inner_groupby_exprs) - limiting_join = """ - JOIN ( - SELECT {inner_select} - FROM {self.table_name} - WHERE - {where_clause} - GROUP BY {inner_groupby_exprs} - ORDER BY {main_metric_expr} DESC - LIMIT {timeseries_limit} - ) z ON {on_clause} - """.format(**locals()) + limiting_join = ( + "JOIN ( \n" + " SELECT {inner_select} \n" + " FROM {self.table_name} \n" + " WHERE \n" + " {where_clause}\n" + " GROUP BY {inner_groupby_exprs}\n" + " ORDER BY {main_metric_expr} DESC\n" + " LIMIT {timeseries_limit}\n" + ") z ON {on_clause}\n" + ).format(**locals()) - sql = """ - SELECT - {select_exprs} - FROM {self.table_name} - {limiting_join} - WHERE - {where_clause} - GROUP BY - {groupby_exprs} - """.format(**locals()) + sql = ( + "SELECT\n" + " {select_exprs}\n" + "FROM {self.table_name}\n" + "{limiting_join}\n" + "WHERE\n" + " {where_clause}\n" + "GROUP BY\n" + " {groupby_exprs}\n" + ).format(**locals()) df = read_sql_query( sql=sql, con=self.database.get_sqla_engine() ) - return df + textwrap.dedent(sql) + + return QueryResult( + df=df, duration=datetime.now() - qry_start_dttm, query=sql) def fetch_metadata(self): @@ -180,6 +190,7 @@ class Table(Model, Queryable, AuditMixin): db.session.commit() + class SqlMetric(Model, AuditMixin): __tablename__ = 'sql_metrics' id = Column(Integer, primary_key=True) @@ -337,6 +348,7 @@ class Datasource(Model, AuditMixin, Queryable): filter=None, is_timeseries=True, timeseries_limit=15, row_limit=None): + qry_start_dttm = datetime.now() aggregations = { m.metric_name: m.json_obj @@ -424,10 +436,12 @@ class Datasource(Model, AuditMixin, Queryable): client.groupby(**qry) df = client.export_pandas() - return df + return QueryResult( + df=df, query="", duration=datetime.now() - qry_start_dttm) -class Metric(Model, AuditMixin): +#class Metric(Model, AuditMixin): +class Metric(Model): __tablename__ = 'metrics' id = Column(Integer, primary_key=True) metric_name = Column(String(512)) diff --git a/app/templates/panoramix/datasource.html b/app/templates/panoramix/datasource.html index 599d80efb42..217c9e7bf82 100644 --- a/app/templates/panoramix/datasource.html +++ b/app/templates/panoramix/datasource.html @@ -16,6 +16,10 @@ form div.form-control { form input.form-control { margin-bottom: 5px !important; } +.tooltip-inner { + max-width: 350px; + //width: 350px; +} {% endblock %} {% block content_fluid %} @@ -71,7 +75,12 @@ form input.form-control {
-

{{ viz.verbose_name }}

+

{{ viz.verbose_name }} + {{ "{0:0.2f}".format(results.duration.total_seconds()) }} s + query +


{% block viz %} {% endblock %} diff --git a/app/viz.py b/app/viz.py index 42c9570b471..20088b19e10 100644 --- a/app/viz.py +++ b/app/viz.py @@ -77,7 +77,8 @@ class BaseViz(object): self.metrics = form_data.getlist('metrics') or ['count'] self.groupby = form_data.getlist('groupby') or [] - self.df = self.bake_query() + self.results = self.bake_query() + self.df = self.results.df self.view = view if self.df is not None: if 'timestamp' in self.df.columns: @@ -147,6 +148,7 @@ class BaseViz(object): form = self.form_class(self.form_data) return self.view.render_template( self.template, form=form, viz=self, datasource=self.datasource, + results=self.results, *args, **kwargs) @@ -225,8 +227,7 @@ class TimeSeriesViz(HighchartsViz): """ Doing a 2 phase query where we limit the number of series. """ - qry = self.query_obj() - return self.datasource.query(**qry) + return self.datasource.query(**self.query_obj()) class TimeSeriesCompareViz(TimeSeriesViz): verbose_name = "Time Series - Percent Change"