diff --git a/TODO.md b/TODO.md index cc31f88ea..e50919cdf 100644 --- a/TODO.md +++ b/TODO.md @@ -1,3 +1,2 @@ # TODO * Multi-filters -* multi-metrics diff --git a/app/templates/panoramix/datasource.html b/app/templates/panoramix/datasource.html index fc685df53..464f25615 100644 --- a/app/templates/panoramix/datasource.html +++ b/app/templates/panoramix/datasource.html @@ -19,7 +19,7 @@
{{ form.viz_type.label }}: {{ form.viz_type(class_="form-control select2") }}
-
{{ form.metric.label }}: {{ form.metric(class_="form-control select2") }}
+
{{ form.metrics.label }}: {{ form.metrics(class_="form-control select2") }}
{{ form.granularity.label }}: {{ form.granularity(class_="form-control select2_free_granularity") }}
diff --git a/app/views.py b/app/views.py index 02ac4b59a..a06097221 100644 --- a/app/views.py +++ b/app/views.py @@ -41,7 +41,7 @@ def form_factory(datasource, form_args=None): viz_type = SelectField( 'Viz', choices=[(k, v.verbose_name) for k, v in viz.viz_types.items()]) - metric = SelectField('Metric', choices=datasource.metrics_combo) + metrics = SelectMultipleField('Metrics', choices=datasource.metrics_combo) groupby = SelectMultipleField( 'Group by', choices=[ (s, s) for s in datasource.groupby_column_names]) diff --git a/app/viz.py b/app/viz.py index b8d4ec3f1..2bf37c28f 100644 --- a/app/viz.py +++ b/app/viz.py @@ -23,7 +23,9 @@ class BaseViz(object): self.datasource = datasource self.form_class = form_class self.form_data = form_data - self.metric = form_data.get('metric', 'count') + self.metrics = form_data.getlist('metrics') or ['count'] + self.groupby = form_data.getlist('groupby') or [] + self.df = self.bake_query() self.view = view if self.df is not None: @@ -70,7 +72,7 @@ class BaseViz(object): granularity = utils.parse_human_timedelta(granularity).total_seconds() * 1000 aggregations = { m.metric_name: m.json_obj - for m in ds.metrics if m.metric_name == self.metric + for m in ds.metrics if m.metric_name in self.metrics } limit = int( args.get("limit", config.ROW_LIMIT)) or config.ROW_LIMIT @@ -94,7 +96,7 @@ class BaseViz(object): "type": "default", "limit": limit, "columns": [{ - "dimension": self.metric, + "dimension": self.metrics[0], "direction": "descending", }], }, @@ -156,13 +158,12 @@ class TimeSeriesViz(HighchartsViz): chart_kind = "line" def render(self): - metric = self.metric + metrics = self.metrics df = self.df df = df.pivot_table( index="timestamp", - columns=[ - col for col in df.columns if col not in ["timestamp", metric]], - values=[metric]) + columns=self.groupby, + values=metrics) chart_js = serialize( df, kind=self.chart_kind, stacked=self.stacked, **CHART_ARGS) @@ -226,13 +227,11 @@ class DistributionBarViz(HighchartsViz): return d def render(self): - metric = self.metric df = self.df df = df.pivot_table( - index=[ - col for col in df.columns if col not in ['timestamp', metric]], - values=[metric]) - df = df.sort(metric, ascending=False) + index=self.groupby, + values=self.metrics) + df = df.sort(self.metrics[0], ascending=False) chart_js = serialize( df, kind=self.chart_kind, **CHART_ARGS) return super(DistributionBarViz, self).render(chart_js=chart_js) @@ -248,13 +247,11 @@ class DistributionPieViz(HighchartsViz): return d def render(self): - metric = self.metric df = self.df df = df.pivot_table( - index=[ - col for col in df.columns if col not in ['timestamp', metric]], - values=[metric]) - df = df.sort(metric, ascending=False) + index=self.groupby, + values=[self.metrics[0]]) + df = df.sort(self.metrics[0], ascending=False) chart_js = serialize( df, kind=self.chart_kind, **CHART_ARGS) return super(DistributionPieViz, self).render(chart_js=chart_js)