Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[performance] enable journey run against cloud deployments #156720

Merged
merged 15 commits into from
May 9, 2023
Merged
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
---
id: kibDevTutorialRunningPerformanceJourneyInCloud
slug: /kibana-dev-docs/tutorial/performance/running_performance_journey_in_cloud
title: Running Performance Journey In Cloud
summary: Learn how to run performance journey against Cloud cluster
date: 2023-05-04
tags: ['kibana', 'onboarding', 'setup', 'performance', 'development', 'telemetry']
---

## Overview
As a way to better understand user experience with Kibana in cloud, we support running performance journeys against
Cloud deployments.
The process takes a few steps:
- Create a cloud deployment
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a minimum setting (RAM/zones) for Kibana? or the default kibana setting enough?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think deployment size is up to each team to decide as we probably would like to test different ones and compare. We might define some defaults later.

- Re-configure deployment with APM enabled and reporting metrics to the monitoring cluster
- Create a user with `superuser` role to run tests with
- Checkout the branch that matches your cloud deployment version
- Run the performance journey

### Re-configure deployment for Kibana and Elasticsearch
We use [kibana-ops-e2e-perf](https://kibana-ops-e2e-perf.kb.us-central1.gcp.cloud.es.io/) cluster to monitor performance testing.

If you would like to report APM metrics to this cluster, copy `SECRET_TOKEN` and `SERVER_URL` values from [packages/kbn-journeys/journey/journey_apm_config.ts](https://github.com/elastic/kibana/blob/60c82765779419d356a131e212682b69b035804b/packages/kbn-journeys/journey/journey_apm_config.ts#L10-L11)

#### Change Elasticsearch configuration
In the ESS Admin Console, find your deployment and navigate to `Security` page. Click `Add Settings` under `Elasticsearch keystore` and add new entry:

```
Setting name: tracing.apm.secret_token
Secret: <SECRET_TOKEN>
```

Navigate to `Advanced Edit` page and change `Deployment Configuration` by adding the following JSON object to `resources.elasticsearch.plan.elasticsearch`:
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Advanced Edit" link wont be visible until "Edit" button is clicked. we could start the sentence like:

Navigate to Edit-> Advanced Edit page ...


```
"user_settings_override_json": {
"tracing.apm.enabled": "true",
"tracing.apm.environment": "development",
"tracing.apm.agent.service_name": "elasticsearch",
"tracing.apm.agent.server_url": "<SERVER_URL>",
"tracing.apm.agent.metrics_interval": "120s",
"tracing.apm.agent.transaction_sample_rate": "1"
}
```

Save changes and make sure cluster is restarted successfully.

#### Change Kibana configuration
Navigate to `Advanced Edit` page and change `Deployment Configuration` by adding the following JSON object to `resources.kibana.plan.kibana`:
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Advanced Edit" link wont be visible until "Edit" button is clicked. we could start the sentence like:

Navigate to Edit-> Advanced Edit page ...


```
"user_settings_override_json": {
"elastic.apm.active": true,
"elastic.apm.breakdownMetrics": false,
"elastic.apm.captureBody": "all",
"elastic.apm.captureRequestHeaders": "true",
"elastic.apm.captureSpanStackTraces": false,
"elastic.apm.centralConfig": false,
"elastic.apm.contextPropagationOnly": "false",
"elastic.apm.environment": "development",
"elastic.apm.globalLabels.deploymentId": "<DEPLOYMENT_ID>",
"elastic.apm.globalLabels.journeyName": "<YOUR_JOURNEY_NAME>",
"elastic.apm.longFieldMaxLength": "300000",
"elastic.apm.metricsInterval": "120s",
"elastic.apm.propagateTracestate": true,
"elastic.apm.sanitizeFieldNames": "password,passwd,pwd,secret,*key,*token*,*session*,*credit*,*card*,*auth*,set-cookie,pw,pass,connect.sid",
"elastic.apm.secretToken": "<SECRET_TOKEN>",
"elastic.apm.serverUrl": "<SERVER_URL>",
"elastic.apm.transactionSampleRate": 1
}
```

Note: DEPLOYMENT_ID and YOUR_JOURNEY_NAME values are optional labels to find the APM traces for your run.

Save changes and make sure cluster is restarted successfully.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can the above kibana and elastic settings be changed together? In such way, the cluster is only needed to be restarted once.

Copy link
Member Author

@dmlemeshko dmlemeshko May 9, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it is. Originally I thought it is easier to re-configure in steps to check if deployment still healthy. But since it is expected to work, I agree we better do it with 1 step and only single deployment restart makes things faster.


### Run the journey
Make sure you have created user with `superuser` role and the Kibana repo branch is matching your deployment version.
Set env variables to run FTR against your cloud deployment:

```
export TEST_KIBANA_URL=https://<username>:<password>@<kibana_url>
export TEST_ES_URL=https://<username>:<password>@<elasticsearch_url>:<port>
export TEST_CLOUD=1
```

Run your journey with the command:

```
node scripts/functional_test_runner.js --config x-pack/performance/journeys/$YOUR_JOURNEY_NAME.ts`
```


1 change: 1 addition & 0 deletions packages/kbn-journeys/journey/journey.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ export interface BaseStepCtx {
kibanaServer: KibanaServer;
es: Es;
retry: RetryService;
auth: Auth;
}

export type AnyStep = Step<{}>;
Expand Down
6 changes: 4 additions & 2 deletions packages/kbn-journeys/journey/journey_ftr_harness.ts
Original file line number Diff line number Diff line change
Expand Up @@ -99,10 +99,11 @@ export class JourneyFtrHarness {

private async setupBrowserAndPage() {
const browser = await this.getBrowserInstance();
this.context = await browser.newContext({ bypassCSP: true });
const browserContextArgs = this.auth.isCloud() ? {} : { bypassCSP: true };
this.context = await browser.newContext(browserContextArgs);

if (this.journeyConfig.shouldAutoLogin()) {
const cookie = await this.auth.login({ username: 'elastic', password: 'changeme' });
const cookie = await this.auth.login();
await this.context.addCookies([cookie]);
}

Expand Down Expand Up @@ -373,6 +374,7 @@ export class JourneyFtrHarness {
kibanaServer: this.kibanaServer,
es: this.es,
retry: this.retry,
auth: this.auth,
});

return this.#_ctx;
Expand Down
29 changes: 24 additions & 5 deletions packages/kbn-journeys/services/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,17 +29,18 @@ export class Auth {
private readonly kibanaServer: KibanaServer
) {}

public async login({ username, password }: Credentials) {
public async login(credentials?: Credentials) {
const baseUrl = new URL(
Url.format({
protocol: this.config.get('servers.kibana.protocol'),
hostname: this.config.get('servers.kibana.hostname'),
port: this.config.get('servers.kibana.port'),
})
);

const loginUrl = new URL('/internal/security/login', baseUrl);
const provider = baseUrl.hostname === 'localhost' ? 'basic' : 'cloud-basic';
const provider = this.isCloud() ? 'cloud-basic' : 'basic';

const version = await this.kibanaServer.version.get();

this.log.info('fetching auth cookie from', loginUrl.href);
const authResponse = await axios.request({
Expand All @@ -49,18 +50,24 @@ export class Auth {
providerType: 'basic',
providerName: provider,
currentURL: new URL('/login?next=%2F', baseUrl).href,
params: { username, password },
params: credentials ?? { username: this.getUsername(), password: this.getPassword() },
},
headers: {
'content-type': 'application/json',
'kbn-version': await this.kibanaServer.version.get(),
'kbn-version': version,
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-origin',
},
validateStatus: () => true,
maxRedirects: 0,
});

if (authResponse.status !== 200) {
throw new Error(
`Kibana auth failed: code: ${authResponse.status}, message: ${authResponse.statusText}`
);
}

const cookie = extractCookieValue(authResponse);
if (cookie) {
this.log.info('captured auth cookie');
Expand All @@ -82,4 +89,16 @@ export class Auth {
url: baseUrl.href,
};
}

public getUsername() {
return this.config.get('servers.kibana.username');
}

public getPassword() {
return this.config.get('servers.kibana.password');
}

public isCloud() {
return this.config.get('servers.kibana.hostname') !== 'localhost';
}
}
9 changes: 6 additions & 3 deletions x-pack/performance/journeys/login.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,14 @@ export const journey = new Journey({
],
maxDuration: '10m',
},
}).step('Login', async ({ page, kbnUrl, inputDelays }) => {
}).step('Login', async ({ page, kbnUrl, inputDelays, auth }) => {
await page.goto(kbnUrl.get());
if (auth.isCloud()) {
await page.click(subj('loginCard-basic/cloud-basic'), { delay: inputDelays.MOUSE_CLICK });
}

await page.type(subj('loginUsername'), 'elastic', { delay: inputDelays.TYPING });
await page.type(subj('loginPassword'), 'changeme', { delay: inputDelays.TYPING });
await page.type(subj('loginUsername'), auth.getUsername(), { delay: inputDelays.TYPING });
await page.type(subj('loginPassword'), auth.getPassword(), { delay: inputDelays.TYPING });
await page.click(subj('loginSubmit'), { delay: inputDelays.MOUSE_CLICK });

await waitForChrome(page);
Expand Down