[APM] Use apm_8.0.0 archive where possible (#77450)

This commit is contained in:
Dario Gieselaar 2020-09-15 14:42:11 +02:00 committed by GitHub
parent ba4d4a9fc2
commit d190a2a2e3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
22 changed files with 6826 additions and 8371 deletions

View file

@ -10,6 +10,8 @@ export default function ApiTest({ getService }: FtrProviderContext) {
const supertest = getService('supertest');
const esArchiver = getService('esArchiver');
const archiveName = 'apm_8.0.0';
describe('Has data', () => {
describe('when data is not loaded', () => {
it('returns false when there is no data', async () => {
@ -28,8 +30,8 @@ export default function ApiTest({ getService }: FtrProviderContext) {
});
});
describe('when data is loaded', () => {
before(() => esArchiver.load('8.0.0'));
after(() => esArchiver.unload('8.0.0'));
before(() => esArchiver.load(archiveName));
after(() => esArchiver.unload(archiveName));
it('returns true when there is at least one document on transaction, error or metrics indices', async () => {
const response = await supertest.get('/api/apm/observability_overview/has_data');

View file

@ -4,6 +4,7 @@
* you may not use this file except in compliance with the Elastic License.
*/
import expect from '@kbn/expect';
import archives_metadata from '../../../common/archives_metadata';
import { expectSnapshot } from '../../../common/match_snapshot';
import { FtrProviderContext } from '../../../common/ftr_provider_context';
@ -11,9 +12,12 @@ export default function ApiTest({ getService }: FtrProviderContext) {
const supertest = getService('supertest');
const esArchiver = getService('esArchiver');
const archiveName = 'apm_8.0.0';
const metadata = archives_metadata[archiveName];
// url parameters
const start = encodeURIComponent('2020-06-29T06:00:00.000Z');
const end = encodeURIComponent('2020-06-29T10:00:00.000Z');
const start = encodeURIComponent(metadata.start);
const end = encodeURIComponent(metadata.end);
const bucketSize = '60s';
describe('Observability overview', () => {
@ -23,37 +27,58 @@ export default function ApiTest({ getService }: FtrProviderContext) {
`/api/apm/observability_overview?start=${start}&end=${end}&bucketSize=${bucketSize}`
);
expect(response.status).to.be(200);
expectSnapshot(response.body).toMatchInline(`
Object {
"serviceCount": 0,
"transactionCoordinates": Array [],
}
`);
expect(response.body.serviceCount).to.be(0);
expect(response.body.transactionCoordinates.length).to.be(0);
});
});
describe('when data is loaded', () => {
before(() => esArchiver.load('8.0.0'));
after(() => esArchiver.unload('8.0.0'));
before(() => esArchiver.load(archiveName));
after(() => esArchiver.unload(archiveName));
it('returns the service count and transaction coordinates', async () => {
const response = await supertest.get(
`/api/apm/observability_overview?start=${start}&end=${end}&bucketSize=${bucketSize}`
);
expect(response.status).to.be(200);
expectSnapshot(response.body).toMatchInline(`
Object {
"serviceCount": 3,
"transactionCoordinates": Array [
Object {
"x": 1593413220000,
"y": 0.016666666666666666,
},
Object {
"x": 1593413280000,
"y": 1.0458333333333334,
},
],
}
expect(response.body.serviceCount).to.be.greaterThan(0);
expect(response.body.transactionCoordinates.length).to.be.greaterThan(0);
expectSnapshot(response.body.serviceCount).toMatchInline(`7`);
expectSnapshot(response.body.transactionCoordinates.length).toMatchInline(`60`);
expectSnapshot(
response.body.transactionCoordinates
.slice(0, 5)
.map(({ x, y }: { x: number; y: number }) => ({
x: new Date(x).toISOString(),
y,
}))
).toMatchInline(`
Array [
Object {
"x": "2020-09-10T06:00:00.000Z",
"y": 1.2166666666666666,
},
Object {
"x": "2020-09-10T06:01:00.000Z",
"y": 0.5,
},
Object {
"x": "2020-09-10T06:02:00.000Z",
"y": 1.0333333333333334,
},
Object {
"x": "2020-09-10T06:03:00.000Z",
"y": 0.55,
},
Object {
"x": "2020-09-10T06:04:00.000Z",
"y": 1.15,
},
]
`);
});
});

View file

@ -5,22 +5,28 @@
*/
import expect from '@kbn/expect';
import { expectSnapshot } from '../../../common/match_snapshot';
import archives_metadata from '../../../common/archives_metadata';
import { FtrProviderContext } from '../../../common/ftr_provider_context';
export default function serviceMapsApiTests({ getService }: FtrProviderContext) {
const supertest = getService('supertest');
const archiveName = 'apm_8.0.0';
const metadata = archives_metadata[archiveName];
// url parameters
const start = encodeURIComponent('2020-06-29T06:45:00.000Z');
const end = encodeURIComponent('2020-06-29T06:49:00.000Z');
const start = encodeURIComponent(metadata.start);
const end = encodeURIComponent(metadata.end);
describe('Service Maps', () => {
it('is only be available to users with Platinum license (or higher)', async () => {
const response = await supertest.get(`/api/apm/service-map?start=${start}&end=${end}`);
expect(response.status).to.be(403);
expect(response.body.message).to.be(
"In order to access Service Maps, you must be subscribed to an Elastic Platinum license. With it, you'll have the ability to visualize your entire application stack along with your APM data."
expectSnapshot(response.body.message).toMatchInline(
`"In order to access Service Maps, you must be subscribed to an Elastic Platinum license. With it, you'll have the ability to visualize your entire application stack along with your APM data."`
);
});
});

View file

@ -39,6 +39,7 @@ export default function ApiTest({ getService }: FtrProviderContext) {
);
expect(response.status).to.be(200);
expect(response.body).to.eql({ agentName: 'nodejs' });
});
});

View file

@ -33,7 +33,9 @@ export default function ApiTest({ getService }: FtrProviderContext) {
);
expect(response.status).to.be(200);
expect(response.body).to.eql({ hasHistoricalData: false, hasLegacyData: false, items: [] });
expect(response.body.hasHistoricalData).to.be(false);
expect(response.body.hasLegacyData).to.be(false);
expect(response.body.items.length).to.be(0);
});
});

View file

@ -5,6 +5,7 @@
*/
import expect from '@kbn/expect';
import archives_metadata from '../../../common/archives_metadata';
import { expectSnapshot } from '../../../common/match_snapshot';
import { FtrProviderContext } from '../../../../common/ftr_provider_context';
@ -12,9 +13,12 @@ export default function ApiTest({ getService }: FtrProviderContext) {
const supertest = getService('supertest');
const esArchiver = getService('esArchiver');
const archiveName = 'apm_8.0.0';
const metadata = archives_metadata[archiveName];
// url parameters
const start = encodeURIComponent('2020-06-29T06:45:00.000Z');
const end = encodeURIComponent('2020-06-29T06:49:00.000Z');
const start = encodeURIComponent(metadata.start);
const end = encodeURIComponent(metadata.end);
describe('Transaction types', () => {
describe('when data is not loaded ', () => {
@ -30,8 +34,8 @@ export default function ApiTest({ getService }: FtrProviderContext) {
});
describe('when data is loaded', () => {
before(() => esArchiver.load('8.0.0'));
after(() => esArchiver.unload('8.0.0'));
before(() => esArchiver.load(archiveName));
after(() => esArchiver.unload(archiveName));
it('handles empty state', async () => {
const response = await supertest.get(
@ -39,11 +43,13 @@ export default function ApiTest({ getService }: FtrProviderContext) {
);
expect(response.status).to.be(200);
expect(response.body.transactionTypes.length).to.be.greaterThan(0);
expectSnapshot(response.body).toMatchInline(`
Object {
"transactionTypes": Array [
"request",
"Worker",
"request",
],
}
`);

View file

@ -6,6 +6,7 @@
import expect from '@kbn/expect';
import { omit, orderBy } from 'lodash';
import { expectSnapshot } from '../../../common/match_snapshot';
import { AgentConfigurationIntake } from '../../../../../plugins/apm/common/agent_configuration/configuration_types';
import { AgentConfigSearchParams } from '../../../../../plugins/apm/server/routes/settings/agent_configuration';
import { FtrProviderContext } from '../../../common/ftr_provider_context';
@ -16,6 +17,8 @@ export default function agentConfigurationTests({ getService }: FtrProviderConte
const log = getService('log');
const esArchiver = getService('esArchiver');
const archiveName = 'apm_8.0.0';
function getServices() {
return supertestRead
.get(`/api/apm/settings/agent-configuration/services`)
@ -125,31 +128,46 @@ export default function agentConfigurationTests({ getService }: FtrProviderConte
});
describe('when data is loaded', () => {
before(() => esArchiver.load('8.0.0'));
after(() => esArchiver.unload('8.0.0'));
before(() => esArchiver.load(archiveName));
after(() => esArchiver.unload(archiveName));
it('returns all services', async () => {
const { body } = await getServices();
expect(body).to.eql([
'ALL_OPTION_VALUE',
'client',
'opbeans-dotnet',
'opbeans-go',
'opbeans-java',
'opbeans-node',
'opbeans-python',
'opbeans-ruby',
'opbeans-rum',
]);
expectSnapshot(body).toMatchInline(`
Array [
"ALL_OPTION_VALUE",
"opbeans-dotnet",
"opbeans-go",
"opbeans-java",
"opbeans-node",
"opbeans-python",
"opbeans-ruby",
"opbeans-rum",
]
`);
});
it('returns the environments', async () => {
it('returns the environments, all unconfigured', async () => {
const { body } = await getEnvironments('opbeans-node');
expect(body).to.eql([
{ name: 'ALL_OPTION_VALUE', alreadyConfigured: false },
{ name: 'testing', alreadyConfigured: false },
{ name: 'production', alreadyConfigured: false },
]);
expect(body.map((item: { name: string }) => item.name)).to.contain('ALL_OPTION_VALUE');
expect(
body.every((item: { alreadyConfigured: boolean }) => item.alreadyConfigured === false)
).to.be(true);
expectSnapshot(body).toMatchInline(`
Array [
Object {
"alreadyConfigured": false,
"name": "ALL_OPTION_VALUE",
},
Object {
"alreadyConfigured": false,
"name": "testing",
},
]
`);
});
it('returns the agent names', async () => {

View file

@ -14,6 +14,8 @@ export default function customLinksTests({ getService }: FtrProviderContext) {
const log = getService('log');
const esArchiver = getService('esArchiver');
const archiveName = 'apm_8.0.0';
function searchCustomLinks(filters?: any) {
const path = URL.format({
pathname: `/api/apm/settings/custom_links`,
@ -142,8 +144,8 @@ export default function customLinksTests({ getService }: FtrProviderContext) {
});
describe('transaction', () => {
before(() => esArchiver.load('8.0.0'));
after(() => esArchiver.unload('8.0.0'));
before(() => esArchiver.load(archiveName));
after(() => esArchiver.unload(archiveName));
it('fetches a transaction sample', async () => {
const response = await supertestRead.get(

View file

@ -3,301 +3,598 @@
exports[`Top traces when data is loaded returns the correct buckets 1`] = `
Array [
Object {
"averageResponseTime": 2577,
"averageResponseTime": 3853,
"impact": 0,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "GET /throw-error",
"service.name": "opbeans-ruby",
"transaction.name": "Api::OrdersController#create",
},
"transactionsPerMinute": 0.5,
"transactionsPerMinute": 0.016666666666666666,
},
Object {
"averageResponseTime": 3147,
"impact": 0.06552270160444405,
"averageResponseTime": 5420,
"impact": 0.0013411780236742999,
"key": Object {
"service.name": "opbeans-java",
"transaction.name": "APIRestController#orders",
},
"transactionsPerMinute": 0.5,
"transactionsPerMinute": 0.016666666666666666,
},
Object {
"averageResponseTime": 3392.5,
"impact": 0.09374344413758617,
"key": Object {
"service.name": "opbeans-java",
"transaction.name": "APIRestController#order",
},
"transactionsPerMinute": 0.5,
},
Object {
"averageResponseTime": 4713.5,
"impact": 0.24559517890858723,
"key": Object {
"service.name": "opbeans-java",
"transaction.name": "APIRestController#product",
},
"transactionsPerMinute": 0.5,
},
Object {
"averageResponseTime": 4757,
"impact": 0.25059559560997896,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "GET /api/products/:id/customers",
},
"transactionsPerMinute": 0.5,
},
Object {
"averageResponseTime": 6787,
"impact": 0.4839483750082622,
"key": Object {
"service.name": "opbeans-java",
"transaction.name": "APIRestController#products",
},
"transactionsPerMinute": 0.5,
},
Object {
"averageResponseTime": 4749.666666666667,
"impact": 0.5227447114845778,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "GET /api/orders/:id",
},
"transactionsPerMinute": 0.75,
},
Object {
"averageResponseTime": 7624.5,
"impact": 0.5802207655235637,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "GET /api/orders",
},
"transactionsPerMinute": 0.5,
},
Object {
"averageResponseTime": 5098,
"impact": 0.582807187955318,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "GET /api/stats",
},
"transactionsPerMinute": 0.75,
},
Object {
"averageResponseTime": 8181,
"impact": 0.6441916136689552,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "GET /api/types/:id",
},
"transactionsPerMinute": 0.5,
},
Object {
"averageResponseTime": 20011,
"impact": 0.853921734857215,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "POST /api",
},
"transactionsPerMinute": 0.25,
},
Object {
"averageResponseTime": 6583,
"impact": 1.2172278724376455,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "GET /api/products",
},
"transactionsPerMinute": 1,
},
Object {
"averageResponseTime": 33097,
"impact": 1.6060533780113861,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "GET /api/products/top",
},
"transactionsPerMinute": 0.25,
},
Object {
"averageResponseTime": 4825,
"impact": 1.6450221426498186,
"key": Object {
"service.name": "opbeans-java",
"transaction.name": "APIRestController#topProducts",
},
"transactionsPerMinute": 1.75,
},
Object {
"averageResponseTime": 35846,
"impact": 1.7640550505645587,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "GET /log-error",
},
"transactionsPerMinute": 0.25,
},
Object {
"averageResponseTime": 3742.153846153846,
"impact": 2.4998634943716573,
"key": Object {
"service.name": "opbeans-java",
"transaction.name": "APIRestController#customerWhoBought",
},
"transactionsPerMinute": 3.25,
},
Object {
"averageResponseTime": 3492.9285714285716,
"impact": 2.5144049360435208,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "GET static file",
},
"transactionsPerMinute": 3.5,
},
Object {
"averageResponseTime": 26992.5,
"impact": 2.8066131947777255,
"averageResponseTime": 4135.5,
"impact": 0.0037813174911251156,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "GET /api/types",
},
"transactionsPerMinute": 0.5,
"transactionsPerMinute": 0.03333333333333333,
},
Object {
"averageResponseTime": 13516.5,
"impact": 2.8112687551548836,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "GET /api/products/:id",
},
"transactionsPerMinute": 1,
},
Object {
"averageResponseTime": 20092,
"impact": 3.168195050736987,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "GET /api/customers",
},
"transactionsPerMinute": 0.75,
},
Object {
"averageResponseTime": 15535,
"impact": 3.275330415465657,
"averageResponseTime": 11058,
"impact": 0.006166680064182087,
"key": Object {
"service.name": "opbeans-java",
"transaction.name": "APIRestController#stats",
"transaction.name": "APIRestController#products",
},
"transactionsPerMinute": 1,
"transactionsPerMinute": 0.016666666666666666,
},
Object {
"averageResponseTime": 32667.5,
"impact": 3.458966408120217,
"averageResponseTime": 6014,
"impact": 0.0069968923698388,
"key": Object {
"service.name": "opbeans-go",
"transaction.name": "POST /api/orders",
},
"transactionsPerMinute": 0.03333333333333333,
},
Object {
"averageResponseTime": 13540,
"impact": 0.00829099649989339,
"key": Object {
"service.name": "opbeans-python",
"transaction.name": "GET opbeans.views.product",
},
"transactionsPerMinute": 0.016666666666666666,
},
Object {
"averageResponseTime": 8710,
"impact": 0.011611845722520248,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "GET /log-message",
"transaction.name": "GET /api/types/:id",
},
"transactionsPerMinute": 0.5,
"transactionsPerMinute": 0.03333333333333333,
},
Object {
"averageResponseTime": 16690.75,
"impact": 3.541042213287889,
"averageResponseTime": 10157,
"impact": 0.014088788415891928,
"key": Object {
"service.name": "opbeans-java",
"transaction.name": "APIRestController#customers",
"service.name": "opbeans-python",
"transaction.name": "GET opbeans.views.product_type",
},
"transactionsPerMinute": 1,
"transactionsPerMinute": 0.03333333333333333,
},
Object {
"averageResponseTime": 33500,
"impact": 3.5546640380951287,
"averageResponseTime": 6944.333333333333,
"impact": 0.014532994793867014,
"key": Object {
"service.name": "client",
"transaction.name": "/customers",
"service.name": "opbeans-node",
"transaction.name": "GET /api/orders/:id",
},
"transactionsPerMinute": 0.5,
"transactionsPerMinute": 0.05,
},
Object {
"averageResponseTime": 77000,
"impact": 4.129424578484989,
"key": Object {
"service.name": "client",
"transaction.name": "/products",
},
"transactionsPerMinute": 0.25,
},
Object {
"averageResponseTime": 19370.6,
"impact": 5.270496679320978,
"averageResponseTime": 8438.333333333334,
"impact": 0.018369089179385976,
"key": Object {
"service.name": "opbeans-java",
"transaction.name": "APIRestController#customer",
},
"transactionsPerMinute": 1.25,
"transactionsPerMinute": 0.05,
},
Object {
"averageResponseTime": 81500,
"impact": 9.072365225837785,
"averageResponseTime": 13202,
"impact": 0.019301152273056246,
"key": Object {
"service.name": "client",
"transaction.name": "/orders",
"service.name": "opbeans-java",
"transaction.name": "APIRestController#customers",
},
"transactionsPerMinute": 0.5,
"transactionsPerMinute": 0.03333333333333333,
},
Object {
"averageResponseTime": 14419.42857142857,
"impact": 11.30657439844125,
"averageResponseTime": 9311,
"impact": 0.020609806515684198,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "GET /api/products/:id",
},
"transactionsPerMinute": 0.05,
},
Object {
"averageResponseTime": 14019,
"impact": 0.020699674858049102,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "GET /api/customers/:id",
},
"transactionsPerMinute": 0.03333333333333333,
},
Object {
"averageResponseTime": 28176,
"impact": 0.020817787536585832,
"key": Object {
"service.name": "opbeans-python",
"transaction.name": "POST opbeans.views.post_order",
},
"transactionsPerMinute": 0.016666666666666666,
},
Object {
"averageResponseTime": 9298.75,
"impact": 0.02853705020124346,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "GET /api/products",
},
"transactionsPerMinute": 0.06666666666666667,
},
Object {
"averageResponseTime": 7441.6,
"impact": 0.028548176757917213,
"key": Object {
"service.name": "opbeans-java",
"transaction.name": "APIRestController#order",
},
"transactionsPerMinute": 0.08333333333333333,
},
Object {
"averageResponseTime": 6260.166666666667,
"impact": 0.028850305566058266,
"key": Object {
"service.name": "opbeans-java",
"transaction.name": "APIRestController#topProducts",
},
"transactionsPerMinute": 0.1,
},
Object {
"averageResponseTime": 7656.2,
"impact": 0.029466545627989022,
"key": Object {
"service.name": "opbeans-java",
"transaction.name": "APIRestController#customerWhoBought",
},
"transactionsPerMinute": 0.08333333333333333,
},
Object {
"averageResponseTime": 7016.5,
"impact": 0.032734329734171834,
"key": Object {
"service.name": "opbeans-ruby",
"transaction.name": "Api::OrdersController#show",
},
"transactionsPerMinute": 0.1,
},
Object {
"averageResponseTime": 21102.5,
"impact": 0.03282505396551165,
"key": Object {
"service.name": "opbeans-python",
"transaction.name": "GET opbeans.views.customer",
},
"transactionsPerMinute": 0.03333333333333333,
},
Object {
"averageResponseTime": 14443.333333333334,
"impact": 0.033787929062278454,
"key": Object {
"service.name": "opbeans-java",
"transaction.name": "APIRestController#stats",
},
"transactionsPerMinute": 0.05,
},
Object {
"averageResponseTime": 2828.0625,
"impact": 0.0354303800051189,
"key": Object {
"service.name": "opbeans-java",
"transaction.name": "ResourceHttpRequestHandler",
},
"transactionsPerMinute": 3.5,
"transactionsPerMinute": 0.26666666666666666,
},
Object {
"averageResponseTime": 270684,
"impact": 15.261616628971955,
"averageResponseTime": 9920.8,
"impact": 0.03915777649082508,
"key": Object {
"service.name": "opbeans-java",
"transaction.name": "APIRestController#product",
},
"transactionsPerMinute": 0.08333333333333333,
},
Object {
"averageResponseTime": 16860.333333333332,
"impact": 0.03999398001930612,
"key": Object {
"service.name": "opbeans-python",
"transaction.name": "GET opbeans.views.orders",
},
"transactionsPerMinute": 0.05,
},
Object {
"averageResponseTime": 10264.8,
"impact": 0.04062990552765966,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "POST /api/orders",
"transaction.name": "GET /api/products/top",
},
"transactionsPerMinute": 0.08333333333333333,
},
Object {
"averageResponseTime": 8818.833333333334,
"impact": 0.04198991310878184,
"key": Object {
"service.name": "opbeans-python",
"transaction.name": "GET opbeans.views.order",
},
"transactionsPerMinute": 0.1,
},
Object {
"averageResponseTime": 4649.307692307692,
"impact": 0.04843304531185787,
"key": Object {
"service.name": "opbeans-go",
"transaction.name": "GET /api/types/:id",
},
"transactionsPerMinute": 0.21666666666666667,
},
Object {
"averageResponseTime": 30425,
"impact": 0.048783103902593536,
"key": Object {
"service.name": "opbeans-python",
"transaction.name": "GET opbeans.views.products",
},
"transactionsPerMinute": 0.03333333333333333,
},
Object {
"averageResponseTime": 4215.2,
"impact": 0.05081840788491484,
"key": Object {
"service.name": "opbeans-go",
"transaction.name": "GET /api/types",
},
"transactionsPerMinute": 0.25,
},
Object {
"averageResponseTime": 36010.53846153846,
"impact": 26.61043592713186,
"averageResponseTime": 7333.777777777777,
"impact": 0.053194355679247865,
"key": Object {
"service.name": "opbeans-java",
"transaction.name": "DispatcherServlet#doGet",
"service.name": "opbeans-ruby",
"transaction.name": "Api::StatsController#index",
},
"transactionsPerMinute": 3.25,
"transactionsPerMinute": 0.15,
},
Object {
"averageResponseTime": 208000,
"impact": 35.56882613781033,
"averageResponseTime": 7562.111111111111,
"impact": 0.05495320752267524,
"key": Object {
"service.name": "client",
"transaction.name": "/dashboard",
"service.name": "opbeans-ruby",
"transaction.name": "Api::TypesController#index",
},
"transactionsPerMinute": 0.75,
"transactionsPerMinute": 0.15,
},
Object {
"averageResponseTime": 49816.15625,
"impact": 91.32732325394932,
"averageResponseTime": 5459.307692307692,
"impact": 0.057445556217595194,
"key": Object {
"service.name": "opbeans-go",
"transaction.name": "GET /api/products",
},
"transactionsPerMinute": 0.21666666666666667,
},
Object {
"averageResponseTime": 7248.5,
"impact": 0.058741372125599586,
"key": Object {
"service.name": "opbeans-ruby",
"transaction.name": "Api::TypesController#show",
},
"transactionsPerMinute": 0.16666666666666666,
},
Object {
"averageResponseTime": 87771,
"impact": 0.07182449099597951,
"key": Object {
"service.name": "opbeans-python",
"transaction.name": "GET opbeans.views.top_products",
},
"transactionsPerMinute": 0.016666666666666666,
},
Object {
"averageResponseTime": 6161.2,
"impact": 0.0758018070623576,
"key": Object {
"service.name": "opbeans-go",
"transaction.name": "GET /api/orders/:id",
},
"transactionsPerMinute": 0.25,
},
Object {
"averageResponseTime": 19260.8,
"impact": 0.07912779161883388,
"key": Object {
"service.name": "opbeans-python",
"transaction.name": "GET opbeans.views.product_types",
},
"transactionsPerMinute": 0.08333333333333333,
},
Object {
"averageResponseTime": 10632.4,
"impact": 0.08770379914737025,
"key": Object {
"service.name": "opbeans-ruby",
"transaction.name": "Api::ProductsController#show",
},
"transactionsPerMinute": 0.16666666666666666,
},
Object {
"averageResponseTime": 54309.5,
"impact": 0.08966806434477453,
"key": Object {
"service.name": "opbeans-python",
"transaction.name": "GET opbeans.views.customers",
},
"transactionsPerMinute": 0.03333333333333333,
},
Object {
"averageResponseTime": 5046.695652173913,
"impact": 0.09604871665268258,
"key": Object {
"service.name": "opbeans-go",
"transaction.name": "GET /api/customers/:id",
},
"transactionsPerMinute": 0.38333333333333336,
},
Object {
"averageResponseTime": 20346,
"impact": 0.10118576228005537,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "GET /api/stats",
},
"transactionsPerMinute": 0.1,
},
Object {
"averageResponseTime": 18472.85714285714,
"impact": 0.10737726312450965,
"key": Object {
"service.name": "opbeans-python",
"transaction.name": "GET opbeans.views.stats",
},
"transactionsPerMinute": 0.11666666666666667,
},
Object {
"averageResponseTime": 32662,
"impact": 0.10852244257293098,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "GET /api/customers",
},
"transactionsPerMinute": 0.06666666666666667,
},
Object {
"averageResponseTime": 13975.7,
"impact": 0.11631873524532996,
"key": Object {
"service.name": "opbeans-ruby",
"transaction.name": "Api::ProductsController#index",
},
"transactionsPerMinute": 0.16666666666666666,
},
Object {
"averageResponseTime": 13373.615384615385,
"impact": 0.14550454928955053,
"key": Object {
"service.name": "opbeans-go",
"transaction.name": "GET /api/orders",
},
"transactionsPerMinute": 0.21666666666666667,
},
Object {
"averageResponseTime": 19675.333333333332,
"impact": 0.14826136767771575,
"key": Object {
"service.name": "opbeans-ruby",
"transaction.name": "Api::OrdersController#index",
},
"transactionsPerMinute": 0.15,
},
Object {
"averageResponseTime": 12946.266666666666,
"impact": 0.1629107633721697,
"key": Object {
"service.name": "opbeans-ruby",
"transaction.name": "Api::CustomersController#show",
},
"transactionsPerMinute": 0.25,
},
Object {
"averageResponseTime": 16506.666666666668,
"impact": 0.16623674792864598,
"key": Object {
"service.name": "opbeans-go",
"transaction.name": "GET /api/products/:id/customers",
},
"transactionsPerMinute": 0.2,
},
Object {
"averageResponseTime": 17101.5,
"impact": 0.1723460834315095,
"key": Object {
"service.name": "opbeans-ruby",
"transaction.name": "Api::ProductsController#top",
},
"transactionsPerMinute": 0.2,
},
Object {
"averageResponseTime": 15871.3125,
"impact": 0.21404756195574876,
"key": Object {
"service.name": "opbeans-go",
"transaction.name": "GET /api/stats",
},
"transactionsPerMinute": 0.26666666666666666,
},
Object {
"averageResponseTime": 11237.785714285714,
"impact": 0.26601457284498453,
"key": Object {
"service.name": "opbeans-ruby",
"transaction.name": "Api::CustomersController#index",
},
"transactionsPerMinute": 0.4666666666666667,
},
Object {
"averageResponseTime": 15403.40909090909,
"impact": 0.28674163615023057,
"key": Object {
"service.name": "opbeans-go",
"transaction.name": "GET /api/products/:id",
},
"transactionsPerMinute": 0.36666666666666664,
},
Object {
"averageResponseTime": 101902.16666666667,
"impact": 0.5200039055925703,
"key": Object {
"service.name": "opbeans-python",
"transaction.name": "GET opbeans.views.product_customers",
},
"transactionsPerMinute": 0.1,
},
Object {
"averageResponseTime": 32236.133333333335,
"impact": 0.82441879318559,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "GET /api",
},
"transactionsPerMinute": 8,
"transactionsPerMinute": 0.5,
},
Object {
"averageResponseTime": 1745009,
"impact": 100,
"averageResponseTime": 94012.11111111111,
"impact": 1.445052989113503,
"key": Object {
"service.name": "opbeans-go",
"transaction.name": "GET /api/customers",
},
"transactionsPerMinute": 0.3,
},
Object {
"averageResponseTime": 32260.39837398374,
"impact": 3.3928945329783606,
"key": Object {
"service.name": "opbeans-ruby",
"transaction.name": "Rack",
},
"transactionsPerMinute": 2.05,
},
Object {
"averageResponseTime": 34207.61666666667,
"impact": 3.5100528953080716,
"key": Object {
"service.name": "opbeans-python",
"transaction.name": "opbeans.tasks.sync_orders",
},
"transactionsPerMinute": 2,
},
Object {
"averageResponseTime": 638040,
"impact": 13.648987298470669,
"key": Object {
"service.name": "opbeans-rum",
"transaction.name": "/customers",
},
"transactionsPerMinute": 0.4166666666666667,
},
Object {
"averageResponseTime": 2061418.6666666667,
"impact": 15.875811844928256,
"key": Object {
"service.name": "opbeans-java",
"transaction.name": "DispatcherServlet#doGet",
},
"transactionsPerMinute": 0.15,
},
Object {
"averageResponseTime": 847846.1538461539,
"impact": 18.8639188225597,
"key": Object {
"service.name": "opbeans-rum",
"transaction.name": "/orders",
},
"transactionsPerMinute": 0.43333333333333335,
},
Object {
"averageResponseTime": 1091031.25,
"impact": 29.87835404059707,
"key": Object {
"service.name": "opbeans-rum",
"transaction.name": "/products",
},
"transactionsPerMinute": 0.5333333333333333,
},
Object {
"averageResponseTime": 924980.3921568628,
"impact": 40.37240876189292,
"key": Object {
"service.name": "opbeans-rum",
"transaction.name": "/dashboard",
},
"transactionsPerMinute": 0.85,
},
Object {
"averageResponseTime": 979844.2117647058,
"impact": 71.28092018746297,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "Process completed order",
},
"transactionsPerMinute": 1.4166666666666667,
},
Object {
"averageResponseTime": 996808.380952381,
"impact": 71.66191574108551,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "Process payment",
},
"transactionsPerMinute": 0.25,
"transactionsPerMinute": 1.4,
},
Object {
"averageResponseTime": 1083442.5568181819,
"impact": 81.59967772014184,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "Update shipping status",
},
"transactionsPerMinute": 1.4666666666666666,
},
Object {
"averageResponseTime": 134550.32361111112,
"impact": 82.91200201469418,
"key": Object {
"service.name": "opbeans-python",
"transaction.name": "opbeans.tasks.update_stats",
},
"transactionsPerMinute": 12,
},
Object {
"averageResponseTime": 1600567.6301369863,
"impact": 100,
"key": Object {
"service.name": "opbeans-python",
"transaction.name": "opbeans.tasks.sync_customers",
},
"transactionsPerMinute": 1.2166666666666666,
},
]
`;

View file

@ -5,6 +5,7 @@
*/
import expect from '@kbn/expect';
import { sortBy, omit } from 'lodash';
import archives_metadata from '../../../common/archives_metadata';
import { expectSnapshot } from '../../../common/match_snapshot';
import { FtrProviderContext } from '../../../../common/ftr_provider_context';
@ -12,9 +13,12 @@ export default function ApiTest({ getService }: FtrProviderContext) {
const supertest = getService('supertest');
const esArchiver = getService('esArchiver');
const archiveName = 'apm_8.0.0';
const metadata = archives_metadata[archiveName];
// url parameters
const start = encodeURIComponent('2020-06-29T06:45:00.000Z');
const end = encodeURIComponent('2020-06-29T06:49:00.000Z');
const start = encodeURIComponent(metadata.start);
const end = encodeURIComponent(metadata.end);
const uiFilters = encodeURIComponent(JSON.stringify({}));
describe('Top traces', () => {
@ -25,32 +29,27 @@ export default function ApiTest({ getService }: FtrProviderContext) {
);
expect(response.status).to.be(200);
expectSnapshot(response.body).toMatchInline(`
Object {
"bucketSize": 1000,
"isAggregationAccurate": true,
"items": Array [],
}
`);
expect(response.body.items.length).to.be(0);
expect(response.body.isAggregationAccurate).to.be(true);
});
});
describe('when data is loaded', () => {
let response: any;
before(async () => {
await esArchiver.load('8.0.0');
await esArchiver.load(archiveName);
response = await supertest.get(
`/api/apm/traces?start=${start}&end=${end}&uiFilters=${uiFilters}`
);
});
after(() => esArchiver.unload('8.0.0'));
after(() => esArchiver.unload(archiveName));
it('returns the correct status code', async () => {
expect(response.status).to.be(200);
});
it('returns the correct number of buckets', async () => {
expectSnapshot(response.body.items.length).toMatchInline(`33`);
expectSnapshot(response.body.items.length).toMatchInline(`66`);
});
it('returns the correct buckets', async () => {
@ -68,49 +67,49 @@ export default function ApiTest({ getService }: FtrProviderContext) {
expectSnapshot(firstItem).toMatchInline(`
Object {
"averageResponseTime": 2577,
"averageResponseTime": 3853,
"impact": 0,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "GET /throw-error",
"service.name": "opbeans-ruby",
"transaction.name": "Api::OrdersController#create",
},
"transactionsPerMinute": 0.5,
"transactionsPerMinute": 0.016666666666666666,
}
`);
expectSnapshot(lastItem).toMatchInline(`
Object {
"averageResponseTime": 1745009,
"averageResponseTime": 1600567.6301369863,
"impact": 100,
"key": Object {
"service.name": "opbeans-node",
"transaction.name": "Process payment",
"service.name": "opbeans-python",
"transaction.name": "opbeans.tasks.sync_customers",
},
"transactionsPerMinute": 0.25,
"transactionsPerMinute": 1.2166666666666666,
}
`);
expectSnapshot(groups).toMatchInline(`
Array [
Object {
"service.name": "opbeans-node",
"transaction.name": "GET /throw-error",
"service.name": "opbeans-ruby",
"transaction.name": "Api::OrdersController#create",
},
Object {
"service.name": "opbeans-java",
"transaction.name": "APIRestController#orders",
},
Object {
"service.name": "opbeans-java",
"transaction.name": "APIRestController#order",
},
Object {
"service.name": "opbeans-java",
"transaction.name": "APIRestController#product",
},
Object {
"service.name": "opbeans-node",
"transaction.name": "GET /api/products/:id/customers",
"transaction.name": "GET /api/types",
},
Object {
"service.name": "opbeans-java",
"transaction.name": "APIRestController#products",
},
Object {
"service.name": "opbeans-go",
"transaction.name": "POST /api/orders",
},
]
`);

View file

@ -3,130 +3,95 @@
exports[`Top transaction groups when data is loaded returns the correct buckets (when ignoring samples) 1`] = `
Array [
Object {
"averageResponseTime": 2577,
"averageResponseTime": 2612,
"impact": 0,
"key": "GET /throw-error",
"p95": 3224,
"transactionsPerMinute": 0.5,
},
Object {
"averageResponseTime": 4757,
"impact": 0.20830834986820673,
"key": "GET /api/products/:id/customers",
"p95": 5616,
"transactionsPerMinute": 0.5,
},
Object {
"averageResponseTime": 4749.666666666667,
"impact": 0.43453312891085794,
"key": "GET /api/orders/:id",
"p95": 7184,
"transactionsPerMinute": 0.75,
},
Object {
"averageResponseTime": 8181,
"impact": 0.5354862351657939,
"key": "GET /api/types/:id",
"p95": 10080,
"transactionsPerMinute": 0.5,
},
Object {
"averageResponseTime": 20011,
"impact": 0.7098250353192541,
"key": "POST /api",
"p95": 19968,
"transactionsPerMinute": 0.25,
},
Object {
"averageResponseTime": 35846,
"impact": 1.466376117925459,
"key": "GET /log-error",
"p95": 35840,
"transactionsPerMinute": 0.25,
},
Object {
"averageResponseTime": 7105.333333333333,
"impact": 1.7905918202662048,
"key": "GET /api/stats",
"p95": 15136,
"transactionsPerMinute": 1.5,
},
Object {
"averageResponseTime": 22958.5,
"impact": 1.9475397398343375,
"key": "GET /api/products/top",
"p95": 33216,
"transactionsPerMinute": 0.5,
},
Object {
"averageResponseTime": 3492.9285714285716,
"impact": 2.0901067389184496,
"key": "GET static file",
"p95": 11900,
"transactionsPerMinute": 3.5,
},
Object {
"averageResponseTime": 26992.5,
"impact": 2.3330057413794503,
"key": "GET /api/types",
"p95": 45248,
"transactionsPerMinute": 0.5,
},
Object {
"averageResponseTime": 13516.5,
"impact": 2.3368756900811305,
"key": "GET /api/products/:id",
"p95": 37856,
"transactionsPerMinute": 1,
},
Object {
"averageResponseTime": 8585,
"impact": 2.624924094061731,
"key": "GET /api/products",
"p95": 22112,
"transactionsPerMinute": 1.75,
},
Object {
"averageResponseTime": 7615.625,
"impact": 2.6645791239678345,
"key": "GET /api/orders",
"p95": 11616,
"transactionsPerMinute": 2,
},
Object {
"averageResponseTime": 3262.95,
"impact": 2.8716452680799467,
"key": "GET /*",
"p95": 4472,
"transactionsPerMinute": 5,
},
Object {
"averageResponseTime": 32667.5,
"impact": 2.875276331059301,
"key": "GET /log-message",
"p95": 38528,
"transactionsPerMinute": 0.5,
},
Object {
"averageResponseTime": 16896.8,
"impact": 3.790160870423129,
"key": "GET /api/customers",
"p95": 26432,
"transactionsPerMinute": 1.25,
},
Object {
"averageResponseTime": 270684,
"impact": 12.686265169840583,
"key": "POST /api/orders",
"p95": 270336,
"transactionsPerMinute": 0.25,
"p95": 2608,
"transactionsPerMinute": 0.016666666666666666,
},
Object {
"averageResponseTime": 51175.73170731707,
"averageResponseTime": 8710,
"impact": 0.21594473634705155,
"key": "GET /api/types/:id",
"p95": 8832,
"transactionsPerMinute": 0.03333333333333333,
},
Object {
"averageResponseTime": 15469,
"impact": 0.41307743123761353,
"key": "GET /api/products/:id/customers",
"p95": 17728,
"transactionsPerMinute": 0.03333333333333333,
},
Object {
"averageResponseTime": 11161.5,
"impact": 0.6129808919240927,
"key": "GET /api/customers/:id",
"p95": 16096,
"transactionsPerMinute": 0.06666666666666667,
},
Object {
"averageResponseTime": 8115.166666666667,
"impact": 0.6719690374213795,
"key": "GET /api/types",
"p95": 12336,
"transactionsPerMinute": 0.1,
},
Object {
"averageResponseTime": 10863.6,
"impact": 0.7540274539141442,
"key": "GET /api/orders/:id",
"p95": 20192,
"transactionsPerMinute": 0.08333333333333333,
},
Object {
"averageResponseTime": 9906,
"impact": 0.8286631346694258,
"key": "GET /api/products/:id",
"p95": 13280,
"transactionsPerMinute": 0.1,
},
Object {
"averageResponseTime": 8524.454545454546,
"impact": 1.329340513991638,
"key": "GET /api/products",
"p95": 14256,
"transactionsPerMinute": 0.18333333333333332,
},
Object {
"averageResponseTime": 12947,
"impact": 1.472355777994578,
"key": "GET /api/orders",
"p95": 25584,
"transactionsPerMinute": 0.13333333333333333,
},
Object {
"averageResponseTime": 11307.75,
"impact": 2.6003199505345393,
"key": "GET /api/products/top",
"p95": 16304,
"transactionsPerMinute": 0.26666666666666666,
},
Object {
"averageResponseTime": 26755.666666666668,
"impact": 4.644036801602961,
"key": "GET /api/customers",
"p95": 39104,
"transactionsPerMinute": 0.2,
},
Object {
"averageResponseTime": 17851.384615384617,
"impact": 6.730394279972759,
"key": "GET /api/stats",
"p95": 24416,
"transactionsPerMinute": 0.43333333333333335,
},
Object {
"averageResponseTime": 61249.30357142857,
"impact": 100,
"key": "GET /api",
"p95": 259040,
"transactionsPerMinute": 10.25,
"p95": 162784,
"transactionsPerMinute": 1.8666666666666667,
},
]
`;

View file

@ -4,6 +4,7 @@
* you may not use this file except in compliance with the Elastic License.
*/
import expect from '@kbn/expect';
import archives_metadata from '../../../common/archives_metadata';
import { expectSnapshot } from '../../../common/match_snapshot';
import { FtrProviderContext } from '../../../common/ftr_provider_context';
@ -11,8 +12,11 @@ export default function ApiTest({ getService }: FtrProviderContext) {
const supertest = getService('supertest');
const esArchiver = getService('esArchiver');
const start = encodeURIComponent('2020-06-29T06:45:00.000Z');
const end = encodeURIComponent('2020-06-29T06:49:00.000Z');
const archiveName = 'apm_8.0.0';
const metadata = archives_metadata[archiveName];
const start = encodeURIComponent(metadata.start);
const end = encodeURIComponent(metadata.end);
const transactionName = '/products';
const uiFilters = encodeURIComponent(JSON.stringify({}));
@ -28,23 +32,34 @@ export default function ApiTest({ getService }: FtrProviderContext) {
});
describe('when data is loaded', () => {
before(() => esArchiver.load('8.0.0'));
after(() => esArchiver.unload('8.0.0'));
before(() => esArchiver.load(archiveName));
after(() => esArchiver.unload(archiveName));
it('returns the average duration by browser', async () => {
const response = await supertest.get(
`/api/apm/services/client/transaction_groups/avg_duration_by_browser?start=${start}&end=${end}&uiFilters=${uiFilters}`
`/api/apm/services/opbeans-rum/transaction_groups/avg_duration_by_browser?start=${start}&end=${end}&uiFilters=${uiFilters}`
);
expect(response.status).to.be(200);
expect(response.body.length).to.be.greaterThan(0);
expectSnapshot(response.body).toMatch();
expectSnapshot(response.body.length).toMatchInline(`1`);
});
it('returns the average duration by browser filtering by transaction name', async () => {
const response = await supertest.get(
`/api/apm/services/client/transaction_groups/avg_duration_by_browser?start=${start}&end=${end}&uiFilters=${uiFilters}&transactionName=${transactionName}`
`/api/apm/services/opbeans-rum/transaction_groups/avg_duration_by_browser?start=${start}&end=${end}&uiFilters=${uiFilters}&transactionName=${transactionName}`
);
expect(response.status).to.be(200);
expect(response.body.length).to.be.greaterThan(0);
expectSnapshot(response.body.length).toMatchInline(`1`);
expectSnapshot(response.body).toMatch();
});
});

View file

@ -4,6 +4,7 @@
* you may not use this file except in compliance with the Elastic License.
*/
import expect from '@kbn/expect';
import archives_metadata from '../../../common/archives_metadata';
import { expectSnapshot } from '../../../common/match_snapshot';
import { FtrProviderContext } from '../../../common/ftr_provider_context';
@ -11,8 +12,11 @@ export default function ApiTest({ getService }: FtrProviderContext) {
const supertest = getService('supertest');
const esArchiver = getService('esArchiver');
const start = encodeURIComponent('2020-06-29T06:45:00.000Z');
const end = encodeURIComponent('2020-06-29T06:49:00.000Z');
const archiveName = 'apm_8.0.0';
const metadata = archives_metadata[archiveName];
const start = encodeURIComponent(metadata.start);
const end = encodeURIComponent(metadata.end);
const transactionType = 'request';
const transactionName = 'GET /api';
const uiFilters = encodeURIComponent(JSON.stringify({}));
@ -29,8 +33,8 @@ export default function ApiTest({ getService }: FtrProviderContext) {
});
describe('when data is loaded', () => {
before(() => esArchiver.load('8.0.0'));
after(() => esArchiver.unload('8.0.0'));
before(() => esArchiver.load(archiveName));
after(() => esArchiver.unload(archiveName));
it('returns the transaction breakdown for a service', async () => {
const response = await supertest.get(
@ -46,45 +50,46 @@ export default function ApiTest({ getService }: FtrProviderContext) {
);
expect(response.status).to.be(200);
const { timeseries } = response.body;
const numberOfSeries = timeseries.length;
expectSnapshot(numberOfSeries).toMatchInline(`1`);
const { title, color, type, data, hideLegend, legendValue } = timeseries[0];
expectSnapshot(data).toMatchInline(`
const nonNullDataPoints = data.filter((y: number | null) => y !== null);
expectSnapshot(nonNullDataPoints.length).toMatchInline(`121`);
expectSnapshot(
data.slice(0, 5).map(({ x, y }: { x: number; y: number | null }) => {
return {
x: new Date(x ?? NaN).toISOString(),
y,
};
})
).toMatchInline(`
Array [
Object {
"x": 1593413100000,
"y": null,
},
Object {
"x": 1593413130000,
"y": null,
},
Object {
"x": 1593413160000,
"y": null,
},
Object {
"x": 1593413190000,
"y": null,
},
Object {
"x": 1593413220000,
"y": null,
},
Object {
"x": 1593413250000,
"y": null,
},
Object {
"x": 1593413280000,
"y": null,
},
Object {
"x": 1593413310000,
"x": "2020-09-10T06:00:00.000Z",
"y": 1,
},
Object {
"x": 1593413340000,
"x": "2020-09-10T06:00:30.000Z",
"y": 1,
},
Object {
"x": "2020-09-10T06:01:00.000Z",
"y": null,
},
Object {
"x": "2020-09-10T06:01:30.000Z",
"y": 1,
},
Object {
"x": "2020-09-10T06:02:00.000Z",
"y": null,
},
]
@ -95,6 +100,8 @@ export default function ApiTest({ getService }: FtrProviderContext) {
expectSnapshot(type).toMatchInline(`"areaStacked"`);
expectSnapshot(hideLegend).toMatchInline(`false`);
expectSnapshot(legendValue).toMatchInline(`"100%"`);
expectSnapshot(data).toMatch();
});
it('returns the transaction breakdown sorted by name', async () => {
const response = await supertest.get(
@ -108,7 +115,6 @@ export default function ApiTest({ getService }: FtrProviderContext) {
"app",
"http",
"postgresql",
"redis",
]
`);
});

View file

@ -5,6 +5,7 @@
*/
import expect from '@kbn/expect';
import { first, last } from 'lodash';
import archives_metadata from '../../../common/archives_metadata';
import { expectSnapshot } from '../../../common/match_snapshot';
import { FtrProviderContext } from '../../../common/ftr_provider_context';
@ -12,9 +13,12 @@ export default function ApiTest({ getService }: FtrProviderContext) {
const supertest = getService('supertest');
const esArchiver = getService('esArchiver');
const archiveName = 'apm_8.0.0';
const metadata = archives_metadata[archiveName];
// url parameters
const start = encodeURIComponent('2020-08-26T11:00:00.000Z');
const end = encodeURIComponent('2020-08-26T11:30:00.000Z');
const start = encodeURIComponent(metadata.start);
const end = encodeURIComponent(metadata.end);
const uiFilters = encodeURIComponent(JSON.stringify({}));
describe('Error rate', () => {
@ -24,16 +28,16 @@ export default function ApiTest({ getService }: FtrProviderContext) {
`/api/apm/services/opbeans-java/transaction_groups/error_rate?start=${start}&end=${end}&uiFilters=${uiFilters}`
);
expect(response.status).to.be(200);
expect(response.body).to.eql({
noHits: true,
erroneousTransactionsRate: [],
average: null,
});
expect(response.body.noHits).to.be(true);
expect(response.body.erroneousTransactionsRate.length).to.be(0);
expect(response.body.average).to.be(null);
});
});
describe('when data is loaded', () => {
before(() => esArchiver.load('8.0.0'));
after(() => esArchiver.unload('8.0.0'));
before(() => esArchiver.load(archiveName));
after(() => esArchiver.unload(archiveName));
describe('returns the transaction error rate', () => {
let errorRateResponse: {
@ -50,26 +54,26 @@ export default function ApiTest({ getService }: FtrProviderContext) {
it('has the correct start date', () => {
expectSnapshot(
new Date(first(errorRateResponse.erroneousTransactionsRate)?.x ?? NaN).toISOString()
).toMatchInline(`"2020-08-26T11:00:00.000Z"`);
).toMatchInline(`"2020-09-10T06:00:00.000Z"`);
});
it('has the correct end date', () => {
expectSnapshot(
new Date(last(errorRateResponse.erroneousTransactionsRate)?.x ?? NaN).toISOString()
).toMatchInline(`"2020-08-26T11:30:00.000Z"`);
).toMatchInline(`"2020-09-10T07:00:00.000Z"`);
});
it('has the correct number of buckets', () => {
expectSnapshot(errorRateResponse.erroneousTransactionsRate.length).toMatchInline(`61`);
expectSnapshot(errorRateResponse.erroneousTransactionsRate.length).toMatchInline(`121`);
});
it('has the correct calculation for average', () => {
expectSnapshot(errorRateResponse.average).toMatchInline(`0.18894993894993897`);
expectSnapshot(errorRateResponse.average).toMatchInline(`0.16097046413502106`);
});
it('has the correct error rate', () => {
expectSnapshot(first(errorRateResponse.erroneousTransactionsRate)?.y).toMatchInline(
`0.5`
`0.6666666666666666`
);
});
});

View file

@ -5,6 +5,7 @@
*/
import expect from '@kbn/expect';
import { sortBy } from 'lodash';
import archives_metadata from '../../../common/archives_metadata';
import { expectSnapshot } from '../../../common/match_snapshot';
import { FtrProviderContext } from '../../../../common/ftr_provider_context';
@ -20,9 +21,12 @@ export default function ApiTest({ getService }: FtrProviderContext) {
const supertest = getService('supertest');
const esArchiver = getService('esArchiver');
const archiveName = 'apm_8.0.0';
const metadata = archives_metadata[archiveName];
// url parameters
const start = encodeURIComponent('2020-06-29T06:45:00.000Z');
const end = encodeURIComponent('2020-06-29T06:49:00.000Z');
const start = encodeURIComponent(metadata.start);
const end = encodeURIComponent(metadata.end);
const uiFilters = encodeURIComponent(JSON.stringify({}));
const transactionType = 'request';
@ -34,39 +38,37 @@ export default function ApiTest({ getService }: FtrProviderContext) {
);
expect(response.status).to.be(200);
expectSnapshot(response.body).toMatchInline(`
Object {
"bucketSize": 1000,
"isAggregationAccurate": true,
"items": Array [],
}
`);
expect(response.body.isAggregationAccurate).to.be(true);
expect(response.body.items.length).to.be(0);
});
});
describe('when data is loaded', () => {
let response: any;
before(async () => {
await esArchiver.load('8.0.0');
await esArchiver.load(archiveName);
response = await supertest.get(
`/api/apm/services/opbeans-node/transaction_groups?start=${start}&end=${end}&uiFilters=${uiFilters}&transactionType=${transactionType}`
);
});
after(() => esArchiver.unload('8.0.0'));
after(() => esArchiver.unload(archiveName));
it('returns the correct status code', async () => {
it('returns the correct metadata', () => {
expect(response.status).to.be(200);
expect(response.body.isAggregationAccurate).to.be(true);
expect(response.body.items.length).to.be.greaterThan(0);
});
it('returns the correct number of buckets', async () => {
expectSnapshot(response.body.items.length).toMatchInline(`18`);
it('returns the correct number of buckets', () => {
expectSnapshot(response.body.items.length).toMatchInline(`13`);
});
it('returns the correct buckets (when ignoring samples)', async () => {
it('returns the correct buckets (when ignoring samples)', () => {
expectSnapshot(omitSampleFromTransactionGroups(response.body.items)).toMatch();
});
it('returns the correct buckets and samples', async () => {
it('returns the correct buckets and samples', () => {
// sample should provide enough information to deeplink to a transaction detail page
response.body.items.forEach((item: any) => {
expect(item.sample.trace.id).to.be.an('string');

View file

@ -4,6 +4,8 @@
* you may not use this file except in compliance with the Elastic License.
*/
import expect from '@kbn/expect';
import archives_metadata from '../../../common/archives_metadata';
import { PromiseReturnType } from '../../../../../plugins/apm/typings/common';
import { expectSnapshot } from '../../../common/match_snapshot';
import { FtrProviderContext } from '../../../../common/ftr_provider_context';
@ -11,9 +13,12 @@ export default function ApiTest({ getService }: FtrProviderContext) {
const supertest = getService('supertest');
const esArchiver = getService('esArchiver');
const archiveName = 'apm_8.0.0';
const metadata = archives_metadata[archiveName];
// url parameters
const start = encodeURIComponent('2020-06-29T06:45:00.000Z');
const end = encodeURIComponent('2020-06-29T06:49:00.000Z');
const start = encodeURIComponent(metadata.start);
const end = encodeURIComponent(metadata.end);
const uiFilters = encodeURIComponent(JSON.stringify({}));
describe('Transaction charts', () => {
@ -24,32 +29,44 @@ export default function ApiTest({ getService }: FtrProviderContext) {
);
expect(response.status).to.be(200);
expectSnapshot(response.body).toMatchInline(`
Object {
"apmTimeseries": Object {
"overallAvgDuration": null,
"responseTimes": Object {
"avg": Array [],
"p95": Array [],
"p99": Array [],
},
"tpmBuckets": Array [],
},
}
`);
expect(response.body.apmTimeseries.overallAvgDuration).to.be(null);
expect(response.body.apmTimeseries.responseTimes.avg.length).to.be(0);
expect(response.body.apmTimeseries.responseTimes.p95.length).to.be(0);
expect(response.body.apmTimeseries.responseTimes.p99.length).to.be(0);
expect(response.body.apmTimeseries.tpmBuckets.length).to.be(0);
});
});
describe('when data is loaded', () => {
before(() => esArchiver.load('8.0.0'));
after(() => esArchiver.unload('8.0.0'));
before(() => esArchiver.load(archiveName));
after(() => esArchiver.unload(archiveName));
it('returns the transaction charts', async () => {
const response = await supertest.get(
let response: PromiseReturnType<typeof supertest.get>;
before(async () => {
response = await supertest.get(
`/api/apm/services/opbeans-node/transaction_groups/charts?start=${start}&end=${end}&uiFilters=${uiFilters}`
);
});
it('returns some data', async () => {
expect(response.status).to.be(200);
expect(response.body.apmTimeseries.overallAvgDuration).not.to.be(null);
expect(response.body.apmTimeseries.responseTimes.avg.length).to.be.greaterThan(0);
expect(response.body.apmTimeseries.responseTimes.p95.length).to.be.greaterThan(0);
expect(response.body.apmTimeseries.responseTimes.p99.length).to.be.greaterThan(0);
expect(response.body.apmTimeseries.tpmBuckets.length).to.be.greaterThan(0);
});
it('returns the correct data', () => {
expectSnapshot(response.body.apmTimeseries.overallAvgDuration).toMatchInline(
`578297.1431623931`
);
expectSnapshot(response.body.apmTimeseries.responseTimes.avg.length).toMatchInline(`121`);
expectSnapshot(response.body.apmTimeseries.tpmBuckets.length).toMatchInline(`4`);
expectSnapshot(response.body).toMatch();
});
});

View file

@ -12,6 +12,7 @@ import prettier from 'prettier';
// @ts-expect-error
import babelTraverse from '@babel/traverse';
import { Suite, Test } from 'mocha';
import { flatten } from 'lodash';
type ISnapshotState = InstanceType<typeof SnapshotState>;
@ -143,18 +144,24 @@ Error.prepareStackTrace = (error, structuredStackTrace) => {
}
};
function recursivelyGetTestsFromSuite(suite: Suite): Test[] {
return suite.tests.concat(flatten(suite.suites.map((s) => recursivelyGetTestsFromSuite(s))));
}
function getSnapshotState(file: string, test: Test) {
const dirname = path.dirname(file);
const filename = path.basename(file);
let parent = test.parent;
const testsInFile: Test[] = [];
let parent: Suite | undefined = test.parent;
while (parent) {
testsInFile.push(...parent.tests);
while (parent && parent.parent?.file === file) {
parent = parent.parent;
}
if (!parent) {
throw new Error('Top-level suite not found');
}
const snapshotState = new SnapshotState(
path.join(dirname + `/__snapshots__/` + filename.replace(path.extname(filename), '.snap')),
{
@ -164,7 +171,7 @@ function getSnapshotState(file: string, test: Test) {
}
);
return { snapshotState, testsInFile };
return { snapshotState, testsInFile: recursivelyGetTestsFromSuite(parent) };
}
export function expectSnapshot(received: any) {

File diff suppressed because it is too large Load diff

View file

@ -6,7 +6,9 @@
import querystring from 'querystring';
import expect from '@kbn/expect';
import { isEmpty } from 'lodash';
import { isEmpty, uniq } from 'lodash';
import archives_metadata from '../../../common/archives_metadata';
import { PromiseReturnType } from '../../../../../plugins/apm/typings/common';
import { expectSnapshot } from '../../../common/match_snapshot';
import { FtrProviderContext } from '../../../common/ftr_provider_context';
@ -14,13 +16,16 @@ export default function serviceMapsApiTests({ getService }: FtrProviderContext)
const supertest = getService('supertest');
const esArchiver = getService('esArchiver');
const archiveName = 'apm_8.0.0';
const metadata = archives_metadata[archiveName];
const start = encodeURIComponent(metadata.start);
const end = encodeURIComponent(metadata.end);
describe('Service Maps with a trial license', () => {
describe('/api/apm/service-map', () => {
describe('when there is no data', () => {
it('returns empty list', async () => {
const response = await supertest.get(
'/api/apm/service-map?start=2020-06-28T10%3A24%3A46.055Z&end=2020-06-29T10%3A24%3A46.055Z'
);
const response = await supertest.get(`/api/apm/service-map?start=${start}&end=${end}`);
expect(response.status).to.be(200);
expect(response.body.elements.length).to.be(0);
@ -28,239 +33,56 @@ export default function serviceMapsApiTests({ getService }: FtrProviderContext)
});
describe('when there is data', () => {
before(() => esArchiver.load('8.0.0'));
after(() => esArchiver.unload('8.0.0'));
before(() => esArchiver.load(archiveName));
after(() => esArchiver.unload(archiveName));
it('returns service map elements', async () => {
const response = await supertest.get(
'/api/apm/service-map?start=2020-06-28T10%3A24%3A46.055Z&end=2020-06-29T10%3A24%3A46.055Z'
let response: PromiseReturnType<typeof supertest.get>;
before(async () => {
response = await supertest.get(`/api/apm/service-map?start=${start}&end=${end}`);
});
it('returns service map elements', () => {
expect(response.status).to.be(200);
expect(response.body.elements.length).to.be.greaterThan(0);
});
it('returns the correct data', () => {
const elements: Array<{ data: Record<string, any> }> = response.body.elements;
const serviceNames = uniq(
elements
.filter((element) => element.data['service.name'] !== undefined)
.map((element) => element.data['service.name'])
);
expect(response.status).to.be(200);
expectSnapshot(response.body).toMatchInline(`
Object {
"elements": Array [
Object {
"data": Object {
"id": "client~opbeans-node",
"source": "client",
"sourceData": Object {
"agent.name": "rum-js",
"id": "client",
"service.name": "client",
},
"target": "opbeans-node",
"targetData": Object {
"agent.name": "nodejs",
"id": "opbeans-node",
"service.environment": "production",
"service.name": "opbeans-node",
},
},
},
Object {
"data": Object {
"id": "opbeans-java~>opbeans-java:3000",
"source": "opbeans-java",
"sourceData": Object {
"agent.name": "java",
"id": "opbeans-java",
"service.environment": "production",
"service.name": "opbeans-java",
},
"target": ">opbeans-java:3000",
"targetData": Object {
"id": ">opbeans-java:3000",
"label": "opbeans-java:3000",
"span.destination.service.resource": "opbeans-java:3000",
"span.subtype": "http",
"span.type": "external",
},
},
},
Object {
"data": Object {
"id": "opbeans-java~>postgresql",
"source": "opbeans-java",
"sourceData": Object {
"agent.name": "java",
"id": "opbeans-java",
"service.environment": "production",
"service.name": "opbeans-java",
},
"target": ">postgresql",
"targetData": Object {
"id": ">postgresql",
"label": "postgresql",
"span.destination.service.resource": "postgresql",
"span.subtype": "postgresql",
"span.type": "db",
},
},
},
Object {
"data": Object {
"bidirectional": true,
"id": "opbeans-java~opbeans-node",
"source": "opbeans-java",
"sourceData": Object {
"agent.name": "java",
"id": "opbeans-java",
"service.environment": "production",
"service.name": "opbeans-java",
},
"target": "opbeans-node",
"targetData": Object {
"agent.name": "nodejs",
"id": "opbeans-node",
"service.environment": "production",
"service.name": "opbeans-node",
},
},
},
Object {
"data": Object {
"id": "opbeans-node~>93.184.216.34:80",
"source": "opbeans-node",
"sourceData": Object {
"agent.name": "nodejs",
"id": "opbeans-node",
"service.environment": "production",
"service.name": "opbeans-node",
},
"target": ">93.184.216.34:80",
"targetData": Object {
"id": ">93.184.216.34:80",
"label": "93.184.216.34:80",
"span.destination.service.resource": "93.184.216.34:80",
"span.subtype": "http",
"span.type": "external",
},
},
},
Object {
"data": Object {
"id": "opbeans-node~>postgresql",
"source": "opbeans-node",
"sourceData": Object {
"agent.name": "nodejs",
"id": "opbeans-node",
"service.environment": "production",
"service.name": "opbeans-node",
},
"target": ">postgresql",
"targetData": Object {
"id": ">postgresql",
"label": "postgresql",
"span.destination.service.resource": "postgresql",
"span.subtype": "postgresql",
"span.type": "db",
},
},
},
Object {
"data": Object {
"id": "opbeans-node~>redis",
"source": "opbeans-node",
"sourceData": Object {
"agent.name": "nodejs",
"id": "opbeans-node",
"service.environment": "production",
"service.name": "opbeans-node",
},
"target": ">redis",
"targetData": Object {
"id": ">redis",
"label": "redis",
"span.destination.service.resource": "redis",
"span.subtype": "redis",
"span.type": "cache",
},
},
},
Object {
"data": Object {
"id": "opbeans-node~opbeans-java",
"isInverseEdge": true,
"source": "opbeans-node",
"sourceData": Object {
"agent.name": "nodejs",
"id": "opbeans-node",
"service.environment": "production",
"service.name": "opbeans-node",
},
"target": "opbeans-java",
"targetData": Object {
"agent.name": "java",
"id": "opbeans-java",
"service.environment": "production",
"service.name": "opbeans-java",
},
},
},
Object {
"data": Object {
"agent.name": "java",
"id": "opbeans-java",
"service.environment": "production",
"service.name": "opbeans-java",
},
},
Object {
"data": Object {
"agent.name": "nodejs",
"id": "opbeans-node",
"service.environment": "production",
"service.name": "opbeans-node",
},
},
Object {
"data": Object {
"id": ">opbeans-java:3000",
"label": "opbeans-java:3000",
"span.destination.service.resource": "opbeans-java:3000",
"span.subtype": "http",
"span.type": "external",
},
},
Object {
"data": Object {
"agent.name": "rum-js",
"id": "client",
"service.name": "client",
},
},
Object {
"data": Object {
"id": ">redis",
"label": "redis",
"span.destination.service.resource": "redis",
"span.subtype": "redis",
"span.type": "cache",
},
},
Object {
"data": Object {
"id": ">postgresql",
"label": "postgresql",
"span.destination.service.resource": "postgresql",
"span.subtype": "postgresql",
"span.type": "db",
},
},
Object {
"data": Object {
"id": ">93.184.216.34:80",
"label": "93.184.216.34:80",
"span.destination.service.resource": "93.184.216.34:80",
"span.subtype": "http",
"span.type": "external",
},
},
],
}
expectSnapshot(serviceNames).toMatchInline(`
Array [
"opbeans-rum",
"opbeans-go",
"opbeans-node",
"opbeans-python",
"opbeans-ruby",
"opbeans-java",
"opbeans-dotnet",
]
`);
const externalDestinations = uniq(
elements
.filter((element) => element.data.target?.startsWith('>'))
.map((element) => element.data.target)
);
expectSnapshot(externalDestinations).toMatchInline(`
Array [
">postgresql",
">elasticsearch",
">redis",
]
`);
expectSnapshot(elements).toMatch();
});
});
});
@ -269,48 +91,75 @@ export default function serviceMapsApiTests({ getService }: FtrProviderContext)
describe('when there is no data', () => {
it('returns an object with nulls', async () => {
const q = querystring.stringify({
start: '2020-06-28T10:24:46.055Z',
end: '2020-06-29T10:24:46.055Z',
start: metadata.start,
end: metadata.end,
uiFilters: {},
});
const response = await supertest.get(`/api/apm/service-map/service/opbeans-node?${q}`);
expect(response.status).to.be(200);
expect(response.body).to.eql({
avgCpuUsage: null,
avgErrorRate: null,
avgMemoryUsage: null,
transactionStats: {
avgRequestsPerMinute: null,
avgTransactionDuration: null,
},
});
expect(response.body.avgCpuUsage).to.be(null);
expect(response.body.avgErrorRate).to.be(null);
expect(response.body.avgMemoryUsage).to.be(null);
expect(response.body.transactionStats.avgRequestsPerMinute).to.be(null);
expect(response.body.transactionStats.avgTransactionDuration).to.be(null);
});
});
});
describe('when there is data with anomalies', () => {
before(() => esArchiver.load('apm_8.0.0'));
after(() => esArchiver.unload('apm_8.0.0'));
before(() => esArchiver.load(archiveName));
after(() => esArchiver.unload(archiveName));
it('returns service map elements', async () => {
const start = encodeURIComponent('2020-09-10T06:00:00.000Z');
const end = encodeURIComponent('2020-09-10T07:00:00.000Z');
let response: PromiseReturnType<typeof supertest.get>;
const response = await supertest.get(`/api/apm/service-map?start=${start}&end=${end}`);
before(async () => {
response = await supertest.get(`/api/apm/service-map?start=${start}&end=${end}`);
});
it('returns service map elements with anomaly stats', () => {
expect(response.status).to.be(200);
const dataWithAnomalies = response.body.elements.filter(
(el: { data: { serviceAnomalyStats?: {} } }) => !isEmpty(el.data.serviceAnomalyStats)
);
expect(dataWithAnomalies).to.not.empty();
dataWithAnomalies.forEach(({ data }: any) => {
expect(
Object.values(data.serviceAnomalyStats).filter((value) => isEmpty(value))
).to.not.empty();
});
});
it('returns the correct anomaly stats', () => {
const dataWithAnomalies = response.body.elements.filter(
(el: { data: { serviceAnomalyStats?: {} } }) => !isEmpty(el.data.serviceAnomalyStats)
);
expectSnapshot(dataWithAnomalies.length).toMatchInline(`1`);
expectSnapshot(dataWithAnomalies.slice(0, 3)).toMatchInline(`
Array [
Object {
"data": Object {
"agent.name": "java",
"id": "opbeans-java",
"service.environment": "production",
"service.name": "opbeans-java",
"serviceAnomalyStats": Object {
"actualValue": 1707977.2499999995,
"anomalyScore": 0.12232533657975532,
"jobId": "apm-production-229a-high_mean_transaction_duration",
"transactionType": "request",
},
},
},
]
`);
expectSnapshot(response.body).toMatch();
});
});
});
}