[APM] Fixing synthtrace import location (#117017)

This commit is contained in:
Cauê Marcondes 2021-11-02 11:38:13 -04:00 committed by GitHub
parent da5371dee5
commit 38213cd0e5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 356 additions and 237 deletions

View file

@ -4,7 +4,6 @@
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import { service, timerange } from '@elastic/apm-synthtrace';
import expect from '@kbn/expect';
import { first, last, sumBy } from 'lodash';
import { isFiniteNumber } from '../../../../plugins/apm/common/utils/is_finite_number';
@ -15,6 +14,7 @@ import {
import { RecursivePartial } from '../../../../plugins/apm/typings/common';
import { FtrProviderContext } from '../../common/ftr_provider_context';
import { registry } from '../../common/registry';
import { config, generateData } from './generate_data';
type ErrorsDistribution =
APIReturnType<'GET /internal/apm/services/{serviceName}/errors/distribution'>;
@ -65,59 +65,9 @@ export default function ApiTest({ getService }: FtrProviderContext) {
{ config: 'basic', archives: ['apm_mappings_only_8.0.0'] },
() => {
describe('errors distribution', () => {
const appleTransaction = {
name: 'GET /apple 🍎 ',
successRate: 75,
failureRate: 25,
};
const bananaTransaction = {
name: 'GET /banana 🍌',
successRate: 50,
failureRate: 50,
};
const { appleTransaction, bananaTransaction } = config;
before(async () => {
const serviceGoProdInstance = service(serviceName, 'production', 'go').instance(
'instance-a'
);
const interval = '1m';
const indices = [appleTransaction, bananaTransaction]
.map((transaction, index) => {
return [
...timerange(start, end)
.interval(interval)
.rate(transaction.successRate)
.flatMap((timestamp) =>
serviceGoProdInstance
.transaction(transaction.name)
.timestamp(timestamp)
.duration(1000)
.success()
.serialize()
),
...timerange(start, end)
.interval(interval)
.rate(transaction.failureRate)
.flatMap((timestamp) =>
serviceGoProdInstance
.transaction(transaction.name)
.errors(
serviceGoProdInstance
.error(`Error ${index}`, transaction.name)
.timestamp(timestamp)
)
.duration(1000)
.timestamp(timestamp)
.failure()
.serialize()
),
];
})
.flatMap((_) => _);
await synthtraceEsClient.index(indices);
await generateData({ serviceName, start, end, synthtraceEsClient });
});
after(() => synthtraceEsClient.clean());

View file

@ -0,0 +1,72 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import { service, SynthtraceEsClient, timerange } from '@elastic/apm-synthtrace';
export const config = {
appleTransaction: {
name: 'GET /apple 🍎 ',
successRate: 75,
failureRate: 25,
},
bananaTransaction: {
name: 'GET /banana 🍌',
successRate: 50,
failureRate: 50,
},
};
export async function generateData({
synthtraceEsClient,
serviceName,
start,
end,
}: {
synthtraceEsClient: SynthtraceEsClient;
serviceName: string;
start: number;
end: number;
}) {
const serviceGoProdInstance = service(serviceName, 'production', 'go').instance('instance-a');
const interval = '1m';
const { bananaTransaction, appleTransaction } = config;
const documents = [appleTransaction, bananaTransaction]
.map((transaction, index) => {
return [
...timerange(start, end)
.interval(interval)
.rate(transaction.successRate)
.flatMap((timestamp) =>
serviceGoProdInstance
.transaction(transaction.name)
.timestamp(timestamp)
.duration(1000)
.success()
.serialize()
),
...timerange(start, end)
.interval(interval)
.rate(transaction.failureRate)
.flatMap((timestamp) =>
serviceGoProdInstance
.transaction(transaction.name)
.errors(
serviceGoProdInstance.error(`Error ${index}`, transaction.name).timestamp(timestamp)
)
.duration(1000)
.timestamp(timestamp)
.failure()
.serialize()
),
];
})
.flatMap((_) => _);
await synthtraceEsClient.index(documents);
}

View file

@ -0,0 +1,92 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import expect from '@kbn/expect';
import {
APIClientRequestParamsOf,
APIReturnType,
} from '../../../../plugins/apm/public/services/rest/createCallApmApi';
import { RecursivePartial } from '../../../../plugins/apm/typings/common';
import { FtrProviderContext } from '../../common/ftr_provider_context';
import { registry } from '../../common/registry';
import { config, generateData } from './generate_data';
type ErrorsDistribution =
APIReturnType<'GET /internal/apm/services/{serviceName}/errors/{groupId}'>;
export default function ApiTest({ getService }: FtrProviderContext) {
const apmApiClient = getService('apmApiClient');
const synthtraceEsClient = getService('synthtraceEsClient');
const serviceName = 'synth-go';
const start = new Date('2021-01-01T00:00:00.000Z').getTime();
const end = new Date('2021-01-01T00:15:00.000Z').getTime() - 1;
async function callApi(
overrides?: RecursivePartial<
APIClientRequestParamsOf<'GET /internal/apm/services/{serviceName}/errors/{groupId}'>['params']
>
) {
const response = await apmApiClient.readUser({
endpoint: 'GET /internal/apm/services/{serviceName}/errors/{groupId}',
params: {
path: {
serviceName,
groupId: 'foo',
...overrides?.path,
},
query: {
start: new Date(start).toISOString(),
end: new Date(end).toISOString(),
environment: 'ENVIRONMENT_ALL',
kuery: '',
...overrides?.query,
},
},
});
return response;
}
registry.when('when data is not loaded', { config: 'basic', archives: [] }, () => {
it('handles the empty state', async () => {
const response = await callApi();
expect(response.status).to.be(200);
expect(response.body.occurrencesCount).to.be(0);
});
});
registry.when(
'when data is loaded',
{ config: 'basic', archives: ['apm_mappings_only_8.0.0'] },
() => {
const { bananaTransaction } = config;
describe('error group id', () => {
before(async () => {
await generateData({ serviceName, start, end, synthtraceEsClient });
});
after(() => synthtraceEsClient.clean());
describe('return correct data', () => {
let errorsDistribution: ErrorsDistribution;
before(async () => {
const response = await callApi({
path: { groupId: '0000000000000000000000000Error 1' },
});
errorsDistribution = response.body;
});
it('displays correct number of occurrences', () => {
const numberOfBuckets = 15;
expect(errorsDistribution.occurrencesCount).to.equal(
bananaTransaction.failureRate * numberOfBuckets
);
});
});
});
}
);
}

View file

@ -14,249 +14,254 @@ export default function apmApiIntegrationTests(providerContext: FtrProviderConte
describe('APM API tests', function () {
this.tags('ciGroup1');
// // inspect feature
// describe('inspect/inspect', function () {
// loadTestFile(require.resolve('./inspect/inspect'));
// });
// inspect feature
describe('inspect/inspect', function () {
loadTestFile(require.resolve('./inspect/inspect'));
});
// // alerts
// describe('alerts/chart_preview', function () {
// loadTestFile(require.resolve('./alerts/chart_preview'));
// });
// alerts
describe('alerts/chart_preview', function () {
loadTestFile(require.resolve('./alerts/chart_preview'));
});
// describe('alerts/rule_registry', function () {
// loadTestFile(require.resolve('./alerts/rule_registry'));
// });
describe('alerts/rule_registry', function () {
loadTestFile(require.resolve('./alerts/rule_registry'));
});
// // correlations
// describe('correlations/failed_transactions', function () {
// loadTestFile(require.resolve('./correlations/failed_transactions'));
// });
// correlations
describe('correlations/failed_transactions', function () {
loadTestFile(require.resolve('./correlations/failed_transactions'));
});
// describe('correlations/latency', function () {
// loadTestFile(require.resolve('./correlations/latency'));
// });
describe('correlations/latency', function () {
loadTestFile(require.resolve('./correlations/latency'));
});
// describe('event_metadata/event_metadata', function () {
// loadTestFile(require.resolve('./event_metadata/event_metadata'));
// });
describe('event_metadata/event_metadata', function () {
loadTestFile(require.resolve('./event_metadata/event_metadata'));
});
// describe('metrics_charts/metrics_charts', function () {
// loadTestFile(require.resolve('./metrics_charts/metrics_charts'));
// });
describe('metrics_charts/metrics_charts', function () {
loadTestFile(require.resolve('./metrics_charts/metrics_charts'));
});
// describe('observability_overview/has_data', function () {
// loadTestFile(require.resolve('./observability_overview/has_data'));
// });
describe('observability_overview/has_data', function () {
loadTestFile(require.resolve('./observability_overview/has_data'));
});
// describe('observability_overview/observability_overview', function () {
// loadTestFile(require.resolve('./observability_overview/observability_overview'));
// });
describe('observability_overview/observability_overview', function () {
loadTestFile(require.resolve('./observability_overview/observability_overview'));
});
// describe('service_maps/service_maps', function () {
// loadTestFile(require.resolve('./service_maps/service_maps'));
// });
describe('service_maps/service_maps', function () {
loadTestFile(require.resolve('./service_maps/service_maps'));
});
// // Service overview
// describe('service_overview/dependencies', function () {
// loadTestFile(require.resolve('./service_overview/dependencies'));
// });
// Service overview
describe('service_overview/dependencies', function () {
loadTestFile(require.resolve('./service_overview/dependencies'));
});
// describe('service_overview/instances_main_statistics', function () {
// loadTestFile(require.resolve('./service_overview/instances_main_statistics'));
// });
describe('service_overview/instances_main_statistics', function () {
loadTestFile(require.resolve('./service_overview/instances_main_statistics'));
});
// describe('service_overview/instances_detailed_statistics', function () {
// loadTestFile(require.resolve('./service_overview/instances_detailed_statistics'));
// });
describe('service_overview/instances_detailed_statistics', function () {
loadTestFile(require.resolve('./service_overview/instances_detailed_statistics'));
});
// describe('service_overview/instance_details', function () {
// loadTestFile(require.resolve('./service_overview/instance_details'));
// });
describe('service_overview/instance_details', function () {
loadTestFile(require.resolve('./service_overview/instance_details'));
});
// // Services
// describe('services/agent', function () {
// loadTestFile(require.resolve('./services/agent'));
// });
// Services
describe('services/agent', function () {
loadTestFile(require.resolve('./services/agent'));
});
// describe('services/annotations', function () {
// loadTestFile(require.resolve('./services/annotations'));
// loadTestFile(require.resolve('./services/derived_annotations'));
// });
describe('services/annotations', function () {
loadTestFile(require.resolve('./services/annotations'));
loadTestFile(require.resolve('./services/derived_annotations'));
});
// describe('services/service_details', function () {
// loadTestFile(require.resolve('./services/service_details'));
// });
describe('services/service_details', function () {
loadTestFile(require.resolve('./services/service_details'));
});
// describe('services/service_icons', function () {
// loadTestFile(require.resolve('./services/service_icons'));
// });
describe('services/service_icons', function () {
loadTestFile(require.resolve('./services/service_icons'));
});
// describe('services/throughput', function () {
// loadTestFile(require.resolve('./services/throughput'));
// });
describe('services/throughput', function () {
loadTestFile(require.resolve('./services/throughput'));
});
// describe('service apis throughput', function () {
// loadTestFile(require.resolve('./throughput/service_apis'));
// });
describe('service apis throughput', function () {
loadTestFile(require.resolve('./throughput/service_apis'));
});
// describe('dependencies throughput', function () {
// loadTestFile(require.resolve('./throughput/dependencies_apis'));
// });
describe('dependencies throughput', function () {
loadTestFile(require.resolve('./throughput/dependencies_apis'));
});
// describe('services/top_services', function () {
// loadTestFile(require.resolve('./services/top_services'));
// });
describe('services/top_services', function () {
loadTestFile(require.resolve('./services/top_services'));
});
// describe('services/transaction_types', function () {
// loadTestFile(require.resolve('./services/transaction_types'));
// });
describe('services/transaction_types', function () {
loadTestFile(require.resolve('./services/transaction_types'));
});
// describe('services/error_groups_main_statistics', function () {
// loadTestFile(require.resolve('./services/error_groups/error_groups_main_statistics'));
// });
describe('services/error_groups_main_statistics', function () {
loadTestFile(require.resolve('./services/error_groups/error_groups_main_statistics'));
});
// describe('services/error_groups_detailed_statistics', function () {
// loadTestFile(require.resolve('./services/error_groups/error_groups_detailed_statistics'));
// });
describe('services/error_groups_detailed_statistics', function () {
loadTestFile(require.resolve('./services/error_groups/error_groups_detailed_statistics'));
});
// describe('services/detailed_statistics', function () {
// loadTestFile(require.resolve('./services/services_detailed_statistics'));
// });
describe('services/detailed_statistics', function () {
loadTestFile(require.resolve('./services/services_detailed_statistics'));
});
// // Settings
// describe('settings/anomaly_detection/basic', function () {
// loadTestFile(require.resolve('./settings/anomaly_detection/basic'));
// });
// Settinges
describe('settings/anomaly_detection/basic', function () {
loadTestFile(require.resolve('./settings/anomaly_detection/basic'));
});
// describe('settings/anomaly_detection/no_access_user', function () {
// loadTestFile(require.resolve('./settings/anomaly_detection/no_access_user'));
// });
describe('settings/anomaly_detection/no_access_user', function () {
loadTestFile(require.resolve('./settings/anomaly_detection/no_access_user'));
});
// describe('settings/anomaly_detection/read_user', function () {
// loadTestFile(require.resolve('./settings/anomaly_detection/read_user'));
// });
describe('settings/anomaly_detection/read_user', function () {
loadTestFile(require.resolve('./settings/anomaly_detection/read_user'));
});
// describe('settings/anomaly_detection/write_user', function () {
// loadTestFile(require.resolve('./settings/anomaly_detection/write_user'));
// });
describe('settings/anomaly_detection/write_user', function () {
loadTestFile(require.resolve('./settings/anomaly_detection/write_user'));
});
// describe('settings/agent_configuration', function () {
// loadTestFile(require.resolve('./settings/agent_configuration'));
// });
describe('settings/agent_configuration', function () {
loadTestFile(require.resolve('./settings/agent_configuration'));
});
// describe('settings/custom_link', function () {
// loadTestFile(require.resolve('./settings/custom_link'));
// });
describe('settings/custom_link', function () {
loadTestFile(require.resolve('./settings/custom_link'));
});
// // suggestions
// describe('suggestions', function () {
// loadTestFile(require.resolve('./suggestions/suggestions'));
// });
// suggestions
describe('suggestions', function () {
loadTestFile(require.resolve('./suggestions/suggestions'));
});
// // traces
// describe('traces/top_traces', function () {
// loadTestFile(require.resolve('./traces/top_traces'));
// });
// describe('/internal/apm/traces/{traceId}', function () {
// loadTestFile(require.resolve('./traces/trace_by_id'));
// });
// traces
describe('traces/top_traces', function () {
loadTestFile(require.resolve('./traces/top_traces'));
});
describe('/internal/apm/traces/{traceId}', function () {
loadTestFile(require.resolve('./traces/trace_by_id'));
});
// // transactions
// describe('transactions/breakdown', function () {
// loadTestFile(require.resolve('./transactions/breakdown'));
// });
// transactions
describe('transactions/breakdown', function () {
loadTestFile(require.resolve('./transactions/breakdown'));
});
// describe('transactions/trace_samples', function () {
// loadTestFile(require.resolve('./transactions/trace_samples'));
// });
describe('transactions/trace_samples', function () {
loadTestFile(require.resolve('./transactions/trace_samples'));
});
// describe('transactions/error_rate', function () {
// loadTestFile(require.resolve('./transactions/error_rate'));
// });
describe('transactions/error_rate', function () {
loadTestFile(require.resolve('./transactions/error_rate'));
});
// describe('transactions/latency_overall_distribution', function () {
// loadTestFile(require.resolve('./transactions/latency_overall_distribution'));
// });
describe('transactions/latency_overall_distribution', function () {
loadTestFile(require.resolve('./transactions/latency_overall_distribution'));
});
// describe('transactions/latency', function () {
// loadTestFile(require.resolve('./transactions/latency'));
// });
describe('transactions/latency', function () {
loadTestFile(require.resolve('./transactions/latency'));
});
// describe('transactions/transactions_groups_main_statistics', function () {
// loadTestFile(require.resolve('./transactions/transactions_groups_main_statistics'));
// });
describe('transactions/transactions_groups_main_statistics', function () {
loadTestFile(require.resolve('./transactions/transactions_groups_main_statistics'));
});
// describe('transactions/transactions_groups_detailed_statistics', function () {
// loadTestFile(require.resolve('./transactions/transactions_groups_detailed_statistics'));
// });
describe('transactions/transactions_groups_detailed_statistics', function () {
loadTestFile(require.resolve('./transactions/transactions_groups_detailed_statistics'));
});
// // feature control
// describe('feature_controls', function () {
// loadTestFile(require.resolve('./feature_controls'));
// });
// feature control
describe('feature_controls', function () {
loadTestFile(require.resolve('./feature_controls'));
});
// // CSM
// describe('csm/csm_services', function () {
// loadTestFile(require.resolve('./csm/csm_services'));
// });
// CSM
describe('csm/csm_services', function () {
loadTestFile(require.resolve('./csm/csm_services'));
});
// describe('csm/has_rum_data', function () {
// loadTestFile(require.resolve('./csm/has_rum_data'));
// });
describe('csm/has_rum_data', function () {
loadTestFile(require.resolve('./csm/has_rum_data'));
});
// describe('csm/js_errors', function () {
// loadTestFile(require.resolve('./csm/js_errors'));
// });
describe('csm/js_errors', function () {
loadTestFile(require.resolve('./csm/js_errors'));
});
// describe('csm/long_task_metrics', function () {
// loadTestFile(require.resolve('./csm/long_task_metrics'));
// });
describe('csm/long_task_metrics', function () {
loadTestFile(require.resolve('./csm/long_task_metrics'));
});
// describe('csm/page_load_dist', function () {
// loadTestFile(require.resolve('./csm/page_load_dist'));
// });
describe('csm/page_load_dist', function () {
loadTestFile(require.resolve('./csm/page_load_dist'));
});
// describe('csm/page_views', function () {
// loadTestFile(require.resolve('./csm/page_views'));
// });
describe('csm/page_views', function () {
loadTestFile(require.resolve('./csm/page_views'));
});
// describe('csm/url_search', function () {
// loadTestFile(require.resolve('./csm/url_search'));
// });
describe('csm/url_search', function () {
loadTestFile(require.resolve('./csm/url_search'));
});
// describe('csm/web_core_vitals', function () {
// loadTestFile(require.resolve('./csm/web_core_vitals'));
// });
describe('csm/web_core_vitals', function () {
loadTestFile(require.resolve('./csm/web_core_vitals'));
});
// describe('historical_data/has_data', function () {
// loadTestFile(require.resolve('./historical_data/has_data'));
// });
describe('historical_data/has_data', function () {
loadTestFile(require.resolve('./historical_data/has_data'));
});
// describe('error_rate/service_apis', function () {
// loadTestFile(require.resolve('./error_rate/service_apis'));
// });
describe('error_rate/service_apis', function () {
loadTestFile(require.resolve('./error_rate/service_apis'));
});
// describe('latency/service_apis', function () {
// loadTestFile(require.resolve('./latency/service_apis'));
// });
describe('latency/service_apis', function () {
loadTestFile(require.resolve('./latency/service_apis'));
});
// describe('errors/distribution', function () {
// loadTestFile(require.resolve('./errors/distribution'));
// });
// Errors
describe('errors/group_id', function () {
loadTestFile(require.resolve('./errors/group_id'));
});
describe('errors/distribution', function () {
loadTestFile(require.resolve('./errors/distribution'));
});
describe('errors/error_group_list', function () {
loadTestFile(require.resolve('./errors/error_group_list'));
});
// // Dependencies
// describe('dependencies/metadata', function () {
// loadTestFile(require.resolve('./dependencies/metadata'));
// });
// Dependencies
describe('dependencies/metadata', function () {
loadTestFile(require.resolve('./dependencies/metadata'));
});
// describe('dependencies/top_dependencies', function () {
// loadTestFile(require.resolve('./dependencies/top_dependencies'));
// });
describe('dependencies/top_dependencies', function () {
loadTestFile(require.resolve('./dependencies/top_dependencies'));
});
registry.run(providerContext);
});