Adding query time

This commit is contained in:
Maxime 2015-08-07 23:25:19 +00:00
parent 055d760d64
commit b4e76236a7
3 changed files with 52 additions and 28 deletions

View File

@ -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))

View File

@ -16,6 +16,10 @@ form div.form-control {
form input.form-control {
margin-bottom: 5px !important;
}
.tooltip-inner {
max-width: 350px;
//width: 350px;
}
</style>
{% endblock %}
{% block content_fluid %}
@ -71,7 +75,12 @@ form input.form-control {
</div>
<div class="col-md-9">
<h3>{{ viz.verbose_name }}</h3>
<h3>{{ viz.verbose_name }}
<span class="label label-success">{{ "{0:0.2f}".format(results.duration.total_seconds()) }} s</span>
<span class="label label-info" data-html="true"
title="<code><pre>{{ results.query }}</pre></code>"
data-toggle="tooltip" data-placement="bottom" >query</span>
</h3>
<hr/>
{% block viz %}
{% endblock %}

View File

@ -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"