Skip to content

Commit

Permalink
Migrate /test/apm_api_integration/tests/custom_dashboards to be deplo…
Browse files Browse the repository at this point in the history
…yment-agnostic API tests
  • Loading branch information
miloszmarcinkowski committed Nov 7, 2024
1 parent 4c61876 commit 20e1e11
Show file tree
Hide file tree
Showing 5 changed files with 211 additions and 196 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
* 2.0.
*/

import { ApmApiClient } from '../../common/config';
import { ApmApiProvider } from '../../../../services/apm_api';

export type ApmApiClient = ReturnType<typeof ApmApiProvider>;

export async function getServiceDashboardApi(
apmApiClient: ApmApiClient,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,193 @@
/*
* 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 { apm, timerange } from '@kbn/apm-synthtrace-client';

import type { ApmSynthtraceEsClient } from '@kbn/apm-synthtrace';
import type { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context';
import {
getServiceDashboardApi,
getLinkServiceDashboardApi,
deleteAllServiceDashboard,
} from './api_helper';

export default function ApiTest({ getService }: DeploymentAgnosticFtrProviderContext) {
const apmApiClient = getService('apmApi');
const synthtrace = getService('synthtrace');

const start = '2023-08-22T00:00:00.000Z';
const end = '2023-08-22T00:15:00.000Z';

describe('Service dashboards', () => {
describe('when data is not loaded', () => {
it('handles empty state', async () => {
const response = await getServiceDashboardApi(apmApiClient, 'synth-go', start, end);
expect(response.status).to.be(200);
expect(response.body.serviceDashboards).to.eql([]);
});
});

describe('when data is loaded', () => {
const range = timerange(new Date(start).getTime(), new Date(end).getTime());
let apmSynthtraceEsClient: ApmSynthtraceEsClient;

const goInstance = apm
.service({
name: 'synth-go',
environment: 'production',
agentName: 'go',
})
.instance('go-instance');

const javaInstance = apm
.service({
name: 'synth-java',
environment: 'production',
agentName: 'java',
})
.instance('java-instance');

before(async () => {
apmSynthtraceEsClient = await synthtrace.createApmSynthtraceEsClient();

return apmSynthtraceEsClient.index([
range
.interval('1s')
.rate(4)
.generator((timestamp) =>
goInstance
.transaction({ transactionName: 'GET /api' })
.timestamp(timestamp)
.duration(1000)
.success()
),
range
.interval('1s')
.rate(4)
.generator((timestamp) =>
javaInstance
.transaction({ transactionName: 'GET /api' })
.timestamp(timestamp)
.duration(1000)
.success()
),
]);
});

after(() => {
return apmSynthtraceEsClient.clean();
});

afterEach(async () => {
await deleteAllServiceDashboard(apmApiClient, 'synth-go', start, end);
});

describe('and when data is not loaded', () => {
it('creates a new service dashboard', async () => {
const serviceDashboard = {
dashboardSavedObjectId: 'dashboard-saved-object-id',
serviceFiltersEnabled: true,
kuery: 'service.name: synth-go',
};
const createResponse = await getLinkServiceDashboardApi({
apmApiClient,
...serviceDashboard,
});
expect(createResponse.status).to.be(200);
expect(createResponse.body).to.have.property('id');
expect(createResponse.body).to.have.property('updatedAt');

expect(createResponse.body).to.have.property(
'dashboardSavedObjectId',
serviceDashboard.dashboardSavedObjectId
);
expect(createResponse.body).to.have.property('kuery', serviceDashboard.kuery);
expect(createResponse.body).to.have.property(
'serviceEnvironmentFilterEnabled',
serviceDashboard.serviceFiltersEnabled
);
expect(createResponse.body).to.have.property(
'serviceNameFilterEnabled',
serviceDashboard.serviceFiltersEnabled
);

const dasboardForGoService = await getServiceDashboardApi(
apmApiClient,
'synth-go',
start,
end
);
const dashboardForJavaService = await getServiceDashboardApi(
apmApiClient,
'synth-java',
start,
end
);
expect(dashboardForJavaService.body.serviceDashboards.length).to.be(0);
expect(dasboardForGoService.body.serviceDashboards.length).to.be(1);
});

it('updates the existing linked service dashboard', async () => {
const serviceDashboard = {
dashboardSavedObjectId: 'dashboard-saved-object-id',
serviceFiltersEnabled: true,
kuery: 'service.name: synth-go or agent.name: java',
};

await getLinkServiceDashboardApi({
apmApiClient,
...serviceDashboard,
});

const dasboardForGoService = await getServiceDashboardApi(
apmApiClient,
'synth-go',
start,
end
);

const updateResponse = await getLinkServiceDashboardApi({
apmApiClient,
customDashboardId: dasboardForGoService.body.serviceDashboards[0].id,
...serviceDashboard,
serviceFiltersEnabled: true,
});

expect(updateResponse.status).to.be(200);

const updateddasboardForGoService = await getServiceDashboardApi(
apmApiClient,
'synth-go',
start,
end
);
expect(updateddasboardForGoService.body.serviceDashboards.length).to.be(1);
expect(updateddasboardForGoService.body.serviceDashboards[0]).to.have.property(
'serviceEnvironmentFilterEnabled',
true
);
expect(updateddasboardForGoService.body.serviceDashboards[0]).to.have.property(
'serviceNameFilterEnabled',
true
);
expect(updateddasboardForGoService.body.serviceDashboards[0]).to.have.property(
'kuery',
'service.name: synth-go or agent.name: java'
);

const dashboardForJavaService = await getServiceDashboardApi(
apmApiClient,
'synth-java',
start,
end
);
expect(dashboardForJavaService.body.serviceDashboards.length).to.be(1);
});
});
});
});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/*
* 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 { DeploymentAgnosticFtrProviderContext } from '../../../../ftr_provider_context';

export default function ({ loadTestFile }: DeploymentAgnosticFtrProviderContext) {
describe('custom_dashboards', () => {
loadTestFile(require.resolve('./custom_dashboards.spec.ts'));
});
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@ export default function apmApiIntegrationTests({
}: DeploymentAgnosticFtrProviderContext) {
describe('APM', function () {
loadTestFile(require.resolve('./agent_explorer'));
loadTestFile(require.resolve('./custom_dashboards'));
});
}
Loading

0 comments on commit 20e1e11

Please sign in to comment.