diff --git a/public/app/panels/table/editor.html b/public/app/panels/table/editor.html
index 27bf9002d56..b3632c96d19 100644
--- a/public/app/panels/table/editor.html
+++ b/public/app/panels/table/editor.html
@@ -158,7 +158,7 @@
diff --git a/public/app/panels/table/specs/transformers_specs.ts b/public/app/panels/table/specs/transformers_specs.ts
index 6e22e176e66..bb42b997d33 100644
--- a/public/app/panels/table/specs/transformers_specs.ts
+++ b/public/app/panels/table/specs/transformers_specs.ts
@@ -1,6 +1,7 @@
import {describe, beforeEach, it, sinon, expect} from 'test/lib/common';
import {TableModel} from '../table_model';
+import {transformers} from '../transformers';
describe('when transforming time series table', () => {
var table;
@@ -100,7 +101,11 @@ describe('when transforming time series table', () => {
describe('JSON Data', () => {
var panel = {
transform: 'json',
- columns: [{text: 'Timestamp', value: 'timestamp'}, {text: 'Message', value: 'message'}]
+ columns: [
+ {text: 'Timestamp', value: 'timestamp'},
+ {text: 'Message', value: 'message'},
+ {text: 'nested.level2', value: 'nested.level2'},
+ ]
};
var rawData = [
{
@@ -108,26 +113,42 @@ describe('when transforming time series table', () => {
datapoints: [
{
timestamp: 'time',
- message: 'message'
+ message: 'message',
+ nested: {
+ level2: 'level2-value'
+ }
}
]
}
];
- beforeEach(() => {
- table = TableModel.transform(rawData, panel);
- });
-
- it ('should return 2 columns', () => {
- expect(table.columns.length).to.be(2);
- expect(table.columns[0].text).to.be('Timestamp');
- expect(table.columns[1].text).to.be('Message');
- });
-
- it ('should return 2 rows', () => {
- expect(table.rows.length).to.be(1);
- expect(table.rows[0][0]).to.be('time');
- expect(table.rows[0][1]).to.be('message');
+ describe('getColumns', function() {
+ it('should return nested properties', function() {
+ var columns = transformers['json'].getColumns(rawData);
+ expect(columns[0].text).to.be('timestamp');
+ expect(columns[1].text).to.be('message');
+ expect(columns[2].text).to.be('nested.level2');
+ });
+ });
+
+ describe('transform', function() {
+ beforeEach(() => {
+ table = TableModel.transform(rawData, panel);
+ });
+
+ it ('should return 2 columns', () => {
+ expect(table.columns.length).to.be(3);
+ expect(table.columns[0].text).to.be('Timestamp');
+ expect(table.columns[1].text).to.be('Message');
+ expect(table.columns[2].text).to.be('nested.level2');
+ });
+
+ it ('should return 2 rows', () => {
+ expect(table.rows.length).to.be(1);
+ expect(table.rows[0][0]).to.be('time');
+ expect(table.rows[0][1]).to.be('message');
+ expect(table.rows[0][2]).to.be('level2-value');
+ });
});
});
diff --git a/public/app/panels/table/transformers.ts b/public/app/panels/table/transformers.ts
index 1a5482693e7..a4d0d4395c5 100644
--- a/public/app/panels/table/transformers.ts
+++ b/public/app/panels/table/transformers.ts
@@ -2,6 +2,7 @@
import moment = require('moment');
import _ = require('lodash');
+import flatten = require('app/core/utils/flatten');
import TimeSeries = require('app/core/time_series');
var transformers = {};
@@ -149,9 +150,12 @@ transformers['json'] = {
continue;
}
- for (var y = 0; y < series.datapoints.length; y++) {
+ // only look at 100 docs
+ var maxDocs = Math.min(series.datapoints.length, 100);
+ for (var y = 0; y < maxDocs; y++) {
var doc = series.datapoints[y];
- for (var propName in doc) {
+ var flattened = flatten(doc, null);
+ for (var propName in flattened) {
names[propName] = true;
}
}
@@ -177,13 +181,16 @@ transformers['json'] = {
for (y = 0; y < series.datapoints.length; y++) {
var dp = series.datapoints[y];
var values = [];
- for (z = 0; z < panel.columns.length; z++) {
- values.push(dp[panel.columns[z].value]);
- }
- if (values.length === 0) {
+ if (_.isObject(dp) && panel.columns.length > 0) {
+ var flattened = flatten(dp, null);
+ for (z = 0; z < panel.columns.length; z++) {
+ values.push(flattened[panel.columns[z].value]);
+ }
+ } else {
values.push(JSON.stringify(dp));
}
+
model.rows.push(values);
}
}