From cb6fbc0e1b406675724181a3e9f59459b5f8f892 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Louv-Jansen?= Date: Tue, 7 Jul 2020 22:40:28 +0200 Subject: [PATCH 01/27] [APM] Add API tests (#70740) --- .../routes/settings/agent_configuration.ts | 12 +- .../fixtures/es_archiver/8.0.0/data.json.gz | Bin 0 -> 193103 bytes .../fixtures/es_archiver/8.0.0/mappings.json | 25698 ++++++++++++++++ .../basic/tests/agent_configuration.ts | 236 +- .../apm_api_integration/basic/tests/index.ts | 12 + .../basic/tests/service_maps.ts | 10 +- .../basic/tests/services/top_services.ts | 76 + .../tests/services/transactions/agent_name.ts | 44 + .../expectations/top_transaction_groups.json | 1942 ++ .../expectations/transaction_charts.json | 1973 ++ .../transactions/top_transaction_groups.ts | 63 + .../transactions/transaction_charts.ts | 55 + .../transactions/transaction_types.ts | 44 + .../tests/traces/top_traces.expectation.json | 3378 ++ .../basic/tests/traces/top_traces.ts | 54 + .../trial/tests/service_maps.ts | 12 +- 16 files changed, 33568 insertions(+), 41 deletions(-) create mode 100644 x-pack/test/apm_api_integration/basic/fixtures/es_archiver/8.0.0/data.json.gz create mode 100644 x-pack/test/apm_api_integration/basic/fixtures/es_archiver/8.0.0/mappings.json create mode 100644 x-pack/test/apm_api_integration/basic/tests/services/top_services.ts create mode 100644 x-pack/test/apm_api_integration/basic/tests/services/transactions/agent_name.ts create mode 100644 x-pack/test/apm_api_integration/basic/tests/services/transactions/expectations/top_transaction_groups.json create mode 100644 x-pack/test/apm_api_integration/basic/tests/services/transactions/expectations/transaction_charts.json create mode 100644 x-pack/test/apm_api_integration/basic/tests/services/transactions/top_transaction_groups.ts create mode 100644 x-pack/test/apm_api_integration/basic/tests/services/transactions/transaction_charts.ts create mode 100644 x-pack/test/apm_api_integration/basic/tests/services/transactions/transaction_types.ts create mode 100644 x-pack/test/apm_api_integration/basic/tests/traces/top_traces.expectation.json create mode 100644 x-pack/test/apm_api_integration/basic/tests/traces/top_traces.ts diff --git a/x-pack/plugins/apm/server/routes/settings/agent_configuration.ts b/x-pack/plugins/apm/server/routes/settings/agent_configuration.ts index f5c9cc2adf238..0350ebfb9196c 100644 --- a/x-pack/plugins/apm/server/routes/settings/agent_configuration.ts +++ b/x-pack/plugins/apm/server/routes/settings/agent_configuration.ts @@ -136,15 +136,19 @@ export const createOrUpdateAgentConfigurationRoute = createRoute(() => ({ }, })); +const searchParamsRt = t.intersection([ + t.type({ service: serviceRt }), + t.partial({ etag: t.string, mark_as_applied_by_agent: t.boolean }), +]); + +export type AgentConfigSearchParams = t.TypeOf; + // Lookup single configuration (used by APM Server) export const agentConfigurationSearchRoute = createRoute(() => ({ method: 'POST', path: '/api/apm/settings/agent-configuration/search', params: { - body: t.intersection([ - t.type({ service: serviceRt }), - t.partial({ etag: t.string, mark_as_applied_by_agent: t.boolean }), - ]), + body: searchParamsRt, }, handler: async ({ context, request }) => { const { diff --git a/x-pack/test/apm_api_integration/basic/fixtures/es_archiver/8.0.0/data.json.gz b/x-pack/test/apm_api_integration/basic/fixtures/es_archiver/8.0.0/data.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..e9360878b7bb724924c89bbaea7b243a555f13d3 GIT binary patch literal 193103 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
#xkG+Z- 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 { + describe('when no data is loaded', () => { + it('handles the empty state for services', async () => { + const { body } = await getServices(); + expect(body).to.eql(['ALL_OPTION_VALUE']); + }); + + it('handles the empty state for environments', async () => { + const { body } = await getEnvironments('myservice'); + expect(body).to.eql([{ name: 'ALL_OPTION_VALUE', alreadyConfigured: false }]); + }); + + it('handles the empty state for agent names', async () => { + const { body } = await getAgentName('myservice'); + expect(body).to.eql({}); + }); + }); + + describe('when data is loaded', () => { + before(() => esArchiver.load('8.0.0')); + after(() => esArchiver.unload('8.0.0')); + + it('returns all services', async () => { + const { body } = await getServices(); + expect(body).to.eql(['ALL_OPTION_VALUE', 'client', 'opbeans-java', 'opbeans-node']); + }); + + it('returns the environments', async () => { + const { body } = await getEnvironments('opbeans-node'); + expect(body).to.eql([ + { name: 'ALL_OPTION_VALUE', alreadyConfigured: false }, + { name: 'production', alreadyConfigured: false }, + ]); + }); + + it('returns the agent names', async () => { + const { body } = await getAgentName('opbeans-node'); + expect(body).to.eql({ agentName: 'nodejs' }); + }); + }); + + describe('as a read-only user', () => { + const newConfig = { service: {}, settings: { transaction_sample_rate: '0.55' } }; + it('throws when attempting to create config', async () => { + try { + await createConfiguration(newConfig, { user: 'read' }); + + // ensure that `createConfiguration` throws + expect(true).to.be(false); + } catch (e) { + expect(e.res.statusCode).to.be(404); + } + }); + + describe('when a configuration already exists', () => { + before(async () => createConfiguration(newConfig)); + after(async () => deleteConfiguration(newConfig)); + + it('throws when attempting to update config', async () => { + try { + await updateConfiguration(newConfig, { user: 'read' }); + + // ensure that `updateConfiguration` throws + expect(true).to.be(false); + } catch (e) { + expect(e.res.statusCode).to.be(404); + } + }); + + it('throws when attempting to delete config', async () => { + try { + await deleteConfiguration(newConfig, { user: 'read' }); + + // ensure that `deleteConfiguration` throws + expect(true).to.be(false); + } catch (e) { + expect(e.res.statusCode).to.be(404); + } + }); + }); + }); + describe('when creating one configuration', () => { const newConfig = { service: {}, @@ -79,30 +199,53 @@ export default function agentConfigurationTests({ getService }: FtrProviderConte etag: '7312bdcc34999629a3d39df24ed9b2a7553c0c39', }; - before(async () => { + it('can create and delete config', async () => { + // assert that config does not exist + const res1 = await searchConfigurations(searchParams); + expect(res1.status).to.equal(404); + + // assert that config was created await createConfiguration(newConfig); - }); + const res2 = await searchConfigurations(searchParams); + expect(res2.status).to.equal(200); - it('can find the created config', async () => { - const { status, body } = await searchConfigurations(searchParams); - expect(status).to.equal(200); - expect(body._source.service).to.eql({}); - expect(body._source.settings).to.eql({ transaction_sample_rate: '0.55' }); + // assert that config was deleted + await deleteConfiguration(newConfig); + const res3 = await searchConfigurations(searchParams); + expect(res3.status).to.equal(404); }); - it('can update the created config', async () => { - await updateConfiguration({ service: {}, settings: { transaction_sample_rate: '0.85' } }); + describe('when a configuration exists', () => { + before(async () => createConfiguration(newConfig)); + after(async () => deleteConfiguration(newConfig)); - const { status, body } = await searchConfigurations(searchParams); - expect(status).to.equal(200); - expect(body._source.service).to.eql({}); - expect(body._source.settings).to.eql({ transaction_sample_rate: '0.85' }); - }); + it('can find the config', async () => { + const { status, body } = await searchConfigurations(searchParams); + expect(status).to.equal(200); + expect(body._source.service).to.eql({}); + expect(body._source.settings).to.eql({ transaction_sample_rate: '0.55' }); + }); - it('can delete the created config', async () => { - await deleteConfiguration(newConfig); - const { status } = await searchConfigurations(searchParams); - expect(status).to.equal(404); + it('can list the config', async () => { + const { status, body } = await getAllConfigurations(); + expect(status).to.equal(200); + expect(omitTimestamp(body)).to.eql([ + { + service: {}, + settings: { transaction_sample_rate: '0.55' }, + applied_by_agent: false, + etag: 'eb88a8997666cc4b33745ef355a1bbd7c4782f2d', + }, + ]); + }); + + it('can update the config', async () => { + await updateConfiguration({ service: {}, settings: { transaction_sample_rate: '0.85' } }); + const { status, body } = await searchConfigurations(searchParams); + expect(status).to.equal(200); + expect(body._source.service).to.eql({}); + expect(body._source.settings).to.eql({ transaction_sample_rate: '0.85' }); + }); }); }); @@ -165,6 +308,43 @@ export default function agentConfigurationTests({ getService }: FtrProviderConte }, ]; + it('can list all configs', async () => { + const { status, body } = await getAllConfigurations(); + expect(status).to.equal(200); + expect(orderBy(omitTimestamp(body), ['settings.transaction_sample_rate'])).to.eql([ + { + service: {}, + settings: { transaction_sample_rate: '0.1' }, + applied_by_agent: false, + etag: '0758cb18817de60cca29e07480d472694239c4c3', + }, + { + service: { name: 'my_service' }, + settings: { transaction_sample_rate: '0.2' }, + applied_by_agent: false, + etag: 'e04737637056fdf1763bf0ef0d3fcb86e89ae5fc', + }, + { + service: { name: 'my_service', environment: 'development' }, + settings: { transaction_sample_rate: '0.3' }, + applied_by_agent: false, + etag: 'af4dac62621b6762e6281481d1f7523af1124120', + }, + { + service: { environment: 'production' }, + settings: { transaction_sample_rate: '0.4' }, + applied_by_agent: false, + etag: '8d1bf8e6b778b60af351117e2cf53fb1ee570068', + }, + { + service: { environment: 'development' }, + settings: { transaction_sample_rate: '0.5' }, + applied_by_agent: false, + etag: '4ce40da57e3c71daca704121c784b911ec05ae81', + }, + ]); + }); + for (const agentRequest of agentsRequests) { it(`${agentRequest.service.name} / ${agentRequest.service.environment}`, async () => { const { status, body } = await searchConfigurations({ @@ -273,3 +453,7 @@ async function waitFor(cb: () => Promise, retries = 50): Promise omit(config, '@timestamp')); +} diff --git a/x-pack/test/apm_api_integration/basic/tests/index.ts b/x-pack/test/apm_api_integration/basic/tests/index.ts index 02185b0761c5b..3658208e38d00 100644 --- a/x-pack/test/apm_api_integration/basic/tests/index.ts +++ b/x-pack/test/apm_api_integration/basic/tests/index.ts @@ -14,5 +14,17 @@ export default function apmApiIntegrationTests({ loadTestFile }: FtrProviderCont loadTestFile(require.resolve('./agent_configuration')); loadTestFile(require.resolve('./custom_link')); loadTestFile(require.resolve('./service_maps')); + + // traces + loadTestFile(require.resolve('./traces/top_traces')); + + // services + loadTestFile(require.resolve('./services/top_services')); + + // services/transaction + loadTestFile(require.resolve('./services/transactions/top_transaction_groups')); + loadTestFile(require.resolve('./services/transactions/transaction_charts')); + loadTestFile(require.resolve('./services/transactions/agent_name')); + loadTestFile(require.resolve('./services/transactions/transaction_types')); }); } diff --git a/x-pack/test/apm_api_integration/basic/tests/service_maps.ts b/x-pack/test/apm_api_integration/basic/tests/service_maps.ts index 64910d2b45632..45972aaf529af 100644 --- a/x-pack/test/apm_api_integration/basic/tests/service_maps.ts +++ b/x-pack/test/apm_api_integration/basic/tests/service_maps.ts @@ -10,11 +10,13 @@ import { FtrProviderContext } from '../../common/ftr_provider_context'; export default function serviceMapsApiTests({ getService }: FtrProviderContext) { const supertest = getService('supertest'); + // url parameters + const start = encodeURIComponent('2020-06-29T06:45:00.000Z'); + const end = encodeURIComponent('2020-06-29T06:49:00.000Z'); + describe('Service Maps', () => { - it('should only be available to users with Platinum license (or higher)', async () => { - const response = await supertest.get( - '/api/apm/service-map?start=2020-06-28T10%3A24%3A46.055Z&end=2020-06-29T10%3A24%3A46.055Z' - ); + 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( diff --git a/x-pack/test/apm_api_integration/basic/tests/services/top_services.ts b/x-pack/test/apm_api_integration/basic/tests/services/top_services.ts new file mode 100644 index 0000000000000..ea3ed2539c12f --- /dev/null +++ b/x-pack/test/apm_api_integration/basic/tests/services/top_services.ts @@ -0,0 +1,76 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { sortBy } from 'lodash'; +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../common/ftr_provider_context'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const esArchiver = getService('esArchiver'); + + // url parameters + const start = encodeURIComponent('2020-06-29T06:45:00.000Z'); + const end = encodeURIComponent('2020-06-29T06:49:00.000Z'); + const uiFilters = encodeURIComponent(JSON.stringify({})); + + describe('APM Services Overview', () => { + describe('when data is not loaded ', () => { + it('handles the empty state', async () => { + const response = await supertest.get( + `/api/apm/services?start=${start}&end=${end}&uiFilters=${uiFilters}` + ); + + expect(response.status).to.be(200); + expect(response.body).to.eql({ hasHistoricalData: false, hasLegacyData: false, items: [] }); + }); + }); + + describe('when data is loaded', () => { + before(() => esArchiver.load('8.0.0')); + after(() => esArchiver.unload('8.0.0')); + + it('returns a list of services', async () => { + const response = await supertest.get( + `/api/apm/services?start=${start}&end=${end}&uiFilters=${uiFilters}` + ); + // sort services to mitigate unstable sort order + const services = sortBy(response.body.items, ['serviceName']); + + expect(response.status).to.be(200); + expect(services).to.eql([ + { + serviceName: 'client', + agentName: 'rum-js', + transactionsPerMinute: 2, + errorsPerMinute: 2.75, + avgResponseTime: 116375, + environments: [], + }, + { + serviceName: 'opbeans-java', + agentName: 'java', + transactionsPerMinute: 30.75, + errorsPerMinute: 4.5, + avgResponseTime: 25636.349593495936, + environments: ['production'], + }, + { + serviceName: 'opbeans-node', + agentName: 'nodejs', + transactionsPerMinute: 31, + errorsPerMinute: 3.75, + avgResponseTime: 38682.52419354839, + environments: ['production'], + }, + ]); + + expect(response.body.hasHistoricalData).to.be(true); + expect(response.body.hasLegacyData).to.be(false); + }); + }); + }); +} diff --git a/x-pack/test/apm_api_integration/basic/tests/services/transactions/agent_name.ts b/x-pack/test/apm_api_integration/basic/tests/services/transactions/agent_name.ts new file mode 100644 index 0000000000000..a9aeaf813aa5c --- /dev/null +++ b/x-pack/test/apm_api_integration/basic/tests/services/transactions/agent_name.ts @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const esArchiver = getService('esArchiver'); + + // url parameters + const start = encodeURIComponent('2020-06-29T06:45:00.000Z'); + const end = encodeURIComponent('2020-06-29T06:49:00.000Z'); + + describe('Agent name', () => { + describe('when data is not loaded ', () => { + it('handles the empty state', async () => { + const response = await supertest.get( + `/api/apm/services/opbeans-node/agent_name?start=${start}&end=${end}` + ); + + expect(response.status).to.be(200); + expect(response.body).to.eql({}); + }); + }); + + describe('when data is loaded', () => { + before(() => esArchiver.load('8.0.0')); + after(() => esArchiver.unload('8.0.0')); + + it('returns the agent name', async () => { + const response = await supertest.get( + `/api/apm/services/opbeans-node/agent_name?start=${start}&end=${end}` + ); + + expect(response.status).to.be(200); + expect(response.body).to.eql({ agentName: 'nodejs' }); + }); + }); + }); +} diff --git a/x-pack/test/apm_api_integration/basic/tests/services/transactions/expectations/top_transaction_groups.json b/x-pack/test/apm_api_integration/basic/tests/services/transactions/expectations/top_transaction_groups.json new file mode 100644 index 0000000000000..7d314e75e4d1d --- /dev/null +++ b/x-pack/test/apm_api_integration/basic/tests/services/transactions/expectations/top_transaction_groups.json @@ -0,0 +1,1942 @@ +{ + "items": [ + { + "name": "GET /api", + "sample": { + "@timestamp": "2020-06-29T06:48:41.454Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:43.992834Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Type": ["application/json;charset=UTF-8"], + "Date": ["Mon, 29 Jun 2020 06:48:41 GMT"], + "Transfer-Encoding": ["chunked"], + "X-Powered-By": ["Express"] + }, + "status_code": 200 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413321454009 }, + "trace": { "id": "0507830eeff93f7bf1a354e4031097b3" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 8334 }, + "id": "878250a8b937445d", + "name": "GET /api", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "started": 1 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/api/products/6", + "original": "/api/products/6", + "path": "/api/products/6", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 259040, + "averageResponseTime": 51175.73170731707, + "transactionsPerMinute": 10.25, + "impact": 100 + }, + { + "name": "POST /api/orders", + "sample": { + "@timestamp": "2020-06-29T06:48:39.953Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:43.991549Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "body": { "original": "[REDACTED]" }, + "headers": { + "Accept": ["application/json"], + "Connection": ["close"], + "Content-Length": ["129"], + "Content-Type": ["application/json"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "post", + "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Length": ["13"], + "Content-Type": ["application/json; charset=utf-8"], + "Date": ["Mon, 29 Jun 2020 06:48:40 GMT"], + "Etag": ["W/\"d-eEOWU4Cnr5DZ23ErRUeYu9oOIks\""], + "X-Powered-By": ["Express"] + }, + "status_code": 200 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413319953033 }, + "trace": { "id": "52b8fda5f6df745b990740ba18378620" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 270684 }, + "id": "a3afc2a112e9c893", + "name": "POST /api/orders", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "started": 16 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/api/orders", + "original": "/api/orders", + "path": "/api/orders", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 270336, + "averageResponseTime": 270684, + "transactionsPerMinute": 0.25, + "impact": 12.686265169840583 + }, + { + "name": "GET /api/customers", + "sample": { + "@timestamp": "2020-06-29T06:48:37.952Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:39.492402Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Length": ["186769"], + "Content-Type": ["application/json; charset=utf-8"], + "Date": ["Mon, 29 Jun 2020 06:48:37 GMT"], + "Etag": ["W/\"2d991-yG3J8W/roH7fSxXTudZrO27Ax9s\""], + "X-Powered-By": ["Express"] + }, + "status_code": 200 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413317952016 }, + "trace": { "id": "5d99327edae38ed735e8d7a6028cf719" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 16824 }, + "id": "071808429ec9d00b", + "name": "GET /api/customers", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "started": 2 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/api/customers", + "original": "/api/customers", + "path": "/api/customers", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 26432, + "averageResponseTime": 16896.8, + "transactionsPerMinute": 1.25, + "impact": 3.790160870423129 + }, + { + "name": "GET /log-message", + "sample": { + "@timestamp": "2020-06-29T06:48:28.944Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:39.370695Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Length": ["24"], + "Content-Type": ["text/html; charset=utf-8"], + "Date": ["Mon, 29 Jun 2020 06:48:28 GMT"], + "Etag": ["W/\"18-MS3VbhH7auHMzO0fUuNF6v14N/M\""], + "X-Powered-By": ["Express"] + }, + "status_code": 500 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413308944016 }, + "trace": { "id": "afabe4cb397616f5ec35a2f3da49ba62" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 26788 }, + "id": "cc8c4261387507cf", + "name": "GET /log-message", + "result": "HTTP 5xx", + "sampled": true, + "span_count": { "started": 0 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/log-message", + "original": "/log-message", + "path": "/log-message", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 38528, + "averageResponseTime": 32667.5, + "transactionsPerMinute": 0.5, + "impact": 2.875276331059301 + }, + { + "name": "GET /*", + "sample": { + "@timestamp": "2020-06-29T06:48:42.454Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:43.995202Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Length": ["813"], + "Content-Type": ["text/html"], + "Date": ["Mon, 29 Jun 2020 06:48:42 GMT"], + "X-Powered-By": ["Express"] + }, + "status_code": 200 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "parent": { "id": "5baa6c3bedc93f9d" }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413322454015 }, + "trace": { "id": "022b01256b291a4c417199d91ec8755f" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 1737 }, + "id": "eff3e45e0d9529d9", + "name": "GET /*", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "started": 0 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/", + "original": "/", + "path": "/", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 4472, + "averageResponseTime": 3262.95, + "transactionsPerMinute": 5, + "impact": 2.8716452680799467 + }, + { + "name": "GET /api/orders", + "sample": { + "@timestamp": "2020-06-29T06:48:40.106Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.6" }, + "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:43.988104Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Accept": [ + "text/plain, application/json, application/x-jackson-smile, application/cbor, application/*+json, */*" + ], + "Connection": ["keep-alive"], + "Elastic-Apm-Traceparent": [ + "00-90bd7780b32cc51a7f4c200b1e0c170f-5ff346d602ce27b0-01" + ], + "Host": ["opbeans-node:3000"], + "Traceparent": ["00-90bd7780b32cc51a7f4c200b1e0c170f-5ff346d602ce27b0-01"], + "User-Agent": ["Java/11.0.7"] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.6" } + }, + "response": { + "headers": { + "Connection": ["keep-alive"], + "Content-Length": ["2"], + "Content-Type": ["application/json; charset=utf-8"], + "Date": ["Mon, 29 Jun 2020 06:48:40 GMT"], + "Etag": ["W/\"2-l9Fw4VUO7kr8CvBlt4zaMCqXZ0w\""], + "X-Powered-By": ["Express"] + }, + "status_code": 200 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "parent": { "id": "5ff346d602ce27b0" }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.6" }, + "timestamp": { "us": 1593413320106015 }, + "trace": { "id": "90bd7780b32cc51a7f4c200b1e0c170f" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 7424 }, + "id": "f3dd00d12c594cba", + "name": "GET /api/orders", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "started": 2 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/api/orders", + "original": "/api/orders", + "path": "/api/orders", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Spider" }, + "name": "Java", + "original": "Java/11.0.7", + "version": "0.7." + } + }, + "p95": 11616, + "averageResponseTime": 7615.625, + "transactionsPerMinute": 2, + "impact": 2.6645791239678345 + }, + { + "name": "GET /api/products", + "sample": { + "@timestamp": "2020-06-29T06:48:27.452Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.6" }, + "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:29.978463Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Accept": [ + "text/plain, application/json, application/x-jackson-smile, application/cbor, application/*+json, */*" + ], + "Connection": ["keep-alive"], + "Elastic-Apm-Traceparent": [ + "00-27b168a328e0fd442377de8eaa0bf582-2c86873dedb66c2c-01" + ], + "Host": ["opbeans-node:3000"], + "Traceparent": ["00-27b168a328e0fd442377de8eaa0bf582-2c86873dedb66c2c-01"], + "User-Agent": ["Java/11.0.7"] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.6" } + }, + "response": { + "headers": { + "Connection": ["keep-alive"], + "Content-Length": ["1023"], + "Content-Type": ["application/json; charset=utf-8"], + "Date": ["Mon, 29 Jun 2020 06:48:27 GMT"], + "Etag": ["W/\"3ff-VyOxcDApb+a/lnjkm9FeTOGSDrs\""], + "X-Powered-By": ["Express"] + }, + "status_code": 200 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "parent": { "id": "2c86873dedb66c2c" }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.6" }, + "timestamp": { "us": 1593413307452013 }, + "trace": { "id": "27b168a328e0fd442377de8eaa0bf582" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 4292 }, + "id": "141ecc2dfd55eeea", + "name": "GET /api/products", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "started": 2 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/api/products", + "original": "/api/products", + "path": "/api/products", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Spider" }, + "name": "Java", + "original": "Java/11.0.7", + "version": "0.7." + } + }, + "p95": 22112, + "averageResponseTime": 8585, + "transactionsPerMinute": 1.75, + "impact": 2.624924094061731 + }, + { + "name": "GET /api/products/:id", + "sample": { + "@timestamp": "2020-06-29T06:48:24.977Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:27.004717Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Length": ["231"], + "Content-Type": ["application/json; charset=utf-8"], + "Date": ["Mon, 29 Jun 2020 06:48:24 GMT"], + "Etag": ["W/\"e7-kkuzj37GZDzXDh0CWqh5Gan0VO4\""], + "X-Powered-By": ["Express"] + }, + "status_code": 200 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413304977014 }, + "trace": { "id": "b9b290bca14c99962fa9a1c509401630" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 4482 }, + "id": "b8d8284ff1fc25d6", + "name": "GET /api/products/:id", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "started": 1 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/api/products/3", + "original": "/api/products/3", + "path": "/api/products/3", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 37856, + "averageResponseTime": 13516.5, + "transactionsPerMinute": 1, + "impact": 2.3368756900811305 + }, + { + "name": "GET /api/types", + "sample": { + "@timestamp": "2020-06-29T06:48:26.443Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:29.977518Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Length": ["112"], + "Content-Type": ["application/json; charset=utf-8"], + "Date": ["Mon, 29 Jun 2020 06:48:26 GMT"], + "Etag": ["W/\"70-1z6hT7P1WHgBgS/BeUEVeHhOCQU\""], + "X-Powered-By": ["Express"] + }, + "status_code": 200 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413306443014 }, + "trace": { "id": "be3f4eb50d253afc032c90eacaa85072" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 8892 }, + "id": "ccce129bb8c6b125", + "name": "GET /api/types", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "started": 2 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/api/types", + "original": "/api/types", + "path": "/api/types", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 45248, + "averageResponseTime": 26992.5, + "transactionsPerMinute": 0.5, + "impact": 2.3330057413794503 + }, + { + "name": "GET static file", + "sample": { + "@timestamp": "2020-06-29T06:48:40.953Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:43.992454Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + }, + "response": { + "headers": { + "Accept-Ranges": ["bytes"], + "Cache-Control": ["public, max-age=0"], + "Connection": ["close"], + "Content-Length": ["15086"], + "Content-Type": ["image/x-icon"], + "Date": ["Mon, 29 Jun 2020 06:48:40 GMT"], + "Etag": ["W/\"3aee-1725aff14f0\""], + "Last-Modified": ["Thu, 28 May 2020 11:16:06 GMT"], + "X-Powered-By": ["Express"] + }, + "status_code": 200 + }, + "version": "1.1" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413320953016 }, + "trace": { "id": "292393440bbe04385f3c2e3715ac35fe" }, + "transaction": { + "duration": { "us": 1671 }, + "id": "d1d964ca1865dce3", + "name": "GET static file", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "started": 0 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/favicon.ico", + "original": "/favicon.ico", + "path": "/favicon.ico", + "port": 3000, + "scheme": "http" + }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 11900, + "averageResponseTime": 3492.9285714285716, + "transactionsPerMinute": 3.5, + "impact": 2.0901067389184496 + }, + { + "name": "GET /api/products/top", + "sample": { + "@timestamp": "2020-06-29T06:48:18.211Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.8" }, + "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:21.007197Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Accept": ["*/*"], + "Accept-Encoding": ["gzip, deflate"], + "Connection": ["keep-alive"], + "Host": ["opbeans-node:3000"], + "Referer": ["http://opbeans-node:3000/dashboard"], + "Traceparent": ["00-4879105b2de793ca54ce7299aff0f5ce-0d67fab9c9dec84d-01"], + "User-Agent": [ + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.0 Safari/537.36" + ] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.8" } + }, + "response": { + "headers": { + "Connection": ["keep-alive"], + "Content-Length": ["2"], + "Content-Type": ["application/json; charset=utf-8"], + "Date": ["Mon, 29 Jun 2020 06:48:18 GMT"], + "Etag": ["W/\"2-l9Fw4VUO7kr8CvBlt4zaMCqXZ0w\""], + "X-Powered-By": ["Express"] + }, + "status_code": 200 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "parent": { "id": "0d67fab9c9dec84d" }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.8" }, + "timestamp": { "us": 1593413298211013 }, + "trace": { "id": "4879105b2de793ca54ce7299aff0f5ce" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 12820 }, + "id": "b15b12c837ab8b89", + "name": "GET /api/products/top", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "started": 1 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/api/products/top", + "original": "/api/products/top", + "path": "/api/products/top", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "HeadlessChrome", + "original": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.0 Safari/537.36", + "os": { "name": "Linux" }, + "version": "79.0.3945" + } + }, + "p95": 33216, + "averageResponseTime": 22958.5, + "transactionsPerMinute": 0.5, + "impact": 1.9475397398343375 + }, + { + "name": "GET /api/stats", + "sample": { + "@timestamp": "2020-06-29T06:48:39.451Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:43.984824Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Length": ["92"], + "Content-Type": ["application/json; charset=utf-8"], + "Date": ["Mon, 29 Jun 2020 06:48:39 GMT"], + "Etag": ["W/\"5c-6I+bqIiLxvkWuwBUnTxhBoK4lBk\""], + "X-Powered-By": ["Express"] + }, + "status_code": 200 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413319451016 }, + "trace": { "id": "a05787cb03a0af0863fab5e05de942f1" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 5050 }, + "id": "a7e004eba8f021ce", + "name": "GET /api/stats", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "started": 4 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/api/stats", + "original": "/api/stats", + "path": "/api/stats", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 15136, + "averageResponseTime": 7105.333333333333, + "transactionsPerMinute": 1.5, + "impact": 1.7905918202662048 + }, + { + "name": "GET /log-error", + "sample": { + "@timestamp": "2020-06-29T06:48:07.467Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:18.533253Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Length": ["24"], + "Content-Type": ["text/html; charset=utf-8"], + "Date": ["Mon, 29 Jun 2020 06:48:07 GMT"], + "Etag": ["W/\"18-MS3VbhH7auHMzO0fUuNF6v14N/M\""], + "X-Powered-By": ["Express"] + }, + "status_code": 500 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413287467017 }, + "trace": { "id": "d518b2c4d72cd2aaf1e39bad7ebcbdbb" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 35846 }, + "id": "c7a30c1b076907ec", + "name": "GET /log-error", + "result": "HTTP 5xx", + "sampled": true, + "span_count": { "started": 0 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/log-error", + "original": "/log-error", + "path": "/log-error", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 35840, + "averageResponseTime": 35846, + "transactionsPerMinute": 0.25, + "impact": 1.466376117925459 + }, + { + "name": "POST /api", + "sample": { + "@timestamp": "2020-06-29T06:48:25.478Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:27.005671Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "body": { "original": "[REDACTED]" }, + "headers": { + "Accept": ["application/json"], + "Connection": ["close"], + "Content-Length": ["129"], + "Content-Type": ["application/json"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "post", + "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + }, + "response": { + "headers": { + "Allow": ["GET"], + "Connection": ["close"], + "Content-Type": ["application/json;charset=UTF-8"], + "Date": ["Mon, 29 Jun 2020 06:48:25 GMT"], + "Transfer-Encoding": ["chunked"], + "X-Powered-By": ["Express"] + }, + "status_code": 405 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413305478010 }, + "trace": { "id": "4bd9027dd1e355ec742970e2d6333124" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 20011 }, + "id": "94104435cf151478", + "name": "POST /api", + "result": "HTTP 4xx", + "sampled": true, + "span_count": { "started": 1 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/api/orders", + "original": "/api/orders", + "path": "/api/orders", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 19968, + "averageResponseTime": 20011, + "transactionsPerMinute": 0.25, + "impact": 0.7098250353192541 + }, + { + "name": "GET /api/types/:id", + "sample": { + "@timestamp": "2020-06-29T06:48:12.972Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:18.543436Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Length": ["205"], + "Content-Type": ["application/json; charset=utf-8"], + "Date": ["Mon, 29 Jun 2020 06:48:12 GMT"], + "Etag": ["W/\"cd-pFMi1QOVY6YqWe+nwcbZVviCths\""], + "X-Powered-By": ["Express"] + }, + "status_code": 200 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413292972011 }, + "trace": { "id": "aea65cef5f902dda5d8e38f9fb38864d" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 6300 }, + "id": "a5bdbe43ac05fae2", + "name": "GET /api/types/:id", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "started": 2 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/api/types/2", + "original": "/api/types/2", + "path": "/api/types/2", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 10080, + "averageResponseTime": 8181, + "transactionsPerMinute": 0.5, + "impact": 0.5354862351657939 + }, + { + "name": "GET /api/orders/:id", + "sample": { + "@timestamp": "2020-06-29T06:48:35.951Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:39.484133Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Length": ["0"], + "Date": ["Mon, 29 Jun 2020 06:48:35 GMT"], + "X-Powered-By": ["Express"] + }, + "status_code": 404 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413315951017 }, + "trace": { "id": "95979caa80e6622cbbb2d308800c3016" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 3210 }, + "id": "30344988dace0b43", + "name": "GET /api/orders/:id", + "result": "HTTP 4xx", + "sampled": true, + "span_count": { "started": 1 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/api/orders/117", + "original": "/api/orders/117", + "path": "/api/orders/117", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 7184, + "averageResponseTime": 4749.666666666667, + "transactionsPerMinute": 0.75, + "impact": 0.43453312891085794 + }, + { + "name": "GET /api/products/:id/customers", + "sample": { + "@timestamp": "2020-06-29T06:48:41.956Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:43.994692Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Length": ["2"], + "Content-Type": ["application/json; charset=utf-8"], + "Date": ["Mon, 29 Jun 2020 06:48:41 GMT"], + "Etag": ["W/\"2-l9Fw4VUO7kr8CvBlt4zaMCqXZ0w\""], + "X-Powered-By": ["Express"] + }, + "status_code": 200 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413321956016 }, + "trace": { "id": "f735ac5fca8f83eebc748f4a2e009e61" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 3896 }, + "id": "b24ce95c855f83a4", + "name": "GET /api/products/:id/customers", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "started": 1 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/api/products/5/customers", + "original": "/api/products/5/customers", + "path": "/api/products/5/customers", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 5616, + "averageResponseTime": 4757, + "transactionsPerMinute": 0.5, + "impact": 0.20830834986820673 + }, + { + "name": "GET /throw-error", + "sample": { + "@timestamp": "2020-06-29T06:48:42.954Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:43.996435Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "::ffff:172.18.0.7" } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Length": ["148"], + "Content-Security-Policy": ["default-src 'none'"], + "Content-Type": ["text/html; charset=utf-8"], + "Date": ["Mon, 29 Jun 2020 06:48:42 GMT"], + "X-Content-Type-Options": ["nosniff"], + "X-Powered-By": ["Express"] + }, + "status_code": 500 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413322954016 }, + "trace": { "id": "9d5aee7443a43db9820f622a10dfac6e" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 1928 }, + "id": "8e6fc8c3f99e8fc9", + "name": "GET /throw-error", + "result": "HTTP 5xx", + "sampled": true, + "span_count": { "started": 0 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/throw-error", + "original": "/throw-error", + "path": "/throw-error", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 3224, + "averageResponseTime": 2577, + "transactionsPerMinute": 0.5, + "impact": 0 + } + ], + "isAggregationAccurate": true, + "bucketSize": 100 +} diff --git a/x-pack/test/apm_api_integration/basic/tests/services/transactions/expectations/transaction_charts.json b/x-pack/test/apm_api_integration/basic/tests/services/transactions/expectations/transaction_charts.json new file mode 100644 index 0000000000000..0e878969f269f --- /dev/null +++ b/x-pack/test/apm_api_integration/basic/tests/services/transactions/expectations/transaction_charts.json @@ -0,0 +1,1973 @@ +{ + "apmTimeseries": { + "responseTimes": { + "avg": [ + { "x": 1593413100000, "y": null }, + { "x": 1593413101000, "y": null }, + { "x": 1593413102000, "y": null }, + { "x": 1593413103000, "y": null }, + { "x": 1593413104000, "y": null }, + { "x": 1593413105000, "y": null }, + { "x": 1593413106000, "y": null }, + { "x": 1593413107000, "y": null }, + { "x": 1593413108000, "y": null }, + { "x": 1593413109000, "y": null }, + { "x": 1593413110000, "y": null }, + { "x": 1593413111000, "y": null }, + { "x": 1593413112000, "y": null }, + { "x": 1593413113000, "y": null }, + { "x": 1593413114000, "y": null }, + { "x": 1593413115000, "y": null }, + { "x": 1593413116000, "y": null }, + { "x": 1593413117000, "y": null }, + { "x": 1593413118000, "y": null }, + { "x": 1593413119000, "y": null }, + { "x": 1593413120000, "y": null }, + { "x": 1593413121000, "y": null }, + { "x": 1593413122000, "y": null }, + { "x": 1593413123000, "y": null }, + { "x": 1593413124000, "y": null }, + { "x": 1593413125000, "y": null }, + { "x": 1593413126000, "y": null }, + { "x": 1593413127000, "y": null }, + { "x": 1593413128000, "y": null }, + { "x": 1593413129000, "y": null }, + { "x": 1593413130000, "y": null }, + { "x": 1593413131000, "y": null }, + { "x": 1593413132000, "y": null }, + { "x": 1593413133000, "y": null }, + { "x": 1593413134000, "y": null }, + { "x": 1593413135000, "y": null }, + { "x": 1593413136000, "y": null }, + { "x": 1593413137000, "y": null }, + { "x": 1593413138000, "y": null }, + { "x": 1593413139000, "y": null }, + { "x": 1593413140000, "y": null }, + { "x": 1593413141000, "y": null }, + { "x": 1593413142000, "y": null }, + { "x": 1593413143000, "y": null }, + { "x": 1593413144000, "y": null }, + { "x": 1593413145000, "y": null }, + { "x": 1593413146000, "y": null }, + { "x": 1593413147000, "y": null }, + { "x": 1593413148000, "y": null }, + { "x": 1593413149000, "y": null }, + { "x": 1593413150000, "y": null }, + { "x": 1593413151000, "y": null }, + { "x": 1593413152000, "y": null }, + { "x": 1593413153000, "y": null }, + { "x": 1593413154000, "y": null }, + { "x": 1593413155000, "y": null }, + { "x": 1593413156000, "y": null }, + { "x": 1593413157000, "y": null }, + { "x": 1593413158000, "y": null }, + { "x": 1593413159000, "y": null }, + { "x": 1593413160000, "y": null }, + { "x": 1593413161000, "y": null }, + { "x": 1593413162000, "y": null }, + { "x": 1593413163000, "y": null }, + { "x": 1593413164000, "y": null }, + { "x": 1593413165000, "y": null }, + { "x": 1593413166000, "y": null }, + { "x": 1593413167000, "y": null }, + { "x": 1593413168000, "y": null }, + { "x": 1593413169000, "y": null }, + { "x": 1593413170000, "y": null }, + { "x": 1593413171000, "y": null }, + { "x": 1593413172000, "y": null }, + { "x": 1593413173000, "y": null }, + { "x": 1593413174000, "y": null }, + { "x": 1593413175000, "y": null }, + { "x": 1593413176000, "y": null }, + { "x": 1593413177000, "y": null }, + { "x": 1593413178000, "y": null }, + { "x": 1593413179000, "y": null }, + { "x": 1593413180000, "y": null }, + { "x": 1593413181000, "y": null }, + { "x": 1593413182000, "y": null }, + { "x": 1593413183000, "y": null }, + { "x": 1593413184000, "y": null }, + { "x": 1593413185000, "y": null }, + { "x": 1593413186000, "y": null }, + { "x": 1593413187000, "y": null }, + { "x": 1593413188000, "y": null }, + { "x": 1593413189000, "y": null }, + { "x": 1593413190000, "y": null }, + { "x": 1593413191000, "y": null }, + { "x": 1593413192000, "y": null }, + { "x": 1593413193000, "y": null }, + { "x": 1593413194000, "y": null }, + { "x": 1593413195000, "y": null }, + { "x": 1593413196000, "y": null }, + { "x": 1593413197000, "y": null }, + { "x": 1593413198000, "y": null }, + { "x": 1593413199000, "y": null }, + { "x": 1593413200000, "y": null }, + { "x": 1593413201000, "y": null }, + { "x": 1593413202000, "y": null }, + { "x": 1593413203000, "y": null }, + { "x": 1593413204000, "y": null }, + { "x": 1593413205000, "y": null }, + { "x": 1593413206000, "y": null }, + { "x": 1593413207000, "y": null }, + { "x": 1593413208000, "y": null }, + { "x": 1593413209000, "y": null }, + { "x": 1593413210000, "y": null }, + { "x": 1593413211000, "y": null }, + { "x": 1593413212000, "y": null }, + { "x": 1593413213000, "y": null }, + { "x": 1593413214000, "y": null }, + { "x": 1593413215000, "y": null }, + { "x": 1593413216000, "y": null }, + { "x": 1593413217000, "y": null }, + { "x": 1593413218000, "y": null }, + { "x": 1593413219000, "y": null }, + { "x": 1593413220000, "y": null }, + { "x": 1593413221000, "y": null }, + { "x": 1593413222000, "y": null }, + { "x": 1593413223000, "y": null }, + { "x": 1593413224000, "y": null }, + { "x": 1593413225000, "y": null }, + { "x": 1593413226000, "y": null }, + { "x": 1593413227000, "y": null }, + { "x": 1593413228000, "y": null }, + { "x": 1593413229000, "y": null }, + { "x": 1593413230000, "y": null }, + { "x": 1593413231000, "y": null }, + { "x": 1593413232000, "y": null }, + { "x": 1593413233000, "y": null }, + { "x": 1593413234000, "y": null }, + { "x": 1593413235000, "y": null }, + { "x": 1593413236000, "y": null }, + { "x": 1593413237000, "y": null }, + { "x": 1593413238000, "y": null }, + { "x": 1593413239000, "y": null }, + { "x": 1593413240000, "y": null }, + { "x": 1593413241000, "y": null }, + { "x": 1593413242000, "y": null }, + { "x": 1593413243000, "y": null }, + { "x": 1593413244000, "y": null }, + { "x": 1593413245000, "y": null }, + { "x": 1593413246000, "y": null }, + { "x": 1593413247000, "y": null }, + { "x": 1593413248000, "y": null }, + { "x": 1593413249000, "y": null }, + { "x": 1593413250000, "y": null }, + { "x": 1593413251000, "y": null }, + { "x": 1593413252000, "y": null }, + { "x": 1593413253000, "y": null }, + { "x": 1593413254000, "y": null }, + { "x": 1593413255000, "y": null }, + { "x": 1593413256000, "y": null }, + { "x": 1593413257000, "y": null }, + { "x": 1593413258000, "y": null }, + { "x": 1593413259000, "y": null }, + { "x": 1593413260000, "y": null }, + { "x": 1593413261000, "y": null }, + { "x": 1593413262000, "y": null }, + { "x": 1593413263000, "y": null }, + { "x": 1593413264000, "y": null }, + { "x": 1593413265000, "y": null }, + { "x": 1593413266000, "y": null }, + { "x": 1593413267000, "y": null }, + { "x": 1593413268000, "y": null }, + { "x": 1593413269000, "y": null }, + { "x": 1593413270000, "y": null }, + { "x": 1593413271000, "y": null }, + { "x": 1593413272000, "y": 45093 }, + { "x": 1593413273000, "y": 7498 }, + { "x": 1593413274000, "y": null }, + { "x": 1593413275000, "y": null }, + { "x": 1593413276000, "y": null }, + { "x": 1593413277000, "y": 37709 }, + { "x": 1593413278000, "y": null }, + { "x": 1593413279000, "y": null }, + { "x": 1593413280000, "y": null }, + { "x": 1593413281000, "y": 33097 }, + { "x": 1593413282000, "y": null }, + { "x": 1593413283000, "y": null }, + { "x": 1593413284000, "y": 388507 }, + { "x": 1593413285000, "y": 42331.5 }, + { "x": 1593413286000, "y": 99104.25 }, + { "x": 1593413287000, "y": 18939.5 }, + { "x": 1593413288000, "y": 23229.5 }, + { "x": 1593413289000, "y": 11318 }, + { "x": 1593413290000, "y": 15651.25 }, + { "x": 1593413291000, "y": 2376 }, + { "x": 1593413292000, "y": 7796 }, + { "x": 1593413293000, "y": 7571 }, + { "x": 1593413294000, "y": 4219.333333333333 }, + { "x": 1593413295000, "y": 6827.5 }, + { "x": 1593413296000, "y": 10415.5 }, + { "x": 1593413297000, "y": 10082 }, + { "x": 1593413298000, "y": 6459.375 }, + { "x": 1593413299000, "y": 3131.5 }, + { "x": 1593413300000, "y": 6713.333333333333 }, + { "x": 1593413301000, "y": 8800 }, + { "x": 1593413302000, "y": 3743.5 }, + { "x": 1593413303000, "y": 9239.5 }, + { "x": 1593413304000, "y": 8402 }, + { "x": 1593413305000, "y": 20520.666666666668 }, + { "x": 1593413306000, "y": 9319.5 }, + { "x": 1593413307000, "y": 7694.333333333333 }, + { "x": 1593413308000, "y": 20131 }, + { "x": 1593413309000, "y": 439937.75 }, + { "x": 1593413310000, "y": 11933 }, + { "x": 1593413311000, "y": 18670.5 }, + { "x": 1593413312000, "y": 9232 }, + { "x": 1593413313000, "y": 7602 }, + { "x": 1593413314000, "y": 10428.8 }, + { "x": 1593413315000, "y": 8405.25 }, + { "x": 1593413316000, "y": 10654.5 }, + { "x": 1593413317000, "y": 10250 }, + { "x": 1593413318000, "y": 5775 }, + { "x": 1593413319000, "y": 137867 }, + { "x": 1593413320000, "y": 5694.333333333333 }, + { "x": 1593413321000, "y": 6115 }, + { "x": 1593413322000, "y": 1832.5 }, + { "x": 1593413323000, "y": null }, + { "x": 1593413324000, "y": null }, + { "x": 1593413325000, "y": null }, + { "x": 1593413326000, "y": null }, + { "x": 1593413327000, "y": null }, + { "x": 1593413328000, "y": null }, + { "x": 1593413329000, "y": null }, + { "x": 1593413330000, "y": null }, + { "x": 1593413331000, "y": null }, + { "x": 1593413332000, "y": null }, + { "x": 1593413333000, "y": null }, + { "x": 1593413334000, "y": null }, + { "x": 1593413335000, "y": null }, + { "x": 1593413336000, "y": null }, + { "x": 1593413337000, "y": null }, + { "x": 1593413338000, "y": null }, + { "x": 1593413339000, "y": null }, + { "x": 1593413340000, "y": null } + ], + "p95": [ + { "x": 1593413100000, "y": null }, + { "x": 1593413101000, "y": null }, + { "x": 1593413102000, "y": null }, + { "x": 1593413103000, "y": null }, + { "x": 1593413104000, "y": null }, + { "x": 1593413105000, "y": null }, + { "x": 1593413106000, "y": null }, + { "x": 1593413107000, "y": null }, + { "x": 1593413108000, "y": null }, + { "x": 1593413109000, "y": null }, + { "x": 1593413110000, "y": null }, + { "x": 1593413111000, "y": null }, + { "x": 1593413112000, "y": null }, + { "x": 1593413113000, "y": null }, + { "x": 1593413114000, "y": null }, + { "x": 1593413115000, "y": null }, + { "x": 1593413116000, "y": null }, + { "x": 1593413117000, "y": null }, + { "x": 1593413118000, "y": null }, + { "x": 1593413119000, "y": null }, + { "x": 1593413120000, "y": null }, + { "x": 1593413121000, "y": null }, + { "x": 1593413122000, "y": null }, + { "x": 1593413123000, "y": null }, + { "x": 1593413124000, "y": null }, + { "x": 1593413125000, "y": null }, + { "x": 1593413126000, "y": null }, + { "x": 1593413127000, "y": null }, + { "x": 1593413128000, "y": null }, + { "x": 1593413129000, "y": null }, + { "x": 1593413130000, "y": null }, + { "x": 1593413131000, "y": null }, + { "x": 1593413132000, "y": null }, + { "x": 1593413133000, "y": null }, + { "x": 1593413134000, "y": null }, + { "x": 1593413135000, "y": null }, + { "x": 1593413136000, "y": null }, + { "x": 1593413137000, "y": null }, + { "x": 1593413138000, "y": null }, + { "x": 1593413139000, "y": null }, + { "x": 1593413140000, "y": null }, + { "x": 1593413141000, "y": null }, + { "x": 1593413142000, "y": null }, + { "x": 1593413143000, "y": null }, + { "x": 1593413144000, "y": null }, + { "x": 1593413145000, "y": null }, + { "x": 1593413146000, "y": null }, + { "x": 1593413147000, "y": null }, + { "x": 1593413148000, "y": null }, + { "x": 1593413149000, "y": null }, + { "x": 1593413150000, "y": null }, + { "x": 1593413151000, "y": null }, + { "x": 1593413152000, "y": null }, + { "x": 1593413153000, "y": null }, + { "x": 1593413154000, "y": null }, + { "x": 1593413155000, "y": null }, + { "x": 1593413156000, "y": null }, + { "x": 1593413157000, "y": null }, + { "x": 1593413158000, "y": null }, + { "x": 1593413159000, "y": null }, + { "x": 1593413160000, "y": null }, + { "x": 1593413161000, "y": null }, + { "x": 1593413162000, "y": null }, + { "x": 1593413163000, "y": null }, + { "x": 1593413164000, "y": null }, + { "x": 1593413165000, "y": null }, + { "x": 1593413166000, "y": null }, + { "x": 1593413167000, "y": null }, + { "x": 1593413168000, "y": null }, + { "x": 1593413169000, "y": null }, + { "x": 1593413170000, "y": null }, + { "x": 1593413171000, "y": null }, + { "x": 1593413172000, "y": null }, + { "x": 1593413173000, "y": null }, + { "x": 1593413174000, "y": null }, + { "x": 1593413175000, "y": null }, + { "x": 1593413176000, "y": null }, + { "x": 1593413177000, "y": null }, + { "x": 1593413178000, "y": null }, + { "x": 1593413179000, "y": null }, + { "x": 1593413180000, "y": null }, + { "x": 1593413181000, "y": null }, + { "x": 1593413182000, "y": null }, + { "x": 1593413183000, "y": null }, + { "x": 1593413184000, "y": null }, + { "x": 1593413185000, "y": null }, + { "x": 1593413186000, "y": null }, + { "x": 1593413187000, "y": null }, + { "x": 1593413188000, "y": null }, + { "x": 1593413189000, "y": null }, + { "x": 1593413190000, "y": null }, + { "x": 1593413191000, "y": null }, + { "x": 1593413192000, "y": null }, + { "x": 1593413193000, "y": null }, + { "x": 1593413194000, "y": null }, + { "x": 1593413195000, "y": null }, + { "x": 1593413196000, "y": null }, + { "x": 1593413197000, "y": null }, + { "x": 1593413198000, "y": null }, + { "x": 1593413199000, "y": null }, + { "x": 1593413200000, "y": null }, + { "x": 1593413201000, "y": null }, + { "x": 1593413202000, "y": null }, + { "x": 1593413203000, "y": null }, + { "x": 1593413204000, "y": null }, + { "x": 1593413205000, "y": null }, + { "x": 1593413206000, "y": null }, + { "x": 1593413207000, "y": null }, + { "x": 1593413208000, "y": null }, + { "x": 1593413209000, "y": null }, + { "x": 1593413210000, "y": null }, + { "x": 1593413211000, "y": null }, + { "x": 1593413212000, "y": null }, + { "x": 1593413213000, "y": null }, + { "x": 1593413214000, "y": null }, + { "x": 1593413215000, "y": null }, + { "x": 1593413216000, "y": null }, + { "x": 1593413217000, "y": null }, + { "x": 1593413218000, "y": null }, + { "x": 1593413219000, "y": null }, + { "x": 1593413220000, "y": null }, + { "x": 1593413221000, "y": null }, + { "x": 1593413222000, "y": null }, + { "x": 1593413223000, "y": null }, + { "x": 1593413224000, "y": null }, + { "x": 1593413225000, "y": null }, + { "x": 1593413226000, "y": null }, + { "x": 1593413227000, "y": null }, + { "x": 1593413228000, "y": null }, + { "x": 1593413229000, "y": null }, + { "x": 1593413230000, "y": null }, + { "x": 1593413231000, "y": null }, + { "x": 1593413232000, "y": null }, + { "x": 1593413233000, "y": null }, + { "x": 1593413234000, "y": null }, + { "x": 1593413235000, "y": null }, + { "x": 1593413236000, "y": null }, + { "x": 1593413237000, "y": null }, + { "x": 1593413238000, "y": null }, + { "x": 1593413239000, "y": null }, + { "x": 1593413240000, "y": null }, + { "x": 1593413241000, "y": null }, + { "x": 1593413242000, "y": null }, + { "x": 1593413243000, "y": null }, + { "x": 1593413244000, "y": null }, + { "x": 1593413245000, "y": null }, + { "x": 1593413246000, "y": null }, + { "x": 1593413247000, "y": null }, + { "x": 1593413248000, "y": null }, + { "x": 1593413249000, "y": null }, + { "x": 1593413250000, "y": null }, + { "x": 1593413251000, "y": null }, + { "x": 1593413252000, "y": null }, + { "x": 1593413253000, "y": null }, + { "x": 1593413254000, "y": null }, + { "x": 1593413255000, "y": null }, + { "x": 1593413256000, "y": null }, + { "x": 1593413257000, "y": null }, + { "x": 1593413258000, "y": null }, + { "x": 1593413259000, "y": null }, + { "x": 1593413260000, "y": null }, + { "x": 1593413261000, "y": null }, + { "x": 1593413262000, "y": null }, + { "x": 1593413263000, "y": null }, + { "x": 1593413264000, "y": null }, + { "x": 1593413265000, "y": null }, + { "x": 1593413266000, "y": null }, + { "x": 1593413267000, "y": null }, + { "x": 1593413268000, "y": null }, + { "x": 1593413269000, "y": null }, + { "x": 1593413270000, "y": null }, + { "x": 1593413271000, "y": null }, + { "x": 1593413272000, "y": 45056 }, + { "x": 1593413273000, "y": 10080 }, + { "x": 1593413274000, "y": null }, + { "x": 1593413275000, "y": null }, + { "x": 1593413276000, "y": null }, + { "x": 1593413277000, "y": 37632 }, + { "x": 1593413278000, "y": null }, + { "x": 1593413279000, "y": null }, + { "x": 1593413280000, "y": null }, + { "x": 1593413281000, "y": 33024 }, + { "x": 1593413282000, "y": null }, + { "x": 1593413283000, "y": null }, + { "x": 1593413284000, "y": 761728 }, + { "x": 1593413285000, "y": 81904 }, + { "x": 1593413286000, "y": 358384 }, + { "x": 1593413287000, "y": 36088 }, + { "x": 1593413288000, "y": 44536 }, + { "x": 1593413289000, "y": 11648 }, + { "x": 1593413290000, "y": 31984 }, + { "x": 1593413291000, "y": 2920 }, + { "x": 1593413292000, "y": 9312 }, + { "x": 1593413293000, "y": 10912 }, + { "x": 1593413294000, "y": 6392 }, + { "x": 1593413295000, "y": 11704 }, + { "x": 1593413296000, "y": 10816 }, + { "x": 1593413297000, "y": 12000 }, + { "x": 1593413298000, "y": 15164 }, + { "x": 1593413299000, "y": 3216 }, + { "x": 1593413300000, "y": 9584 }, + { "x": 1593413301000, "y": 21240 }, + { "x": 1593413302000, "y": 5624 }, + { "x": 1593413303000, "y": 11360 }, + { "x": 1593413304000, "y": 12320 }, + { "x": 1593413305000, "y": 38640 }, + { "x": 1593413306000, "y": 9728 }, + { "x": 1593413307000, "y": 17016 }, + { "x": 1593413308000, "y": 26848 }, + { "x": 1593413309000, "y": 1753072 }, + { "x": 1593413310000, "y": 16992 }, + { "x": 1593413311000, "y": 26560 }, + { "x": 1593413312000, "y": 11232 }, + { "x": 1593413313000, "y": 11424 }, + { "x": 1593413314000, "y": 16096 }, + { "x": 1593413315000, "y": 18800 }, + { "x": 1593413316000, "y": 12672 }, + { "x": 1593413317000, "y": 24316 }, + { "x": 1593413318000, "y": 8944 }, + { "x": 1593413319000, "y": 272352 }, + { "x": 1593413320000, "y": 7992 }, + { "x": 1593413321000, "y": 8368 }, + { "x": 1593413322000, "y": 1928 }, + { "x": 1593413323000, "y": null }, + { "x": 1593413324000, "y": null }, + { "x": 1593413325000, "y": null }, + { "x": 1593413326000, "y": null }, + { "x": 1593413327000, "y": null }, + { "x": 1593413328000, "y": null }, + { "x": 1593413329000, "y": null }, + { "x": 1593413330000, "y": null }, + { "x": 1593413331000, "y": null }, + { "x": 1593413332000, "y": null }, + { "x": 1593413333000, "y": null }, + { "x": 1593413334000, "y": null }, + { "x": 1593413335000, "y": null }, + { "x": 1593413336000, "y": null }, + { "x": 1593413337000, "y": null }, + { "x": 1593413338000, "y": null }, + { "x": 1593413339000, "y": null }, + { "x": 1593413340000, "y": null } + ], + "p99": [ + { "x": 1593413100000, "y": null }, + { "x": 1593413101000, "y": null }, + { "x": 1593413102000, "y": null }, + { "x": 1593413103000, "y": null }, + { "x": 1593413104000, "y": null }, + { "x": 1593413105000, "y": null }, + { "x": 1593413106000, "y": null }, + { "x": 1593413107000, "y": null }, + { "x": 1593413108000, "y": null }, + { "x": 1593413109000, "y": null }, + { "x": 1593413110000, "y": null }, + { "x": 1593413111000, "y": null }, + { "x": 1593413112000, "y": null }, + { "x": 1593413113000, "y": null }, + { "x": 1593413114000, "y": null }, + { "x": 1593413115000, "y": null }, + { "x": 1593413116000, "y": null }, + { "x": 1593413117000, "y": null }, + { "x": 1593413118000, "y": null }, + { "x": 1593413119000, "y": null }, + { "x": 1593413120000, "y": null }, + { "x": 1593413121000, "y": null }, + { "x": 1593413122000, "y": null }, + { "x": 1593413123000, "y": null }, + { "x": 1593413124000, "y": null }, + { "x": 1593413125000, "y": null }, + { "x": 1593413126000, "y": null }, + { "x": 1593413127000, "y": null }, + { "x": 1593413128000, "y": null }, + { "x": 1593413129000, "y": null }, + { "x": 1593413130000, "y": null }, + { "x": 1593413131000, "y": null }, + { "x": 1593413132000, "y": null }, + { "x": 1593413133000, "y": null }, + { "x": 1593413134000, "y": null }, + { "x": 1593413135000, "y": null }, + { "x": 1593413136000, "y": null }, + { "x": 1593413137000, "y": null }, + { "x": 1593413138000, "y": null }, + { "x": 1593413139000, "y": null }, + { "x": 1593413140000, "y": null }, + { "x": 1593413141000, "y": null }, + { "x": 1593413142000, "y": null }, + { "x": 1593413143000, "y": null }, + { "x": 1593413144000, "y": null }, + { "x": 1593413145000, "y": null }, + { "x": 1593413146000, "y": null }, + { "x": 1593413147000, "y": null }, + { "x": 1593413148000, "y": null }, + { "x": 1593413149000, "y": null }, + { "x": 1593413150000, "y": null }, + { "x": 1593413151000, "y": null }, + { "x": 1593413152000, "y": null }, + { "x": 1593413153000, "y": null }, + { "x": 1593413154000, "y": null }, + { "x": 1593413155000, "y": null }, + { "x": 1593413156000, "y": null }, + { "x": 1593413157000, "y": null }, + { "x": 1593413158000, "y": null }, + { "x": 1593413159000, "y": null }, + { "x": 1593413160000, "y": null }, + { "x": 1593413161000, "y": null }, + { "x": 1593413162000, "y": null }, + { "x": 1593413163000, "y": null }, + { "x": 1593413164000, "y": null }, + { "x": 1593413165000, "y": null }, + { "x": 1593413166000, "y": null }, + { "x": 1593413167000, "y": null }, + { "x": 1593413168000, "y": null }, + { "x": 1593413169000, "y": null }, + { "x": 1593413170000, "y": null }, + { "x": 1593413171000, "y": null }, + { "x": 1593413172000, "y": null }, + { "x": 1593413173000, "y": null }, + { "x": 1593413174000, "y": null }, + { "x": 1593413175000, "y": null }, + { "x": 1593413176000, "y": null }, + { "x": 1593413177000, "y": null }, + { "x": 1593413178000, "y": null }, + { "x": 1593413179000, "y": null }, + { "x": 1593413180000, "y": null }, + { "x": 1593413181000, "y": null }, + { "x": 1593413182000, "y": null }, + { "x": 1593413183000, "y": null }, + { "x": 1593413184000, "y": null }, + { "x": 1593413185000, "y": null }, + { "x": 1593413186000, "y": null }, + { "x": 1593413187000, "y": null }, + { "x": 1593413188000, "y": null }, + { "x": 1593413189000, "y": null }, + { "x": 1593413190000, "y": null }, + { "x": 1593413191000, "y": null }, + { "x": 1593413192000, "y": null }, + { "x": 1593413193000, "y": null }, + { "x": 1593413194000, "y": null }, + { "x": 1593413195000, "y": null }, + { "x": 1593413196000, "y": null }, + { "x": 1593413197000, "y": null }, + { "x": 1593413198000, "y": null }, + { "x": 1593413199000, "y": null }, + { "x": 1593413200000, "y": null }, + { "x": 1593413201000, "y": null }, + { "x": 1593413202000, "y": null }, + { "x": 1593413203000, "y": null }, + { "x": 1593413204000, "y": null }, + { "x": 1593413205000, "y": null }, + { "x": 1593413206000, "y": null }, + { "x": 1593413207000, "y": null }, + { "x": 1593413208000, "y": null }, + { "x": 1593413209000, "y": null }, + { "x": 1593413210000, "y": null }, + { "x": 1593413211000, "y": null }, + { "x": 1593413212000, "y": null }, + { "x": 1593413213000, "y": null }, + { "x": 1593413214000, "y": null }, + { "x": 1593413215000, "y": null }, + { "x": 1593413216000, "y": null }, + { "x": 1593413217000, "y": null }, + { "x": 1593413218000, "y": null }, + { "x": 1593413219000, "y": null }, + { "x": 1593413220000, "y": null }, + { "x": 1593413221000, "y": null }, + { "x": 1593413222000, "y": null }, + { "x": 1593413223000, "y": null }, + { "x": 1593413224000, "y": null }, + { "x": 1593413225000, "y": null }, + { "x": 1593413226000, "y": null }, + { "x": 1593413227000, "y": null }, + { "x": 1593413228000, "y": null }, + { "x": 1593413229000, "y": null }, + { "x": 1593413230000, "y": null }, + { "x": 1593413231000, "y": null }, + { "x": 1593413232000, "y": null }, + { "x": 1593413233000, "y": null }, + { "x": 1593413234000, "y": null }, + { "x": 1593413235000, "y": null }, + { "x": 1593413236000, "y": null }, + { "x": 1593413237000, "y": null }, + { "x": 1593413238000, "y": null }, + { "x": 1593413239000, "y": null }, + { "x": 1593413240000, "y": null }, + { "x": 1593413241000, "y": null }, + { "x": 1593413242000, "y": null }, + { "x": 1593413243000, "y": null }, + { "x": 1593413244000, "y": null }, + { "x": 1593413245000, "y": null }, + { "x": 1593413246000, "y": null }, + { "x": 1593413247000, "y": null }, + { "x": 1593413248000, "y": null }, + { "x": 1593413249000, "y": null }, + { "x": 1593413250000, "y": null }, + { "x": 1593413251000, "y": null }, + { "x": 1593413252000, "y": null }, + { "x": 1593413253000, "y": null }, + { "x": 1593413254000, "y": null }, + { "x": 1593413255000, "y": null }, + { "x": 1593413256000, "y": null }, + { "x": 1593413257000, "y": null }, + { "x": 1593413258000, "y": null }, + { "x": 1593413259000, "y": null }, + { "x": 1593413260000, "y": null }, + { "x": 1593413261000, "y": null }, + { "x": 1593413262000, "y": null }, + { "x": 1593413263000, "y": null }, + { "x": 1593413264000, "y": null }, + { "x": 1593413265000, "y": null }, + { "x": 1593413266000, "y": null }, + { "x": 1593413267000, "y": null }, + { "x": 1593413268000, "y": null }, + { "x": 1593413269000, "y": null }, + { "x": 1593413270000, "y": null }, + { "x": 1593413271000, "y": null }, + { "x": 1593413272000, "y": 45056 }, + { "x": 1593413273000, "y": 10080 }, + { "x": 1593413274000, "y": null }, + { "x": 1593413275000, "y": null }, + { "x": 1593413276000, "y": null }, + { "x": 1593413277000, "y": 37632 }, + { "x": 1593413278000, "y": null }, + { "x": 1593413279000, "y": null }, + { "x": 1593413280000, "y": null }, + { "x": 1593413281000, "y": 33024 }, + { "x": 1593413282000, "y": null }, + { "x": 1593413283000, "y": null }, + { "x": 1593413284000, "y": 761728 }, + { "x": 1593413285000, "y": 81904 }, + { "x": 1593413286000, "y": 358384 }, + { "x": 1593413287000, "y": 36088 }, + { "x": 1593413288000, "y": 44536 }, + { "x": 1593413289000, "y": 11648 }, + { "x": 1593413290000, "y": 31984 }, + { "x": 1593413291000, "y": 2920 }, + { "x": 1593413292000, "y": 9312 }, + { "x": 1593413293000, "y": 10912 }, + { "x": 1593413294000, "y": 6392 }, + { "x": 1593413295000, "y": 11704 }, + { "x": 1593413296000, "y": 10816 }, + { "x": 1593413297000, "y": 12000 }, + { "x": 1593413298000, "y": 15164 }, + { "x": 1593413299000, "y": 3216 }, + { "x": 1593413300000, "y": 9584 }, + { "x": 1593413301000, "y": 21240 }, + { "x": 1593413302000, "y": 5624 }, + { "x": 1593413303000, "y": 11360 }, + { "x": 1593413304000, "y": 12320 }, + { "x": 1593413305000, "y": 38640 }, + { "x": 1593413306000, "y": 9728 }, + { "x": 1593413307000, "y": 17016 }, + { "x": 1593413308000, "y": 26848 }, + { "x": 1593413309000, "y": 1753072 }, + { "x": 1593413310000, "y": 16992 }, + { "x": 1593413311000, "y": 26560 }, + { "x": 1593413312000, "y": 11232 }, + { "x": 1593413313000, "y": 11424 }, + { "x": 1593413314000, "y": 16096 }, + { "x": 1593413315000, "y": 18800 }, + { "x": 1593413316000, "y": 12672 }, + { "x": 1593413317000, "y": 24316 }, + { "x": 1593413318000, "y": 8944 }, + { "x": 1593413319000, "y": 272352 }, + { "x": 1593413320000, "y": 7992 }, + { "x": 1593413321000, "y": 8368 }, + { "x": 1593413322000, "y": 1928 }, + { "x": 1593413323000, "y": null }, + { "x": 1593413324000, "y": null }, + { "x": 1593413325000, "y": null }, + { "x": 1593413326000, "y": null }, + { "x": 1593413327000, "y": null }, + { "x": 1593413328000, "y": null }, + { "x": 1593413329000, "y": null }, + { "x": 1593413330000, "y": null }, + { "x": 1593413331000, "y": null }, + { "x": 1593413332000, "y": null }, + { "x": 1593413333000, "y": null }, + { "x": 1593413334000, "y": null }, + { "x": 1593413335000, "y": null }, + { "x": 1593413336000, "y": null }, + { "x": 1593413337000, "y": null }, + { "x": 1593413338000, "y": null }, + { "x": 1593413339000, "y": null }, + { "x": 1593413340000, "y": null } + ] + }, + "tpmBuckets": [ + { + "key": "HTTP 2xx", + "dataPoints": [ + { "x": 1593413100000, "y": 0 }, + { "x": 1593413101000, "y": 0 }, + { "x": 1593413102000, "y": 0 }, + { "x": 1593413103000, "y": 0 }, + { "x": 1593413104000, "y": 0 }, + { "x": 1593413105000, "y": 0 }, + { "x": 1593413106000, "y": 0 }, + { "x": 1593413107000, "y": 0 }, + { "x": 1593413108000, "y": 0 }, + { "x": 1593413109000, "y": 0 }, + { "x": 1593413110000, "y": 0 }, + { "x": 1593413111000, "y": 0 }, + { "x": 1593413112000, "y": 0 }, + { "x": 1593413113000, "y": 0 }, + { "x": 1593413114000, "y": 0 }, + { "x": 1593413115000, "y": 0 }, + { "x": 1593413116000, "y": 0 }, + { "x": 1593413117000, "y": 0 }, + { "x": 1593413118000, "y": 0 }, + { "x": 1593413119000, "y": 0 }, + { "x": 1593413120000, "y": 0 }, + { "x": 1593413121000, "y": 0 }, + { "x": 1593413122000, "y": 0 }, + { "x": 1593413123000, "y": 0 }, + { "x": 1593413124000, "y": 0 }, + { "x": 1593413125000, "y": 0 }, + { "x": 1593413126000, "y": 0 }, + { "x": 1593413127000, "y": 0 }, + { "x": 1593413128000, "y": 0 }, + { "x": 1593413129000, "y": 0 }, + { "x": 1593413130000, "y": 0 }, + { "x": 1593413131000, "y": 0 }, + { "x": 1593413132000, "y": 0 }, + { "x": 1593413133000, "y": 0 }, + { "x": 1593413134000, "y": 0 }, + { "x": 1593413135000, "y": 0 }, + { "x": 1593413136000, "y": 0 }, + { "x": 1593413137000, "y": 0 }, + { "x": 1593413138000, "y": 0 }, + { "x": 1593413139000, "y": 0 }, + { "x": 1593413140000, "y": 0 }, + { "x": 1593413141000, "y": 0 }, + { "x": 1593413142000, "y": 0 }, + { "x": 1593413143000, "y": 0 }, + { "x": 1593413144000, "y": 0 }, + { "x": 1593413145000, "y": 0 }, + { "x": 1593413146000, "y": 0 }, + { "x": 1593413147000, "y": 0 }, + { "x": 1593413148000, "y": 0 }, + { "x": 1593413149000, "y": 0 }, + { "x": 1593413150000, "y": 0 }, + { "x": 1593413151000, "y": 0 }, + { "x": 1593413152000, "y": 0 }, + { "x": 1593413153000, "y": 0 }, + { "x": 1593413154000, "y": 0 }, + { "x": 1593413155000, "y": 0 }, + { "x": 1593413156000, "y": 0 }, + { "x": 1593413157000, "y": 0 }, + { "x": 1593413158000, "y": 0 }, + { "x": 1593413159000, "y": 0 }, + { "x": 1593413160000, "y": 0 }, + { "x": 1593413161000, "y": 0 }, + { "x": 1593413162000, "y": 0 }, + { "x": 1593413163000, "y": 0 }, + { "x": 1593413164000, "y": 0 }, + { "x": 1593413165000, "y": 0 }, + { "x": 1593413166000, "y": 0 }, + { "x": 1593413167000, "y": 0 }, + { "x": 1593413168000, "y": 0 }, + { "x": 1593413169000, "y": 0 }, + { "x": 1593413170000, "y": 0 }, + { "x": 1593413171000, "y": 0 }, + { "x": 1593413172000, "y": 0 }, + { "x": 1593413173000, "y": 0 }, + { "x": 1593413174000, "y": 0 }, + { "x": 1593413175000, "y": 0 }, + { "x": 1593413176000, "y": 0 }, + { "x": 1593413177000, "y": 0 }, + { "x": 1593413178000, "y": 0 }, + { "x": 1593413179000, "y": 0 }, + { "x": 1593413180000, "y": 0 }, + { "x": 1593413181000, "y": 0 }, + { "x": 1593413182000, "y": 0 }, + { "x": 1593413183000, "y": 0 }, + { "x": 1593413184000, "y": 0 }, + { "x": 1593413185000, "y": 0 }, + { "x": 1593413186000, "y": 0 }, + { "x": 1593413187000, "y": 0 }, + { "x": 1593413188000, "y": 0 }, + { "x": 1593413189000, "y": 0 }, + { "x": 1593413190000, "y": 0 }, + { "x": 1593413191000, "y": 0 }, + { "x": 1593413192000, "y": 0 }, + { "x": 1593413193000, "y": 0 }, + { "x": 1593413194000, "y": 0 }, + { "x": 1593413195000, "y": 0 }, + { "x": 1593413196000, "y": 0 }, + { "x": 1593413197000, "y": 0 }, + { "x": 1593413198000, "y": 0 }, + { "x": 1593413199000, "y": 0 }, + { "x": 1593413200000, "y": 0 }, + { "x": 1593413201000, "y": 0 }, + { "x": 1593413202000, "y": 0 }, + { "x": 1593413203000, "y": 0 }, + { "x": 1593413204000, "y": 0 }, + { "x": 1593413205000, "y": 0 }, + { "x": 1593413206000, "y": 0 }, + { "x": 1593413207000, "y": 0 }, + { "x": 1593413208000, "y": 0 }, + { "x": 1593413209000, "y": 0 }, + { "x": 1593413210000, "y": 0 }, + { "x": 1593413211000, "y": 0 }, + { "x": 1593413212000, "y": 0 }, + { "x": 1593413213000, "y": 0 }, + { "x": 1593413214000, "y": 0 }, + { "x": 1593413215000, "y": 0 }, + { "x": 1593413216000, "y": 0 }, + { "x": 1593413217000, "y": 0 }, + { "x": 1593413218000, "y": 0 }, + { "x": 1593413219000, "y": 0 }, + { "x": 1593413220000, "y": 0 }, + { "x": 1593413221000, "y": 0 }, + { "x": 1593413222000, "y": 0 }, + { "x": 1593413223000, "y": 0 }, + { "x": 1593413224000, "y": 0 }, + { "x": 1593413225000, "y": 0 }, + { "x": 1593413226000, "y": 0 }, + { "x": 1593413227000, "y": 0 }, + { "x": 1593413228000, "y": 0 }, + { "x": 1593413229000, "y": 0 }, + { "x": 1593413230000, "y": 0 }, + { "x": 1593413231000, "y": 0 }, + { "x": 1593413232000, "y": 0 }, + { "x": 1593413233000, "y": 0 }, + { "x": 1593413234000, "y": 0 }, + { "x": 1593413235000, "y": 0 }, + { "x": 1593413236000, "y": 0 }, + { "x": 1593413237000, "y": 0 }, + { "x": 1593413238000, "y": 0 }, + { "x": 1593413239000, "y": 0 }, + { "x": 1593413240000, "y": 0 }, + { "x": 1593413241000, "y": 0 }, + { "x": 1593413242000, "y": 0 }, + { "x": 1593413243000, "y": 0 }, + { "x": 1593413244000, "y": 0 }, + { "x": 1593413245000, "y": 0 }, + { "x": 1593413246000, "y": 0 }, + { "x": 1593413247000, "y": 0 }, + { "x": 1593413248000, "y": 0 }, + { "x": 1593413249000, "y": 0 }, + { "x": 1593413250000, "y": 0 }, + { "x": 1593413251000, "y": 0 }, + { "x": 1593413252000, "y": 0 }, + { "x": 1593413253000, "y": 0 }, + { "x": 1593413254000, "y": 0 }, + { "x": 1593413255000, "y": 0 }, + { "x": 1593413256000, "y": 0 }, + { "x": 1593413257000, "y": 0 }, + { "x": 1593413258000, "y": 0 }, + { "x": 1593413259000, "y": 0 }, + { "x": 1593413260000, "y": 0 }, + { "x": 1593413261000, "y": 0 }, + { "x": 1593413262000, "y": 0 }, + { "x": 1593413263000, "y": 0 }, + { "x": 1593413264000, "y": 0 }, + { "x": 1593413265000, "y": 0 }, + { "x": 1593413266000, "y": 0 }, + { "x": 1593413267000, "y": 0 }, + { "x": 1593413268000, "y": 0 }, + { "x": 1593413269000, "y": 0 }, + { "x": 1593413270000, "y": 0 }, + { "x": 1593413271000, "y": 0 }, + { "x": 1593413272000, "y": 1 }, + { "x": 1593413273000, "y": 2 }, + { "x": 1593413274000, "y": 0 }, + { "x": 1593413275000, "y": 0 }, + { "x": 1593413276000, "y": 0 }, + { "x": 1593413277000, "y": 1 }, + { "x": 1593413278000, "y": 0 }, + { "x": 1593413279000, "y": 0 }, + { "x": 1593413280000, "y": 0 }, + { "x": 1593413281000, "y": 1 }, + { "x": 1593413282000, "y": 0 }, + { "x": 1593413283000, "y": 0 }, + { "x": 1593413284000, "y": 2 }, + { "x": 1593413285000, "y": 2 }, + { "x": 1593413286000, "y": 7 }, + { "x": 1593413287000, "y": 1 }, + { "x": 1593413288000, "y": 2 }, + { "x": 1593413289000, "y": 1 }, + { "x": 1593413290000, "y": 4 }, + { "x": 1593413291000, "y": 2 }, + { "x": 1593413292000, "y": 1 }, + { "x": 1593413293000, "y": 2 }, + { "x": 1593413294000, "y": 3 }, + { "x": 1593413295000, "y": 2 }, + { "x": 1593413296000, "y": 2 }, + { "x": 1593413297000, "y": 2 }, + { "x": 1593413298000, "y": 6 }, + { "x": 1593413299000, "y": 1 }, + { "x": 1593413300000, "y": 2 }, + { "x": 1593413301000, "y": 3 }, + { "x": 1593413302000, "y": 2 }, + { "x": 1593413303000, "y": 2 }, + { "x": 1593413304000, "y": 2 }, + { "x": 1593413305000, "y": 1 }, + { "x": 1593413306000, "y": 2 }, + { "x": 1593413307000, "y": 3 }, + { "x": 1593413308000, "y": 2 }, + { "x": 1593413309000, "y": 2 }, + { "x": 1593413310000, "y": 2 }, + { "x": 1593413311000, "y": 1 }, + { "x": 1593413312000, "y": 3 }, + { "x": 1593413313000, "y": 3 }, + { "x": 1593413314000, "y": 5 }, + { "x": 1593413315000, "y": 2 }, + { "x": 1593413316000, "y": 2 }, + { "x": 1593413317000, "y": 6 }, + { "x": 1593413318000, "y": 2 }, + { "x": 1593413319000, "y": 2 }, + { "x": 1593413320000, "y": 2 }, + { "x": 1593413321000, "y": 2 }, + { "x": 1593413322000, "y": 1 }, + { "x": 1593413323000, "y": 0 }, + { "x": 1593413324000, "y": 0 }, + { "x": 1593413325000, "y": 0 }, + { "x": 1593413326000, "y": 0 }, + { "x": 1593413327000, "y": 0 }, + { "x": 1593413328000, "y": 0 }, + { "x": 1593413329000, "y": 0 }, + { "x": 1593413330000, "y": 0 }, + { "x": 1593413331000, "y": 0 }, + { "x": 1593413332000, "y": 0 }, + { "x": 1593413333000, "y": 0 }, + { "x": 1593413334000, "y": 0 }, + { "x": 1593413335000, "y": 0 }, + { "x": 1593413336000, "y": 0 }, + { "x": 1593413337000, "y": 0 }, + { "x": 1593413338000, "y": 0 }, + { "x": 1593413339000, "y": 0 }, + { "x": 1593413340000, "y": 0 } + ], + "avg": 24.75 + }, + { + "key": "HTTP 3xx", + "dataPoints": [ + { "x": 1593413100000, "y": 0 }, + { "x": 1593413101000, "y": 0 }, + { "x": 1593413102000, "y": 0 }, + { "x": 1593413103000, "y": 0 }, + { "x": 1593413104000, "y": 0 }, + { "x": 1593413105000, "y": 0 }, + { "x": 1593413106000, "y": 0 }, + { "x": 1593413107000, "y": 0 }, + { "x": 1593413108000, "y": 0 }, + { "x": 1593413109000, "y": 0 }, + { "x": 1593413110000, "y": 0 }, + { "x": 1593413111000, "y": 0 }, + { "x": 1593413112000, "y": 0 }, + { "x": 1593413113000, "y": 0 }, + { "x": 1593413114000, "y": 0 }, + { "x": 1593413115000, "y": 0 }, + { "x": 1593413116000, "y": 0 }, + { "x": 1593413117000, "y": 0 }, + { "x": 1593413118000, "y": 0 }, + { "x": 1593413119000, "y": 0 }, + { "x": 1593413120000, "y": 0 }, + { "x": 1593413121000, "y": 0 }, + { "x": 1593413122000, "y": 0 }, + { "x": 1593413123000, "y": 0 }, + { "x": 1593413124000, "y": 0 }, + { "x": 1593413125000, "y": 0 }, + { "x": 1593413126000, "y": 0 }, + { "x": 1593413127000, "y": 0 }, + { "x": 1593413128000, "y": 0 }, + { "x": 1593413129000, "y": 0 }, + { "x": 1593413130000, "y": 0 }, + { "x": 1593413131000, "y": 0 }, + { "x": 1593413132000, "y": 0 }, + { "x": 1593413133000, "y": 0 }, + { "x": 1593413134000, "y": 0 }, + { "x": 1593413135000, "y": 0 }, + { "x": 1593413136000, "y": 0 }, + { "x": 1593413137000, "y": 0 }, + { "x": 1593413138000, "y": 0 }, + { "x": 1593413139000, "y": 0 }, + { "x": 1593413140000, "y": 0 }, + { "x": 1593413141000, "y": 0 }, + { "x": 1593413142000, "y": 0 }, + { "x": 1593413143000, "y": 0 }, + { "x": 1593413144000, "y": 0 }, + { "x": 1593413145000, "y": 0 }, + { "x": 1593413146000, "y": 0 }, + { "x": 1593413147000, "y": 0 }, + { "x": 1593413148000, "y": 0 }, + { "x": 1593413149000, "y": 0 }, + { "x": 1593413150000, "y": 0 }, + { "x": 1593413151000, "y": 0 }, + { "x": 1593413152000, "y": 0 }, + { "x": 1593413153000, "y": 0 }, + { "x": 1593413154000, "y": 0 }, + { "x": 1593413155000, "y": 0 }, + { "x": 1593413156000, "y": 0 }, + { "x": 1593413157000, "y": 0 }, + { "x": 1593413158000, "y": 0 }, + { "x": 1593413159000, "y": 0 }, + { "x": 1593413160000, "y": 0 }, + { "x": 1593413161000, "y": 0 }, + { "x": 1593413162000, "y": 0 }, + { "x": 1593413163000, "y": 0 }, + { "x": 1593413164000, "y": 0 }, + { "x": 1593413165000, "y": 0 }, + { "x": 1593413166000, "y": 0 }, + { "x": 1593413167000, "y": 0 }, + { "x": 1593413168000, "y": 0 }, + { "x": 1593413169000, "y": 0 }, + { "x": 1593413170000, "y": 0 }, + { "x": 1593413171000, "y": 0 }, + { "x": 1593413172000, "y": 0 }, + { "x": 1593413173000, "y": 0 }, + { "x": 1593413174000, "y": 0 }, + { "x": 1593413175000, "y": 0 }, + { "x": 1593413176000, "y": 0 }, + { "x": 1593413177000, "y": 0 }, + { "x": 1593413178000, "y": 0 }, + { "x": 1593413179000, "y": 0 }, + { "x": 1593413180000, "y": 0 }, + { "x": 1593413181000, "y": 0 }, + { "x": 1593413182000, "y": 0 }, + { "x": 1593413183000, "y": 0 }, + { "x": 1593413184000, "y": 0 }, + { "x": 1593413185000, "y": 0 }, + { "x": 1593413186000, "y": 0 }, + { "x": 1593413187000, "y": 0 }, + { "x": 1593413188000, "y": 0 }, + { "x": 1593413189000, "y": 0 }, + { "x": 1593413190000, "y": 0 }, + { "x": 1593413191000, "y": 0 }, + { "x": 1593413192000, "y": 0 }, + { "x": 1593413193000, "y": 0 }, + { "x": 1593413194000, "y": 0 }, + { "x": 1593413195000, "y": 0 }, + { "x": 1593413196000, "y": 0 }, + { "x": 1593413197000, "y": 0 }, + { "x": 1593413198000, "y": 0 }, + { "x": 1593413199000, "y": 0 }, + { "x": 1593413200000, "y": 0 }, + { "x": 1593413201000, "y": 0 }, + { "x": 1593413202000, "y": 0 }, + { "x": 1593413203000, "y": 0 }, + { "x": 1593413204000, "y": 0 }, + { "x": 1593413205000, "y": 0 }, + { "x": 1593413206000, "y": 0 }, + { "x": 1593413207000, "y": 0 }, + { "x": 1593413208000, "y": 0 }, + { "x": 1593413209000, "y": 0 }, + { "x": 1593413210000, "y": 0 }, + { "x": 1593413211000, "y": 0 }, + { "x": 1593413212000, "y": 0 }, + { "x": 1593413213000, "y": 0 }, + { "x": 1593413214000, "y": 0 }, + { "x": 1593413215000, "y": 0 }, + { "x": 1593413216000, "y": 0 }, + { "x": 1593413217000, "y": 0 }, + { "x": 1593413218000, "y": 0 }, + { "x": 1593413219000, "y": 0 }, + { "x": 1593413220000, "y": 0 }, + { "x": 1593413221000, "y": 0 }, + { "x": 1593413222000, "y": 0 }, + { "x": 1593413223000, "y": 0 }, + { "x": 1593413224000, "y": 0 }, + { "x": 1593413225000, "y": 0 }, + { "x": 1593413226000, "y": 0 }, + { "x": 1593413227000, "y": 0 }, + { "x": 1593413228000, "y": 0 }, + { "x": 1593413229000, "y": 0 }, + { "x": 1593413230000, "y": 0 }, + { "x": 1593413231000, "y": 0 }, + { "x": 1593413232000, "y": 0 }, + { "x": 1593413233000, "y": 0 }, + { "x": 1593413234000, "y": 0 }, + { "x": 1593413235000, "y": 0 }, + { "x": 1593413236000, "y": 0 }, + { "x": 1593413237000, "y": 0 }, + { "x": 1593413238000, "y": 0 }, + { "x": 1593413239000, "y": 0 }, + { "x": 1593413240000, "y": 0 }, + { "x": 1593413241000, "y": 0 }, + { "x": 1593413242000, "y": 0 }, + { "x": 1593413243000, "y": 0 }, + { "x": 1593413244000, "y": 0 }, + { "x": 1593413245000, "y": 0 }, + { "x": 1593413246000, "y": 0 }, + { "x": 1593413247000, "y": 0 }, + { "x": 1593413248000, "y": 0 }, + { "x": 1593413249000, "y": 0 }, + { "x": 1593413250000, "y": 0 }, + { "x": 1593413251000, "y": 0 }, + { "x": 1593413252000, "y": 0 }, + { "x": 1593413253000, "y": 0 }, + { "x": 1593413254000, "y": 0 }, + { "x": 1593413255000, "y": 0 }, + { "x": 1593413256000, "y": 0 }, + { "x": 1593413257000, "y": 0 }, + { "x": 1593413258000, "y": 0 }, + { "x": 1593413259000, "y": 0 }, + { "x": 1593413260000, "y": 0 }, + { "x": 1593413261000, "y": 0 }, + { "x": 1593413262000, "y": 0 }, + { "x": 1593413263000, "y": 0 }, + { "x": 1593413264000, "y": 0 }, + { "x": 1593413265000, "y": 0 }, + { "x": 1593413266000, "y": 0 }, + { "x": 1593413267000, "y": 0 }, + { "x": 1593413268000, "y": 0 }, + { "x": 1593413269000, "y": 0 }, + { "x": 1593413270000, "y": 0 }, + { "x": 1593413271000, "y": 0 }, + { "x": 1593413272000, "y": 0 }, + { "x": 1593413273000, "y": 0 }, + { "x": 1593413274000, "y": 0 }, + { "x": 1593413275000, "y": 0 }, + { "x": 1593413276000, "y": 0 }, + { "x": 1593413277000, "y": 0 }, + { "x": 1593413278000, "y": 0 }, + { "x": 1593413279000, "y": 0 }, + { "x": 1593413280000, "y": 0 }, + { "x": 1593413281000, "y": 0 }, + { "x": 1593413282000, "y": 0 }, + { "x": 1593413283000, "y": 0 }, + { "x": 1593413284000, "y": 0 }, + { "x": 1593413285000, "y": 0 }, + { "x": 1593413286000, "y": 0 }, + { "x": 1593413287000, "y": 0 }, + { "x": 1593413288000, "y": 0 }, + { "x": 1593413289000, "y": 0 }, + { "x": 1593413290000, "y": 0 }, + { "x": 1593413291000, "y": 0 }, + { "x": 1593413292000, "y": 0 }, + { "x": 1593413293000, "y": 0 }, + { "x": 1593413294000, "y": 0 }, + { "x": 1593413295000, "y": 0 }, + { "x": 1593413296000, "y": 0 }, + { "x": 1593413297000, "y": 0 }, + { "x": 1593413298000, "y": 2 }, + { "x": 1593413299000, "y": 0 }, + { "x": 1593413300000, "y": 0 }, + { "x": 1593413301000, "y": 3 }, + { "x": 1593413302000, "y": 0 }, + { "x": 1593413303000, "y": 0 }, + { "x": 1593413304000, "y": 0 }, + { "x": 1593413305000, "y": 0 }, + { "x": 1593413306000, "y": 0 }, + { "x": 1593413307000, "y": 0 }, + { "x": 1593413308000, "y": 0 }, + { "x": 1593413309000, "y": 0 }, + { "x": 1593413310000, "y": 0 }, + { "x": 1593413311000, "y": 0 }, + { "x": 1593413312000, "y": 0 }, + { "x": 1593413313000, "y": 0 }, + { "x": 1593413314000, "y": 0 }, + { "x": 1593413315000, "y": 0 }, + { "x": 1593413316000, "y": 0 }, + { "x": 1593413317000, "y": 2 }, + { "x": 1593413318000, "y": 0 }, + { "x": 1593413319000, "y": 0 }, + { "x": 1593413320000, "y": 0 }, + { "x": 1593413321000, "y": 0 }, + { "x": 1593413322000, "y": 0 }, + { "x": 1593413323000, "y": 0 }, + { "x": 1593413324000, "y": 0 }, + { "x": 1593413325000, "y": 0 }, + { "x": 1593413326000, "y": 0 }, + { "x": 1593413327000, "y": 0 }, + { "x": 1593413328000, "y": 0 }, + { "x": 1593413329000, "y": 0 }, + { "x": 1593413330000, "y": 0 }, + { "x": 1593413331000, "y": 0 }, + { "x": 1593413332000, "y": 0 }, + { "x": 1593413333000, "y": 0 }, + { "x": 1593413334000, "y": 0 }, + { "x": 1593413335000, "y": 0 }, + { "x": 1593413336000, "y": 0 }, + { "x": 1593413337000, "y": 0 }, + { "x": 1593413338000, "y": 0 }, + { "x": 1593413339000, "y": 0 }, + { "x": 1593413340000, "y": 0 } + ], + "avg": 1.75 + }, + { + "key": "HTTP 4xx", + "dataPoints": [ + { "x": 1593413100000, "y": 0 }, + { "x": 1593413101000, "y": 0 }, + { "x": 1593413102000, "y": 0 }, + { "x": 1593413103000, "y": 0 }, + { "x": 1593413104000, "y": 0 }, + { "x": 1593413105000, "y": 0 }, + { "x": 1593413106000, "y": 0 }, + { "x": 1593413107000, "y": 0 }, + { "x": 1593413108000, "y": 0 }, + { "x": 1593413109000, "y": 0 }, + { "x": 1593413110000, "y": 0 }, + { "x": 1593413111000, "y": 0 }, + { "x": 1593413112000, "y": 0 }, + { "x": 1593413113000, "y": 0 }, + { "x": 1593413114000, "y": 0 }, + { "x": 1593413115000, "y": 0 }, + { "x": 1593413116000, "y": 0 }, + { "x": 1593413117000, "y": 0 }, + { "x": 1593413118000, "y": 0 }, + { "x": 1593413119000, "y": 0 }, + { "x": 1593413120000, "y": 0 }, + { "x": 1593413121000, "y": 0 }, + { "x": 1593413122000, "y": 0 }, + { "x": 1593413123000, "y": 0 }, + { "x": 1593413124000, "y": 0 }, + { "x": 1593413125000, "y": 0 }, + { "x": 1593413126000, "y": 0 }, + { "x": 1593413127000, "y": 0 }, + { "x": 1593413128000, "y": 0 }, + { "x": 1593413129000, "y": 0 }, + { "x": 1593413130000, "y": 0 }, + { "x": 1593413131000, "y": 0 }, + { "x": 1593413132000, "y": 0 }, + { "x": 1593413133000, "y": 0 }, + { "x": 1593413134000, "y": 0 }, + { "x": 1593413135000, "y": 0 }, + { "x": 1593413136000, "y": 0 }, + { "x": 1593413137000, "y": 0 }, + { "x": 1593413138000, "y": 0 }, + { "x": 1593413139000, "y": 0 }, + { "x": 1593413140000, "y": 0 }, + { "x": 1593413141000, "y": 0 }, + { "x": 1593413142000, "y": 0 }, + { "x": 1593413143000, "y": 0 }, + { "x": 1593413144000, "y": 0 }, + { "x": 1593413145000, "y": 0 }, + { "x": 1593413146000, "y": 0 }, + { "x": 1593413147000, "y": 0 }, + { "x": 1593413148000, "y": 0 }, + { "x": 1593413149000, "y": 0 }, + { "x": 1593413150000, "y": 0 }, + { "x": 1593413151000, "y": 0 }, + { "x": 1593413152000, "y": 0 }, + { "x": 1593413153000, "y": 0 }, + { "x": 1593413154000, "y": 0 }, + { "x": 1593413155000, "y": 0 }, + { "x": 1593413156000, "y": 0 }, + { "x": 1593413157000, "y": 0 }, + { "x": 1593413158000, "y": 0 }, + { "x": 1593413159000, "y": 0 }, + { "x": 1593413160000, "y": 0 }, + { "x": 1593413161000, "y": 0 }, + { "x": 1593413162000, "y": 0 }, + { "x": 1593413163000, "y": 0 }, + { "x": 1593413164000, "y": 0 }, + { "x": 1593413165000, "y": 0 }, + { "x": 1593413166000, "y": 0 }, + { "x": 1593413167000, "y": 0 }, + { "x": 1593413168000, "y": 0 }, + { "x": 1593413169000, "y": 0 }, + { "x": 1593413170000, "y": 0 }, + { "x": 1593413171000, "y": 0 }, + { "x": 1593413172000, "y": 0 }, + { "x": 1593413173000, "y": 0 }, + { "x": 1593413174000, "y": 0 }, + { "x": 1593413175000, "y": 0 }, + { "x": 1593413176000, "y": 0 }, + { "x": 1593413177000, "y": 0 }, + { "x": 1593413178000, "y": 0 }, + { "x": 1593413179000, "y": 0 }, + { "x": 1593413180000, "y": 0 }, + { "x": 1593413181000, "y": 0 }, + { "x": 1593413182000, "y": 0 }, + { "x": 1593413183000, "y": 0 }, + { "x": 1593413184000, "y": 0 }, + { "x": 1593413185000, "y": 0 }, + { "x": 1593413186000, "y": 0 }, + { "x": 1593413187000, "y": 0 }, + { "x": 1593413188000, "y": 0 }, + { "x": 1593413189000, "y": 0 }, + { "x": 1593413190000, "y": 0 }, + { "x": 1593413191000, "y": 0 }, + { "x": 1593413192000, "y": 0 }, + { "x": 1593413193000, "y": 0 }, + { "x": 1593413194000, "y": 0 }, + { "x": 1593413195000, "y": 0 }, + { "x": 1593413196000, "y": 0 }, + { "x": 1593413197000, "y": 0 }, + { "x": 1593413198000, "y": 0 }, + { "x": 1593413199000, "y": 0 }, + { "x": 1593413200000, "y": 0 }, + { "x": 1593413201000, "y": 0 }, + { "x": 1593413202000, "y": 0 }, + { "x": 1593413203000, "y": 0 }, + { "x": 1593413204000, "y": 0 }, + { "x": 1593413205000, "y": 0 }, + { "x": 1593413206000, "y": 0 }, + { "x": 1593413207000, "y": 0 }, + { "x": 1593413208000, "y": 0 }, + { "x": 1593413209000, "y": 0 }, + { "x": 1593413210000, "y": 0 }, + { "x": 1593413211000, "y": 0 }, + { "x": 1593413212000, "y": 0 }, + { "x": 1593413213000, "y": 0 }, + { "x": 1593413214000, "y": 0 }, + { "x": 1593413215000, "y": 0 }, + { "x": 1593413216000, "y": 0 }, + { "x": 1593413217000, "y": 0 }, + { "x": 1593413218000, "y": 0 }, + { "x": 1593413219000, "y": 0 }, + { "x": 1593413220000, "y": 0 }, + { "x": 1593413221000, "y": 0 }, + { "x": 1593413222000, "y": 0 }, + { "x": 1593413223000, "y": 0 }, + { "x": 1593413224000, "y": 0 }, + { "x": 1593413225000, "y": 0 }, + { "x": 1593413226000, "y": 0 }, + { "x": 1593413227000, "y": 0 }, + { "x": 1593413228000, "y": 0 }, + { "x": 1593413229000, "y": 0 }, + { "x": 1593413230000, "y": 0 }, + { "x": 1593413231000, "y": 0 }, + { "x": 1593413232000, "y": 0 }, + { "x": 1593413233000, "y": 0 }, + { "x": 1593413234000, "y": 0 }, + { "x": 1593413235000, "y": 0 }, + { "x": 1593413236000, "y": 0 }, + { "x": 1593413237000, "y": 0 }, + { "x": 1593413238000, "y": 0 }, + { "x": 1593413239000, "y": 0 }, + { "x": 1593413240000, "y": 0 }, + { "x": 1593413241000, "y": 0 }, + { "x": 1593413242000, "y": 0 }, + { "x": 1593413243000, "y": 0 }, + { "x": 1593413244000, "y": 0 }, + { "x": 1593413245000, "y": 0 }, + { "x": 1593413246000, "y": 0 }, + { "x": 1593413247000, "y": 0 }, + { "x": 1593413248000, "y": 0 }, + { "x": 1593413249000, "y": 0 }, + { "x": 1593413250000, "y": 0 }, + { "x": 1593413251000, "y": 0 }, + { "x": 1593413252000, "y": 0 }, + { "x": 1593413253000, "y": 0 }, + { "x": 1593413254000, "y": 0 }, + { "x": 1593413255000, "y": 0 }, + { "x": 1593413256000, "y": 0 }, + { "x": 1593413257000, "y": 0 }, + { "x": 1593413258000, "y": 0 }, + { "x": 1593413259000, "y": 0 }, + { "x": 1593413260000, "y": 0 }, + { "x": 1593413261000, "y": 0 }, + { "x": 1593413262000, "y": 0 }, + { "x": 1593413263000, "y": 0 }, + { "x": 1593413264000, "y": 0 }, + { "x": 1593413265000, "y": 0 }, + { "x": 1593413266000, "y": 0 }, + { "x": 1593413267000, "y": 0 }, + { "x": 1593413268000, "y": 0 }, + { "x": 1593413269000, "y": 0 }, + { "x": 1593413270000, "y": 0 }, + { "x": 1593413271000, "y": 0 }, + { "x": 1593413272000, "y": 0 }, + { "x": 1593413273000, "y": 0 }, + { "x": 1593413274000, "y": 0 }, + { "x": 1593413275000, "y": 0 }, + { "x": 1593413276000, "y": 0 }, + { "x": 1593413277000, "y": 0 }, + { "x": 1593413278000, "y": 0 }, + { "x": 1593413279000, "y": 0 }, + { "x": 1593413280000, "y": 0 }, + { "x": 1593413281000, "y": 0 }, + { "x": 1593413282000, "y": 0 }, + { "x": 1593413283000, "y": 0 }, + { "x": 1593413284000, "y": 0 }, + { "x": 1593413285000, "y": 0 }, + { "x": 1593413286000, "y": 0 }, + { "x": 1593413287000, "y": 0 }, + { "x": 1593413288000, "y": 0 }, + { "x": 1593413289000, "y": 1 }, + { "x": 1593413290000, "y": 0 }, + { "x": 1593413291000, "y": 0 }, + { "x": 1593413292000, "y": 1 }, + { "x": 1593413293000, "y": 0 }, + { "x": 1593413294000, "y": 0 }, + { "x": 1593413295000, "y": 0 }, + { "x": 1593413296000, "y": 0 }, + { "x": 1593413297000, "y": 0 }, + { "x": 1593413298000, "y": 0 }, + { "x": 1593413299000, "y": 0 }, + { "x": 1593413300000, "y": 1 }, + { "x": 1593413301000, "y": 0 }, + { "x": 1593413302000, "y": 0 }, + { "x": 1593413303000, "y": 0 }, + { "x": 1593413304000, "y": 0 }, + { "x": 1593413305000, "y": 1 }, + { "x": 1593413306000, "y": 0 }, + { "x": 1593413307000, "y": 0 }, + { "x": 1593413308000, "y": 0 }, + { "x": 1593413309000, "y": 1 }, + { "x": 1593413310000, "y": 1 }, + { "x": 1593413311000, "y": 0 }, + { "x": 1593413312000, "y": 0 }, + { "x": 1593413313000, "y": 0 }, + { "x": 1593413314000, "y": 0 }, + { "x": 1593413315000, "y": 1 }, + { "x": 1593413316000, "y": 0 }, + { "x": 1593413317000, "y": 0 }, + { "x": 1593413318000, "y": 0 }, + { "x": 1593413319000, "y": 0 }, + { "x": 1593413320000, "y": 1 }, + { "x": 1593413321000, "y": 0 }, + { "x": 1593413322000, "y": 0 }, + { "x": 1593413323000, "y": 0 }, + { "x": 1593413324000, "y": 0 }, + { "x": 1593413325000, "y": 0 }, + { "x": 1593413326000, "y": 0 }, + { "x": 1593413327000, "y": 0 }, + { "x": 1593413328000, "y": 0 }, + { "x": 1593413329000, "y": 0 }, + { "x": 1593413330000, "y": 0 }, + { "x": 1593413331000, "y": 0 }, + { "x": 1593413332000, "y": 0 }, + { "x": 1593413333000, "y": 0 }, + { "x": 1593413334000, "y": 0 }, + { "x": 1593413335000, "y": 0 }, + { "x": 1593413336000, "y": 0 }, + { "x": 1593413337000, "y": 0 }, + { "x": 1593413338000, "y": 0 }, + { "x": 1593413339000, "y": 0 }, + { "x": 1593413340000, "y": 0 } + ], + "avg": 2 + }, + { + "key": "HTTP 5xx", + "dataPoints": [ + { "x": 1593413100000, "y": 0 }, + { "x": 1593413101000, "y": 0 }, + { "x": 1593413102000, "y": 0 }, + { "x": 1593413103000, "y": 0 }, + { "x": 1593413104000, "y": 0 }, + { "x": 1593413105000, "y": 0 }, + { "x": 1593413106000, "y": 0 }, + { "x": 1593413107000, "y": 0 }, + { "x": 1593413108000, "y": 0 }, + { "x": 1593413109000, "y": 0 }, + { "x": 1593413110000, "y": 0 }, + { "x": 1593413111000, "y": 0 }, + { "x": 1593413112000, "y": 0 }, + { "x": 1593413113000, "y": 0 }, + { "x": 1593413114000, "y": 0 }, + { "x": 1593413115000, "y": 0 }, + { "x": 1593413116000, "y": 0 }, + { "x": 1593413117000, "y": 0 }, + { "x": 1593413118000, "y": 0 }, + { "x": 1593413119000, "y": 0 }, + { "x": 1593413120000, "y": 0 }, + { "x": 1593413121000, "y": 0 }, + { "x": 1593413122000, "y": 0 }, + { "x": 1593413123000, "y": 0 }, + { "x": 1593413124000, "y": 0 }, + { "x": 1593413125000, "y": 0 }, + { "x": 1593413126000, "y": 0 }, + { "x": 1593413127000, "y": 0 }, + { "x": 1593413128000, "y": 0 }, + { "x": 1593413129000, "y": 0 }, + { "x": 1593413130000, "y": 0 }, + { "x": 1593413131000, "y": 0 }, + { "x": 1593413132000, "y": 0 }, + { "x": 1593413133000, "y": 0 }, + { "x": 1593413134000, "y": 0 }, + { "x": 1593413135000, "y": 0 }, + { "x": 1593413136000, "y": 0 }, + { "x": 1593413137000, "y": 0 }, + { "x": 1593413138000, "y": 0 }, + { "x": 1593413139000, "y": 0 }, + { "x": 1593413140000, "y": 0 }, + { "x": 1593413141000, "y": 0 }, + { "x": 1593413142000, "y": 0 }, + { "x": 1593413143000, "y": 0 }, + { "x": 1593413144000, "y": 0 }, + { "x": 1593413145000, "y": 0 }, + { "x": 1593413146000, "y": 0 }, + { "x": 1593413147000, "y": 0 }, + { "x": 1593413148000, "y": 0 }, + { "x": 1593413149000, "y": 0 }, + { "x": 1593413150000, "y": 0 }, + { "x": 1593413151000, "y": 0 }, + { "x": 1593413152000, "y": 0 }, + { "x": 1593413153000, "y": 0 }, + { "x": 1593413154000, "y": 0 }, + { "x": 1593413155000, "y": 0 }, + { "x": 1593413156000, "y": 0 }, + { "x": 1593413157000, "y": 0 }, + { "x": 1593413158000, "y": 0 }, + { "x": 1593413159000, "y": 0 }, + { "x": 1593413160000, "y": 0 }, + { "x": 1593413161000, "y": 0 }, + { "x": 1593413162000, "y": 0 }, + { "x": 1593413163000, "y": 0 }, + { "x": 1593413164000, "y": 0 }, + { "x": 1593413165000, "y": 0 }, + { "x": 1593413166000, "y": 0 }, + { "x": 1593413167000, "y": 0 }, + { "x": 1593413168000, "y": 0 }, + { "x": 1593413169000, "y": 0 }, + { "x": 1593413170000, "y": 0 }, + { "x": 1593413171000, "y": 0 }, + { "x": 1593413172000, "y": 0 }, + { "x": 1593413173000, "y": 0 }, + { "x": 1593413174000, "y": 0 }, + { "x": 1593413175000, "y": 0 }, + { "x": 1593413176000, "y": 0 }, + { "x": 1593413177000, "y": 0 }, + { "x": 1593413178000, "y": 0 }, + { "x": 1593413179000, "y": 0 }, + { "x": 1593413180000, "y": 0 }, + { "x": 1593413181000, "y": 0 }, + { "x": 1593413182000, "y": 0 }, + { "x": 1593413183000, "y": 0 }, + { "x": 1593413184000, "y": 0 }, + { "x": 1593413185000, "y": 0 }, + { "x": 1593413186000, "y": 0 }, + { "x": 1593413187000, "y": 0 }, + { "x": 1593413188000, "y": 0 }, + { "x": 1593413189000, "y": 0 }, + { "x": 1593413190000, "y": 0 }, + { "x": 1593413191000, "y": 0 }, + { "x": 1593413192000, "y": 0 }, + { "x": 1593413193000, "y": 0 }, + { "x": 1593413194000, "y": 0 }, + { "x": 1593413195000, "y": 0 }, + { "x": 1593413196000, "y": 0 }, + { "x": 1593413197000, "y": 0 }, + { "x": 1593413198000, "y": 0 }, + { "x": 1593413199000, "y": 0 }, + { "x": 1593413200000, "y": 0 }, + { "x": 1593413201000, "y": 0 }, + { "x": 1593413202000, "y": 0 }, + { "x": 1593413203000, "y": 0 }, + { "x": 1593413204000, "y": 0 }, + { "x": 1593413205000, "y": 0 }, + { "x": 1593413206000, "y": 0 }, + { "x": 1593413207000, "y": 0 }, + { "x": 1593413208000, "y": 0 }, + { "x": 1593413209000, "y": 0 }, + { "x": 1593413210000, "y": 0 }, + { "x": 1593413211000, "y": 0 }, + { "x": 1593413212000, "y": 0 }, + { "x": 1593413213000, "y": 0 }, + { "x": 1593413214000, "y": 0 }, + { "x": 1593413215000, "y": 0 }, + { "x": 1593413216000, "y": 0 }, + { "x": 1593413217000, "y": 0 }, + { "x": 1593413218000, "y": 0 }, + { "x": 1593413219000, "y": 0 }, + { "x": 1593413220000, "y": 0 }, + { "x": 1593413221000, "y": 0 }, + { "x": 1593413222000, "y": 0 }, + { "x": 1593413223000, "y": 0 }, + { "x": 1593413224000, "y": 0 }, + { "x": 1593413225000, "y": 0 }, + { "x": 1593413226000, "y": 0 }, + { "x": 1593413227000, "y": 0 }, + { "x": 1593413228000, "y": 0 }, + { "x": 1593413229000, "y": 0 }, + { "x": 1593413230000, "y": 0 }, + { "x": 1593413231000, "y": 0 }, + { "x": 1593413232000, "y": 0 }, + { "x": 1593413233000, "y": 0 }, + { "x": 1593413234000, "y": 0 }, + { "x": 1593413235000, "y": 0 }, + { "x": 1593413236000, "y": 0 }, + { "x": 1593413237000, "y": 0 }, + { "x": 1593413238000, "y": 0 }, + { "x": 1593413239000, "y": 0 }, + { "x": 1593413240000, "y": 0 }, + { "x": 1593413241000, "y": 0 }, + { "x": 1593413242000, "y": 0 }, + { "x": 1593413243000, "y": 0 }, + { "x": 1593413244000, "y": 0 }, + { "x": 1593413245000, "y": 0 }, + { "x": 1593413246000, "y": 0 }, + { "x": 1593413247000, "y": 0 }, + { "x": 1593413248000, "y": 0 }, + { "x": 1593413249000, "y": 0 }, + { "x": 1593413250000, "y": 0 }, + { "x": 1593413251000, "y": 0 }, + { "x": 1593413252000, "y": 0 }, + { "x": 1593413253000, "y": 0 }, + { "x": 1593413254000, "y": 0 }, + { "x": 1593413255000, "y": 0 }, + { "x": 1593413256000, "y": 0 }, + { "x": 1593413257000, "y": 0 }, + { "x": 1593413258000, "y": 0 }, + { "x": 1593413259000, "y": 0 }, + { "x": 1593413260000, "y": 0 }, + { "x": 1593413261000, "y": 0 }, + { "x": 1593413262000, "y": 0 }, + { "x": 1593413263000, "y": 0 }, + { "x": 1593413264000, "y": 0 }, + { "x": 1593413265000, "y": 0 }, + { "x": 1593413266000, "y": 0 }, + { "x": 1593413267000, "y": 0 }, + { "x": 1593413268000, "y": 0 }, + { "x": 1593413269000, "y": 0 }, + { "x": 1593413270000, "y": 0 }, + { "x": 1593413271000, "y": 0 }, + { "x": 1593413272000, "y": 0 }, + { "x": 1593413273000, "y": 0 }, + { "x": 1593413274000, "y": 0 }, + { "x": 1593413275000, "y": 0 }, + { "x": 1593413276000, "y": 0 }, + { "x": 1593413277000, "y": 0 }, + { "x": 1593413278000, "y": 0 }, + { "x": 1593413279000, "y": 0 }, + { "x": 1593413280000, "y": 0 }, + { "x": 1593413281000, "y": 0 }, + { "x": 1593413282000, "y": 0 }, + { "x": 1593413283000, "y": 0 }, + { "x": 1593413284000, "y": 0 }, + { "x": 1593413285000, "y": 0 }, + { "x": 1593413286000, "y": 1 }, + { "x": 1593413287000, "y": 1 }, + { "x": 1593413288000, "y": 0 }, + { "x": 1593413289000, "y": 0 }, + { "x": 1593413290000, "y": 0 }, + { "x": 1593413291000, "y": 0 }, + { "x": 1593413292000, "y": 0 }, + { "x": 1593413293000, "y": 0 }, + { "x": 1593413294000, "y": 0 }, + { "x": 1593413295000, "y": 0 }, + { "x": 1593413296000, "y": 0 }, + { "x": 1593413297000, "y": 0 }, + { "x": 1593413298000, "y": 0 }, + { "x": 1593413299000, "y": 1 }, + { "x": 1593413300000, "y": 0 }, + { "x": 1593413301000, "y": 1 }, + { "x": 1593413302000, "y": 0 }, + { "x": 1593413303000, "y": 0 }, + { "x": 1593413304000, "y": 0 }, + { "x": 1593413305000, "y": 1 }, + { "x": 1593413306000, "y": 0 }, + { "x": 1593413307000, "y": 0 }, + { "x": 1593413308000, "y": 1 }, + { "x": 1593413309000, "y": 0 }, + { "x": 1593413310000, "y": 0 }, + { "x": 1593413311000, "y": 1 }, + { "x": 1593413312000, "y": 0 }, + { "x": 1593413313000, "y": 0 }, + { "x": 1593413314000, "y": 0 }, + { "x": 1593413315000, "y": 1 }, + { "x": 1593413316000, "y": 0 }, + { "x": 1593413317000, "y": 0 }, + { "x": 1593413318000, "y": 0 }, + { "x": 1593413319000, "y": 0 }, + { "x": 1593413320000, "y": 0 }, + { "x": 1593413321000, "y": 0 }, + { "x": 1593413322000, "y": 1 }, + { "x": 1593413323000, "y": 0 }, + { "x": 1593413324000, "y": 0 }, + { "x": 1593413325000, "y": 0 }, + { "x": 1593413326000, "y": 0 }, + { "x": 1593413327000, "y": 0 }, + { "x": 1593413328000, "y": 0 }, + { "x": 1593413329000, "y": 0 }, + { "x": 1593413330000, "y": 0 }, + { "x": 1593413331000, "y": 0 }, + { "x": 1593413332000, "y": 0 }, + { "x": 1593413333000, "y": 0 }, + { "x": 1593413334000, "y": 0 }, + { "x": 1593413335000, "y": 0 }, + { "x": 1593413336000, "y": 0 }, + { "x": 1593413337000, "y": 0 }, + { "x": 1593413338000, "y": 0 }, + { "x": 1593413339000, "y": 0 }, + { "x": 1593413340000, "y": 0 } + ], + "avg": 2.25 + }, + { + "key": "success", + "dataPoints": [ + { "x": 1593413100000, "y": 0 }, + { "x": 1593413101000, "y": 0 }, + { "x": 1593413102000, "y": 0 }, + { "x": 1593413103000, "y": 0 }, + { "x": 1593413104000, "y": 0 }, + { "x": 1593413105000, "y": 0 }, + { "x": 1593413106000, "y": 0 }, + { "x": 1593413107000, "y": 0 }, + { "x": 1593413108000, "y": 0 }, + { "x": 1593413109000, "y": 0 }, + { "x": 1593413110000, "y": 0 }, + { "x": 1593413111000, "y": 0 }, + { "x": 1593413112000, "y": 0 }, + { "x": 1593413113000, "y": 0 }, + { "x": 1593413114000, "y": 0 }, + { "x": 1593413115000, "y": 0 }, + { "x": 1593413116000, "y": 0 }, + { "x": 1593413117000, "y": 0 }, + { "x": 1593413118000, "y": 0 }, + { "x": 1593413119000, "y": 0 }, + { "x": 1593413120000, "y": 0 }, + { "x": 1593413121000, "y": 0 }, + { "x": 1593413122000, "y": 0 }, + { "x": 1593413123000, "y": 0 }, + { "x": 1593413124000, "y": 0 }, + { "x": 1593413125000, "y": 0 }, + { "x": 1593413126000, "y": 0 }, + { "x": 1593413127000, "y": 0 }, + { "x": 1593413128000, "y": 0 }, + { "x": 1593413129000, "y": 0 }, + { "x": 1593413130000, "y": 0 }, + { "x": 1593413131000, "y": 0 }, + { "x": 1593413132000, "y": 0 }, + { "x": 1593413133000, "y": 0 }, + { "x": 1593413134000, "y": 0 }, + { "x": 1593413135000, "y": 0 }, + { "x": 1593413136000, "y": 0 }, + { "x": 1593413137000, "y": 0 }, + { "x": 1593413138000, "y": 0 }, + { "x": 1593413139000, "y": 0 }, + { "x": 1593413140000, "y": 0 }, + { "x": 1593413141000, "y": 0 }, + { "x": 1593413142000, "y": 0 }, + { "x": 1593413143000, "y": 0 }, + { "x": 1593413144000, "y": 0 }, + { "x": 1593413145000, "y": 0 }, + { "x": 1593413146000, "y": 0 }, + { "x": 1593413147000, "y": 0 }, + { "x": 1593413148000, "y": 0 }, + { "x": 1593413149000, "y": 0 }, + { "x": 1593413150000, "y": 0 }, + { "x": 1593413151000, "y": 0 }, + { "x": 1593413152000, "y": 0 }, + { "x": 1593413153000, "y": 0 }, + { "x": 1593413154000, "y": 0 }, + { "x": 1593413155000, "y": 0 }, + { "x": 1593413156000, "y": 0 }, + { "x": 1593413157000, "y": 0 }, + { "x": 1593413158000, "y": 0 }, + { "x": 1593413159000, "y": 0 }, + { "x": 1593413160000, "y": 0 }, + { "x": 1593413161000, "y": 0 }, + { "x": 1593413162000, "y": 0 }, + { "x": 1593413163000, "y": 0 }, + { "x": 1593413164000, "y": 0 }, + { "x": 1593413165000, "y": 0 }, + { "x": 1593413166000, "y": 0 }, + { "x": 1593413167000, "y": 0 }, + { "x": 1593413168000, "y": 0 }, + { "x": 1593413169000, "y": 0 }, + { "x": 1593413170000, "y": 0 }, + { "x": 1593413171000, "y": 0 }, + { "x": 1593413172000, "y": 0 }, + { "x": 1593413173000, "y": 0 }, + { "x": 1593413174000, "y": 0 }, + { "x": 1593413175000, "y": 0 }, + { "x": 1593413176000, "y": 0 }, + { "x": 1593413177000, "y": 0 }, + { "x": 1593413178000, "y": 0 }, + { "x": 1593413179000, "y": 0 }, + { "x": 1593413180000, "y": 0 }, + { "x": 1593413181000, "y": 0 }, + { "x": 1593413182000, "y": 0 }, + { "x": 1593413183000, "y": 0 }, + { "x": 1593413184000, "y": 0 }, + { "x": 1593413185000, "y": 0 }, + { "x": 1593413186000, "y": 0 }, + { "x": 1593413187000, "y": 0 }, + { "x": 1593413188000, "y": 0 }, + { "x": 1593413189000, "y": 0 }, + { "x": 1593413190000, "y": 0 }, + { "x": 1593413191000, "y": 0 }, + { "x": 1593413192000, "y": 0 }, + { "x": 1593413193000, "y": 0 }, + { "x": 1593413194000, "y": 0 }, + { "x": 1593413195000, "y": 0 }, + { "x": 1593413196000, "y": 0 }, + { "x": 1593413197000, "y": 0 }, + { "x": 1593413198000, "y": 0 }, + { "x": 1593413199000, "y": 0 }, + { "x": 1593413200000, "y": 0 }, + { "x": 1593413201000, "y": 0 }, + { "x": 1593413202000, "y": 0 }, + { "x": 1593413203000, "y": 0 }, + { "x": 1593413204000, "y": 0 }, + { "x": 1593413205000, "y": 0 }, + { "x": 1593413206000, "y": 0 }, + { "x": 1593413207000, "y": 0 }, + { "x": 1593413208000, "y": 0 }, + { "x": 1593413209000, "y": 0 }, + { "x": 1593413210000, "y": 0 }, + { "x": 1593413211000, "y": 0 }, + { "x": 1593413212000, "y": 0 }, + { "x": 1593413213000, "y": 0 }, + { "x": 1593413214000, "y": 0 }, + { "x": 1593413215000, "y": 0 }, + { "x": 1593413216000, "y": 0 }, + { "x": 1593413217000, "y": 0 }, + { "x": 1593413218000, "y": 0 }, + { "x": 1593413219000, "y": 0 }, + { "x": 1593413220000, "y": 0 }, + { "x": 1593413221000, "y": 0 }, + { "x": 1593413222000, "y": 0 }, + { "x": 1593413223000, "y": 0 }, + { "x": 1593413224000, "y": 0 }, + { "x": 1593413225000, "y": 0 }, + { "x": 1593413226000, "y": 0 }, + { "x": 1593413227000, "y": 0 }, + { "x": 1593413228000, "y": 0 }, + { "x": 1593413229000, "y": 0 }, + { "x": 1593413230000, "y": 0 }, + { "x": 1593413231000, "y": 0 }, + { "x": 1593413232000, "y": 0 }, + { "x": 1593413233000, "y": 0 }, + { "x": 1593413234000, "y": 0 }, + { "x": 1593413235000, "y": 0 }, + { "x": 1593413236000, "y": 0 }, + { "x": 1593413237000, "y": 0 }, + { "x": 1593413238000, "y": 0 }, + { "x": 1593413239000, "y": 0 }, + { "x": 1593413240000, "y": 0 }, + { "x": 1593413241000, "y": 0 }, + { "x": 1593413242000, "y": 0 }, + { "x": 1593413243000, "y": 0 }, + { "x": 1593413244000, "y": 0 }, + { "x": 1593413245000, "y": 0 }, + { "x": 1593413246000, "y": 0 }, + { "x": 1593413247000, "y": 0 }, + { "x": 1593413248000, "y": 0 }, + { "x": 1593413249000, "y": 0 }, + { "x": 1593413250000, "y": 0 }, + { "x": 1593413251000, "y": 0 }, + { "x": 1593413252000, "y": 0 }, + { "x": 1593413253000, "y": 0 }, + { "x": 1593413254000, "y": 0 }, + { "x": 1593413255000, "y": 0 }, + { "x": 1593413256000, "y": 0 }, + { "x": 1593413257000, "y": 0 }, + { "x": 1593413258000, "y": 0 }, + { "x": 1593413259000, "y": 0 }, + { "x": 1593413260000, "y": 0 }, + { "x": 1593413261000, "y": 0 }, + { "x": 1593413262000, "y": 0 }, + { "x": 1593413263000, "y": 0 }, + { "x": 1593413264000, "y": 0 }, + { "x": 1593413265000, "y": 0 }, + { "x": 1593413266000, "y": 0 }, + { "x": 1593413267000, "y": 0 }, + { "x": 1593413268000, "y": 0 }, + { "x": 1593413269000, "y": 0 }, + { "x": 1593413270000, "y": 0 }, + { "x": 1593413271000, "y": 0 }, + { "x": 1593413272000, "y": 0 }, + { "x": 1593413273000, "y": 0 }, + { "x": 1593413274000, "y": 0 }, + { "x": 1593413275000, "y": 0 }, + { "x": 1593413276000, "y": 0 }, + { "x": 1593413277000, "y": 0 }, + { "x": 1593413278000, "y": 0 }, + { "x": 1593413279000, "y": 0 }, + { "x": 1593413280000, "y": 0 }, + { "x": 1593413281000, "y": 0 }, + { "x": 1593413282000, "y": 0 }, + { "x": 1593413283000, "y": 0 }, + { "x": 1593413284000, "y": 0 }, + { "x": 1593413285000, "y": 0 }, + { "x": 1593413286000, "y": 0 }, + { "x": 1593413287000, "y": 0 }, + { "x": 1593413288000, "y": 0 }, + { "x": 1593413289000, "y": 0 }, + { "x": 1593413290000, "y": 0 }, + { "x": 1593413291000, "y": 0 }, + { "x": 1593413292000, "y": 0 }, + { "x": 1593413293000, "y": 0 }, + { "x": 1593413294000, "y": 0 }, + { "x": 1593413295000, "y": 0 }, + { "x": 1593413296000, "y": 0 }, + { "x": 1593413297000, "y": 0 }, + { "x": 1593413298000, "y": 0 }, + { "x": 1593413299000, "y": 0 }, + { "x": 1593413300000, "y": 0 }, + { "x": 1593413301000, "y": 0 }, + { "x": 1593413302000, "y": 0 }, + { "x": 1593413303000, "y": 0 }, + { "x": 1593413304000, "y": 0 }, + { "x": 1593413305000, "y": 0 }, + { "x": 1593413306000, "y": 0 }, + { "x": 1593413307000, "y": 0 }, + { "x": 1593413308000, "y": 0 }, + { "x": 1593413309000, "y": 1 }, + { "x": 1593413310000, "y": 0 }, + { "x": 1593413311000, "y": 0 }, + { "x": 1593413312000, "y": 0 }, + { "x": 1593413313000, "y": 0 }, + { "x": 1593413314000, "y": 0 }, + { "x": 1593413315000, "y": 0 }, + { "x": 1593413316000, "y": 0 }, + { "x": 1593413317000, "y": 0 }, + { "x": 1593413318000, "y": 0 }, + { "x": 1593413319000, "y": 0 }, + { "x": 1593413320000, "y": 0 }, + { "x": 1593413321000, "y": 0 }, + { "x": 1593413322000, "y": 0 }, + { "x": 1593413323000, "y": 0 }, + { "x": 1593413324000, "y": 0 }, + { "x": 1593413325000, "y": 0 }, + { "x": 1593413326000, "y": 0 }, + { "x": 1593413327000, "y": 0 }, + { "x": 1593413328000, "y": 0 }, + { "x": 1593413329000, "y": 0 }, + { "x": 1593413330000, "y": 0 }, + { "x": 1593413331000, "y": 0 }, + { "x": 1593413332000, "y": 0 }, + { "x": 1593413333000, "y": 0 }, + { "x": 1593413334000, "y": 0 }, + { "x": 1593413335000, "y": 0 }, + { "x": 1593413336000, "y": 0 }, + { "x": 1593413337000, "y": 0 }, + { "x": 1593413338000, "y": 0 }, + { "x": 1593413339000, "y": 0 }, + { "x": 1593413340000, "y": 0 } + ], + "avg": 0.25 + } + ], + "overallAvgDuration": 38682.52419354839 + } +} diff --git a/x-pack/test/apm_api_integration/basic/tests/services/transactions/top_transaction_groups.ts b/x-pack/test/apm_api_integration/basic/tests/services/transactions/top_transaction_groups.ts new file mode 100644 index 0000000000000..3df1e9972d5ac --- /dev/null +++ b/x-pack/test/apm_api_integration/basic/tests/services/transactions/top_transaction_groups.ts @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; +import expectedTransactionGroups from './expectations/top_transaction_groups.json'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const esArchiver = getService('esArchiver'); + + // url parameters + const start = encodeURIComponent('2020-06-29T06:45:00.000Z'); + const end = encodeURIComponent('2020-06-29T06:49:00.000Z'); + const uiFilters = encodeURIComponent(JSON.stringify({})); + const transactionType = 'request'; + + describe('Top transaction groups', () => { + describe('when data is not loaded ', () => { + it('handles empty state', async () => { + const response = await supertest.get( + `/api/apm/services/opbeans-node/transaction_groups?start=${start}&end=${end}&uiFilters=${uiFilters}&transactionType=${transactionType}` + ); + + expect(response.status).to.be(200); + expect(response.body).to.eql({ items: [], isAggregationAccurate: true, bucketSize: 100 }); + }); + }); + + describe('when data is loaded', () => { + let response: any; + before(async () => { + await esArchiver.load('8.0.0'); + 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')); + + it('returns the correct status code', async () => { + expect(response.status).to.be(200); + }); + + it('returns the correct number of buckets', async () => { + expect(response.body.items.length).to.be(18); + }); + + it('returns the correct buckets (when ignoring samples)', async () => { + function omitSample(items: any[]) { + return items.map(({ sample, ...item }) => ({ ...item })); + } + + expect(omitSample(response.body.items)).to.eql(omitSample(expectedTransactionGroups.items)); + }); + + it('returns the correct buckets and samples', async () => { + expect(response.body.items).to.eql(expectedTransactionGroups.items); + }); + }); + }); +} diff --git a/x-pack/test/apm_api_integration/basic/tests/services/transactions/transaction_charts.ts b/x-pack/test/apm_api_integration/basic/tests/services/transactions/transaction_charts.ts new file mode 100644 index 0000000000000..7178498863787 --- /dev/null +++ b/x-pack/test/apm_api_integration/basic/tests/services/transactions/transaction_charts.ts @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; +import expectedTransactionCharts from './expectations/transaction_charts.json'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const esArchiver = getService('esArchiver'); + + // url parameters + const start = encodeURIComponent('2020-06-29T06:45:00.000Z'); + const end = encodeURIComponent('2020-06-29T06:49:00.000Z'); + const uiFilters = encodeURIComponent(JSON.stringify({})); + + describe('Transaction charts', () => { + describe('when data is not loaded ', () => { + it('handles the empty state', async () => { + const response = await supertest.get( + `/api/apm/services/opbeans-node/transaction_groups/charts?start=${start}&end=${end}&uiFilters=${uiFilters}` + ); + + expect(response.status).to.be(200); + expect(response.body).to.eql({ + apmTimeseries: { + overallAvgDuration: null, + responseTimes: { + avg: [], + p95: [], + p99: [], + }, + tpmBuckets: [], + }, + }); + }); + }); + + describe('when data is loaded', () => { + before(() => esArchiver.load('8.0.0')); + after(() => esArchiver.unload('8.0.0')); + + it('returns the transaction charts', async () => { + const response = await supertest.get( + `/api/apm/services/opbeans-node/transaction_groups/charts?start=${start}&end=${end}&uiFilters=${uiFilters}` + ); + + expect(response.status).to.be(200); + expect(response.body).to.eql(expectedTransactionCharts); + }); + }); + }); +} diff --git a/x-pack/test/apm_api_integration/basic/tests/services/transactions/transaction_types.ts b/x-pack/test/apm_api_integration/basic/tests/services/transactions/transaction_types.ts new file mode 100644 index 0000000000000..56844dfcedda1 --- /dev/null +++ b/x-pack/test/apm_api_integration/basic/tests/services/transactions/transaction_types.ts @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const esArchiver = getService('esArchiver'); + + // url parameters + const start = encodeURIComponent('2020-06-29T06:45:00.000Z'); + const end = encodeURIComponent('2020-06-29T06:49:00.000Z'); + + describe('Transaction types', () => { + describe('when data is not loaded ', () => { + it('handles empty state', async () => { + const response = await supertest.get( + `/api/apm/services/opbeans-node/transaction_types?start=${start}&end=${end}` + ); + + expect(response.status).to.be(200); + expect(response.body).to.eql({ transactionTypes: [] }); + }); + }); + + describe('when data is loaded', () => { + before(() => esArchiver.load('8.0.0')); + after(() => esArchiver.unload('8.0.0')); + + it('handles empty state', async () => { + const response = await supertest.get( + `/api/apm/services/opbeans-node/transaction_types?start=${start}&end=${end}` + ); + + expect(response.status).to.be(200); + expect(response.body).to.eql({ transactionTypes: ['request', 'Worker'] }); + }); + }); + }); +} diff --git a/x-pack/test/apm_api_integration/basic/tests/traces/top_traces.expectation.json b/x-pack/test/apm_api_integration/basic/tests/traces/top_traces.expectation.json new file mode 100644 index 0000000000000..bacb340292f93 --- /dev/null +++ b/x-pack/test/apm_api_integration/basic/tests/traces/top_traces.expectation.json @@ -0,0 +1,3378 @@ +[ + { + "name": "Process payment", + "sample": { + "@timestamp": "2020-06-29T06:48:29.892Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:39.379730Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "timestamp": { "us": 1593413309892019 }, + "trace": { "id": "bc393b659bef63291b6fa08e6f1d3f14" }, + "transaction": { + "duration": { "us": 1745009 }, + "id": "a58333df6d851cf1", + "name": "Process payment", + "result": "success", + "sampled": true, + "span_count": { "started": 2 }, + "type": "Worker" + } + }, + "p95": 1744896, + "averageResponseTime": 1745009, + "transactionsPerMinute": 0.25, + "impact": 100 + }, + { + "name": "GET /api", + "sample": { + "@timestamp": "2020-06-29T06:48:41.454Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:43.992834Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Type": ["application/json;charset=UTF-8"], + "Date": ["Mon, 29 Jun 2020 06:48:41 GMT"], + "Transfer-Encoding": ["chunked"], + "X-Powered-By": ["Express"] + }, + "status_code": 200 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413321454009 }, + "trace": { "id": "0507830eeff93f7bf1a354e4031097b3" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 8334 }, + "id": "878250a8b937445d", + "name": "GET /api", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "started": 1 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/api/products/6", + "original": "/api/products/6", + "path": "/api/products/6", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 81888, + "averageResponseTime": 49816.15625, + "transactionsPerMinute": 8, + "impact": 91.32732325394932 + }, + { + "name": "/dashboard", + "sample": { + "@timestamp": "2020-06-29T06:48:21.621Z", + "agent": { "name": "rum-js", "version": "5.2.0" }, + "client": { "ip": "172.18.0.8" }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:22.625275Z" }, + "http": { + "request": { "referrer": "" }, + "response": { + "decoded_body_size": 813, + "encoded_body_size": 813, + "transfer_size": 962 + } + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "language": { "name": "javascript" }, + "name": "client", + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.8" }, + "timestamp": { "us": 1593413301621808 }, + "trace": { "id": "ee0ce8b38b8d5945829fc1c9432538bf" }, + "transaction": { + "custom": { + "userConfig": { + "featureFlags": ["double-trouble", "4423-hotfix"], + "showDashboard": true + } + }, + "duration": { "us": 109000 }, + "id": "c546a6716b681bf2", + "marks": { + "agent": { + "domComplete": 98, + "domInteractive": 87, + "timeToFirstByte": 3 + }, + "navigationTiming": { + "connectEnd": 0, + "connectStart": 0, + "domComplete": 98, + "domContentLoadedEventEnd": 87, + "domContentLoadedEventStart": 87, + "domInteractive": 87, + "domLoading": 8, + "domainLookupEnd": 0, + "domainLookupStart": 0, + "fetchStart": 0, + "loadEventEnd": 98, + "loadEventStart": 98, + "requestStart": 1, + "responseEnd": 8, + "responseStart": 3 + } + }, + "name": "/dashboard", + "page": { "referer": "", "url": "http://opbeans-node:3000/dashboard" }, + "sampled": true, + "span_count": { "started": 8 }, + "type": "page-load" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/dashboard", + "original": "http://opbeans-node:3000/dashboard", + "path": "/dashboard", + "port": 3000, + "scheme": "http" + }, + "user": { + "email": "arthur.dent@example.com", + "id": "1", + "name": "arthurdent" + }, + "user_agent": { + "device": { "name": "Other" }, + "name": "HeadlessChrome", + "original": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.0 Safari/537.36", + "os": { "name": "Linux" }, + "version": "79.0.3945" + } + }, + "p95": 341504, + "averageResponseTime": 208000, + "transactionsPerMinute": 0.75, + "impact": 35.56882613781033 + }, + { + "name": "DispatcherServlet#doGet", + "sample": { + "@timestamp": "2020-06-29T06:48:40.104Z", + "agent": { + "ephemeral_id": "222af346-6dd9-45ef-ac85-d86b67edd2de", + "name": "java", + "version": "1.17.1-SNAPSHOT" + }, + "client": { "ip": "172.18.0.9" }, + "container": { + "id": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:46.706956Z" }, + "host": { + "architecture": "amd64", + "hostname": "918ebbd99b4f", + "ip": "172.18.0.6", + "name": "918ebbd99b4f", + "os": { "platform": "Linux" } + }, + "http": { + "request": { + "headers": { + "Accept": ["*/*"], + "Accept-Encoding": ["gzip, deflate"], + "Host": ["172.18.0.6:3000"], + "User-Agent": ["Python/3.7 aiohttp/3.3.2"] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "172.18.0.9" } + }, + "response": { + "finished": true, + "headers_sent": false, + "status_code": 200 + }, + "version": "1.1" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { "pid": 6, "ppid": 1, "title": "/opt/java/openjdk/bin/java" }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "Servlet API" }, + "language": { "name": "Java", "version": "11.0.7" }, + "name": "opbeans-java", + "node": { + "name": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" + }, + "runtime": { "name": "Java", "version": "11.0.7" }, + "version": "None" + }, + "source": { "ip": "172.18.0.9" }, + "timestamp": { "us": 1593413320104008 }, + "trace": { "id": "90bd7780b32cc51a7f4c200b1e0c170f" }, + "transaction": { + "duration": { "us": 8896 }, + "id": "40b22b21e92bbb20", + "name": "DispatcherServlet#doGet", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "dropped": 0, "started": 1 }, + "type": "request" + }, + "url": { + "domain": "172.18.0.6", + "full": "http://172.18.0.6:3000/api/orders", + "path": "/api/orders", + "port": 3000, + "scheme": "http" + }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "Python/3.7 aiohttp/3.3.2" + } + }, + "p95": 34528, + "averageResponseTime": 36010.53846153846, + "transactionsPerMinute": 3.25, + "impact": 26.61043592713186 + }, + { + "name": "POST /api/orders", + "sample": { + "@timestamp": "2020-06-29T06:48:39.953Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:43.991549Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "body": { "original": "[REDACTED]" }, + "headers": { + "Accept": ["application/json"], + "Connection": ["close"], + "Content-Length": ["129"], + "Content-Type": ["application/json"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "post", + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Length": ["13"], + "Content-Type": ["application/json; charset=utf-8"], + "Date": ["Mon, 29 Jun 2020 06:48:40 GMT"], + "Etag": ["W/\"d-eEOWU4Cnr5DZ23ErRUeYu9oOIks\""], + "X-Powered-By": ["Express"] + }, + "status_code": 200 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413319953033 }, + "trace": { "id": "52b8fda5f6df745b990740ba18378620" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 270684 }, + "id": "a3afc2a112e9c893", + "name": "POST /api/orders", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "started": 16 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/api/orders", + "original": "/api/orders", + "path": "/api/orders", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 270336, + "averageResponseTime": 270684, + "transactionsPerMinute": 0.25, + "impact": 15.261616628971955 + }, + { + "name": "ResourceHttpRequestHandler", + "sample": { + "@timestamp": "2020-06-29T06:48:44.376Z", + "agent": { + "ephemeral_id": "222af346-6dd9-45ef-ac85-d86b67edd2de", + "name": "java", + "version": "1.17.1-SNAPSHOT" + }, + "client": { "ip": "172.18.0.9" }, + "container": { + "id": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:46.720380Z" }, + "host": { + "architecture": "amd64", + "hostname": "918ebbd99b4f", + "ip": "172.18.0.6", + "name": "918ebbd99b4f", + "os": { "platform": "Linux" } + }, + "http": { + "request": { + "headers": { + "Accept": ["*/*"], + "Accept-Encoding": ["gzip, deflate"], + "Host": ["172.18.0.6:3000"], + "User-Agent": ["Python/3.7 aiohttp/3.3.2"] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "172.18.0.9" } + }, + "response": { + "finished": true, + "headers_sent": true, + "status_code": 404 + }, + "version": "1.1" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { "pid": 6, "ppid": 1, "title": "/opt/java/openjdk/bin/java" }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "Spring Web MVC", "version": "5.0.6.RELEASE" }, + "language": { "name": "Java", "version": "11.0.7" }, + "name": "opbeans-java", + "node": { + "name": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" + }, + "runtime": { "name": "Java", "version": "11.0.7" }, + "version": "None" + }, + "source": { "ip": "172.18.0.9" }, + "timestamp": { "us": 1593413324376010 }, + "trace": { "id": "7e70dc471913473e7d3bffda9b27d720" }, + "transaction": { + "duration": { "us": 1420 }, + "id": "5c4e9f4b0846c2f8", + "name": "ResourceHttpRequestHandler", + "result": "HTTP 4xx", + "sampled": true, + "span_count": { "dropped": 0, "started": 0 }, + "type": "request" + }, + "url": { + "domain": "172.18.0.6", + "full": "http://172.18.0.6:3000/api/types", + "path": "/api/types", + "port": 3000, + "scheme": "http" + }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "Python/3.7 aiohttp/3.3.2" + } + }, + "p95": 4120, + "averageResponseTime": 14419.42857142857, + "transactionsPerMinute": 3.5, + "impact": 11.30657439844125 + }, + { + "name": "/orders", + "sample": { + "@timestamp": "2020-06-29T06:48:38.358Z", + "agent": { "name": "rum-js", "version": "5.2.0" }, + "client": { "ip": "172.18.0.8" }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:39.365914Z" }, + "http": { + "request": { "referrer": "" }, + "response": { + "decoded_body_size": 813, + "encoded_body_size": 813, + "transfer_size": 962 + } + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "language": { "name": "javascript" }, + "name": "client", + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.8" }, + "timestamp": { "us": 1593413318358392 }, + "trace": { "id": "c1dea08a4128e776fd9965ccf8c8da99" }, + "transaction": { + "custom": { + "userConfig": { + "featureFlags": ["double-trouble", "4423-hotfix"], + "showDashboard": true + } + }, + "duration": { "us": 140000 }, + "id": "4f2ea2796645d6e5", + "marks": { + "agent": { + "domComplete": 126, + "domInteractive": 116, + "timeToFirstByte": 3 + }, + "navigationTiming": { + "connectEnd": 0, + "connectStart": 0, + "domComplete": 126, + "domContentLoadedEventEnd": 116, + "domContentLoadedEventStart": 116, + "domInteractive": 116, + "domLoading": 20, + "domainLookupEnd": 0, + "domainLookupStart": 0, + "fetchStart": 0, + "loadEventEnd": 126, + "loadEventStart": 126, + "requestStart": 1, + "responseEnd": 3, + "responseStart": 3 + } + }, + "name": "/orders", + "page": { "referer": "", "url": "http://opbeans-node:3000/orders" }, + "sampled": true, + "span_count": { "started": 7 }, + "type": "page-load" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/orders", + "original": "http://opbeans-node:3000/orders", + "path": "/orders", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "adastra@example.com", "id": "3", "name": "trillian" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "HeadlessChrome", + "original": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.0 Safari/537.36", + "os": { "name": "Linux" }, + "version": "79.0.3945" + } + }, + "p95": 140160, + "averageResponseTime": 81500, + "transactionsPerMinute": 0.5, + "impact": 9.072365225837785 + }, + { + "name": "APIRestController#customer", + "sample": { + "@timestamp": "2020-06-29T06:48:38.893Z", + "agent": { + "ephemeral_id": "222af346-6dd9-45ef-ac85-d86b67edd2de", + "name": "java", + "version": "1.17.1-SNAPSHOT" + }, + "client": { "ip": "172.18.0.9" }, + "container": { + "id": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:46.680126Z" }, + "host": { + "architecture": "amd64", + "hostname": "918ebbd99b4f", + "ip": "172.18.0.6", + "name": "918ebbd99b4f", + "os": { "platform": "Linux" } + }, + "http": { + "request": { + "headers": { + "Accept": ["*/*"], + "Accept-Encoding": ["gzip, deflate"], + "Host": ["172.18.0.6:3000"], + "User-Agent": ["Python/3.7 aiohttp/3.3.2"] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "172.18.0.9" } + }, + "response": { + "finished": true, + "headers": { + "Content-Type": ["application/json;charset=UTF-8"], + "Date": ["Mon, 29 Jun 2020 06:48:38 GMT"], + "Transfer-Encoding": ["chunked"] + }, + "headers_sent": true, + "status_code": 200 + }, + "version": "1.1" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { "pid": 6, "ppid": 1, "title": "/opt/java/openjdk/bin/java" }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "Spring Web MVC", "version": "5.0.6.RELEASE" }, + "language": { "name": "Java", "version": "11.0.7" }, + "name": "opbeans-java", + "node": { + "name": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" + }, + "runtime": { "name": "Java", "version": "11.0.7" }, + "version": "None" + }, + "source": { "ip": "172.18.0.9" }, + "timestamp": { "us": 1593413318893006 }, + "trace": { "id": "efcf3446b51d080dbde1339969cf79a0" }, + "transaction": { + "duration": { "us": 4594 }, + "id": "31ef64d71933e846", + "name": "APIRestController#customer", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "dropped": 0, "started": 2 }, + "type": "request" + }, + "url": { + "domain": "172.18.0.6", + "full": "http://172.18.0.6:3000/api/customers/235", + "path": "/api/customers/235", + "port": 3000, + "scheme": "http" + }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "Python/3.7 aiohttp/3.3.2" + } + }, + "p95": 77280, + "averageResponseTime": 19370.6, + "transactionsPerMinute": 1.25, + "impact": 5.270496679320978 + }, + { + "name": "/products", + "sample": { + "@timestamp": "2020-06-29T06:48:48.824Z", + "agent": { "name": "rum-js", "version": "5.2.0" }, + "client": { "ip": "172.18.0.8" }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:49.293664Z" }, + "http": { + "request": { "referrer": "" }, + "response": { + "decoded_body_size": 813, + "encoded_body_size": 813, + "transfer_size": 962 + } + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "language": { "name": "javascript" }, + "name": "client", + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.8" }, + "timestamp": { "us": 1593413328824656 }, + "trace": { "id": "f6c4a9197bbd080bd45072970f251525" }, + "transaction": { + "custom": { + "userConfig": { + "featureFlags": ["double-trouble", "4423-hotfix"], + "showDashboard": true + } + }, + "duration": { "us": 77000 }, + "id": "a11ede1968973bc5", + "marks": { + "agent": { + "domComplete": 68, + "domInteractive": 58, + "timeToFirstByte": 5 + }, + "navigationTiming": { + "connectEnd": 1, + "connectStart": 1, + "domComplete": 68, + "domContentLoadedEventEnd": 59, + "domContentLoadedEventStart": 59, + "domInteractive": 58, + "domLoading": 23, + "domainLookupEnd": 1, + "domainLookupStart": 1, + "fetchStart": 0, + "loadEventEnd": 68, + "loadEventStart": 68, + "requestStart": 2, + "responseEnd": 5, + "responseStart": 5 + } + }, + "name": "/products", + "page": { "referer": "", "url": "http://opbeans-node:3000/products" }, + "sampled": true, + "span_count": { "started": 5 }, + "type": "page-load" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/products", + "original": "http://opbeans-node:3000/products", + "path": "/products", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "z@example.com", "id": "4", "name": "zaphod" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "HeadlessChrome", + "original": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.0 Safari/537.36", + "os": { "name": "Linux" }, + "version": "79.0.3945" + } + }, + "p95": 76800, + "averageResponseTime": 77000, + "transactionsPerMinute": 0.25, + "impact": 4.129424578484989 + }, + { + "name": "/customers", + "sample": { + "@timestamp": "2020-06-29T06:48:48.287Z", + "agent": { "name": "rum-js", "version": "5.2.0" }, + "client": { "ip": "172.18.0.8" }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:49.292535Z" }, + "http": { "request": { "referrer": "" } }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "language": { "name": "javascript" }, + "name": "client", + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.8" }, + "timestamp": { "us": 1593413328287946 }, + "trace": { "id": "48d130530a1fc0b2b99d138d3461bad4" }, + "transaction": { + "custom": { + "userConfig": { + "featureFlags": ["double-trouble", "4423-hotfix"], + "showDashboard": true + } + }, + "duration": { "us": 39000 }, + "id": "2f3a2b0fd3016d3e", + "name": "/customers", + "page": { "referer": "", "url": "http://opbeans-node:3000/customers" }, + "sampled": true, + "span_count": { "started": 1 }, + "type": "route-change" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/customers", + "original": "http://opbeans-node:3000/customers", + "path": "/customers", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "adastra@example.com", "id": "3", "name": "trillian" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "HeadlessChrome", + "original": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/79.0.3945.0 Safari/537.36", + "os": { "name": "Linux" }, + "version": "79.0.3945" + } + }, + "p95": 39040, + "averageResponseTime": 33500, + "transactionsPerMinute": 0.5, + "impact": 3.5546640380951287 + }, + { + "name": "APIRestController#customers", + "sample": { + "@timestamp": "2020-06-29T06:48:43.765Z", + "agent": { + "ephemeral_id": "222af346-6dd9-45ef-ac85-d86b67edd2de", + "name": "java", + "version": "1.17.1-SNAPSHOT" + }, + "client": { "ip": "172.18.0.9" }, + "container": { + "id": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:46.716850Z" }, + "host": { + "architecture": "amd64", + "hostname": "918ebbd99b4f", + "ip": "172.18.0.6", + "name": "918ebbd99b4f", + "os": { "platform": "Linux" } + }, + "http": { + "request": { + "headers": { + "Accept": ["*/*"], + "Accept-Encoding": ["gzip, deflate"], + "Host": ["172.18.0.6:3000"], + "User-Agent": ["Python/3.7 aiohttp/3.3.2"] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "172.18.0.9" } + }, + "response": { + "finished": true, + "headers": { + "Content-Type": ["application/json;charset=UTF-8"], + "Date": ["Mon, 29 Jun 2020 06:48:43 GMT"], + "Transfer-Encoding": ["chunked"] + }, + "headers_sent": true, + "status_code": 500 + }, + "version": "1.1" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { "pid": 6, "ppid": 1, "title": "/opt/java/openjdk/bin/java" }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "Spring Web MVC", "version": "5.0.6.RELEASE" }, + "language": { "name": "Java", "version": "11.0.7" }, + "name": "opbeans-java", + "node": { + "name": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" + }, + "runtime": { "name": "Java", "version": "11.0.7" }, + "version": "None" + }, + "source": { "ip": "172.18.0.9" }, + "timestamp": { "us": 1593413323765008 }, + "trace": { "id": "affce4cea9b60bd5b635dc1bd2e4ce79" }, + "transaction": { + "duration": { "us": 10880 }, + "id": "cfe0a84b49b4a340", + "name": "APIRestController#customers", + "result": "HTTP 5xx", + "sampled": true, + "span_count": { "dropped": 0, "started": 2 }, + "type": "request" + }, + "url": { + "domain": "172.18.0.6", + "full": "http://172.18.0.6:3000/api/customers", + "path": "/api/customers", + "port": 3000, + "scheme": "http" + }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "Python/3.7 aiohttp/3.3.2" + } + }, + "p95": 26432, + "averageResponseTime": 16690.75, + "transactionsPerMinute": 1, + "impact": 3.541042213287889 + }, + { + "name": "GET /log-message", + "sample": { + "@timestamp": "2020-06-29T06:48:28.944Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:39.370695Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Length": ["24"], + "Content-Type": ["text/html; charset=utf-8"], + "Date": ["Mon, 29 Jun 2020 06:48:28 GMT"], + "Etag": ["W/\"18-MS3VbhH7auHMzO0fUuNF6v14N/M\""], + "X-Powered-By": ["Express"] + }, + "status_code": 500 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413308944016 }, + "trace": { "id": "afabe4cb397616f5ec35a2f3da49ba62" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 26788 }, + "id": "cc8c4261387507cf", + "name": "GET /log-message", + "result": "HTTP 5xx", + "sampled": true, + "span_count": { "started": 0 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/log-message", + "original": "/log-message", + "path": "/log-message", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 38528, + "averageResponseTime": 32667.5, + "transactionsPerMinute": 0.5, + "impact": 3.458966408120217 + }, + { + "name": "APIRestController#stats", + "sample": { + "@timestamp": "2020-06-29T06:48:42.549Z", + "agent": { + "ephemeral_id": "222af346-6dd9-45ef-ac85-d86b67edd2de", + "name": "java", + "version": "1.17.1-SNAPSHOT" + }, + "client": { "ip": "172.18.0.9" }, + "container": { + "id": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:46.715898Z" }, + "host": { + "architecture": "amd64", + "hostname": "918ebbd99b4f", + "ip": "172.18.0.6", + "name": "918ebbd99b4f", + "os": { "platform": "Linux" } + }, + "http": { + "request": { + "headers": { + "Accept": ["*/*"], + "Accept-Encoding": ["gzip, deflate"], + "Host": ["172.18.0.6:3000"], + "User-Agent": ["Python/3.7 aiohttp/3.3.2"] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "172.18.0.9" } + }, + "response": { + "finished": true, + "headers": { + "Content-Type": ["application/json;charset=UTF-8"], + "Date": ["Mon, 29 Jun 2020 06:48:42 GMT"], + "Transfer-Encoding": ["chunked"] + }, + "headers_sent": true, + "status_code": 200 + }, + "version": "1.1" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { "pid": 6, "ppid": 1, "title": "/opt/java/openjdk/bin/java" }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "Spring Web MVC", "version": "5.0.6.RELEASE" }, + "language": { "name": "Java", "version": "11.0.7" }, + "name": "opbeans-java", + "node": { + "name": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" + }, + "runtime": { "name": "Java", "version": "11.0.7" }, + "version": "None" + }, + "source": { "ip": "172.18.0.9" }, + "timestamp": { "us": 1593413322549008 }, + "trace": { "id": "c3556e143784f94d4b4220dd40687fae" }, + "transaction": { + "duration": { "us": 9166 }, + "id": "ac40e567f63c3eef", + "name": "APIRestController#stats", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "dropped": 0, "started": 5 }, + "type": "request" + }, + "url": { + "domain": "172.18.0.6", + "full": "http://172.18.0.6:3000/api/stats", + "path": "/api/stats", + "port": 3000, + "scheme": "http" + }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "Python/3.7 aiohttp/3.3.2" + } + }, + "p95": 32064, + "averageResponseTime": 15535, + "transactionsPerMinute": 1, + "impact": 3.275330415465657 + }, + { + "name": "GET /api/customers", + "sample": { + "@timestamp": "2020-06-29T06:48:37.952Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:39.492402Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Length": ["186769"], + "Content-Type": ["application/json; charset=utf-8"], + "Date": ["Mon, 29 Jun 2020 06:48:37 GMT"], + "Etag": ["W/\"2d991-yG3J8W/roH7fSxXTudZrO27Ax9s\""], + "X-Powered-By": ["Express"] + }, + "status_code": 200 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413317952016 }, + "trace": { "id": "5d99327edae38ed735e8d7a6028cf719" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 16824 }, + "id": "071808429ec9d00b", + "name": "GET /api/customers", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "started": 2 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/api/customers", + "original": "/api/customers", + "path": "/api/customers", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 26368, + "averageResponseTime": 20092, + "transactionsPerMinute": 0.75, + "impact": 3.168195050736987 + }, + { + "name": "GET /api/products/:id", + "sample": { + "@timestamp": "2020-06-29T06:48:24.977Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:27.004717Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Length": ["231"], + "Content-Type": ["application/json; charset=utf-8"], + "Date": ["Mon, 29 Jun 2020 06:48:24 GMT"], + "Etag": ["W/\"e7-kkuzj37GZDzXDh0CWqh5Gan0VO4\""], + "X-Powered-By": ["Express"] + }, + "status_code": 200 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413304977014 }, + "trace": { "id": "b9b290bca14c99962fa9a1c509401630" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 4482 }, + "id": "b8d8284ff1fc25d6", + "name": "GET /api/products/:id", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "started": 1 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/api/products/3", + "original": "/api/products/3", + "path": "/api/products/3", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 37856, + "averageResponseTime": 13516.5, + "transactionsPerMinute": 1, + "impact": 2.8112687551548836 + }, + { + "name": "GET /api/types", + "sample": { + "@timestamp": "2020-06-29T06:48:26.443Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:29.977518Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Length": ["112"], + "Content-Type": ["application/json; charset=utf-8"], + "Date": ["Mon, 29 Jun 2020 06:48:26 GMT"], + "Etag": ["W/\"70-1z6hT7P1WHgBgS/BeUEVeHhOCQU\""], + "X-Powered-By": ["Express"] + }, + "status_code": 200 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413306443014 }, + "trace": { "id": "be3f4eb50d253afc032c90eacaa85072" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 8892 }, + "id": "ccce129bb8c6b125", + "name": "GET /api/types", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "started": 2 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/api/types", + "original": "/api/types", + "path": "/api/types", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 45248, + "averageResponseTime": 26992.5, + "transactionsPerMinute": 0.5, + "impact": 2.8066131947777255 + }, + { + "name": "GET static file", + "sample": { + "@timestamp": "2020-06-29T06:48:40.953Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:43.992454Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } + }, + "response": { + "headers": { + "Accept-Ranges": ["bytes"], + "Cache-Control": ["public, max-age=0"], + "Connection": ["close"], + "Content-Length": ["15086"], + "Content-Type": ["image/x-icon"], + "Date": ["Mon, 29 Jun 2020 06:48:40 GMT"], + "Etag": ["W/\"3aee-1725aff14f0\""], + "Last-Modified": ["Thu, 28 May 2020 11:16:06 GMT"], + "X-Powered-By": ["Express"] + }, + "status_code": 200 + }, + "version": "1.1" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413320953016 }, + "trace": { "id": "292393440bbe04385f3c2e3715ac35fe" }, + "transaction": { + "duration": { "us": 1671 }, + "id": "d1d964ca1865dce3", + "name": "GET static file", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "started": 0 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/favicon.ico", + "original": "/favicon.ico", + "path": "/favicon.ico", + "port": 3000, + "scheme": "http" + }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 11900, + "averageResponseTime": 3492.9285714285716, + "transactionsPerMinute": 3.5, + "impact": 2.5144049360435208 + }, + { + "name": "APIRestController#customerWhoBought", + "sample": { + "@timestamp": "2020-06-29T06:48:44.982Z", + "agent": { + "ephemeral_id": "222af346-6dd9-45ef-ac85-d86b67edd2de", + "name": "java", + "version": "1.17.1-SNAPSHOT" + }, + "client": { "ip": "172.18.0.9" }, + "container": { + "id": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:46.721114Z" }, + "host": { + "architecture": "amd64", + "hostname": "918ebbd99b4f", + "ip": "172.18.0.6", + "name": "918ebbd99b4f", + "os": { "platform": "Linux" } + }, + "http": { + "request": { + "headers": { + "Accept": ["*/*"], + "Accept-Encoding": ["gzip, deflate"], + "Host": ["172.18.0.6:3000"], + "User-Agent": ["Python/3.7 aiohttp/3.3.2"] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "172.18.0.9" } + }, + "response": { + "finished": true, + "headers": { + "Content-Type": ["application/json;charset=UTF-8"], + "Date": ["Mon, 29 Jun 2020 06:48:44 GMT"], + "Transfer-Encoding": ["chunked"] + }, + "headers_sent": true, + "status_code": 200 + }, + "version": "1.1" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { "pid": 6, "ppid": 1, "title": "/opt/java/openjdk/bin/java" }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "Spring Web MVC", "version": "5.0.6.RELEASE" }, + "language": { "name": "Java", "version": "11.0.7" }, + "name": "opbeans-java", + "node": { + "name": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" + }, + "runtime": { "name": "Java", "version": "11.0.7" }, + "version": "None" + }, + "source": { "ip": "172.18.0.9" }, + "timestamp": { "us": 1593413324982008 }, + "trace": { "id": "e5ce8ba877f69510e7abc3f0d11c1e4f" }, + "transaction": { + "duration": { "us": 2797 }, + "id": "b8c1bd3b31b197d3", + "name": "APIRestController#customerWhoBought", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "dropped": 0, "started": 1 }, + "type": "request" + }, + "url": { + "domain": "172.18.0.6", + "full": "http://172.18.0.6:3000/api/products/5/customers", + "path": "/api/products/5/customers", + "port": 3000, + "scheme": "http" + }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "Python/3.7 aiohttp/3.3.2" + } + }, + "p95": 4464, + "averageResponseTime": 3742.153846153846, + "transactionsPerMinute": 3.25, + "impact": 2.4998634943716573 + }, + { + "name": "GET /log-error", + "sample": { + "@timestamp": "2020-06-29T06:48:07.467Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:18.533253Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Length": ["24"], + "Content-Type": ["text/html; charset=utf-8"], + "Date": ["Mon, 29 Jun 2020 06:48:07 GMT"], + "Etag": ["W/\"18-MS3VbhH7auHMzO0fUuNF6v14N/M\""], + "X-Powered-By": ["Express"] + }, + "status_code": 500 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413287467017 }, + "trace": { "id": "d518b2c4d72cd2aaf1e39bad7ebcbdbb" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 35846 }, + "id": "c7a30c1b076907ec", + "name": "GET /log-error", + "result": "HTTP 5xx", + "sampled": true, + "span_count": { "started": 0 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/log-error", + "original": "/log-error", + "path": "/log-error", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 35840, + "averageResponseTime": 35846, + "transactionsPerMinute": 0.25, + "impact": 1.7640550505645587 + }, + { + "name": "APIRestController#topProducts", + "sample": { + "@timestamp": "2020-06-29T06:48:45.587Z", + "agent": { + "ephemeral_id": "222af346-6dd9-45ef-ac85-d86b67edd2de", + "name": "java", + "version": "1.17.1-SNAPSHOT" + }, + "client": { "ip": "172.18.0.9" }, + "container": { + "id": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:46.770758Z" }, + "host": { + "architecture": "amd64", + "hostname": "918ebbd99b4f", + "ip": "172.18.0.6", + "name": "918ebbd99b4f", + "os": { "platform": "Linux" } + }, + "http": { + "request": { + "headers": { + "Accept": ["*/*"], + "Accept-Encoding": ["gzip, deflate"], + "Host": ["172.18.0.6:3000"], + "User-Agent": ["Python/3.7 aiohttp/3.3.2"] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "172.18.0.9" } + }, + "response": { + "finished": true, + "headers": { + "Content-Type": ["application/json;charset=UTF-8"], + "Date": ["Mon, 29 Jun 2020 06:48:44 GMT"], + "Transfer-Encoding": ["chunked"] + }, + "headers_sent": true, + "status_code": 200 + }, + "version": "1.1" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { "pid": 6, "ppid": 1, "title": "/opt/java/openjdk/bin/java" }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "Spring Web MVC", "version": "5.0.6.RELEASE" }, + "language": { "name": "Java", "version": "11.0.7" }, + "name": "opbeans-java", + "node": { + "name": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" + }, + "runtime": { "name": "Java", "version": "11.0.7" }, + "version": "None" + }, + "source": { "ip": "172.18.0.9" }, + "timestamp": { "us": 1593413325587007 }, + "trace": { "id": "4470d0cc076e22018e2dd258a25c8812" }, + "transaction": { + "duration": { "us": 4070 }, + "id": "cb860b712121d0d8", + "name": "APIRestController#topProducts", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "dropped": 0, "started": 1 }, + "type": "request" + }, + "url": { + "domain": "172.18.0.6", + "full": "http://172.18.0.6:3000/api/products/top", + "path": "/api/products/top", + "port": 3000, + "scheme": "http" + }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "Python/3.7 aiohttp/3.3.2" + } + }, + "p95": 7344, + "averageResponseTime": 4825, + "transactionsPerMinute": 1.75, + "impact": 1.6450221426498186 + }, + { + "name": "GET /api/products/top", + "sample": { + "@timestamp": "2020-06-29T06:48:01.200Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:02.734903Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Length": ["2"], + "Content-Type": ["application/json; charset=utf-8"], + "Date": ["Mon, 29 Jun 2020 06:48:01 GMT"], + "Etag": ["W/\"2-l9Fw4VUO7kr8CvBlt4zaMCqXZ0w\""], + "X-Powered-By": ["Express"] + }, + "status_code": 200 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 115, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413281200133 }, + "trace": { "id": "195f32efeb6f91e2f71b6bc8bb74ae3a" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 33097 }, + "id": "22e72956dfc8967a", + "name": "GET /api/products/top", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "started": 1 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/api/products/top", + "original": "/api/products/top", + "path": "/api/products/top", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 33024, + "averageResponseTime": 33097, + "transactionsPerMinute": 0.25, + "impact": 1.6060533780113861 + }, + { + "name": "GET /api/products", + "sample": { + "@timestamp": "2020-06-29T06:48:23.477Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:27.001228Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Length": ["1023"], + "Content-Type": ["application/json; charset=utf-8"], + "Date": ["Mon, 29 Jun 2020 06:48:23 GMT"], + "Etag": ["W/\"3ff-VyOxcDApb+a/lnjkm9FeTOGSDrs\""], + "X-Powered-By": ["Express"] + }, + "status_code": 200 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413303477028 }, + "trace": { "id": "9f26158b9a3915577b3cccc17636ea01" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 7150 }, + "id": "27ff4add22ac2e1b", + "name": "GET /api/products", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "started": 2 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/api/products", + "original": "/api/products", + "path": "/api/products", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 8160, + "averageResponseTime": 6583, + "transactionsPerMinute": 1, + "impact": 1.2172278724376455 + }, + { + "name": "POST /api", + "sample": { + "@timestamp": "2020-06-29T06:48:25.478Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:27.005671Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "body": { "original": "[REDACTED]" }, + "headers": { + "Accept": ["application/json"], + "Connection": ["close"], + "Content-Length": ["129"], + "Content-Type": ["application/json"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "post", + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } + }, + "response": { + "headers": { + "Allow": ["GET"], + "Connection": ["close"], + "Content-Type": ["application/json;charset=UTF-8"], + "Date": ["Mon, 29 Jun 2020 06:48:25 GMT"], + "Transfer-Encoding": ["chunked"], + "X-Powered-By": ["Express"] + }, + "status_code": 405 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413305478010 }, + "trace": { "id": "4bd9027dd1e355ec742970e2d6333124" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 20011 }, + "id": "94104435cf151478", + "name": "POST /api", + "result": "HTTP 4xx", + "sampled": true, + "span_count": { "started": 1 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/api/orders", + "original": "/api/orders", + "path": "/api/orders", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 19968, + "averageResponseTime": 20011, + "transactionsPerMinute": 0.25, + "impact": 0.853921734857215 + }, + { + "name": "GET /api/types/:id", + "sample": { + "@timestamp": "2020-06-29T06:48:12.972Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:18.543436Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Length": ["205"], + "Content-Type": ["application/json; charset=utf-8"], + "Date": ["Mon, 29 Jun 2020 06:48:12 GMT"], + "Etag": ["W/\"cd-pFMi1QOVY6YqWe+nwcbZVviCths\""], + "X-Powered-By": ["Express"] + }, + "status_code": 200 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413292972011 }, + "trace": { "id": "aea65cef5f902dda5d8e38f9fb38864d" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 6300 }, + "id": "a5bdbe43ac05fae2", + "name": "GET /api/types/:id", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "started": 2 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/api/types/2", + "original": "/api/types/2", + "path": "/api/types/2", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 10080, + "averageResponseTime": 8181, + "transactionsPerMinute": 0.5, + "impact": 0.6441916136689552 + }, + { + "name": "GET /api/stats", + "sample": { + "@timestamp": "2020-06-29T06:48:39.451Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:43.984824Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Length": ["92"], + "Content-Type": ["application/json; charset=utf-8"], + "Date": ["Mon, 29 Jun 2020 06:48:39 GMT"], + "Etag": ["W/\"5c-6I+bqIiLxvkWuwBUnTxhBoK4lBk\""], + "X-Powered-By": ["Express"] + }, + "status_code": 200 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413319451016 }, + "trace": { "id": "a05787cb03a0af0863fab5e05de942f1" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 5050 }, + "id": "a7e004eba8f021ce", + "name": "GET /api/stats", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "started": 4 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/api/stats", + "original": "/api/stats", + "path": "/api/stats", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 5440, + "averageResponseTime": 5098, + "transactionsPerMinute": 0.75, + "impact": 0.582807187955318 + }, + { + "name": "GET /api/orders", + "sample": { + "@timestamp": "2020-06-29T06:48:35.450Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:39.483715Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Length": ["2"], + "Content-Type": ["application/json; charset=utf-8"], + "Date": ["Mon, 29 Jun 2020 06:48:35 GMT"], + "Etag": ["W/\"2-l9Fw4VUO7kr8CvBlt4zaMCqXZ0w\""], + "X-Powered-By": ["Express"] + }, + "status_code": 200 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413315450014 }, + "trace": { "id": "2da70ccf10599b271f65273d169cde9f" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 8784 }, + "id": "a3f4a4f339758440", + "name": "GET /api/orders", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "started": 2 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/api/orders", + "original": "/api/orders", + "path": "/api/orders", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 8800, + "averageResponseTime": 7624.5, + "transactionsPerMinute": 0.5, + "impact": 0.5802207655235637 + }, + { + "name": "GET /api/orders/:id", + "sample": { + "@timestamp": "2020-06-29T06:48:35.951Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:39.484133Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Length": ["0"], + "Date": ["Mon, 29 Jun 2020 06:48:35 GMT"], + "X-Powered-By": ["Express"] + }, + "status_code": 404 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413315951017 }, + "trace": { "id": "95979caa80e6622cbbb2d308800c3016" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 3210 }, + "id": "30344988dace0b43", + "name": "GET /api/orders/:id", + "result": "HTTP 4xx", + "sampled": true, + "span_count": { "started": 1 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/api/orders/117", + "original": "/api/orders/117", + "path": "/api/orders/117", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 7184, + "averageResponseTime": 4749.666666666667, + "transactionsPerMinute": 0.75, + "impact": 0.5227447114845778 + }, + { + "name": "APIRestController#products", + "sample": { + "@timestamp": "2020-06-29T06:48:27.824Z", + "agent": { + "ephemeral_id": "222af346-6dd9-45ef-ac85-d86b67edd2de", + "name": "java", + "version": "1.17.1-SNAPSHOT" + }, + "client": { "ip": "172.18.0.9" }, + "container": { + "id": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:36.087688Z" }, + "host": { + "architecture": "amd64", + "hostname": "918ebbd99b4f", + "ip": "172.18.0.6", + "name": "918ebbd99b4f", + "os": { "platform": "Linux" } + }, + "http": { + "request": { + "headers": { + "Accept": ["*/*"], + "Accept-Encoding": ["gzip, deflate"], + "Host": ["172.18.0.6:3000"], + "User-Agent": ["Python/3.7 aiohttp/3.3.2"] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "172.18.0.9" } + }, + "response": { + "finished": true, + "headers": { + "Content-Type": ["application/json;charset=UTF-8"], + "Date": ["Mon, 29 Jun 2020 06:48:27 GMT"], + "Transfer-Encoding": ["chunked"] + }, + "headers_sent": true, + "status_code": 200 + }, + "version": "1.1" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { "pid": 6, "ppid": 1, "title": "/opt/java/openjdk/bin/java" }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "Spring Web MVC", "version": "5.0.6.RELEASE" }, + "language": { "name": "Java", "version": "11.0.7" }, + "name": "opbeans-java", + "node": { + "name": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" + }, + "runtime": { "name": "Java", "version": "11.0.7" }, + "version": "None" + }, + "source": { "ip": "172.18.0.9" }, + "timestamp": { "us": 1593413307824008 }, + "trace": { "id": "a6adb17bd5a5d1c0eabb9f36cb626dd5" }, + "transaction": { + "duration": { "us": 5645 }, + "id": "df3e726eaa003d96", + "name": "APIRestController#products", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "dropped": 0, "started": 3 }, + "type": "request" + }, + "url": { + "domain": "172.18.0.6", + "full": "http://172.18.0.6:3000/api/products", + "path": "/api/products", + "port": 3000, + "scheme": "http" + }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "Python/3.7 aiohttp/3.3.2" + } + }, + "p95": 7904, + "averageResponseTime": 6787, + "transactionsPerMinute": 0.5, + "impact": 0.4839483750082622 + }, + { + "name": "GET /api/products/:id/customers", + "sample": { + "@timestamp": "2020-06-29T06:48:41.956Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:43.994692Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Length": ["2"], + "Content-Type": ["application/json; charset=utf-8"], + "Date": ["Mon, 29 Jun 2020 06:48:41 GMT"], + "Etag": ["W/\"2-l9Fw4VUO7kr8CvBlt4zaMCqXZ0w\""], + "X-Powered-By": ["Express"] + }, + "status_code": 200 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413321956016 }, + "trace": { "id": "f735ac5fca8f83eebc748f4a2e009e61" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 3896 }, + "id": "b24ce95c855f83a4", + "name": "GET /api/products/:id/customers", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "started": 1 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/api/products/5/customers", + "original": "/api/products/5/customers", + "path": "/api/products/5/customers", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 5616, + "averageResponseTime": 4757, + "transactionsPerMinute": 0.5, + "impact": 0.25059559560997896 + }, + { + "name": "APIRestController#product", + "sample": { + "@timestamp": "2020-06-29T06:48:41.941Z", + "agent": { + "ephemeral_id": "222af346-6dd9-45ef-ac85-d86b67edd2de", + "name": "java", + "version": "1.17.1-SNAPSHOT" + }, + "client": { "ip": "172.18.0.9" }, + "container": { + "id": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:46.709268Z" }, + "host": { + "architecture": "amd64", + "hostname": "918ebbd99b4f", + "ip": "172.18.0.6", + "name": "918ebbd99b4f", + "os": { "platform": "Linux" } + }, + "http": { + "request": { + "headers": { + "Accept": ["*/*"], + "Accept-Encoding": ["gzip, deflate"], + "Host": ["172.18.0.6:3000"], + "User-Agent": ["Python/3.7 aiohttp/3.3.2"] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "172.18.0.9" } + }, + "response": { + "finished": true, + "headers": { + "Content-Type": ["application/json;charset=UTF-8"], + "Date": ["Mon, 29 Jun 2020 06:48:41 GMT"], + "Transfer-Encoding": ["chunked"] + }, + "headers_sent": true, + "status_code": 200 + }, + "version": "1.1" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { "pid": 6, "ppid": 1, "title": "/opt/java/openjdk/bin/java" }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "Spring Web MVC", "version": "5.0.6.RELEASE" }, + "language": { "name": "Java", "version": "11.0.7" }, + "name": "opbeans-java", + "node": { + "name": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" + }, + "runtime": { "name": "Java", "version": "11.0.7" }, + "version": "None" + }, + "source": { "ip": "172.18.0.9" }, + "timestamp": { "us": 1593413321941007 }, + "trace": { "id": "88a2b9ca970cdd38dfa1b5646d26b897" }, + "transaction": { + "duration": { "us": 4539 }, + "id": "24ee0e4812cfed62", + "name": "APIRestController#product", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "dropped": 0, "started": 2 }, + "type": "request" + }, + "url": { + "domain": "172.18.0.6", + "full": "http://172.18.0.6:3000/api/products/4", + "path": "/api/products/4", + "port": 3000, + "scheme": "http" + }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "Python/3.7 aiohttp/3.3.2" + } + }, + "p95": 4864, + "averageResponseTime": 4713.5, + "transactionsPerMinute": 0.5, + "impact": 0.24559517890858723 + }, + { + "name": "APIRestController#order", + "sample": { + "@timestamp": "2020-06-29T06:48:33.314Z", + "agent": { + "ephemeral_id": "222af346-6dd9-45ef-ac85-d86b67edd2de", + "name": "java", + "version": "1.17.1-SNAPSHOT" + }, + "client": { "ip": "172.18.0.9" }, + "container": { + "id": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:36.137777Z" }, + "host": { + "architecture": "amd64", + "hostname": "918ebbd99b4f", + "ip": "172.18.0.6", + "name": "918ebbd99b4f", + "os": { "platform": "Linux" } + }, + "http": { + "request": { + "headers": { + "Accept": ["*/*"], + "Accept-Encoding": ["gzip, deflate"], + "Host": ["172.18.0.6:3000"], + "User-Agent": ["Python/3.7 aiohttp/3.3.2"] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "172.18.0.9" } + }, + "response": { + "finished": true, + "headers_sent": false, + "status_code": 200 + }, + "version": "1.1" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { "pid": 6, "ppid": 1, "title": "/opt/java/openjdk/bin/java" }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "Spring Web MVC", "version": "5.0.6.RELEASE" }, + "language": { "name": "Java", "version": "11.0.7" }, + "name": "opbeans-java", + "node": { + "name": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" + }, + "runtime": { "name": "Java", "version": "11.0.7" }, + "version": "None" + }, + "source": { "ip": "172.18.0.9" }, + "timestamp": { "us": 1593413313314007 }, + "trace": { "id": "aaf67f944393124080d1e4de804dc6eb" }, + "transaction": { + "duration": { "us": 2503 }, + "id": "f7f9f5e0f8a3a0d4", + "name": "APIRestController#order", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "dropped": 0, "started": 1 }, + "type": "request" + }, + "url": { + "domain": "172.18.0.6", + "full": "http://172.18.0.6:3000/api/orders/906", + "path": "/api/orders/906", + "port": 3000, + "scheme": "http" + }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "Python/3.7 aiohttp/3.3.2" + } + }, + "p95": 4272, + "averageResponseTime": 3392.5, + "transactionsPerMinute": 0.5, + "impact": 0.09374344413758617 + }, + { + "name": "APIRestController#orders", + "sample": { + "@timestamp": "2020-06-29T06:48:39.500Z", + "agent": { + "ephemeral_id": "222af346-6dd9-45ef-ac85-d86b67edd2de", + "name": "java", + "version": "1.17.1-SNAPSHOT" + }, + "client": { "ip": "172.18.0.9" }, + "container": { + "id": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:46.706280Z" }, + "host": { + "architecture": "amd64", + "hostname": "918ebbd99b4f", + "ip": "172.18.0.6", + "name": "918ebbd99b4f", + "os": { "platform": "Linux" } + }, + "http": { + "request": { + "headers": { + "Accept": ["*/*"], + "Accept-Encoding": ["gzip, deflate"], + "Host": ["172.18.0.6:3000"], + "User-Agent": ["Python/3.7 aiohttp/3.3.2"] + }, + "method": "get", + "socket": { "encrypted": false, "remote_address": "172.18.0.9" } + }, + "response": { + "finished": true, + "headers": { + "Content-Type": ["application/json;charset=UTF-8"], + "Date": ["Mon, 29 Jun 2020 06:48:38 GMT"], + "Transfer-Encoding": ["chunked"] + }, + "headers_sent": true, + "status_code": 200 + }, + "version": "1.1" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { "pid": 6, "ppid": 1, "title": "/opt/java/openjdk/bin/java" }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "Spring Web MVC", "version": "5.0.6.RELEASE" }, + "language": { "name": "Java", "version": "11.0.7" }, + "name": "opbeans-java", + "node": { + "name": "918ebbd99b4f40003cf5713c080bb8120fa3bbe7ac4a96acb3aec558ced91ec0" + }, + "runtime": { "name": "Java", "version": "11.0.7" }, + "version": "None" + }, + "source": { "ip": "172.18.0.9" }, + "timestamp": { "us": 1593413319500008 }, + "trace": { "id": "f89b02f09a2e7a7f2cc3478f53d4a495" }, + "transaction": { + "duration": { "us": 3391 }, + "id": "41c8c4300ee2ccda", + "name": "APIRestController#orders", + "result": "HTTP 2xx", + "sampled": true, + "span_count": { "dropped": 0, "started": 2 }, + "type": "request" + }, + "url": { + "domain": "172.18.0.6", + "full": "http://172.18.0.6:3000/api/orders", + "path": "/api/orders", + "port": 3000, + "scheme": "http" + }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "Python/3.7 aiohttp/3.3.2" + } + }, + "p95": 3376, + "averageResponseTime": 3147, + "transactionsPerMinute": 0.5, + "impact": 0.06552270160444405 + }, + { + "name": "GET /throw-error", + "sample": { + "@timestamp": "2020-06-29T06:48:42.954Z", + "agent": { "name": "nodejs", "version": "3.6.1" }, + "client": { "ip": "172.18.0.7" }, + "container": { + "id": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "ecs": { "version": "1.5.0" }, + "event": { "ingested": "2020-06-29T06:48:43.996435Z" }, + "host": { + "architecture": "x64", + "hostname": "41712ded148f", + "ip": "172.18.0.7", + "name": "41712ded148f", + "os": { "platform": "linux" } + }, + "http": { + "request": { + "headers": { + "Connection": ["close"], + "Host": ["opbeans-node:3000"], + "User-Agent": ["workload/2.4.3"] + }, + "method": "get", + "socket": { + "encrypted": false, + "remote_address": "::ffff:172.18.0.7" + } + }, + "response": { + "headers": { + "Connection": ["close"], + "Content-Length": ["148"], + "Content-Security-Policy": ["default-src 'none'"], + "Content-Type": ["text/html; charset=utf-8"], + "Date": ["Mon, 29 Jun 2020 06:48:42 GMT"], + "X-Content-Type-Options": ["nosniff"], + "X-Powered-By": ["Express"] + }, + "status_code": 500 + }, + "version": "1.1" + }, + "labels": { + "foo": "bar", + "lorem": "ipsum dolor sit amet, consectetur adipiscing elit. Nulla finibus, ipsum id scelerisque consequat, enim leo vulputate massa, vel ultricies ante neque ac risus. Curabitur tincidunt vitae sapien id pulvinar. Mauris eu vestibulum tortor. Integer sit amet lorem fringilla, egestas tellus vitae, vulputate purus. Nulla feugiat blandit nunc et semper. Morbi purus libero, mattis sed mauris non, euismod iaculis lacus. Curabitur eleifend ante eros, non faucibus velit lacinia id. Duis posuere libero augue, at dignissim urna consectetur eget. Praesent eu congue est, iaculis finibus augue.", + "multi-line": "foo\nbar\nbaz", + "this-is-a-very-long-tag-name-without-any-spaces": "test" + }, + "observer": { + "ephemeral_id": "99908b73-9813-4a73-baa6-993db405523a", + "hostname": "aa0bd613aa4c", + "id": "1ccc5210-1e6c-4252-a5c8-1d6571a5fa2e", + "type": "apm-server", + "version": "8.0.0", + "version_major": 8 + }, + "process": { + "args": [ + "/usr/local/bin/node", + "/usr/local/lib/node_modules/pm2/lib/ProcessContainer.js", + "ecosystem-workload.config.js" + ], + "pid": 137, + "ppid": 1, + "title": "node /app/server.js" + }, + "processor": { "event": "transaction", "name": "transaction" }, + "service": { + "environment": "production", + "framework": { "name": "express", "version": "4.17.1" }, + "language": { "name": "javascript" }, + "name": "opbeans-node", + "node": { + "name": "41712ded148f30ee09a13421780eec4304bf5049b82a0d8dbc877893be6799e4" + }, + "runtime": { "name": "node", "version": "12.18.1" }, + "version": "1.0.0" + }, + "source": { "ip": "172.18.0.7" }, + "timestamp": { "us": 1593413322954016 }, + "trace": { "id": "9d5aee7443a43db9820f622a10dfac6e" }, + "transaction": { + "custom": { "shoppingBasketCount": 42 }, + "duration": { "us": 1928 }, + "id": "8e6fc8c3f99e8fc9", + "name": "GET /throw-error", + "result": "HTTP 5xx", + "sampled": true, + "span_count": { "started": 0 }, + "type": "request" + }, + "url": { + "domain": "opbeans-node", + "full": "http://opbeans-node:3000/throw-error", + "original": "/throw-error", + "path": "/throw-error", + "port": 3000, + "scheme": "http" + }, + "user": { "email": "kimchy@elastic.co", "id": "42", "name": "kimchy" }, + "user_agent": { + "device": { "name": "Other" }, + "name": "Other", + "original": "workload/2.4.3" + } + }, + "p95": 3224, + "averageResponseTime": 2577, + "transactionsPerMinute": 0.5, + "impact": 0 + } +] diff --git a/x-pack/test/apm_api_integration/basic/tests/traces/top_traces.ts b/x-pack/test/apm_api_integration/basic/tests/traces/top_traces.ts new file mode 100644 index 0000000000000..ca50ae291f110 --- /dev/null +++ b/x-pack/test/apm_api_integration/basic/tests/traces/top_traces.ts @@ -0,0 +1,54 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../common/ftr_provider_context'; +import expectTopTraces from './top_traces.expectation.json'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const esArchiver = getService('esArchiver'); + + // url parameters + const start = encodeURIComponent('2020-06-29T06:45:00.000Z'); + const end = encodeURIComponent('2020-06-29T06:49:00.000Z'); + const uiFilters = encodeURIComponent(JSON.stringify({})); + + describe('Top traces', () => { + describe('when data is not loaded ', () => { + it('handles empty state', async () => { + const response = await supertest.get( + `/api/apm/traces?start=${start}&end=${end}&uiFilters=${uiFilters}` + ); + + expect(response.status).to.be(200); + expect(response.body).to.eql({ items: [], isAggregationAccurate: true, bucketSize: 100 }); + }); + }); + + describe('when data is loaded', () => { + let response: any; + before(async () => { + await esArchiver.load('8.0.0'); + response = await supertest.get( + `/api/apm/traces?start=${start}&end=${end}&uiFilters=${uiFilters}` + ); + }); + after(() => esArchiver.unload('8.0.0')); + + it('returns the correct status code', async () => { + expect(response.status).to.be(200); + }); + + it('returns the correct number of buckets', async () => { + expect(response.body.items.length).to.be(33); + }); + + it('returns the correct buckets and samples', async () => { + expect(response.body.items).to.eql(expectTopTraces); + }); + }); + }); +} diff --git a/x-pack/test/apm_api_integration/trial/tests/service_maps.ts b/x-pack/test/apm_api_integration/trial/tests/service_maps.ts index a2ba9b5bc2e30..cf265c3fb6737 100644 --- a/x-pack/test/apm_api_integration/trial/tests/service_maps.ts +++ b/x-pack/test/apm_api_integration/trial/tests/service_maps.ts @@ -11,12 +11,13 @@ export default function serviceMapsApiTests({ 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'); + describe('Service Maps', () => { 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).to.eql({ elements: [] }); @@ -28,12 +29,9 @@ export default function serviceMapsApiTests({ getService }: FtrProviderContext) after(() => esArchiver.unload('8.0.0')); 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' - ); + const response = await supertest.get(`/api/apm/service-map?start=${start}&end=${end}`); expect(response.status).to.be(200); - expect(response.body).to.eql({ elements: [ { From e99974d8e4fdbb04f5e1f1d027d334e56ca8f30b Mon Sep 17 00:00:00 2001 From: Paul Tavares <56442535+paul-tavares@users.noreply.github.com> Date: Tue, 7 Jul 2020 16:55:40 -0400 Subject: [PATCH 02/27] [Endpoint] Support redirect from Policy Details to Ingest when user initiates Edit Policy from Datasource Edit page (#70874) * allow Policy Details to support route state * Functional Tests cases that cover ingest navigation --- .../common/endpoint/types.ts | 25 ++++++++-- .../security_solution/public/app/routes.tsx | 50 ++++++++++++------- .../public/management/pages/policy/types.ts | 6 +-- .../configure_package_config.tsx | 27 ++++++++-- .../pages/policy/view/policy_details.test.tsx | 6 ++- .../pages/policy/view/policy_details.tsx | 38 +++++++++++--- .../apps/endpoint/policy_details.ts | 9 +++- .../page_objects/policy_page.ts | 8 +++ 8 files changed, 132 insertions(+), 37 deletions(-) diff --git a/x-pack/plugins/security_solution/common/endpoint/types.ts b/x-pack/plugins/security_solution/common/endpoint/types.ts index f2b8acb627cc4..b75d4b2190fe8 100644 --- a/x-pack/plugins/security_solution/common/endpoint/types.ts +++ b/x-pack/plugins/security_solution/common/endpoint/types.ts @@ -4,9 +4,24 @@ * you may not use this file except in compliance with the Elastic License. */ -import { PackageConfig, NewPackageConfig } from '../../../ingest_manager/common'; +import { ApplicationStart } from 'kibana/public'; +import { NewPackageConfig, PackageConfig } from '../../../ingest_manager/common'; import { ManifestSchema } from './schema/manifest'; +/** + * Supported React-Router state for the Policy Details page + */ +export interface PolicyDetailsRouteState { + /** + * Where the user should be redirected to when the `Save` button is clicked and the update was successful + */ + onSaveNavigateTo?: Parameters; + /** + * Where the user should be redirected to when the `Cancel` button is clicked + */ + onCancelNavigateTo?: Parameters; +} + /** * Object that allows you to maintain stateful information in the location object across navigation events * @@ -17,9 +32,11 @@ export interface AppLocation { search: string; hash: string; key?: string; - state?: { - isTabChange?: boolean; - }; + state?: + | { + isTabChange?: boolean; + } + | PolicyDetailsRouteState; } /** diff --git a/x-pack/plugins/security_solution/public/app/routes.tsx b/x-pack/plugins/security_solution/public/app/routes.tsx index fc0d4e1f4fa62..1d3a59856caa9 100644 --- a/x-pack/plugins/security_solution/public/app/routes.tsx +++ b/x-pack/plugins/security_solution/public/app/routes.tsx @@ -5,34 +5,50 @@ */ import { History } from 'history'; -import React, { FC, memo } from 'react'; +import React, { FC, memo, useEffect } from 'react'; import { Route, Router, Switch } from 'react-router-dom'; +import { useDispatch } from 'react-redux'; import { NotFoundPage } from './404'; import { HomePage } from './home'; import { ManageRoutesSpy } from '../common/utils/route/manage_spy_routes'; import { RouteCapture } from '../common/components/endpoint/route_capture'; +import { AppAction } from '../common/store/actions'; interface RouterProps { children: React.ReactNode; history: History; } -const PageRouterComponent: FC = ({ history, children }) => ( - - - - - - {children} - - - - - - - - -); +const PageRouterComponent: FC = ({ history, children }) => { + const dispatch = useDispatch<(action: AppAction) => void>(); + useEffect(() => { + return () => { + // When app is dismounted via a non-router method (ex. using Kibana's `services.application.navigateToApp()`) + // ensure that one last `userChangedUrl` store action is dispatched, which will help trigger state reset logic + dispatch({ + type: 'userChangedUrl', + payload: { pathname: '', search: '', hash: '' }, + }); + }; + }, [dispatch]); + + return ( + + + + + + {children} + + + + + + + + + ); +}; export const PageRouter = memo(PageRouterComponent); diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/types.ts b/x-pack/plugins/security_solution/public/management/pages/policy/types.ts index 7c27acdb51568..4a870016326be 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/types.ts +++ b/x-pack/plugins/security_solution/public/management/pages/policy/types.ts @@ -5,17 +5,17 @@ */ import { - PolicyData, + AppLocation, Immutable, MalwareFields, + PolicyData, UIPolicyConfig, - AppLocation, } from '../../../../common/endpoint/types'; import { ServerApiError } from '../../../common/types'; import { GetAgentStatusResponse, - GetPackageConfigsResponse, GetOnePackageConfigResponse, + GetPackageConfigsResponse, GetPackagesResponse, UpdatePackageConfigResponse, } from '../../../../../ingest_manager/common'; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/configure_package_config.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/configure_package_config.tsx index ebcfd3f1bb209..67f24977406c6 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/configure_package_config.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/ingest_manager_integration/configure_package_config.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { memo } from 'react'; +import React, { memo, useMemo } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiCallOut, EuiText, EuiTitle, EuiSpacer } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; @@ -15,18 +15,39 @@ import { } from '../../../../../../../ingest_manager/public'; import { getPolicyDetailPath } from '../../../../common/routing'; import { MANAGEMENT_APP_ID } from '../../../../common/constants'; +import { PolicyDetailsRouteState } from '../../../../../../common/endpoint/types'; /** * Exports Endpoint-specific package config instructions * for use in the Ingest app create / edit package config */ export const ConfigureEndpointPackageConfig = memo( - ({ from, packageConfigId }: CustomConfigurePackageConfigProps) => { + ({ + from, + packageConfigId, + packageConfig: { config_id: agentConfigId }, + }: CustomConfigurePackageConfigProps) => { let policyUrl = ''; if (from === 'edit' && packageConfigId) { + // Cannot use formalUrl here since the code is called in Ingest, which does not use redux policyUrl = getPolicyDetailPath(packageConfigId); } + const policyDetailRouteState = useMemo((): undefined | PolicyDetailsRouteState => { + if (from !== 'edit') { + return undefined; + } + const navigateTo: PolicyDetailsRouteState['onSaveNavigateTo'] & + PolicyDetailsRouteState['onCancelNavigateTo'] = [ + 'ingestManager', + { path: `#/configs/${agentConfigId}/edit-integration/${packageConfigId}` }, + ]; + return { + onSaveNavigateTo: navigateTo, + onCancelNavigateTo: navigateTo, + }; + }, [agentConfigId, from, packageConfigId]); + return ( <> @@ -63,7 +84,7 @@ export const ConfigureEndpointPackageConfig = memo { ); expect(history.location.pathname).toEqual(policyDetailsPathUrl); cancelbutton.simulate('click', { button: 0 }); - expect(history.location.pathname).toEqual(policyListPathUrl); + const navigateToAppMockedCalls = coreStart.application.navigateToApp.mock.calls; + expect(navigateToAppMockedCalls[navigateToAppMockedCalls.length - 1]).toEqual([ + 'securitySolution:management', + { path: policyListPathUrl }, + ]); }); it('should display save button', async () => { await asyncActions; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx index 6a48ae735180f..2a4f839a4af1f 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_details.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useCallback, useEffect, useState } from 'react'; +import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { EuiFlexGroup, EuiFlexItem, @@ -20,6 +20,8 @@ import { import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; import { useDispatch } from 'react-redux'; +import { useLocation } from 'react-router-dom'; +import { ApplicationStart } from 'kibana/public'; import { usePolicyDetailsSelector } from './policy_hooks'; import { policyDetails, @@ -41,11 +43,20 @@ import { SpyRoute } from '../../../../common/utils/route/spy_routes'; import { SecurityPageName } from '../../../../app/types'; import { getPoliciesPath } from '../../../common/routing'; import { useFormatUrl } from '../../../../common/components/link_to'; +import { useNavigateToAppEventHandler } from '../../../../common/hooks/endpoint/use_navigate_to_app_event_handler'; +import { MANAGEMENT_APP_ID } from '../../../common/constants'; +import { PolicyDetailsRouteState } from '../../../../../common/endpoint/types'; export const PolicyDetails = React.memo(() => { const dispatch = useDispatch<(action: AppAction) => void>(); - const { notifications } = useKibana(); + const { + notifications, + services: { + application: { navigateToApp }, + }, + } = useKibana(); const { formatUrl, search } = useFormatUrl(SecurityPageName.management); + const { state: locationRouteState } = useLocation(); // Store values const policyItem = usePolicyDetailsSelector(policyDetails); @@ -56,6 +67,7 @@ export const PolicyDetails = React.memo(() => { // Local state const [showConfirm, setShowConfirm] = useState(false); + const [routeState, setRouteState] = useState(); const policyName = policyItem?.name ?? ''; // Handle showing update statuses @@ -80,6 +92,10 @@ export const PolicyDetails = React.memo(() => { ), }); + + if (routeState && routeState.onSaveNavigateTo) { + navigateToApp(...routeState.onSaveNavigateTo); + } } else { notifications.toasts.danger({ toastLifeTimeMs: 10000, @@ -90,10 +106,15 @@ export const PolicyDetails = React.memo(() => { }); } } - }, [notifications.toasts, policyName, policyUpdateStatus]); + }, [navigateToApp, notifications.toasts, policyName, policyUpdateStatus, routeState]); const handleBackToListOnClick = useNavigateByRouterEventHandler(getPoliciesPath()); + const navigateToAppArguments = useMemo((): Parameters => { + return routeState?.onCancelNavigateTo ?? [MANAGEMENT_APP_ID, { path: getPoliciesPath() }]; + }, [routeState?.onCancelNavigateTo]); + const handleCancelOnClick = useNavigateToAppEventHandler(...navigateToAppArguments); + const handleSaveOnClick = useCallback(() => { setShowConfirm(true); }, []); @@ -109,6 +130,12 @@ export const PolicyDetails = React.memo(() => { setShowConfirm(false); }, []); + useEffect(() => { + if (!routeState && locationRouteState) { + setRouteState(locationRouteState); + } + }, [locationRouteState, routeState]); + // Before proceeding - check if we have a policy data. // If not, and we are still loading, show spinner. // Else, if we have an error, then show error on the page. @@ -159,10 +186,7 @@ export const PolicyDetails = React.memo(() => { - + { let policyInfo: PolicyTestResourceInfo; beforeEach(async () => { @@ -187,13 +186,19 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await linkToPolicy.click(); await pageObjects.policy.ensureIsOnDetailsPage(); }); - it('should allow the user to navigate, edit and save Policy Details', async () => { + it('should allow the user to navigate, edit, save Policy Details and be redirected back to ingest', async () => { await (await testSubjects.find('editLinkToPolicyDetails')).click(); await pageObjects.policy.ensureIsOnDetailsPage(); await pageObjects.endpointPageUtils.clickOnEuiCheckbox('policyWindowsEvent_dns'); await pageObjects.policy.confirmAndSave(); await testSubjects.existOrFail('policyDetailsSuccessMessage'); + await pageObjects.ingestManagerCreatePackageConfig.ensureOnEditPageOrFail(); + }); + it('should navigate back to Ingest Configuration Edit package page on click of cancel button', async () => { + await (await testSubjects.find('editLinkToPolicyDetails')).click(); + await (await pageObjects.policy.findCancelButton()).click(); + await pageObjects.ingestManagerCreatePackageConfig.ensureOnEditPageOrFail(); }); }); }); diff --git a/x-pack/test/security_solution_endpoint/page_objects/policy_page.ts b/x-pack/test/security_solution_endpoint/page_objects/policy_page.ts index b20e7c7c05e64..8ee42d4026381 100644 --- a/x-pack/test/security_solution_endpoint/page_objects/policy_page.ts +++ b/x-pack/test/security_solution_endpoint/page_objects/policy_page.ts @@ -69,6 +69,14 @@ export function EndpointPolicyPageProvider({ getService, getPageObjects }: FtrPr return await testSubjects.find('policyDetailsSaveButton'); }, + /** + * Finds and returns the Policy Details Page Cancel Button + */ + async findCancelButton() { + await this.ensureIsOnDetailsPage(); + return await testSubjects.find('policyDetailsCancelButton'); + }, + /** * ensures that the Details Page is the currently display view */ From 3f5ebdda7a0626fe19d7658edf1c105625dbdf74 Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Tue, 7 Jul 2020 15:27:00 -0600 Subject: [PATCH 03/27] [Security Solution] [Timeline] Timeline manager tweaks (#69988) --- .../alerts_table/default_config.tsx | 33 +++++++++------- .../components/alerts_table/index.test.tsx | 2 +- .../alerts/components/alerts_table/index.tsx | 16 +++++--- .../components/alerts_viewer/alerts_table.tsx | 5 ++- .../events_viewer/events_viewer.tsx | 11 +----- .../navigation/events_query_tab_body.tsx | 2 +- .../components/manage_timeline/index.tsx | 39 ++++++------------- .../body/events/event_column_view.tsx | 9 +++-- .../components/timeline/body/index.tsx | 8 ++-- .../components/timeline/timeline.tsx | 13 ++----- 10 files changed, 60 insertions(+), 78 deletions(-) diff --git a/x-pack/plugins/security_solution/public/alerts/components/alerts_table/default_config.tsx b/x-pack/plugins/security_solution/public/alerts/components/alerts_table/default_config.tsx index 6d82897aaf010..d21551287fb3e 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/alerts_table/default_config.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/alerts_table/default_config.tsx @@ -36,6 +36,7 @@ import { SetEventsLoadingProps, UpdateTimelineLoading, } from './types'; +import { Ecs } from '../../../graphql/types'; export const buildAlertStatusFilter = (status: Status): Filter[] => [ { @@ -173,11 +174,28 @@ export const requiredFieldsForActions = [ 'signal.rule.id', ]; +interface AlertActionArgs { + apolloClient?: ApolloClient<{}>; + canUserCRUD: boolean; + createTimeline: CreateTimeline; + dispatch: Dispatch; + ecsRowData: Ecs; + hasIndexWrite: boolean; + onAlertStatusUpdateFailure: (status: Status, error: Error) => void; + onAlertStatusUpdateSuccess: (count: number, status: Status) => void; + setEventsDeleted: ({ eventIds, isDeleted }: SetEventsDeletedProps) => void; + setEventsLoading: ({ eventIds, isLoading }: SetEventsLoadingProps) => void; + status: Status; + timelineId: string; + updateTimelineIsLoading: UpdateTimelineLoading; +} + export const getAlertActions = ({ apolloClient, canUserCRUD, createTimeline, dispatch, + ecsRowData, hasIndexWrite, onAlertStatusUpdateFailure, onAlertStatusUpdateSuccess, @@ -186,20 +204,7 @@ export const getAlertActions = ({ status, timelineId, updateTimelineIsLoading, -}: { - apolloClient?: ApolloClient<{}>; - canUserCRUD: boolean; - createTimeline: CreateTimeline; - dispatch: Dispatch; - hasIndexWrite: boolean; - onAlertStatusUpdateFailure: (status: Status, error: Error) => void; - onAlertStatusUpdateSuccess: (count: number, status: Status) => void; - setEventsDeleted: ({ eventIds, isDeleted }: SetEventsDeletedProps) => void; - setEventsLoading: ({ eventIds, isLoading }: SetEventsLoadingProps) => void; - status: Status; - timelineId: string; - updateTimelineIsLoading: UpdateTimelineLoading; -}): TimelineRowAction[] => { +}: AlertActionArgs): TimelineRowAction[] => { const openAlertActionComponent: TimelineRowAction = { ariaLabel: 'Open alert', content: {i18n.ACTION_OPEN_ALERT}, diff --git a/x-pack/plugins/security_solution/public/alerts/components/alerts_table/index.test.tsx b/x-pack/plugins/security_solution/public/alerts/components/alerts_table/index.test.tsx index 9ff368aff2bf6..f99a0256c0b3f 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/alerts_table/index.test.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/alerts_table/index.test.tsx @@ -7,8 +7,8 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { TestProviders } from '../../../common/mock/test_providers'; import { TimelineId } from '../../../../common/types/timeline'; +import { TestProviders } from '../../../common/mock'; import { AlertsTableComponent } from './index'; describe('AlertsTableComponent', () => { diff --git a/x-pack/plugins/security_solution/public/alerts/components/alerts_table/index.tsx b/x-pack/plugins/security_solution/public/alerts/components/alerts_table/index.tsx index 65f225c054598..b655c100a1c6f 100644 --- a/x-pack/plugins/security_solution/public/alerts/components/alerts_table/index.tsx +++ b/x-pack/plugins/security_solution/public/alerts/components/alerts_table/index.tsx @@ -48,6 +48,7 @@ import { displaySuccessToast, displayErrorToast, } from '../../../common/components/toasters'; +import { Ecs } from '../../../graphql/types'; import { getInvestigateInResolverAction } from '../../../timelines/components/timeline/body/helpers'; interface OwnProps { @@ -290,20 +291,21 @@ export const AlertsTableComponent: React.FC = ({ // Send to Timeline / Update Alert Status Actions for each table row const additionalActions = useMemo( - () => + () => (ecsRowData: Ecs) => getAlertActions({ apolloClient, canUserCRUD, + createTimeline: createTimelineCallback, + ecsRowData, dispatch, hasIndexWrite, - createTimeline: createTimelineCallback, - setEventsLoading: setEventsLoadingCallback, + onAlertStatusUpdateFailure, + onAlertStatusUpdateSuccess, setEventsDeleted: setEventsDeletedCallback, + setEventsLoading: setEventsLoadingCallback, status: filterGroup, timelineId, updateTimelineIsLoading, - onAlertStatusUpdateSuccess, - onAlertStatusUpdateFailure, }), [ apolloClient, @@ -328,17 +330,19 @@ export const AlertsTableComponent: React.FC = ({ return [...defaultFilters, ...buildAlertStatusFilter(filterGroup)]; } }, [defaultFilters, filterGroup]); + const { filterManager } = useKibana().services.data.query; const { initializeTimeline, setTimelineRowActions } = useManageTimeline(); useEffect(() => { initializeTimeline({ defaultModel: alertsDefaultModel, documentType: i18n.ALERTS_DOCUMENT_TYPE, + filterManager, footerText: i18n.TOTAL_COUNT_OF_ALERTS, id: timelineId, loadingText: i18n.LOADING_ALERTS, selectAll: canUserCRUD ? selectAll : false, - timelineRowActions: [getInvestigateInResolverAction({ dispatch, timelineId })], + timelineRowActions: () => [getInvestigateInResolverAction({ dispatch, timelineId })], title: i18n.ALERTS_TABLE_TITLE, }); // eslint-disable-next-line react-hooks/exhaustive-deps diff --git a/x-pack/plugins/security_solution/public/common/components/alerts_viewer/alerts_table.tsx b/x-pack/plugins/security_solution/public/common/components/alerts_viewer/alerts_table.tsx index 12b2853f8f7e1..bf2d8948b7292 100644 --- a/x-pack/plugins/security_solution/public/common/components/alerts_viewer/alerts_table.tsx +++ b/x-pack/plugins/security_solution/public/common/components/alerts_viewer/alerts_table.tsx @@ -14,6 +14,7 @@ import { alertsDefaultModel } from './default_headers'; import { useManageTimeline } from '../../../timelines/components/manage_timeline'; import { getInvestigateInResolverAction } from '../../../timelines/components/timeline/body/helpers'; import * as i18n from './translations'; +import { useKibana } from '../../lib/kibana'; export interface OwnProps { end: number; @@ -69,15 +70,17 @@ const AlertsTableComponent: React.FC = ({ }) => { const dispatch = useDispatch(); const alertsFilter = useMemo(() => [...defaultAlertsFilters, ...pageFilters], [pageFilters]); + const { filterManager } = useKibana().services.data.query; const { initializeTimeline } = useManageTimeline(); useEffect(() => { initializeTimeline({ id: timelineId, documentType: i18n.ALERTS_DOCUMENT_TYPE, + filterManager, defaultModel: alertsDefaultModel, footerText: i18n.TOTAL_COUNT_OF_ALERTS, - timelineRowActions: [getInvestigateInResolverAction({ dispatch, timelineId })], + timelineRowActions: () => [getInvestigateInResolverAction({ dispatch, timelineId })], title: i18n.ALERTS_TABLE_TITLE, unit: i18n.UNIT, }); diff --git a/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx b/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx index 910030d41a23e..0a1f95d51e300 100644 --- a/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx +++ b/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx @@ -93,23 +93,14 @@ const EventsViewerComponent: React.FC = ({ }) => { const columnsHeader = isEmpty(columns) ? defaultHeaders : columns; const kibana = useKibana(); - const { filterManager } = useKibana().services.data.query; const [isQueryLoading, setIsQueryLoading] = useState(false); - const { - getManageTimelineById, - setIsTimelineLoading, - setTimelineFilterManager, - } = useManageTimeline(); + const { getManageTimelineById, setIsTimelineLoading } = useManageTimeline(); useEffect(() => { setIsTimelineLoading({ id, isLoading: isQueryLoading }); // eslint-disable-next-line react-hooks/exhaustive-deps }, [isQueryLoading]); - useEffect(() => { - setTimelineFilterManager({ id, filterManager }); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [filterManager]); const { queryFields, title, unit } = useMemo(() => getManageTimelineById(id), [ getManageTimelineById, diff --git a/x-pack/plugins/security_solution/public/hosts/pages/navigation/events_query_tab_body.tsx b/x-pack/plugins/security_solution/public/hosts/pages/navigation/events_query_tab_body.tsx index 58026a28a04ce..e2ec1b0e95b58 100644 --- a/x-pack/plugins/security_solution/public/hosts/pages/navigation/events_query_tab_body.tsx +++ b/x-pack/plugins/security_solution/public/hosts/pages/navigation/events_query_tab_body.tsx @@ -65,7 +65,7 @@ export const EventsQueryTabBody = ({ initializeTimeline({ id: TimelineId.hostsPageEvents, defaultModel: eventsDefaultModel, - timelineRowActions: [ + timelineRowActions: () => [ getInvestigateInResolverAction({ dispatch, timelineId: TimelineId.hostsPageEvents }), ], }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/manage_timeline/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/manage_timeline/index.tsx index c71087de4a07e..99d79a2441ccc 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/manage_timeline/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/manage_timeline/index.tsx @@ -14,16 +14,18 @@ import { SubsetTimelineModel } from '../../store/timeline/model'; import * as i18n from '../../../common/components/events_viewer/translations'; import * as i18nF from '../timeline/footer/translations'; import { timelineDefaults as timelineDefaultModel } from '../../store/timeline/defaults'; +import { Ecs } from '../../../graphql/types'; interface ManageTimelineInit { documentType?: string; defaultModel?: SubsetTimelineModel; + filterManager?: FilterManager; footerText?: string; id: string; indexToAdd?: string[] | null; loadingText?: string; selectAll?: boolean; - timelineRowActions: TimelineRowAction[]; + timelineRowActions: (ecsData: Ecs) => TimelineRowAction[]; title?: string; unit?: (totalCount: number) => string; } @@ -39,7 +41,7 @@ interface ManageTimeline { loadingText: string; queryFields: string[]; selectAll: boolean; - timelineRowActions: TimelineRowAction[]; + timelineRowActions: (ecsData: Ecs) => TimelineRowAction[]; title: string; unit: (totalCount: number) => string; } @@ -67,12 +69,10 @@ type ActionManageTimeline = | { type: 'SET_TIMELINE_ACTIONS'; id: string; - payload: { queryFields?: string[]; timelineRowActions: TimelineRowAction[] }; - } - | { - type: 'SET_TIMELINE_FILTER_MANAGER'; - id: string; - payload: { filterManager: FilterManager }; + payload: { + queryFields?: string[]; + timelineRowActions: (ecsData: Ecs) => TimelineRowAction[]; + }; }; export const getTimelineDefaults = (id: string) => ({ @@ -85,7 +85,7 @@ export const getTimelineDefaults = (id: string) => ({ id, isLoading: false, queryFields: [], - timelineRowActions: [], + timelineRowActions: () => [], title: i18n.EVENTS, unit: (n: number) => i18n.UNIT(n), }); @@ -112,7 +112,6 @@ const reducerManageTimeline = ( }, } as ManageTimelineById; case 'SET_TIMELINE_ACTIONS': - case 'SET_TIMELINE_FILTER_MANAGER': return { ...state, [action.id]: { @@ -143,9 +142,8 @@ interface UseTimelineManager { setTimelineRowActions: (actionsArgs: { id: string; queryFields?: string[]; - timelineRowActions: TimelineRowAction[]; + timelineRowActions: (ecsData: Ecs) => TimelineRowAction[]; }) => void; - setTimelineFilterManager: (filterArgs: { id: string; filterManager: FilterManager }) => void; } const useTimelineManager = (manageTimelineForTesting?: ManageTimelineById): UseTimelineManager => { @@ -169,7 +167,7 @@ const useTimelineManager = (manageTimelineForTesting?: ManageTimelineById): UseT }: { id: string; queryFields?: string[]; - timelineRowActions: TimelineRowAction[]; + timelineRowActions: (ecsData: Ecs) => TimelineRowAction[]; }) => { dispatch({ type: 'SET_TIMELINE_ACTIONS', @@ -180,17 +178,6 @@ const useTimelineManager = (manageTimelineForTesting?: ManageTimelineById): UseT [] ); - const setTimelineFilterManager = useCallback( - ({ id, filterManager }: { id: string; filterManager: FilterManager }) => { - dispatch({ - type: 'SET_TIMELINE_FILTER_MANAGER', - id, - payload: { filterManager }, - }); - }, - [] - ); - const setIsTimelineLoading = useCallback( ({ id, isLoading }: { id: string; isLoading: boolean }) => { dispatch({ @@ -219,7 +206,7 @@ const useTimelineManager = (manageTimelineForTesting?: ManageTimelineById): UseT if (state[id] != null) { return state[id]; } - initializeTimeline({ id, timelineRowActions: [] }); + initializeTimeline({ id, timelineRowActions: () => [] }); return getTimelineDefaults(id); }, [initializeTimeline, state] @@ -234,7 +221,6 @@ const useTimelineManager = (manageTimelineForTesting?: ManageTimelineById): UseT setIndexToAdd, setIsTimelineLoading, setTimelineRowActions, - setTimelineFilterManager, }; }; @@ -246,7 +232,6 @@ const init = { initializeTimeline: () => noop, setIsTimelineLoading: () => noop, setTimelineRowActions: () => noop, - setTimelineFilterManager: () => noop, }; const ManageTimelineContext = createContext(init); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.tsx index ae00edf5d1429..88ee8346c8ab2 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.tsx @@ -89,10 +89,10 @@ export const EventColumnView = React.memo( updateNote, }) => { const { getManageTimelineById } = useManageTimeline(); - const timelineActions = useMemo(() => getManageTimelineById(timelineId).timelineRowActions, [ - getManageTimelineById, - timelineId, - ]); + const timelineActions = useMemo( + () => getManageTimelineById(timelineId).timelineRowActions(ecsData), + [ecsData, getManageTimelineById, timelineId] + ); const [isPopoverOpen, setPopover] = useState(false); const onButtonClick = useCallback(() => { @@ -105,6 +105,7 @@ export const EventColumnView = React.memo( const button = ( ( }) => { const containerElementRef = useRef(null); const { getManageTimelineById } = useManageTimeline(); - const timelineActions = useMemo(() => getManageTimelineById(id).timelineRowActions, [ - getManageTimelineById, - id, - ]); + const timelineActions = useMemo( + () => (data.length > 0 ? getManageTimelineById(id).timelineRowActions(data[0].ecs) : []), + [data, getManageTimelineById, id] + ); const additionalActionWidth = useMemo(() => { let hasContextMenu = false; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.tsx index ed7f8a447c51d..b930325c3d35d 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.tsx @@ -172,26 +172,19 @@ export const TimelineComponent: React.FC = ({ [sort.columnId, sort.sortDirection] ); const [isQueryLoading, setIsQueryLoading] = useState(false); - const { - initializeTimeline, - setIndexToAdd, - setIsTimelineLoading, - setTimelineFilterManager, - } = useManageTimeline(); + const { initializeTimeline, setIndexToAdd, setIsTimelineLoading } = useManageTimeline(); useEffect(() => { initializeTimeline({ + filterManager, id, indexToAdd, - timelineRowActions: [getInvestigateInResolverAction({ dispatch, timelineId: id })], + timelineRowActions: () => [getInvestigateInResolverAction({ dispatch, timelineId: id })], }); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { setIsTimelineLoading({ id, isLoading: isQueryLoading || loadingIndexName }); }, [loadingIndexName, id, isQueryLoading, setIsTimelineLoading]); - useEffect(() => { - setTimelineFilterManager({ id, filterManager }); - }, [filterManager, id, setTimelineFilterManager]); useEffect(() => { setIndexToAdd({ id, indexToAdd }); From 53ee7a762d4bb5790ba4c8bd9a71ceade39a9eab Mon Sep 17 00:00:00 2001 From: Spencer Date: Tue, 7 Jul 2020 14:32:04 -0700 Subject: [PATCH 04/27] [savedObjects field count] run in baseline job (#70999) Co-authored-by: spalger --- test/scripts/jenkins_xpack_visual_regression.sh | 5 ++++- vars/tasks.groovy | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/test/scripts/jenkins_xpack_visual_regression.sh b/test/scripts/jenkins_xpack_visual_regression.sh index 36bf3409a5421..930d4a74345d9 100755 --- a/test/scripts/jenkins_xpack_visual_regression.sh +++ b/test/scripts/jenkins_xpack_visual_regression.sh @@ -5,7 +5,7 @@ source "$KIBANA_DIR/src/dev/ci_setup/setup_percy.sh" echo " -> building and extracting default Kibana distributable" cd "$KIBANA_DIR" -node scripts/build --debug --no-oss +node scripts/build --debug linuxBuild="$(find "$KIBANA_DIR/target" -name 'kibana-*-linux-x86_64.tar.gz')" installDir="$PARENT_DIR/install/kibana" mkdir -p "$installDir" @@ -21,3 +21,6 @@ yarn percy exec -t 10000 -- -- \ # cd "$KIBANA_DIR" # source "test/scripts/jenkins_xpack_page_load_metrics.sh" + +cd "$XPACK_DIR" +source "$KIBANA_DIR/test/scripts/jenkins_xpack_saved_objects_field_metrics.sh" diff --git a/vars/tasks.groovy b/vars/tasks.groovy index 4e8fcaad795cd..9de4c78322d3e 100644 --- a/vars/tasks.groovy +++ b/vars/tasks.groovy @@ -76,7 +76,7 @@ def functionalXpack(Map params = [:]) { firefox: true, accessibility: true, pluginFunctional: true, - savedObjectsFieldMetrics:true, + savedObjectsFieldMetrics: true, pageLoadMetrics: false, visualRegression: false, ] From f290c686964e4f5deba31266c3bc664ed255bfd2 Mon Sep 17 00:00:00 2001 From: Liza Katz Date: Wed, 8 Jul 2020 00:34:28 +0300 Subject: [PATCH 05/27] Improve search typescript (#69333) * [search] Refactor the way search strategies are registered/retrieved on the server * Fix types and tests and update docs * Fix failing test * Fix build of example plugin * Fix functional test * Make server strategies sync * Move strategy name into options * docs * Remove FE strategies * TypeScript of hell delete search explorer * Fix search interceptor OSS tests * typos * test cleanup * Delete search example fix interceptor async tests to use fake timers * docs * fix * return search wrapper * Update search interceptor tests and abort utils * ts * jest test fix * code review * change how logs consume search API Co-authored-by: Lukas Olson Co-authored-by: Elastic Machine --- ...-data-public.getsearchparamsfromrequest.md | 22 +- ...in-plugins-data-public.iessearchrequest.md | 2 +- ...ins-data-public.iessearchrequest.params.md | 2 +- ...n-plugins-data-public.iessearchresponse.md | 4 +- ...ta-public.iessearchresponse.rawresponse.md | 2 +- ...plugins-data-public.irequesttypesmap.es.md | 11 - ...in-plugins-data-public.irequesttypesmap.md | 19 - ...c.irequesttypesmap.sync_search_strategy.md | 11 - ...lugins-data-public.iresponsetypesmap.es.md | 11 - ...n-plugins-data-public.iresponsetypesmap.md | 19 - ....iresponsetypesmap.sync_search_strategy.md | 11 - ...bana-plugin-plugins-data-public.isearch.md | 2 +- ...ugin-plugins-data-public.isearchgeneric.md | 2 +- ...gin-plugins-data-public.isearchstrategy.md | 20 - ...gins-data-public.isearchstrategy.search.md | 11 - ...-plugins-data-public.isyncsearchrequest.md | 18 - ...ublic.isyncsearchrequest.serverstrategy.md | 11 - .../kibana-plugin-plugins-data-public.md | 6 +- ...-public.searchinterceptor._constructor_.md | 5 +- ...ta-public.searchinterceptor.application.md | 11 - ...ins-data-public.searchinterceptor.deps.md} | 6 +- ...blic.searchinterceptor.getpendingcount_.md | 2 +- ...n-plugins-data-public.searchinterceptor.md | 20 +- ...a-public.searchinterceptor.pendingcount.md | 13 + ...-public.searchinterceptor.pendingcount_.md | 13 + ...data-public.searchinterceptor.runsearch.md | 23 + ...ns-data-public.searchinterceptor.search.md | 16 +- ...ta-public.searchinterceptor.setuptimers.md | 28 ++ ....searchinterceptor.timeoutsubscriptions.md | 2 +- ...ublic.searchinterceptordeps.application.md | 11 + ...-data-public.searchinterceptordeps.http.md | 11 + ...ugins-data-public.searchinterceptordeps.md | 21 + ...ata-public.searchinterceptordeps.toasts.md | 11 + ...public.searchinterceptordeps.uisettings.md | 11 + ...lugins-data-public.sync_search_strategy.md | 11 - examples/demo_search/README.md | 8 - examples/demo_search/common/index.ts | 40 -- examples/demo_search/kibana.json | 10 - .../public/async_demo_search_strategy.ts | 43 -- .../public/demo_search_strategy.ts | 65 --- examples/demo_search/public/index.ts | 26 -- examples/demo_search/public/plugin.ts | 65 --- examples/demo_search/public/types.ts | 28 -- .../server/async_demo_search_strategy.ts | 62 --- .../server/demo_search_strategy.ts | 34 -- examples/demo_search/server/index.ts | 22 - examples/demo_search/server/plugin.ts | 71 --- examples/demo_search/tsconfig.json | 16 - examples/search_explorer/README.md | 8 - examples/search_explorer/kibana.json | 9 - .../search_explorer/public/application.tsx | 133 ------ .../public/async_demo_strategy.tsx | 123 ----- .../search_explorer/public/demo_strategy.tsx | 134 ------ examples/search_explorer/public/do_search.tsx | 138 ------ .../search_explorer/public/documentation.tsx | 102 ----- .../search_explorer/public/es_strategy.tsx | 136 ------ .../search_explorer/public/guide_section.tsx | 137 ------ examples/search_explorer/public/index.ts | 22 - examples/search_explorer/public/page.tsx | 51 --- examples/search_explorer/public/plugin.tsx | 65 --- .../search_explorer/public/search_api.tsx | 56 --- examples/search_explorer/public/types.ts | 31 -- examples/search_explorer/tsconfig.json | 15 - .../data/common/search/es_search/index.ts | 7 +- .../data/common/search/es_search/types.ts | 10 +- src/plugins/data/common/search/index.ts | 7 +- .../data/common/utils/abort_utils.test.ts | 34 +- src/plugins/data/common/utils/abort_utils.ts | 32 +- src/plugins/data/public/index.ts | 6 +- src/plugins/data/public/public.api.md | 132 +++--- .../es_search/es_search_strategy.test.ts | 47 -- .../search/es_search/es_search_strategy.ts | 43 -- .../data/public/search/es_search/index.ts | 1 - .../public/search/fetch/get_search_params.ts | 4 +- src/plugins/data/public/search/i_search.ts | 59 --- src/plugins/data/public/search/index.ts | 15 +- src/plugins/data/public/search/mocks.ts | 2 - .../public/search/search_interceptor.test.ts | 193 +++++--- .../data/public/search/search_interceptor.ts | 139 +++--- .../data/public/search/search_service.test.ts | 16 +- .../data/public/search/search_service.ts | 58 +-- .../data/public/search/strategy_types.ts | 40 -- .../search/sync_search_strategy.test.ts | 84 ---- .../public/search/sync_search_strategy.ts | 50 --- src/plugins/data/public/search/types.ts | 56 +-- .../expressions/common/execution/execution.ts | 2 +- test/examples/config.js | 1 - test/examples/search/demo_data.ts | 36 -- test/examples/search/es_search.ts | 35 -- test/examples/search/index.ts | 49 -- x-pack/plugins/data_enhanced/common/index.ts | 7 +- .../data_enhanced/common/search/index.ts | 7 +- .../data_enhanced/common/search/types.ts | 29 +- x-pack/plugins/data_enhanced/public/index.ts | 2 - x-pack/plugins/data_enhanced/public/plugin.ts | 24 +- .../search/async_search_strategy.test.ts | 141 ------ .../public/search/async_search_strategy.ts | 83 ---- .../public/search/es_search_strategy.test.ts | 35 -- .../public/search/es_search_strategy.ts | 44 -- .../data_enhanced/public/search/index.ts | 4 +- .../public/search/search_interceptor.test.ts | 419 ++++++++++++++++-- .../public/search/search_interceptor.ts | 74 +++- .../data_enhanced/public/search/types.ts | 24 +- .../server/search/es_search_strategy.ts | 7 +- 104 files changed, 1053 insertions(+), 3054 deletions(-) delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.irequesttypesmap.es.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.irequesttypesmap.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.irequesttypesmap.sync_search_strategy.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iresponsetypesmap.es.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iresponsetypesmap.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iresponsetypesmap.sync_search_strategy.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchstrategy.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchstrategy.search.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isyncsearchrequest.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isyncsearchrequest.serverstrategy.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.application.md rename docs/development/plugins/data/public/{kibana-plugin-plugins-data-public.searchinterceptor.toasts.md => kibana-plugin-plugins-data-public.searchinterceptor.deps.md} (53%) create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.pendingcount.md create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.pendingcount_.md create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.runsearch.md create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.setuptimers.md create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.application.md create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.http.md create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.md create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.toasts.md create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.uisettings.md delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.sync_search_strategy.md delete mode 100644 examples/demo_search/README.md delete mode 100644 examples/demo_search/common/index.ts delete mode 100644 examples/demo_search/kibana.json delete mode 100644 examples/demo_search/public/async_demo_search_strategy.ts delete mode 100644 examples/demo_search/public/demo_search_strategy.ts delete mode 100644 examples/demo_search/public/index.ts delete mode 100644 examples/demo_search/public/plugin.ts delete mode 100644 examples/demo_search/public/types.ts delete mode 100644 examples/demo_search/server/async_demo_search_strategy.ts delete mode 100644 examples/demo_search/server/demo_search_strategy.ts delete mode 100644 examples/demo_search/server/index.ts delete mode 100644 examples/demo_search/server/plugin.ts delete mode 100644 examples/demo_search/tsconfig.json delete mode 100644 examples/search_explorer/README.md delete mode 100644 examples/search_explorer/kibana.json delete mode 100644 examples/search_explorer/public/application.tsx delete mode 100644 examples/search_explorer/public/async_demo_strategy.tsx delete mode 100644 examples/search_explorer/public/demo_strategy.tsx delete mode 100644 examples/search_explorer/public/do_search.tsx delete mode 100644 examples/search_explorer/public/documentation.tsx delete mode 100644 examples/search_explorer/public/es_strategy.tsx delete mode 100644 examples/search_explorer/public/guide_section.tsx delete mode 100644 examples/search_explorer/public/index.ts delete mode 100644 examples/search_explorer/public/page.tsx delete mode 100644 examples/search_explorer/public/plugin.tsx delete mode 100644 examples/search_explorer/public/search_api.tsx delete mode 100644 examples/search_explorer/public/types.ts delete mode 100644 examples/search_explorer/tsconfig.json delete mode 100644 src/plugins/data/public/search/es_search/es_search_strategy.test.ts delete mode 100644 src/plugins/data/public/search/es_search/es_search_strategy.ts delete mode 100644 src/plugins/data/public/search/i_search.ts delete mode 100644 src/plugins/data/public/search/strategy_types.ts delete mode 100644 src/plugins/data/public/search/sync_search_strategy.test.ts delete mode 100644 src/plugins/data/public/search/sync_search_strategy.ts delete mode 100644 test/examples/search/demo_data.ts delete mode 100644 test/examples/search/es_search.ts delete mode 100644 test/examples/search/index.ts delete mode 100644 x-pack/plugins/data_enhanced/public/search/async_search_strategy.test.ts delete mode 100644 x-pack/plugins/data_enhanced/public/search/async_search_strategy.ts delete mode 100644 x-pack/plugins/data_enhanced/public/search/es_search_strategy.test.ts delete mode 100644 x-pack/plugins/data_enhanced/public/search/es_search_strategy.ts diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getsearchparamsfromrequest.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getsearchparamsfromrequest.md index 1923f0e2e4ea1..5bd1694cbeea3 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getsearchparamsfromrequest.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.getsearchparamsfromrequest.md @@ -10,16 +10,7 @@ export declare function getSearchParamsFromRequest(searchRequest: SearchRequest, dependencies: { injectedMetadata: CoreStart['injectedMetadata']; uiSettings: IUiSettingsClient; -}): { - rest_total_hits_as_int: boolean; - ignore_unavailable: boolean; - ignore_throttled: boolean; - max_concurrent_shard_requests: any; - preference: any; - timeout: string | undefined; - index: any; - body: any; -}; +}): ISearchRequestParams; ``` ## Parameters @@ -31,14 +22,5 @@ export declare function getSearchParamsFromRequest(searchRequest: SearchRequest, Returns: -`{ - rest_total_hits_as_int: boolean; - ignore_unavailable: boolean; - ignore_throttled: boolean; - max_concurrent_shard_requests: any; - preference: any; - timeout: string | undefined; - index: any; - body: any; -}` +`ISearchRequestParams` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchrequest.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchrequest.md index ed24ca613cdf6..fee34378339af 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchrequest.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchrequest.md @@ -15,5 +15,5 @@ export interface IEsSearchRequest extends IKibanaSearchRequest | Property | Type | Description | | --- | --- | --- | | [indexType](./kibana-plugin-plugins-data-public.iessearchrequest.indextype.md) | string | | -| [params](./kibana-plugin-plugins-data-public.iessearchrequest.params.md) | SearchParams | | +| [params](./kibana-plugin-plugins-data-public.iessearchrequest.params.md) | ISearchRequestParams | | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchrequest.params.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchrequest.params.md index 2ca8c83d3f1ef..24107faa28e8c 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchrequest.params.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchrequest.params.md @@ -7,5 +7,5 @@ Signature: ```typescript -params: SearchParams; +params?: ISearchRequestParams; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.md index a5027ef292ef8..ea7e2aef00d6e 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.md @@ -7,12 +7,12 @@ Signature: ```typescript -export interface IEsSearchResponse extends IKibanaSearchResponse +export interface IEsSearchResponse extends IKibanaSearchResponse ``` ## Properties | Property | Type | Description | | --- | --- | --- | -| [rawResponse](./kibana-plugin-plugins-data-public.iessearchresponse.rawresponse.md) | SearchResponse<Hits> | | +| [rawResponse](./kibana-plugin-plugins-data-public.iessearchresponse.rawresponse.md) | SearchResponse<any> | | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.rawresponse.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.rawresponse.md index 8f6563a1cea84..d7912f377ca9f 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.rawresponse.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iessearchresponse.rawresponse.md @@ -7,5 +7,5 @@ Signature: ```typescript -rawResponse: SearchResponse; +rawResponse: SearchResponse; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.irequesttypesmap.es.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.irequesttypesmap.es.md deleted file mode 100644 index 0b31968f06425..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.irequesttypesmap.es.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [IRequestTypesMap](./kibana-plugin-plugins-data-public.irequesttypesmap.md) > [es](./kibana-plugin-plugins-data-public.irequesttypesmap.es.md) - -## IRequestTypesMap.es property - -Signature: - -```typescript -[ES_SEARCH_STRATEGY]: IEsSearchRequest; -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.irequesttypesmap.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.irequesttypesmap.md deleted file mode 100644 index 4ca5e9eab665a..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.irequesttypesmap.md +++ /dev/null @@ -1,19 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [IRequestTypesMap](./kibana-plugin-plugins-data-public.irequesttypesmap.md) - -## IRequestTypesMap interface - -Signature: - -```typescript -export interface IRequestTypesMap -``` - -## Properties - -| Property | Type | Description | -| --- | --- | --- | -| [es](./kibana-plugin-plugins-data-public.irequesttypesmap.es.md) | IEsSearchRequest | | -| [SYNC\_SEARCH\_STRATEGY](./kibana-plugin-plugins-data-public.irequesttypesmap.sync_search_strategy.md) | ISyncSearchRequest | | - diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.irequesttypesmap.sync_search_strategy.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.irequesttypesmap.sync_search_strategy.md deleted file mode 100644 index 28b87111a75ad..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.irequesttypesmap.sync_search_strategy.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [IRequestTypesMap](./kibana-plugin-plugins-data-public.irequesttypesmap.md) > [SYNC\_SEARCH\_STRATEGY](./kibana-plugin-plugins-data-public.irequesttypesmap.sync_search_strategy.md) - -## IRequestTypesMap.SYNC\_SEARCH\_STRATEGY property - -Signature: - -```typescript -[SYNC_SEARCH_STRATEGY]: ISyncSearchRequest; -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iresponsetypesmap.es.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iresponsetypesmap.es.md deleted file mode 100644 index 8056d0b16a66e..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iresponsetypesmap.es.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [IResponseTypesMap](./kibana-plugin-plugins-data-public.iresponsetypesmap.md) > [es](./kibana-plugin-plugins-data-public.iresponsetypesmap.es.md) - -## IResponseTypesMap.es property - -Signature: - -```typescript -[ES_SEARCH_STRATEGY]: IEsSearchResponse; -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iresponsetypesmap.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iresponsetypesmap.md deleted file mode 100644 index b6ec3aa38c96a..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iresponsetypesmap.md +++ /dev/null @@ -1,19 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [IResponseTypesMap](./kibana-plugin-plugins-data-public.iresponsetypesmap.md) - -## IResponseTypesMap interface - -Signature: - -```typescript -export interface IResponseTypesMap -``` - -## Properties - -| Property | Type | Description | -| --- | --- | --- | -| [es](./kibana-plugin-plugins-data-public.iresponsetypesmap.es.md) | IEsSearchResponse | | -| [SYNC\_SEARCH\_STRATEGY](./kibana-plugin-plugins-data-public.iresponsetypesmap.sync_search_strategy.md) | IKibanaSearchResponse | | - diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iresponsetypesmap.sync_search_strategy.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iresponsetypesmap.sync_search_strategy.md deleted file mode 100644 index c9fad4ced534c..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.iresponsetypesmap.sync_search_strategy.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [IResponseTypesMap](./kibana-plugin-plugins-data-public.iresponsetypesmap.md) > [SYNC\_SEARCH\_STRATEGY](./kibana-plugin-plugins-data-public.iresponsetypesmap.sync_search_strategy.md) - -## IResponseTypesMap.SYNC\_SEARCH\_STRATEGY property - -Signature: - -```typescript -[SYNC_SEARCH_STRATEGY]: IKibanaSearchResponse; -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearch.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearch.md index 1a58b41052caf..79f667a70571a 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearch.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearch.md @@ -7,5 +7,5 @@ Signature: ```typescript -export declare type ISearch = (request: IRequestTypesMap[T], options?: ISearchOptions) => Observable; +export declare type ISearch = (request: IKibanaSearchRequest, options?: ISearchOptions) => Observable; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchgeneric.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchgeneric.md index e118dac31c296..cdf19cd15a298 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchgeneric.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchgeneric.md @@ -7,5 +7,5 @@ Signature: ```typescript -export declare type ISearchGeneric = (request: IRequestTypesMap[T], options?: ISearchOptions, strategy?: T) => Observable; +export declare type ISearchGeneric = (request: IEsSearchRequest, options?: IStrategyOptions) => Observable; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchstrategy.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchstrategy.md deleted file mode 100644 index 9e74bc0e60a73..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchstrategy.md +++ /dev/null @@ -1,20 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [ISearchStrategy](./kibana-plugin-plugins-data-public.isearchstrategy.md) - -## ISearchStrategy interface - -Search strategy interface contains a search method that takes in a request and returns a promise that resolves to a response. - -Signature: - -```typescript -export interface ISearchStrategy -``` - -## Properties - -| Property | Type | Description | -| --- | --- | --- | -| [search](./kibana-plugin-plugins-data-public.isearchstrategy.search.md) | ISearch<T> | | - diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchstrategy.search.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchstrategy.search.md deleted file mode 100644 index e2e4264b7c6e0..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isearchstrategy.search.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [ISearchStrategy](./kibana-plugin-plugins-data-public.isearchstrategy.md) > [search](./kibana-plugin-plugins-data-public.isearchstrategy.search.md) - -## ISearchStrategy.search property - -Signature: - -```typescript -search: ISearch; -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isyncsearchrequest.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isyncsearchrequest.md deleted file mode 100644 index 29befdbf295dc..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isyncsearchrequest.md +++ /dev/null @@ -1,18 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [ISyncSearchRequest](./kibana-plugin-plugins-data-public.isyncsearchrequest.md) - -## ISyncSearchRequest interface - -Signature: - -```typescript -export interface ISyncSearchRequest extends IKibanaSearchRequest -``` - -## Properties - -| Property | Type | Description | -| --- | --- | --- | -| [serverStrategy](./kibana-plugin-plugins-data-public.isyncsearchrequest.serverstrategy.md) | string | | - diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isyncsearchrequest.serverstrategy.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isyncsearchrequest.serverstrategy.md deleted file mode 100644 index f30f274a3b9b6..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.isyncsearchrequest.serverstrategy.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [ISyncSearchRequest](./kibana-plugin-plugins-data-public.isyncsearchrequest.md) > [serverStrategy](./kibana-plugin-plugins-data-public.isyncsearchrequest.serverstrategy.md) - -## ISyncSearchRequest.serverStrategy property - -Signature: - -```typescript -serverStrategy: string; -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md index feeb686a1f5ed..8bd38f9e02d11 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.md @@ -67,11 +67,7 @@ | [IKibanaSearchResponse](./kibana-plugin-plugins-data-public.ikibanasearchresponse.md) | | | [IndexPatternAttributes](./kibana-plugin-plugins-data-public.indexpatternattributes.md) | Use data plugin interface instead | | [IndexPatternTypeMeta](./kibana-plugin-plugins-data-public.indexpatterntypemeta.md) | | -| [IRequestTypesMap](./kibana-plugin-plugins-data-public.irequesttypesmap.md) | | -| [IResponseTypesMap](./kibana-plugin-plugins-data-public.iresponsetypesmap.md) | | | [ISearchOptions](./kibana-plugin-plugins-data-public.isearchoptions.md) | | -| [ISearchStrategy](./kibana-plugin-plugins-data-public.isearchstrategy.md) | Search strategy interface contains a search method that takes in a request and returns a promise that resolves to a response. | -| [ISyncSearchRequest](./kibana-plugin-plugins-data-public.isyncsearchrequest.md) | | | [KueryNode](./kibana-plugin-plugins-data-public.kuerynode.md) | | | [OptionedValueProp](./kibana-plugin-plugins-data-public.optionedvalueprop.md) | | | [Query](./kibana-plugin-plugins-data-public.query.md) | | @@ -83,6 +79,7 @@ | [RefreshInterval](./kibana-plugin-plugins-data-public.refreshinterval.md) | | | [SavedQuery](./kibana-plugin-plugins-data-public.savedquery.md) | | | [SavedQueryService](./kibana-plugin-plugins-data-public.savedqueryservice.md) | | +| [SearchInterceptorDeps](./kibana-plugin-plugins-data-public.searchinterceptordeps.md) | | | [SearchSourceFields](./kibana-plugin-plugins-data-public.searchsourcefields.md) | | | [TabbedAggColumn](./kibana-plugin-plugins-data-public.tabbedaggcolumn.md) | \* | | [TabbedTable](./kibana-plugin-plugins-data-public.tabbedtable.md) | \* | @@ -118,7 +115,6 @@ | [QueryStringInput](./kibana-plugin-plugins-data-public.querystringinput.md) | | | [search](./kibana-plugin-plugins-data-public.search.md) | | | [SearchBar](./kibana-plugin-plugins-data-public.searchbar.md) | | -| [SYNC\_SEARCH\_STRATEGY](./kibana-plugin-plugins-data-public.sync_search_strategy.md) | | | [syncQueryStateWithUrl](./kibana-plugin-plugins-data-public.syncquerystatewithurl.md) | Helper to setup syncing of global data with the URL | | [UI\_SETTINGS](./kibana-plugin-plugins-data-public.ui_settings.md) | | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor._constructor_.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor._constructor_.md index 6eabefb9eb912..6f5dd1076fb40 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor._constructor_.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor._constructor_.md @@ -9,14 +9,13 @@ This class should be instantiated with a `requestTimeout` corresponding with how Signature: ```typescript -constructor(toasts: ToastsStart, application: ApplicationStart, requestTimeout?: number | undefined); +constructor(deps: SearchInterceptorDeps, requestTimeout?: number | undefined); ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| toasts | ToastsStart | | -| application | ApplicationStart | | +| deps | SearchInterceptorDeps | | | requestTimeout | number | undefined | | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.application.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.application.md deleted file mode 100644 index e44910161aa60..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.application.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchInterceptor](./kibana-plugin-plugins-data-public.searchinterceptor.md) > [application](./kibana-plugin-plugins-data-public.searchinterceptor.application.md) - -## SearchInterceptor.application property - -Signature: - -```typescript -protected readonly application: ApplicationStart; -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.toasts.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.deps.md similarity index 53% rename from docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.toasts.md rename to docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.deps.md index 4953d17c89c39..b517fb036798a 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.toasts.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.deps.md @@ -1,11 +1,11 @@ -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchInterceptor](./kibana-plugin-plugins-data-public.searchinterceptor.md) > [toasts](./kibana-plugin-plugins-data-public.searchinterceptor.toasts.md) +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchInterceptor](./kibana-plugin-plugins-data-public.searchinterceptor.md) > [deps](./kibana-plugin-plugins-data-public.searchinterceptor.deps.md) -## SearchInterceptor.toasts property +## SearchInterceptor.deps property Signature: ```typescript -protected readonly toasts: ToastsStart; +protected readonly deps: SearchInterceptorDeps; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.getpendingcount_.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.getpendingcount_.md index 59b107c92424f..db2c5d6957ad7 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.getpendingcount_.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.getpendingcount_.md @@ -9,5 +9,5 @@ Returns an `Observable` over the current number of pending searches. This could Signature: ```typescript -getPendingCount$: () => import("rxjs").Observable; +getPendingCount$: () => Observable; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.md index 0c7b123be72af..4d2fac0287035 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.md @@ -14,20 +14,28 @@ export declare class SearchInterceptor | Constructor | Modifiers | Description | | --- | --- | --- | -| [(constructor)(toasts, application, requestTimeout)](./kibana-plugin-plugins-data-public.searchinterceptor._constructor_.md) | | This class should be instantiated with a requestTimeout corresponding with how many ms after requests are initiated that they should automatically cancel. | +| [(constructor)(deps, requestTimeout)](./kibana-plugin-plugins-data-public.searchinterceptor._constructor_.md) | | This class should be instantiated with a requestTimeout corresponding with how many ms after requests are initiated that they should automatically cancel. | ## Properties | Property | Modifiers | Type | Description | | --- | --- | --- | --- | | [abortController](./kibana-plugin-plugins-data-public.searchinterceptor.abortcontroller.md) | | AbortController | abortController used to signal all searches to abort. | -| [application](./kibana-plugin-plugins-data-public.searchinterceptor.application.md) | | ApplicationStart | | -| [getPendingCount$](./kibana-plugin-plugins-data-public.searchinterceptor.getpendingcount_.md) | | () => import("rxjs").Observable<number> | Returns an Observable over the current number of pending searches. This could mean that one of the search requests is still in flight, or that it has only received partial responses. | +| [deps](./kibana-plugin-plugins-data-public.searchinterceptor.deps.md) | | SearchInterceptorDeps | | +| [getPendingCount$](./kibana-plugin-plugins-data-public.searchinterceptor.getpendingcount_.md) | | () => Observable<number> | Returns an Observable over the current number of pending searches. This could mean that one of the search requests is still in flight, or that it has only received partial responses. | | [hideToast](./kibana-plugin-plugins-data-public.searchinterceptor.hidetoast.md) | | () => void | | | [longRunningToast](./kibana-plugin-plugins-data-public.searchinterceptor.longrunningtoast.md) | | Toast | The current long-running toast (if there is one). | +| [pendingCount](./kibana-plugin-plugins-data-public.searchinterceptor.pendingcount.md) | | number | The number of pending search requests. | +| [pendingCount$](./kibana-plugin-plugins-data-public.searchinterceptor.pendingcount_.md) | | BehaviorSubject<number> | Observable that emits when the number of pending requests changes. | | [requestTimeout](./kibana-plugin-plugins-data-public.searchinterceptor.requesttimeout.md) | | number | undefined | | -| [search](./kibana-plugin-plugins-data-public.searchinterceptor.search.md) | | (search: ISearchGeneric, request: IKibanaSearchRequest, options?: ISearchOptions | undefined) => import("rxjs").Observable<import("../../common/search").IEsSearchResponse<unknown>> | Searches using the given search method. Overrides the AbortSignal with one that will abort either when cancelPending is called, when the request times out, or when the original AbortSignal is aborted. Updates the pendingCount when the request is started/finalized. | | [showToast](./kibana-plugin-plugins-data-public.searchinterceptor.showtoast.md) | | () => void | | -| [timeoutSubscriptions](./kibana-plugin-plugins-data-public.searchinterceptor.timeoutsubscriptions.md) | | Set<Subscription> | The subscriptions from scheduling the automatic timeout for each request. | -| [toasts](./kibana-plugin-plugins-data-public.searchinterceptor.toasts.md) | | ToastsStart | | +| [timeoutSubscriptions](./kibana-plugin-plugins-data-public.searchinterceptor.timeoutsubscriptions.md) | | Subscription | The subscriptions from scheduling the automatic timeout for each request. | + +## Methods + +| Method | Modifiers | Description | +| --- | --- | --- | +| [runSearch(request, combinedSignal)](./kibana-plugin-plugins-data-public.searchinterceptor.runsearch.md) | | | +| [search(request, options)](./kibana-plugin-plugins-data-public.searchinterceptor.search.md) | | Searches using the given search method. Overrides the AbortSignal with one that will abort either when cancelPending is called, when the request times out, or when the original AbortSignal is aborted. Updates the pendingCount when the request is started/finalized. | +| [setupTimers(options)](./kibana-plugin-plugins-data-public.searchinterceptor.setuptimers.md) | | | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.pendingcount.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.pendingcount.md new file mode 100644 index 0000000000000..7dd2bd3e6703f --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.pendingcount.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchInterceptor](./kibana-plugin-plugins-data-public.searchinterceptor.md) > [pendingCount](./kibana-plugin-plugins-data-public.searchinterceptor.pendingcount.md) + +## SearchInterceptor.pendingCount property + +The number of pending search requests. + +Signature: + +```typescript +protected pendingCount: number; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.pendingcount_.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.pendingcount_.md new file mode 100644 index 0000000000000..dad0fca0bfe08 --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.pendingcount_.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchInterceptor](./kibana-plugin-plugins-data-public.searchinterceptor.md) > [pendingCount$](./kibana-plugin-plugins-data-public.searchinterceptor.pendingcount_.md) + +## SearchInterceptor.pendingCount$ property + +Observable that emits when the number of pending requests changes. + +Signature: + +```typescript +protected pendingCount$: BehaviorSubject; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.runsearch.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.runsearch.md new file mode 100644 index 0000000000000..385d4f6a238d4 --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.runsearch.md @@ -0,0 +1,23 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchInterceptor](./kibana-plugin-plugins-data-public.searchinterceptor.md) > [runSearch](./kibana-plugin-plugins-data-public.searchinterceptor.runsearch.md) + +## SearchInterceptor.runSearch() method + +Signature: + +```typescript +protected runSearch(request: IEsSearchRequest, combinedSignal: AbortSignal): Observable; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| request | IEsSearchRequest | | +| combinedSignal | AbortSignal | | + +Returns: + +`Observable` + diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.search.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.search.md index 80c98ab84fb40..38ddda7b4e184 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.search.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.search.md @@ -2,12 +2,24 @@ [Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchInterceptor](./kibana-plugin-plugins-data-public.searchinterceptor.md) > [search](./kibana-plugin-plugins-data-public.searchinterceptor.search.md) -## SearchInterceptor.search property +## SearchInterceptor.search() method Searches using the given `search` method. Overrides the `AbortSignal` with one that will abort either when `cancelPending` is called, when the request times out, or when the original `AbortSignal` is aborted. Updates the `pendingCount` when the request is started/finalized. Signature: ```typescript -search: (search: ISearchGeneric, request: IKibanaSearchRequest, options?: ISearchOptions | undefined) => import("rxjs").Observable>; +search(request: IEsSearchRequest, options?: ISearchOptions): Observable; ``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| request | IEsSearchRequest | | +| options | ISearchOptions | | + +Returns: + +`Observable` + diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.setuptimers.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.setuptimers.md new file mode 100644 index 0000000000000..fe35655258b4c --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.setuptimers.md @@ -0,0 +1,28 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchInterceptor](./kibana-plugin-plugins-data-public.searchinterceptor.md) > [setupTimers](./kibana-plugin-plugins-data-public.searchinterceptor.setuptimers.md) + +## SearchInterceptor.setupTimers() method + +Signature: + +```typescript +protected setupTimers(options?: ISearchOptions): { + combinedSignal: AbortSignal; + cleanup: () => void; + }; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| options | ISearchOptions | | + +Returns: + +`{ + combinedSignal: AbortSignal; + cleanup: () => void; + }` + diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.timeoutsubscriptions.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.timeoutsubscriptions.md index 072f67591f097..12f200e037784 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.timeoutsubscriptions.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptor.timeoutsubscriptions.md @@ -9,5 +9,5 @@ The subscriptions from scheduling the automatic timeout for each request. Signature: ```typescript -protected timeoutSubscriptions: Set; +protected timeoutSubscriptions: Subscription; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.application.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.application.md new file mode 100644 index 0000000000000..a8cd1b170a595 --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.application.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchInterceptorDeps](./kibana-plugin-plugins-data-public.searchinterceptordeps.md) > [application](./kibana-plugin-plugins-data-public.searchinterceptordeps.application.md) + +## SearchInterceptorDeps.application property + +Signature: + +```typescript +application: ApplicationStart; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.http.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.http.md new file mode 100644 index 0000000000000..1146179c13d63 --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.http.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchInterceptorDeps](./kibana-plugin-plugins-data-public.searchinterceptordeps.md) > [http](./kibana-plugin-plugins-data-public.searchinterceptordeps.http.md) + +## SearchInterceptorDeps.http property + +Signature: + +```typescript +http: CoreStart['http']; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.md new file mode 100644 index 0000000000000..abd57f3a9568b --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.md @@ -0,0 +1,21 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchInterceptorDeps](./kibana-plugin-plugins-data-public.searchinterceptordeps.md) + +## SearchInterceptorDeps interface + +Signature: + +```typescript +export interface SearchInterceptorDeps +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [application](./kibana-plugin-plugins-data-public.searchinterceptordeps.application.md) | ApplicationStart | | +| [http](./kibana-plugin-plugins-data-public.searchinterceptordeps.http.md) | CoreStart['http'] | | +| [toasts](./kibana-plugin-plugins-data-public.searchinterceptordeps.toasts.md) | ToastsStart | | +| [uiSettings](./kibana-plugin-plugins-data-public.searchinterceptordeps.uisettings.md) | CoreStart['uiSettings'] | | + diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.toasts.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.toasts.md new file mode 100644 index 0000000000000..0023b34af10c3 --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.toasts.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchInterceptorDeps](./kibana-plugin-plugins-data-public.searchinterceptordeps.md) > [toasts](./kibana-plugin-plugins-data-public.searchinterceptordeps.toasts.md) + +## SearchInterceptorDeps.toasts property + +Signature: + +```typescript +toasts: ToastsStart; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.uisettings.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.uisettings.md new file mode 100644 index 0000000000000..425e177ec9300 --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.searchinterceptordeps.uisettings.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SearchInterceptorDeps](./kibana-plugin-plugins-data-public.searchinterceptordeps.md) > [uiSettings](./kibana-plugin-plugins-data-public.searchinterceptordeps.uisettings.md) + +## SearchInterceptorDeps.uiSettings property + +Signature: + +```typescript +uiSettings: CoreStart['uiSettings']; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.sync_search_strategy.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.sync_search_strategy.md deleted file mode 100644 index 3681fe6d6274c..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.sync_search_strategy.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [SYNC\_SEARCH\_STRATEGY](./kibana-plugin-plugins-data-public.sync_search_strategy.md) - -## SYNC\_SEARCH\_STRATEGY variable - -Signature: - -```typescript -SYNC_SEARCH_STRATEGY = "SYNC_SEARCH_STRATEGY" -``` diff --git a/examples/demo_search/README.md b/examples/demo_search/README.md deleted file mode 100644 index f0b461e3287b4..0000000000000 --- a/examples/demo_search/README.md +++ /dev/null @@ -1,8 +0,0 @@ -## Demo search strategy - -This example registers a custom search strategy that simply takes a name string in the request and returns the -string `Hello {name}` - -To see the demo search strategy in action, navigate to the `Search explorer` app. - -To run these examples, use the command `yarn start --run-examples`. \ No newline at end of file diff --git a/examples/demo_search/common/index.ts b/examples/demo_search/common/index.ts deleted file mode 100644 index 8ea8d6186ee82..0000000000000 --- a/examples/demo_search/common/index.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { IKibanaSearchRequest, IKibanaSearchResponse } from '../../../src/plugins/data/public'; - -export const DEMO_SEARCH_STRATEGY = 'DEMO_SEARCH_STRATEGY'; -export const ASYNC_DEMO_SEARCH_STRATEGY = 'ASYNC_DEMO_SEARCH_STRATEGY'; - -export interface IDemoRequest extends IKibanaSearchRequest { - mood: string | 'sad' | 'happy'; - name: string; -} - -export interface IDemoResponse extends IKibanaSearchResponse { - greeting: string; -} - -export interface IAsyncDemoRequest extends IKibanaSearchRequest { - fibonacciNumbers: number; -} - -export interface IAsyncDemoResponse extends IKibanaSearchResponse { - fibonacciSequence: number[]; -} diff --git a/examples/demo_search/kibana.json b/examples/demo_search/kibana.json deleted file mode 100644 index f909ca47fcd55..0000000000000 --- a/examples/demo_search/kibana.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "id": "demoSearch", - "version": "0.0.1", - "kibanaVersion": "kibana", - "server": true, - "ui": true, - "requiredPlugins": ["data"], - "optionalPlugins": [], - "extraPublicDirs": ["common"] -} diff --git a/examples/demo_search/public/async_demo_search_strategy.ts b/examples/demo_search/public/async_demo_search_strategy.ts deleted file mode 100644 index 862324002840c..0000000000000 --- a/examples/demo_search/public/async_demo_search_strategy.ts +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { Observable, from } from 'rxjs'; -import { CoreSetup } from 'kibana/public'; -import { flatMap } from 'rxjs/operators'; -import { ISearch } from '../../../src/plugins/data/public'; -import { ASYNC_SEARCH_STRATEGY } from '../../../x-pack/plugins/data_enhanced/public'; -import { ASYNC_DEMO_SEARCH_STRATEGY, IAsyncDemoResponse } from '../common'; -import { DemoDataSearchStartDependencies } from './types'; - -export function asyncDemoClientSearchStrategyProvider(core: CoreSetup) { - const search: ISearch = (request, options) => { - return from(core.getStartServices()).pipe( - flatMap((startServices) => { - const asyncStrategy = (startServices[1] as DemoDataSearchStartDependencies).data.search.getSearchStrategy( - ASYNC_SEARCH_STRATEGY - ); - return asyncStrategy.search( - { ...request, serverStrategy: ASYNC_DEMO_SEARCH_STRATEGY }, - options - ) as Observable; - }) - ); - }; - return { search }; -} diff --git a/examples/demo_search/public/demo_search_strategy.ts b/examples/demo_search/public/demo_search_strategy.ts deleted file mode 100644 index d56d827a5c0f8..0000000000000 --- a/examples/demo_search/public/demo_search_strategy.ts +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { Observable, from } from 'rxjs'; -import { flatMap } from 'rxjs/operators'; -import { CoreSetup } from 'kibana/public'; -import { ISearch, SYNC_SEARCH_STRATEGY } from '../../../src/plugins/data/public'; -import { DEMO_SEARCH_STRATEGY, IDemoResponse } from '../common'; -import { DemoDataSearchStartDependencies } from './types'; - -/** - * This demo search strategy provider simply provides a shortcut for calling the DEMO_SEARCH_STRATEGY - * on the server side, without users having to pass it in explicitly, and it takes advantage of the - * already registered SYNC_SEARCH_STRATEGY that exists on the client. - * - * so instead of callers having to do: - * - * ``` - * data.search.search( - * { ...request, serverStrategy: DEMO_SEARCH_STRATEGY }, - * options, - * SYNC_SEARCH_STRATEGY - * ) as Observable, - *``` - - * They can instead just do - * - * ``` - * data.search.search(request, options, DEMO_SEARCH_STRATEGY); - * ``` - * - * and are ensured type safety in regard to the request and response objects. - */ -export function demoClientSearchStrategyProvider(core: CoreSetup) { - const search: ISearch = (request, options) => { - return from(core.getStartServices()).pipe( - flatMap((startServices) => { - const syncStrategy = (startServices[1] as DemoDataSearchStartDependencies).data.search.getSearchStrategy( - SYNC_SEARCH_STRATEGY - ); - return syncStrategy.search( - { ...request, serverStrategy: DEMO_SEARCH_STRATEGY }, - options - ) as Observable; - }) - ); - }; - return { search }; -} diff --git a/examples/demo_search/public/index.ts b/examples/demo_search/public/index.ts deleted file mode 100644 index 0a97ac6b72ea7..0000000000000 --- a/examples/demo_search/public/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { PluginInitializer } from 'kibana/public'; - -import { DemoDataPlugin } from './plugin'; - -export { DEMO_SEARCH_STRATEGY } from '../common'; - -export const plugin: PluginInitializer = () => new DemoDataPlugin(); diff --git a/examples/demo_search/public/plugin.ts b/examples/demo_search/public/plugin.ts deleted file mode 100644 index 5d074c19903e2..0000000000000 --- a/examples/demo_search/public/plugin.ts +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { Plugin, CoreSetup } from '../../../src/core/public'; -import { - DEMO_SEARCH_STRATEGY, - IDemoRequest, - IDemoResponse, - ASYNC_DEMO_SEARCH_STRATEGY, - IAsyncDemoRequest, - IAsyncDemoResponse, -} from '../common'; -import { demoClientSearchStrategyProvider } from './demo_search_strategy'; -import { asyncDemoClientSearchStrategyProvider } from './async_demo_search_strategy'; -import { DemoDataSearchSetupDependencies, DemoDataSearchStartDependencies } from './types'; - -/** - * Add the typescript mappings for our search strategy to the request and - * response types. This allows typescript to require the right shapes if - * making the call: - * const response = context.search.search(request, {}, DEMO_SEARCH_STRATEGY); - * - * If the caller does not pass in the right `request` shape, typescript will - * complain. The caller will also get a typed response. - */ -declare module '../../../src/plugins/data/public' { - export interface IRequestTypesMap { - [DEMO_SEARCH_STRATEGY]: IDemoRequest; - [ASYNC_DEMO_SEARCH_STRATEGY]: IAsyncDemoRequest; - } - - export interface IResponseTypesMap { - [DEMO_SEARCH_STRATEGY]: IDemoResponse; - [ASYNC_DEMO_SEARCH_STRATEGY]: IAsyncDemoResponse; - } -} - -export class DemoDataPlugin - implements Plugin { - public setup(core: CoreSetup, { data }: DemoDataSearchSetupDependencies) { - const demoClientSearchStrategy = demoClientSearchStrategyProvider(core); - const asyncDemoClientSearchStrategy = asyncDemoClientSearchStrategyProvider(core); - data.search.registerSearchStrategy(DEMO_SEARCH_STRATEGY, demoClientSearchStrategy); - data.search.registerSearchStrategy(ASYNC_DEMO_SEARCH_STRATEGY, asyncDemoClientSearchStrategy); - } - - public start() {} - public stop() {} -} diff --git a/examples/demo_search/public/types.ts b/examples/demo_search/public/types.ts deleted file mode 100644 index 64725da7df870..0000000000000 --- a/examples/demo_search/public/types.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { DataPublicPluginStart, DataPublicPluginSetup } from '../../../src/plugins/data/public'; - -export interface DemoDataSearchSetupDependencies { - data: DataPublicPluginSetup; -} - -export interface DemoDataSearchStartDependencies { - data: DataPublicPluginStart; -} diff --git a/examples/demo_search/server/async_demo_search_strategy.ts b/examples/demo_search/server/async_demo_search_strategy.ts deleted file mode 100644 index 2eda0f4d09e11..0000000000000 --- a/examples/demo_search/server/async_demo_search_strategy.ts +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { ISearchStrategy } from '../../../src/plugins/data/server'; -import { ASYNC_DEMO_SEARCH_STRATEGY, IAsyncDemoRequest } from '../common'; - -export const asyncDemoSearchStrategyProvider = (): ISearchStrategy< - typeof ASYNC_DEMO_SEARCH_STRATEGY -> => { - function getFibonacciSequence(n = 0) { - const beginning = [0, 1].slice(0, n); - return Array(Math.max(0, n)) - .fill(null) - .reduce((sequence, value, i) => { - if (i < 2) return sequence; - return [...sequence, sequence[i - 1] + sequence[i - 2]]; - }, beginning); - } - - const generateId = (() => { - let id = 0; - return () => `${id++}`; - })(); - - const loadedMap = new Map(); - const totalMap = new Map(); - - return { - search: async (context, request: IAsyncDemoRequest) => { - const id = request.id ?? generateId(); - - const loaded = (loadedMap.get(id) ?? 0) + 1; - loadedMap.set(id, loaded); - - const total = request.fibonacciNumbers ?? totalMap.get(id); - totalMap.set(id, total); - - const fibonacciSequence = getFibonacciSequence(loaded); - return { id, total, loaded, fibonacciSequence }; - }, - cancel: async (context, id) => { - loadedMap.delete(id); - totalMap.delete(id); - }, - }; -}; diff --git a/examples/demo_search/server/demo_search_strategy.ts b/examples/demo_search/server/demo_search_strategy.ts deleted file mode 100644 index 36280ad22e83c..0000000000000 --- a/examples/demo_search/server/demo_search_strategy.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { ISearchStrategy } from '../../../src/plugins/data/server'; -import { DEMO_SEARCH_STRATEGY, IDemoRequest } from '../common'; - -export const demoSearchStrategyProvider = (): ISearchStrategy => { - return { - search: (context, request: IDemoRequest) => { - return Promise.resolve({ - greeting: - request.mood === 'happy' - ? `Lovely to meet you, ${request.name}` - : `Hope you feel better, ${request.name}`, - }); - }, - }; -}; diff --git a/examples/demo_search/server/index.ts b/examples/demo_search/server/index.ts deleted file mode 100644 index 368575b705c90..0000000000000 --- a/examples/demo_search/server/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { DemoDataPlugin } from './plugin'; - -export const plugin = () => new DemoDataPlugin(); diff --git a/examples/demo_search/server/plugin.ts b/examples/demo_search/server/plugin.ts deleted file mode 100644 index 8a72b5007f988..0000000000000 --- a/examples/demo_search/server/plugin.ts +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { Plugin, CoreSetup } from 'kibana/server'; -import { PluginSetup as DataPluginSetup } from 'src/plugins/data/server'; -import { demoSearchStrategyProvider } from './demo_search_strategy'; -import { - DEMO_SEARCH_STRATEGY, - IDemoRequest, - IDemoResponse, - ASYNC_DEMO_SEARCH_STRATEGY, - IAsyncDemoRequest, - IAsyncDemoResponse, -} from '../common'; -import { asyncDemoSearchStrategyProvider } from './async_demo_search_strategy'; - -interface IDemoSearchExplorerDeps { - data: DataPluginSetup; -} - -/** - * Add the typescript mappings for our search strategy to the request and - * response types. This allows typescript to require the right shapes if - * making the call: - * const response = context.search.search(request, DEMO_SEARCH_STRATEGY); - * - * If the caller does not pass in the right `request` shape, typescript will - * complain. The caller will also get a typed response. - */ -declare module '../../../src/plugins/data/server' { - export interface IRequestTypesMap { - [DEMO_SEARCH_STRATEGY]: IDemoRequest; - [ASYNC_DEMO_SEARCH_STRATEGY]: IAsyncDemoRequest; - } - - export interface IResponseTypesMap { - [DEMO_SEARCH_STRATEGY]: IDemoResponse; - [ASYNC_DEMO_SEARCH_STRATEGY]: IAsyncDemoResponse; - } -} - -export class DemoDataPlugin implements Plugin { - constructor() {} - - public setup(core: CoreSetup, deps: IDemoSearchExplorerDeps) { - deps.data.search.registerSearchStrategy(DEMO_SEARCH_STRATEGY, demoSearchStrategyProvider()); - deps.data.search.registerSearchStrategy( - ASYNC_DEMO_SEARCH_STRATEGY, - asyncDemoSearchStrategyProvider() - ); - } - - public start() {} - public stop() {} -} diff --git a/examples/demo_search/tsconfig.json b/examples/demo_search/tsconfig.json deleted file mode 100644 index 7fa03739119b4..0000000000000 --- a/examples/demo_search/tsconfig.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "./target", - "skipLibCheck": true - }, - "include": [ - "index.ts", - "common/**/*.ts", - "public/**/*.ts", - "public/**/*.tsx", - "server/**/*.ts", - "../../typings/**/*" - ], - "exclude": [] -} diff --git a/examples/search_explorer/README.md b/examples/search_explorer/README.md deleted file mode 100644 index 0e5a48cf22dc1..0000000000000 --- a/examples/search_explorer/README.md +++ /dev/null @@ -1,8 +0,0 @@ -## Search explorer - -This example search explorer app shows how to use different search strategies in order to retrieve data. - -One demo uses the built in elasticsearch search strategy, and runs a search against data in elasticsearch. The -other demo uses the custom demo search strategy, a custom search strategy registerd inside the [demo_search plugin](../demo_search). - -To run this example, use the command `yarn start --run-examples`. \ No newline at end of file diff --git a/examples/search_explorer/kibana.json b/examples/search_explorer/kibana.json deleted file mode 100644 index e22d4e2756d11..0000000000000 --- a/examples/search_explorer/kibana.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "id": "searchExplorer", - "version": "0.0.1", - "kibanaVersion": "kibana", - "server": false, - "ui": true, - "requiredPlugins": ["data", "demoSearch", "developerExamples"], - "optionalPlugins": [] -} diff --git a/examples/search_explorer/public/application.tsx b/examples/search_explorer/public/application.tsx deleted file mode 100644 index a7072936f268d..0000000000000 --- a/examples/search_explorer/public/application.tsx +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import React from 'react'; -import ReactDOM from 'react-dom'; -import { BrowserRouter as Router, Route, withRouter, RouteComponentProps } from 'react-router-dom'; - -import { - EuiPage, - EuiPageSideBar, - // @ts-ignore - EuiSideNav, -} from '@elastic/eui'; - -import { AppMountParameters, CoreStart } from '../../../src/core/public'; -import { EsSearchTest } from './es_strategy'; -import { Page } from './page'; -import { DemoStrategy } from './demo_strategy'; -import { AsyncDemoStrategy } from './async_demo_strategy'; -import { DocumentationPage } from './documentation'; -import { SearchApiPage } from './search_api'; -import { AppPluginStartDependencies, SearchBarComponentParams } from './types'; - -const Home = () => ; - -interface PageDef { - title: string; - id: string; - component: React.ReactNode; -} - -type NavProps = RouteComponentProps & { - navigateToApp: CoreStart['application']['navigateToApp']; - pages: PageDef[]; -}; - -const Nav = withRouter(({ history, navigateToApp, pages }: NavProps) => { - const navItems = pages.map((page) => ({ - id: page.id, - name: page.title, - onClick: () => history.push(`/${page.id}`), - 'data-test-subj': page.id, - })); - - return ( - - ); -}); - -const buildPage = (page: PageDef) => {page.component}; - -const SearchApp = ({ basename, data, application }: SearchBarComponentParams) => { - const pages: PageDef[] = [ - { - id: 'home', - title: 'Home', - component: , - }, - { - title: 'Search API', - id: 'searchAPI', - component: , - }, - { - title: 'ES search strategy', - id: 'esSearch', - component: , - }, - { - title: 'Demo search strategy', - id: 'demoSearch', - component: , - }, - { - title: 'Async demo search strategy', - id: 'asyncDemoSearch', - component: , - }, - ]; - - const routes = pages.map((page, i) => ( - buildPage(page)} /> - )); - - return ( - - - -