mirror of
https://github.com/elastic/kibana.git
synced 2025-04-24 09:48:58 -04:00
Reporting API test expansion and clean up (#18986)
* Update & expand reporting API tests * remove xpack stuff from oss archive * wrap "it"s so they are in expected order. * Update expected recent stats * url was pointing to a visualization not a csv * Move comment around * Merging with changes on master renaming stats to usage * fix reference to old stats file. * bad merge
This commit is contained in:
parent
1cadacd65d
commit
c14f7a72c4
21 changed files with 730 additions and 686 deletions
Binary file not shown.
|
@ -271,4 +271,4 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
||||
* or more contributor license agreements. Licensed under the Elastic License;
|
||||
* you may not use this file except in compliance with the Elastic License.
|
||||
*/
|
||||
|
||||
import * as GenerationUrls from './generation_urls';
|
||||
|
||||
|
||||
/**
|
||||
* This file tests the situation when a reporting index spans releases. By default reporting indexes are created
|
||||
* on a weekly basis, but this is configurable so it is possible a user has this set to yearly. In that event, it
|
||||
* is possible report data is getting posted to an index that was created by a very old version. We don't have a
|
||||
* reporting index migration plan, so this test is important to ensure BWC, or that in the event we decide to make
|
||||
* a major change in a major release, we handle it properly.
|
||||
*/
|
||||
|
||||
export default function ({ getService }) {
|
||||
const esArchiver = getService('esArchiver');
|
||||
const reportingAPI = getService('reportingAPI');
|
||||
const usageAPI = getService('usageAPI');
|
||||
|
||||
describe('BWC report generation into existing indexes', async () => {
|
||||
let expectedCompletedReportCount;
|
||||
let cleanupIndexAlias;
|
||||
|
||||
describe('existing 6_2 index', () => {
|
||||
before('load data and add index alias', async () => {
|
||||
await reportingAPI.deleteAllReportingIndexes();
|
||||
await esArchiver.load('reporting/bwc/6_2');
|
||||
|
||||
// The index name in the 6_2 archive.
|
||||
const ARCHIVED_REPORTING_INDEX = '.reporting-2018.03.11';
|
||||
cleanupIndexAlias = await reportingAPI.coerceReportsIntoExistingIndex(ARCHIVED_REPORTING_INDEX);
|
||||
|
||||
const stats = await usageAPI.getUsageStats();
|
||||
expectedCompletedReportCount = await reportingAPI.getCompletedReportCount(stats);
|
||||
});
|
||||
|
||||
after('remove index alias', async () => {
|
||||
await cleanupIndexAlias();
|
||||
});
|
||||
|
||||
// Might not be great test practice to lump all these jobs together but reporting takes awhile and it'll be
|
||||
// more efficient to post them all up front, then sequentially.
|
||||
it('multiple jobs posted', async () => {
|
||||
const reportPaths = [];
|
||||
reportPaths.push(await reportingAPI.postJob(GenerationUrls.CSV_DISCOVER_KUERY_AND_FILTER_6_3));
|
||||
reportPaths.push(await reportingAPI.postJob(GenerationUrls.PDF_PRESERVE_DASHBOARD_FILTER_6_3));
|
||||
reportPaths.push(await reportingAPI.postJob(GenerationUrls.PDF_PRESERVE_PIE_VISUALIZATION_6_3));
|
||||
reportPaths.push(await reportingAPI.postJob(GenerationUrls.PDF_PRINT_DASHBOARD_6_3));
|
||||
reportPaths.push(await reportingAPI.postJob(
|
||||
GenerationUrls.PDF_PRINT_PIE_VISUALIZATION_FILTER_AND_SAVED_SEARCH_6_3));
|
||||
|
||||
await reportingAPI.expectAllJobsToFinishSuccessfully(reportPaths);
|
||||
}).timeout(1540000);
|
||||
|
||||
it('jobs completed successfully', async () => {
|
||||
const stats = await usageAPI.getUsageStats();
|
||||
expectedCompletedReportCount += 5;
|
||||
reportingAPI.expectCompletedReportCount(stats, expectedCompletedReportCount);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
||||
* or more contributor license agreements. Licensed under the Elastic License;
|
||||
* you may not use this file except in compliance with the Elastic License.
|
||||
*/
|
||||
|
||||
import * as GenerationUrls from './generation_urls';
|
||||
|
||||
export default function ({ getService }) {
|
||||
const reportingAPI = getService('reportingAPI');
|
||||
const usageAPI = getService('usageAPI');
|
||||
|
||||
describe('BWC report generation urls', () => {
|
||||
describe('6_2', () => {
|
||||
before(async () => {
|
||||
await reportingAPI.deleteAllReportingIndexes();
|
||||
});
|
||||
|
||||
// Might not be great test practice to lump all these jobs together but reporting takes awhile and it'll be
|
||||
// more efficient to post them all up front, then sequentially.
|
||||
it('multiple jobs posted', async () => {
|
||||
const reportPaths = [];
|
||||
reportPaths.push(await reportingAPI.postJob(GenerationUrls.PDF_PRINT_DASHBOARD_6_2));
|
||||
reportPaths.push(await reportingAPI.postJob(GenerationUrls.PDF_PRESERVE_VISUALIZATION_6_2));
|
||||
reportPaths.push(await reportingAPI.postJob(GenerationUrls.CSV_DISCOVER_FILTER_QUERY_6_2));
|
||||
|
||||
await reportingAPI.expectAllJobsToFinishSuccessfully(reportPaths);
|
||||
}).timeout(1540000);
|
||||
|
||||
it('jobs completed successfully', async () => {
|
||||
const stats = await usageAPI.getUsageStats();
|
||||
reportingAPI.expectCompletedReportCount(stats, 3);
|
||||
});
|
||||
});
|
||||
|
||||
// 6.3 urls currently being tested as part of the "bwc_existing_indexes" test suite. Reports are time consuming,
|
||||
// don't replicate tests if we don't need to, so no specific 6_3 url tests here.
|
||||
});
|
||||
}
|
|
@ -1,293 +0,0 @@
|
|||
/*
|
||||
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
||||
* or more contributor license agreements. Licensed under the Elastic License;
|
||||
* you may not use this file except in compliance with the Elastic License.
|
||||
*/
|
||||
|
||||
import expect from 'expect.js';
|
||||
import { indexTimestamp } from '../../../../plugins/reporting/server/lib/esqueue/helpers/index_timestamp';
|
||||
|
||||
function removeWhitespace(str) {
|
||||
return str.replace(/\s/g, '');
|
||||
}
|
||||
|
||||
export default function ({ getService }) {
|
||||
const supertest = getService('supertest');
|
||||
const esSupertest = getService('esSupertest');
|
||||
const esArchiver = getService('esArchiver');
|
||||
const log = getService('log');
|
||||
|
||||
async function waitForJobToFinish(downloadReportPath) {
|
||||
const PDF_IS_PENDING_CODE = 503;
|
||||
|
||||
const statusCode = await new Promise(resolve => {
|
||||
const intervalId = setInterval(async () => {
|
||||
|
||||
const response = await supertest
|
||||
.get(downloadReportPath)
|
||||
.responseType('blob')
|
||||
.set('kbn-xsrf', 'xxx');
|
||||
log.debug(`Report at path ${downloadReportPath} returned code ${response.statusCode}`);
|
||||
if (response.statusCode !== PDF_IS_PENDING_CODE) {
|
||||
clearInterval(intervalId);
|
||||
resolve(response.statusCode);
|
||||
}
|
||||
}, 1500);
|
||||
});
|
||||
|
||||
expect(statusCode).to.be(200);
|
||||
}
|
||||
|
||||
describe('generate pdf API', () => {
|
||||
let downloadReportPath;
|
||||
let completedReportCount;
|
||||
|
||||
before('load reporting archive', async () => {
|
||||
await esArchiver.load('reporting/6_2');
|
||||
|
||||
// If we don't include this archive, the report would generate visualizations with no data. It's included
|
||||
// here, even though we can't verify how the visualizations actually look, because the existence of data
|
||||
// means more code paths are tested. Cnsider the bug we ran into when a const keyword remained in an untranspiled
|
||||
// file. It's possible that without data, the flow of control would never have run into that keyword.
|
||||
await esArchiver.load('logstash_functional');
|
||||
|
||||
const { body } = await supertest
|
||||
.get('/api/_kibana/v1/stats')
|
||||
.set('kbn-xsrf', 'xxx')
|
||||
.expect(200);
|
||||
completedReportCount = body.reporting.status.completed;
|
||||
});
|
||||
|
||||
after(async () => {
|
||||
await esArchiver.unload('reporting/6_2');
|
||||
await esArchiver.unload('logstash_functional');
|
||||
});
|
||||
|
||||
describe('with an existing reporting index', async () => {
|
||||
let timestampForIndex;
|
||||
let stats;
|
||||
// The index name in the 6_2 archive.
|
||||
const ARCHIVED_REPORTING_INDEX = '.reporting-2018.03.11';
|
||||
|
||||
// Adding an index alias coerces the report to be generated on an existing index which means any new
|
||||
// index schema won't be applied. This is important if a point release updated the schema. Reports may still
|
||||
// be inserted into an existing index before the new schema is applied.
|
||||
before('add index alias', async () => {
|
||||
timestampForIndex = indexTimestamp('week', '.');
|
||||
await esSupertest
|
||||
.post('/_aliases')
|
||||
.send({
|
||||
actions: [
|
||||
{
|
||||
add: { index: ARCHIVED_REPORTING_INDEX, alias: `.reporting-${timestampForIndex}` }
|
||||
}
|
||||
]
|
||||
})
|
||||
.expect(200);
|
||||
});
|
||||
|
||||
after('remove index alias', async () => {
|
||||
await esSupertest
|
||||
.post('/_aliases')
|
||||
.send({
|
||||
actions: [
|
||||
{
|
||||
remove: { index: ARCHIVED_REPORTING_INDEX, alias: `.reporting-${timestampForIndex}` }
|
||||
}
|
||||
]
|
||||
})
|
||||
.expect(200);
|
||||
});
|
||||
|
||||
it('successfully posts a visualization print layout pdf job url generated from v6.2', async () => {
|
||||
// Grabbed from a report generation url from 6.2
|
||||
const jobParams = removeWhitespace(`
|
||||
(browserTimezone:America%2FNew_York,layout:(id:print),
|
||||
objectType:visualization,queryString:%27_g%3D(refreshInterval:(display:Off,pause:!!f,value:0),
|
||||
time:(from:!%272015-09-19T00:02:06.633Z!%27,interval:auto,mode:absolute,timezone:America%252FNew_York,
|
||||
to:!%272015-09-24T06:40:33.165Z!%27))%26_a%3D(filters:!!(),linked:!!f,query:(language:lucene,query:!%27!%27),
|
||||
uiState:(vis:(defaultColors:(!%270%2B-%2B1!%27:!%27rgb(247,252,245)!%27,!%271%2B-%2B2!%27:!%27rgb(199,233,192)
|
||||
!%27,!%272%2B-%2B3!%27:!%27rgb(116,196,118)!%27,!%273%2B-%2B3!%27:!%27rgb(35,139,69)!%27))),
|
||||
vis:(aggs:!!((enabled:!!t,id:!%271!%27,params:(),schema:metric,type:count),(enabled:!!t,id:!%272!%27,
|
||||
params:(field:bytes,missingBucket:!!f,missingBucketLabel:Missing,order:desc,orderBy:!%271!%27,
|
||||
otherBucket:!!f,otherBucketLabel:Other,size:5),schema:segment,type:terms),(enabled:!!t,id:!%273!%27,
|
||||
params:(field:ip,missingBucket:!!f,missingBucketLabel:Missing,order:desc,orderBy:!%271!%27,
|
||||
otherBucket:!!f,otherBucketLabel:Other,size:5),schema:group,type:terms)),params:(addLegend:!!t,
|
||||
addTooltip:!!t,colorSchema:Greens,colorsNumber:4,colorsRange:!!(),enableHover:!!f,invertColors:!!f,
|
||||
legendPosition:right,percentageMode:!!f,setColorRange:!!f,times:!!(),type:heatmap,
|
||||
valueAxes:!!((id:ValueAxis-1,labels:(color:%2523555,rotate:0,show:!!f),scale:(defaultYExtents:!!f,
|
||||
type:linear),show:!!f,type:value))),title:!%27bytes%2Bheatmap!%27,type:heatmap))%27,
|
||||
savedObjectId:dae7e680-2891-11e8-88fd-5754aa989b85)`);
|
||||
|
||||
const { body } = await supertest
|
||||
.post(`/api/reporting/generate/printablePdf?jobParams=${jobParams}`)
|
||||
.set('kbn-xsrf', 'xxx')
|
||||
.expect(200);
|
||||
downloadReportPath = body.path;
|
||||
});
|
||||
|
||||
it('report completes', async () => {
|
||||
await waitForJobToFinish(downloadReportPath);
|
||||
}).timeout(540000);
|
||||
|
||||
it('successful job marked as completed', async () => {
|
||||
const { body } = await supertest
|
||||
.get(`/api/_kibana/v1/stats`)
|
||||
.set('kbn-xsrf', 'xxx')
|
||||
.expect(200);
|
||||
stats = body;
|
||||
completedReportCount++;
|
||||
expect(stats.reporting.status.completed).to.be(completedReportCount);
|
||||
});
|
||||
|
||||
// These are new stats as of v6.3 so these numbers won't include any of the reports already in the archive. Hence,
|
||||
// these values won't add up to stats.reporting.status.completed.
|
||||
it('1 count for visualize app', async () => {
|
||||
expect(stats.reporting.lastDay.printable_pdf.app.visualization).to.be(1);
|
||||
expect(stats.reporting.last7Days.printable_pdf.app.visualization).to.be(1);
|
||||
expect(stats.reporting.printable_pdf.app.visualization).to.be(1);
|
||||
});
|
||||
|
||||
it('0 counts for dashboard app', async () => {
|
||||
expect(stats.reporting.lastDay.printable_pdf.app.dashboard).to.be(0);
|
||||
expect(stats.reporting.last7Days.printable_pdf.app.dashboard).to.be(0);
|
||||
expect(stats.reporting.printable_pdf.app.dashboard).to.be(0);
|
||||
});
|
||||
|
||||
it('0 counts for preserve layout', async () => {
|
||||
expect(stats.reporting.lastDay.printable_pdf.layout.preserve_layout).to.be(0);
|
||||
expect(stats.reporting.last7Days.printable_pdf.layout.preserve_layout).to.be(0);
|
||||
expect(stats.reporting.printable_pdf.layout.preserve_layout).to.be(0);
|
||||
});
|
||||
|
||||
it('1 count for print layout', async () => {
|
||||
expect(stats.reporting.lastDay.printable_pdf.layout.print).to.be(1);
|
||||
expect(stats.reporting.last7Days.printable_pdf.layout.print).to.be(1);
|
||||
expect(stats.reporting.printable_pdf.layout.print).to.be(1);
|
||||
});
|
||||
|
||||
it('successfully posts a dashboard preview layout pdf job url generated from v6.2', async () => {
|
||||
// Grabbed from a report generation url from 6.2
|
||||
const jobParams = removeWhitespace(`
|
||||
(browserTimezone:America%2FNew_York,layout:(dimensions:(height:656,width:1504),id:preserve_layout),
|
||||
objectType:dashboard,queryString:%27_g%3D(refreshInterval:(display:Off,pause:!!f,value:0),
|
||||
time:(from:!%272015-09-19T00:02:06.633Z!%27,interval:auto,mode:absolute,timezone:America%252FNew_York,
|
||||
to:!%272015-09-24T06:40:33.165Z!%27))%26_a%3D(description:!%27!%27,filters:!!(),fullScreenMode:!!f,
|
||||
options:(darkTheme:!!f,hidePanelTitles:!!f,useMargins:!!t),panels:!!((gridData:(h:3,i:!%271!%27,w:6,x:0,y:0),
|
||||
id:Visualization-PieChart,panelIndex:!%271!%27,type:visualization,version:!%276.2.3!%27),
|
||||
(gridData:(h:3,i:!%272!%27,w:6,x:6,y:0),id:Visualization-MetricChart,panelIndex:!%272!%27,
|
||||
type:visualization,version:!%276.2.3!%27),(gridData:(h:3,i:!%273!%27,w:6,x:0,y:3),
|
||||
id:Visualization%25E2%2598%25BA-VerticalBarChart,panelIndex:!%273!%27,type:visualization,
|
||||
version:!%276.2.3!%27),(gridData:(h:3,i:!%274!%27,w:6,x:6,y:3),id:e495f810-2892-11e8-88fd-5754aa989b85,
|
||||
panelIndex:!%274!%27,type:search,version:!%276.2.3!%27)),query:(language:lucene,query:!%27!%27),
|
||||
timeRestore:!!t,title:!%27Small%2BReporting%2BDashboard!%27,viewMode:view)%27,
|
||||
savedObjectId:%276799db00-2893-11e8-88fd-5754aa989b85%27)`);
|
||||
const { body } = await supertest
|
||||
.post(`/api/reporting/generate/printablePdf?jobParams=${jobParams}`)
|
||||
.set('kbn-xsrf', 'xxx')
|
||||
.expect(200);
|
||||
|
||||
downloadReportPath = body.path;
|
||||
});
|
||||
|
||||
it('report completes', async () => {
|
||||
await waitForJobToFinish(downloadReportPath);
|
||||
}).timeout(540000);
|
||||
|
||||
describe('stats updated', async () => {
|
||||
it('with count of completed reports', async () => {
|
||||
const { body } = await supertest
|
||||
.get(`/api/_kibana/v1/stats`)
|
||||
.set('kbn-xsrf', 'xxx')
|
||||
.expect(200);
|
||||
stats = body;
|
||||
completedReportCount++;
|
||||
expect(stats.reporting.status.completed).to.be(completedReportCount);
|
||||
});
|
||||
|
||||
it('with 1 count for dashboard app', async () => {
|
||||
expect(stats.reporting.lastDay.printable_pdf.app.dashboard).to.be(1);
|
||||
expect(stats.reporting.last7Days.printable_pdf.app.dashboard).to.be(1);
|
||||
expect(stats.reporting.printable_pdf.app.dashboard).to.be(1);
|
||||
});
|
||||
|
||||
it('with 1 count for preserve layout', async () => {
|
||||
expect(stats.reporting.lastDay.printable_pdf.layout.preserve_layout).to.be(1);
|
||||
expect(stats.reporting.last7Days.printable_pdf.layout.preserve_layout).to.be(1);
|
||||
expect(stats.reporting.printable_pdf.layout.preserve_layout).to.be(1);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('with a new reporting index', async () => {
|
||||
let timestampForIndex;
|
||||
let stats;
|
||||
|
||||
before('delete any existing index alias', async () => {
|
||||
timestampForIndex = indexTimestamp('week', '.');
|
||||
await esSupertest
|
||||
.delete(`/.reporting-${timestampForIndex}`);
|
||||
});
|
||||
|
||||
after('delete new reporting indexes', async () => {
|
||||
await esSupertest
|
||||
.delete(`/.reporting-${timestampForIndex}`);
|
||||
});
|
||||
|
||||
it('successfully posts a visualization print layout pdf job url generated from v6.2', async () => {
|
||||
// Grabbed from a report generation url from 6.2
|
||||
const jobParams = removeWhitespace(`
|
||||
(browserTimezone:America%2FNew_York,layout:(id:print),
|
||||
objectType:visualization,queryString:%27_g%3D(refreshInterval:(display:Off,pause:!!f,value:0),
|
||||
time:(from:!%272015-09-19T00:02:06.633Z!%27,interval:auto,mode:absolute,timezone:America%252FNew_York,
|
||||
to:!%272015-09-24T06:40:33.165Z!%27))%26_a%3D(filters:!!(),linked:!!f,query:(language:lucene,query:!%27!%27),
|
||||
uiState:(vis:(defaultColors:(!%270%2B-%2B1!%27:!%27rgb(247,252,245)!%27,!%271%2B-%2B2!%27:!%27rgb(199,233,192)
|
||||
!%27,!%272%2B-%2B3!%27:!%27rgb(116,196,118)!%27,!%273%2B-%2B3!%27:!%27rgb(35,139,69)!%27))),
|
||||
vis:(aggs:!!((enabled:!!t,id:!%271!%27,params:(),schema:metric,type:count),(enabled:!!t,id:!%272!%27,
|
||||
params:(field:bytes,missingBucket:!!f,missingBucketLabel:Missing,order:desc,orderBy:!%271!%27,
|
||||
otherBucket:!!f,otherBucketLabel:Other,size:5),schema:segment,type:terms),(enabled:!!t,id:!%273!%27,
|
||||
params:(field:ip,missingBucket:!!f,missingBucketLabel:Missing,order:desc,orderBy:!%271!%27,
|
||||
otherBucket:!!f,otherBucketLabel:Other,size:5),schema:group,type:terms)),params:(addLegend:!!t,
|
||||
addTooltip:!!t,colorSchema:Greens,colorsNumber:4,colorsRange:!!(),enableHover:!!f,invertColors:!!f,
|
||||
legendPosition:right,percentageMode:!!f,setColorRange:!!f,times:!!(),type:heatmap,
|
||||
valueAxes:!!((id:ValueAxis-1,labels:(color:%2523555,rotate:0,show:!!f),scale:(defaultYExtents:!!f,
|
||||
type:linear),show:!!f,type:value))),title:!%27bytes%2Bheatmap!%27,type:heatmap))%27,
|
||||
savedObjectId:dae7e680-2891-11e8-88fd-5754aa989b85)`);
|
||||
const { body } = await supertest
|
||||
.post(`/api/reporting/generate/printablePdf?jobParams=${jobParams}`)
|
||||
.set('kbn-xsrf', 'xxx')
|
||||
.expect(200);
|
||||
|
||||
downloadReportPath = body.path;
|
||||
});
|
||||
|
||||
it('report completes', async () => {
|
||||
await waitForJobToFinish(downloadReportPath);
|
||||
});
|
||||
|
||||
describe('stats updated', async () => {
|
||||
it('with count of completed reports', async () => {
|
||||
const { body } = await supertest
|
||||
.get(`/api/_kibana/v1/stats`)
|
||||
.set('kbn-xsrf', 'xxx')
|
||||
.expect(200);
|
||||
stats = body;
|
||||
completedReportCount++;
|
||||
expect(stats.reporting.status.completed).to.be(completedReportCount);
|
||||
});
|
||||
|
||||
it('with 2 counts for visualize app', async () => {
|
||||
expect(stats.reporting.lastDay.printable_pdf.app.visualization).to.be(2);
|
||||
expect(stats.reporting.last7Days.printable_pdf.app.visualization).to.be(2);
|
||||
expect(stats.reporting.printable_pdf.app.visualization).to.be(2);
|
||||
});
|
||||
|
||||
it('with 2 counts for print layout', async () => {
|
||||
expect(stats.reporting.lastDay.printable_pdf.layout.print).to.be(2);
|
||||
expect(stats.reporting.last7Days.printable_pdf.layout.print).to.be(2);
|
||||
expect(stats.reporting.printable_pdf.layout.print).to.be(2);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
/*
|
||||
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
||||
* or more contributor license agreements. Licensed under the Elastic License;
|
||||
* you may not use this file except in compliance with the Elastic License.
|
||||
*/
|
||||
|
||||
// These all have the domain name portion stripped out. The api infrastructure assumes it when we post to it anyhow.
|
||||
|
||||
/* eslint-disable max-len */
|
||||
export const PDF_PRINT_DASHBOARD_6_3 = '/api/reporting/generate/printablePdf?jobParams=(browserTimezone:America%2FNew_York,layout:(id:print),objectType:dashboard,relativeUrls:!(%27%2Fapp%2Fkibana%23%2Fdashboard%2F2ae34a60-3dd4-11e8-b2b9-5d5dc1715159%3F_g%3D(refreshInterval:(display:Off,pause:!!f,value:0),time:(from:!%27Mon%2BApr%2B09%2B2018%2B17:56:08%2BGMT-0400!%27,mode:absolute,to:!%27Wed%2BApr%2B11%2B2018%2B17:56:08%2BGMT-0400!%27))%26_a%3D(description:!%27!%27,filters:!!(),fullScreenMode:!!f,options:(darkTheme:!!f,hidePanelTitles:!!f,useMargins:!!t),panels:!!((embeddableConfig:(),gridData:(h:15,i:!%271!%27,w:24,x:0,y:0),id:!%27145ced90-3dcb-11e8-8660-4d65aa086b3c!%27,panelIndex:!%271!%27,type:visualization,version:!%276.3.0!%27),(embeddableConfig:(),gridData:(h:15,i:!%272!%27,w:24,x:24,y:0),id:e2023110-3dcb-11e8-8660-4d65aa086b3c,panelIndex:!%272!%27,type:visualization,version:!%276.3.0!%27)),query:(language:lucene,query:!%27!%27),timeRestore:!!f,title:!%27couple%2Bpanels!%27,viewMode:view)%27),title:%27couple%20panels%27)';
|
||||
export const PDF_PRESERVE_DASHBOARD_FILTER_6_3 = '/api/reporting/generate/printablePdf?jobParams=(browserTimezone:America%2FNew_York,layout:(dimensions:(height:439,width:1362),id:preserve_layout),objectType:dashboard,relativeUrls:!(%27%2Fapp%2Fkibana%23%2Fdashboard%2F61c58ad0-3dd3-11e8-b2b9-5d5dc1715159%3F_g%3D(refreshInterval:(display:Off,pause:!!f,value:0),time:(from:!%27Mon%2BApr%2B09%2B2018%2B17:56:08%2BGMT-0400!%27,mode:absolute,to:!%27Wed%2BApr%2B11%2B2018%2B17:56:08%2BGMT-0400!%27))%26_a%3D(description:!%27!%27,filters:!!((!%27$state!%27:(store:appState),meta:(alias:!!n,disabled:!!f,index:a0f483a0-3dc9-11e8-8660-4d65aa086b3c,key:animal,negate:!!f,params:(query:dog,type:phrase),type:phrase,value:dog),query:(match:(animal:(query:dog,type:phrase))))),fullScreenMode:!!f,options:(darkTheme:!!f,hidePanelTitles:!!f,useMargins:!!t),panels:!!((embeddableConfig:(),gridData:(h:15,i:!%271!%27,w:24,x:0,y:0),id:!%2750643b60-3dd3-11e8-b2b9-5d5dc1715159!%27,panelIndex:!%271!%27,type:visualization,version:!%276.3.0!%27),(embeddableConfig:(),gridData:(h:15,i:!%272!%27,w:24,x:24,y:0),id:a16d1990-3dca-11e8-8660-4d65aa086b3c,panelIndex:!%272!%27,type:search,version:!%276.3.0!%27)),query:(language:lucene,query:!%27!%27),timeRestore:!!t,title:!%27dashboard%2Bwith%2Bfilter!%27,viewMode:view)%27),title:%27dashboard%20with%20filter%27)';
|
||||
export const PDF_PRESERVE_PIE_VISUALIZATION_6_3 = '/api/reporting/generate/printablePdf?jobParams=(browserTimezone:America%2FNew_York,layout:(dimensions:(height:441,width:1002),id:preserve_layout),objectType:visualization,relativeUrls:!(%27%2Fapp%2Fkibana%23%2Fvisualize%2Fedit%2F3fe22200-3dcb-11e8-8660-4d65aa086b3c%3F_g%3D(refreshInterval:(display:Off,pause:!!f,value:0),time:(from:!%27Mon%2BApr%2B09%2B2018%2B17:56:08%2BGMT-0400!%27,mode:absolute,to:!%27Wed%2BApr%2B11%2B2018%2B17:56:08%2BGMT-0400!%27))%26_a%3D(filters:!!(),linked:!!f,query:(language:lucene,query:!%27!%27),uiState:(),vis:(aggs:!!((enabled:!!t,id:!%271!%27,params:(),schema:metric,type:count),(enabled:!!t,id:!%272!%27,params:(field:bytes,missingBucket:!!f,missingBucketLabel:Missing,order:desc,orderBy:!%271!%27,otherBucket:!!f,otherBucketLabel:Other,size:5),schema:segment,type:terms)),params:(addLegend:!!t,addTooltip:!!t,isDonut:!!t,labels:(last_level:!!t,show:!!f,truncate:100,values:!!t),legendPosition:right,type:pie),title:!%27Rendering%2BTest:%2Bpie!%27,type:pie))%27),title:%27Rendering%20Test:%20pie%27)';
|
||||
export const PDF_PRINT_PIE_VISUALIZATION_FILTER_AND_SAVED_SEARCH_6_3 = '/api/reporting/generate/printablePdf?jobParams=(browserTimezone:America%2FNew_York,layout:(id:print),objectType:visualization,relativeUrls:!(%27%2Fapp%2Fkibana%23%2Fvisualize%2Fedit%2Fbefdb6b0-3e59-11e8-9fc3-39e49624228e%3F_g%3D(refreshInterval:(display:Off,pause:!!f,value:0),time:(from:!%27Mon%2BApr%2B09%2B2018%2B17:56:08%2BGMT-0400!%27,mode:absolute,to:!%27Wed%2BApr%2B11%2B2018%2B17:56:08%2BGMT-0400!%27))%26_a%3D(filters:!!((!%27$state!%27:(store:appState),meta:(alias:!!n,disabled:!!f,index:a0f483a0-3dc9-11e8-8660-4d65aa086b3c,key:animal.keyword,negate:!!f,params:(query:dog,type:phrase),type:phrase,value:dog),query:(match:(animal.keyword:(query:dog,type:phrase))))),linked:!!t,query:(language:lucene,query:!%27!%27),uiState:(),vis:(aggs:!!((enabled:!!t,id:!%271!%27,params:(),schema:metric,type:count),(enabled:!!t,id:!%272!%27,params:(field:name.keyword,missingBucket:!!f,missingBucketLabel:Missing,order:desc,orderBy:!%271!%27,otherBucket:!!f,otherBucketLabel:Other,size:5),schema:segment,type:terms)),params:(addLegend:!!t,addTooltip:!!t,isDonut:!!t,labels:(last_level:!!t,show:!!f,truncate:100,values:!!t),legendPosition:right,type:pie),title:!%27Filter%2BTest:%2Banimals:%2Blinked%2Bto%2Bsearch%2Bwith%2Bfilter!%27,type:pie))%27),title:%27Filter%20Test:%20animals:%20linked%20to%20search%20with%20filter%27)';
|
||||
export const CSV_DISCOVER_KUERY_AND_FILTER_6_3 = '/api/reporting/generate/csv?jobParams=(conflictedTypesFields:!(),fields:!(%27@timestamp%27,agent,bytes,clientip),indexPatternId:%270bf35f60-3dc9-11e8-8660-4d65aa086b3c%27,metaFields:!(_source,_id,_type,_index,_score),searchRequest:(body:(_source:(excludes:!(),includes:!(%27@timestamp%27,agent,bytes,clientip)),docvalue_fields:!(%27@timestamp%27),query:(bool:(filter:!((bool:(minimum_should_match:1,should:!((match:(clientip:%2773.14.212.83%27)))))),must:!((range:(bytes:(gte:100,lt:1000))),(range:(%27@timestamp%27:(format:epoch_millis,gte:1369165215770,lte:1526931615770)))),must_not:!(),should:!())),script_fields:(),sort:!((%27@timestamp%27:(order:desc,unmapped_type:boolean))),stored_fields:!(%27@timestamp%27,agent,bytes,clientip),version:!t),index:%27logstash-*%27),title:%27Bytes%20and%20kuery%20in%20saved%20search%20with%20filter%27,type:search)';
|
||||
|
||||
export const PDF_PRINT_DASHBOARD_6_2 = '/api/reporting/generate/printablePdf?jobParams=(browserTimezone:America%2FNew_York,layout:(id:print),objectType:dashboard,queryString:%27_g%3D(refreshInterval:(display:Off,pause:!!f,value:0),time:(from:!%27Mon%2BApr%2B09%2B2018%2B17:56:08%2BGMT-0400!%27,mode:absolute,to:!%27Wed%2BApr%2B11%2B2018%2B17:56:08%2BGMT-0400!%27))%26_a%3D(description:!%27!%27,filters:!!((!%27$state!%27:(store:appState),meta:(alias:!!n,disabled:!!f,field:isDog,index:a0f483a0-3dc9-11e8-8660-4d65aa086b3c,key:isDog,negate:!!f,params:(value:!!t),type:phrase,value:true),script:(script:(inline:!%27boolean%2Bcompare(Supplier%2Bs,%2Bdef%2Bv)%2B%257Breturn%2Bs.get()%2B%253D%253D%2Bv%3B%257Dcompare(()%2B-%253E%2B%257B%2Breturn%2Bdoc%255B!!!%27animal.keyword!!!%27%255D.value%2B%253D%253D%2B!!!%27dog!!!%27%2B%257D,%2Bparams.value)%3B!%27,lang:painless,params:(value:!!t))))),fullScreenMode:!!f,options:(darkTheme:!!f,hidePanelTitles:!!f,useMargins:!!t),panels:!!((gridData:(h:3,i:!%274!%27,w:6,x:6,y:0),id:edb65990-53ca-11e8-b481-c9426d020fcd,panelIndex:!%274!%27,type:visualization,version:!%276.2.4!%27),(gridData:(h:3,i:!%275!%27,w:6,x:0,y:0),id:!%270644f890-53cb-11e8-b481-c9426d020fcd!%27,panelIndex:!%275!%27,type:visualization,version:!%276.2.4!%27)),query:(language:lucene,query:!%27weightLbs:%253E15!%27),timeRestore:!!t,title:!%27Animal%2BWeights%2B(created%2Bin%2B6.2)!%27,viewMode:view)%27,savedObjectId:%271b2f47b0-53cb-11e8-b481-c9426d020fcd%27)';
|
||||
export const PDF_PRESERVE_VISUALIZATION_6_2 = '/api/reporting/generate/printablePdf?jobParams=(browserTimezone:America%2FNew_York,layout:(dimensions:(height:441,width:1002),id:preserve_layout),objectType:visualization,queryString:%27_g%3D(refreshInterval:(display:Off,pause:!!f,value:0),time:(from:!%27Mon%2BApr%2B09%2B2018%2B17:56:08%2BGMT-0400!%27,mode:absolute,to:!%27Wed%2BApr%2B11%2B2018%2B17:56:08%2BGMT-0400!%27))%26_a%3D(filters:!!(),linked:!!f,query:(language:lucene,query:!%27weightLbs:%253E10!%27),uiState:(),vis:(aggs:!!((enabled:!!t,id:!%271!%27,params:(),schema:metric,type:count),(enabled:!!t,id:!%272!%27,params:(field:weightLbs,missingBucket:!!f,missingBucketLabel:Missing,order:desc,orderBy:!%271!%27,otherBucket:!!f,otherBucketLabel:Other,size:5),schema:segment,type:terms)),params:(addLegend:!!t,addTooltip:!!t,isDonut:!!t,labels:(last_level:!!t,show:!!f,truncate:100,values:!!t),legendPosition:right,type:pie),title:!%27Weight%2Bin%2Blbs%2Bpie%2Bcreated%2Bin%2B6.2!%27,type:pie))%27,savedObjectId:%270644f890-53cb-11e8-b481-c9426d020fcd%27)';
|
||||
export const CSV_DISCOVER_FILTER_QUERY_6_2 = '/api/reporting/generate/csv?jobParams=(conflictedTypesFields:!(),fields:!(%27@timestamp%27,animal,sound,weightLbs),indexPatternId:a0f483a0-3dc9-11e8-8660-4d65aa086b3c,metaFields:!(_source,_id,_type,_index,_score),searchRequest:(body:(_source:(excludes:!(),includes:!(%27@timestamp%27,animal,sound,weightLbs)),docvalue_fields:!(%27@timestamp%27),query:(bool:(filter:!(),must:!((query_string:(analyze_wildcard:!t,default_field:%27*%27,query:%27weightLbs:%3E10%27)),(match_phrase:(sound.keyword:(query:growl))),(range:(%27@timestamp%27:(format:epoch_millis,gte:1523310968000,lte:1523483768000)))),must_not:!(),should:!())),script_fields:(),sort:!((%27@timestamp%27:(order:desc,unmapped_type:boolean))),stored_fields:!(%27@timestamp%27,animal,sound,weightLbs),version:!t),index:%27animals-*%27),title:%27Search%20created%20in%206.2%27,type:search)';
|
|
@ -4,8 +4,28 @@
|
|||
* you may not use this file except in compliance with the Elastic License.
|
||||
*/
|
||||
|
||||
export default function ({ loadTestFile }) {
|
||||
export default function ({ loadTestFile, getService }) {
|
||||
const esArchiver = getService('esArchiver');
|
||||
const kibanaServer = getService('kibanaServer');
|
||||
|
||||
describe('reporting', () => {
|
||||
loadTestFile(require.resolve('./generate_pdf'));
|
||||
before(async () => {
|
||||
await esArchiver.load('../../../../test/functional/fixtures/es_archiver/dashboard/current/kibana');
|
||||
await esArchiver.load('../../../../test/functional/fixtures/es_archiver/dashboard/current/data');
|
||||
|
||||
await kibanaServer.uiSettings.update({
|
||||
'dateFormat:tz': 'UTC',
|
||||
'defaultIndex': '0bf35f60-3dc9-11e8-8660-4d65aa086b3c'
|
||||
});
|
||||
});
|
||||
|
||||
after(async () => {
|
||||
await esArchiver.unload('../../../../test/functional/fixtures/es_archiver/dashboard/current/kibana');
|
||||
await esArchiver.unload('../../../../test/functional/fixtures/es_archiver/dashboard/current/data');
|
||||
});
|
||||
|
||||
loadTestFile(require.resolve('./bwc_existing_indexes'));
|
||||
loadTestFile(require.resolve('./bwc_generation_urls'));
|
||||
loadTestFile(require.resolve('./usage'));
|
||||
});
|
||||
}
|
||||
|
|
147
x-pack/test/api_integration/apis/reporting/usage.js
Normal file
147
x-pack/test/api_integration/apis/reporting/usage.js
Normal file
|
@ -0,0 +1,147 @@
|
|||
/*
|
||||
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
||||
* or more contributor license agreements. Licensed under the Elastic License;
|
||||
* you may not use this file except in compliance with the Elastic License.
|
||||
*/
|
||||
|
||||
import expect from 'expect.js';
|
||||
import * as GenerationUrls from "./generation_urls";
|
||||
|
||||
export default function ({ getService }) {
|
||||
const esArchiver = getService('esArchiver');
|
||||
const reportingAPI = getService('reportingAPI');
|
||||
const usageAPI = getService('usageAPI');
|
||||
|
||||
describe('reporting usage', () => {
|
||||
before(async () => {
|
||||
await reportingAPI.deleteAllReportingIndexes();
|
||||
});
|
||||
|
||||
describe('initial usage', () => {
|
||||
let usage;
|
||||
|
||||
before(async () => {
|
||||
usage = await usageAPI.getUsageStats();
|
||||
});
|
||||
|
||||
it('shows reporting as available and enabled', async () => {
|
||||
expect(usage.reporting.available).to.be(true);
|
||||
expect(usage.reporting.enabled).to.be(true);
|
||||
});
|
||||
|
||||
it('is using phantom browser', async () => {
|
||||
expect(usage.reporting.browser_type).to.be('phantom');
|
||||
});
|
||||
|
||||
it('all counts are 0', async () => {
|
||||
reportingAPI.expectRecentPdfAppStats(usage, 'visualization', 0);
|
||||
reportingAPI.expectAllTimePdfAppStats(usage, 'visualization', 0);
|
||||
reportingAPI.expectRecentPdfAppStats(usage, 'dashboard', 0);
|
||||
reportingAPI.expectAllTimePdfAppStats(usage, 'dashboard', 0);
|
||||
reportingAPI.expectRecentPdfLayoutStats(usage, 'preserve_layout', 0);
|
||||
reportingAPI.expectAllTimePdfLayoutStats(usage, 'preserve_layout', 0);
|
||||
reportingAPI.expectAllTimePdfLayoutStats(usage, 'print', 0);
|
||||
reportingAPI.expectRecentPdfLayoutStats(usage, 'print', 0);
|
||||
reportingAPI.expectRecentJobTypeTotalStats(usage, 'csv', 0);
|
||||
reportingAPI.expectAllTimeJobTypeTotalStats(usage, 'csv', 0);
|
||||
reportingAPI.expectRecentJobTypeTotalStats(usage, 'printable_pdf', 0);
|
||||
reportingAPI.expectAllTimeJobTypeTotalStats(usage, 'printable_pdf', 0);
|
||||
});
|
||||
});
|
||||
|
||||
describe('includes usage from reporting indexes', () => {
|
||||
it('generated from 6.2', async () => {
|
||||
await esArchiver.load('reporting/bwc/6_2');
|
||||
const usage = await usageAPI.getUsageStats();
|
||||
|
||||
reportingAPI.expectRecentJobTypeTotalStats(usage, 'csv', 0);
|
||||
reportingAPI.expectRecentJobTypeTotalStats(usage, 'printable_pdf', 0);
|
||||
|
||||
reportingAPI.expectAllTimeJobTypeTotalStats(usage, 'csv', 1);
|
||||
reportingAPI.expectAllTimeJobTypeTotalStats(usage, 'printable_pdf', 7);
|
||||
|
||||
// These statistics weren't tracked until 6.3
|
||||
reportingAPI.expectRecentPdfAppStats(usage, 'visualization', 0);
|
||||
reportingAPI.expectRecentPdfAppStats(usage, 'dashboard', 0);
|
||||
reportingAPI.expectRecentPdfLayoutStats(usage, 'preserve_layout', 0);
|
||||
reportingAPI.expectRecentPdfLayoutStats(usage, 'print', 0);
|
||||
reportingAPI.expectAllTimePdfAppStats(usage, 'visualization', 0);
|
||||
reportingAPI.expectAllTimePdfAppStats(usage, 'dashboard', 0);
|
||||
reportingAPI.expectAllTimePdfLayoutStats(usage, 'preserve_layout', 0);
|
||||
reportingAPI.expectAllTimePdfLayoutStats(usage, 'print', 0);
|
||||
});
|
||||
|
||||
|
||||
it('generated from 6.3', async () => {
|
||||
await esArchiver.load('reporting/bwc/6_3');
|
||||
const usage = await usageAPI.getUsageStats();
|
||||
|
||||
reportingAPI.expectRecentJobTypeTotalStats(usage, 'csv', 0);
|
||||
reportingAPI.expectRecentJobTypeTotalStats(usage, 'printable_pdf', 0);
|
||||
reportingAPI.expectRecentPdfAppStats(usage, 'visualization', 0);
|
||||
reportingAPI.expectRecentPdfAppStats(usage, 'dashboard', 0);
|
||||
reportingAPI.expectRecentPdfLayoutStats(usage, 'preserve_layout', 0);
|
||||
reportingAPI.expectRecentPdfLayoutStats(usage, 'print', 0);
|
||||
|
||||
reportingAPI.expectAllTimeJobTypeTotalStats(usage, 'csv', 3);
|
||||
reportingAPI.expectAllTimeJobTypeTotalStats(usage, 'printable_pdf', 19);
|
||||
reportingAPI.expectAllTimePdfAppStats(usage, 'visualization', 3);
|
||||
reportingAPI.expectAllTimePdfAppStats(usage, 'dashboard', 3);
|
||||
reportingAPI.expectAllTimePdfLayoutStats(usage, 'preserve_layout', 3);
|
||||
reportingAPI.expectAllTimePdfLayoutStats(usage, 'print', 3);
|
||||
});
|
||||
});
|
||||
|
||||
describe('usage updated when new jobs are posted', async () => {
|
||||
it('post jobs', async () => {
|
||||
const reportPaths = [];
|
||||
reportPaths.push(await reportingAPI.postJob(GenerationUrls.CSV_DISCOVER_KUERY_AND_FILTER_6_3));
|
||||
reportPaths.push(await reportingAPI.postJob(GenerationUrls.PDF_PRESERVE_DASHBOARD_FILTER_6_3));
|
||||
reportPaths.push(await reportingAPI.postJob(GenerationUrls.PDF_PRESERVE_PIE_VISUALIZATION_6_3));
|
||||
reportPaths.push(await reportingAPI.postJob(GenerationUrls.PDF_PRINT_DASHBOARD_6_3));
|
||||
reportPaths.push(await reportingAPI.postJob(
|
||||
GenerationUrls.PDF_PRINT_PIE_VISUALIZATION_FILTER_AND_SAVED_SEARCH_6_3));
|
||||
|
||||
await reportingAPI.expectAllJobsToFinishSuccessfully(reportPaths);
|
||||
}).timeout(1540000);
|
||||
|
||||
it('usage updated', async () => {
|
||||
const usage = await usageAPI.getUsageStats();
|
||||
|
||||
reportingAPI.expectRecentPdfAppStats(usage, 'visualization', 2);
|
||||
reportingAPI.expectRecentPdfAppStats(usage, 'dashboard', 2);
|
||||
reportingAPI.expectRecentPdfLayoutStats(usage, 'preserve_layout', 2);
|
||||
reportingAPI.expectRecentPdfLayoutStats(usage, 'print', 2);
|
||||
reportingAPI.expectRecentJobTypeTotalStats(usage, 'csv', 1);
|
||||
reportingAPI.expectRecentJobTypeTotalStats(usage, 'printable_pdf', 4);
|
||||
|
||||
reportingAPI.expectAllTimePdfAppStats(usage, 'visualization', 5);
|
||||
reportingAPI.expectAllTimePdfAppStats(usage, 'dashboard', 5);
|
||||
reportingAPI.expectAllTimePdfLayoutStats(usage, 'preserve_layout', 5);
|
||||
reportingAPI.expectAllTimePdfLayoutStats(usage, 'print', 5);
|
||||
reportingAPI.expectAllTimeJobTypeTotalStats(usage, 'csv', 4);
|
||||
reportingAPI.expectAllTimeJobTypeTotalStats(usage, 'printable_pdf', 23);
|
||||
});
|
||||
});
|
||||
|
||||
describe('deprecated API', () => {
|
||||
it('shows correct stats', async () => {
|
||||
const usage = await usageAPI.getUsageStatsFromDeprecatedPre64Endpoint();
|
||||
|
||||
reportingAPI.expectRecentPdfAppStats(usage, 'visualization', 2);
|
||||
reportingAPI.expectRecentPdfAppStats(usage, 'dashboard', 2);
|
||||
reportingAPI.expectRecentPdfLayoutStats(usage, 'preserve_layout', 2);
|
||||
reportingAPI.expectRecentPdfLayoutStats(usage, 'print', 2);
|
||||
reportingAPI.expectRecentJobTypeTotalStats(usage, 'csv', 1);
|
||||
reportingAPI.expectRecentJobTypeTotalStats(usage, 'printable_pdf', 4);
|
||||
|
||||
reportingAPI.expectAllTimePdfAppStats(usage, 'visualization', 5);
|
||||
reportingAPI.expectAllTimePdfAppStats(usage, 'dashboard', 5);
|
||||
reportingAPI.expectAllTimePdfLayoutStats(usage, 'preserve_layout', 5);
|
||||
reportingAPI.expectAllTimePdfLayoutStats(usage, 'print', 5);
|
||||
reportingAPI.expectAllTimeJobTypeTotalStats(usage, 'csv', 4);
|
||||
reportingAPI.expectAllTimeJobTypeTotalStats(usage, 'printable_pdf', 23);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
|
@ -7,45 +7,29 @@
|
|||
import expect from 'expect.js';
|
||||
|
||||
export default function ({ getService }) {
|
||||
const supertest = getService('supertest');
|
||||
const esArchiver = getService('esArchiver');
|
||||
const usageAPI = getService('usageAPI');
|
||||
|
||||
describe('/api/_xpack/usage', () => {
|
||||
before('load archives', async () => {
|
||||
// Using this archive because it includes reports as well as a range of visualization types.
|
||||
await esArchiver.load('reporting/6_2');
|
||||
// Not really neccessary to have data indexes, but it feels incomplete to leave out, and it is possible that
|
||||
// having data available could potentially interefere with the stats api (unlikely... but possible).
|
||||
await esArchiver.load('logstash_functional');
|
||||
await esArchiver.load('../../../../test/functional/fixtures/es_archiver/dashboard/current/kibana');
|
||||
});
|
||||
|
||||
after(async () => {
|
||||
await esArchiver.unload('reporting/6_2');
|
||||
await esArchiver.unload('logstash_functional');
|
||||
await esArchiver.unload('../../../../test/functional/fixtures/es_archiver/dashboard/current/kibana');
|
||||
});
|
||||
|
||||
|
||||
it('should return xpack usage data', async () => {
|
||||
const { body } = await supertest
|
||||
.get(`/api/_xpack/usage`)
|
||||
.set('kbn-xsrf', 'xxx')
|
||||
.expect(200);
|
||||
const usage = await usageAPI.getUsageStats();
|
||||
|
||||
expect(body.cluster_uuid).to.be.a('string');
|
||||
expect(body.kibana.dashboard.total).to.be(3);
|
||||
expect(body.kibana.visualization.total).to.be(18);
|
||||
expect(body.kibana.search.total).to.be(1);
|
||||
expect(body.kibana.index_pattern.total).to.be(1);
|
||||
expect(body.kibana.timelion_sheet.total).to.be(0);
|
||||
expect(body.kibana.graph_workspace.total).to.be(0);
|
||||
expect(body.reporting.available).to.be(true);
|
||||
expect(body.reporting.enabled).to.be(true);
|
||||
expect(body.reporting.browser_type).to.be('phantom');
|
||||
expect(body.reporting._all).to.be(8);
|
||||
expect(body.reporting.csv.available).to.be(true);
|
||||
expect(body.reporting.csv.total).to.be(1);
|
||||
expect(body.reporting.printable_pdf.available).to.be(true);
|
||||
expect(body.reporting.printable_pdf.total).to.be(7);
|
||||
expect(usage.cluster_uuid).to.be.a('string');
|
||||
expect(usage.kibana.dashboard.total).to.be(26);
|
||||
expect(usage.kibana.visualization.total).to.be(47);
|
||||
expect(usage.kibana.search.total).to.be(5);
|
||||
expect(usage.kibana.index_pattern.total).to.be(3);
|
||||
expect(usage.kibana.timelion_sheet.total).to.be(0);
|
||||
expect(usage.kibana.graph_workspace.total).to.be(0);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
|
@ -4,7 +4,11 @@
|
|||
* you may not use this file except in compliance with the Elastic License.
|
||||
*/
|
||||
|
||||
import { SupertestWithoutAuthProvider } from './services';
|
||||
import {
|
||||
SupertestWithoutAuthProvider,
|
||||
ReportingAPIProvider,
|
||||
UsageAPIProvider,
|
||||
} from './services';
|
||||
|
||||
export default async function ({ readConfigFile }) {
|
||||
|
||||
|
@ -21,6 +25,9 @@ export default async function ({ readConfigFile }) {
|
|||
supertestWithoutAuth: SupertestWithoutAuthProvider,
|
||||
es: kibanaCommonConfig.get('services.es'),
|
||||
esArchiver: kibanaCommonConfig.get('services.esArchiver'),
|
||||
reportingAPI: ReportingAPIProvider,
|
||||
usageAPI: UsageAPIProvider,
|
||||
kibanaServer: kibanaCommonConfig.get('services.kibanaServer'),
|
||||
},
|
||||
esArchiver: xPackFunctionalTestsConfig.get('esArchiver'),
|
||||
junit: {
|
||||
|
|
|
@ -5,3 +5,5 @@
|
|||
*/
|
||||
|
||||
export { SupertestWithoutAuthProvider } from './supertest_without_auth';
|
||||
export { ReportingAPIProvider } from './reporting_api';
|
||||
export { UsageAPIProvider } from './usage_api';
|
||||
|
|
135
x-pack/test/api_integration/services/reporting_api.js
Normal file
135
x-pack/test/api_integration/services/reporting_api.js
Normal file
|
@ -0,0 +1,135 @@
|
|||
/*
|
||||
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
||||
* or more contributor license agreements. Licensed under the Elastic License;
|
||||
* you may not use this file except in compliance with the Elastic License.
|
||||
*/
|
||||
|
||||
import expect from 'expect.js';
|
||||
import { indexTimestamp } from '../../../plugins/reporting/server/lib/esqueue/helpers/index_timestamp';
|
||||
|
||||
function removeWhitespace(str) {
|
||||
return str.replace(/\s/g, '');
|
||||
}
|
||||
|
||||
export function ReportingAPIProvider({ getService }) {
|
||||
const log = getService('log');
|
||||
const supertest = getService('supertest');
|
||||
const esSupertest = getService('esSupertest');
|
||||
|
||||
return {
|
||||
async waitForJobToFinish(downloadReportPath) {
|
||||
log.debug(`Waiting for job to finish: ${downloadReportPath}`);
|
||||
const JOB_IS_PENDING_CODE = 503;
|
||||
|
||||
const statusCode = await new Promise(resolve => {
|
||||
const intervalId = setInterval(async () => {
|
||||
|
||||
const response = await supertest
|
||||
.get(downloadReportPath)
|
||||
.responseType('blob')
|
||||
.set('kbn-xsrf', 'xxx');
|
||||
log.debug(`Report at path ${downloadReportPath} returned code ${response.statusCode}`);
|
||||
if (response.statusCode !== JOB_IS_PENDING_CODE) {
|
||||
clearInterval(intervalId);
|
||||
resolve(response.statusCode);
|
||||
}
|
||||
}, 1500);
|
||||
});
|
||||
|
||||
expect(statusCode).to.be(200);
|
||||
},
|
||||
|
||||
async expectAllJobsToFinishSuccessfully(jobPaths) {
|
||||
await Promise.all(jobPaths.map(async (path) => {
|
||||
await this.waitForJobToFinish(path);
|
||||
}));
|
||||
},
|
||||
|
||||
async postJob(apiPath) {
|
||||
log.debug(`ReportingAPI.postJob(${apiPath})`);
|
||||
const { body } = await supertest
|
||||
.post(removeWhitespace(apiPath))
|
||||
.set('kbn-xsrf', 'xxx')
|
||||
.expect(200);
|
||||
return body.path;
|
||||
},
|
||||
|
||||
/**
|
||||
*
|
||||
* @return {Promise<Function>} A function to call to clean up the index alias that was added.
|
||||
*/
|
||||
async coerceReportsIntoExistingIndex(indexName) {
|
||||
log.debug(`ReportingAPI.coerceReportsIntoExistingIndex(${indexName})`);
|
||||
|
||||
// Adding an index alias coerces the report to be generated on an existing index which means any new
|
||||
// index schema won't be applied. This is important if a point release updated the schema. Reports may still
|
||||
// be inserted into an existing index before the new schema is applied.
|
||||
const timestampForIndex = indexTimestamp('week', '.');
|
||||
await esSupertest
|
||||
.post('/_aliases')
|
||||
.send({
|
||||
actions: [
|
||||
{
|
||||
add: { index: indexName, alias: `.reporting-${timestampForIndex}` }
|
||||
}
|
||||
]
|
||||
})
|
||||
.expect(200);
|
||||
|
||||
return async () => {
|
||||
await esSupertest
|
||||
.post('/_aliases')
|
||||
.send({
|
||||
actions: [
|
||||
{
|
||||
remove: { index: indexName, alias: `.reporting-${timestampForIndex}` }
|
||||
}
|
||||
]
|
||||
})
|
||||
.expect(200);
|
||||
};
|
||||
},
|
||||
|
||||
async deleteAllReportingIndexes() {
|
||||
log.debug('ReportingAPI.deleteAllReportingIndexes');
|
||||
await esSupertest
|
||||
.delete('/.reporting*')
|
||||
.expect(200);
|
||||
},
|
||||
|
||||
expectRecentPdfAppStats(stats, app, count) {
|
||||
expect(stats.reporting.lastDay.printable_pdf.app[app]).to.be(count);
|
||||
expect(stats.reporting.last7Days.printable_pdf.app[app]).to.be(count);
|
||||
},
|
||||
|
||||
expectAllTimePdfAppStats(stats, app, count) {
|
||||
expect(stats.reporting.printable_pdf.app[app]).to.be(count);
|
||||
},
|
||||
|
||||
expectRecentPdfLayoutStats(stats, layout, count) {
|
||||
expect(stats.reporting.lastDay.printable_pdf.layout[layout]).to.be(count);
|
||||
expect(stats.reporting.last7Days.printable_pdf.layout[layout]).to.be(count);
|
||||
},
|
||||
|
||||
expectAllTimePdfLayoutStats(stats, layout, count) {
|
||||
expect(stats.reporting.printable_pdf.layout[layout]).to.be(count);
|
||||
},
|
||||
|
||||
expectRecentJobTypeTotalStats(stats, jobType, count) {
|
||||
expect(stats.reporting.lastDay[jobType].total).to.be(count);
|
||||
expect(stats.reporting.last7Days[jobType].total).to.be(count);
|
||||
},
|
||||
|
||||
expectAllTimeJobTypeTotalStats(stats, jobType, count) {
|
||||
expect(stats.reporting[jobType].total).to.be(count);
|
||||
},
|
||||
|
||||
getCompletedReportCount(stats) {
|
||||
return stats.reporting.status.completed;
|
||||
},
|
||||
|
||||
expectCompletedReportCount(stats, count) {
|
||||
expect(this.getCompletedReportCount(stats)).to.be(count);
|
||||
}
|
||||
};
|
||||
}
|
28
x-pack/test/api_integration/services/usage_api.js
Normal file
28
x-pack/test/api_integration/services/usage_api.js
Normal file
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
||||
* or more contributor license agreements. Licensed under the Elastic License;
|
||||
* you may not use this file except in compliance with the Elastic License.
|
||||
*/
|
||||
|
||||
|
||||
export function UsageAPIProvider({ getService }) {
|
||||
const supertest = getService('supertest');
|
||||
|
||||
return {
|
||||
async getUsageStats() {
|
||||
const { body } = await supertest
|
||||
.get('/api/_xpack/usage')
|
||||
.set('kbn-xsrf', 'xxx')
|
||||
.expect(200);
|
||||
return body;
|
||||
},
|
||||
|
||||
async getUsageStatsFromDeprecatedPre64Endpoint() {
|
||||
const { body } = await supertest
|
||||
.get('/api/_kibana/v1/stats')
|
||||
.set('kbn-xsrf', 'xxx')
|
||||
.expect(200);
|
||||
return body;
|
||||
},
|
||||
};
|
||||
}
|
Binary file not shown.
|
@ -1,362 +0,0 @@
|
|||
{
|
||||
"type": "index",
|
||||
"value": {
|
||||
"index": ".kibana",
|
||||
"settings": {
|
||||
"index": {
|
||||
"number_of_shards": "1",
|
||||
"number_of_replicas": "1"
|
||||
}
|
||||
},
|
||||
"mappings": {
|
||||
"doc": {
|
||||
"properties": {
|
||||
"config": {
|
||||
"dynamic": "true",
|
||||
"properties": {
|
||||
"buildNum": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"defaultIndex": {
|
||||
"type": "text",
|
||||
"fields": {
|
||||
"keyword": {
|
||||
"type": "keyword",
|
||||
"ignore_above": 256
|
||||
}
|
||||
}
|
||||
},
|
||||
"xPackMonitoring:showBanner": {
|
||||
"type": "boolean"
|
||||
}
|
||||
}
|
||||
},
|
||||
"dashboard": {
|
||||
"dynamic": "strict",
|
||||
"properties": {
|
||||
"description": {
|
||||
"type": "text"
|
||||
},
|
||||
"hits": {
|
||||
"type": "integer"
|
||||
},
|
||||
"kibanaSavedObjectMeta": {
|
||||
"properties": {
|
||||
"searchSourceJSON": {
|
||||
"type": "text"
|
||||
}
|
||||
}
|
||||
},
|
||||
"optionsJSON": {
|
||||
"type": "text"
|
||||
},
|
||||
"panelsJSON": {
|
||||
"type": "text"
|
||||
},
|
||||
"refreshInterval": {
|
||||
"properties": {
|
||||
"display": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"pause": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"section": {
|
||||
"type": "integer"
|
||||
},
|
||||
"value": {
|
||||
"type": "integer"
|
||||
}
|
||||
}
|
||||
},
|
||||
"timeFrom": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"timeRestore": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"timeTo": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"title": {
|
||||
"type": "text"
|
||||
},
|
||||
"uiStateJSON": {
|
||||
"type": "text"
|
||||
},
|
||||
"version": {
|
||||
"type": "integer"
|
||||
}
|
||||
}
|
||||
},
|
||||
"graph-workspace": {
|
||||
"dynamic": "strict",
|
||||
"properties": {
|
||||
"description": {
|
||||
"type": "text"
|
||||
},
|
||||
"kibanaSavedObjectMeta": {
|
||||
"properties": {
|
||||
"searchSourceJSON": {
|
||||
"type": "text"
|
||||
}
|
||||
}
|
||||
},
|
||||
"numLinks": {
|
||||
"type": "integer"
|
||||
},
|
||||
"numVertices": {
|
||||
"type": "integer"
|
||||
},
|
||||
"title": {
|
||||
"type": "text"
|
||||
},
|
||||
"version": {
|
||||
"type": "integer"
|
||||
},
|
||||
"wsState": {
|
||||
"type": "text"
|
||||
}
|
||||
}
|
||||
},
|
||||
"index-pattern": {
|
||||
"dynamic": "strict",
|
||||
"properties": {
|
||||
"fieldFormatMap": {
|
||||
"type": "text"
|
||||
},
|
||||
"fields": {
|
||||
"type": "text"
|
||||
},
|
||||
"intervalName": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"notExpandable": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"sourceFilters": {
|
||||
"type": "text"
|
||||
},
|
||||
"timeFieldName": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"title": {
|
||||
"type": "text"
|
||||
}
|
||||
}
|
||||
},
|
||||
"search": {
|
||||
"dynamic": "strict",
|
||||
"properties": {
|
||||
"columns": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"description": {
|
||||
"type": "text"
|
||||
},
|
||||
"hits": {
|
||||
"type": "integer"
|
||||
},
|
||||
"kibanaSavedObjectMeta": {
|
||||
"properties": {
|
||||
"searchSourceJSON": {
|
||||
"type": "text"
|
||||
}
|
||||
}
|
||||
},
|
||||
"sort": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"title": {
|
||||
"type": "text"
|
||||
},
|
||||
"version": {
|
||||
"type": "integer"
|
||||
}
|
||||
}
|
||||
},
|
||||
"server": {
|
||||
"dynamic": "strict",
|
||||
"properties": {
|
||||
"uuid": {
|
||||
"type": "keyword"
|
||||
}
|
||||
}
|
||||
},
|
||||
"timelion-sheet": {
|
||||
"dynamic": "strict",
|
||||
"properties": {
|
||||
"description": {
|
||||
"type": "text"
|
||||
},
|
||||
"hits": {
|
||||
"type": "integer"
|
||||
},
|
||||
"kibanaSavedObjectMeta": {
|
||||
"properties": {
|
||||
"searchSourceJSON": {
|
||||
"type": "text"
|
||||
}
|
||||
}
|
||||
},
|
||||
"timelion_chart_height": {
|
||||
"type": "integer"
|
||||
},
|
||||
"timelion_columns": {
|
||||
"type": "integer"
|
||||
},
|
||||
"timelion_interval": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"timelion_other_interval": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"timelion_rows": {
|
||||
"type": "integer"
|
||||
},
|
||||
"timelion_sheet": {
|
||||
"type": "text"
|
||||
},
|
||||
"title": {
|
||||
"type": "text"
|
||||
},
|
||||
"version": {
|
||||
"type": "integer"
|
||||
}
|
||||
}
|
||||
},
|
||||
"type": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"updated_at": {
|
||||
"type": "date"
|
||||
},
|
||||
"url": {
|
||||
"dynamic": "strict",
|
||||
"properties": {
|
||||
"accessCount": {
|
||||
"type": "long"
|
||||
},
|
||||
"accessDate": {
|
||||
"type": "date"
|
||||
},
|
||||
"createDate": {
|
||||
"type": "date"
|
||||
},
|
||||
"url": {
|
||||
"type": "text",
|
||||
"fields": {
|
||||
"keyword": {
|
||||
"type": "keyword",
|
||||
"ignore_above": 2048
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"visualization": {
|
||||
"dynamic": "strict",
|
||||
"properties": {
|
||||
"description": {
|
||||
"type": "text"
|
||||
},
|
||||
"kibanaSavedObjectMeta": {
|
||||
"properties": {
|
||||
"searchSourceJSON": {
|
||||
"type": "text"
|
||||
}
|
||||
}
|
||||
},
|
||||
"savedSearchId": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"title": {
|
||||
"type": "text"
|
||||
},
|
||||
"uiStateJSON": {
|
||||
"type": "text"
|
||||
},
|
||||
"version": {
|
||||
"type": "integer"
|
||||
},
|
||||
"visState": {
|
||||
"type": "text"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
"type": "index",
|
||||
"value": {
|
||||
"index": ".reporting-2018.03.11",
|
||||
"settings": {
|
||||
"index": {
|
||||
"number_of_shards": "1",
|
||||
"auto_expand_replicas": "0-1",
|
||||
"number_of_replicas": "0"
|
||||
}
|
||||
},
|
||||
"mappings": {
|
||||
"esqueue": {
|
||||
"properties": {
|
||||
"attempts": {
|
||||
"type": "short"
|
||||
},
|
||||
"completed_at": {
|
||||
"type": "date"
|
||||
},
|
||||
"created_at": {
|
||||
"type": "date"
|
||||
},
|
||||
"created_by": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"jobtype": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"max_attempts": {
|
||||
"type": "short"
|
||||
},
|
||||
"output": {
|
||||
"properties": {
|
||||
"content": {
|
||||
"type": "object",
|
||||
"enabled": false
|
||||
},
|
||||
"content_type": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"max_size_reached": {
|
||||
"type": "boolean"
|
||||
}
|
||||
}
|
||||
},
|
||||
"payload": {
|
||||
"type": "object",
|
||||
"enabled": false
|
||||
},
|
||||
"priority": {
|
||||
"type": "byte"
|
||||
},
|
||||
"process_expiration": {
|
||||
"type": "date"
|
||||
},
|
||||
"started_at": {
|
||||
"type": "date"
|
||||
},
|
||||
"status": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"timeout": {
|
||||
"type": "long"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Binary file not shown.
|
@ -0,0 +1,70 @@
|
|||
{
|
||||
"type": "index",
|
||||
"value": {
|
||||
"index": ".reporting-2018.03.11",
|
||||
"settings": {
|
||||
"index": {
|
||||
"number_of_shards": "1",
|
||||
"auto_expand_replicas": "0-1",
|
||||
"number_of_replicas": "0"
|
||||
}
|
||||
},
|
||||
"mappings": {
|
||||
"esqueue": {
|
||||
"properties": {
|
||||
"attempts": {
|
||||
"type": "short"
|
||||
},
|
||||
"completed_at": {
|
||||
"type": "date"
|
||||
},
|
||||
"created_at": {
|
||||
"type": "date"
|
||||
},
|
||||
"created_by": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"jobtype": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"max_attempts": {
|
||||
"type": "short"
|
||||
},
|
||||
"output": {
|
||||
"properties": {
|
||||
"content": {
|
||||
"type": "object",
|
||||
"enabled": false
|
||||
},
|
||||
"content_type": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"max_size_reached": {
|
||||
"type": "boolean"
|
||||
}
|
||||
}
|
||||
},
|
||||
"payload": {
|
||||
"type": "object",
|
||||
"enabled": false
|
||||
},
|
||||
"priority": {
|
||||
"type": "byte"
|
||||
},
|
||||
"process_expiration": {
|
||||
"type": "date"
|
||||
},
|
||||
"started_at": {
|
||||
"type": "date"
|
||||
},
|
||||
"status": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"timeout": {
|
||||
"type": "long"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Binary file not shown.
|
@ -0,0 +1,92 @@
|
|||
{
|
||||
"type": "index",
|
||||
"value": {
|
||||
"index": ".reporting-2018.05.06",
|
||||
"settings": {
|
||||
"index": {
|
||||
"number_of_shards": "1",
|
||||
"auto_expand_replicas": "0-1",
|
||||
"number_of_replicas": "0"
|
||||
}
|
||||
},
|
||||
"mappings": {
|
||||
"esqueue": {
|
||||
"properties": {
|
||||
"attempts": {
|
||||
"type": "short"
|
||||
},
|
||||
"completed_at": {
|
||||
"type": "date"
|
||||
},
|
||||
"created_at": {
|
||||
"type": "date"
|
||||
},
|
||||
"created_by": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"jobtype": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"max_attempts": {
|
||||
"type": "short"
|
||||
},
|
||||
"meta": {
|
||||
"properties": {
|
||||
"layout": {
|
||||
"type": "text",
|
||||
"fields": {
|
||||
"keyword": {
|
||||
"type": "keyword",
|
||||
"ignore_above": 256
|
||||
}
|
||||
}
|
||||
},
|
||||
"objectType": {
|
||||
"type": "text",
|
||||
"fields": {
|
||||
"keyword": {
|
||||
"type": "keyword",
|
||||
"ignore_above": 256
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"output": {
|
||||
"properties": {
|
||||
"content": {
|
||||
"type": "object",
|
||||
"enabled": false
|
||||
},
|
||||
"content_type": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"max_size_reached": {
|
||||
"type": "boolean"
|
||||
}
|
||||
}
|
||||
},
|
||||
"payload": {
|
||||
"type": "object",
|
||||
"enabled": false
|
||||
},
|
||||
"priority": {
|
||||
"type": "byte"
|
||||
},
|
||||
"process_expiration": {
|
||||
"type": "date"
|
||||
},
|
||||
"started_at": {
|
||||
"type": "date"
|
||||
},
|
||||
"status": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"timeout": {
|
||||
"type": "long"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Binary file not shown.
|
@ -0,0 +1,92 @@
|
|||
{
|
||||
"type": "index",
|
||||
"value": {
|
||||
"index": ".reporting-2018.05.06",
|
||||
"settings": {
|
||||
"index": {
|
||||
"number_of_shards": "1",
|
||||
"auto_expand_replicas": "0-1",
|
||||
"number_of_replicas": "0"
|
||||
}
|
||||
},
|
||||
"mappings": {
|
||||
"esqueue": {
|
||||
"properties": {
|
||||
"attempts": {
|
||||
"type": "short"
|
||||
},
|
||||
"completed_at": {
|
||||
"type": "date"
|
||||
},
|
||||
"created_at": {
|
||||
"type": "date"
|
||||
},
|
||||
"created_by": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"jobtype": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"max_attempts": {
|
||||
"type": "short"
|
||||
},
|
||||
"meta": {
|
||||
"properties": {
|
||||
"layout": {
|
||||
"type": "text",
|
||||
"fields": {
|
||||
"keyword": {
|
||||
"type": "keyword",
|
||||
"ignore_above": 256
|
||||
}
|
||||
}
|
||||
},
|
||||
"objectType": {
|
||||
"type": "text",
|
||||
"fields": {
|
||||
"keyword": {
|
||||
"type": "keyword",
|
||||
"ignore_above": 256
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"output": {
|
||||
"properties": {
|
||||
"content": {
|
||||
"type": "object",
|
||||
"enabled": false
|
||||
},
|
||||
"content_type": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"max_size_reached": {
|
||||
"type": "boolean"
|
||||
}
|
||||
}
|
||||
},
|
||||
"payload": {
|
||||
"type": "object",
|
||||
"enabled": false
|
||||
},
|
||||
"priority": {
|
||||
"type": "byte"
|
||||
},
|
||||
"process_expiration": {
|
||||
"type": "date"
|
||||
},
|
||||
"started_at": {
|
||||
"type": "date"
|
||||
},
|
||||
"status": {
|
||||
"type": "keyword"
|
||||
},
|
||||
"timeout": {
|
||||
"type": "long"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue