From 01ecbd48f3657327cb5375b54195cd07bfc4027f Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Mon, 5 Sep 2022 12:20:26 +0200 Subject: [PATCH 01/19] [Files] Limit concurrent uploads (server-side) (#139842) * updated upload logic to respect aborts... * added abort$ test * create kbn-semaphore package * remove duplicate sempahore implementation * make sure that scheduling happens async * limit concurrent upload requests * fix copy-pasta error * await the status update to avoid a race condition * remove setImmediate * move kbn-sempahore to kbn-std * remove gettersetter pattern * PR feedback about try catch block and made error message more clear * typo --- packages/kbn-std/index.ts | 1 + .../kbn-std/src/semaphore.test.ts | 7 +- .../kbn-std/src/semaphore.ts | 5 +- x-pack/plugins/files/common/types.ts | 4 +- .../adapters/es/es.test.ts | 55 +++++++++++++++ .../blob_storage_service/adapters/es/es.ts | 65 +++++++++++------ .../adapters/es/integration_tests/es.test.ts | 1 + .../blob_storage_service.ts | 10 ++- x-pack/plugins/files/server/file/errors.ts | 1 + x-pack/plugins/files/server/file/file.test.ts | 17 +++++ x-pack/plugins/files/server/file/file.ts | 70 ++++++++++++++----- .../files/server/routes/file_kind/upload.ts | 14 +++- .../server/screenshots/index.ts | 2 +- 13 files changed, 202 insertions(+), 50 deletions(-) rename x-pack/plugins/screenshotting/server/screenshots/semaphore/index.test.ts => packages/kbn-std/src/semaphore.test.ts (92%) rename x-pack/plugins/screenshotting/server/screenshots/semaphore/index.ts => packages/kbn-std/src/semaphore.ts (88%) create mode 100644 x-pack/plugins/files/server/blob_storage_service/adapters/es/es.test.ts diff --git a/packages/kbn-std/index.ts b/packages/kbn-std/index.ts index d79a4a7e7e03e..3ad478ab41786 100644 --- a/packages/kbn-std/index.ts +++ b/packages/kbn-std/index.ts @@ -27,3 +27,4 @@ export { asyncForEach, asyncForEachWithLimit, } from './src/iteration'; +export { Semaphore } from './src/semaphore'; diff --git a/x-pack/plugins/screenshotting/server/screenshots/semaphore/index.test.ts b/packages/kbn-std/src/semaphore.test.ts similarity index 92% rename from x-pack/plugins/screenshotting/server/screenshots/semaphore/index.test.ts rename to packages/kbn-std/src/semaphore.test.ts index 0cc40a83723a9..69098a908f4fd 100644 --- a/x-pack/plugins/screenshotting/server/screenshots/semaphore/index.test.ts +++ b/packages/kbn-std/src/semaphore.test.ts @@ -1,12 +1,13 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ import { TestScheduler } from 'rxjs/testing'; -import { Semaphore } from '.'; +import { Semaphore } from './semaphore'; describe('Semaphore', () => { let testScheduler: TestScheduler; diff --git a/x-pack/plugins/screenshotting/server/screenshots/semaphore/index.ts b/packages/kbn-std/src/semaphore.ts similarity index 88% rename from x-pack/plugins/screenshotting/server/screenshots/semaphore/index.ts rename to packages/kbn-std/src/semaphore.ts index cdf021da0f63e..4ee63068e5b05 100644 --- a/x-pack/plugins/screenshotting/server/screenshots/semaphore/index.ts +++ b/packages/kbn-std/src/semaphore.ts @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ import { Observable } from 'rxjs'; diff --git a/x-pack/plugins/files/common/types.ts b/x-pack/plugins/files/common/types.ts index c0761b996cd73..fd1948e6333ea 100644 --- a/x-pack/plugins/files/common/types.ts +++ b/x-pack/plugins/files/common/types.ts @@ -5,6 +5,7 @@ * 2.0. */ import type { SavedObject } from '@kbn/core/server'; +import type { Observable } from 'rxjs'; import type { Readable } from 'stream'; import type { ES_FIXED_SIZE_INDEX_BLOB_STORE } from './constants'; @@ -353,8 +354,9 @@ export interface File { * Stream file content to storage. * * @param content - The content to stream to storage. + * @param abort$ - An observable that can be used to abort the upload at any time. */ - uploadContent(content: Readable): Promise>; + uploadContent(content: Readable, abort$?: Observable): Promise>; /** * Stream file content from storage. diff --git a/x-pack/plugins/files/server/blob_storage_service/adapters/es/es.test.ts b/x-pack/plugins/files/server/blob_storage_service/adapters/es/es.test.ts new file mode 100644 index 0000000000000..9d1ddda739717 --- /dev/null +++ b/x-pack/plugins/files/server/blob_storage_service/adapters/es/es.test.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 + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { Readable } from 'stream'; +import { promisify } from 'util'; +import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; +import { loggingSystemMock } from '@kbn/core-logging-server-mocks'; +import { elasticsearchServiceMock } from '@kbn/core/server/mocks'; +import { Semaphore } from '@kbn/std'; + +import { ElasticsearchBlobStorageClient } from './es'; + +const setImmediate = promisify(global.setImmediate); + +describe('ElasticsearchBlobStorageClient', () => { + let esClient: ElasticsearchClient; + let blobStoreClient: ElasticsearchBlobStorageClient; + let semaphore: Semaphore; + + beforeEach(() => { + semaphore = new Semaphore(1); + esClient = elasticsearchServiceMock.createElasticsearchClient(); + blobStoreClient = new ElasticsearchBlobStorageClient( + esClient, + undefined, + undefined, + loggingSystemMock.createLogger(), + semaphore + ); + }); + + test('limits max concurrent uploads', async () => { + const acquireSpy = jest.spyOn(semaphore, 'acquire'); + (esClient.index as jest.Mock).mockImplementation(() => { + return new Promise((res, rej) => setTimeout(() => rej('failed'), 100)); + }); + const [p1, p2, ...rest] = [ + blobStoreClient.upload(Readable.from(['test'])).catch(() => {}), + blobStoreClient.upload(Readable.from(['test'])).catch(() => {}), + blobStoreClient.upload(Readable.from(['test'])).catch(() => {}), + blobStoreClient.upload(Readable.from(['test'])).catch(() => {}), + ]; + await setImmediate(); + expect(acquireSpy).toHaveBeenCalledTimes(4); + await p1; + expect(esClient.index).toHaveBeenCalledTimes(1); + await p2; + expect(esClient.index).toHaveBeenCalledTimes(2); + await Promise.all(rest); + expect(esClient.index).toHaveBeenCalledTimes(4); + }); +}); diff --git a/x-pack/plugins/files/server/blob_storage_service/adapters/es/es.ts b/x-pack/plugins/files/server/blob_storage_service/adapters/es/es.ts index 5074ab12bdfc7..adc707f4b141a 100644 --- a/x-pack/plugins/files/server/blob_storage_service/adapters/es/es.ts +++ b/x-pack/plugins/files/server/blob_storage_service/adapters/es/es.ts @@ -9,9 +9,11 @@ import assert from 'assert'; import { once } from 'lodash'; import { errors } from '@elastic/elasticsearch'; import type { ElasticsearchClient, Logger } from '@kbn/core/server'; +import { Semaphore } from '@kbn/std'; import { Readable, Transform } from 'stream'; import { pipeline } from 'stream/promises'; import { promisify } from 'util'; +import { lastValueFrom, defer } from 'rxjs'; import type { BlobStorageClient } from '../../types'; import type { ReadableContentStream } from './content_stream'; import { getReadableContentStream, getWritableContentStream } from './content_stream'; @@ -27,16 +29,31 @@ export const BLOB_STORAGE_SYSTEM_INDEX_NAME = '.kibana_blob_storage'; export const MAX_BLOB_STORE_SIZE_BYTES = 50 * 1024 * 1024 * 1024; // 50 GiB export class ElasticsearchBlobStorageClient implements BlobStorageClient { + private static defaultSemaphore: Semaphore; + /** + * Call this function once to globally set a concurrent upload limit for + * all {@link ElasticsearchBlobStorageClient} instances. + */ + public static configureConcurrentUpload(capacity: number) { + this.defaultSemaphore = new Semaphore(capacity); + } + constructor( private readonly esClient: ElasticsearchClient, private readonly index: string = BLOB_STORAGE_SYSTEM_INDEX_NAME, private readonly chunkSize: undefined | string, - private readonly logger: Logger + private readonly logger: Logger, + /** + * Override the default concurrent upload limit by passing in a different + * semaphore + */ + private readonly uploadSemaphore = ElasticsearchBlobStorageClient.defaultSemaphore ) { assert( this.index.startsWith('.kibana'), `Elasticsearch blob store index name must start with ".kibana", got ${this.index}.` ); + assert(this.uploadSemaphore, `No default semaphore provided and no semaphore was passed in.`); } /** @@ -81,28 +98,32 @@ export class ElasticsearchBlobStorageClient implements BlobStorageClient { ): Promise<{ id: string; size: number }> { await this.createIndexIfNotExists(); - try { - const dest = getWritableContentStream({ - id, - client: this.esClient, - index: this.index, - logger: this.logger.get('content-stream-upload'), - parameters: { - maxChunkSize: this.chunkSize, - }, - }); - await pipeline.apply(null, [src, ...(transforms ?? []), dest] as unknown as Parameters< - typeof pipeline - >); + const processUpload = async () => { + try { + const dest = getWritableContentStream({ + id, + client: this.esClient, + index: this.index, + logger: this.logger.get('content-stream-upload'), + parameters: { + maxChunkSize: this.chunkSize, + }, + }); + await pipeline.apply(null, [src, ...(transforms ?? []), dest] as unknown as Parameters< + typeof pipeline + >); - return { - id: dest.getContentReferenceId()!, - size: dest.getBytesWritten(), - }; - } catch (e) { - this.logger.error(`Could not write chunks to Elasticsearch: ${e}`); - throw e; - } + return { + id: dest.getContentReferenceId()!, + size: dest.getBytesWritten(), + }; + } catch (e) { + this.logger.error(`Could not write chunks to Elasticsearch for id ${id}: ${e}`); + throw e; + } + }; + + return lastValueFrom(defer(processUpload).pipe(this.uploadSemaphore.acquire())); } private getReadableContentStream(id: string, size?: number): ReadableContentStream { diff --git a/x-pack/plugins/files/server/blob_storage_service/adapters/es/integration_tests/es.test.ts b/x-pack/plugins/files/server/blob_storage_service/adapters/es/integration_tests/es.test.ts index b947c980164fc..8bcc8c503bb49 100644 --- a/x-pack/plugins/files/server/blob_storage_service/adapters/es/integration_tests/es.test.ts +++ b/x-pack/plugins/files/server/blob_storage_service/adapters/es/integration_tests/es.test.ts @@ -24,6 +24,7 @@ describe('Elasticsearch blob storage', () => { const sandbox = sinon.createSandbox(); beforeAll(async () => { + ElasticsearchBlobStorageClient.configureConcurrentUpload(Infinity); const { startES, startKibana } = createTestServers({ adjustTimeout: jest.setTimeout }); manageES = await startES(); manageKbn = await startKibana(); diff --git a/x-pack/plugins/files/server/blob_storage_service/blob_storage_service.ts b/x-pack/plugins/files/server/blob_storage_service/blob_storage_service.ts index 0bc1c632e2c32..ecd2c6e3d3dad 100644 --- a/x-pack/plugins/files/server/blob_storage_service/blob_storage_service.ts +++ b/x-pack/plugins/files/server/blob_storage_service/blob_storage_service.ts @@ -4,7 +4,6 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - import type { ElasticsearchClient, Logger } from '@kbn/core/server'; import { BlobStorageSettings, ES_FIXED_SIZE_INDEX_BLOB_STORE } from '../../common'; import { BlobStorageClient } from './types'; @@ -16,7 +15,14 @@ interface ElasticsearchBlobStorageSettings { } export class BlobStorageService { - constructor(private readonly esClient: ElasticsearchClient, private readonly logger: Logger) {} + /** + * The number of uploads per Kibana instance that can be running simultaneously + */ + private readonly concurrentUploadsToES = 20; + + constructor(private readonly esClient: ElasticsearchClient, private readonly logger: Logger) { + ElasticsearchBlobStorageClient.configureConcurrentUpload(this.concurrentUploadsToES); + } private createESBlobStorage({ index, diff --git a/x-pack/plugins/files/server/file/errors.ts b/x-pack/plugins/files/server/file/errors.ts index d0d0eef84c052..34ce179555ff0 100644 --- a/x-pack/plugins/files/server/file/errors.ts +++ b/x-pack/plugins/files/server/file/errors.ts @@ -18,3 +18,4 @@ export class ContentAlreadyUploadedError extends FileError {} export class NoDownloadAvailableError extends FileError {} export class UploadInProgressError extends FileError {} export class AlreadyDeletedError extends FileError {} +export class AbortedUploadError extends FileError {} diff --git a/x-pack/plugins/files/server/file/file.test.ts b/x-pack/plugins/files/server/file/file.test.ts index 1b86af89ba61c..69f96be79f08b 100644 --- a/x-pack/plugins/files/server/file/file.test.ts +++ b/x-pack/plugins/files/server/file/file.test.ts @@ -4,6 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import { of } from 'rxjs'; import type { ElasticsearchClient, ISavedObjectsRepository } from '@kbn/core/server'; import { createSandbox } from 'sinon'; import { @@ -92,4 +93,20 @@ describe('File', () => { await file.uploadContent(Readable.from(['test'])); expect(file.data.status).toBe('READY'); }); + + it('sets file status and deletes content if aborted', async () => { + const createBlobSpy = sandbox.spy(blobStorageService, 'createBlobStorageClient'); + const fileSO = { attributes: { Status: 'AWAITING_UPLOAD' } }; + (soClient.create as jest.Mock).mockResolvedValue(fileSO); + (soClient.update as jest.Mock).mockResolvedValue(fileSO); + const file = await fileService.createFile({ name: 'test', fileKind }); + const [{ returnValue: blobStore }] = createBlobSpy.getCalls(); + const blobStoreSpy = sandbox.spy(blobStore, 'delete'); + + const abort$ = of('boom!'); + await expect(file.uploadContent(Readable.from(['test']), abort$)).rejects.toThrow(/Abort/); + await setImmediate(); + expect(file.data.status).toBe('UPLOAD_ERROR'); + expect(blobStoreSpy.calledOnce).toBe(true); + }); }); diff --git a/x-pack/plugins/files/server/file/file.ts b/x-pack/plugins/files/server/file/file.ts index bdf85af1bec0e..c1b9d8ad12fde 100644 --- a/x-pack/plugins/files/server/file/file.ts +++ b/x-pack/plugins/files/server/file/file.ts @@ -7,15 +7,27 @@ import { Logger } from '@kbn/core/server'; import { Readable } from 'stream'; +import { + map, + from, + race, + defer, + NEVER, + mergeMap, + catchError, + Observable, + lastValueFrom, +} from 'rxjs'; import type { FileShareJSON, FileShareJSONWithToken } from '../../common/types'; import type { File as IFile, UpdatableFileMetadata, FileJSON } from '../../common'; import { fileAttributesReducer, Action } from './file_attributes_reducer'; import type { FileClientImpl } from '../file_client/file_client'; import { + AbortedUploadError, AlreadyDeletedError, - ContentAlreadyUploadedError, - NoDownloadAvailableError, UploadInProgressError, + NoDownloadAvailableError, + ContentAlreadyUploadedError, } from './errors'; /** @@ -57,7 +69,14 @@ export class File implements IFile { return this; } - public async uploadContent(content: Readable): Promise> { + private upload(content: Readable): Observable<{ size: number }> { + return defer(() => this.fileClient.upload(this.id, content)); + } + + public async uploadContent( + content: Readable, + abort$: Observable = NEVER + ): Promise> { if (this.uploadInProgress()) { throw new UploadInProgressError('Upload already in progress.'); } @@ -65,22 +84,37 @@ export class File implements IFile { throw new ContentAlreadyUploadedError('Already uploaded file content.'); } this.logger.debug(`Uploading file [id = ${this.id}][name = ${this.data.name}].`); - await this.updateFileState({ - action: 'uploading', - }); - try { - const { size } = await this.fileClient.upload(this.id, content); - await this.updateFileState({ - action: 'uploaded', - payload: { size }, - }); - return this; - } catch (e) { - await this.updateFileState({ action: 'uploadError' }); - this.fileClient.deleteContent(this.id).catch(() => {}); // Best effort to remove any uploaded content - throw e; - } + await lastValueFrom( + from(this.updateFileState({ action: 'uploading' })).pipe( + mergeMap(() => + race( + this.upload(content), + abort$.pipe( + map(() => { + throw new AbortedUploadError(`Aborted upload of ${this.id}!`); + }) + ) + ) + ), + mergeMap(({ size }) => { + return this.updateFileState({ action: 'uploaded', payload: { size } }); + }), + catchError(async (e) => { + try { + await this.updateFileState({ action: 'uploadError' }); + } catch (updateError) { + this.logger.error( + `Could not update file ${this.id} after upload error (${e.message}). Update failed with: ${updateError.message}. This file may be in an inconsistent state.` + ); + } + this.fileClient.deleteContent(this.id).catch(() => {}); + throw e; + }) + ) + ); + + return this; } public downloadContent(): Promise { diff --git a/x-pack/plugins/files/server/routes/file_kind/upload.ts b/x-pack/plugins/files/server/routes/file_kind/upload.ts index c563cddad4877..f82eb5565af3b 100644 --- a/x-pack/plugins/files/server/routes/file_kind/upload.ts +++ b/x-pack/plugins/files/server/routes/file_kind/upload.ts @@ -6,6 +6,7 @@ */ import { schema, TypeOf } from '@kbn/config-schema'; +import { ReplaySubject } from 'rxjs'; import type { Ensure } from '@kbn/utility-types'; import { Readable } from 'stream'; import type { FileKind } from '../../../common/types'; @@ -32,6 +33,12 @@ export const handler: FileKindsRequestHandler = async ( req, res ) => { + // Ensure that we are listening to the abort stream as early as possible. + // In local testing I found that there is a chance for us to miss the abort event + // if we subscribe too late. + const abort$ = new ReplaySubject(); + const sub = req.events.aborted$.subscribe(abort$); + const { fileService } = await files; const { body: stream, @@ -40,15 +47,20 @@ export const handler: FileKindsRequestHandler = async ( const { error, result: file } = await getById(fileService.asCurrentUser(), id, fileKind); if (error) return error; try { - await file.uploadContent(stream as Readable); + await file.uploadContent(stream as Readable, abort$); } catch (e) { if ( e instanceof fileErrors.ContentAlreadyUploadedError || e instanceof fileErrors.UploadInProgressError ) { return res.badRequest({ body: { message: e.message } }); + } else if (e instanceof fileErrors.AbortedUploadError) { + fileService.logger.error(e); + return res.customError({ body: { message: e.message }, statusCode: 499 }); } throw e; + } finally { + sub.unsubscribe(); } const body: Response = { ok: true, size: file.data.size! }; return res.ok({ body }); diff --git a/x-pack/plugins/screenshotting/server/screenshots/index.ts b/x-pack/plugins/screenshotting/server/screenshots/index.ts index d14968b4b760d..57f8440c34817 100644 --- a/x-pack/plugins/screenshotting/server/screenshots/index.ts +++ b/x-pack/plugins/screenshotting/server/screenshots/index.ts @@ -9,6 +9,7 @@ import type { CloudSetup } from '@kbn/cloud-plugin/server'; import type { HttpServiceSetup, KibanaRequest, Logger, PackageInfo } from '@kbn/core/server'; import type { ExpressionAstExpression } from '@kbn/expressions-plugin/common'; import type { Optional } from '@kbn/utility-types'; +import { Semaphore } from '@kbn/std'; import ipaddr from 'ipaddr.js'; import { defaultsDeep, sum } from 'lodash'; import { from, Observable, of, throwError } from 'rxjs'; @@ -46,7 +47,6 @@ import { createLayout, Layout } from '../layouts'; import { EventLogger, Transactions } from './event_logger'; import type { ScreenshotObservableOptions, ScreenshotObservableResult } from './observable'; import { ScreenshotObservableHandler, UrlOrUrlWithContext } from './observable'; -import { Semaphore } from './semaphore'; export type { ScreenshotObservableResult, UrlOrUrlWithContext } from './observable'; From 7d3f762186d015191b33c2464b4f50c83822c13f Mon Sep 17 00:00:00 2001 From: Ersin Erdal <92688503+ersin-erdal@users.noreply.github.com> Date: Mon, 5 Sep 2022 13:09:09 +0200 Subject: [PATCH 02/19] Add "exclude previous hits" check box to ESQuery rule form (#138781) * Add "Exclude the hits from previous rule run" check box to ESQuery rule form --- .../images/rule-types-es-query-conditions.png | Bin 116422 -> 132303 bytes .../alerting/rule-types/es-query.asciidoc | 7 +- .../public/alert_types/es_query/constants.ts | 1 + .../expression/es_query_expression.test.tsx | 7 ++ .../expression/es_query_expression.tsx | 6 ++ .../es_query/expression/expression.test.tsx | 2 + .../search_source_expression.test.tsx | 5 + .../expression/search_source_expression.tsx | 3 + .../search_source_expression_form.tsx | 21 +++- .../rule_common_expressions.tsx | 30 +++++- .../threshold_help_popover.tsx | 4 +- .../public/alert_types/es_query/types.ts | 2 + .../alert_types/es_query/validation.test.ts | 10 ++ .../alert_types/es_query/executor.test.ts | 1 + .../es_query/lib/fetch_es_query.ts | 51 ++++----- .../lib/fetch_search_source_query.test.ts | 34 ++++++ .../es_query/lib/fetch_search_source_query.ts | 15 +-- .../alert_types/es_query/rule_type.test.ts | 8 ++ .../es_query/rule_type_params.test.ts | 13 +++ .../alert_types/es_query/rule_type_params.ts | 1 + .../builtin_alert_types/es_query/rule.ts | 101 +++++++++++++++++- 21 files changed, 280 insertions(+), 42 deletions(-) diff --git a/docs/user/alerting/images/rule-types-es-query-conditions.png b/docs/user/alerting/images/rule-types-es-query-conditions.png index bfb549f5df20e6bad06db269a520c40b97878871..cfa5dcfcd1ca9379e5d089f9f7d1be507695a71b 100644 GIT binary patch literal 132303 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 z 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 literal 116422 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, then select Define properties to detect the condition. [role="screenshot"] -image::user/alerting/images/rule-types-es-query-conditions.png[Five clauses define the condition to detect] +image::user/alerting/images/rule-types-es-query-conditions.png[Six clauses define the condition to detect] Index:: Specifies an *index or data view* and a *time field* that is used for the *time window*. @@ -37,8 +37,9 @@ Time window:: Defines how far back to search for documents, using the *time field* set in the *index* clause. Generally this value should be set to a value higher than the *check every* value in the <>, to avoid gaps in -detection. - +detection. +Exclude the hits from previous run:: Turn on to avoid alert duplication by +excluding documents that have already been detected by the previous rule run. [float] ==== Add action variables diff --git a/x-pack/plugins/stack_alerts/public/alert_types/es_query/constants.ts b/x-pack/plugins/stack_alerts/public/alert_types/es_query/constants.ts index 91b48d8b38c4c..efb8144c2a840 100644 --- a/x-pack/plugins/stack_alerts/public/alert_types/es_query/constants.ts +++ b/x-pack/plugins/stack_alerts/public/alert_types/es_query/constants.ts @@ -19,6 +19,7 @@ export const DEFAULT_VALUES = { TIME_WINDOW_SIZE: 5, TIME_WINDOW_UNIT: 'm', THRESHOLD: [1000], + EXCLUDE_PREVIOUS_HITS: true, }; export const EXPRESSION_ERRORS = { diff --git a/x-pack/plugins/stack_alerts/public/alert_types/es_query/expression/es_query_expression.test.tsx b/x-pack/plugins/stack_alerts/public/alert_types/es_query/expression/es_query_expression.test.tsx index e70a2988a324e..082d29e05eb5b 100644 --- a/x-pack/plugins/stack_alerts/public/alert_types/es_query/expression/es_query_expression.test.tsx +++ b/x-pack/plugins/stack_alerts/public/alert_types/es_query/expression/es_query_expression.test.tsx @@ -115,6 +115,7 @@ const defaultEsQueryExpressionParams: EsQueryAlertParams = { index: ['test-index'], timeField: '@timestamp', esQuery: `{\n \"query\":{\n \"match_all\" : {}\n }\n}`, + excludeHitsFromPreviousRun: true, }; describe('EsQueryAlertTypeExpression', () => { @@ -181,6 +182,12 @@ describe('EsQueryAlertTypeExpression', () => { expect(wrapper.find('[data-test-subj="thresholdExpression"]').exists()).toBeTruthy(); expect(wrapper.find('[data-test-subj="forLastExpression"]').exists()).toBeTruthy(); + const excludeHitsButton = wrapper.find( + '[data-test-subj="excludeHitsFromPreviousRunExpression"]' + ); + expect(excludeHitsButton.exists()).toBeTruthy(); + expect(excludeHitsButton.first().prop('checked')).toBeTruthy(); + const testQueryButton = wrapper.find('EuiButton[data-test-subj="testQuery"]'); expect(testQueryButton.exists()).toBeTruthy(); expect(testQueryButton.prop('disabled')).toBe(false); diff --git a/x-pack/plugins/stack_alerts/public/alert_types/es_query/expression/es_query_expression.tsx b/x-pack/plugins/stack_alerts/public/alert_types/es_query/expression/es_query_expression.tsx index 380da4bea6d3a..caee77b9b720a 100644 --- a/x-pack/plugins/stack_alerts/public/alert_types/es_query/expression/es_query_expression.tsx +++ b/x-pack/plugins/stack_alerts/public/alert_types/es_query/expression/es_query_expression.tsx @@ -44,6 +44,7 @@ export const EsQueryExpression: React.FC< threshold, timeWindowSize, timeWindowUnit, + excludeHitsFromPreviousRun, } = ruleParams; const [currentRuleParams, setCurrentRuleParams] = useState< @@ -57,6 +58,7 @@ export const EsQueryExpression: React.FC< size: size ?? DEFAULT_VALUES.SIZE, esQuery: esQuery ?? DEFAULT_VALUES.QUERY, searchType: SearchType.esQuery, + excludeHitsFromPreviousRun: excludeHitsFromPreviousRun ?? DEFAULT_VALUES.EXCLUDE_PREVIOUS_HITS, }); const setParam = useCallback( @@ -251,6 +253,10 @@ export const EsQueryExpression: React.FC< errors={errors} hasValidationErrors={hasValidationErrors()} onTestFetch={onTestQuery} + excludeHitsFromPreviousRun={excludeHitsFromPreviousRun} + onChangeExcludeHitsFromPreviousRun={(exclude) => { + setParam('excludeHitsFromPreviousRun', exclude); + }} /> diff --git a/x-pack/plugins/stack_alerts/public/alert_types/es_query/expression/expression.test.tsx b/x-pack/plugins/stack_alerts/public/alert_types/es_query/expression/expression.test.tsx index 94b396bc8ea3c..78660fc2547b3 100644 --- a/x-pack/plugins/stack_alerts/public/alert_types/es_query/expression/expression.test.tsx +++ b/x-pack/plugins/stack_alerts/public/alert_types/es_query/expression/expression.test.tsx @@ -52,6 +52,7 @@ const defaultEsQueryRuleParams: EsQueryAlertParams = { timeField: '@timestamp', esQuery: `{\n \"query\":{\n \"match_all\" : {}\n }\n}`, searchType: SearchType.esQuery, + excludeHitsFromPreviousRun: true, }; const defaultSearchSourceRuleParams: EsQueryAlertParams = { size: 100, @@ -63,6 +64,7 @@ const defaultSearchSourceRuleParams: EsQueryAlertParams timeField: '@timestamp', searchType: SearchType.searchSource, searchConfiguration: {}, + excludeHitsFromPreviousRun: true, }; const dataViewPluginMock = dataViewPluginMocks.createStartContract(); diff --git a/x-pack/plugins/stack_alerts/public/alert_types/es_query/expression/search_source_expression.test.tsx b/x-pack/plugins/stack_alerts/public/alert_types/es_query/expression/search_source_expression.test.tsx index a9f77d5f552df..5bae70f96659f 100644 --- a/x-pack/plugins/stack_alerts/public/alert_types/es_query/expression/search_source_expression.test.tsx +++ b/x-pack/plugins/stack_alerts/public/alert_types/es_query/expression/search_source_expression.test.tsx @@ -54,6 +54,7 @@ const defaultSearchSourceExpressionParams: EsQueryAlertParams { }); wrapper = await wrapper.update(); expect(findTestSubject(wrapper, 'thresholdExpression')).toBeTruthy(); + + const excludeHitsCheckbox = findTestSubject(wrapper, 'excludeHitsFromPreviousRunExpression'); + expect(excludeHitsCheckbox).toBeTruthy(); + expect(excludeHitsCheckbox.prop('checked')).toBeTruthy(); }); test('should disable Test Query button if data view is not selected yet', async () => { diff --git a/x-pack/plugins/stack_alerts/public/alert_types/es_query/expression/search_source_expression.tsx b/x-pack/plugins/stack_alerts/public/alert_types/es_query/expression/search_source_expression.tsx index b00176288b751..2e5d2d6e7b18d 100644 --- a/x-pack/plugins/stack_alerts/public/alert_types/es_query/expression/search_source_expression.tsx +++ b/x-pack/plugins/stack_alerts/public/alert_types/es_query/expression/search_source_expression.tsx @@ -34,6 +34,7 @@ export const SearchSourceExpression = ({ size, savedQueryId, searchConfiguration, + excludeHitsFromPreviousRun, } = ruleParams; const { data } = useTriggersAndActionsUiDeps(); @@ -69,6 +70,8 @@ export const SearchSourceExpression = ({ threshold: threshold ?? DEFAULT_VALUES.THRESHOLD, thresholdComparator: thresholdComparator ?? DEFAULT_VALUES.THRESHOLD_COMPARATOR, size: size ?? DEFAULT_VALUES.SIZE, + excludeHitsFromPreviousRun: + excludeHitsFromPreviousRun ?? DEFAULT_VALUES.EXCLUDE_PREVIOUS_HITS, }); data.search.searchSource diff --git a/x-pack/plugins/stack_alerts/public/alert_types/es_query/expression/search_source_expression_form.tsx b/x-pack/plugins/stack_alerts/public/alert_types/es_query/expression/search_source_expression_form.tsx index 87e475e5f2c83..67526a53a6b8e 100644 --- a/x-pack/plugins/stack_alerts/public/alert_types/es_query/expression/search_source_expression_form.tsx +++ b/x-pack/plugins/stack_alerts/public/alert_types/es_query/expression/search_source_expression_form.tsx @@ -38,13 +38,21 @@ interface LocalState { timeWindowSize: CommonAlertParams['timeWindowSize']; timeWindowUnit: CommonAlertParams['timeWindowUnit']; size: CommonAlertParams['size']; + excludeHitsFromPreviousRun: CommonAlertParams['excludeHitsFromPreviousRun']; } interface LocalStateAction { type: | SearchSourceParamsAction['type'] - | ('threshold' | 'thresholdComparator' | 'timeWindowSize' | 'timeWindowUnit' | 'size'); - payload: SearchSourceParamsAction['payload'] | (number[] | number | string); + | ( + | 'threshold' + | 'thresholdComparator' + | 'timeWindowSize' + | 'timeWindowUnit' + | 'size' + | 'excludeHitsFromPreviousRun' + ); + payload: SearchSourceParamsAction['payload'] | (number[] | number | string | boolean); } type LocalStateReducer = (prevState: LocalState, action: LocalStateAction) => LocalState; @@ -94,6 +102,8 @@ export const SearchSourceExpressionForm = (props: SearchSourceExpressionFormProp timeWindowSize: ruleParams.timeWindowSize ?? DEFAULT_VALUES.TIME_WINDOW_SIZE, timeWindowUnit: ruleParams.timeWindowUnit ?? DEFAULT_VALUES.TIME_WINDOW_UNIT, size: ruleParams.size ?? DEFAULT_VALUES.SIZE, + excludeHitsFromPreviousRun: + ruleParams.excludeHitsFromPreviousRun ?? DEFAULT_VALUES.EXCLUDE_PREVIOUS_HITS, } ); const { index: dataView, query, filter: filters } = ruleConfiguration; @@ -173,6 +183,11 @@ export const SearchSourceExpressionForm = (props: SearchSourceExpressionFormProp [] ); + const onChangeExcludeHitsFromPreviousRun = useCallback( + (exclude: boolean) => dispatch({ type: 'excludeHitsFromPreviousRun', payload: exclude }), + [] + ); + const timeWindow = `${ruleConfiguration.timeWindowSize}${ruleConfiguration.timeWindowUnit}`; const createTestSearchSource = useCallback(() => { @@ -275,6 +290,8 @@ export const SearchSourceExpressionForm = (props: SearchSourceExpressionFormProp hasValidationErrors={hasExpressionValidationErrors(ruleParams) || !dataView} onTestFetch={onTestFetch} onCopyQuery={onCopyQuery} + excludeHitsFromPreviousRun={ruleConfiguration.excludeHitsFromPreviousRun} + onChangeExcludeHitsFromPreviousRun={onChangeExcludeHitsFromPreviousRun} /> diff --git a/x-pack/plugins/stack_alerts/public/alert_types/es_query/rule_common_expressions/rule_common_expressions.tsx b/x-pack/plugins/stack_alerts/public/alert_types/es_query/rule_common_expressions/rule_common_expressions.tsx index 0f907597b6702..2f2afd8953a7b 100644 --- a/x-pack/plugins/stack_alerts/public/alert_types/es_query/rule_common_expressions/rule_common_expressions.tsx +++ b/x-pack/plugins/stack_alerts/public/alert_types/es_query/rule_common_expressions/rule_common_expressions.tsx @@ -7,7 +7,15 @@ import React from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; -import { EuiFlexGroup, EuiFlexItem, EuiIconTip, EuiSpacer, EuiTitle } from '@elastic/eui'; +import { + EuiCheckbox, + EuiFlexGroup, + EuiFlexItem, + EuiFormRow, + EuiIconTip, + EuiSpacer, + EuiTitle, +} from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { ForLastExpression, @@ -26,6 +34,7 @@ export interface RuleCommonExpressionsProps { timeWindowSize: CommonAlertParams['timeWindowSize']; timeWindowUnit: CommonAlertParams['timeWindowUnit']; size: CommonAlertParams['size']; + excludeHitsFromPreviousRun: CommonAlertParams['excludeHitsFromPreviousRun']; errors: IErrorObject; hasValidationErrors: boolean; onChangeThreshold: Parameters[0]['onChangeSelectedThreshold']; @@ -37,6 +46,7 @@ export interface RuleCommonExpressionsProps { onChangeSizeValue: Parameters[0]['onChangeSelectedValue']; onTestFetch: TestQueryRowProps['fetch']; onCopyQuery?: TestQueryRowProps['copyQuery']; + onChangeExcludeHitsFromPreviousRun: (exclude: boolean) => void; } export const RuleCommonExpressions: React.FC = ({ @@ -54,6 +64,8 @@ export const RuleCommonExpressions: React.FC = ({ onChangeSizeValue, onTestFetch, onCopyQuery, + excludeHitsFromPreviousRun, + onChangeExcludeHitsFromPreviousRun, }) => { return ( <> @@ -123,7 +135,21 @@ export const RuleCommonExpressions: React.FC = ({ popupPosition="upLeft" onChangeSelectedValue={onChangeSizeValue} /> - + + + { + onChangeExcludeHitsFromPreviousRun(event.target.checked); + }} + label={i18n.translate('xpack.stackAlerts.esQuery.ui.excludePreviousHitsExpression', { + defaultMessage: 'Exclude the hits from previous rule runs', + })} + /> + + {
+ { + handleFilterClick?.(columnId, rowValue, colIndex, rowIndex); + }} + > + {content} + +
+ ); + } return (
columnId === field); + const cellActions = - filterable && handleFilterClick + filterable && handleFilterClick && !columnArgs?.oneClickFilter ? [ ({ rowIndex, columnId, Component }: EuiDataGridColumnCellActionProps) => { const { rowValue, contentsIsDefined, cellContent } = getContentData({ @@ -158,7 +160,6 @@ export const createGridColumns = ( ] : undefined; - const columnArgs = columnConfig.columns.find(({ columnId }) => columnId === field); const isTransposed = Boolean(columnArgs?.originalColumnId); const initialWidth = columnArgs?.width; const isHidden = columnArgs?.hidden; diff --git a/x-pack/plugins/lens/public/visualizations/datatable/components/dimension_editor.tsx b/x-pack/plugins/lens/public/visualizations/datatable/components/dimension_editor.tsx index da1f28ba579f2..091cd4faadf3e 100644 --- a/x-pack/plugins/lens/public/visualizations/datatable/components/dimension_editor.tsx +++ b/x-pack/plugins/lens/public/visualizations/datatable/components/dimension_editor.tsx @@ -318,6 +318,42 @@ export function TableDimensionEditor( /> )} + {props.groupId === 'rows' && ( + + { + const newState = { + ...state, + columns: state.columns.map((currentColumn) => { + if (currentColumn.columnId === accessor) { + return { + ...currentColumn, + oneClickFilter: !column.oneClickFilter, + }; + } else { + return currentColumn; + } + }), + }; + setState(newState); + }} + /> + + )} ); } diff --git a/x-pack/plugins/lens/public/visualizations/datatable/components/table_basic.tsx b/x-pack/plugins/lens/public/visualizations/datatable/components/table_basic.tsx index fdc9542dae53d..c3ef4d1c1ea0e 100644 --- a/x-pack/plugins/lens/public/visualizations/datatable/components/table_basic.tsx +++ b/x-pack/plugins/lens/public/visualizations/datatable/components/table_basic.tsx @@ -452,6 +452,7 @@ export const DatatableComponent = (props: DatatableRenderProps) => { alignments, minMaxByColumnId, getColorForValue: props.paletteService.get(CUSTOM_PALETTE).getColorForValue!, + handleFilterClick, }} > ; minMaxByColumnId?: Record; + handleFilterClick?: ( + field: string, + value: unknown, + colIndex: number, + rowIndex: number, + negate?: boolean + ) => void; getColorForValue?: ( value: number | undefined, state: CustomPaletteState, diff --git a/x-pack/plugins/lens/public/visualizations/datatable/visualization.tsx b/x-pack/plugins/lens/public/visualizations/datatable/visualization.tsx index 8b9f2fe4bc4ed..d106643a205e3 100644 --- a/x-pack/plugins/lens/public/visualizations/datatable/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/datatable/visualization.tsx @@ -449,6 +449,10 @@ export const getDatatableVisualization = ({ arguments: { columnId: [column.columnId], hidden: typeof column.hidden === 'undefined' ? [] : [column.hidden], + oneClickFilter: + typeof column.oneClickFilter === 'undefined' + ? [] + : [column.oneClickFilter], width: typeof column.width === 'undefined' ? [] : [column.width], isTransposed: typeof column.isTransposed === 'undefined' ? [] : [column.isTransposed], From fa02c5a735ac8f4287e8876768897957acef9bea Mon Sep 17 00:00:00 2001 From: Thom Heymann <190132+thomheymann@users.noreply.github.com> Date: Mon, 5 Sep 2022 15:43:15 +0100 Subject: [PATCH 08/19] Narrow types in authenticator (#139978) --- .../security/server/authentication/authenticator.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security/server/authentication/authenticator.ts b/x-pack/plugins/security/server/authentication/authenticator.ts index 2a78c2363389c..3457ae42aa4dd 100644 --- a/x-pack/plugins/security/server/authentication/authenticator.ts +++ b/x-pack/plugins/security/server/authentication/authenticator.ts @@ -164,7 +164,11 @@ function isLoginAttemptWithProviderType( ); } -function isSessionAuthenticated(sessionValue?: Readonly | null) { +type WithRequiredProperty = T & Required>; + +function isSessionAuthenticated( + sessionValue?: Readonly | null +): sessionValue is WithRequiredProperty { return !!sessionValue?.username; } @@ -792,7 +796,7 @@ export class Authenticator { sessionValue, skipAuditEvent, }: InvalidateSessionValueParams) { - if (sessionValue && isSessionAuthenticated(sessionValue) && !skipAuditEvent) { + if (isSessionAuthenticated(sessionValue) && !skipAuditEvent) { const auditLogger = this.options.audit.asScoped(request); auditLogger.log( userLogoutEvent({ From e461ad5cc361b2b3ef498555c8ee0454bf1ac04b Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Mon, 5 Sep 2022 17:39:15 +0200 Subject: [PATCH 09/19] more consistent pluralisation (files service -> file service), more consistent casing and added some copy (#140012) --- nav-kibana-dev.docnav.json | 2 +- x-pack/plugins/files/docs/tutorial.mdx | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/nav-kibana-dev.docnav.json b/nav-kibana-dev.docnav.json index 7e00c8378e5c8..40c4858d89f7d 100644 --- a/nav-kibana-dev.docnav.json +++ b/nav-kibana-dev.docnav.json @@ -138,7 +138,7 @@ "label": "data.search" }, { - "id": "kibDevTutorialFilesService", + "id": "kibDevTutorialFileService", "label": "File service" }, { diff --git a/x-pack/plugins/files/docs/tutorial.mdx b/x-pack/plugins/files/docs/tutorial.mdx index 00eebc651679b..b3bfed56dd865 100644 --- a/x-pack/plugins/files/docs/tutorial.mdx +++ b/x-pack/plugins/files/docs/tutorial.mdx @@ -1,8 +1,8 @@ --- -id: kibDevTutorialFilesService -slug: /kibana-dev-docs/files-service -title: Kibana File service -description: The files service abstracts over a blob store and provides CRUD functionality for blobs. +id: kibDevTutorialFileService +slug: /kibana-dev-docs/file-service +title: Kibana file service +description: The file service abstracts over a blob store and provides CRUD functionality for blobs. date: 2022-08-29 tags: ['kibana', 'onboarding', 'dev', 'architecture'] --- @@ -30,7 +30,7 @@ Blobs include any of the following: To ensure the most secure file storage experience: 1. Only expose the needed actions against your files - 2. Control access to your files using security tags on your HTTP routes + 2. Control access to your files using security tags on your HTTP routes (see code snippets below) 3. Do not ask users to store data in files that should not be visible to other users of the app 4. Do not store sensitive data in files - if you have a use case that requires this, please reach out to the Kibana App Services team From f0fe485e7da6378cd6a85aa787ab7d0b1db09cf6 Mon Sep 17 00:00:00 2001 From: Dzmitry Lemechko Date: Mon, 5 Sep 2022 18:30:44 +0200 Subject: [PATCH 10/19] Add pipeline to run scalability tests from APM traces (#139548) * add scalability pipeline to run scenarios from APM traces * update runner description * remove retry-all-errors curl flag * add flag for curl to ignore connection refused * override ES_HOST for gatling runner * exclude config from regular CI, remove bail flag * fix uploaded scalability traces * fix text and remove space * add validation in config * use functions instead of scripts * renaming var in loop * add step timeout * define functions before call * use trap for stopping ES * fix path for artifacts extraction * update serverArgs * add pre-build step * add pre-build step * use default pre-build step * delete step * print BUILDKITE_PIPELINE_SLUG * disable telemetry * remove log * enable telemetry * add step to upload test results * move trap after pid * upload test reports to gcs * fix script * Revert "fix script" This reverts commit 1c6bc3f45c292452840e61d489775939bb8d0793. * Revert "upload test reports to gcs" This reverts commit c957a31c32d5c895606f93d0a78823b0552c5a42. --- .buildkite/ftr_configs.yml | 3 + .buildkite/pipelines/scalability/daily.yml | 23 ++++ .../scalability_dataset_extraction.sh | 4 +- .../scripts/steps/scalability/benchmarking.sh | 122 ++++++++++++++++++ x-pack/test/performance/scalability/config.ts | 109 ++++++++++++++++ x-pack/test/performance/scalability/runner.ts | 41 ++++++ 6 files changed, 300 insertions(+), 2 deletions(-) create mode 100644 .buildkite/pipelines/scalability/daily.yml create mode 100755 .buildkite/scripts/steps/scalability/benchmarking.sh create mode 100644 x-pack/test/performance/scalability/config.ts create mode 100644 x-pack/test/performance/scalability/runner.ts diff --git a/.buildkite/ftr_configs.yml b/.buildkite/ftr_configs.yml index eb7daad21b0f0..812d22fec913b 100644 --- a/.buildkite/ftr_configs.yml +++ b/.buildkite/ftr_configs.yml @@ -58,6 +58,9 @@ disabled: - x-pack/test/screenshot_creation/config.ts - x-pack/test/fleet_packages/config.ts + # Scalability testing config that we run in its own pipeline + - x-pack/test/performance/scalability/config.ts + defaultQueue: 'n2-4-spot' enabled: - test/accessibility/config.ts diff --git a/.buildkite/pipelines/scalability/daily.yml b/.buildkite/pipelines/scalability/daily.yml new file mode 100644 index 0000000000000..8529a2f36b4de --- /dev/null +++ b/.buildkite/pipelines/scalability/daily.yml @@ -0,0 +1,23 @@ +steps: + - label: ':male-mechanic::skin-tone-2: Pre-Build' + command: .buildkite/scripts/lifecycle/pre_build.sh + agents: + queue: kibana-default + timeout_in_minutes: 10 + + - wait + + - label: ':kibana: Scalability Tests' + command: .buildkite/scripts/steps/scalability/benchmarking.sh + agents: + queue: kb-static-scalability + timeout_in_minutes: 90 + + - wait: ~ + continue_on_failure: true + + - label: ':male_superhero::skin-tone-2: Post-Build' + command: .buildkite/scripts/lifecycle/post_build.sh + agents: + queue: kibana-default + timeout_in_minutes: 10 diff --git a/.buildkite/scripts/steps/functional/scalability_dataset_extraction.sh b/.buildkite/scripts/steps/functional/scalability_dataset_extraction.sh index 4be4a750cf383..490d2b4a3b705 100755 --- a/.buildkite/scripts/steps/functional/scalability_dataset_extraction.sh +++ b/.buildkite/scripts/steps/functional/scalability_dataset_extraction.sh @@ -51,6 +51,6 @@ cd - echo "--- Promoting '${BUILD_ID}' dataset to LATEST" cd "${OUTPUT_DIR}/.." -echo "${BUILD_ID}" > LATEST -gsutil cp LATEST "${GCS_BUCKET}" +echo "${BUILD_ID}" > latest +gsutil cp latest "${GCS_BUCKET}" cd - diff --git a/.buildkite/scripts/steps/scalability/benchmarking.sh b/.buildkite/scripts/steps/scalability/benchmarking.sh new file mode 100755 index 0000000000000..3bd762796e189 --- /dev/null +++ b/.buildkite/scripts/steps/scalability/benchmarking.sh @@ -0,0 +1,122 @@ +#!/usr/bin/env bash + +set -euo pipefail + +source .buildkite/scripts/common/util.sh + +#.buildkite/scripts/bootstrap.sh +echo "--- yarn kbn reset && yarn kbn bootstrap" +yarn kbn reset && yarn kbn bootstrap + +GCS_BUCKET="gs://kibana-performance/scalability-tests" +GCS_ARTIFACTS_REL="gcs_artifacts" +GCS_ARTIFACTS_DIR="${WORKSPACE}/${GCS_ARTIFACTS_REL}" +KIBANA_LOAD_TESTING_DIR="${KIBANA_DIR}/kibana-load-testing" + +# These tests are running on static workers so we must delete previous build, load runner and scalability artifacts +rm -rf "${KIBANA_BUILD_LOCATION}" +rm -rf "${KIBANA_LOAD_TESTING_DIR}" +rm -rf "${GCS_ARTIFACTS_DIR}" + +download_artifacts() { + mkdir -p "${GCS_ARTIFACTS_DIR}" + + gsutil cp "$GCS_BUCKET/latest" "${GCS_ARTIFACTS_DIR}/" + HASH=`cat ${GCS_ARTIFACTS_DIR}/latest` + gsutil cp -r "$GCS_BUCKET/$HASH" "${GCS_ARTIFACTS_DIR}/" + + export LATEST_RUN_ARTIFACTS_DIR="${GCS_ARTIFACTS_DIR}/${HASH}" + + echo "Unzip kibana build, plugins and scalability traces" + cd "$WORKSPACE" + mkdir -p "$KIBANA_BUILD_LOCATION" + tar -xzf "${LATEST_RUN_ARTIFACTS_DIR}/kibana-default.tar.gz" -C "$KIBANA_BUILD_LOCATION" --strip=1 + + cd "$KIBANA_DIR" + tar -xzf "${LATEST_RUN_ARTIFACTS_DIR}/kibana-default-plugins.tar.gz" + tar -xzf "${LATEST_RUN_ARTIFACTS_DIR}/scalability_traces.tar.gz" +} + +checkout_and_compile_load_runner() { + mkdir -p "${KIBANA_LOAD_TESTING_DIR}" && cd "${KIBANA_LOAD_TESTING_DIR}" + + if [[ ! -d .git ]]; then + git init + git remote add origin https://github.com/elastic/kibana-load-testing.git + fi + git fetch origin --depth 1 "main" + git reset --hard FETCH_HEAD + + KIBANA_LOAD_TESTING_GIT_COMMIT="$(git rev-parse HEAD)" + export KIBANA_LOAD_TESTING_GIT_COMMIT + + mvn -q test-compile + echo "Set 'GATLING_PROJECT_PATH' env var for ScalabilityTestRunner" + export GATLING_PROJECT_PATH="$(pwd)" +} + +upload_test_results() { + cd "${KIBANA_DIR}" + echo "--- Archive Gatling reports and upload as build artifacts" + tar -czf "scalability_test_report.tar.gz" --exclude=simulation.log -C kibana-load-testing/target gatling + buildkite-agent artifact upload "scalability_test_report.tar.gz" + cd "${LATEST_RUN_ARTIFACTS_DIR}" + echo "Upload scalability traces as build artifacts" + buildkite-agent artifact upload "scalability_traces.tar.gz" +} + +echo "--- Download the latest artifacts from single user performance pipeline" +download_artifacts + +echo "--- Clone kibana-load-testing repo and compile project" +checkout_and_compile_load_runner + +echo "--- Run Scalability Tests with Elasticsearch started only once and Kibana restart before each journey" +cd "$KIBANA_DIR" +node scripts/es snapshot& + +esPid=$! +# Set trap on EXIT to stop Elasticsearch process +trap "kill -9 $esPid" EXIT + +# unset env vars defined in other parts of CI for automatic APM collection of +# Kibana. We manage APM config in our FTR config and performance service, and +# APM treats config in the ENV with a very high precedence. +unset ELASTIC_APM_ENVIRONMENT +unset ELASTIC_APM_TRANSACTION_SAMPLE_RATE +unset ELASTIC_APM_SERVER_URL +unset ELASTIC_APM_SECRET_TOKEN +unset ELASTIC_APM_ACTIVE +unset ELASTIC_APM_CONTEXT_PROPAGATION_ONLY +unset ELASTIC_APM_GLOBAL_LABELS +unset ELASTIC_APM_MAX_QUEUE_SIZE +unset ELASTIC_APM_METRICS_INTERVAL +unset ELASTIC_APM_CAPTURE_SPAN_STACK_TRACES +unset ELASTIC_APM_BREAKDOWN_METRICS + + +export TEST_ES_DISABLE_STARTUP=true +ES_HOST="localhost:9200" +export TEST_ES_URL="http://elastic:changeme@${ES_HOST}" +# Overriding Gatling default configuration +export ES_URL="http://${ES_HOST}" + +# Pings the ES server every second for 2 mins until its status is green +curl --retry 120 \ + --retry-delay 1 \ + --retry-connrefused \ + -I -XGET "${TEST_ES_URL}/_cluster/health?wait_for_nodes=>=1&wait_for_status=yellow" + +export ELASTIC_APM_ACTIVE=true + +for journey in scalability_traces/server/*; do + export SCALABILITY_JOURNEY_PATH="$KIBANA_DIR/$journey" + echo "--- Run scalability file: $SCALABILITY_JOURNEY_PATH" + node scripts/functional_tests \ + --config x-pack/test/performance/scalability/config.ts \ + --kibana-install-dir "$KIBANA_BUILD_LOCATION" \ + --debug +done + +echo "--- Upload test results" +upload_test_results diff --git a/x-pack/test/performance/scalability/config.ts b/x-pack/test/performance/scalability/config.ts new file mode 100644 index 0000000000000..6a8302f33fe34 --- /dev/null +++ b/x-pack/test/performance/scalability/config.ts @@ -0,0 +1,109 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrConfigProviderContext } from '@kbn/test'; +import fs from 'fs'; +import path from 'path'; +import { REPO_ROOT } from '@kbn/utils'; +import { createFlagError } from '@kbn/dev-cli-errors'; +import { serializeApmGlobalLabels } from '../utils'; +import { ScalabilityTestRunner } from './runner'; +import { FtrProviderContext } from '../ftr_provider_context'; + +// These "secret" values are intentionally written in the source. +const APM_SERVER_URL = 'https://142fea2d3047486e925eb8b223559cae.apm.europe-west1.gcp.cloud.es.io'; +const APM_PUBLIC_TOKEN = 'pWFFEym07AKBBhUE2i'; +const AGGS_SHARD_DELAY = process.env.LOAD_TESTING_SHARD_DELAY; +const DISABLE_PLUGINS = process.env.LOAD_TESTING_DISABLE_PLUGINS; +const scalabilityJsonPath = process.env.SCALABILITY_JOURNEY_PATH; +const gatlingProjectRootPath: string = + process.env.GATLING_PROJECT_PATH || path.resolve(REPO_ROOT, '../kibana-load-testing'); + +const readScalabilityJourney = (filePath: string): ScalabilityJourney => { + if (path.extname(filePath) !== '.json') { + throw createFlagError(`Path to scalability journey json is non-json file: '${filePath}'`); + } + try { + return JSON.parse(fs.readFileSync(filePath, 'utf-8')); + } catch (error) { + if (error.code === 'ENOENT') { + throw createFlagError(`Path to scalability journey json is invalid: ${filePath}`); + } + throw createFlagError(`Invalid JSON provided: '${filePath}', ${error}`); + } +}; + +interface ScalabilityJourney { + journeyName: string; +} + +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const performanceConfig = await readConfigFile(require.resolve('../journeys/base.config.ts')); + + if (!fs.existsSync(gatlingProjectRootPath)) { + throw createFlagError( + `Incorrect path to load testing project: '${gatlingProjectRootPath}'\n + Clone 'elastic/kibana-load-testing' and set path using 'GATLING_PROJECT_PATH' env var` + ); + } + + if (!scalabilityJsonPath) { + throw createFlagError( + `Set path to scalability journey json using 'SCALABILITY_JOURNEY_PATH' env var` + ); + } + const scalabilityJourney = readScalabilityJourney(scalabilityJsonPath); + + const apmGlobalLabels = { + ...performanceConfig.get('kbnTestServer').env.ELASTIC_APM_GLOBAL_LABELS, + journeyFilePath: path.basename(scalabilityJsonPath), + journeyName: scalabilityJourney.journeyName, + }; + + return { + ...performanceConfig.getAll(), + + testRunner: (context: FtrProviderContext) => + ScalabilityTestRunner(context, scalabilityJsonPath, gatlingProjectRootPath), + + esTestCluster: { + ...performanceConfig.get('esTestCluster'), + serverArgs: [...performanceConfig.get('esTestCluster.serverArgs')], + esJavaOpts: '-Xms8g -Xmx8g', + }, + + kbnTestServer: { + ...performanceConfig.get('kbnTestServer'), + sourceArgs: [ + ...performanceConfig.get('kbnTestServer.sourceArgs'), + '--no-base-path', + '--env.name=development', + ...(!!AGGS_SHARD_DELAY ? ['--data.search.aggs.shardDelay.enabled=true'] : []), + ...(!!DISABLE_PLUGINS ? ['--plugins.initialize=false'] : []), + ], + serverArgs: [ + ...performanceConfig.get('kbnTestServer.serverArgs'), + `--telemetry.labels.journeyName=${scalabilityJourney.journeyName}`, + ], + env: { + ELASTIC_APM_ACTIVE: process.env.ELASTIC_APM_ACTIVE, + ELASTIC_APM_CONTEXT_PROPAGATION_ONLY: 'false', + ELASTIC_APM_ENVIRONMENT: process.env.CI ? 'ci' : 'development', + ELASTIC_APM_TRANSACTION_SAMPLE_RATE: '1.0', + ELASTIC_APM_SERVER_URL: APM_SERVER_URL, + ELASTIC_APM_SECRET_TOKEN: APM_PUBLIC_TOKEN, + ELASTIC_APM_BREAKDOWN_METRICS: false, + ELASTIC_APM_CAPTURE_SPAN_STACK_TRACES: false, + ELASTIC_APM_METRICS_INTERVAL: '80s', + ELASTIC_APM_MAX_QUEUE_SIZE: 20480, + ELASTIC_APM_GLOBAL_LABELS: serializeApmGlobalLabels(apmGlobalLabels), + }, + // delay shutdown to ensure that APM can report the data it collects during test execution + delayShutdown: 90_000, + }, + }; +} diff --git a/x-pack/test/performance/scalability/runner.ts b/x-pack/test/performance/scalability/runner.ts new file mode 100644 index 0000000000000..e768339b0d498 --- /dev/null +++ b/x-pack/test/performance/scalability/runner.ts @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { withProcRunner } from '@kbn/dev-proc-runner'; +import { FtrProviderContext } from '../ftr_provider_context'; + +/** + * ScalabilityTestRunner is used to run load simulation against local Kibana instance + * scalabilityJsonPath defines path to the file, parsed and executed by Gatling runner + * gatlingProjectRootPath defines root path to the kibana-load-testing repo + */ +export async function ScalabilityTestRunner( + { getService }: FtrProviderContext, + scalabilityJsonPath: string, + gatlingProjectRootPath: string +) { + const log = getService('log'); + + log.info(`Running scalability test with json file: '${scalabilityJsonPath}'`); + + await withProcRunner(log, async (procs) => { + await procs.run('gatling: test', { + cmd: 'mvn', + args: [ + 'gatling:test', + '-q', + '-Dgatling.simulationClass=org.kibanaLoadTest.simulation.generic.GenericJourney', + `-DjourneyPath=${scalabilityJsonPath}`, + ], + cwd: gatlingProjectRootPath, + env: { + ...process.env, + }, + wait: true, + }); + }); +} From 15f8329d2941ff56a290f04136be1f5605e21d11 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Mon, 5 Sep 2022 18:55:03 +0200 Subject: [PATCH 11/19] Make sure shard size stays stable for low number of sizes in TSVB, Lens and Agg based (#139791) * make sure shard size stays stable for low number of sizes * add terms test * adjust test * fix tests * add explanatory comment --- .../common/search/aggs/buckets/terms.test.ts | 26 +++++++++++++++++++ .../data/common/search/aggs/buckets/terms.ts | 8 +++++- .../common/utils/field_stats_utils.ts | 3 +++ .../series/split_by_terms.js | 5 ++++ .../series/split_by_terms.test.js | 4 +++ .../functional/apps/lens/group3/time_shift.ts | 4 +-- 6 files changed, 47 insertions(+), 3 deletions(-) diff --git a/src/plugins/data/common/search/aggs/buckets/terms.test.ts b/src/plugins/data/common/search/aggs/buckets/terms.test.ts index 3dd49b566ab5c..102fdfcfa6147 100644 --- a/src/plugins/data/common/search/aggs/buckets/terms.test.ts +++ b/src/plugins/data/common/search/aggs/buckets/terms.test.ts @@ -364,6 +364,32 @@ describe('Terms Agg', () => { expect(params.order).toEqual({ 'test-orderAgg.50': 'desc' }); }); + // 25 is the default shard size set for size:10 by Elasticsearch. + // Setting it to 25 for every size below 10 makes sure the shard size doesn't change for sizes 1-10, keeping the top terms stable. + test('set shard_size to 25 if size is smaller or equal than 10', () => { + const aggConfigs = getAggConfigs({ + field: 'string_field', + orderAgg: { + type: 'count', + }, + size: 5, + }); + const { [BUCKET_TYPES.TERMS]: params } = aggConfigs.aggs[0].toDsl(); + expect(params.shard_size).toEqual(25); + }); + + test('do not set shard_size if size is bigger than 10', () => { + const aggConfigs = getAggConfigs({ + field: 'string_field', + orderAgg: { + type: 'count', + }, + size: 15, + }); + const { [BUCKET_TYPES.TERMS]: params } = aggConfigs.aggs[0].toDsl(); + expect(params.shard_size).toBeUndefined(); + }); + test('optionally supports shard_size', () => { const aggConfigs = getAggConfigs({ field: 'string_field', diff --git a/src/plugins/data/common/search/aggs/buckets/terms.ts b/src/plugins/data/common/search/aggs/buckets/terms.ts index dcd2ec6143b03..fdee9dfdb042f 100644 --- a/src/plugins/data/common/search/aggs/buckets/terms.ts +++ b/src/plugins/data/common/search/aggs/buckets/terms.ts @@ -121,7 +121,13 @@ export const getTermsBucketAgg = () => { name: 'shardSize', write: (aggConfig, output) => { - output.params.shard_size = aggConfig.params.shardSize; + if (aggConfig.params.shardSize) { + output.params.shard_size = aggConfig.params.shardSize; + } else if (aggConfig.params.size <= 10) { + // 25 is the default shard size set for size:10 by Elasticsearch. + // Setting it to 25 for every size below 10 makes sure the shard size doesn't change for sizes 1-10, keeping the top terms stable. + output.params.shard_size = 25; + } }, }, { diff --git a/src/plugins/unified_field_list/common/utils/field_stats_utils.ts b/src/plugins/unified_field_list/common/utils/field_stats_utils.ts index 9cf33961d76b6..8401054a3942a 100644 --- a/src/plugins/unified_field_list/common/utils/field_stats_utils.ts +++ b/src/plugins/unified_field_list/common/utils/field_stats_utils.ts @@ -234,6 +234,9 @@ export async function getStringSamples( terms: { ...fieldRef, size, + // 25 is the default shard size set for size:10 by Elasticsearch. + // Setting it to 25 for every size below 10 makes sure the shard size doesn't change for sizes 1-10, keeping the top terms stable. + shard_size: size <= 10 ? 25 : undefined, }, }, }, diff --git a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/split_by_terms.js b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/split_by_terms.js index d093019fee3d8..b2249bd5156a3 100644 --- a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/split_by_terms.js +++ b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/split_by_terms.js @@ -46,6 +46,11 @@ export function splitByTerms(req, panel, series, esQueryConfig, seriesIndex) { } overwrite(doc, `aggs.${series.id}.${termsType}.size`, series.terms_size); + if (series.terms_size <= 10) { + // 25 is the default shard size set for size:10 by Elasticsearch. + // Setting it to 25 for every size below 10 makes sure the shard size doesn't change for sizes 1-10, keeping the top terms stable. + overwrite(doc, `aggs.${series.id}.${termsType}.shard_size`, 25); + } if (metric && metric.type !== 'count' && ~basicAggs.indexOf(metric.type)) { const sortAggKey = `${orderByTerms}-SORT`; diff --git a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/split_by_terms.test.js b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/split_by_terms.test.js index 0795e3390eb2f..94b70c1684092 100644 --- a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/split_by_terms.test.js +++ b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/split_by_terms.test.js @@ -59,6 +59,7 @@ describe('splitByTerms', () => { _count: 'desc', }, size: 10, + shard_size: 25, }, }, }, @@ -79,6 +80,7 @@ describe('splitByTerms', () => { _key: 'asc', }, size: 10, + shard_size: 25, }, }, }, @@ -95,6 +97,7 @@ describe('splitByTerms', () => { terms: { field: 'host', size: 10, + shard_size: 25, order: { 'avgmetric-SORT': 'desc', }, @@ -126,6 +129,7 @@ describe('splitByTerms', () => { "order": Object { "_count": "desc", }, + "shard_size": 25, "size": 10, "terms": Array [ Object { diff --git a/x-pack/test/functional/apps/lens/group3/time_shift.ts b/x-pack/test/functional/apps/lens/group3/time_shift.ts index 4dd22ea719ec7..de8405c62e4cc 100644 --- a/x-pack/test/functional/apps/lens/group3/time_shift.ts +++ b/x-pack/test/functional/apps/lens/group3/time_shift.ts @@ -60,8 +60,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await PageObjects.lens.hasFixAction()).to.be(true); await PageObjects.lens.useFixAction(); - expect(await PageObjects.lens.getDatatableCellText(1, 2)).to.eql('5,541.5'); - expect(await PageObjects.lens.getDatatableCellText(1, 3)).to.eql('3,628'); + expect(await PageObjects.lens.getDatatableCellText(2, 2)).to.eql('6,976'); + expect(await PageObjects.lens.getDatatableCellText(2, 3)).to.eql('4,182.5'); expect(await PageObjects.lens.getDatatableHeaderText(0)).to.eql('Filters of ip'); }); From f013788fd6e4971151bbb048dcd368ea2773ff23 Mon Sep 17 00:00:00 2001 From: ofiriro3 Date: Mon, 5 Sep 2022 21:44:12 +0300 Subject: [PATCH 12/19] Update README.md with unit tests and integration tests (#139722) --- .../plugins/cloud_security_posture/README.md | 77 ++++++++++++++++++- 1 file changed, 76 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/cloud_security_posture/README.md b/x-pack/plugins/cloud_security_posture/README.md index 8d2e3f62a3f7a..06abf2bd5b8ed 100755 --- a/x-pack/plugins/cloud_security_posture/README.md +++ b/x-pack/plugins/cloud_security_posture/README.md @@ -4,6 +4,81 @@ Cloud Posture automates the identification and remediation of risks across cloud --- +## Table of contents + +- [Development](#development) + - [Local checks before creating a PR](#local-checks-before-creating-a-pr) + - [Install pre-commit hooks (optional)](#install-pre-commit-hooks-optional) + - [Running unit tests](#running-unit-tests) + - [Running integration tests](#running-integration-tests) + +--- + ## Development -See the [kibana contributing guide](https://github.com/elastic/kibana/blob/main/CONTRIBUTING.md) for instructions setting up your development environment. +See the [kibana contributing guide](https://github.com/elastic/kibana/blob/main/CONTRIBUTING.md) for instructions +setting up your development environment. + +### Local checks before creating a PR + +Kibana has a pretty long CI process. +Therefore, we suggest running the following commands locally before creating a PR: + +1. Typescript check: `node_modules/.bin/tsc -b x-pack/plugins/cloud_security_posture/tsconfig.json --pretty` +2. Linter check: `yarn lint:es x-pack/plugins/cloud_security_posture` +3. Unit tests: `yarn jest --config x-pack/plugins/cloud_security_posture/jest.config.js` + +### Install pre-commit hooks (optional) + +We +use [pre-commit](https://docs.elastic.dev/kibana-dev-docs/getting-started/setup-dev-env#install-pre-commit-hook-optional) +to run linters and tests before each commit. To install the pre-commit hooks, run the following command from the root of +the repository: + +```bash +node scripts/register_git_hook +``` + +### Running unit tests + +Our [unit tests](https://docs.elastic.dev/kibana-dev-docs/tutorials/testing-plugins#unit-testing) are written +using [jest](https://jestjs.io/) framework. + +As a convention, we use the `.test.ts` suffix for all our tests. + +You can run all cloud security posture tests with the following command: + +```bash +yarn jest --config x-pack/plugins/cloud_security_posture/jest.config.js +``` + +To run a specific test, you can use the `--testNamePattern` flag: + +```bash +yarn jest --config x-pack/plugins/cloud_security_posture/jest.config.js --testNamePattern=FilePattern -t MyTest +``` + +### Running integration tests + +The cloud security posture plugin has +also [integration tests](https://docs.elastic.dev/kibana-dev-docs/tutorials/testing-plugins#integration-tests) that run +against a real Elasticsearch and Kibana instances. +We use these tests to verify that the plugin works as expected when running in a real environment. +In order to run the integration tests, you need to have a running Elasticsearch and Kibana instances with the +integration test configuration. + +You can run Kibana and Elastic with the integration test configuration by running the following command from the root of +the Kibana repository: + +```bash +node scripts/functional_tests_server.js --config x-pack/test/api_integration/config.ts +``` + +** You should wait until the server is ready to accept connections before running the integration tests. + +Then, in a separate terminal, you can run the integration test. +In order to do so, run the following command: + +``` bash +node scripts/functional_test_runner.js --config x-pack/test/api_integration/config.ts --include=test_file_path +``` \ No newline at end of file From add7d7b881cdf2fa99ab6e7c918e586095af4b35 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 6 Sep 2022 00:42:18 -0400 Subject: [PATCH 13/19] [api-docs] Daily api_docs build (#140047) --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.mdx | 2 +- api_docs/apm.mdx | 2 +- api_docs/banners.mdx | 2 +- api_docs/bfetch.mdx | 2 +- api_docs/canvas.mdx | 2 +- api_docs/cases.mdx | 2 +- api_docs/charts.mdx | 2 +- api_docs/cloud.mdx | 2 +- api_docs/cloud_security_posture.mdx | 2 +- api_docs/console.mdx | 2 +- api_docs/controls.mdx | 2 +- api_docs/core.devdocs.json | 12 ++ api_docs/core.mdx | 2 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.mdx | 2 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.mdx | 2 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- api_docs/data_view_editor.mdx | 2 +- api_docs/data_view_field_editor.mdx | 2 +- api_docs/data_view_management.mdx | 2 +- api_docs/data_views.mdx | 2 +- api_docs/data_visualizer.mdx | 2 +- api_docs/deprecations_by_api.mdx | 4 +- api_docs/deprecations_by_plugin.mdx | 10 +- api_docs/deprecations_by_team.mdx | 4 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.mdx | 2 +- api_docs/expression_partition_vis.mdx | 2 +- api_docs/expression_repeat_image.mdx | 2 +- api_docs/expression_reveal_image.mdx | 2 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.mdx | 2 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/files.devdocs.json | 21 ++- api_docs/files.mdx | 4 +- api_docs/fleet.mdx | 2 +- api_docs/global_search.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_utils.mdx | 2 +- api_docs/kbn_alerts.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_client.mdx | 2 +- ..._analytics_shippers_elastic_v3_browser.mdx | 2 +- ...n_analytics_shippers_elastic_v3_common.mdx | 2 +- ...n_analytics_shippers_elastic_v3_server.mdx | 2 +- api_docs/kbn_analytics_shippers_fullstory.mdx | 2 +- api_docs/kbn_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_synthtrace.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_chart_icons.mdx | 2 +- api_docs/kbn_ci_stats_core.mdx | 2 +- api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +- api_docs/kbn_ci_stats_reporter.mdx | 2 +- api_docs/kbn_cli_dev_mode.mdx | 2 +- api_docs/kbn_coloring.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_mocks.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- api_docs/kbn_core_analytics_browser.mdx | 2 +- .../kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- api_docs/kbn_core_analytics_server.mdx | 2 +- .../kbn_core_analytics_server_internal.mdx | 2 +- api_docs/kbn_core_analytics_server_mocks.mdx | 2 +- api_docs/kbn_core_application_browser.mdx | 2 +- .../kbn_core_application_browser_internal.mdx | 2 +- .../kbn_core_application_browser_mocks.mdx | 2 +- api_docs/kbn_core_application_common.mdx | 2 +- api_docs/kbn_core_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- .../kbn_core_capabilities_browser_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_common.mdx | 2 +- api_docs/kbn_core_capabilities_server.mdx | 2 +- .../kbn_core_capabilities_server_mocks.mdx | 2 +- api_docs/kbn_core_chrome_browser.mdx | 2 +- api_docs/kbn_core_chrome_browser_mocks.mdx | 2 +- api_docs/kbn_core_config_server_internal.mdx | 2 +- api_docs/kbn_core_deprecations_browser.mdx | 2 +- ...kbn_core_deprecations_browser_internal.mdx | 2 +- .../kbn_core_deprecations_browser_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_common.mdx | 2 +- api_docs/kbn_core_deprecations_server.mdx | 2 +- .../kbn_core_deprecations_server_internal.mdx | 2 +- .../kbn_core_deprecations_server_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_browser.mdx | 2 +- api_docs/kbn_core_doc_links_browser_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_server.mdx | 2 +- api_docs/kbn_core_doc_links_server_mocks.mdx | 2 +- ...e_elasticsearch_client_server_internal.mdx | 2 +- ...core_elasticsearch_client_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_server.mdx | 2 +- ...kbn_core_elasticsearch_server_internal.mdx | 2 +- .../kbn_core_elasticsearch_server_mocks.mdx | 2 +- .../kbn_core_environment_server_internal.mdx | 2 +- .../kbn_core_environment_server_mocks.mdx | 2 +- .../kbn_core_execution_context_browser.mdx | 2 +- ...ore_execution_context_browser_internal.mdx | 2 +- ...n_core_execution_context_browser_mocks.mdx | 2 +- .../kbn_core_execution_context_common.mdx | 2 +- .../kbn_core_execution_context_server.mdx | 2 +- ...core_execution_context_server_internal.mdx | 2 +- ...bn_core_execution_context_server_mocks.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser.mdx | 2 +- .../kbn_core_fatal_errors_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_browser.mdx | 2 +- api_docs/kbn_core_http_browser_internal.mdx | 2 +- api_docs/kbn_core_http_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_common.mdx | 2 +- .../kbn_core_http_context_server_mocks.mdx | 2 +- .../kbn_core_http_router_server_internal.mdx | 2 +- .../kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.mdx | 2 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.mdx | 2 +- api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +- api_docs/kbn_core_i18n_server.mdx | 2 +- api_docs/kbn_core_i18n_server_internal.mdx | 2 +- api_docs/kbn_core_i18n_server_mocks.mdx | 2 +- .../kbn_core_injected_metadata_browser.mdx | 2 +- ...n_core_injected_metadata_browser_mocks.mdx | 2 +- ...kbn_core_integrations_browser_internal.mdx | 2 +- .../kbn_core_integrations_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_server.mdx | 2 +- api_docs/kbn_core_logging_server_internal.mdx | 2 +- api_docs/kbn_core_logging_server_mocks.mdx | 2 +- ...ore_metrics_collectors_server_internal.mdx | 2 +- ...n_core_metrics_collectors_server_mocks.mdx | 2 +- api_docs/kbn_core_metrics_server.mdx | 2 +- api_docs/kbn_core_metrics_server_internal.mdx | 2 +- api_docs/kbn_core_metrics_server_mocks.mdx | 2 +- api_docs/kbn_core_mount_utils_browser.mdx | 2 +- api_docs/kbn_core_node_server.mdx | 2 +- api_docs/kbn_core_node_server_internal.mdx | 2 +- api_docs/kbn_core_node_server_mocks.mdx | 2 +- api_docs/kbn_core_notifications_browser.mdx | 2 +- ...bn_core_notifications_browser_internal.mdx | 2 +- .../kbn_core_notifications_browser_mocks.mdx | 2 +- api_docs/kbn_core_overlays_browser.mdx | 2 +- .../kbn_core_overlays_browser_internal.mdx | 2 +- api_docs/kbn_core_overlays_browser_mocks.mdx | 2 +- api_docs/kbn_core_preboot_server.mdx | 2 +- api_docs/kbn_core_preboot_server_mocks.mdx | 2 +- .../kbn_core_saved_objects_api_browser.mdx | 2 +- .../kbn_core_saved_objects_api_server.mdx | 2 +- ...core_saved_objects_api_server_internal.mdx | 2 +- ...bn_core_saved_objects_api_server_mocks.mdx | 2 +- ...ore_saved_objects_base_server_internal.mdx | 2 +- ...n_core_saved_objects_base_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_browser.mdx | 2 +- ...bn_core_saved_objects_browser_internal.mdx | 2 +- .../kbn_core_saved_objects_browser_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_common.mdx | 2 +- ..._objects_import_export_server_internal.mdx | 2 +- ...ved_objects_import_export_server_mocks.mdx | 2 +- ...aved_objects_migration_server_internal.mdx | 2 +- ...e_saved_objects_migration_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_server.mdx | 2 +- ...kbn_core_saved_objects_server_internal.mdx | 2 +- .../kbn_core_saved_objects_server_mocks.mdx | 2 +- .../kbn_core_saved_objects_utils_server.mdx | 2 +- ...core_test_helpers_deprecations_getters.mdx | 2 +- ...n_core_test_helpers_http_setup_browser.mdx | 2 +- api_docs/kbn_core_theme_browser.mdx | 2 +- api_docs/kbn_core_theme_browser_internal.mdx | 2 +- api_docs/kbn_core_theme_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_browser.mdx | 2 +- .../kbn_core_ui_settings_browser_internal.mdx | 2 +- .../kbn_core_ui_settings_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_common.mdx | 2 +- api_docs/kbn_core_usage_data_server.mdx | 2 +- ...re_usage_data_server_internal.devdocs.json | 171 +++++++++++++++++ .../kbn_core_usage_data_server_internal.mdx | 30 +++ ..._core_usage_data_server_mocks.devdocs.json | 173 ++++++++++++++++++ api_docs/kbn_core_usage_data_server_mocks.mdx | 30 +++ api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_ebt_tools.mdx | 2 +- api_docs/kbn_es_archiver.mdx | 2 +- api_docs/kbn_es_errors.mdx | 2 +- api_docs/kbn_es_query.mdx | 2 +- api_docs/kbn_eslint_plugin_imports.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_get_repo_files.mdx | 2 +- api_docs/kbn_handlebars.mdx | 2 +- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_home_sample_data_card.mdx | 2 +- api_docs/kbn_home_sample_data_tab.mdx | 2 +- api_docs/kbn_i18n.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_kibana_manifest_parser.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_repo_source_classifier.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- .../kbn_securitysolution_autocomplete.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- api_docs/kbn_securitysolution_hook_utils.mdx | 2 +- ..._securitysolution_io_ts_alerting_types.mdx | 2 +- .../kbn_securitysolution_io_ts_list_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_utils.mdx | 2 +- api_docs/kbn_securitysolution_list_api.mdx | 2 +- .../kbn_securitysolution_list_constants.mdx | 2 +- api_docs/kbn_securitysolution_list_hooks.mdx | 2 +- api_docs/kbn_securitysolution_list_utils.mdx | 2 +- api_docs/kbn_securitysolution_rules.mdx | 2 +- api_docs/kbn_securitysolution_t_grid.mdx | 2 +- api_docs/kbn_securitysolution_utils.mdx | 2 +- api_docs/kbn_server_http_tools.mdx | 2 +- api_docs/kbn_server_route_repository.mdx | 2 +- api_docs/kbn_shared_svg.mdx | 2 +- ...hared_ux_button_exit_full_screen_mocks.mdx | 2 +- api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_link_redirect_app_mocks.mdx | 2 +- .../kbn_shared_ux_page_analytics_no_data.mdx | 2 +- ...shared_ux_page_analytics_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_no_data.mdx | 2 +- ...bn_shared_ux_page_kibana_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_template.mdx | 2 +- ...n_shared_ux_page_kibana_template_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data.mdx | 2 +- .../kbn_shared_ux_page_no_data_config.mdx | 2 +- ...bn_shared_ux_page_no_data_config_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_solution_nav.mdx | 2 +- .../kbn_shared_ux_prompt_no_data_views.mdx | 2 +- ...n_shared_ux_prompt_no_data_views_mocks.mdx | 2 +- api_docs/kbn_shared_ux_storybook_config.mdx | 2 +- api_docs/kbn_shared_ux_storybook_mock.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_sort_package_json.mdx | 2 +- api_docs/kbn_std.devdocs.json | 78 +++++++- api_docs/kbn_std.mdx | 7 +- api_docs/kbn_stdio_dev_helpers.mdx | 2 +- api_docs/kbn_storybook.mdx | 2 +- api_docs/kbn_telemetry_tools.mdx | 2 +- api_docs/kbn_test.mdx | 2 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_type_summarizer.mdx | 2 +- api_docs/kbn_type_summarizer_core.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_user_profile_components.mdx | 2 +- api_docs/kbn_utility_types.mdx | 2 +- api_docs/kbn_utility_types_jest.mdx | 2 +- api_docs/kbn_utils.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.mdx | 2 +- api_docs/kibana_utils.mdx | 2 +- api_docs/kubernetes_security.mdx | 2 +- api_docs/lens.mdx | 2 +- api_docs/license_api_guard.mdx | 2 +- api_docs/license_management.mdx | 2 +- api_docs/licensing.mdx | 2 +- api_docs/lists.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.mdx | 2 +- api_docs/ml.mdx | 2 +- api_docs/monitoring.mdx | 2 +- api_docs/monitoring_collection.mdx | 2 +- api_docs/navigation.mdx | 2 +- api_docs/newsfeed.mdx | 2 +- api_docs/observability.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/plugin_directory.mdx | 12 +- api_docs/presentation_util.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.mdx | 2 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.mdx | 2 +- api_docs/saved_objects_finder.mdx | 2 +- api_docs/saved_objects_management.mdx | 2 +- api_docs/saved_objects_tagging.mdx | 2 +- api_docs/saved_objects_tagging_oss.mdx | 2 +- api_docs/saved_search.mdx | 2 +- api_docs/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/security.mdx | 2 +- api_docs/security_solution.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.mdx | 2 +- api_docs/snapshot_restore.mdx | 2 +- api_docs/spaces.mdx | 2 +- api_docs/stack_alerts.mdx | 2 +- api_docs/task_manager.mdx | 2 +- api_docs/telemetry.mdx | 2 +- api_docs/telemetry_collection_manager.mdx | 2 +- api_docs/telemetry_collection_xpack.mdx | 2 +- api_docs/telemetry_management_section.mdx | 2 +- api_docs/threat_intelligence.mdx | 2 +- api_docs/timelines.mdx | 2 +- api_docs/transform.mdx | 2 +- api_docs/triggers_actions_ui.mdx | 2 +- api_docs/ui_actions.mdx | 2 +- api_docs/ui_actions_enhanced.mdx | 2 +- api_docs/unified_field_list.mdx | 2 +- api_docs/unified_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/url_forwarding.mdx | 2 +- api_docs/usage_collection.mdx | 2 +- api_docs/ux.mdx | 2 +- api_docs/vis_default_editor.mdx | 2 +- api_docs/vis_type_gauge.mdx | 2 +- api_docs/vis_type_heatmap.mdx | 2 +- api_docs/vis_type_pie.mdx | 2 +- api_docs/vis_type_table.mdx | 2 +- api_docs/vis_type_timelion.mdx | 2 +- api_docs/vis_type_timeseries.mdx | 2 +- api_docs/vis_type_vega.mdx | 2 +- api_docs/vis_type_vislib.mdx | 2 +- api_docs/vis_type_xy.mdx | 2 +- api_docs/visualizations.mdx | 2 +- 380 files changed, 907 insertions(+), 383 deletions(-) create mode 100644 api_docs/kbn_core_usage_data_server_internal.devdocs.json create mode 100644 api_docs/kbn_core_usage_data_server_internal.mdx create mode 100644 api_docs/kbn_core_usage_data_server_mocks.devdocs.json create mode 100644 api_docs/kbn_core_usage_data_server_mocks.mdx diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index fd159586d1394..0e3c26c64fa6b 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github description: API docs for the actions plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.devdocs.json'; diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index e8c147d3251fa..44f6e2ebbb5c3 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index bba4554bee566..082d6130630c3 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github description: API docs for the aiops plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index 077495a14b13c..b6e7a122b99d8 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github description: API docs for the alerting plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index 4a87a009eb3f2..4e114e6ce7d9d 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github description: API docs for the apm plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index a16267ba36e6f..b35e46e031865 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github description: API docs for the banners plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners'] --- import bannersObj from './banners.devdocs.json'; diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx index 12bfadbc6983d..0f57ba70b9999 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github description: API docs for the bfetch plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch'] --- import bfetchObj from './bfetch.devdocs.json'; diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx index 511fb6d718b45..1089cd897c6b7 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github description: API docs for the canvas plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] --- import canvasObj from './canvas.devdocs.json'; diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index afae89f5e215c..bae623080dd49 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github description: API docs for the cases plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.devdocs.json'; diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index 9914b389bcd12..119f98090c69c 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github description: API docs for the charts plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] --- import chartsObj from './charts.devdocs.json'; diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index 7aead5b437507..5b3e4e0cbf942 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github description: API docs for the cloud plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index 89fca19c761cd..3e8905668c8d4 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudSecurityPosture plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture'] --- import cloudSecurityPostureObj from './cloud_security_posture.devdocs.json'; diff --git a/api_docs/console.mdx b/api_docs/console.mdx index a537cfc353e26..9c4fd3cc41fa2 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github description: API docs for the console plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index ba26efb1724ff..20457823815f1 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github description: API docs for the controls plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/core.devdocs.json b/api_docs/core.devdocs.json index a2e9624061590..4eedd0e32153e 100644 --- a/api_docs/core.devdocs.json +++ b/api_docs/core.devdocs.json @@ -33526,6 +33526,18 @@ "plugin": "@kbn/core-metrics-server-internal", "path": "packages/core/metrics/core-metrics-server-internal/src/logging/get_ops_metrics_log.ts" }, + { + "plugin": "@kbn/core-usage-data-server-internal", + "path": "packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts" + }, + { + "plugin": "@kbn/core-usage-data-server-internal", + "path": "packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts" + }, + { + "plugin": "@kbn/core-usage-data-server-internal", + "path": "packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts" + }, { "plugin": "@kbn/core-metrics-server-internal", "path": "packages/core/metrics/core-metrics-server-internal/src/logging/get_ops_metrics_log.test.ts" diff --git a/api_docs/core.mdx b/api_docs/core.mdx index eb65d083535d0..b6ad920381910 100644 --- a/api_docs/core.mdx +++ b/api_docs/core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/core title: "core" image: https://source.unsplash.com/400x175/?github description: API docs for the core plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core'] --- import coreObj from './core.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 6a37d9fbfd101..fdf8aa7725835 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github description: API docs for the customIntegrations plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index 642275cd67aac..65c57db79c2af 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboard plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index 5e26707389312..aa2aa87ee52a7 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboardEnhanced plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.mdx b/api_docs/data.mdx index 5fac8adb791c2..99552239dbef9 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github description: API docs for the data plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index a9911d5e38323..d6720e43f79a0 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github description: API docs for the data.query plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index ba61613880798..f14af11637017 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github description: API docs for the data.search plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index e592a8a1ca832..fc634e4d510b6 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewEditor plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] --- import dataViewEditorObj from './data_view_editor.devdocs.json'; diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index b9d7a398467f9..c6c3f2195b0d4 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewFieldEditor plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor'] --- import dataViewFieldEditorObj from './data_view_field_editor.devdocs.json'; diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx index c01cf995f9029..d1bd53a5b473d 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewManagement plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 8a0eba9b9f425..36572e12aa0fb 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViews plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index bade0c329b102..e4d5440bfdc62 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github description: API docs for the dataVisualizer plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index 9db1cb901a31d..2787cf4d1e205 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -75,7 +75,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | savedObjectsTaggingOss, dashboard | 8.8.0 | | | dashboard | 8.8.0 | | | maps, dashboard, @kbn/core-saved-objects-migration-server-internal | 8.8.0 | -| | monitoring, kibanaUsageCollection, @kbn/core-metrics-server-internal | 8.8.0 | +| | monitoring, kibanaUsageCollection, @kbn/core-metrics-server-internal, @kbn/core-usage-data-server-internal | 8.8.0 | | | security, fleet | 8.8.0 | | | security, fleet | 8.8.0 | | | security, fleet | 8.8.0 | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index f50b5b3c13eac..97608bb1d2beb 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -70,6 +70,14 @@ so TS and code-reference navigation might not highlight them. | +## @kbn/core-usage-data-server-internal + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [core_usage_data_service.ts](https://github.com/elastic/kibana/tree/master/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts#:~:text=process), [core_usage_data_service.ts](https://github.com/elastic/kibana/tree/master/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts#:~:text=process), [core_usage_data_service.ts](https://github.com/elastic/kibana/tree/master/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts#:~:text=process) | 8.8.0 | + + + ## actions | Deprecated API | Reference location(s) | Remove By | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 5bd81a70f0649..52bc8fb97533a 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team description: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -80,7 +80,7 @@ so TS and code-reference navigation might not highlight them. | Note to maintainers: when looking at usages, mind that typical use could be inside a `catch` block, so TS and code-reference navigation might not highlight them. | | @kbn/core-saved-objects-migration-server-internal | | [document_migrator.test.ts](https://github.com/elastic/kibana/tree/master/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/document_migrator.test.ts#:~:text=warning), [migration_logger.ts](https://github.com/elastic/kibana/tree/master/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/migration_logger.ts#:~:text=warning) | 8.8.0 | -| @kbn/core-metrics-server-internal | | [ops_metrics_collector.ts](https://github.com/elastic/kibana/tree/master/packages/core/metrics/core-metrics-server-internal/src/ops_metrics_collector.ts#:~:text=process), [get_ops_metrics_log.ts](https://github.com/elastic/kibana/tree/master/packages/core/metrics/core-metrics-server-internal/src/logging/get_ops_metrics_log.ts#:~:text=process), [get_ops_metrics_log.test.ts](https://github.com/elastic/kibana/tree/master/packages/core/metrics/core-metrics-server-internal/src/logging/get_ops_metrics_log.test.ts#:~:text=process) | 8.8.0 | +| @kbn/core-metrics-server-internal | | [ops_metrics_collector.ts](https://github.com/elastic/kibana/tree/master/packages/core/metrics/core-metrics-server-internal/src/ops_metrics_collector.ts#:~:text=process), [get_ops_metrics_log.ts](https://github.com/elastic/kibana/tree/master/packages/core/metrics/core-metrics-server-internal/src/logging/get_ops_metrics_log.ts#:~:text=process), [get_ops_metrics_log.test.ts](https://github.com/elastic/kibana/tree/master/packages/core/metrics/core-metrics-server-internal/src/logging/get_ops_metrics_log.test.ts#:~:text=process), [core_usage_data_service.ts](https://github.com/elastic/kibana/tree/master/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts#:~:text=process), [core_usage_data_service.ts](https://github.com/elastic/kibana/tree/master/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts#:~:text=process), [core_usage_data_service.ts](https://github.com/elastic/kibana/tree/master/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts#:~:text=process) | 8.8.0 | diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index cd20de4016f66..0873f90539744 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github description: API docs for the devTools plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index becc1a323b489..f3620385ddcae 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github description: API docs for the discover plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] --- import discoverObj from './discover.devdocs.json'; diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index a2d7a07ae49a5..11b53e7d81f85 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverEnhanced plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 1393f240b688c..9e302d3ec385f 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddable plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] --- import embeddableObj from './embeddable.devdocs.json'; diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index a5a4d99cd995f..f83fd634dea26 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddableEnhanced plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced'] --- import embeddableEnhancedObj from './embeddable_enhanced.devdocs.json'; diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx index 3ce9a0ec247ad..ff50fc4962b25 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the encryptedSavedObjects plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] --- import encryptedSavedObjectsObj from './encrypted_saved_objects.devdocs.json'; diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index f7e1687260975..2f4a97083f119 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 22e67fffb1b9d..aea9650756ddc 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github description: API docs for the esUiShared plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index b129e7b45acfd..2b74a26ae25c4 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotation plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index a5f3cdbd69668..6b34c4088e9ae 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github description: API docs for the eventLog plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index 4afc972974d27..ff4979afd3ce7 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionError plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] --- import expressionErrorObj from './expression_error.devdocs.json'; diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index 140651b1cd629..750366930004f 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionGauge plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] --- import expressionGaugeObj from './expression_gauge.devdocs.json'; diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index 79658f01632eb..a58b72f20bf77 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionHeatmap plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap'] --- import expressionHeatmapObj from './expression_heatmap.devdocs.json'; diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx index 9a5e2cd685e68..54fcdd0bde2a4 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionImage plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage'] --- import expressionImageObj from './expression_image.devdocs.json'; diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx index 980c44172b913..7964d4d21c4c3 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionLegacyMetricVis plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionLegacyMetricVis'] --- import expressionLegacyMetricVisObj from './expression_legacy_metric_vis.devdocs.json'; diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx index 4bed9d1bd26fe..cece7f9474b8b 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetric plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] --- import expressionMetricObj from './expression_metric.devdocs.json'; diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index 77d45f83b6c25..fbfa28ccf68c7 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetricVis plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis'] --- import expressionMetricVisObj from './expression_metric_vis.devdocs.json'; diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx index ba0de1a06fe7d..d063673a50c14 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionPartitionVis plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis'] --- import expressionPartitionVisObj from './expression_partition_vis.devdocs.json'; diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx index 09fffe72b458f..2b6681ae06216 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRepeatImage plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage'] --- import expressionRepeatImageObj from './expression_repeat_image.devdocs.json'; diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx index 6b937d1fc421b..c93ab7f345bc4 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRevealImage plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] --- import expressionRevealImageObj from './expression_reveal_image.devdocs.json'; diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index 6e09d6d3e27af..ac98185499d10 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionShape plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape'] --- import expressionShapeObj from './expression_shape.devdocs.json'; diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx index b1eb05d85b946..daaad8d675c9c 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionTagcloud plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index 3090e2ca5ae36..5ebc4a9811f32 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionXY plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] --- import expressionXYObj from './expression_x_y.devdocs.json'; diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index dd9f2dd9ca414..e10f5c5cbe402 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github description: API docs for the expressions plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.devdocs.json'; diff --git a/api_docs/features.mdx b/api_docs/features.mdx index bdc8e583f61a1..1776e4a6585bf 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github description: API docs for the features plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] --- import featuresObj from './features.devdocs.json'; diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index bf827c90f00d7..d5aed3858f71a 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldFormats plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index 504dc53aac8ad..c283935c62f52 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github description: API docs for the fileUpload plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] --- import fileUploadObj from './file_upload.devdocs.json'; diff --git a/api_docs/files.devdocs.json b/api_docs/files.devdocs.json index 01bbe08995866..e1e4ab817f839 100644 --- a/api_docs/files.devdocs.json +++ b/api_docs/files.devdocs.json @@ -5063,7 +5063,9 @@ "signature": [ "(content: ", "Readable", - ") => Promise<", + ", abort$?: ", + "Observable", + " | undefined) => Promise<", { "pluginId": "files", "scope": "common", @@ -5091,6 +5093,23 @@ "path": "x-pack/plugins/files/common/types.ts", "deprecated": false, "isRequired": true + }, + { + "parentPluginId": "files", + "id": "def-common.File.uploadContent.$2", + "type": "Object", + "tags": [], + "label": "abort$", + "description": [ + "- An observable that can be used to abort the upload at any time." + ], + "signature": [ + "Observable", + " | undefined" + ], + "path": "x-pack/plugins/files/common/types.ts", + "deprecated": false, + "isRequired": false } ], "returnComment": [] diff --git a/api_docs/files.mdx b/api_docs/files.mdx index 239c2196e6633..46d4068ca249f 100644 --- a/api_docs/files.mdx +++ b/api_docs/files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files title: "files" image: https://source.unsplash.com/400x175/?github description: API docs for the files plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-app-services](https://github.com/orgs/elastic/teams/tea | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 243 | 0 | 6 | 2 | +| 244 | 0 | 6 | 2 | ## Client diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index a91815e1237e8..cfd98cbe95dc6 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the fleet plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index 6103a7b82ab4b..ab12dca075c19 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the globalSearch plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch'] --- import globalSearchObj from './global_search.devdocs.json'; diff --git a/api_docs/home.mdx b/api_docs/home.mdx index a7a4e2c588e7b..55e90c0516af2 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index b5ad96a5f2a19..de87d26f24bf2 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexLifecycleManagement plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] --- import indexLifecycleManagementObj from './index_lifecycle_management.devdocs.json'; diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index 270b8a847f2a5..3c324136f039e 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexManagement plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 7b5c9c58bda66..939d4b806fb0b 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github description: API docs for the infra plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index bf4099a93cda9..3acad0bdb0c5b 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the inspector plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index fada03848b9cf..2ada44f7c245e 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github description: API docs for the interactiveSetup plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index ad1e1862df361..dce075233c681 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ace plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index eb40373a982c1..8fe2e18f681e4 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-components plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_utils.mdx b/api_docs/kbn_aiops_utils.mdx index 8c607c84520a7..35adae134ef06 100644 --- a/api_docs/kbn_aiops_utils.mdx +++ b/api_docs/kbn_aiops_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-utils title: "@kbn/aiops-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-utils plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils'] --- import kbnAiopsUtilsObj from './kbn_aiops_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts.mdx b/api_docs/kbn_alerts.mdx index ea63d7589fc45..6be99347740b7 100644 --- a/api_docs/kbn_alerts.mdx +++ b/api_docs/kbn_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts title: "@kbn/alerts" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts'] --- import kbnAlertsObj from './kbn_alerts.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index 8198f9302590e..26b13591e0df1 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index 62ed5ab1ae750..eb9dd53dad393 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-client plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index 1795ffeb73cb2..cf097f3adea04 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser title: "@kbn/analytics-shippers-elastic-v3-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-browser'] --- import kbnAnalyticsShippersElasticV3BrowserObj from './kbn_analytics_shippers_elastic_v3_browser.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx index f888bba14b79e..f5a13ef20025c 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common title: "@kbn/analytics-shippers-elastic-v3-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-common'] --- import kbnAnalyticsShippersElasticV3CommonObj from './kbn_analytics_shippers_elastic_v3_common.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx index 68ae12af77e72..0b4ace5c97070 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server title: "@kbn/analytics-shippers-elastic-v3-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server'] --- import kbnAnalyticsShippersElasticV3ServerObj from './kbn_analytics_shippers_elastic_v3_server.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx index 42723f81eee51..2a43b4ad73fd1 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] --- import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 3dc263cc741db..41d191bffce76 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-config-loader plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index fd8d3a5798e80..4f40b0e9ba98b 100644 --- a/api_docs/kbn_apm_synthtrace.mdx +++ b/api_docs/kbn_apm_synthtrace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace title: "@kbn/apm-synthtrace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 605cde20f7a0c..227a95bbdc22e 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-utils plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index 5c9b60a3fd900..b2ffd9c43784b 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/axe-config plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index 5ad4a4144f792..858efed44444c 100644 --- a/api_docs/kbn_chart_icons.mdx +++ b/api_docs/kbn_chart_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons title: "@kbn/chart-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-icons plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-icons'] --- import kbnChartIconsObj from './kbn_chart_icons.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_core.mdx b/api_docs/kbn_ci_stats_core.mdx index 5eabeb9f04706..402bf52a1f22f 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-core plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-core'] --- import kbnCiStatsCoreObj from './kbn_ci_stats_core.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_performance_metrics.mdx b/api_docs/kbn_ci_stats_performance_metrics.mdx index 3332fa7884c1d..5968959cd3961 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-performance-metrics'] --- import kbnCiStatsPerformanceMetricsObj from './kbn_ci_stats_performance_metrics.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_reporter.mdx b/api_docs/kbn_ci_stats_reporter.mdx index dc5e8c79acab8..97e4463e24e0c 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-reporter plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-reporter'] --- import kbnCiStatsReporterObj from './kbn_ci_stats_reporter.devdocs.json'; diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx index fd34dab65f093..5f71bc4cde520 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cli-dev-mode plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 4101d97d0ec4d..6a345a79bc6c4 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/coloring plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring'] --- import kbnColoringObj from './kbn_coloring.devdocs.json'; diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx index 746a5597925b1..293f300c3b260 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] --- import kbnConfigObj from './kbn_config.devdocs.json'; diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index 8b824f59c015e..f763976f6427b 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] --- import kbnConfigMocksObj from './kbn_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index 91e6c6678e960..1047ba87b6643 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-schema plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 11517290237d5..77444ae7f6a05 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser'] --- import kbnCoreAnalyticsBrowserObj from './kbn_core_analytics_browser.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx index 2e9299cd6baf0..5ac4b3104f341 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal'] --- import kbnCoreAnalyticsBrowserInternalObj from './kbn_core_analytics_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx index 9b85445dbd003..01e1c13a9fd76 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] --- import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index 14ee4919b6014..514ed035def29 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server'] --- import kbnCoreAnalyticsServerObj from './kbn_core_analytics_server.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx index efd24de4dc261..4d02dee208b91 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal'] --- import kbnCoreAnalyticsServerInternalObj from './kbn_core_analytics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx index dc16cc9b5b539..b68bbadb1b949 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] --- import kbnCoreAnalyticsServerMocksObj from './kbn_core_analytics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx index f46981e8a2324..9e0a126f80542 100644 --- a/api_docs/kbn_core_application_browser.mdx +++ b/api_docs/kbn_core_application_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser title: "@kbn/core-application-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser'] --- import kbnCoreApplicationBrowserObj from './kbn_core_application_browser.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_internal.mdx b/api_docs/kbn_core_application_browser_internal.mdx index df7e0d2a9ec2f..ebb267f8b9dc8 100644 --- a/api_docs/kbn_core_application_browser_internal.mdx +++ b/api_docs/kbn_core_application_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal title: "@kbn/core-application-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-internal'] --- import kbnCoreApplicationBrowserInternalObj from './kbn_core_application_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_mocks.mdx b/api_docs/kbn_core_application_browser_mocks.mdx index 9b2d6dd168399..aa6cf87a21193 100644 --- a/api_docs/kbn_core_application_browser_mocks.mdx +++ b/api_docs/kbn_core_application_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks title: "@kbn/core-application-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-mocks'] --- import kbnCoreApplicationBrowserMocksObj from './kbn_core_application_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_common.mdx b/api_docs/kbn_core_application_common.mdx index 3eb490e8495b4..b7a0df2ff0356 100644 --- a/api_docs/kbn_core_application_common.mdx +++ b/api_docs/kbn_core_application_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common title: "@kbn/core-application-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-common plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-common'] --- import kbnCoreApplicationCommonObj from './kbn_core_application_common.devdocs.json'; diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index 23b7115cc6c75..2cf240d31d76f 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-browser-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-browser-mocks'] --- import kbnCoreBaseBrowserMocksObj from './kbn_core_base_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_base_common.mdx b/api_docs/kbn_core_base_common.mdx index ea484edd1e612..82457300e0524 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-common plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-common'] --- import kbnCoreBaseCommonObj from './kbn_core_base_common.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_internal.mdx b/api_docs/kbn_core_base_server_internal.mdx index eb7393556f063..5c75439893d98 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-internal'] --- import kbnCoreBaseServerInternalObj from './kbn_core_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_mocks.mdx b/api_docs/kbn_core_base_server_mocks.mdx index 242026e8a64d4..72020ac2bcd34 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-mocks'] --- import kbnCoreBaseServerMocksObj from './kbn_core_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_browser_mocks.mdx b/api_docs/kbn_core_capabilities_browser_mocks.mdx index c0f81de5033ea..afe35769d50b1 100644 --- a/api_docs/kbn_core_capabilities_browser_mocks.mdx +++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks title: "@kbn/core-capabilities-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-browser-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-browser-mocks'] --- import kbnCoreCapabilitiesBrowserMocksObj from './kbn_core_capabilities_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_common.mdx b/api_docs/kbn_core_capabilities_common.mdx index 1dbf215025d8c..762be5fb47ecc 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-common plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-common'] --- import kbnCoreCapabilitiesCommonObj from './kbn_core_capabilities_common.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server.mdx b/api_docs/kbn_core_capabilities_server.mdx index 8c001d9c448a4..1c58618bae110 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server'] --- import kbnCoreCapabilitiesServerObj from './kbn_core_capabilities_server.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server_mocks.mdx b/api_docs/kbn_core_capabilities_server_mocks.mdx index 05acb611809e0..eea481cff9efc 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks'] --- import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index d565769a0e368..3fa5ef98dce64 100644 --- a/api_docs/kbn_core_chrome_browser.mdx +++ b/api_docs/kbn_core_chrome_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser title: "@kbn/core-chrome-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser'] --- import kbnCoreChromeBrowserObj from './kbn_core_chrome_browser.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser_mocks.mdx b/api_docs/kbn_core_chrome_browser_mocks.mdx index be2bfabe18faa..923481e4ccd64 100644 --- a/api_docs/kbn_core_chrome_browser_mocks.mdx +++ b/api_docs/kbn_core_chrome_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks title: "@kbn/core-chrome-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser-mocks'] --- import kbnCoreChromeBrowserMocksObj from './kbn_core_chrome_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_config_server_internal.mdx b/api_docs/kbn_core_config_server_internal.mdx index 51726a44bcdf1..2c2bf980a2122 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-config-server-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] --- import kbnCoreConfigServerInternalObj from './kbn_core_config_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index b92f4d129337e..63c057fa342a6 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser'] --- import kbnCoreDeprecationsBrowserObj from './kbn_core_deprecations_browser.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx index e8f8aefb2dcba..b1d80d415129e 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-internal'] --- import kbnCoreDeprecationsBrowserInternalObj from './kbn_core_deprecations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_mocks.mdx b/api_docs/kbn_core_deprecations_browser_mocks.mdx index e33e001b3d7e3..2d18319a276b3 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-mocks'] --- import kbnCoreDeprecationsBrowserMocksObj from './kbn_core_deprecations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_common.mdx b/api_docs/kbn_core_deprecations_common.mdx index 16ea53a84a35f..b4deab8346f2f 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-common plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-common'] --- import kbnCoreDeprecationsCommonObj from './kbn_core_deprecations_common.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server.mdx b/api_docs/kbn_core_deprecations_server.mdx index 797c8710a4854..06dec051aa6f7 100644 --- a/api_docs/kbn_core_deprecations_server.mdx +++ b/api_docs/kbn_core_deprecations_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server title: "@kbn/core-deprecations-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server'] --- import kbnCoreDeprecationsServerObj from './kbn_core_deprecations_server.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_internal.mdx b/api_docs/kbn_core_deprecations_server_internal.mdx index 1a8f03748613b..56a00817b13a9 100644 --- a/api_docs/kbn_core_deprecations_server_internal.mdx +++ b/api_docs/kbn_core_deprecations_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal title: "@kbn/core-deprecations-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-internal'] --- import kbnCoreDeprecationsServerInternalObj from './kbn_core_deprecations_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_mocks.mdx b/api_docs/kbn_core_deprecations_server_mocks.mdx index 811c353240bdd..60aecf7424070 100644 --- a/api_docs/kbn_core_deprecations_server_mocks.mdx +++ b/api_docs/kbn_core_deprecations_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks title: "@kbn/core-deprecations-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-mocks'] --- import kbnCoreDeprecationsServerMocksObj from './kbn_core_deprecations_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser.mdx b/api_docs/kbn_core_doc_links_browser.mdx index 13b8628d0aa52..ee9d22702424b 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser'] --- import kbnCoreDocLinksBrowserObj from './kbn_core_doc_links_browser.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser_mocks.mdx b/api_docs/kbn_core_doc_links_browser_mocks.mdx index 41c5659acb7d5..a07efab80f14b 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks title: "@kbn/core-doc-links-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser-mocks'] --- import kbnCoreDocLinksBrowserMocksObj from './kbn_core_doc_links_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server.mdx b/api_docs/kbn_core_doc_links_server.mdx index 41ca0a2030dda..a8989f6957230 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server'] --- import kbnCoreDocLinksServerObj from './kbn_core_doc_links_server.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server_mocks.mdx b/api_docs/kbn_core_doc_links_server_mocks.mdx index 7b9d8863990e5..2b0274399ae1f 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks title: "@kbn/core-doc-links-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server-mocks'] --- import kbnCoreDocLinksServerMocksObj from './kbn_core_doc_links_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx index 25d6956065b73..9fa17a347e6e0 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal title: "@kbn/core-elasticsearch-client-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal'] --- import kbnCoreElasticsearchClientServerInternalObj from './kbn_core_elasticsearch_client_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx index 7508f4967be7a..23dc5d40c40ce 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks title: "@kbn/core-elasticsearch-client-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks'] --- import kbnCoreElasticsearchClientServerMocksObj from './kbn_core_elasticsearch_client_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx index 2ee2bd1b32c26..e51873a4ffe4c 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server'] --- import kbnCoreElasticsearchServerObj from './kbn_core_elasticsearch_server.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx index b073fa10c1fc1..a2947b7d28466 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-internal'] --- import kbnCoreElasticsearchServerInternalObj from './kbn_core_elasticsearch_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_server_mocks.mdx index afd9f96edd1fc..48c485334349e 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-mocks'] --- import kbnCoreElasticsearchServerMocksObj from './kbn_core_elasticsearch_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_internal.mdx b/api_docs/kbn_core_environment_server_internal.mdx index 17c755f1b3da4..89ebe82053604 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-internal'] --- import kbnCoreEnvironmentServerInternalObj from './kbn_core_environment_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_mocks.mdx b/api_docs/kbn_core_environment_server_mocks.mdx index 242fffe768385..dad8a14043fae 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-mocks'] --- import kbnCoreEnvironmentServerMocksObj from './kbn_core_environment_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser.mdx b/api_docs/kbn_core_execution_context_browser.mdx index 632c8dc42ff55..8724bf34779ad 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser'] --- import kbnCoreExecutionContextBrowserObj from './kbn_core_execution_context_browser.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_internal.mdx b/api_docs/kbn_core_execution_context_browser_internal.mdx index 6cf56a4e0935d..5008328a2b6ef 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal title: "@kbn/core-execution-context-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-internal'] --- import kbnCoreExecutionContextBrowserInternalObj from './kbn_core_execution_context_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_mocks.mdx b/api_docs/kbn_core_execution_context_browser_mocks.mdx index 0f08d61188f92..e5a186c7fafc1 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks title: "@kbn/core-execution-context-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-mocks'] --- import kbnCoreExecutionContextBrowserMocksObj from './kbn_core_execution_context_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_common.mdx b/api_docs/kbn_core_execution_context_common.mdx index 240e08ba655da..602b4baf794fa 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-common plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-common'] --- import kbnCoreExecutionContextCommonObj from './kbn_core_execution_context_common.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server.mdx b/api_docs/kbn_core_execution_context_server.mdx index 6189b5d0badec..cef1df0e4ed92 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server'] --- import kbnCoreExecutionContextServerObj from './kbn_core_execution_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_internal.mdx b/api_docs/kbn_core_execution_context_server_internal.mdx index 10955fdbf2ac2..38f8fc08be9f5 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal title: "@kbn/core-execution-context-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-internal'] --- import kbnCoreExecutionContextServerInternalObj from './kbn_core_execution_context_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_mocks.mdx b/api_docs/kbn_core_execution_context_server_mocks.mdx index cde6a0af36494..36f42437d1100 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks title: "@kbn/core-execution-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-mocks'] --- import kbnCoreExecutionContextServerMocksObj from './kbn_core_execution_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser.mdx b/api_docs/kbn_core_fatal_errors_browser.mdx index 9b6c7182ff689..2351e1c161fe1 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser'] --- import kbnCoreFatalErrorsBrowserObj from './kbn_core_fatal_errors_browser.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx index 737d4f1a60ddc..058eb732b1480 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks title: "@kbn/core-fatal-errors-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] --- import kbnCoreFatalErrorsBrowserMocksObj from './kbn_core_fatal_errors_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index 167485947df34..a0976872ed52b 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser'] --- import kbnCoreHttpBrowserObj from './kbn_core_http_browser.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx index 81d932b59e51b..2850d141de4e2 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal'] --- import kbnCoreHttpBrowserInternalObj from './kbn_core_http_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx index 9e0959b2fa8c8..1f22e8afefdd5 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-mocks'] --- import kbnCoreHttpBrowserMocksObj from './kbn_core_http_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_common.mdx b/api_docs/kbn_core_http_common.mdx index 0eba2291dc0ff..072f8e7467992 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-common plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-common'] --- import kbnCoreHttpCommonObj from './kbn_core_http_common.devdocs.json'; diff --git a/api_docs/kbn_core_http_context_server_mocks.mdx b/api_docs/kbn_core_http_context_server_mocks.mdx index 24d4eea1ec581..cd815fc819739 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks title: "@kbn/core-http-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-context-server-mocks'] --- import kbnCoreHttpContextServerMocksObj from './kbn_core_http_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index ca731c3f84b0f..97203df57f813 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal title: "@kbn/core-http-router-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal'] --- import kbnCoreHttpRouterServerInternalObj from './kbn_core_http_router_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index b04405ed94b61..57b23bc813c76 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks title: "@kbn/core-http-router-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index d05b1875e9daa..5ea85d8edec6c 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index e6371b18af1bb..67fbb1f0bc13f 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal'] --- import kbnCoreHttpServerInternalObj from './kbn_core_http_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index a0addab8321d7..a8f08144c9c6f 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks'] --- import kbnCoreHttpServerMocksObj from './kbn_core_http_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx index eb958abf289c8..118c6d56caa16 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser'] --- import kbnCoreI18nBrowserObj from './kbn_core_i18n_browser.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser_mocks.mdx b/api_docs/kbn_core_i18n_browser_mocks.mdx index 00890f3383472..2eebb6ad333a7 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser-mocks'] --- import kbnCoreI18nBrowserMocksObj from './kbn_core_i18n_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server.mdx b/api_docs/kbn_core_i18n_server.mdx index 077b7ab241202..6767d040b15bd 100644 --- a/api_docs/kbn_core_i18n_server.mdx +++ b/api_docs/kbn_core_i18n_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server title: "@kbn/core-i18n-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server'] --- import kbnCoreI18nServerObj from './kbn_core_i18n_server.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_internal.mdx b/api_docs/kbn_core_i18n_server_internal.mdx index 3f01b8d4d79d6..e2a3f1ccdba2a 100644 --- a/api_docs/kbn_core_i18n_server_internal.mdx +++ b/api_docs/kbn_core_i18n_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal title: "@kbn/core-i18n-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-internal'] --- import kbnCoreI18nServerInternalObj from './kbn_core_i18n_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_mocks.mdx b/api_docs/kbn_core_i18n_server_mocks.mdx index 909ba500c0ee3..0f63e78634e39 100644 --- a/api_docs/kbn_core_i18n_server_mocks.mdx +++ b/api_docs/kbn_core_i18n_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks title: "@kbn/core-i18n-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-mocks'] --- import kbnCoreI18nServerMocksObj from './kbn_core_i18n_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_injected_metadata_browser.mdx b/api_docs/kbn_core_injected_metadata_browser.mdx index 3d3d86d82551d..8cbbf6ec24436 100644 --- a/api_docs/kbn_core_injected_metadata_browser.mdx +++ b/api_docs/kbn_core_injected_metadata_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser title: "@kbn/core-injected-metadata-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser'] --- import kbnCoreInjectedMetadataBrowserObj from './kbn_core_injected_metadata_browser.devdocs.json'; diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index 1d19c040a9b8e..43feff34842f8 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks title: "@kbn/core-injected-metadata-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser-mocks'] --- import kbnCoreInjectedMetadataBrowserMocksObj from './kbn_core_injected_metadata_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_internal.mdx b/api_docs/kbn_core_integrations_browser_internal.mdx index 8e1ab8dee3a9a..c714e9b9aff2e 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-internal'] --- import kbnCoreIntegrationsBrowserInternalObj from './kbn_core_integrations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_mocks.mdx b/api_docs/kbn_core_integrations_browser_mocks.mdx index adae045a69703..e16dedb121036 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-mocks'] --- import kbnCoreIntegrationsBrowserMocksObj from './kbn_core_integrations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index 998db5f733cf6..e5f404928d37a 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server'] --- import kbnCoreLoggingServerObj from './kbn_core_logging_server.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx index 1486b7ba0e762..f183ecbb1dcdd 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-internal'] --- import kbnCoreLoggingServerInternalObj from './kbn_core_logging_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_mocks.mdx b/api_docs/kbn_core_logging_server_mocks.mdx index 71354e2870770..c3cb65884623f 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks'] --- import kbnCoreLoggingServerMocksObj from './kbn_core_logging_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_internal.mdx b/api_docs/kbn_core_metrics_collectors_server_internal.mdx index e808057ca7eb7..00bc0e02d96ed 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal title: "@kbn/core-metrics-collectors-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-internal'] --- import kbnCoreMetricsCollectorsServerInternalObj from './kbn_core_metrics_collectors_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx index 0b16b6b14d30b..1fe22f5e361a1 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks title: "@kbn/core-metrics-collectors-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-mocks'] --- import kbnCoreMetricsCollectorsServerMocksObj from './kbn_core_metrics_collectors_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server.mdx b/api_docs/kbn_core_metrics_server.mdx index 383d5e8ffc5f2..e98d848279e20 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server'] --- import kbnCoreMetricsServerObj from './kbn_core_metrics_server.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_internal.mdx b/api_docs/kbn_core_metrics_server_internal.mdx index 5589ee1a634aa..c3a18f9c6a33e 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-internal'] --- import kbnCoreMetricsServerInternalObj from './kbn_core_metrics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_mocks.mdx b/api_docs/kbn_core_metrics_server_mocks.mdx index aa57cb12b437b..677c0a7dded87 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-mocks'] --- import kbnCoreMetricsServerMocksObj from './kbn_core_metrics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_mount_utils_browser.mdx b/api_docs/kbn_core_mount_utils_browser.mdx index 8e4f49c436798..0d3b2d3504b7a 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-mount-utils-browser plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-mount-utils-browser'] --- import kbnCoreMountUtilsBrowserObj from './kbn_core_mount_utils_browser.devdocs.json'; diff --git a/api_docs/kbn_core_node_server.mdx b/api_docs/kbn_core_node_server.mdx index 39ac1b3728ce0..1ff5ddeb716ed 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server'] --- import kbnCoreNodeServerObj from './kbn_core_node_server.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_internal.mdx b/api_docs/kbn_core_node_server_internal.mdx index 0aebc7859ae25..aae4a1dc3b3d2 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-internal'] --- import kbnCoreNodeServerInternalObj from './kbn_core_node_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_mocks.mdx b/api_docs/kbn_core_node_server_mocks.mdx index 97956606e45b9..337b689956aa4 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-mocks'] --- import kbnCoreNodeServerMocksObj from './kbn_core_node_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser.mdx b/api_docs/kbn_core_notifications_browser.mdx index 1f7b599459778..e6803d2caa7b1 100644 --- a/api_docs/kbn_core_notifications_browser.mdx +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser title: "@kbn/core-notifications-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser'] --- import kbnCoreNotificationsBrowserObj from './kbn_core_notifications_browser.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_internal.mdx b/api_docs/kbn_core_notifications_browser_internal.mdx index 6bf04c4318e32..232561f049ce9 100644 --- a/api_docs/kbn_core_notifications_browser_internal.mdx +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal title: "@kbn/core-notifications-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-internal'] --- import kbnCoreNotificationsBrowserInternalObj from './kbn_core_notifications_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_mocks.mdx b/api_docs/kbn_core_notifications_browser_mocks.mdx index dfa26291ec9d6..97ee4827d1b68 100644 --- a/api_docs/kbn_core_notifications_browser_mocks.mdx +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks title: "@kbn/core-notifications-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-mocks'] --- import kbnCoreNotificationsBrowserMocksObj from './kbn_core_notifications_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser.mdx b/api_docs/kbn_core_overlays_browser.mdx index 26ba6e163fab2..0bea9b5c52b6b 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser'] --- import kbnCoreOverlaysBrowserObj from './kbn_core_overlays_browser.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_internal.mdx b/api_docs/kbn_core_overlays_browser_internal.mdx index aff79e25f8c29..1a9a5dbede6a8 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-internal'] --- import kbnCoreOverlaysBrowserInternalObj from './kbn_core_overlays_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_mocks.mdx b/api_docs/kbn_core_overlays_browser_mocks.mdx index ae78e9ae201f7..99284e993eab5 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-mocks'] --- import kbnCoreOverlaysBrowserMocksObj from './kbn_core_overlays_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index ad7ca8d6baf2c..d5a2cd88b46d3 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server'] --- import kbnCorePrebootServerObj from './kbn_core_preboot_server.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server_mocks.mdx b/api_docs/kbn_core_preboot_server_mocks.mdx index 03b1aeef59ed9..e1f23bc02e5d9 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks'] --- import kbnCorePrebootServerMocksObj from './kbn_core_preboot_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index 55d556d5ec2db..36fadbfa56b7c 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser title: "@kbn/core-saved-objects-api-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index 81964bd4a7ab6..9d78c2e380058 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server title: "@kbn/core-saved-objects-api-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_internal.mdx b/api_docs/kbn_core_saved_objects_api_server_internal.mdx index 29da857be4195..dfef7401613af 100644 --- a/api_docs/kbn_core_saved_objects_api_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-internal title: "@kbn/core-saved-objects-api-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-internal'] --- import kbnCoreSavedObjectsApiServerInternalObj from './kbn_core_saved_objects_api_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index b17f74de394f2..bebb651b194ef 100644 --- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks title: "@kbn/core-saved-objects-api-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-mocks'] --- import kbnCoreSavedObjectsApiServerMocksObj from './kbn_core_saved_objects_api_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_internal.mdx b/api_docs/kbn_core_saved_objects_base_server_internal.mdx index 5f898d506565e..376b28746f40c 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal title: "@kbn/core-saved-objects-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-internal'] --- import kbnCoreSavedObjectsBaseServerInternalObj from './kbn_core_saved_objects_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx index f3d209fa7fcd7..2ecce4465af82 100644 --- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks title: "@kbn/core-saved-objects-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-mocks'] --- import kbnCoreSavedObjectsBaseServerMocksObj from './kbn_core_saved_objects_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser.mdx b/api_docs/kbn_core_saved_objects_browser.mdx index df165fa793a29..00f720e9d5185 100644 --- a/api_docs/kbn_core_saved_objects_browser.mdx +++ b/api_docs/kbn_core_saved_objects_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser title: "@kbn/core-saved-objects-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser'] --- import kbnCoreSavedObjectsBrowserObj from './kbn_core_saved_objects_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_internal.mdx b/api_docs/kbn_core_saved_objects_browser_internal.mdx index 207247df9b326..b3c9ce41ddea5 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.mdx +++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal title: "@kbn/core-saved-objects-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-internal'] --- import kbnCoreSavedObjectsBrowserInternalObj from './kbn_core_saved_objects_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_mocks.mdx b/api_docs/kbn_core_saved_objects_browser_mocks.mdx index 1d14b94cea5ce..1da0166565b44 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks title: "@kbn/core-saved-objects-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks'] --- import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index 8bde1f0b8f9ce..bcc2e28dcd51a 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-common plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-common'] --- import kbnCoreSavedObjectsCommonObj from './kbn_core_saved_objects_common.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx index a4ce97d02a8cf..6b7ee7af63ae4 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal title: "@kbn/core-saved-objects-import-export-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-internal'] --- import kbnCoreSavedObjectsImportExportServerInternalObj from './kbn_core_saved_objects_import_export_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx index 0498f759a4aea..af070bd29e18f 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks title: "@kbn/core-saved-objects-import-export-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-mocks'] --- import kbnCoreSavedObjectsImportExportServerMocksObj from './kbn_core_saved_objects_import_export_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx index 336564df0c9d2..fb6abb141aa95 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal title: "@kbn/core-saved-objects-migration-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-internal'] --- import kbnCoreSavedObjectsMigrationServerInternalObj from './kbn_core_saved_objects_migration_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx index a880e410beb84..7da28fe940c34 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks title: "@kbn/core-saved-objects-migration-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks'] --- import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index 60209bd509c07..db9eb21dea863 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server'] --- import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx index a079db4f12f55..ddb5b3dfa0156 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal title: "@kbn/core-saved-objects-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-internal'] --- import kbnCoreSavedObjectsServerInternalObj from './kbn_core_saved_objects_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_mocks.mdx b/api_docs/kbn_core_saved_objects_server_mocks.mdx index e527c49a20b12..4d967c6814712 100644 --- a/api_docs/kbn_core_saved_objects_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks title: "@kbn/core-saved-objects-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-mocks'] --- import kbnCoreSavedObjectsServerMocksObj from './kbn_core_saved_objects_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_utils_server.mdx b/api_docs/kbn_core_saved_objects_utils_server.mdx index b38c05f678ca9..8b918ee989f7e 100644 --- a/api_docs/kbn_core_saved_objects_utils_server.mdx +++ b/api_docs/kbn_core_saved_objects_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server title: "@kbn/core-saved-objects-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-utils-server plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx index f4870e83a7bd0..cc647fd4f441b 100644 --- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx +++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters title: "@kbn/core-test-helpers-deprecations-getters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-deprecations-getters'] --- import kbnCoreTestHelpersDeprecationsGettersObj from './kbn_core_test_helpers_deprecations_getters.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx index 7e1d9513f5925..eb661078b5acc 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser title: "@kbn/core-test-helpers-http-setup-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] --- import kbnCoreTestHelpersHttpSetupBrowserObj from './kbn_core_test_helpers_http_setup_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index 77f61ecd7d1f2..bcfd796c5a5ca 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] --- import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_internal.mdx b/api_docs/kbn_core_theme_browser_internal.mdx index 9306898d97e01..2f70442ddfba1 100644 --- a/api_docs/kbn_core_theme_browser_internal.mdx +++ b/api_docs/kbn_core_theme_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-internal title: "@kbn/core-theme-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-internal'] --- import kbnCoreThemeBrowserInternalObj from './kbn_core_theme_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index 88422e45883a9..86a7fd3fd90a5 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks'] --- import kbnCoreThemeBrowserMocksObj from './kbn_core_theme_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index 5cc52e9379915..bdf97d7d0d912 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser'] --- import kbnCoreUiSettingsBrowserObj from './kbn_core_ui_settings_browser.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx index f92eeb74596c7..235d9d32ca150 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal title: "@kbn/core-ui-settings-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-internal'] --- import kbnCoreUiSettingsBrowserInternalObj from './kbn_core_ui_settings_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_mocks.mdx b/api_docs/kbn_core_ui_settings_browser_mocks.mdx index 89a23ba867e2c..243a50e34daef 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks title: "@kbn/core-ui-settings-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks'] --- import kbnCoreUiSettingsBrowserMocksObj from './kbn_core_ui_settings_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index 32804e518a3ee..764c7684d7d46 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-common plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] --- import kbnCoreUiSettingsCommonObj from './kbn_core_ui_settings_common.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server.mdx b/api_docs/kbn_core_usage_data_server.mdx index eebe7a2022bdf..b8acf29ea4e38 100644 --- a/api_docs/kbn_core_usage_data_server.mdx +++ b/api_docs/kbn_core_usage_data_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server title: "@kbn/core-usage-data-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server'] --- import kbnCoreUsageDataServerObj from './kbn_core_usage_data_server.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_internal.devdocs.json b/api_docs/kbn_core_usage_data_server_internal.devdocs.json new file mode 100644 index 0000000000000..5fb8ce679a0dd --- /dev/null +++ b/api_docs/kbn_core_usage_data_server_internal.devdocs.json @@ -0,0 +1,171 @@ +{ + "id": "@kbn/core-usage-data-server-internal", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [ + { + "parentPluginId": "@kbn/core-usage-data-server-internal", + "id": "def-server.CoreUsageDataService", + "type": "Class", + "tags": [], + "label": "CoreUsageDataService", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-usage-data-server-internal", + "scope": "server", + "docId": "kibKbnCoreUsageDataServerInternalPluginApi", + "section": "def-server.CoreUsageDataService", + "text": "CoreUsageDataService" + }, + " implements ", + "CoreService", + "<", + "InternalCoreUsageDataSetup", + ", ", + "CoreUsageDataStart", + ">" + ], + "path": "packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-usage-data-server-internal", + "id": "def-server.CoreUsageDataService.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [], + "signature": [ + "any" + ], + "path": "packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-usage-data-server-internal", + "id": "def-server.CoreUsageDataService.Unnamed.$1", + "type": "Object", + "tags": [], + "label": "core", + "description": [], + "signature": [ + "CoreContext" + ], + "path": "packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-usage-data-server-internal", + "id": "def-server.CoreUsageDataService.setup", + "type": "Function", + "tags": [], + "label": "setup", + "description": [], + "signature": [ + "({ http, metrics, savedObjectsStartPromise, changedDeprecatedConfigPath$ }: ", + "SetupDeps", + ") => ", + "InternalCoreUsageDataSetup" + ], + "path": "packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-usage-data-server-internal", + "id": "def-server.CoreUsageDataService.setup.$1", + "type": "Object", + "tags": [], + "label": "{ http, metrics, savedObjectsStartPromise, changedDeprecatedConfigPath$ }", + "description": [], + "signature": [ + "SetupDeps" + ], + "path": "packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-usage-data-server-internal", + "id": "def-server.CoreUsageDataService.start", + "type": "Function", + "tags": [], + "label": "start", + "description": [], + "signature": [ + "({ savedObjects, elasticsearch, exposedConfigsToUsage }: ", + "StartDeps", + ") => { getCoreUsageData: () => Promise<", + "CoreUsageData", + ">; getConfigsUsageData: () => Promise<", + "ConfigUsageData", + ">; }" + ], + "path": "packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-usage-data-server-internal", + "id": "def-server.CoreUsageDataService.start.$1", + "type": "Object", + "tags": [], + "label": "{ savedObjects, elasticsearch, exposedConfigsToUsage }", + "description": [], + "signature": [ + "StartDeps" + ], + "path": "packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-usage-data-server-internal", + "id": "def-server.CoreUsageDataService.stop", + "type": "Function", + "tags": [], + "label": "stop", + "description": [], + "signature": [ + "() => void" + ], + "path": "packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts", + "deprecated": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false + } + ], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_core_usage_data_server_internal.mdx b/api_docs/kbn_core_usage_data_server_internal.mdx new file mode 100644 index 0000000000000..a331ad12e0e93 --- /dev/null +++ b/api_docs/kbn_core_usage_data_server_internal.mdx @@ -0,0 +1,30 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnCoreUsageDataServerInternalPluginApi +slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal +title: "@kbn/core-usage-data-server-internal" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/core-usage-data-server-internal plugin +date: 2022-09-06 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-internal'] +--- +import kbnCoreUsageDataServerInternalObj from './kbn_core_usage_data_server_internal.devdocs.json'; + + + +Contact Kibana Core for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 8 | 0 | 8 | 2 | + +## Server + +### Classes + + diff --git a/api_docs/kbn_core_usage_data_server_mocks.devdocs.json b/api_docs/kbn_core_usage_data_server_mocks.devdocs.json new file mode 100644 index 0000000000000..09c75bf18ba49 --- /dev/null +++ b/api_docs/kbn_core_usage_data_server_mocks.devdocs.json @@ -0,0 +1,173 @@ +{ + "id": "@kbn/core-usage-data-server-mocks", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [ + { + "parentPluginId": "@kbn/core-usage-data-server-mocks", + "id": "def-server.coreUsageDataServiceMock", + "type": "Object", + "tags": [], + "label": "coreUsageDataServiceMock", + "description": [], + "path": "packages/core/usage-data/core-usage-data-server-mocks/src/core_usage_data_service.mock.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-usage-data-server-mocks", + "id": "def-server.coreUsageDataServiceMock.create", + "type": "Function", + "tags": [], + "label": "create", + "description": [], + "signature": [ + "() => jest.Mocked<", + "PublicMethodsOf", + "<", + "CoreUsageDataService", + ">>" + ], + "path": "packages/core/usage-data/core-usage-data-server-mocks/src/core_usage_data_service.mock.ts", + "deprecated": false, + "returnComment": [], + "children": [] + }, + { + "parentPluginId": "@kbn/core-usage-data-server-mocks", + "id": "def-server.coreUsageDataServiceMock.createSetupContract", + "type": "Function", + "tags": [], + "label": "createSetupContract", + "description": [], + "signature": [ + "(usageStatsClient?: jest.Mocked<", + "ICoreUsageStatsClient", + ">) => jest.Mocked<", + "InternalCoreUsageDataSetup", + ">" + ], + "path": "packages/core/usage-data/core-usage-data-server-mocks/src/core_usage_data_service.mock.ts", + "deprecated": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/core-usage-data-server-mocks", + "id": "def-server.coreUsageDataServiceMock.createSetupContract.$1", + "type": "CompoundType", + "tags": [], + "label": "usageStatsClient", + "description": [], + "signature": [ + "{ getUsageStats: jest.MockInstance, []>; incrementSavedObjectsBulkCreate: jest.MockInstance, [options: ", + "BaseIncrementOptions", + "]>; incrementSavedObjectsBulkGet: jest.MockInstance, [options: ", + "BaseIncrementOptions", + "]>; incrementSavedObjectsBulkResolve: jest.MockInstance, [options: ", + "BaseIncrementOptions", + "]>; incrementSavedObjectsBulkUpdate: jest.MockInstance, [options: ", + "BaseIncrementOptions", + "]>; incrementSavedObjectsCreate: jest.MockInstance, [options: ", + "BaseIncrementOptions", + "]>; incrementSavedObjectsDelete: jest.MockInstance, [options: ", + "BaseIncrementOptions", + "]>; incrementSavedObjectsFind: jest.MockInstance, [options: ", + "BaseIncrementOptions", + "]>; incrementSavedObjectsGet: jest.MockInstance, [options: ", + "BaseIncrementOptions", + "]>; incrementSavedObjectsResolve: jest.MockInstance, [options: ", + "BaseIncrementOptions", + "]>; incrementSavedObjectsUpdate: jest.MockInstance, [options: ", + "BaseIncrementOptions", + "]>; incrementSavedObjectsImport: jest.MockInstance, [options: ", + "IncrementSavedObjectsImportOptions", + "]>; incrementSavedObjectsResolveImportErrors: jest.MockInstance, [options: ", + "IncrementSavedObjectsResolveImportErrorsOptions", + "]>; incrementSavedObjectsExport: jest.MockInstance, [options: ", + "IncrementSavedObjectsExportOptions", + "]>; incrementLegacyDashboardsImport: jest.MockInstance, [options: ", + "BaseIncrementOptions", + "]>; incrementLegacyDashboardsExport: jest.MockInstance, [options: ", + "BaseIncrementOptions", + "]>; } & ", + "ICoreUsageStatsClient" + ], + "path": "packages/core/usage-data/core-usage-data-server-mocks/src/core_usage_data_service.mock.ts", + "deprecated": false + } + ] + }, + { + "parentPluginId": "@kbn/core-usage-data-server-mocks", + "id": "def-server.coreUsageDataServiceMock.createStartContract", + "type": "Function", + "tags": [], + "label": "createStartContract", + "description": [], + "signature": [ + "() => jest.Mocked<", + "CoreUsageDataStart", + ">" + ], + "path": "packages/core/usage-data/core-usage-data-server-mocks/src/core_usage_data_service.mock.ts", + "deprecated": false, + "returnComment": [], + "children": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-usage-data-server-mocks", + "id": "def-server.coreUsageStatsClientMock", + "type": "Object", + "tags": [], + "label": "coreUsageStatsClientMock", + "description": [], + "path": "packages/core/usage-data/core-usage-data-server-mocks/src/core_usage_stats_client.mock.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/core-usage-data-server-mocks", + "id": "def-server.coreUsageStatsClientMock.create", + "type": "Function", + "tags": [], + "label": "create", + "description": [], + "signature": [ + "() => jest.Mocked<", + "ICoreUsageStatsClient", + ">" + ], + "path": "packages/core/usage-data/core-usage-data-server-mocks/src/core_usage_stats_client.mock.ts", + "deprecated": false, + "returnComment": [], + "children": [] + } + ], + "initialIsOpen": false + } + ] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_core_usage_data_server_mocks.mdx b/api_docs/kbn_core_usage_data_server_mocks.mdx new file mode 100644 index 0000000000000..97902b78c1e53 --- /dev/null +++ b/api_docs/kbn_core_usage_data_server_mocks.mdx @@ -0,0 +1,30 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnCoreUsageDataServerMocksPluginApi +slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks +title: "@kbn/core-usage-data-server-mocks" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/core-usage-data-server-mocks plugin +date: 2022-09-06 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] +--- +import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; + + + +Contact Kibana Core for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 7 | 0 | 7 | 0 | + +## Server + +### Objects + + diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index 2080716063487..43df99de292a3 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto'] --- import kbnCryptoObj from './kbn_crypto.devdocs.json'; diff --git a/api_docs/kbn_crypto_browser.mdx b/api_docs/kbn_crypto_browser.mdx index 89c7bfb6074e2..2a0a4c1f03b1c 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto-browser plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 4886547d2eba9..c32356270ffdd 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/datemath plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index 1696ba58be6d6..97011ad26711a 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-errors plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-errors'] --- import kbnDevCliErrorsObj from './kbn_dev_cli_errors.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_runner.mdx b/api_docs/kbn_dev_cli_runner.mdx index b04f764deb1fb..935cda637c96f 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-runner plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-runner'] --- import kbnDevCliRunnerObj from './kbn_dev_cli_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_proc_runner.mdx b/api_docs/kbn_dev_proc_runner.mdx index 1827fe0a88d7c..b32f51201616c 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-proc-runner plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-proc-runner'] --- import kbnDevProcRunnerObj from './kbn_dev_proc_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx index a06d8856b2240..c47422872ebf4 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-utils plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 6ce07c42072e3..6dbba50fa178c 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/doc-links plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links'] --- import kbnDocLinksObj from './kbn_doc_links.devdocs.json'; diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx index 9454579a52140..38d420864d541 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/docs-utils plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index 88dfae4059edc..18b5ab724e4a0 100644 --- a/api_docs/kbn_ebt_tools.mdx +++ b/api_docs/kbn_ebt_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools title: "@kbn/ebt-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt-tools plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index 2c3f41f62c8cd..a910b0ed9ab1b 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-archiver plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver'] --- import kbnEsArchiverObj from './kbn_es_archiver.devdocs.json'; diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx index 24bb6e2989b08..e5218372534ea 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-errors plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors'] --- import kbnEsErrorsObj from './kbn_es_errors.devdocs.json'; diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx index 93f1631c408cf..f40b2ed2c2e69 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-query plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] --- import kbnEsQueryObj from './kbn_es_query.devdocs.json'; diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index 2a6ec74ef9761..a64dad8da4aca 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/eslint-plugin-imports plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index 0139707633d71..5cec3d061f0b3 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-types plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index 5d588ab9af4f4..bb92f973d42cd 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/find-used-node-modules plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index 8f85c8f515a54..5dfff84c00067 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_get_repo_files.mdx b/api_docs/kbn_get_repo_files.mdx index c6aa49cad60c6..85bcb73c7ff82 100644 --- a/api_docs/kbn_get_repo_files.mdx +++ b/api_docs/kbn_get_repo_files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-get-repo-files title: "@kbn/get-repo-files" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/get-repo-files plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/get-repo-files'] --- import kbnGetRepoFilesObj from './kbn_get_repo_files.devdocs.json'; diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index d387670444058..b72bd4ea22601 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/handlebars plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars'] --- import kbnHandlebarsObj from './kbn_handlebars.devdocs.json'; diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx index 840231863e22a..4ec02e4804950 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/hapi-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] --- import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index ab3c66c660cdb..44cf43df05196 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-card plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-card'] --- import kbnHomeSampleDataCardObj from './kbn_home_sample_data_card.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_tab.mdx b/api_docs/kbn_home_sample_data_tab.mdx index c236fbd46cae1..df5c65f7b4eda 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-tab plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-tab'] --- import kbnHomeSampleDataTabObj from './kbn_home_sample_data_tab.devdocs.json'; diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx index df02e3458d94a..e4c7ca4f21d55 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] --- import kbnI18nObj from './kbn_i18n.devdocs.json'; diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index 6d22b5a14aa19..38220037bbaaa 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/import-resolver plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 3e118ec1e7b51..317a6ad2677df 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/interpreter plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index 20f5830a558b1..49469e3bb12b8 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/io-ts-utils plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 4966b9c345bbf..1efda5e4370d1 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/jest-serializers plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/jest-serializers'] --- import kbnJestSerializersObj from './kbn_jest_serializers.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_parser.mdx b/api_docs/kbn_kibana_manifest_parser.mdx index 18c04020ea98c..e6b10e49a9696 100644 --- a/api_docs/kbn_kibana_manifest_parser.mdx +++ b/api_docs/kbn_kibana_manifest_parser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-parser title: "@kbn/kibana-manifest-parser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-parser plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-parser'] --- import kbnKibanaManifestParserObj from './kbn_kibana_manifest_parser.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index 17371606561c6..43ef3e3ba3e5e 100644 --- a/api_docs/kbn_kibana_manifest_schema.mdx +++ b/api_docs/kbn_kibana_manifest_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema title: "@kbn/kibana-manifest-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-schema plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index ddfeed376c25c..f1893197e6c1d 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging'] --- import kbnLoggingObj from './kbn_logging.devdocs.json'; diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx index 754e1a09fa163..0457b5227adca 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index d164d8905e3a6..4cccaf3476a66 100644 --- a/api_docs/kbn_managed_vscode_config.mdx +++ b/api_docs/kbn_managed_vscode_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config title: "@kbn/managed-vscode-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-vscode-config plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index b9e787849484f..4b0b781fb1b64 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mapbox-gl plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index a8c5473158f5b..6ce32fe93f5ea 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-agg-utils plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] --- import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index 132e2891c775f..cf4a767ab5c1d 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-populated-object plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] --- import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index 0ee6cf82d7365..71601f71a4b79 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-string-hash plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index 22207d9971196..da9feeb48ae71 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/monaco plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 2f3e23c36b910..1c40770f1d14c 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer'] --- import kbnOptimizerObj from './kbn_optimizer.devdocs.json'; diff --git a/api_docs/kbn_optimizer_webpack_helpers.mdx b/api_docs/kbn_optimizer_webpack_helpers.mdx index 6b3cb7c4f2d42..9f81092cdb20a 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers'] --- import kbnOptimizerWebpackHelpersObj from './kbn_optimizer_webpack_helpers.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 8a04538f6e747..dae280868ba9d 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index c2720c3e82640..1e780ff247591 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-generator plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator'] --- import kbnPluginGeneratorObj from './kbn_plugin_generator.devdocs.json'; diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx index f1f6a205cad77..59df0a48f1476 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-helpers plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index 50ce740f0aec3..4bf64e81a2cd1 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-field plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index 501a4efd88967..e1b169cb11910 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-source-classifier plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index dff52f46deb36..c3e3fb68a1942 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rule-data-utils plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 592f0ccb7f053..594a90c6b992b 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index 62256641f9a22..d81e5aedca0cf 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-es-utils plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] --- import kbnSecuritysolutionEsUtilsObj from './kbn_securitysolution_es_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 26f258dc04bd6..b368ae1b07744 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils'] --- import kbnSecuritysolutionHookUtilsObj from './kbn_securitysolution_hook_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx index 6b90554741883..9ed642a17ac73 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types title: "@kbn/securitysolution-io-ts-alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types'] --- import kbnSecuritysolutionIoTsAlertingTypesObj from './kbn_securitysolution_io_ts_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index d0b362d717ef1..86bfe88fc4aeb 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types title: "@kbn/securitysolution-io-ts-list-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] --- import kbnSecuritysolutionIoTsListTypesObj from './kbn_securitysolution_io_ts_list_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index 7f2550bdccca0..03c96517daf9c 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types'] --- import kbnSecuritysolutionIoTsTypesObj from './kbn_securitysolution_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx index 1ce75c27b58a3..216e8655b5bb0 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils'] --- import kbnSecuritysolutionIoTsUtilsObj from './kbn_securitysolution_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx index eb06f98d8444c..e366c255b21bc 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-api plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] --- import kbnSecuritysolutionListApiObj from './kbn_securitysolution_list_api.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index 882ec26b4ba46..e1668dae928e1 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-constants plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants'] --- import kbnSecuritysolutionListConstantsObj from './kbn_securitysolution_list_constants.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx index 57311b271af40..5ab603d10b235 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks'] --- import kbnSecuritysolutionListHooksObj from './kbn_securitysolution_list_hooks.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx index bcc92919fc42f..0df64a065cf26 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-utils plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils'] --- import kbnSecuritysolutionListUtilsObj from './kbn_securitysolution_list_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx index 628693c12e1bc..9bd7ba6ecdcf1 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-rules plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules'] --- import kbnSecuritysolutionRulesObj from './kbn_securitysolution_rules.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx index f7e73ae7cd871..82de3d9623a24 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-t-grid plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid'] --- import kbnSecuritysolutionTGridObj from './kbn_securitysolution_t_grid.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx index 8a8455f409a81..1a77dd0e57e72 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-utils plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils'] --- import kbnSecuritysolutionUtilsObj from './kbn_securitysolution_utils.devdocs.json'; diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index 595386c6c73ac..22436ed83b27a 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-http-tools plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] --- import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index 67aed36b05747..2c098b0e95e53 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index 83c8971c8ce53..b5873d6efc302 100644 --- a/api_docs/kbn_shared_svg.mdx +++ b/api_docs/kbn_shared_svg.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg title: "@kbn/shared-svg" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-svg plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-svg'] --- import kbnSharedSvgObj from './kbn_shared_svg.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx index bdc1537cc16ad..1b9969731fe0b 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen-mocks title: "@kbn/shared-ux-button-exit-full-screen-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen-mocks'] --- import kbnSharedUxButtonExitFullScreenMocksObj from './kbn_shared_ux_button_exit_full_screen_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index 67fd3dcaf41bd..4ddd242dcd879 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar'] --- import kbnSharedUxButtonToolbarObj from './kbn_shared_ux_button_toolbar.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index e22142c4797dd..2dbf643ce259a 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data title: "@kbn/shared-ux-card-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data'] --- import kbnSharedUxCardNoDataObj from './kbn_shared_ux_card_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx index 7573591c49224..1c61826eb8bf3 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks title: "@kbn/shared-ux-card-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks'] --- import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx index c6e48451635c8..8403639e1224a 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks title: "@kbn/shared-ux-link-redirect-app-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app-mocks'] --- import kbnSharedUxLinkRedirectAppMocksObj from './kbn_shared_ux_link_redirect_app_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx index 9180867f3820d..a40c2bfb5fcc4 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data title: "@kbn/shared-ux-page-analytics-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data'] --- import kbnSharedUxPageAnalyticsNoDataObj from './kbn_shared_ux_page_analytics_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx index 575e935118416..f01fa624748e0 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks title: "@kbn/shared-ux-page-analytics-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data-mocks'] --- import kbnSharedUxPageAnalyticsNoDataMocksObj from './kbn_shared_ux_page_analytics_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx index 9656ef1e132a1..31f22196e83bb 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data title: "@kbn/shared-ux-page-kibana-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data'] --- import kbnSharedUxPageKibanaNoDataObj from './kbn_shared_ux_page_kibana_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx index 4aa81c27affd1..656be2f5e1328 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks title: "@kbn/shared-ux-page-kibana-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data-mocks'] --- import kbnSharedUxPageKibanaNoDataMocksObj from './kbn_shared_ux_page_kibana_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template.mdx b/api_docs/kbn_shared_ux_page_kibana_template.mdx index 5243ea27703be..b60be077512db 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template title: "@kbn/shared-ux-page-kibana-template" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template'] --- import kbnSharedUxPageKibanaTemplateObj from './kbn_shared_ux_page_kibana_template.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx index 8102f035e450e..9fd3f5c108992 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks title: "@kbn/shared-ux-page-kibana-template-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template-mocks'] --- import kbnSharedUxPageKibanaTemplateMocksObj from './kbn_shared_ux_page_kibana_template_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data.mdx b/api_docs/kbn_shared_ux_page_no_data.mdx index 4747677f63999..3741a45a23382 100644 --- a/api_docs/kbn_shared_ux_page_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data title: "@kbn/shared-ux-page-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data'] --- import kbnSharedUxPageNoDataObj from './kbn_shared_ux_page_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config.mdx b/api_docs/kbn_shared_ux_page_no_data_config.mdx index 90e5a801476fe..e4b72077198fd 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config title: "@kbn/shared-ux-page-no-data-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config'] --- import kbnSharedUxPageNoDataConfigObj from './kbn_shared_ux_page_no_data_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx index 148e0a16da6ce..d23bd9668426f 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks title: "@kbn/shared-ux-page-no-data-config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config-mocks'] --- import kbnSharedUxPageNoDataConfigMocksObj from './kbn_shared_ux_page_no_data_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx index 69f30ffcb9d4f..eefd75b0fb7fa 100644 --- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks title: "@kbn/shared-ux-page-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-mocks'] --- import kbnSharedUxPageNoDataMocksObj from './kbn_shared_ux_page_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx index 9e52f0dcc4aae..df1fc4d91ed90 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav title: "@kbn/shared-ux-page-solution-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav'] --- import kbnSharedUxPageSolutionNavObj from './kbn_shared_ux_page_solution_nav.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx index a28d5265c4c53..a1aa6cb442150 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views title: "@kbn/shared-ux-prompt-no-data-views" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views'] --- import kbnSharedUxPromptNoDataViewsObj from './kbn_shared_ux_prompt_no_data_views.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx index 08b1b725b4fc4..1895906126c41 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks title: "@kbn/shared-ux-prompt-no-data-views-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views-mocks'] --- import kbnSharedUxPromptNoDataViewsMocksObj from './kbn_shared_ux_prompt_no_data_views_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_config.mdx b/api_docs/kbn_shared_ux_storybook_config.mdx index abb12d940cba3..d40071304bae9 100644 --- a/api_docs/kbn_shared_ux_storybook_config.mdx +++ b/api_docs/kbn_shared_ux_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config title: "@kbn/shared-ux-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-config plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-config'] --- import kbnSharedUxStorybookConfigObj from './kbn_shared_ux_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_mock.mdx b/api_docs/kbn_shared_ux_storybook_mock.mdx index 0673efbd47724..3c001308fa58e 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index fad51bdf83a34..8ba8bdc804263 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-utility plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index ef9b5db71faab..4ec7116e43707 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/some-dev-log plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_sort_package_json.mdx b/api_docs/kbn_sort_package_json.mdx index 2aa601aa28789..bf751e78e2f42 100644 --- a/api_docs/kbn_sort_package_json.mdx +++ b/api_docs/kbn_sort_package_json.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sort-package-json title: "@kbn/sort-package-json" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sort-package-json plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-package-json'] --- import kbnSortPackageJsonObj from './kbn_sort_package_json.devdocs.json'; diff --git a/api_docs/kbn_std.devdocs.json b/api_docs/kbn_std.devdocs.json index 95993490eec8d..9b40cb00a5e05 100644 --- a/api_docs/kbn_std.devdocs.json +++ b/api_docs/kbn_std.devdocs.json @@ -9,7 +9,83 @@ "objects": [] }, "server": { - "classes": [], + "classes": [ + { + "parentPluginId": "@kbn/std", + "id": "def-server.Semaphore", + "type": "Class", + "tags": [], + "label": "Semaphore", + "description": [], + "path": "packages/kbn-std/src/semaphore.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/std", + "id": "def-server.Semaphore.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [], + "signature": [ + "any" + ], + "path": "packages/kbn-std/src/semaphore.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/std", + "id": "def-server.Semaphore.Unnamed.$1", + "type": "number", + "tags": [], + "label": "capacity", + "description": [], + "signature": [ + "number" + ], + "path": "packages/kbn-std/src/semaphore.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/std", + "id": "def-server.Semaphore.acquire", + "type": "Function", + "tags": [], + "label": "acquire", + "description": [], + "signature": [ + "() => ", + "OperatorFunction", + "" + ], + "path": "packages/kbn-std/src/semaphore.ts", + "deprecated": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/std", + "id": "def-server.Semaphore.release", + "type": "Function", + "tags": [], + "label": "release", + "description": [], + "signature": [ + "() => void" + ], + "path": "packages/kbn-std/src/semaphore.ts", + "deprecated": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false + } + ], "functions": [ { "parentPluginId": "@kbn/std", diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index fa9c18da6ba81..c6865cb9a191d 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/std plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std'] --- import kbnStdObj from './kbn_std.devdocs.json'; @@ -21,13 +21,16 @@ Contact Kibana Core for questions regarding this plugin. | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 92 | 1 | 59 | 1 | +| 97 | 1 | 64 | 1 | ## Server ### Functions +### Classes + + ### Interfaces diff --git a/api_docs/kbn_stdio_dev_helpers.mdx b/api_docs/kbn_stdio_dev_helpers.mdx index 4e56019253eaa..c72f3c4e12baa 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/stdio-dev-helpers plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/stdio-dev-helpers'] --- import kbnStdioDevHelpersObj from './kbn_stdio_dev_helpers.devdocs.json'; diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx index 70b0801d02a34..f84cf0d75648c 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/storybook plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index ae1b9679d9963..e82baeab81cb9 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/telemetry-tools plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] --- import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json'; diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index e5ec44f07c73c..8a6da75a7fb10 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index 6730704439384..ce97704328c60 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-jest-helpers plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers'] --- import kbnTestJestHelpersObj from './kbn_test_jest_helpers.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 9bdd26028c73e..b8e011b54f342 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/tooling-log plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_type_summarizer.mdx b/api_docs/kbn_type_summarizer.mdx index e9438cc5e26fe..b4ebcfae7c4b6 100644 --- a/api_docs/kbn_type_summarizer.mdx +++ b/api_docs/kbn_type_summarizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-type-summarizer title: "@kbn/type-summarizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/type-summarizer plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/type-summarizer'] --- import kbnTypeSummarizerObj from './kbn_type_summarizer.devdocs.json'; diff --git a/api_docs/kbn_type_summarizer_core.mdx b/api_docs/kbn_type_summarizer_core.mdx index c1bb4dfbcf4d2..8795b16250a89 100644 --- a/api_docs/kbn_type_summarizer_core.mdx +++ b/api_docs/kbn_type_summarizer_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-type-summarizer-core title: "@kbn/type-summarizer-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/type-summarizer-core plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/type-summarizer-core'] --- import kbnTypeSummarizerCoreObj from './kbn_type_summarizer_core.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index 4626ee5aa0bb6..5b8d2b1d3f0d9 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/typed-react-router-config plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] --- import kbnTypedReactRouterConfigObj from './kbn_typed_react_router_config.devdocs.json'; diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index 6cb38b2bf38b2..fc4fb9e4375b1 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-theme plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index a784ca24e8c01..f1dc37b46d564 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/user-profile-components'] --- import kbnUserProfileComponentsObj from './kbn_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx index 96a34a6fd9755..fa7f7a31f609e 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types'] --- import kbnUtilityTypesObj from './kbn_utility_types.devdocs.json'; diff --git a/api_docs/kbn_utility_types_jest.mdx b/api_docs/kbn_utility_types_jest.mdx index 6dd7435ed38e2..5a54f093e2c65 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types-jest'] --- import kbnUtilityTypesJestObj from './kbn_utility_types_jest.devdocs.json'; diff --git a/api_docs/kbn_utils.mdx b/api_docs/kbn_utils.mdx index 1d0476d4a53cf..d7647c5a47b79 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 7f716cb7167a0..dbf3b91292d90 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index 50c292e38cce3..c0cb483b562e5 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index c5af554c552b5..97fc5e134eb0f 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] --- import kibanaReactObj from './kibana_react.devdocs.json'; diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index 9aa4bf9f082f2..a5b160dcf1979 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] --- import kibanaUtilsObj from './kibana_utils.devdocs.json'; diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx index 9c007e6bda4b4..c5387dea37792 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index d1035af59444c..698fa35e0d4e7 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index 4cdea2f4f41b2..affc63ce331b1 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard'] --- import licenseApiGuardObj from './license_api_guard.devdocs.json'; diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx index e23389f5d16d2..2fcd6102f5a7a 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] --- import licenseManagementObj from './license_management.devdocs.json'; diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index 230ea8da59f74..e126958e9e916 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index a7e09aed225b5..962b40fc27f97 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 22302785607ef..7a99638b5be97 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index 1ddc893f195bb..7e3a9628185ef 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] --- import mapsObj from './maps.devdocs.json'; diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index 194314de963f5..b7f0a7655b847 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index 5db609bd87d0b..35712c23b478a 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index 4e4bad6bf5c87..ca77b7a91a941 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring'] --- import monitoringObj from './monitoring.devdocs.json'; diff --git a/api_docs/monitoring_collection.mdx b/api_docs/monitoring_collection.mdx index ea699661c7b36..731ab5cc22e25 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] --- import monitoringCollectionObj from './monitoring_collection.devdocs.json'; diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index 87341a3ab0b57..f23f4b5e01d53 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] --- import navigationObj from './navigation.devdocs.json'; diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index f29d5f5b672d9..21c8675a744b8 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index b29d510fb5cd0..fac3ee5ab3c80 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github description: API docs for the observability plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index c9f6dc7219810..963eda18fc357 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index 9b6047bf3b073..4406258c16647 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -15,13 +15,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Count | Plugins or Packages with a
public API | Number of teams | |--------------|----------|------------------------| -| 440 | 366 | 36 | +| 442 | 368 | 36 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 30537 | 180 | 20393 | 970 | +| 30558 | 180 | 20413 | 972 | ## Plugin Directory @@ -79,7 +79,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 222 | 0 | 95 | 2 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Index pattern fields and ambiguous values formatters | 288 | 5 | 249 | 3 | | | [Machine Learning UI](https://github.com/orgs/elastic/teams/ml-ui) | The file upload plugin contains components and services for uploading a file, analyzing its data, and then importing the data into an Elasticsearch index. Supported file types include CSV, TSV, newline-delimited JSON and GeoJSON. | 62 | 0 | 62 | 2 | -| | [@elastic/kibana-app-services](https://github.com/orgs/elastic/teams/team:AppServicesUx) | File upload, download, sharing, and serving over HTTP implementation in Kibana. | 243 | 0 | 6 | 2 | +| | [@elastic/kibana-app-services](https://github.com/orgs/elastic/teams/team:AppServicesUx) | File upload, download, sharing, and serving over HTTP implementation in Kibana. | 244 | 0 | 6 | 2 | | | [Fleet](https://github.com/orgs/elastic/teams/fleet) | - | 969 | 3 | 873 | 10 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 68 | 0 | 14 | 5 | | globalSearchBar | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | @@ -316,6 +316,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | Kibana Core | - | 4 | 0 | 4 | 0 | | | Kibana Core | - | 23 | 0 | 3 | 0 | | | Kibana Core | - | 146 | 0 | 135 | 0 | +| | Kibana Core | - | 8 | 0 | 8 | 2 | +| | Kibana Core | - | 7 | 0 | 7 | 0 | | | [Owner missing] | - | 13 | 0 | 7 | 0 | | | [Owner missing] | - | 10 | 0 | 10 | 0 | | | [Owner missing] | elasticsearch datemath parser, used in kibana | 44 | 0 | 43 | 0 | @@ -401,7 +403,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [Owner missing] | - | 9 | 0 | 3 | 0 | | | [Owner missing] | - | 20 | 0 | 12 | 0 | | | [Owner missing] | - | 2 | 0 | 2 | 0 | -| | Kibana Core | - | 92 | 1 | 59 | 1 | +| | Kibana Core | - | 97 | 1 | 64 | 1 | | | [Owner missing] | - | 4 | 0 | 2 | 0 | | | Operations | - | 38 | 2 | 21 | 0 | | | Kibana Core | - | 2 | 0 | 2 | 0 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index d5400c3d0eae6..7fb55d6a2ea42 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationUtil plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index ce14622834d01..06e4c7b534cd6 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github description: API docs for the remoteClusters plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] --- import remoteClustersObj from './remote_clusters.devdocs.json'; diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index bcccf4ec1dc95..eda4e337d214e 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the reporting plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] --- import reportingObj from './reporting.devdocs.json'; diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index ae1b00f5dd7b7..74411201bbdbe 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the rollup plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index 9a81cc141a22f..528417dce9da8 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github description: API docs for the ruleRegistry plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] --- import ruleRegistryObj from './rule_registry.devdocs.json'; diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index 95a2a9a38f9e4..3e74986c45337 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github description: API docs for the runtimeFields plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] --- import runtimeFieldsObj from './runtime_fields.devdocs.json'; diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index 8dc8d6422f9dd..0728273a80d40 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjects plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] --- import savedObjectsObj from './saved_objects.devdocs.json'; diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx index 452dc0234d866..1dddbeff870f6 100644 --- a/api_docs/saved_objects_finder.mdx +++ b/api_docs/saved_objects_finder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder title: "savedObjectsFinder" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsFinder plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsFinder'] --- import savedObjectsFinderObj from './saved_objects_finder.devdocs.json'; diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index 47f9040a3cd73..0257e69849de6 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsManagement plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] --- import savedObjectsManagementObj from './saved_objects_management.devdocs.json'; diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index cf4eeeb7902bf..12c1c41dcf350 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTagging plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] --- import savedObjectsTaggingObj from './saved_objects_tagging.devdocs.json'; diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index 8410b8fac9e46..5c3b22b466476 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTaggingOss plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] --- import savedObjectsTaggingOssObj from './saved_objects_tagging_oss.devdocs.json'; diff --git a/api_docs/saved_search.mdx b/api_docs/saved_search.mdx index 618334dacae51..be9ec295c6f89 100644 --- a/api_docs/saved_search.mdx +++ b/api_docs/saved_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch title: "savedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the savedSearch plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedSearch'] --- import savedSearchObj from './saved_search.devdocs.json'; diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index 66b60801f9e34..c866e4461df0d 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotMode plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] --- import screenshotModeObj from './screenshot_mode.devdocs.json'; diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx index 8e3fb91fc41fa..55e225c99929f 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotting plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index c391fb9991628..b47390e54e629 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github description: API docs for the security plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index d09f514b7e4ee..11192512cb016 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolution plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index 169446dc6ec80..b8fbf49f5f14c 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github description: API docs for the sessionView plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] --- import sessionViewObj from './session_view.devdocs.json'; diff --git a/api_docs/share.mdx b/api_docs/share.mdx index 4c81970ae5edb..e3cd4dcce6ed8 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github description: API docs for the share plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index 784231b75edba..8543671e08df9 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github description: API docs for the snapshotRestore plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] --- import snapshotRestoreObj from './snapshot_restore.devdocs.json'; diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index 3178ef1c79314..03127a254c900 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github description: API docs for the spaces plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index c37d18d3f2e87..ed9f4c13f94fa 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github description: API docs for the stackAlerts plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] --- import stackAlertsObj from './stack_alerts.devdocs.json'; diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index 912955764e527..dc22930eb237c 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github description: API docs for the taskManager plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] --- import taskManagerObj from './task_manager.devdocs.json'; diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index 62003ca58f54c..a1601dcf08d76 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetry plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] --- import telemetryObj from './telemetry.devdocs.json'; diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index ee49e142b544c..8fc5e8ef87ee2 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionManager plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] --- import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json'; diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index b08f8b839f720..7edfe584d3398 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionXpack plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] --- import telemetryCollectionXpackObj from './telemetry_collection_xpack.devdocs.json'; diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index 1ce287369ce0d..3a3e106eed4f5 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryManagementSection plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 917b972b988da..8c3375cd9adc8 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github description: API docs for the threatIntelligence plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] --- import threatIntelligenceObj from './threat_intelligence.devdocs.json'; diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index 36b368f2b1c57..0a3686d2ae196 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github description: API docs for the timelines plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] --- import timelinesObj from './timelines.devdocs.json'; diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx index 1ee7ab7da3ffd..a0cfa085f84e9 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github description: API docs for the transform plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 8b76e74217a0d..040b336530148 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github description: API docs for the triggersActionsUi plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index 16fd284e7b4bf..4070f5232d118 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActions plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] --- import uiActionsObj from './ui_actions.devdocs.json'; diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index bdce3b410e87e..cb114687d6f1f 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActionsEnhanced plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_field_list.mdx b/api_docs/unified_field_list.mdx index bd0fe3cb03859..a40b2083ff429 100644 --- a/api_docs/unified_field_list.mdx +++ b/api_docs/unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedFieldList title: "unifiedFieldList" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedFieldList plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedFieldList'] --- import unifiedFieldListObj from './unified_field_list.devdocs.json'; diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index ae4d3f6a3cc1b..5a83d305fdb9d 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch'] --- import unifiedSearchObj from './unified_search.devdocs.json'; diff --git a/api_docs/unified_search_autocomplete.mdx b/api_docs/unified_search_autocomplete.mdx index cc370d0fc516a..ca5d1fd443820 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch.autocomplete plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index c407c87eee119..db92454641100 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github description: API docs for the urlForwarding plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] --- import urlForwardingObj from './url_forwarding.devdocs.json'; diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index 5cd4c2791d9fa..6d198b48f1535 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the usageCollection plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection'] --- import usageCollectionObj from './usage_collection.devdocs.json'; diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx index 69792bea430d3..b1eb48b0c600d 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] --- import uxObj from './ux.devdocs.json'; diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index 1d0cb712c018d..25047939fe057 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the visDefaultEditor plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor'] --- import visDefaultEditorObj from './vis_default_editor.devdocs.json'; diff --git a/api_docs/vis_type_gauge.mdx b/api_docs/vis_type_gauge.mdx index f955df7c34b5f..083de23429f5a 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeGauge plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeGauge'] --- import visTypeGaugeObj from './vis_type_gauge.devdocs.json'; diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx index 86b790e243847..0d34ed2680ec6 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeHeatmap plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap'] --- import visTypeHeatmapObj from './vis_type_heatmap.devdocs.json'; diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx index 4a3d2f896113c..2de4de83b5c9e 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypePie plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie'] --- import visTypePieObj from './vis_type_pie.devdocs.json'; diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx index 4f56ac03deb41..c826aba082e91 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTable plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable'] --- import visTypeTableObj from './vis_type_table.devdocs.json'; diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx index d5b0858ae2fff..13db8ee610d41 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimelion plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion'] --- import visTypeTimelionObj from './vis_type_timelion.devdocs.json'; diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx index 6207672a1d799..a44a9f88effb6 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimeseries plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries'] --- import visTypeTimeseriesObj from './vis_type_timeseries.devdocs.json'; diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx index bede45034b249..fac57b166ef54 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVega plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega'] --- import visTypeVegaObj from './vis_type_vega.devdocs.json'; diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx index 7e4937b15697f..b6fe855de9250 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] --- import visTypeVislibObj from './vis_type_vislib.devdocs.json'; diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index 3fa382e2dded5..adc7b920f08a3 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeXy plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 824e92becc855..9fc1b40590470 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizations plugin -date: 2022-09-05 +date: 2022-09-06 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From 5563b73677fad39532cb2ffa28c1b7bc714a3ca8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20St=C3=BCrmer?= Date: Tue, 6 Sep 2022 08:44:44 +0200 Subject: [PATCH 14/19] [Metrics UI] Remove forbidden cross-boundary imports (#139757) --- .../common/inventory_models/aws_ec2/index.ts | 2 + .../inventory_models/aws_ec2/layout.tsx | 138 ------- .../inventory_models/aws_ec2/metrics/index.ts | 8 +- .../common/inventory_models/aws_rds/index.ts | 2 + .../inventory_models/aws_rds/layout.tsx | 190 --------- .../inventory_models/aws_rds/metrics/index.ts | 20 +- .../common/inventory_models/aws_s3/index.ts | 2 + .../common/inventory_models/aws_s3/layout.tsx | 153 ------- .../inventory_models/aws_s3/metrics/index.ts | 20 +- .../common/inventory_models/aws_sqs/index.ts | 2 + .../inventory_models/aws_sqs/layout.tsx | 153 ------- .../inventory_models/aws_sqs/metrics/index.ts | 20 +- .../inventory_models/container/index.ts | 2 + .../inventory_models/container/layout.tsx | 304 -------------- .../container/metrics/index.ts | 8 +- .../common/inventory_models/host/index.ts | 2 + .../common/inventory_models/host/layout.tsx | 380 ------------------ .../inventory_models/host/metrics/index.ts | 10 +- .../infra/common/inventory_models/layouts.ts | 52 --- .../common/inventory_models/pod/index.ts | 2 + .../common/inventory_models/pod/layout.tsx | 168 -------- .../inventory_models/pod/metrics/index.ts | 8 +- .../inventory_models/shared/layouts/aws.tsx | 244 ----------- .../inventory_models/shared/layouts/nginx.tsx | 113 ------ .../infra/common/inventory_models/toolbars.ts | 44 -- .../utils/get_interval_in_seconds.ts | 0 .../inventory/components/expression.tsx | 37 +- .../tabs/metrics/chart_section.tsx | 12 +- .../tabs/processes/process_row_charts.tsx | 24 +- .../components/timeline/timeline.tsx | 3 +- .../toolbars/aws_ec2_toolbar_items.tsx} | 18 +- .../toolbars/aws_rds_toolbar_items.tsx} | 18 +- .../toolbars/aws_s3_toolbar_items.tsx} | 18 +- .../toolbars/aws_sqs_toolbar_items.tsx} | 17 +- .../toolbars}/cloud_toolbar_items.tsx | 14 +- .../toolbars/container_toolbar_items.tsx} | 9 +- .../toolbars/host_toolbar_items.tsx} | 18 +- .../metrics_and_groupby_toolbar_items.tsx | 22 +- .../toolbars/pod_toolbar_items.tsx} | 9 +- .../components/toolbars/toolbar.tsx | 74 ++-- .../components/toolbars/toolbar_wrapper.tsx | 2 +- .../components/toolbars/types.ts | 28 ++ .../inventory_view/hooks/use_timeline.ts | 3 +- .../components/chart_section_vis.tsx | 2 +- .../metric_detail/components/layout.tsx | 39 ++ .../components/layouts/aws_ec2_layout.tsx | 135 +++++++ .../layouts/aws_layout_sections.tsx | 242 +++++++++++ .../components/layouts/aws_rds_layout.tsx | 188 +++++++++ .../components/layouts/aws_s3_layout.tsx | 151 +++++++ .../components/layouts/aws_sqs_layout.tsx | 151 +++++++ .../components/layouts/container_layout.tsx | 300 ++++++++++++++ .../components/layouts/host_layout.tsx | 376 +++++++++++++++++ .../layouts/nginx_layout_sections.tsx | 112 ++++++ .../components/layouts/pod_layout.tsx | 164 ++++++++ .../metric_detail/components/page_body.tsx | 13 +- .../metrics_explorer/components/chart.tsx | 27 +- .../helpers => utils}/get_chart_theme.ts | 0 .../log_threshold/log_threshold_executor.ts | 2 +- .../metric_anomaly/metric_anomaly_executor.ts | 2 +- .../preview_metric_anomaly_alert.ts | 10 +- .../metric_threshold/lib/evaluate_rule.ts | 2 +- .../translations/translations/fr-FR.json | 2 - .../translations/translations/ja-JP.json | 2 - .../translations/translations/zh-CN.json | 2 - 64 files changed, 2117 insertions(+), 2178 deletions(-) delete mode 100644 x-pack/plugins/infra/common/inventory_models/aws_ec2/layout.tsx delete mode 100644 x-pack/plugins/infra/common/inventory_models/aws_rds/layout.tsx delete mode 100644 x-pack/plugins/infra/common/inventory_models/aws_s3/layout.tsx delete mode 100644 x-pack/plugins/infra/common/inventory_models/aws_sqs/layout.tsx delete mode 100644 x-pack/plugins/infra/common/inventory_models/container/layout.tsx delete mode 100644 x-pack/plugins/infra/common/inventory_models/host/layout.tsx delete mode 100644 x-pack/plugins/infra/common/inventory_models/layouts.ts delete mode 100644 x-pack/plugins/infra/common/inventory_models/pod/layout.tsx delete mode 100644 x-pack/plugins/infra/common/inventory_models/shared/layouts/aws.tsx delete mode 100644 x-pack/plugins/infra/common/inventory_models/shared/layouts/nginx.tsx delete mode 100644 x-pack/plugins/infra/common/inventory_models/toolbars.ts rename x-pack/plugins/infra/{server => common}/utils/get_interval_in_seconds.ts (100%) rename x-pack/plugins/infra/{common/inventory_models/aws_ec2/toolbar_items.tsx => public/pages/metrics/inventory_view/components/toolbars/aws_ec2_toolbar_items.tsx} (57%) rename x-pack/plugins/infra/{common/inventory_models/aws_rds/toolbar_items.tsx => public/pages/metrics/inventory_view/components/toolbars/aws_rds_toolbar_items.tsx} (55%) rename x-pack/plugins/infra/{common/inventory_models/aws_s3/toolbar_items.tsx => public/pages/metrics/inventory_view/components/toolbars/aws_s3_toolbar_items.tsx} (51%) rename x-pack/plugins/infra/{common/inventory_models/aws_sqs/toolbar_items.tsx => public/pages/metrics/inventory_view/components/toolbars/aws_sqs_toolbar_items.tsx} (51%) rename x-pack/plugins/infra/{common/inventory_models/shared/components => public/pages/metrics/inventory_view/components/toolbars}/cloud_toolbar_items.tsx (60%) rename x-pack/plugins/infra/{common/inventory_models/container/toolbar_items.tsx => public/pages/metrics/inventory_view/components/toolbars/container_toolbar_items.tsx} (62%) rename x-pack/plugins/infra/{common/inventory_models/host/toolbar_items.tsx => public/pages/metrics/inventory_view/components/toolbars/host_toolbar_items.tsx} (59%) rename x-pack/plugins/infra/{common/inventory_models/shared/components => public/pages/metrics/inventory_view/components/toolbars}/metrics_and_groupby_toolbar_items.tsx (64%) rename x-pack/plugins/infra/{common/inventory_models/pod/toolbar_items.tsx => public/pages/metrics/inventory_view/components/toolbars/pod_toolbar_items.tsx} (59%) create mode 100644 x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/types.ts create mode 100644 x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layout.tsx create mode 100644 x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/aws_ec2_layout.tsx create mode 100644 x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/aws_layout_sections.tsx create mode 100644 x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/aws_rds_layout.tsx create mode 100644 x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/aws_s3_layout.tsx create mode 100644 x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/aws_sqs_layout.tsx create mode 100644 x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/container_layout.tsx create mode 100644 x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/host_layout.tsx create mode 100644 x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/nginx_layout_sections.tsx create mode 100644 x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/pod_layout.tsx rename x-pack/plugins/infra/public/{pages/metrics/metrics_explorer/components/helpers => utils}/get_chart_theme.ts (100%) diff --git a/x-pack/plugins/infra/common/inventory_models/aws_ec2/index.ts b/x-pack/plugins/infra/common/inventory_models/aws_ec2/index.ts index 1040f3263ce3c..c15f1366d5273 100644 --- a/x-pack/plugins/infra/common/inventory_models/aws_ec2/index.ts +++ b/x-pack/plugins/infra/common/inventory_models/aws_ec2/index.ts @@ -9,6 +9,8 @@ import { i18n } from '@kbn/i18n'; import { metrics } from './metrics'; import { InventoryModel } from '../types'; +export { awsEC2SnapshotMetricTypes } from './metrics'; + export const awsEC2: InventoryModel = { id: 'awsEC2', displayName: i18n.translate('xpack.infra.inventoryModels.awsEC2.displayName', { diff --git a/x-pack/plugins/infra/common/inventory_models/aws_ec2/layout.tsx b/x-pack/plugins/infra/common/inventory_models/aws_ec2/layout.tsx deleted file mode 100644 index fccbdf814bb17..0000000000000 --- a/x-pack/plugins/infra/common/inventory_models/aws_ec2/layout.tsx +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { i18n } from '@kbn/i18n'; -import { withTheme } from '@kbn/kibana-react-plugin/common'; -import type { LayoutPropsWithTheme } from '../../../public/pages/metrics/metric_detail/types'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { Section } from '../../../public/pages/metrics/metric_detail/components/section'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { SubSection } from '../../../public/pages/metrics/metric_detail/components/sub_section'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { LayoutContent } from '../../../public/pages/metrics/metric_detail/components/layout_content'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { ChartSectionVis } from '../../../public/pages/metrics/metric_detail/components/chart_section_vis'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { MetadataDetails } from '../../../public/pages/metrics/metric_detail/components/metadata_details'; - -export const Layout = withTheme(({ metrics, theme, onChangeRangeTime }: LayoutPropsWithTheme) => ( - - - -
- - - - - - - - - -
-
-
-)); diff --git a/x-pack/plugins/infra/common/inventory_models/aws_ec2/metrics/index.ts b/x-pack/plugins/infra/common/inventory_models/aws_ec2/metrics/index.ts index f7eea3e78d6b8..d9344714bc156 100644 --- a/x-pack/plugins/infra/common/inventory_models/aws_ec2/metrics/index.ts +++ b/x-pack/plugins/infra/common/inventory_models/aws_ec2/metrics/index.ts @@ -17,13 +17,19 @@ import { awsEC2DiskIOBytes } from './tsvb/aws_ec2_diskio_bytes'; import { InventoryMetrics } from '../../types'; +const awsEC2SnapshotMetrics = { cpu, rx, tx, diskIOReadBytes, diskIOWriteBytes }; + +export const awsEC2SnapshotMetricTypes = Object.keys(awsEC2SnapshotMetrics) as Array< + keyof typeof awsEC2SnapshotMetrics +>; + export const metrics: InventoryMetrics = { tsvb: { awsEC2CpuUtilization, awsEC2NetworkTraffic, awsEC2DiskIOBytes, }, - snapshot: { cpu, rx, tx, diskIOReadBytes, diskIOWriteBytes }, + snapshot: awsEC2SnapshotMetrics, defaultSnapshot: 'cpu', defaultTimeRangeInSeconds: 14400, // 4 hours }; diff --git a/x-pack/plugins/infra/common/inventory_models/aws_rds/index.ts b/x-pack/plugins/infra/common/inventory_models/aws_rds/index.ts index 32dce60ff77a9..d1af6e0506142 100644 --- a/x-pack/plugins/infra/common/inventory_models/aws_rds/index.ts +++ b/x-pack/plugins/infra/common/inventory_models/aws_rds/index.ts @@ -9,6 +9,8 @@ import { i18n } from '@kbn/i18n'; import { metrics } from './metrics'; import { InventoryModel } from '../types'; +export { awsRDSSnapshotMetricTypes } from './metrics'; + export const awsRDS: InventoryModel = { id: 'awsRDS', displayName: i18n.translate('xpack.infra.inventoryModels.awsRDS.displayName', { diff --git a/x-pack/plugins/infra/common/inventory_models/aws_rds/layout.tsx b/x-pack/plugins/infra/common/inventory_models/aws_rds/layout.tsx deleted file mode 100644 index 025119cff2f85..0000000000000 --- a/x-pack/plugins/infra/common/inventory_models/aws_rds/layout.tsx +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { i18n } from '@kbn/i18n'; -import { withTheme } from '@kbn/kibana-react-plugin/common'; -import type { LayoutPropsWithTheme } from '../../../public/pages/metrics/metric_detail/types'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { Section } from '../../../public/pages/metrics/metric_detail/components/section'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { SubSection } from '../../../public/pages/metrics/metric_detail/components/sub_section'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { ChartSectionVis } from '../../../public/pages/metrics/metric_detail/components/chart_section_vis'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { LayoutContent } from '../../../public/pages/metrics/metric_detail/components/layout_content'; - -export const Layout = withTheme(({ metrics, onChangeRangeTime, theme }: LayoutPropsWithTheme) => ( - - -
- - - - - - - - - - - - - - - -
-
-
-)); diff --git a/x-pack/plugins/infra/common/inventory_models/aws_rds/metrics/index.ts b/x-pack/plugins/infra/common/inventory_models/aws_rds/metrics/index.ts index 8da1401a0cbae..0acc5caa9d85a 100644 --- a/x-pack/plugins/infra/common/inventory_models/aws_rds/metrics/index.ts +++ b/x-pack/plugins/infra/common/inventory_models/aws_rds/metrics/index.ts @@ -19,6 +19,18 @@ import { awsRDSCpuTotal } from './tsvb/aws_rds_cpu_total'; import { awsRDSQueriesExecuted } from './tsvb/aws_rds_queries_executed'; import { awsRDSActiveTransactions } from './tsvb/aws_rds_active_transactions'; +const awsRDSSnapshotMetrics = { + cpu, + rdsLatency, + rdsConnections, + rdsQueriesExecuted, + rdsActiveTransactions, +}; + +export const awsRDSSnapshotMetricTypes = Object.keys(awsRDSSnapshotMetrics) as Array< + keyof typeof awsRDSSnapshotMetrics +>; + export const metrics: InventoryMetrics = { tsvb: { awsRDSLatency, @@ -27,13 +39,7 @@ export const metrics: InventoryMetrics = { awsRDSQueriesExecuted, awsRDSActiveTransactions, }, - snapshot: { - cpu, - rdsLatency, - rdsConnections, - rdsQueriesExecuted, - rdsActiveTransactions, - }, + snapshot: awsRDSSnapshotMetrics, defaultSnapshot: 'cpu', defaultTimeRangeInSeconds: 14400, // 4 hours }; diff --git a/x-pack/plugins/infra/common/inventory_models/aws_s3/index.ts b/x-pack/plugins/infra/common/inventory_models/aws_s3/index.ts index 2401582220c58..7196fe72465c7 100644 --- a/x-pack/plugins/infra/common/inventory_models/aws_s3/index.ts +++ b/x-pack/plugins/infra/common/inventory_models/aws_s3/index.ts @@ -9,6 +9,8 @@ import { i18n } from '@kbn/i18n'; import { metrics } from './metrics'; import { InventoryModel } from '../types'; +export { awsS3SnapshotMetricTypes } from './metrics'; + export const awsS3: InventoryModel = { id: 'awsS3', displayName: i18n.translate('xpack.infra.inventoryModels.awsS3.displayName', { diff --git a/x-pack/plugins/infra/common/inventory_models/aws_s3/layout.tsx b/x-pack/plugins/infra/common/inventory_models/aws_s3/layout.tsx deleted file mode 100644 index 1452f04e4f380..0000000000000 --- a/x-pack/plugins/infra/common/inventory_models/aws_s3/layout.tsx +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { i18n } from '@kbn/i18n'; -import { withTheme } from '@kbn/kibana-react-plugin/common'; -import type { LayoutPropsWithTheme } from '../../../public/pages/metrics/metric_detail/types'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { Section } from '../../../public/pages/metrics/metric_detail/components/section'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { SubSection } from '../../../public/pages/metrics/metric_detail/components/sub_section'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { ChartSectionVis } from '../../../public/pages/metrics/metric_detail/components/chart_section_vis'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { LayoutContent } from '../../../public/pages/metrics/metric_detail/components/layout_content'; - -export const Layout = withTheme(({ metrics, onChangeRangeTime, theme }: LayoutPropsWithTheme) => ( - - -
- - - - - - - - - - - - - - - -
-
-
-)); diff --git a/x-pack/plugins/infra/common/inventory_models/aws_s3/metrics/index.ts b/x-pack/plugins/infra/common/inventory_models/aws_s3/metrics/index.ts index 43a1f9bcd077a..d590822879bd7 100644 --- a/x-pack/plugins/infra/common/inventory_models/aws_s3/metrics/index.ts +++ b/x-pack/plugins/infra/common/inventory_models/aws_s3/metrics/index.ts @@ -19,6 +19,18 @@ import { s3NumberOfObjects } from './snapshot/s3_number_of_objects'; import { s3DownloadBytes } from './snapshot/s3_download_bytes'; import { s3UploadBytes } from './snapshot/s3_upload_bytes'; +const awsS3SnapshotMetrics = { + s3BucketSize, + s3NumberOfObjects, + s3TotalRequests, + s3UploadBytes, + s3DownloadBytes, +}; + +export const awsS3SnapshotMetricTypes = Object.keys(awsS3SnapshotMetrics) as Array< + keyof typeof awsS3SnapshotMetrics +>; + export const metrics: InventoryMetrics = { tsvb: { awsS3BucketSize, @@ -27,13 +39,7 @@ export const metrics: InventoryMetrics = { awsS3DownloadBytes, awsS3UploadBytes, }, - snapshot: { - s3BucketSize, - s3NumberOfObjects, - s3TotalRequests, - s3UploadBytes, - s3DownloadBytes, - }, + snapshot: awsS3SnapshotMetrics, defaultSnapshot: 's3BucketSize', defaultTimeRangeInSeconds: 86400 * 7, // 7 days }; diff --git a/x-pack/plugins/infra/common/inventory_models/aws_sqs/index.ts b/x-pack/plugins/infra/common/inventory_models/aws_sqs/index.ts index 5c12c93be7d67..8d7a133d99788 100644 --- a/x-pack/plugins/infra/common/inventory_models/aws_sqs/index.ts +++ b/x-pack/plugins/infra/common/inventory_models/aws_sqs/index.ts @@ -9,6 +9,8 @@ import { i18n } from '@kbn/i18n'; import { metrics } from './metrics'; import { InventoryModel } from '../types'; +export { awsSQSSnapshotMetricTypes } from './metrics'; + export const awsSQS: InventoryModel = { id: 'awsSQS', displayName: i18n.translate('xpack.infra.inventoryModels.awsSQS.displayName', { diff --git a/x-pack/plugins/infra/common/inventory_models/aws_sqs/layout.tsx b/x-pack/plugins/infra/common/inventory_models/aws_sqs/layout.tsx deleted file mode 100644 index 869105fbd44d8..0000000000000 --- a/x-pack/plugins/infra/common/inventory_models/aws_sqs/layout.tsx +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { i18n } from '@kbn/i18n'; -import { withTheme } from '@kbn/kibana-react-plugin/common'; -import type { LayoutPropsWithTheme } from '../../../public/pages/metrics/metric_detail/types'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { Section } from '../../../public/pages/metrics/metric_detail/components/section'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { SubSection } from '../../../public/pages/metrics/metric_detail/components/sub_section'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { ChartSectionVis } from '../../../public/pages/metrics/metric_detail/components/chart_section_vis'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { LayoutContent } from '../../../public/pages/metrics/metric_detail/components/layout_content'; - -export const Layout = withTheme(({ metrics, onChangeRangeTime, theme }: LayoutPropsWithTheme) => ( - - -
- - - - - - - - - - - - - - - -
-
-
-)); diff --git a/x-pack/plugins/infra/common/inventory_models/aws_sqs/metrics/index.ts b/x-pack/plugins/infra/common/inventory_models/aws_sqs/metrics/index.ts index 43d88e3b2c212..1e59f29eb3c06 100644 --- a/x-pack/plugins/infra/common/inventory_models/aws_sqs/metrics/index.ts +++ b/x-pack/plugins/infra/common/inventory_models/aws_sqs/metrics/index.ts @@ -19,6 +19,18 @@ import { awsSQSMessagesSent } from './tsvb/aws_sqs_messages_sent'; import { awsSQSMessagesEmpty } from './tsvb/aws_sqs_messages_empty'; import { awsSQSOldestMessage } from './tsvb/aws_sqs_oldest_message'; +const awsSQSSnapshotMetrics = { + sqsMessagesVisible, + sqsMessagesDelayed, + sqsMessagesEmpty, + sqsMessagesSent, + sqsOldestMessage, +}; + +export const awsSQSSnapshotMetricTypes = Object.keys(awsSQSSnapshotMetrics) as Array< + keyof typeof awsSQSSnapshotMetrics +>; + export const metrics: InventoryMetrics = { tsvb: { awsSQSMessagesVisible, @@ -27,13 +39,7 @@ export const metrics: InventoryMetrics = { awsSQSMessagesEmpty, awsSQSOldestMessage, }, - snapshot: { - sqsMessagesVisible, - sqsMessagesDelayed, - sqsMessagesEmpty, - sqsMessagesSent, - sqsOldestMessage, - }, + snapshot: awsSQSSnapshotMetrics, defaultSnapshot: 'sqsMessagesVisible', defaultTimeRangeInSeconds: 14400, // 4 hours }; diff --git a/x-pack/plugins/infra/common/inventory_models/container/index.ts b/x-pack/plugins/infra/common/inventory_models/container/index.ts index 9e9ee6a0a3cc4..eb16a6a577a03 100644 --- a/x-pack/plugins/infra/common/inventory_models/container/index.ts +++ b/x-pack/plugins/infra/common/inventory_models/container/index.ts @@ -9,6 +9,8 @@ import { i18n } from '@kbn/i18n'; import { metrics } from './metrics'; import { InventoryModel } from '../types'; +export { containerSnapshotMetricTypes } from './metrics'; + export const container: InventoryModel = { id: 'container', displayName: i18n.translate('xpack.infra.inventoryModel.container.displayName', { diff --git a/x-pack/plugins/infra/common/inventory_models/container/layout.tsx b/x-pack/plugins/infra/common/inventory_models/container/layout.tsx deleted file mode 100644 index 9f39385a64b01..0000000000000 --- a/x-pack/plugins/infra/common/inventory_models/container/layout.tsx +++ /dev/null @@ -1,304 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { i18n } from '@kbn/i18n'; -import { withTheme } from '@kbn/kibana-react-plugin/common'; -import type { LayoutPropsWithTheme } from '../../../public/pages/metrics/metric_detail/types'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { Section } from '../../../public/pages/metrics/metric_detail/components/section'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { SubSection } from '../../../public/pages/metrics/metric_detail/components/sub_section'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { GaugesSectionVis } from '../../../public/pages/metrics/metric_detail/components/gauges_section_vis'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { ChartSectionVis } from '../../../public/pages/metrics/metric_detail/components/chart_section_vis'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { LayoutContent } from '../../../public/pages/metrics/metric_detail/components/layout_content'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { MetadataDetails } from '../../../public/pages/metrics/metric_detail/components/metadata_details'; - -export const Layout = withTheme(({ metrics, onChangeRangeTime, theme }: LayoutPropsWithTheme) => ( - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-)); diff --git a/x-pack/plugins/infra/common/inventory_models/container/metrics/index.ts b/x-pack/plugins/infra/common/inventory_models/container/metrics/index.ts index 053f6565333c0..eb0678890ad3a 100644 --- a/x-pack/plugins/infra/common/inventory_models/container/metrics/index.ts +++ b/x-pack/plugins/infra/common/inventory_models/container/metrics/index.ts @@ -22,6 +22,12 @@ import { containerK8sOverview } from './tsvb/container_k8s_overview'; import { containerK8sCpuUsage } from './tsvb/container_k8s_cpu_usage'; import { containerK8sMemoryUsage } from './tsvb/container_k8s_memory_usage'; +const containerSnapshotMetrics = { cpu, memory, rx, tx }; + +export const containerSnapshotMetricTypes = Object.keys(containerSnapshotMetrics) as Array< + keyof typeof containerSnapshotMetrics +>; + export const metrics: InventoryMetrics = { tsvb: { containerOverview, @@ -35,7 +41,7 @@ export const metrics: InventoryMetrics = { containerK8sOverview, containerK8sMemoryUsage, }, - snapshot: { cpu, memory, rx, tx }, + snapshot: containerSnapshotMetrics, defaultSnapshot: 'cpu', defaultTimeRangeInSeconds: 3600, // 1 hour }; diff --git a/x-pack/plugins/infra/common/inventory_models/host/index.ts b/x-pack/plugins/infra/common/inventory_models/host/index.ts index d4450738bddc8..8e2582c5e1f6f 100644 --- a/x-pack/plugins/infra/common/inventory_models/host/index.ts +++ b/x-pack/plugins/infra/common/inventory_models/host/index.ts @@ -13,6 +13,8 @@ import { nginx as nginxRequireMetrics, } from '../shared/metrics/required_metrics'; +export { hostSnapshotMetricTypes } from './metrics'; + export const host: InventoryModel = { id: 'host', displayName: i18n.translate('xpack.infra.inventoryModel.host.displayName', { diff --git a/x-pack/plugins/infra/common/inventory_models/host/layout.tsx b/x-pack/plugins/infra/common/inventory_models/host/layout.tsx deleted file mode 100644 index 40ef6055cb0aa..0000000000000 --- a/x-pack/plugins/infra/common/inventory_models/host/layout.tsx +++ /dev/null @@ -1,380 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { i18n } from '@kbn/i18n'; -import { withTheme } from '@kbn/kibana-react-plugin/common'; -import type { LayoutPropsWithTheme } from '../../../public/pages/metrics/metric_detail/types'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { Section } from '../../../public/pages/metrics/metric_detail/components/section'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { SubSection } from '../../../public/pages/metrics/metric_detail/components/sub_section'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { GaugesSectionVis } from '../../../public/pages/metrics/metric_detail/components/gauges_section_vis'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { ChartSectionVis } from '../../../public/pages/metrics/metric_detail/components/chart_section_vis'; -import * as Aws from '../shared/layouts/aws'; -import * as Ngnix from '../shared/layouts/nginx'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { MetadataDetails } from '../../../public/pages/metrics/metric_detail/components/metadata_details'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { LayoutContent } from '../../../public/pages/metrics/metric_detail/components/layout_content'; - -export const Layout = withTheme(({ metrics, onChangeRangeTime, theme }: LayoutPropsWithTheme) => ( - - - -
- - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - -
- - -
-
-)); diff --git a/x-pack/plugins/infra/common/inventory_models/host/metrics/index.ts b/x-pack/plugins/infra/common/inventory_models/host/metrics/index.ts index ae22e52f149ad..2190140cc0a5e 100644 --- a/x-pack/plugins/infra/common/inventory_models/host/metrics/index.ts +++ b/x-pack/plugins/infra/common/inventory_models/host/metrics/index.ts @@ -33,6 +33,14 @@ import { hostDockerInfo } from './tsvb/host_docker_info'; import { InventoryMetrics } from '../../types'; +const exposedHostSnapshotMetrics = { cpu, load, logRate, memory, rx, tx }; +// not sure why this is the only model with "count" +const hostSnapshotMetrics = { count, ...exposedHostSnapshotMetrics }; + +export const hostSnapshotMetricTypes = Object.keys(exposedHostSnapshotMetrics) as Array< + keyof typeof exposedHostSnapshotMetrics +>; + export const metrics: InventoryMetrics = { tsvb: { hostSystemOverview, @@ -51,7 +59,7 @@ export const metrics: InventoryMetrics = { hostDockerTop5ByMemory, hostDockerTop5ByCpu, }, - snapshot: { count, cpu, load, logRate, memory, rx, tx }, + snapshot: hostSnapshotMetrics, defaultSnapshot: 'cpu', defaultTimeRangeInSeconds: 3600, // 1 hour }; diff --git a/x-pack/plugins/infra/common/inventory_models/layouts.ts b/x-pack/plugins/infra/common/inventory_models/layouts.ts deleted file mode 100644 index 8886118d733b2..0000000000000 --- a/x-pack/plugins/infra/common/inventory_models/layouts.ts +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -/** - * WHY ARE THE LAYOUTS A SEPERATE FILE? - * - * Files with React can not be included on the server without - * crashing due to the requirement of the `window` object. - */ - -import { i18n } from '@kbn/i18n'; - -import { ReactNode, FunctionComponent } from 'react'; -import { Layout as HostLayout } from './host/layout'; -import { Layout as PodLayout } from './pod/layout'; -import { Layout as ContainerLayout } from './container/layout'; -import { Layout as AwsEC2Layout } from './aws_ec2/layout'; -import { Layout as AwsS3Layout } from './aws_s3/layout'; -import { Layout as AwsRDSLayout } from './aws_rds/layout'; -import { Layout as AwsSQSLayout } from './aws_sqs/layout'; -import { InventoryItemType } from './types'; -import type { LayoutProps } from '../../public/pages/metrics/metric_detail/types'; - -interface Layouts { - [type: string]: ReactNode; -} - -const layouts: Layouts = { - host: HostLayout, - pod: PodLayout, - container: ContainerLayout, - awsEC2: AwsEC2Layout, - awsS3: AwsS3Layout, - awsRDS: AwsRDSLayout, - awsSQS: AwsSQSLayout, -}; - -export const findLayout = (type: InventoryItemType) => { - const Layout = layouts?.[type]; - if (!Layout) { - throw new Error( - i18n.translate('xpack.infra.inventoryModels.findLayout.error', { - defaultMessage: "The layout you've attempted to find does not exist", - }) - ); - } - return Layout as FunctionComponent; -}; diff --git a/x-pack/plugins/infra/common/inventory_models/pod/index.ts b/x-pack/plugins/infra/common/inventory_models/pod/index.ts index d13f5f7d0f743..b7a2cb776c6db 100644 --- a/x-pack/plugins/infra/common/inventory_models/pod/index.ts +++ b/x-pack/plugins/infra/common/inventory_models/pod/index.ts @@ -10,6 +10,8 @@ import { metrics } from './metrics'; import { InventoryModel } from '../types'; import { nginx as nginxRequiredMetrics } from '../shared/metrics/required_metrics'; +export { podSnapshotMetricTypes } from './metrics'; + export const pod: InventoryModel = { id: 'pod', displayName: i18n.translate('xpack.infra.inventoryModel.pod.displayName', { diff --git a/x-pack/plugins/infra/common/inventory_models/pod/layout.tsx b/x-pack/plugins/infra/common/inventory_models/pod/layout.tsx deleted file mode 100644 index 5f1d619c334f7..0000000000000 --- a/x-pack/plugins/infra/common/inventory_models/pod/layout.tsx +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { i18n } from '@kbn/i18n'; -import { withTheme } from '@kbn/kibana-react-plugin/common'; -import type { LayoutPropsWithTheme } from '../../../public/pages/metrics/metric_detail/types'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { Section } from '../../../public/pages/metrics/metric_detail/components/section'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { SubSection } from '../../../public/pages/metrics/metric_detail/components/sub_section'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { GaugesSectionVis } from '../../../public/pages/metrics/metric_detail/components/gauges_section_vis'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { ChartSectionVis } from '../../../public/pages/metrics/metric_detail/components/chart_section_vis'; -import * as Nginx from '../shared/layouts/nginx'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { MetadataDetails } from '../../../public/pages/metrics/metric_detail/components/metadata_details'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { LayoutContent } from '../../../public/pages/metrics/metric_detail/components/layout_content'; - -export const Layout = withTheme(({ metrics, onChangeRangeTime, theme }: LayoutPropsWithTheme) => ( - - - -
- - - - - - - - - - - - -
- -
-
-)); diff --git a/x-pack/plugins/infra/common/inventory_models/pod/metrics/index.ts b/x-pack/plugins/infra/common/inventory_models/pod/metrics/index.ts index b9e5b8fc4ea19..25ec090da3a5d 100644 --- a/x-pack/plugins/infra/common/inventory_models/pod/metrics/index.ts +++ b/x-pack/plugins/infra/common/inventory_models/pod/metrics/index.ts @@ -17,6 +17,12 @@ import { podMemoryUsage } from './tsvb/pod_memory_usage'; import { podNetworkTraffic } from './tsvb/pod_network_traffic'; import { InventoryMetrics } from '../../types'; +const podSnapshotMetrics = { cpu, memory, rx, tx }; + +export const podSnapshotMetricTypes = Object.keys(podSnapshotMetrics) as Array< + keyof typeof podSnapshotMetrics +>; + export const metrics: InventoryMetrics = { tsvb: { podOverview, @@ -25,7 +31,7 @@ export const metrics: InventoryMetrics = { podNetworkTraffic, podMemoryUsage, }, - snapshot: { cpu, memory, rx, tx }, + snapshot: podSnapshotMetrics, defaultSnapshot: 'cpu', defaultTimeRangeInSeconds: 3600, // 1 hour }; diff --git a/x-pack/plugins/infra/common/inventory_models/shared/layouts/aws.tsx b/x-pack/plugins/infra/common/inventory_models/shared/layouts/aws.tsx deleted file mode 100644 index e326b004299af..0000000000000 --- a/x-pack/plugins/infra/common/inventory_models/shared/layouts/aws.tsx +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { i18n } from '@kbn/i18n'; -import { withTheme } from '@kbn/kibana-react-plugin/common'; -import type { LayoutPropsWithTheme } from '../../../../public/pages/metrics/metric_detail/types'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { Section } from '../../../../public/pages/metrics/metric_detail/components/section'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { SubSection } from '../../../../public/pages/metrics/metric_detail/components/sub_section'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { GaugesSectionVis } from '../../../../public/pages/metrics/metric_detail/components/gauges_section_vis'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { ChartSectionVis } from '../../../../public/pages/metrics/metric_detail/components/chart_section_vis'; - -export const Layout = withTheme(({ metrics, onChangeRangeTime, theme }: LayoutPropsWithTheme) => ( - -
- - - - - - - - - - - - - - - - - - -
-
-)); diff --git a/x-pack/plugins/infra/common/inventory_models/shared/layouts/nginx.tsx b/x-pack/plugins/infra/common/inventory_models/shared/layouts/nginx.tsx deleted file mode 100644 index f5be0461d4a9d..0000000000000 --- a/x-pack/plugins/infra/common/inventory_models/shared/layouts/nginx.tsx +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { i18n } from '@kbn/i18n'; -import { withTheme } from '@kbn/kibana-react-plugin/common'; -import type { LayoutPropsWithTheme } from '../../../../public/pages/metrics/metric_detail/types'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { Section } from '../../../../public/pages/metrics/metric_detail/components/section'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { SubSection } from '../../../../public/pages/metrics/metric_detail/components/sub_section'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { ChartSectionVis } from '../../../../public/pages/metrics/metric_detail/components/chart_section_vis'; - -export const Layout = withTheme(({ metrics, onChangeRangeTime, theme }: LayoutPropsWithTheme) => ( - -
- - - - - - - - - - - - -
-
-)); diff --git a/x-pack/plugins/infra/common/inventory_models/toolbars.ts b/x-pack/plugins/infra/common/inventory_models/toolbars.ts deleted file mode 100644 index 43bcab343d7c6..0000000000000 --- a/x-pack/plugins/infra/common/inventory_models/toolbars.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { ReactNode, FunctionComponent } from 'react'; -import { i18n } from '@kbn/i18n'; -import { InventoryItemType } from './types'; -import { HostToolbarItems } from './host/toolbar_items'; -import { ContainerToolbarItems } from './container/toolbar_items'; -import { PodToolbarItems } from './pod/toolbar_items'; -import type { ToolbarProps } from '../../public/pages/metrics/inventory_view/components/toolbars/toolbar'; -import { AwsEC2ToolbarItems } from './aws_ec2/toolbar_items'; -import { AwsS3ToolbarItems } from './aws_s3/toolbar_items'; -import { AwsRDSToolbarItems } from './aws_rds/toolbar_items'; -import { AwsSQSToolbarItems } from './aws_sqs/toolbar_items'; - -interface Toolbars { - [type: string]: ReactNode; -} - -const toolbars: Toolbars = { - host: HostToolbarItems, - container: ContainerToolbarItems, - pod: PodToolbarItems, - awsEC2: AwsEC2ToolbarItems, - awsS3: AwsS3ToolbarItems, - awsRDS: AwsRDSToolbarItems, - awsSQS: AwsSQSToolbarItems, -}; - -export const findToolbar = (type: InventoryItemType) => { - const Toolbar = toolbars?.[type]; - if (!Toolbar) { - throw new Error( - i18n.translate('xpack.infra.inventoryModels.findToolbar.error', { - defaultMessage: "The toolbar you've attempted to find does not exist.", - }) - ); - } - return Toolbar as FunctionComponent; -}; diff --git a/x-pack/plugins/infra/server/utils/get_interval_in_seconds.ts b/x-pack/plugins/infra/common/utils/get_interval_in_seconds.ts similarity index 100% rename from x-pack/plugins/infra/server/utils/get_interval_in_seconds.ts rename to x-pack/plugins/infra/common/utils/get_interval_in_seconds.ts diff --git a/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx b/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx index 6db6587f2b475..26fb14f3ad37a 100644 --- a/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx +++ b/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx @@ -4,7 +4,6 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React, { ChangeEvent, useCallback, useEffect, useMemo, useState } from 'react'; import { EuiButtonEmpty, EuiButtonIcon, @@ -21,15 +20,16 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { debounce, omit } from 'lodash'; import { euiStyled } from '@kbn/kibana-react-plugin/common'; +import { TimeUnitChar } from '@kbn/observability-plugin/common/utils/formatters/duration'; import { ForLastExpression, IErrorObject, RuleTypeParamsExpressionProps, ThresholdExpression, } from '@kbn/triggers-actions-ui-plugin/public'; -import { TimeUnitChar } from '@kbn/observability-plugin/common/utils/formatters/duration'; +import { debounce, omit } from 'lodash'; +import React, { ChangeEvent, useCallback, useEffect, useMemo, useState } from 'react'; import { Comparator, FilterQuery, @@ -41,13 +41,13 @@ import { SnapshotCustomMetricInputRT, } from '../../../../common/http_api/snapshot_api'; import { findInventoryModel } from '../../../../common/inventory_models'; -import { ec2MetricTypes } from '../../../../common/inventory_models/aws_ec2/toolbar_items'; -import { rdsMetricTypes } from '../../../../common/inventory_models/aws_rds/toolbar_items'; -import { s3MetricTypes } from '../../../../common/inventory_models/aws_s3/toolbar_items'; -import { sqsMetricTypes } from '../../../../common/inventory_models/aws_sqs/toolbar_items'; -import { containerMetricTypes } from '../../../../common/inventory_models/container/toolbar_items'; -import { hostMetricTypes } from '../../../../common/inventory_models/host/toolbar_items'; -import { podMetricTypes } from '../../../../common/inventory_models/pod/toolbar_items'; +import { awsEC2SnapshotMetricTypes } from '../../../../common/inventory_models/aws_ec2'; +import { awsRDSSnapshotMetricTypes } from '../../../../common/inventory_models/aws_rds'; +import { awsS3SnapshotMetricTypes } from '../../../../common/inventory_models/aws_s3'; +import { awsSQSSnapshotMetricTypes } from '../../../../common/inventory_models/aws_sqs'; +import { containerSnapshotMetricTypes } from '../../../../common/inventory_models/container'; +import { hostSnapshotMetricTypes } from '../../../../common/inventory_models/host'; +import { podSnapshotMetricTypes } from '../../../../common/inventory_models/pod'; import { InventoryItemType, SnapshotMetricType, @@ -545,30 +545,29 @@ export const ExpressionRow: React.FC = (props) => { ); const ofFields = useMemo(() => { - let myMetrics = hostMetricTypes; + let myMetrics: SnapshotMetricType[] = hostSnapshotMetricTypes; switch (props.nodeType) { case 'awsEC2': - myMetrics = ec2MetricTypes; + myMetrics = awsEC2SnapshotMetricTypes; break; case 'awsRDS': - myMetrics = rdsMetricTypes; + myMetrics = awsRDSSnapshotMetricTypes; break; case 'awsS3': - myMetrics = s3MetricTypes; + myMetrics = awsS3SnapshotMetricTypes; break; case 'awsSQS': - myMetrics = sqsMetricTypes; + myMetrics = awsSQSSnapshotMetricTypes; break; case 'host': - myMetrics = hostMetricTypes; - + myMetrics = hostSnapshotMetricTypes; break; case 'pod': - myMetrics = podMetricTypes; + myMetrics = podSnapshotMetricTypes; break; case 'container': - myMetrics = containerMetricTypes; + myMetrics = containerSnapshotMetricTypes; break; } return myMetrics.map(toMetricOpt); diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/metrics/chart_section.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/metrics/chart_section.tsx index 6c6992c118ca5..ebe497e1e772e 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/metrics/chart_section.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/metrics/chart_section.tsx @@ -7,25 +7,25 @@ import { Axis, - Settings, - Position, Chart, + ChartSizeArray, PointerUpdateListener, + Position, + Settings, TickFormatter, TooltipValue, - ChartSizeArray, } from '@elastic/charts'; -import React from 'react'; -import moment from 'moment'; import { useUiSetting } from '@kbn/kibana-react-plugin/public'; +import moment from 'moment'; +import React from 'react'; import { MetricsExplorerSeries } from '../../../../../../../../common/http_api'; +import { getTimelineChartTheme } from '../../../../../../../utils/get_chart_theme'; import { MetricExplorerSeriesChart } from '../../../../../metrics_explorer/components/series_chart'; import { MetricsExplorerChartType, MetricsExplorerOptionsMetric, } from '../../../../../metrics_explorer/hooks/use_metrics_explorer_options'; import { ChartHeader } from './chart_header'; -import { getTimelineChartTheme } from '../../../../../metrics_explorer/components/helpers/get_chart_theme'; const CHART_SIZE: ChartSizeArray = ['100%', 160]; diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/processes/process_row_charts.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/processes/process_row_charts.tsx index 2270b1e827e1b..05587992f4193 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/processes/process_row_charts.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/processes/process_row_charts.tsx @@ -5,28 +5,28 @@ * 2.0. */ -import React, { useMemo } from 'react'; -import moment from 'moment'; -import { first, last } from 'lodash'; -import { i18n } from '@kbn/i18n'; +import { Axis, Chart, niceTimeFormatter, Position, Settings, TooltipValue } from '@elastic/charts'; import { - EuiDescriptionListTitle, EuiDescriptionListDescription, + EuiDescriptionListTitle, + EuiEmptyPrompt, EuiFlexItem, EuiLoadingChart, - EuiEmptyPrompt, EuiText, } from '@elastic/eui'; -import { Axis, Chart, Settings, Position, TooltipValue, niceTimeFormatter } from '@elastic/charts'; -import { useUiSetting } from '@kbn/kibana-react-plugin/public'; +import { i18n } from '@kbn/i18n'; import { euiStyled } from '@kbn/kibana-react-plugin/common'; +import { useUiSetting } from '@kbn/kibana-react-plugin/public'; +import { first, last } from 'lodash'; +import moment from 'moment'; +import React, { useMemo } from 'react'; +import { Color } from '../../../../../../../../common/color_palette'; import { createFormatter } from '../../../../../../../../common/formatters'; -import { getChartTheme } from '../../../../../metrics_explorer/components/helpers/get_chart_theme'; +import { MetricsExplorerAggregation } from '../../../../../../../../common/http_api'; +import { getChartTheme } from '../../../../../../../utils/get_chart_theme'; import { calculateDomain } from '../../../../../metrics_explorer/components/helpers/calculate_domain'; -import { MetricsExplorerChartType } from '../../../../../metrics_explorer/hooks/use_metrics_explorer_options'; import { MetricExplorerSeriesChart } from '../../../../../metrics_explorer/components/series_chart'; -import { MetricsExplorerAggregation } from '../../../../../../../../common/http_api'; -import { Color } from '../../../../../../../../common/color_palette'; +import { MetricsExplorerChartType } from '../../../../../metrics_explorer/hooks/use_metrics_explorer_options'; import { useProcessListRowChart } from '../../../../hooks/use_process_list_row_chart'; import { Process } from './types'; diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/timeline/timeline.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/timeline/timeline.tsx index 7e8294974e440..464ccc04ee546 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/timeline/timeline.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/timeline/timeline.tsx @@ -38,9 +38,8 @@ import { useWaffleTimeContext } from '../../hooks/use_waffle_time'; import { useWaffleFiltersContext } from '../../hooks/use_waffle_filters'; import { MetricExplorerSeriesChart } from '../../../metrics_explorer/components/series_chart'; import { MetricsExplorerChartType } from '../../../metrics_explorer/hooks/use_metrics_explorer_options'; -import { getTimelineChartTheme } from '../../../metrics_explorer/components/helpers/get_chart_theme'; +import { getTimelineChartTheme } from '../../../../../utils/get_chart_theme'; import { calculateDomain } from '../../../metrics_explorer/components/helpers/calculate_domain'; - import { InfraFormatter } from '../../../../../lib/lib'; import { useMetricsHostsAnomaliesResults } from '../../hooks/use_metrics_hosts_anomalies'; import { useMetricsK8sAnomaliesResults } from '../../hooks/use_metrics_k8s_anomalies'; diff --git a/x-pack/plugins/infra/common/inventory_models/aws_ec2/toolbar_items.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/aws_ec2_toolbar_items.tsx similarity index 57% rename from x-pack/plugins/infra/common/inventory_models/aws_ec2/toolbar_items.tsx rename to x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/aws_ec2_toolbar_items.tsx index bb94f05d62011..ec593e4acd4db 100644 --- a/x-pack/plugins/infra/common/inventory_models/aws_ec2/toolbar_items.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/aws_ec2_toolbar_items.tsx @@ -6,18 +6,10 @@ */ import React from 'react'; -import type { ToolbarProps } from '../../../public/pages/metrics/inventory_view/components/toolbars/toolbar'; -import { MetricsAndGroupByToolbarItems } from '../shared/components/metrics_and_groupby_toolbar_items'; -import { CloudToolbarItems } from '../shared/components/cloud_toolbar_items'; -import { SnapshotMetricType } from '../types'; - -export const ec2MetricTypes: SnapshotMetricType[] = [ - 'cpu', - 'rx', - 'tx', - 'diskIOReadBytes', - 'diskIOWriteBytes', -]; +import { awsEC2SnapshotMetricTypes } from '../../../../../../common/inventory_models/aws_ec2'; +import { MetricsAndGroupByToolbarItems } from './metrics_and_groupby_toolbar_items'; +import { CloudToolbarItems } from './cloud_toolbar_items'; +import { ToolbarProps } from './types'; export const ec2groupByFields = [ 'cloud.availability_zone', @@ -32,7 +24,7 @@ export const AwsEC2ToolbarItems = (props: ToolbarProps) => { diff --git a/x-pack/plugins/infra/common/inventory_models/aws_rds/toolbar_items.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/aws_rds_toolbar_items.tsx similarity index 55% rename from x-pack/plugins/infra/common/inventory_models/aws_rds/toolbar_items.tsx rename to x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/aws_rds_toolbar_items.tsx index d952aac75f456..8d0661dfbab13 100644 --- a/x-pack/plugins/infra/common/inventory_models/aws_rds/toolbar_items.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/aws_rds_toolbar_items.tsx @@ -6,18 +6,10 @@ */ import React from 'react'; -import type { ToolbarProps } from '../../../public/pages/metrics/inventory_view/components/toolbars/toolbar'; -import { MetricsAndGroupByToolbarItems } from '../shared/components/metrics_and_groupby_toolbar_items'; -import { CloudToolbarItems } from '../shared/components/cloud_toolbar_items'; -import { SnapshotMetricType } from '../types'; - -export const rdsMetricTypes: SnapshotMetricType[] = [ - 'cpu', - 'rdsConnections', - 'rdsQueriesExecuted', - 'rdsActiveTransactions', - 'rdsLatency', -]; +import { awsRDSSnapshotMetricTypes } from '../../../../../../common/inventory_models/aws_rds'; +import { CloudToolbarItems } from './cloud_toolbar_items'; +import { MetricsAndGroupByToolbarItems } from './metrics_and_groupby_toolbar_items'; +import type { ToolbarProps } from './types'; export const rdsGroupByFields = [ 'cloud.availability_zone', @@ -31,7 +23,7 @@ export const AwsRDSToolbarItems = (props: ToolbarProps) => { diff --git a/x-pack/plugins/infra/common/inventory_models/aws_s3/toolbar_items.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/aws_s3_toolbar_items.tsx similarity index 51% rename from x-pack/plugins/infra/common/inventory_models/aws_s3/toolbar_items.tsx rename to x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/aws_s3_toolbar_items.tsx index 11e0e172e1d06..b60f99fed7c46 100644 --- a/x-pack/plugins/infra/common/inventory_models/aws_s3/toolbar_items.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/aws_s3_toolbar_items.tsx @@ -6,18 +6,10 @@ */ import React from 'react'; -import type { ToolbarProps } from '../../../public/pages/metrics/inventory_view/components/toolbars/toolbar'; -import { MetricsAndGroupByToolbarItems } from '../shared/components/metrics_and_groupby_toolbar_items'; -import { CloudToolbarItems } from '../shared/components/cloud_toolbar_items'; -import { SnapshotMetricType } from '../types'; - -export const s3MetricTypes: SnapshotMetricType[] = [ - 's3BucketSize', - 's3NumberOfObjects', - 's3TotalRequests', - 's3DownloadBytes', - 's3UploadBytes', -]; +import { awsS3SnapshotMetricTypes } from '../../../../../../common/inventory_models/aws_s3'; +import { CloudToolbarItems } from './cloud_toolbar_items'; +import { MetricsAndGroupByToolbarItems } from './metrics_and_groupby_toolbar_items'; +import type { ToolbarProps } from './types'; export const s3GroupByFields = ['cloud.region']; @@ -27,7 +19,7 @@ export const AwsS3ToolbarItems = (props: ToolbarProps) => { diff --git a/x-pack/plugins/infra/common/inventory_models/aws_sqs/toolbar_items.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/aws_sqs_toolbar_items.tsx similarity index 51% rename from x-pack/plugins/infra/common/inventory_models/aws_sqs/toolbar_items.tsx rename to x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/aws_sqs_toolbar_items.tsx index e58ad2b3c31fc..246a22e8a398a 100644 --- a/x-pack/plugins/infra/common/inventory_models/aws_sqs/toolbar_items.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/aws_sqs_toolbar_items.tsx @@ -6,18 +6,11 @@ */ import React from 'react'; -import type { ToolbarProps } from '../../../public/pages/metrics/inventory_view/components/toolbars/toolbar'; -import { MetricsAndGroupByToolbarItems } from '../shared/components/metrics_and_groupby_toolbar_items'; -import { CloudToolbarItems } from '../shared/components/cloud_toolbar_items'; -import { SnapshotMetricType } from '../types'; +import { awsSQSSnapshotMetricTypes } from '../../../../../../common/inventory_models/aws_sqs'; +import { CloudToolbarItems } from './cloud_toolbar_items'; +import { MetricsAndGroupByToolbarItems } from './metrics_and_groupby_toolbar_items'; +import type { ToolbarProps } from './types'; -export const sqsMetricTypes: SnapshotMetricType[] = [ - 'sqsMessagesVisible', - 'sqsMessagesDelayed', - 'sqsMessagesSent', - 'sqsMessagesEmpty', - 'sqsOldestMessage', -]; export const sqsGroupByFields = ['cloud.region']; export const AwsSQSToolbarItems = (props: ToolbarProps) => { @@ -26,7 +19,7 @@ export const AwsSQSToolbarItems = (props: ToolbarProps) => { diff --git a/x-pack/plugins/infra/common/inventory_models/shared/components/cloud_toolbar_items.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/cloud_toolbar_items.tsx similarity index 60% rename from x-pack/plugins/infra/common/inventory_models/shared/components/cloud_toolbar_items.tsx rename to x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/cloud_toolbar_items.tsx index 338d56a4d6c31..0a3beffb518c2 100644 --- a/x-pack/plugins/infra/common/inventory_models/shared/components/cloud_toolbar_items.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/cloud_toolbar_items.tsx @@ -5,17 +5,13 @@ * 2.0. */ -import React from 'react'; import { EuiFlexItem } from '@elastic/eui'; -import type { ToolbarProps } from '../../../../public/pages/metrics/inventory_view/components/toolbars/toolbar'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { WaffleAccountsControls } from '../../../../public/pages/metrics/inventory_view/components/waffle/waffle_accounts_controls'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { WaffleRegionControls } from '../../../../public/pages/metrics/inventory_view/components/waffle/waffle_region_controls'; - -type Props = ToolbarProps; +import React from 'react'; +import { WaffleAccountsControls } from '../waffle/waffle_accounts_controls'; +import { WaffleRegionControls } from '../waffle/waffle_region_controls'; +import type { ToolbarProps } from './types'; -export const CloudToolbarItems = (props: Props) => { +export const CloudToolbarItems = (props: ToolbarProps) => { return ( <> {props.accounts.length > 0 && ( diff --git a/x-pack/plugins/infra/common/inventory_models/container/toolbar_items.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/container_toolbar_items.tsx similarity index 62% rename from x-pack/plugins/infra/common/inventory_models/container/toolbar_items.tsx rename to x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/container_toolbar_items.tsx index 62698b586a682..ac6f0d0f50dd1 100644 --- a/x-pack/plugins/infra/common/inventory_models/container/toolbar_items.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/container_toolbar_items.tsx @@ -6,11 +6,10 @@ */ import React from 'react'; -import type { ToolbarProps } from '../../../public/pages/metrics/inventory_view/components/toolbars/toolbar'; -import { MetricsAndGroupByToolbarItems } from '../shared/components/metrics_and_groupby_toolbar_items'; -import { SnapshotMetricType } from '../types'; +import { containerSnapshotMetricTypes } from '../../../../../../common/inventory_models/container'; +import { MetricsAndGroupByToolbarItems } from './metrics_and_groupby_toolbar_items'; +import type { ToolbarProps } from './types'; -export const containerMetricTypes: SnapshotMetricType[] = ['cpu', 'memory', 'rx', 'tx']; export const containerGroupByFields = [ 'host.name', 'cloud.availability_zone', @@ -24,7 +23,7 @@ export const ContainerToolbarItems = (props: ToolbarProps) => { return ( ); diff --git a/x-pack/plugins/infra/common/inventory_models/host/toolbar_items.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/host_toolbar_items.tsx similarity index 59% rename from x-pack/plugins/infra/common/inventory_models/host/toolbar_items.tsx rename to x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/host_toolbar_items.tsx index d5d9a7cd2d2ad..7a26829ec7d32 100644 --- a/x-pack/plugins/infra/common/inventory_models/host/toolbar_items.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/host_toolbar_items.tsx @@ -4,20 +4,11 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - import React from 'react'; -import type { ToolbarProps } from '../../../public/pages/metrics/inventory_view/components/toolbars/toolbar'; -import { MetricsAndGroupByToolbarItems } from '../shared/components/metrics_and_groupby_toolbar_items'; -import { SnapshotMetricType } from '../types'; +import { hostSnapshotMetricTypes } from '../../../../../../common/inventory_models/host'; +import { MetricsAndGroupByToolbarItems } from './metrics_and_groupby_toolbar_items'; +import type { ToolbarProps } from './types'; -export const hostMetricTypes: SnapshotMetricType[] = [ - 'cpu', - 'memory', - 'load', - 'rx', - 'tx', - 'logRate', -]; export const hostGroupByFields = [ 'cloud.availability_zone', 'cloud.machine.type', @@ -25,11 +16,12 @@ export const hostGroupByFields = [ 'cloud.provider', 'service.type', ]; + export const HostToolbarItems = (props: ToolbarProps) => { return ( ); diff --git a/x-pack/plugins/infra/common/inventory_models/shared/components/metrics_and_groupby_toolbar_items.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/metrics_and_groupby_toolbar_items.tsx similarity index 64% rename from x-pack/plugins/infra/common/inventory_models/shared/components/metrics_and_groupby_toolbar_items.tsx rename to x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/metrics_and_groupby_toolbar_items.tsx index 49902df21c350..6cc669e73e954 100644 --- a/x-pack/plugins/infra/common/inventory_models/shared/components/metrics_and_groupby_toolbar_items.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/metrics_and_groupby_toolbar_items.tsx @@ -5,21 +5,15 @@ * 2.0. */ -import React, { useMemo } from 'react'; import { EuiFlexItem } from '@elastic/eui'; -import { toMetricOpt } from '../../../snapshot_metric_i18n'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { WaffleSortControls } from '../../../../public/pages/metrics/inventory_view/components/waffle/waffle_sort_controls'; -import type { ToolbarProps } from '../../../../public/pages/metrics/inventory_view/components/toolbars/toolbar'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { WaffleMetricControls } from '../../../../public/pages/metrics/inventory_view/components/waffle/metric_control'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { WaffleGroupByControls } from '../../../../public/pages/metrics/inventory_view/components/waffle/waffle_group_by_controls'; -import { - toGroupByOpt, - // eslint-disable-next-line @kbn/imports/no_boundary_crossing -} from '../../../../public/pages/metrics/inventory_view/components/toolbars/toolbar_wrapper'; -import { SnapshotMetricType } from '../../types'; +import React, { useMemo } from 'react'; +import { SnapshotMetricType } from '../../../../../../common/inventory_models/types'; +import { toMetricOpt } from '../../../../../../common/snapshot_metric_i18n'; +import { WaffleMetricControls } from '../waffle/metric_control'; +import { WaffleGroupByControls } from '../waffle/waffle_group_by_controls'; +import { WaffleSortControls } from '../waffle/waffle_sort_controls'; +import { toGroupByOpt } from './toolbar_wrapper'; +import type { ToolbarProps } from './types'; interface Props extends ToolbarProps { metricTypes: SnapshotMetricType[]; diff --git a/x-pack/plugins/infra/common/inventory_models/pod/toolbar_items.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/pod_toolbar_items.tsx similarity index 59% rename from x-pack/plugins/infra/common/inventory_models/pod/toolbar_items.tsx rename to x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/pod_toolbar_items.tsx index 1b9fc9c9d1ecb..0e12fbd5cc6d2 100644 --- a/x-pack/plugins/infra/common/inventory_models/pod/toolbar_items.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/pod_toolbar_items.tsx @@ -6,18 +6,17 @@ */ import React from 'react'; -import type { ToolbarProps } from '../../../public/pages/metrics/inventory_view/components/toolbars/toolbar'; -import { MetricsAndGroupByToolbarItems } from '../shared/components/metrics_and_groupby_toolbar_items'; -import { SnapshotMetricType } from '../types'; +import { podSnapshotMetricTypes } from '../../../../../../common/inventory_models/pod'; +import { MetricsAndGroupByToolbarItems } from './metrics_and_groupby_toolbar_items'; +import type { ToolbarProps } from './types'; -export const podMetricTypes: SnapshotMetricType[] = ['cpu', 'memory', 'rx', 'tx']; export const podGroupByFields = ['kubernetes.namespace', 'kubernetes.node.name', 'service.type']; export const PodToolbarItems = (props: ToolbarProps) => { return ( ); diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/toolbar.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/toolbar.tsx index 83eb9b1f4fe00..5711fad511d8e 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/toolbar.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/toolbar.tsx @@ -5,41 +5,30 @@ * 2.0. */ -import React, { FunctionComponent } from 'react'; import { EuiFlexItem } from '@elastic/eui'; +import React from 'react'; +import { InventoryItemType } from '../../../../../../common/inventory_models/types'; import { useSourceContext } from '../../../../../containers/metrics_source'; -import { - SnapshotMetricInput, - SnapshotGroupBy, - SnapshotCustomMetricInput, -} from '../../../../../../common/http_api/snapshot_api'; -import { InventoryCloudAccount } from '../../../../../../common/http_api/inventory_meta_api'; -import { findToolbar } from '../../../../../../common/inventory_models/toolbars'; +import { useInventoryMeta } from '../../hooks/use_inventory_meta'; +import { AwsEC2ToolbarItems } from './aws_ec2_toolbar_items'; +import { AwsRDSToolbarItems } from './aws_rds_toolbar_items'; +import { AwsS3ToolbarItems } from './aws_s3_toolbar_items'; +import { AwsSQSToolbarItems } from './aws_sqs_toolbar_items'; +import { ContainerToolbarItems } from './container_toolbar_items'; +import { HostToolbarItems } from './host_toolbar_items'; +import { PodToolbarItems } from './pod_toolbar_items'; import { ToolbarWrapper } from './toolbar_wrapper'; +import { ToolbarProps } from './types'; -import { InfraGroupByOptions } from '../../../../../lib/lib'; -import { InventoryItemType } from '../../../../../../common/inventory_models/types'; -import { WaffleOptionsState, WaffleSortOption } from '../../hooks/use_waffle_options'; -import { useInventoryMeta } from '../../hooks/use_inventory_meta'; -import { CreateDerivedIndexPattern } from '../../../../../containers/metrics_source'; -export interface ToolbarProps extends Omit { - createDerivedIndexPattern: CreateDerivedIndexPattern; - changeMetric: (payload: SnapshotMetricInput) => void; - changeGroupBy: (payload: SnapshotGroupBy) => void; - changeCustomOptions: (payload: InfraGroupByOptions[]) => void; - changeAccount: (id: string) => void; - changeRegion: (name: string) => void; - changeSort: (sort: WaffleSortOption) => void; - accounts: InventoryCloudAccount[]; - regions: string[]; - changeCustomMetrics: (payload: SnapshotCustomMetricInput[]) => void; +interface Props { + nodeType: InventoryItemType; + currentTime: number; } -const wrapToolbarItems = ( - ToolbarItems: FunctionComponent, - accounts: InventoryCloudAccount[], - regions: string[] -) => { +export const Toolbar = ({ nodeType, currentTime }: Props) => { + const { sourceId } = useSourceContext(); + const { accounts, regions } = useInventoryMeta(sourceId, nodeType, currentTime); + return ( {(props) => ( @@ -52,14 +41,21 @@ const wrapToolbarItems = ( ); }; -interface Props { - nodeType: InventoryItemType; - currentTime: number; -} - -export const Toolbar = ({ nodeType, currentTime }: Props) => { - const { sourceId } = useSourceContext(); - const { accounts, regions } = useInventoryMeta(sourceId, nodeType, currentTime); - const ToolbarItems = findToolbar(nodeType); - return wrapToolbarItems(ToolbarItems, accounts, regions); +export const ToolbarItems = (props: ToolbarProps) => { + switch (props.nodeType) { + case 'awsEC2': + return ; + case 'awsRDS': + return ; + case 'awsS3': + return ; + case 'awsSQS': + return ; + case 'container': + return ; + case 'host': + return ; + case 'pod': + return ; + } }; diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/toolbar_wrapper.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/toolbar_wrapper.tsx index 7fc332ead45c7..1b81c3046362a 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/toolbar_wrapper.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/toolbar_wrapper.tsx @@ -11,7 +11,7 @@ import { fieldToName } from '../../lib/field_to_display_name'; import { useSourceContext } from '../../../../../containers/metrics_source'; import { useWaffleOptionsContext } from '../../hooks/use_waffle_options'; import { WaffleInventorySwitcher } from '../waffle/waffle_inventory_switcher'; -import { ToolbarProps } from './toolbar'; +import { ToolbarProps } from './types'; interface Props { children: (props: Omit) => React.ReactElement; diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/types.ts b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/types.ts new file mode 100644 index 0000000000000..c655cf62d503c --- /dev/null +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/toolbars/types.ts @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { InventoryCloudAccount } from '../../../../../../common/http_api/inventory_meta_api'; +import { + SnapshotCustomMetricInput, + SnapshotGroupBy, + SnapshotMetricInput, +} from '../../../../../../common/http_api/snapshot_api'; +import { CreateDerivedIndexPattern } from '../../../../../containers/metrics_source'; +import { InfraGroupByOptions } from '../../../../../lib/lib'; +import { WaffleOptionsState, WaffleSortOption } from '../../hooks/use_waffle_options'; + +export interface ToolbarProps extends Omit { + createDerivedIndexPattern: CreateDerivedIndexPattern; + changeMetric: (payload: SnapshotMetricInput) => void; + changeGroupBy: (payload: SnapshotGroupBy) => void; + changeCustomOptions: (payload: InfraGroupByOptions[]) => void; + changeAccount: (id: string) => void; + changeRegion: (name: string) => void; + changeSort: (sort: WaffleSortOption) => void; + accounts: InventoryCloudAccount[]; + regions: string[]; + changeCustomMetrics: (payload: SnapshotCustomMetricInput[]) => void; +} diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_timeline.ts b/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_timeline.ts index 8c062b2188a10..46e92d77e2a97 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_timeline.ts +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_timeline.ts @@ -10,8 +10,7 @@ import { identity } from 'fp-ts/lib/function'; import { pipe } from 'fp-ts/lib/pipeable'; import { first } from 'lodash'; import { useEffect, useMemo, useCallback } from 'react'; -// eslint-disable-next-line @kbn/imports/no_boundary_crossing -import { getIntervalInSeconds } from '../../../../../server/utils/get_interval_in_seconds'; +import { getIntervalInSeconds } from '../../../../../common/utils/get_interval_in_seconds'; import { throwErrors, createPlainError } from '../../../../../common/runtime_types'; import { useHTTPRequest } from '../../../../hooks/use_http_request'; import { diff --git a/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/chart_section_vis.tsx b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/chart_section_vis.tsx index 38db16c314a70..9bc2185b4b7fd 100644 --- a/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/chart_section_vis.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/chart_section_vis.tsx @@ -19,7 +19,6 @@ import { } from '@elastic/charts'; import { EuiPageContentBody } from '@elastic/eui'; import { useUiSetting } from '@kbn/kibana-react-plugin/public'; -import { getChartTheme } from '../../metrics_explorer/components/helpers/get_chart_theme'; import { SeriesChart } from './series_chart'; import { getFormatter, @@ -30,6 +29,7 @@ import { seriesHasLessThen2DataPoints, } from './helpers'; import { ErrorMessage } from './error_message'; +import { getChartTheme } from '../../../../utils/get_chart_theme'; import { useKibanaUiSetting } from '../../../../utils/use_kibana_ui_setting'; import { VisSectionProps } from '../types'; diff --git a/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layout.tsx b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layout.tsx new file mode 100644 index 0000000000000..a2b48e9b7f2f3 --- /dev/null +++ b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layout.tsx @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { InventoryItemType } from '../../../../../common/inventory_models/types'; +import { LayoutProps } from '../types'; +import { AwsEC2Layout } from './layouts/aws_ec2_layout'; +import { AwsRDSLayout } from './layouts/aws_rds_layout'; +import { AwsS3Layout } from './layouts/aws_s3_layout'; +import { AwsSQSLayout } from './layouts/aws_sqs_layout'; +import { ContainerLayout } from './layouts/container_layout'; +import { HostLayout } from './layouts/host_layout'; +import { PodLayout } from './layouts/pod_layout'; + +export const Layout = ({ + inventoryItemType, + ...layoutProps +}: LayoutProps & { inventoryItemType: InventoryItemType }) => { + switch (inventoryItemType) { + case 'awsEC2': + return ; + case 'awsRDS': + return ; + case 'awsS3': + return ; + case 'awsSQS': + return ; + case 'container': + return ; + case 'host': + return ; + case 'pod': + return ; + } +}; diff --git a/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/aws_ec2_layout.tsx b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/aws_ec2_layout.tsx new file mode 100644 index 0000000000000..f74ea58ae7edd --- /dev/null +++ b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/aws_ec2_layout.tsx @@ -0,0 +1,135 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; +import { withTheme } from '@kbn/kibana-react-plugin/common'; +import React from 'react'; +import type { LayoutPropsWithTheme } from '../../types'; +import { ChartSectionVis } from '../chart_section_vis'; +import { LayoutContent } from '../layout_content'; +import { MetadataDetails } from '../metadata_details'; +import { Section } from '../section'; +import { SubSection } from '../sub_section'; + +export const AwsEC2Layout = withTheme( + ({ metrics, theme, onChangeRangeTime }: LayoutPropsWithTheme) => ( + + + +
+ + + + + + + + + +
+
+
+ ) +); diff --git a/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/aws_layout_sections.tsx b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/aws_layout_sections.tsx new file mode 100644 index 0000000000000..75c06c30b968a --- /dev/null +++ b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/aws_layout_sections.tsx @@ -0,0 +1,242 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; +import { withTheme } from '@kbn/kibana-react-plugin/common'; +import React from 'react'; +import type { LayoutPropsWithTheme } from '../../types'; +import { ChartSectionVis } from '../chart_section_vis'; +import { GaugesSectionVis } from '../gauges_section_vis'; +import { Section } from '../section'; +import { SubSection } from '../sub_section'; + +export const AwsLayoutSection = withTheme( + ({ metrics, onChangeRangeTime, theme }: LayoutPropsWithTheme) => ( + +
+ + + + + + + + + + + + + + + + + + +
+
+ ) +); diff --git a/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/aws_rds_layout.tsx b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/aws_rds_layout.tsx new file mode 100644 index 0000000000000..dfe1065633ca6 --- /dev/null +++ b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/aws_rds_layout.tsx @@ -0,0 +1,188 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; +import { withTheme } from '@kbn/kibana-react-plugin/common'; +import React from 'react'; +import type { LayoutPropsWithTheme } from '../../types'; +import { ChartSectionVis } from '../chart_section_vis'; +import { LayoutContent } from '../layout_content'; +import { Section } from '../section'; +import { SubSection } from '../sub_section'; + +export const AwsRDSLayout = withTheme( + ({ metrics, onChangeRangeTime, theme }: LayoutPropsWithTheme) => ( + + +
+ + + + + + + + + + + + + + + +
+
+
+ ) +); diff --git a/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/aws_s3_layout.tsx b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/aws_s3_layout.tsx new file mode 100644 index 0000000000000..c64ed222c8f28 --- /dev/null +++ b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/aws_s3_layout.tsx @@ -0,0 +1,151 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { i18n } from '@kbn/i18n'; +import { withTheme } from '@kbn/kibana-react-plugin/common'; +import type { LayoutPropsWithTheme } from '../../types'; +import { Section } from '../section'; +import { SubSection } from '../sub_section'; +import { ChartSectionVis } from '../chart_section_vis'; +import { LayoutContent } from '../layout_content'; + +export const AwsS3Layout = withTheme( + ({ metrics, onChangeRangeTime, theme }: LayoutPropsWithTheme) => ( + + +
+ + + + + + + + + + + + + + + +
+
+
+ ) +); diff --git a/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/aws_sqs_layout.tsx b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/aws_sqs_layout.tsx new file mode 100644 index 0000000000000..303bd38765ef4 --- /dev/null +++ b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/aws_sqs_layout.tsx @@ -0,0 +1,151 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; +import { withTheme } from '@kbn/kibana-react-plugin/common'; +import React from 'react'; +import type { LayoutPropsWithTheme } from '../../types'; +import { ChartSectionVis } from '../chart_section_vis'; +import { LayoutContent } from '../layout_content'; +import { Section } from '../section'; +import { SubSection } from '../sub_section'; + +export const AwsSQSLayout = withTheme( + ({ metrics, onChangeRangeTime, theme }: LayoutPropsWithTheme) => ( + + +
+ + + + + + + + + + + + + + + +
+
+
+ ) +); diff --git a/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/container_layout.tsx b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/container_layout.tsx new file mode 100644 index 0000000000000..904d42cc1d2f2 --- /dev/null +++ b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/container_layout.tsx @@ -0,0 +1,300 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; +import { withTheme } from '@kbn/kibana-react-plugin/common'; +import React from 'react'; +import type { LayoutPropsWithTheme } from '../../types'; +import { ChartSectionVis } from '../chart_section_vis'; +import { GaugesSectionVis } from '../gauges_section_vis'; +import { LayoutContent } from '../layout_content'; +import { MetadataDetails } from '../metadata_details'; +import { Section } from '../section'; +import { SubSection } from '../sub_section'; + +export const ContainerLayout = withTheme( + ({ metrics, onChangeRangeTime, theme }: LayoutPropsWithTheme) => ( + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ ) +); diff --git a/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/host_layout.tsx b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/host_layout.tsx new file mode 100644 index 0000000000000..f9bf9b5f92408 --- /dev/null +++ b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/host_layout.tsx @@ -0,0 +1,376 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; +import { withTheme } from '@kbn/kibana-react-plugin/common'; +import React from 'react'; +import type { LayoutPropsWithTheme } from '../../types'; +import { ChartSectionVis } from '../chart_section_vis'; +import { GaugesSectionVis } from '../gauges_section_vis'; +import { LayoutContent } from '../layout_content'; +import { MetadataDetails } from '../metadata_details'; +import { Section } from '../section'; +import { SubSection } from '../sub_section'; +import { AwsLayoutSection } from './aws_layout_sections'; +import { NginxLayoutSection } from './nginx_layout_sections'; + +export const HostLayout = withTheme( + ({ metrics, onChangeRangeTime, theme }: LayoutPropsWithTheme) => ( + + + +
+ + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + +
+ + +
+
+ ) +); diff --git a/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/nginx_layout_sections.tsx b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/nginx_layout_sections.tsx new file mode 100644 index 0000000000000..d845357d33256 --- /dev/null +++ b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/nginx_layout_sections.tsx @@ -0,0 +1,112 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { i18n } from '@kbn/i18n'; +import { withTheme } from '@kbn/kibana-react-plugin/common'; +import type { LayoutPropsWithTheme } from '../../types'; +import { Section } from '../section'; +import { SubSection } from '../sub_section'; +import { ChartSectionVis } from '../chart_section_vis'; + +export const NginxLayoutSection = withTheme( + ({ metrics, onChangeRangeTime, theme }: LayoutPropsWithTheme) => ( + +
+ + + + + + + + + + + + +
+
+ ) +); diff --git a/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/pod_layout.tsx b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/pod_layout.tsx new file mode 100644 index 0000000000000..766843abc3b48 --- /dev/null +++ b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/layouts/pod_layout.tsx @@ -0,0 +1,164 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; +import { withTheme } from '@kbn/kibana-react-plugin/common'; +import React from 'react'; +import type { LayoutPropsWithTheme } from '../../types'; +import { ChartSectionVis } from '../chart_section_vis'; +import { GaugesSectionVis } from '../gauges_section_vis'; +import { LayoutContent } from '../layout_content'; +import { MetadataDetails } from '../metadata_details'; +import { Section } from '../section'; +import { SubSection } from '../sub_section'; +import { NginxLayoutSection } from './nginx_layout_sections'; + +export const PodLayout = withTheme( + ({ metrics, onChangeRangeTime, theme }: LayoutPropsWithTheme) => ( + + + +
+ + + + + + + + + + + + +
+ +
+
+ ) +); diff --git a/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/page_body.tsx b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/page_body.tsx index de3e78f352d53..247f68a057d80 100644 --- a/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/page_body.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/page_body.tsx @@ -5,15 +5,14 @@ * 2.0. */ -import React from 'react'; import { i18n } from '@kbn/i18n'; -import { findLayout } from '../../../../../common/inventory_models/layouts'; +import React from 'react'; +import { NodeDetailsMetricData } from '../../../../../common/http_api/node_details_api'; import { InventoryItemType } from '../../../../../common/inventory_models/types'; - -import { MetricsTimeInput } from '../hooks/use_metrics_time'; -import { InfraLoadingPanel } from '../../../../components/loading'; import { NoData } from '../../../../components/empty_states'; -import { NodeDetailsMetricData } from '../../../../../common/http_api/node_details_api'; +import { InfraLoadingPanel } from '../../../../components/loading'; +import { MetricsTimeInput } from '../hooks/use_metrics_time'; +import { Layout } from './layout'; interface Props { loading: boolean; @@ -62,9 +61,9 @@ export const PageBody = ({ ); } - const Layout = findLayout(type); return ( Date: Tue, 6 Sep 2022 09:25:00 +0200 Subject: [PATCH 15/19] [TIP] Add filter in/out functionality (#139616) - add filter in and out actions to the Indicators table cells and the Flyout Table - move query_bar and use_filters files under new query_bar folder - wrap IndicatorsTable with new context to save filterManager https://github.com/elastic/security-team/issues/4529 --- .../common/types/indicator.ts | 40 +- .../cypress/integration/query_bar.spec.ts | 63 +++ .../cypress/screens/indicators.ts | 10 + .../mocks/mock_indicators_filters_context.tsx | 16 + .../public/common/mocks/test_providers.tsx | 8 +- .../indicator_field.test.tsx.snap | 4 +- .../indicators_barchart_wrapper.stories.tsx | 2 +- .../indicators_barchart_wrapper.test.tsx | 6 +- .../indicators_flyout.stories.tsx | 26 +- .../indicators_flyout_table.stories.tsx | 6 +- .../indicators_flyout_table.tsx | 6 +- .../indicators_table/cell_actions.tsx | 62 +++ .../indicators_table/cell_renderer.tsx | 4 - .../hooks/use_column_settings.test.ts | 8 +- .../hooks/use_column_settings.ts | 3 +- .../indicators_table.stories.tsx | 32 +- .../indicators_table/indicators_table.tsx | 14 +- .../indicators_filters/indicators_filters.tsx | 34 ++ .../public/modules/indicators/context.ts | 20 + .../hooks/use_aggregated_indicators.test.tsx | 6 +- .../hooks/use_aggregated_indicators.ts | 22 +- .../hooks/use_indicators_filters_context.ts | 24 ++ .../indicators/indicators_page.test.tsx | 4 +- .../modules/indicators/indicators_page.tsx | 15 +- .../indicators/lib/field_value.test.ts | 43 +++ .../modules/indicators/lib/field_value.ts | 31 ++ .../__snapshots__/filter_in_out.test.tsx.snap | 365 ++++++++++++++++++ .../filter_in_out/filter_in_out.stories.tsx | 29 ++ .../filter_in_out/filter_in_out.test.tsx | 58 +++ .../filter_in_out/filter_in_out.tsx | 111 ++++++ .../components/filter_in_out/index.tsx | 8 + .../components/filter_in_out/styles.ts | 18 + .../components/query_bar/index.tsx | 0 .../query_bar/query_bar.stories.tsx | 0 .../components/query_bar/query_bar.test.tsx | 0 .../components/query_bar/query_bar.tsx | 4 +- .../hooks/use_filters/index.ts | 0 .../hooks/use_filters/use_filters.test.tsx | 0 .../hooks/use_filters/use_filters.ts | 1 - .../hooks/use_filters/utils.test.ts | 0 .../hooks/use_filters/utils.ts | 0 .../modules/query_bar/lib/filter.test.ts | 74 ++++ .../public/modules/query_bar/lib/filter.ts | 81 ++++ .../add_to_timeline/add_to_timeline.tsx | 23 +- 44 files changed, 1199 insertions(+), 82 deletions(-) create mode 100644 x-pack/plugins/threat_intelligence/cypress/integration/query_bar.spec.ts create mode 100644 x-pack/plugins/threat_intelligence/public/common/mocks/mock_indicators_filters_context.tsx create mode 100644 x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/cell_actions.tsx create mode 100644 x-pack/plugins/threat_intelligence/public/modules/indicators/containers/indicators_filters/indicators_filters.tsx create mode 100644 x-pack/plugins/threat_intelligence/public/modules/indicators/context.ts create mode 100644 x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_indicators_filters_context.ts create mode 100644 x-pack/plugins/threat_intelligence/public/modules/indicators/lib/field_value.test.ts create mode 100644 x-pack/plugins/threat_intelligence/public/modules/indicators/lib/field_value.ts create mode 100644 x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in_out/__snapshots__/filter_in_out.test.tsx.snap create mode 100644 x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in_out/filter_in_out.stories.tsx create mode 100644 x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in_out/filter_in_out.test.tsx create mode 100644 x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in_out/filter_in_out.tsx create mode 100644 x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in_out/index.tsx create mode 100644 x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in_out/styles.ts rename x-pack/plugins/threat_intelligence/public/modules/{indicators => query_bar}/components/query_bar/index.tsx (100%) rename x-pack/plugins/threat_intelligence/public/modules/{indicators => query_bar}/components/query_bar/query_bar.stories.tsx (100%) rename x-pack/plugins/threat_intelligence/public/modules/{indicators => query_bar}/components/query_bar/query_bar.test.tsx (100%) rename x-pack/plugins/threat_intelligence/public/modules/{indicators => query_bar}/components/query_bar/query_bar.tsx (98%) rename x-pack/plugins/threat_intelligence/public/modules/{indicators => query_bar}/hooks/use_filters/index.ts (100%) rename x-pack/plugins/threat_intelligence/public/modules/{indicators => query_bar}/hooks/use_filters/use_filters.test.tsx (100%) rename x-pack/plugins/threat_intelligence/public/modules/{indicators => query_bar}/hooks/use_filters/use_filters.ts (99%) rename x-pack/plugins/threat_intelligence/public/modules/{indicators => query_bar}/hooks/use_filters/utils.test.ts (100%) rename x-pack/plugins/threat_intelligence/public/modules/{indicators => query_bar}/hooks/use_filters/utils.ts (100%) create mode 100644 x-pack/plugins/threat_intelligence/public/modules/query_bar/lib/filter.test.ts create mode 100644 x-pack/plugins/threat_intelligence/public/modules/query_bar/lib/filter.ts diff --git a/x-pack/plugins/threat_intelligence/common/types/indicator.ts b/x-pack/plugins/threat_intelligence/common/types/indicator.ts index bfea03dace750..2edcbb5a829ea 100644 --- a/x-pack/plugins/threat_intelligence/common/types/indicator.ts +++ b/x-pack/plugins/threat_intelligence/common/types/indicator.ts @@ -58,7 +58,7 @@ export interface Indicator { /** * Used as a base to create Indicators of a specific type. Mocks are used in Jest tests and storybooks */ -export const generateMockBaseIndicator = (): Indicator => ({ +const generateMockBaseIndicator = (): Indicator => ({ fields: { '@timestamp': ['2022-01-01T01:01:01.000Z'], 'threat.indicator.first_seen': ['2022-01-01T01:01:01.000Z'], @@ -73,9 +73,41 @@ export const generateMockBaseIndicator = (): Indicator => ({ export const generateMockIndicator = (): Indicator => { const indicator = generateMockBaseIndicator(); - indicator.fields['threat.indicator.type'] = ['ipv4-addr']; - indicator.fields['threat.indicator.ip'] = ['12.68.554.87']; - indicator.fields['threat.indicator.name'] = ['12.68.554.87']; + indicator.fields['threat.indicator.type'] = ['type']; + indicator.fields['threat.indicator.ip'] = ['0.0.0.0']; + indicator.fields['threat.indicator.name'] = ['0.0.0.0']; + + return indicator; +}; + +/** + * Used to create a Url Indicator. + */ +export const generateMockUrlIndicator = (): Indicator => { + const indicator = generateMockBaseIndicator(); + + indicator.fields['threat.indicator.type'] = ['url']; + indicator.fields['threat.indicator.ip'] = ['0.0.0.0']; + indicator.fields['threat.indicator.url.full'] = ['https://0.0.0.0/test']; + indicator.fields['threat.indicator.url.original'] = ['https://0.0.0.0/test']; + indicator.fields['threat.indicator.name'] = ['https://0.0.0.0/test']; + indicator.fields['threat.indicator.name_origin'] = ['threat.indicator.url.original']; + + return indicator; +}; + +/** + * Used to create a File Indicator. + */ +export const generateMockFileIndicator = (): Indicator => { + const indicator = generateMockBaseIndicator(); + + indicator.fields['threat.indicator.type'] = ['file']; + indicator.fields['threat.indicator.file.hash.sha256'] = ['sample_sha256_hash']; + indicator.fields['threat.indicator.file.hash.md5'] = ['sample_md5_hash']; + indicator.fields['threat.indicator.file.hash.sha1'] = ['sample_sha1_hash']; + indicator.fields['threat.indicator.name'] = ['sample_sha256_hash']; + indicator.fields['threat.indicator.name_origin'] = ['threat.indicator.file.hash.sha256']; return indicator; }; diff --git a/x-pack/plugins/threat_intelligence/cypress/integration/query_bar.spec.ts b/x-pack/plugins/threat_intelligence/cypress/integration/query_bar.spec.ts new file mode 100644 index 0000000000000..39d1c0aec2af8 --- /dev/null +++ b/x-pack/plugins/threat_intelligence/cypress/integration/query_bar.spec.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 + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + FILTER_IN_BUTTON, + FILTER_OUT_BUTTON, + FILTER_IN_COMPONENT, + FILTER_OUT_COMPONENT, + INDICATOR_TYPE_CELL, + TOGGLE_FLYOUT_BUTTON, + FLYOUT_CLOSE_BUTTON, + KQL_FILTER, +} from '../screens/indicators'; +import { selectRange } from '../tasks/select_range'; +import { login } from '../tasks/login'; +import { esArchiverLoad, esArchiverUnload } from '../tasks/es_archiver'; + +before(() => { + login(); +}); + +const THREAT_INTELLIGENCE = '/app/security/threat_intelligence/indicators'; + +describe('Indicators', () => { + before(() => { + esArchiverLoad('threat_intelligence'); + }); + after(() => { + esArchiverUnload('threat_intelligence'); + }); + + describe('Indicators query bar interaction', () => { + before(() => { + cy.visit(THREAT_INTELLIGENCE); + + selectRange(); + }); + + it('should filter in and out values when clicking in an indicators table cell', () => { + cy.get(INDICATOR_TYPE_CELL).first().trigger('mouseover'); + cy.get(FILTER_IN_COMPONENT).should('exist'); + cy.get(FILTER_OUT_COMPONENT).should('exist'); + }); + + it('should filter in and out values when clicking in an indicators flyout table action column', () => { + cy.get(TOGGLE_FLYOUT_BUTTON).first().click({ force: true }); + cy.get(FILTER_OUT_BUTTON).should('exist'); + cy.get(FILTER_IN_BUTTON).should('exist').first().click(); + cy.get(FLYOUT_CLOSE_BUTTON).should('exist').click(); + cy.get(KQL_FILTER).should('exist'); + + cy.get(TOGGLE_FLYOUT_BUTTON).first().click({ force: true }); + cy.get(FILTER_IN_BUTTON).should('exist'); + cy.get(FILTER_OUT_BUTTON).should('exist').first().click(); + cy.get(FLYOUT_CLOSE_BUTTON).should('exist').click(); + cy.get(KQL_FILTER).should('exist'); + }); + }); +}); diff --git a/x-pack/plugins/threat_intelligence/cypress/screens/indicators.ts b/x-pack/plugins/threat_intelligence/cypress/screens/indicators.ts index e903abb729023..f6e304467aea5 100644 --- a/x-pack/plugins/threat_intelligence/cypress/screens/indicators.ts +++ b/x-pack/plugins/threat_intelligence/cypress/screens/indicators.ts @@ -59,3 +59,13 @@ export const FLYOUT_TABLE_ROW_TIMELINE_BUTTON = '[data-test-subj="tiFlyoutTableR export const UNTITLED_TIMELINE_BUTTON = '[data-test-subj="flyoutOverlay"]'; export const TIMELINE_DRAGGABLE_ITEM = '[data-test-subj="providerContainer"]'; + +export const FILTER_IN_BUTTON = '[data-test-subj="tiFilterInIcon"]'; + +export const FILTER_OUT_BUTTON = '[data-test-subj="tiFilterOutIcon"]'; + +export const FILTER_IN_COMPONENT = '[data-test-subj="tiFilterInComponent"]'; + +export const FILTER_OUT_COMPONENT = '[data-test-subj="tiFilterOutComponent"]'; + +export const KQL_FILTER = '[id="popoverFor_filter0"]'; diff --git a/x-pack/plugins/threat_intelligence/public/common/mocks/mock_indicators_filters_context.tsx b/x-pack/plugins/threat_intelligence/public/common/mocks/mock_indicators_filters_context.tsx new file mode 100644 index 0000000000000..6e9c0b373a0fe --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/common/mocks/mock_indicators_filters_context.tsx @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FilterManager } from '@kbn/data-plugin/public'; +import { IndicatorsFiltersContextValue } from '../../modules/indicators/context'; + +export const mockIndicatorsFiltersContext: IndicatorsFiltersContextValue = { + filterManager: { + getFilters: () => [], + setFilters: () => {}, + } as unknown as FilterManager, +}; diff --git a/x-pack/plugins/threat_intelligence/public/common/mocks/test_providers.tsx b/x-pack/plugins/threat_intelligence/public/common/mocks/test_providers.tsx index ff22987e56f1b..8648169dfdb4a 100644 --- a/x-pack/plugins/threat_intelligence/public/common/mocks/test_providers.tsx +++ b/x-pack/plugins/threat_intelligence/public/common/mocks/test_providers.tsx @@ -20,6 +20,8 @@ import { SecuritySolutionPluginContext } from '../../types'; import { getSecuritySolutionContextMock } from './mock_security_context'; import { mockUiSetting } from './mock_kibana_ui_settings_service'; import { SecuritySolutionContext } from '../../containers/security_solution_context'; +import { IndicatorsFiltersContext } from '../../modules/indicators/context'; +import { mockIndicatorsFiltersContext } from './mock_indicators_filters_context'; export const localStorageMock = (): IStorage => { let store: Record = {}; @@ -122,7 +124,11 @@ export const mockedServices = { export const TestProvidersComponent: FC = ({ children }) => ( - {children} + + + {children} + + ); diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicator_field/__snapshots__/indicator_field.test.tsx.snap b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicator_field/__snapshots__/indicator_field.test.tsx.snap index 6742886abace1..f90ff68de3b14 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicator_field/__snapshots__/indicator_field.test.tsx.snap +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicator_field/__snapshots__/indicator_field.test.tsx.snap @@ -135,11 +135,11 @@ Object { "asFragment": [Function], "baseElement":
- 12.68.554.87 + 0.0.0.0
, "container":
- 12.68.554.87 + 0.0.0.0
, "debug": [Function], "findAllByAltText": [Function], diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.stories.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.stories.tsx index 42c6653bf725f..a9eec2afcf196 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.stories.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.stories.tsx @@ -17,7 +17,7 @@ import { IUiSettingsClient } from '@kbn/core/public'; import { StoryProvidersComponent } from '../../../../common/mocks/story_providers'; import { mockKibanaTimelinesService } from '../../../../common/mocks/mock_kibana_timelines_service'; import { Aggregation, AGGREGATION_NAME } from '../../hooks/use_aggregated_indicators'; -import { DEFAULT_TIME_RANGE } from '../../hooks/use_filters/utils'; +import { DEFAULT_TIME_RANGE } from '../../../query_bar/hooks/use_filters/utils'; import { IndicatorsBarChartWrapper } from './indicators_barchart_wrapper'; export default { diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.test.tsx index 9deeb4e5bcb8a..997cfc7922b9d 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_barchart_wrapper/indicators_barchart_wrapper.test.tsx @@ -11,10 +11,10 @@ import { TimeRange } from '@kbn/es-query'; import { DataView, DataViewField } from '@kbn/data-views-plugin/common'; import { TestProvidersComponent } from '../../../../common/mocks/test_providers'; import { IndicatorsBarChartWrapper } from './indicators_barchart_wrapper'; -import { DEFAULT_TIME_RANGE } from '../../hooks/use_filters/utils'; -import { useFilters } from '../../hooks/use_filters'; +import { DEFAULT_TIME_RANGE } from '../../../query_bar/hooks/use_filters/utils'; +import { useFilters } from '../../../query_bar/hooks/use_filters'; -jest.mock('../../hooks/use_filters'); +jest.mock('../../../query_bar/hooks/use_filters'); const mockIndexPattern: DataView = { fields: [ diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_flyout/indicators_flyout.stories.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_flyout/indicators_flyout.stories.tsx index 6f65bab2157a9..5076b1649635e 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_flyout/indicators_flyout.stories.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_flyout/indicators_flyout.stories.tsx @@ -9,11 +9,13 @@ import React from 'react'; import { Story } from '@storybook/react'; import { CoreStart } from '@kbn/core/public'; import { createKibanaReactContext } from '@kbn/kibana-react-plugin/public'; +import { mockIndicatorsFiltersContext } from '../../../../common/mocks/mock_indicators_filters_context'; import { generateFieldTypeMap } from '../../../../common/mocks/mock_field_type_map'; import { mockUiSettingsService } from '../../../../common/mocks/mock_kibana_ui_settings_service'; import { mockKibanaTimelinesService } from '../../../../common/mocks/mock_kibana_timelines_service'; import { generateMockIndicator, Indicator } from '../../../../../common/types/indicator'; import { IndicatorsFlyout } from './indicators_flyout'; +import { IndicatorsFiltersContext } from '../../context'; export default { component: IndicatorsFlyout, @@ -32,11 +34,13 @@ export const Default: Story = () => { return ( - window.alert('Closing flyout')} - /> + + window.alert('Closing flyout')} + /> + ); }; @@ -44,11 +48,13 @@ export const Default: Story = () => { export const EmptyIndicator: Story = () => { return ( - window.alert('Closing flyout')} - /> + + window.alert('Closing flyout')} + /> + ); }; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_flyout_table/indicators_flyout_table.stories.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_flyout_table/indicators_flyout_table.stories.tsx index 267167425e757..e864d292c61cb 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_flyout_table/indicators_flyout_table.stories.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_flyout_table/indicators_flyout_table.stories.tsx @@ -9,11 +9,13 @@ import React from 'react'; import { Story } from '@storybook/react'; import { CoreStart } from '@kbn/core/public'; import { createKibanaReactContext } from '@kbn/kibana-react-plugin/public'; +import { mockIndicatorsFiltersContext } from '../../../../common/mocks/mock_indicators_filters_context'; import { generateFieldTypeMap } from '../../../../common/mocks/mock_field_type_map'; import { mockUiSettingsService } from '../../../../common/mocks/mock_kibana_ui_settings_service'; import { mockKibanaTimelinesService } from '../../../../common/mocks/mock_kibana_timelines_service'; import { generateMockIndicator, Indicator } from '../../../../../common/types/indicator'; import { IndicatorsFlyoutTable } from './indicators_flyout_table'; +import { IndicatorsFiltersContext } from '../../context'; export default { component: IndicatorsFlyoutTable, @@ -31,7 +33,9 @@ export const Default: Story = () => { return ( - + + + ); }; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_flyout_table/indicators_flyout_table.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_flyout_table/indicators_flyout_table.tsx index 5c56dfe91dc3b..c6a64c51629af 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_flyout_table/indicators_flyout_table.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_flyout_table/indicators_flyout_table.tsx @@ -8,6 +8,7 @@ import { EuiEmptyPrompt, EuiInMemoryTable } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import React, { VFC } from 'react'; +import { FilterInOut } from '../../../query_bar/components/filter_in_out'; import { Indicator } from '../../../../../common/types/indicator'; import { AddToTimeline } from '../../../timeline/components/add_to_timeline'; import { IndicatorField } from '../indicator_field/indicator_field'; @@ -54,7 +55,10 @@ export const IndicatorsFlyoutTable: VFC = ({ actions: [ { render: (field: string) => ( - + <> + + + ), }, ], diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/cell_actions.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/cell_actions.tsx new file mode 100644 index 0000000000000..db3de2eeb67e7 --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/cell_actions.tsx @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { VFC } from 'react'; +import { EuiDataGridColumnCellActionProps } from '@elastic/eui/src/components/datagrid/data_grid_types'; +import { FilterInOut } from '../../../query_bar/components/filter_in_out'; +import { EMPTY_VALUE } from '../../../../../common/constants'; +import { Indicator } from '../../../../../common/types/indicator'; +import { Pagination } from '../../hooks/use_indicators'; +import { AddToTimeline } from '../../../timeline/components/add_to_timeline'; +import { getIndicatorFieldAndValue } from '../../lib/field_value'; + +export const CELL_TIMELINE_BUTTON_TEST_ID = 'tiIndicatorsTableCellTimelineButton'; + +export interface CellActionsProps + extends Omit { + /** + * Array of {@link Indicator} to retrieve field and values for the cell actions. + */ + indicators: Indicator[]; + /** + * Received from the IndicatorsTable to extract the correct {@link Indicator} from the array of indicators. + */ + pagination: Pagination; +} + +/** + * Component used on an EuiDataGrid component (in our case for our IndicatorsTable component), + * added to the cellActions property of an EuiDataGridColumn. + * It displays the FilterIn, FilterOut and AddToTimeline icons in the popover + * when the user hovers above a cell. + */ +export const CellActions: VFC = ({ + rowIndex, + columnId, + Component, + indicators, + pagination, +}) => { + const indicator = indicators[rowIndex % pagination.pageSize]; + const { key, value } = getIndicatorFieldAndValue(indicator, columnId); + + if (!value || value === EMPTY_VALUE || !key) { + return <>; + } + + return ( + <> + + + + ); +}; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/cell_renderer.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/cell_renderer.tsx index 50429090505cf..e0b4e1e88daa0 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/cell_renderer.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/cell_renderer.tsx @@ -15,10 +15,6 @@ import { IndicatorField } from '../indicator_field/indicator_field'; import { IndicatorsTableContext } from './context'; import { ActionsRowCell } from './actions_row_cell'; -export enum ComputedIndicatorFieldId { - DisplayName = 'threat.indicator.name', -} - export const cellRendererFactory = (from: number) => { return ({ rowIndex, columnId, setCellProps }: EuiDataGridCellValueElementProps) => { const indicatorsTableContext = useContext(IndicatorsTableContext); diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/hooks/use_column_settings.test.ts b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/hooks/use_column_settings.test.ts index bc4a18c1a80bb..f3f1bad46b460 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/hooks/use_column_settings.test.ts +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/hooks/use_column_settings.test.ts @@ -65,9 +65,9 @@ describe('useColumnSettings()', () => { describe('when initial state is present in the plugin storage service', () => { beforeEach(() => { mockedServices.storage.set('indicatorsTable', { - visibleColumns: ['display_name', 'threat.indicator.last_seen', 'tags', 'stream'], + visibleColumns: ['threat.indicator.name', 'threat.indicator.last_seen', 'tags', 'stream'], columns: [ - { id: 'display_name', displayAsText: 'Indicator' }, + { id: 'threat.indicator.name', displayAsText: 'Indicator' }, { id: 'threat.indicator.type', displayAsText: 'Indicator type' }, { id: 'threat.feed.name', displayAsText: 'Feed' }, { id: 'threat.indicator.first_seen', displayAsText: 'First seen' }, @@ -83,7 +83,7 @@ describe('useColumnSettings()', () => { expect(result.current.columnVisibility.visibleColumns).toMatchInlineSnapshot(` Array [ - "display_name", + "threat.indicator.name", "threat.indicator.last_seen", "tags", "stream", @@ -94,7 +94,7 @@ describe('useColumnSettings()', () => { Array [ Object { "displayAsText": "Indicator", - "id": "display_name", + "id": "threat.indicator.name", }, Object { "displayAsText": "Indicator type", diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/hooks/use_column_settings.ts b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/hooks/use_column_settings.ts index 84c45a858591d..266ef8811955d 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/hooks/use_column_settings.ts +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/hooks/use_column_settings.ts @@ -11,7 +11,6 @@ import { i18n } from '@kbn/i18n'; import negate from 'lodash/negate'; import { RawIndicatorFieldId } from '../../../../../../common/types/indicator'; import { useKibana } from '../../../../../hooks/use_kibana'; -import { ComputedIndicatorFieldId } from '../cell_renderer'; const DEFAULT_COLUMNS: EuiDataGridColumn[] = [ { @@ -21,7 +20,7 @@ const DEFAULT_COLUMNS: EuiDataGridColumn[] = [ }), }, { - id: ComputedIndicatorFieldId.DisplayName, + id: RawIndicatorFieldId.Name, displayAsText: i18n.translate('xpack.threatIntelligence.indicator.table.indicatorColumTitle', { defaultMessage: 'Indicator', }), diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.stories.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.stories.tsx index a327cec411f90..e92df3f388e97 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.stories.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.stories.tsx @@ -9,11 +9,13 @@ import { CoreStart } from '@kbn/core/public'; import { createKibanaReactContext } from '@kbn/kibana-react-plugin/public'; import React from 'react'; import { DataView } from '@kbn/data-views-plugin/common'; +import { mockIndicatorsFiltersContext } from '../../../../common/mocks/mock_indicators_filters_context'; import { mockTriggersActionsUiService } from '../../../../common/mocks/mock_kibana_triggers_actions_ui_service'; import { mockUiSettingsService } from '../../../../common/mocks/mock_kibana_ui_settings_service'; import { mockKibanaTimelinesService } from '../../../../common/mocks/mock_kibana_timelines_service'; import { generateMockIndicator, Indicator } from '../../../../../common/types/indicator'; import { IndicatorsTable } from './indicators_table'; +import { IndicatorsFiltersContext } from '../../context'; export default { component: IndicatorsTable, @@ -35,20 +37,22 @@ export function WithIndicators() { return ( - + + + ); } diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.tsx index 64e3ff0cfb481..eea9acaabda31 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/components/indicators_table/indicators_table.tsx @@ -17,11 +17,11 @@ import { import { FormattedMessage } from '@kbn/i18n-react'; import { EuiDataGridColumn } from '@elastic/eui/src/components/datagrid/data_grid_types'; +import { CellActions } from './cell_actions'; import { BrowserFields, SecuritySolutionDataViewBase } from '../../../../types'; import { Indicator } from '../../../../../common/types/indicator'; import { cellRendererFactory } from './cell_renderer'; import { EmptyState } from '../../../../components/empty_state'; -import { AddToTimeline } from '../../../timeline/components/add_to_timeline'; import { IndicatorsTableContext, IndicatorsTableContextValue } from './context'; import { IndicatorsFlyout } from '../indicators_flyout/indicators_flyout'; import { Pagination } from '../../hooks/use_indicators'; @@ -40,7 +40,6 @@ export interface IndicatorsTableProps { } export const TABLE_TEST_ID = 'tiIndicatorsTable'; -export const CELL_TIMELINE_BUTTON_TEST_ID = 'tiIndicatorsTableCellTimelineButton'; const gridStyle = { border: 'horizontal', @@ -119,11 +118,12 @@ export const IndicatorsTable: VFC = ({ (col: EuiDataGridColumn) => (col.cellActions = [ ({ rowIndex, columnId, Component }: EuiDataGridColumnCellActionProps) => ( - ), ]) diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/containers/indicators_filters/indicators_filters.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/containers/indicators_filters/indicators_filters.tsx new file mode 100644 index 0000000000000..0fdd5c60ce5ce --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/containers/indicators_filters/indicators_filters.tsx @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { ReactNode, VFC } from 'react'; +import { FilterManager } from '@kbn/data-plugin/public'; +import { IndicatorsFiltersContext, IndicatorsFiltersContextValue } from '../../context'; + +export interface IndicatorsFiltersProps { + /** + * Get {@link FilterManager} from the useFilters hook and save it in context to use within the indicators table. + */ + filterManager: FilterManager; + /** + * Component(s) to be displayed inside + */ + children: ReactNode; +} + +/** + * Container used to wrap components and share the {@link FilterManager} through React context. + */ +export const IndicatorsFilters: VFC = ({ filterManager, children }) => { + const contextValue: IndicatorsFiltersContextValue = { filterManager }; + + return ( + + {children} + + ); +}; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/context.ts b/x-pack/plugins/threat_intelligence/public/modules/indicators/context.ts new file mode 100644 index 0000000000000..b6a4d17754f17 --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/context.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { createContext } from 'react'; +import { FilterManager } from '@kbn/data-plugin/public'; + +export interface IndicatorsFiltersContextValue { + /** + * FilterManager is used to interact with KQL bar. + */ + filterManager: FilterManager; +} + +export const IndicatorsFiltersContext = createContext( + undefined +); diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.test.tsx index 7a671f923f796..be8ea27374a1b 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.test.tsx @@ -15,15 +15,15 @@ import { useAggregatedIndicators, UseAggregatedIndicatorsParam, } from './use_aggregated_indicators'; -import { DEFAULT_TIME_RANGE } from './use_filters/utils'; +import { DEFAULT_TIME_RANGE } from '../../query_bar/hooks/use_filters/utils'; import { TestProvidersComponent, mockedSearchService, mockedTimefilterService, } from '../../../common/mocks/test_providers'; -import { useFilters } from './use_filters'; +import { useFilters } from '../../query_bar/hooks/use_filters'; -jest.mock('./use_filters/use_filters'); +jest.mock('../../query_bar/hooks/use_filters/use_filters'); const aggregationResponse = { rawResponse: { aggregations: { [AGGREGATION_NAME]: { buckets: [] } } }, diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.ts b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.ts index 63da10697f11a..5fd65c7599782 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.ts +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_aggregated_indicators.ts @@ -15,23 +15,41 @@ import { isErrorResponse, TimeRangeBounds, } from '@kbn/data-plugin/common'; -import { useFilters } from './use_filters'; +import { useFilters } from '../../query_bar/hooks/use_filters'; import { convertAggregationToChartSeries } from '../../../common/utils/barchart'; import { RawIndicatorFieldId } from '../../../../common/types/indicator'; import { THREAT_QUERY_BASE } from '../../../../common/constants'; import { calculateBarchartColumnTimeInterval } from '../../../common/utils/dates'; import { useKibana } from '../../../hooks/use_kibana'; -import { DEFAULT_TIME_RANGE } from './use_filters/utils'; +import { DEFAULT_TIME_RANGE } from '../../query_bar/hooks/use_filters/utils'; import { useSourcererDataView } from './use_sourcerer_data_view'; export interface UseAggregatedIndicatorsParam { + /** + * From and To values passed to the {@link }useAggregatedIndicators} hook + * to query indicators for the Indicators barchart. + */ timeRange?: TimeRange; } export interface UseAggregatedIndicatorsValue { + /** + * Array of {@link ChartSeries}, ready to be used in the Indicators barchart. + */ indicators: ChartSeries[]; + /** + * Callback used by the IndicatorsFieldSelector component to query a new set of + * aggregated indicators. + * @param field the selected Indicator field + */ onFieldChange: (field: string) => void; + /** + * The min and max times returned by the aggregated Indicators query. + */ dateRange: TimeRangeBounds; + /** + * Indicator field used to query the aggregated Indicators. + */ selectedField: string; } diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_indicators_filters_context.ts b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_indicators_filters_context.ts new file mode 100644 index 0000000000000..e8cc4b18474bf --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_indicators_filters_context.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useContext } from 'react'; +import { IndicatorsFiltersContext, IndicatorsFiltersContextValue } from '../context'; + +/** + * Hook to retrieve {@link IndicatorsFiltersContext} (contains FilterManager) + */ +export const useIndicatorsFiltersContext = (): IndicatorsFiltersContextValue => { + const contextValue = useContext(IndicatorsFiltersContext); + + if (!contextValue) { + throw new Error( + 'IndicatorsFiltersContext can only be used within IndicatorsFiltersContext provider' + ); + } + + return contextValue; +}; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.test.tsx index c4c8c64e31052..371f917c27746 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.test.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.test.tsx @@ -10,13 +10,13 @@ import { render } from '@testing-library/react'; import { IndicatorsPage } from './indicators_page'; import { useIndicators } from './hooks/use_indicators'; import { useAggregatedIndicators } from './hooks/use_aggregated_indicators'; -import { useFilters } from './hooks/use_filters'; +import { useFilters } from '../query_bar/hooks/use_filters'; import moment from 'moment'; import { TestProvidersComponent } from '../../common/mocks/test_providers'; import { TABLE_TEST_ID } from './components/indicators_table'; +jest.mock('../query_bar/hooks/use_filters'); jest.mock('./hooks/use_indicators'); -jest.mock('./hooks/use_filters'); jest.mock('./hooks/use_aggregated_indicators'); const stub = () => {}; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.tsx b/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.tsx index 4efd1c8469df1..f492ac74dcaa3 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/indicators_page.tsx @@ -6,13 +6,14 @@ */ import React, { VFC } from 'react'; +import { IndicatorsFilters } from './containers/indicators_filters/indicators_filters'; import { IndicatorsBarChartWrapper } from './components/indicators_barchart_wrapper/indicators_barchart_wrapper'; import { IndicatorsTable } from './components/indicators_table/indicators_table'; import { useIndicators } from './hooks/use_indicators'; import { DefaultPageLayout } from '../../components/layout'; -import { useFilters } from './hooks/use_filters'; +import { useFilters } from '../query_bar/hooks/use_filters'; import { FiltersGlobal } from '../../containers/filters_global'; -import QueryBar from './components/query_bar'; +import QueryBar from '../query_bar/components/query_bar'; import { useSourcererDataView } from './hooks/use_sourcerer_data_view'; export const IndicatorsPage: VFC = () => { @@ -54,8 +55,14 @@ export const IndicatorsPage: VFC = () => { onSubmitDateRange={handleSubmitTimeRange} /> - - + + + + ); }; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/lib/field_value.test.ts b/x-pack/plugins/threat_intelligence/public/modules/indicators/lib/field_value.test.ts new file mode 100644 index 0000000000000..fa9746e80cc21 --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/lib/field_value.test.ts @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { getIndicatorFieldAndValue } from './field_value'; +import { + generateMockFileIndicator, + generateMockUrlIndicator, +} from '../../../../common/types/indicator'; + +describe('getIndicatorFieldAndValue()', () => { + it('should return field/value pair for an indicator', () => { + const mockData = generateMockUrlIndicator(); + const mockKey = 'threat.feed.name'; + + const result = getIndicatorFieldAndValue(mockData, mockKey); + expect(result.key).toEqual(mockKey); + expect(result.value).toEqual((mockData.fields[mockKey] as unknown as string[])[0]); + }); + + it('should return a null value for an incorrect field', () => { + const mockData = generateMockUrlIndicator(); + const mockKey = 'abc'; + + const result = getIndicatorFieldAndValue(mockData, mockKey); + expect(result.key).toEqual(mockKey); + expect(result.value).toBeNull(); + }); + + it('should return field/value pair for an indicator and DisplayName field', () => { + const mockData = generateMockFileIndicator(); + const mockKey = 'threat.indicator.name'; + + const result = getIndicatorFieldAndValue(mockData, mockKey); + expect(result.key).toEqual( + (mockData.fields['threat.indicator.name_origin'] as unknown as string[])[0] + ); + expect(result.value).toEqual((mockData.fields[mockKey] as unknown as string[])[0]); + }); +}); diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/lib/field_value.ts b/x-pack/plugins/threat_intelligence/public/modules/indicators/lib/field_value.ts new file mode 100644 index 0000000000000..f463537b120c4 --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/indicators/lib/field_value.ts @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { unwrapValue } from './unwrap_value'; +import { Indicator, RawIndicatorFieldId } from '../../../../common/types/indicator'; + +/** + * Retrieves a field/value pair from an Indicator + * @param data the {@link Indicator} to extract the value for the field + * @param field the Indicator's field + * @returns the key/value pair (indicator's field/value) + */ +export const getIndicatorFieldAndValue = ( + data: Indicator, + field: string +): { key: string; value: string | null } => { + const value = unwrapValue(data, field as RawIndicatorFieldId); + const key = + field === RawIndicatorFieldId.Name + ? (unwrapValue(data, RawIndicatorFieldId.NameOrigin) as string) + : field; + + return { + key, + value, + }; +}; diff --git a/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in_out/__snapshots__/filter_in_out.test.tsx.snap b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in_out/__snapshots__/filter_in_out.test.tsx.snap new file mode 100644 index 0000000000000..6efed28052d86 --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in_out/__snapshots__/filter_in_out.test.tsx.snap @@ -0,0 +1,365 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[` should render an empty component (wrong data input) 1`] = ` +Object { + "asFragment": [Function], + "baseElement": +
+ , + "container":
, + "debug": [Function], + "findAllByAltText": [Function], + "findAllByDisplayValue": [Function], + "findAllByLabelText": [Function], + "findAllByPlaceholderText": [Function], + "findAllByRole": [Function], + "findAllByTestId": [Function], + "findAllByText": [Function], + "findAllByTitle": [Function], + "findByAltText": [Function], + "findByDisplayValue": [Function], + "findByLabelText": [Function], + "findByPlaceholderText": [Function], + "findByRole": [Function], + "findByTestId": [Function], + "findByText": [Function], + "findByTitle": [Function], + "getAllByAltText": [Function], + "getAllByDisplayValue": [Function], + "getAllByLabelText": [Function], + "getAllByPlaceholderText": [Function], + "getAllByRole": [Function], + "getAllByTestId": [Function], + "getAllByText": [Function], + "getAllByTitle": [Function], + "getByAltText": [Function], + "getByDisplayValue": [Function], + "getByLabelText": [Function], + "getByPlaceholderText": [Function], + "getByRole": [Function], + "getByTestId": [Function], + "getByText": [Function], + "getByTitle": [Function], + "queryAllByAltText": [Function], + "queryAllByDisplayValue": [Function], + "queryAllByLabelText": [Function], + "queryAllByPlaceholderText": [Function], + "queryAllByRole": [Function], + "queryAllByTestId": [Function], + "queryAllByText": [Function], + "queryAllByTitle": [Function], + "queryByAltText": [Function], + "queryByDisplayValue": [Function], + "queryByLabelText": [Function], + "queryByPlaceholderText": [Function], + "queryByRole": [Function], + "queryByTestId": [Function], + "queryByText": [Function], + "queryByTitle": [Function], + "rerender": [Function], + "unmount": [Function], +} +`; + +exports[` should render an empty component (wrong field input) 1`] = ` +Object { + "asFragment": [Function], + "baseElement": +
+ , + "container":
, + "debug": [Function], + "findAllByAltText": [Function], + "findAllByDisplayValue": [Function], + "findAllByLabelText": [Function], + "findAllByPlaceholderText": [Function], + "findAllByRole": [Function], + "findAllByTestId": [Function], + "findAllByText": [Function], + "findAllByTitle": [Function], + "findByAltText": [Function], + "findByDisplayValue": [Function], + "findByLabelText": [Function], + "findByPlaceholderText": [Function], + "findByRole": [Function], + "findByTestId": [Function], + "findByText": [Function], + "findByTitle": [Function], + "getAllByAltText": [Function], + "getAllByDisplayValue": [Function], + "getAllByLabelText": [Function], + "getAllByPlaceholderText": [Function], + "getAllByRole": [Function], + "getAllByTestId": [Function], + "getAllByText": [Function], + "getAllByTitle": [Function], + "getByAltText": [Function], + "getByDisplayValue": [Function], + "getByLabelText": [Function], + "getByPlaceholderText": [Function], + "getByRole": [Function], + "getByTestId": [Function], + "getByText": [Function], + "getByTitle": [Function], + "queryAllByAltText": [Function], + "queryAllByDisplayValue": [Function], + "queryAllByLabelText": [Function], + "queryAllByPlaceholderText": [Function], + "queryAllByRole": [Function], + "queryAllByTestId": [Function], + "queryAllByText": [Function], + "queryAllByTitle": [Function], + "queryByAltText": [Function], + "queryByDisplayValue": [Function], + "queryByLabelText": [Function], + "queryByPlaceholderText": [Function], + "queryByRole": [Function], + "queryByTestId": [Function], + "queryByText": [Function], + "queryByTitle": [Function], + "rerender": [Function], + "unmount": [Function], +} +`; + +exports[` should render two Component (for DataGrid use) 1`] = ` +Object { + "asFragment": [Function], + "baseElement": +
+
+ +
+
+ +
+
+ , + "container":
+
+ +
+
+ +
+
, + "debug": [Function], + "findAllByAltText": [Function], + "findAllByDisplayValue": [Function], + "findAllByLabelText": [Function], + "findAllByPlaceholderText": [Function], + "findAllByRole": [Function], + "findAllByTestId": [Function], + "findAllByText": [Function], + "findAllByTitle": [Function], + "findByAltText": [Function], + "findByDisplayValue": [Function], + "findByLabelText": [Function], + "findByPlaceholderText": [Function], + "findByRole": [Function], + "findByTestId": [Function], + "findByText": [Function], + "findByTitle": [Function], + "getAllByAltText": [Function], + "getAllByDisplayValue": [Function], + "getAllByLabelText": [Function], + "getAllByPlaceholderText": [Function], + "getAllByRole": [Function], + "getAllByTestId": [Function], + "getAllByText": [Function], + "getAllByTitle": [Function], + "getByAltText": [Function], + "getByDisplayValue": [Function], + "getByLabelText": [Function], + "getByPlaceholderText": [Function], + "getByRole": [Function], + "getByTestId": [Function], + "getByText": [Function], + "getByTitle": [Function], + "queryAllByAltText": [Function], + "queryAllByDisplayValue": [Function], + "queryAllByLabelText": [Function], + "queryAllByPlaceholderText": [Function], + "queryAllByRole": [Function], + "queryAllByTestId": [Function], + "queryAllByText": [Function], + "queryAllByTitle": [Function], + "queryByAltText": [Function], + "queryByDisplayValue": [Function], + "queryByLabelText": [Function], + "queryByPlaceholderText": [Function], + "queryByRole": [Function], + "queryByTestId": [Function], + "queryByText": [Function], + "queryByTitle": [Function], + "rerender": [Function], + "unmount": [Function], +} +`; + +exports[` should render two EuiButtonIcon 1`] = ` +Object { + "asFragment": [Function], + "baseElement": +
+ + +
+ , + "container":
+ + +
, + "debug": [Function], + "findAllByAltText": [Function], + "findAllByDisplayValue": [Function], + "findAllByLabelText": [Function], + "findAllByPlaceholderText": [Function], + "findAllByRole": [Function], + "findAllByTestId": [Function], + "findAllByText": [Function], + "findAllByTitle": [Function], + "findByAltText": [Function], + "findByDisplayValue": [Function], + "findByLabelText": [Function], + "findByPlaceholderText": [Function], + "findByRole": [Function], + "findByTestId": [Function], + "findByText": [Function], + "findByTitle": [Function], + "getAllByAltText": [Function], + "getAllByDisplayValue": [Function], + "getAllByLabelText": [Function], + "getAllByPlaceholderText": [Function], + "getAllByRole": [Function], + "getAllByTestId": [Function], + "getAllByText": [Function], + "getAllByTitle": [Function], + "getByAltText": [Function], + "getByDisplayValue": [Function], + "getByLabelText": [Function], + "getByPlaceholderText": [Function], + "getByRole": [Function], + "getByTestId": [Function], + "getByText": [Function], + "getByTitle": [Function], + "queryAllByAltText": [Function], + "queryAllByDisplayValue": [Function], + "queryAllByLabelText": [Function], + "queryAllByPlaceholderText": [Function], + "queryAllByRole": [Function], + "queryAllByTestId": [Function], + "queryAllByText": [Function], + "queryAllByTitle": [Function], + "queryByAltText": [Function], + "queryByDisplayValue": [Function], + "queryByLabelText": [Function], + "queryByPlaceholderText": [Function], + "queryByRole": [Function], + "queryByTestId": [Function], + "queryByText": [Function], + "queryByTitle": [Function], + "rerender": [Function], + "unmount": [Function], +} +`; diff --git a/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in_out/filter_in_out.stories.tsx b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in_out/filter_in_out.stories.tsx new file mode 100644 index 0000000000000..da9728f10138d --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in_out/filter_in_out.stories.tsx @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { Story } from '@storybook/react'; +import { mockIndicatorsFiltersContext } from '../../../../common/mocks/mock_indicators_filters_context'; +import { FilterInOut } from './filter_in_out'; +import { generateMockIndicator, Indicator } from '../../../../../common/types/indicator'; +import { IndicatorsFiltersContext } from '../../../indicators/context'; + +export default { + component: FilterInOut, + title: 'FilterInOut', +}; + +export const Default: Story = () => { + const mockIndicator: Indicator = generateMockIndicator(); + const mockField: string = 'threat.feed.name'; + + return ( + + + + ); +}; diff --git a/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in_out/filter_in_out.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in_out/filter_in_out.test.tsx new file mode 100644 index 0000000000000..db11ca497b515 --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in_out/filter_in_out.test.tsx @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { FunctionComponent } from 'react'; +import { render } from '@testing-library/react'; +import { FilterInOut, IN_ICON_TEST_ID, OUT_ICON_TEST_ID } from './filter_in_out'; +import { generateMockIndicator, Indicator } from '../../../../../common/types/indicator'; +import { EuiButtonIcon } from '@elastic/eui'; +import { useIndicatorsFiltersContext } from '../../../indicators/hooks/use_indicators_filters_context'; +import { mockIndicatorsFiltersContext } from '../../../../common/mocks/mock_indicators_filters_context'; + +jest.mock('../../../indicators/hooks/use_indicators_filters_context'); + +const mockIndicator: Indicator = generateMockIndicator(); + +const mockField: string = 'threat.feed.name'; + +describe('', () => { + beforeEach(() => { + ( + useIndicatorsFiltersContext as jest.MockedFunction + ).mockReturnValue(mockIndicatorsFiltersContext); + }); + + it('should render two EuiButtonIcon', () => { + const component = render(); + + expect(component.getByTestId(IN_ICON_TEST_ID)).toBeInTheDocument(); + expect(component.getByTestId(OUT_ICON_TEST_ID)).toBeInTheDocument(); + expect(component).toMatchSnapshot(); + }); + + it('should render two Component (for DataGrid use)', () => { + const mockComponent: FunctionComponent = () => ; + + const component = render( + + ); + + expect(component).toMatchSnapshot(); + }); + + it('should render an empty component (wrong data input)', () => { + const component = render(); + + expect(component).toMatchSnapshot(); + }); + + it('should render an empty component (wrong field input)', () => { + const component = render(); + + expect(component).toMatchSnapshot(); + }); +}); diff --git a/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in_out/filter_in_out.tsx b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in_out/filter_in_out.tsx new file mode 100644 index 0000000000000..56088c953ef08 --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in_out/filter_in_out.tsx @@ -0,0 +1,111 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback, VFC } from 'react'; +import { i18n } from '@kbn/i18n'; +import { EuiButtonEmpty, EuiButtonIcon } from '@elastic/eui'; +import { Filter } from '@kbn/es-query'; +import { useIndicatorsFiltersContext } from '../../../indicators/hooks/use_indicators_filters_context'; +import { getIndicatorFieldAndValue } from '../../../indicators/lib/field_value'; +import { FilterIn, FilterOut, updateFiltersArray } from '../../lib/filter'; +import { EMPTY_VALUE } from '../../../../../common/constants'; +import { Indicator } from '../../../../../common/types/indicator'; +import { useStyles } from './styles'; + +export const IN_ICON_TEST_ID = 'tiFilterInIcon'; +export const OUT_ICON_TEST_ID = 'tiFilterOutIcon'; +export const IN_COMPONENT_TEST_ID = 'tiFilterInComponent'; +export const OUT_COMPONENT_TEST_ID = 'tiFilterOutComponent'; + +const IN_ICON_TYPE = 'plusInCircle'; +const IN_ICON_TITLE = i18n.translate('xpack.threatIntelligence.queryBar.filterInButton', { + defaultMessage: 'Filter In', +}); +const OUT_ICON_TYPE = 'minusInCircle'; +const OUT_ICON_TITLE = i18n.translate('xpack.threatIntelligence.queryBar.filterOutButton', { + defaultMessage: 'Filter Out', +}); + +export interface FilterInOutProps { + /** + * Value used to filter in/out in the KQL bar. Used in combination with field if is type of {@link Indicator}. + */ + data: Indicator | string; + /** + * Value used to filter in /out in the KQL bar. + */ + field: string; + /** + * Display component for when the FilterIn component is used within a DataGrid + */ + Component?: typeof EuiButtonEmpty | typeof EuiButtonIcon; +} + +/** + * Retrieves the indicator's field and value, then creates a new {@link Filter} and adds it to the {@link FilterManager}. + */ +export const FilterInOut: VFC = ({ data, field, Component }) => { + const styles = useStyles(); + + const { filterManager } = useIndicatorsFiltersContext(); + + const { key, value } = + typeof data === 'string' ? { key: field, value: data } : getIndicatorFieldAndValue(data, field); + + const filterIn = useCallback((): void => { + const existingFilters = filterManager.getFilters(); + const newFilters: Filter[] = updateFiltersArray(existingFilters, key, value, FilterIn); + filterManager.setFilters(newFilters); + }, [filterManager, key, value]); + + const filterOut = useCallback(() => { + const existingFilters: Filter[] = filterManager.getFilters(); + const newFilters: Filter[] = updateFiltersArray(existingFilters, key, value, FilterOut); + filterManager.setFilters(newFilters); + }, [filterManager, key, value]); + + if (!value || value === EMPTY_VALUE || !key) { + return <>; + } + + return Component ? ( + <> +
+ +
+
+ +
+ + ) : ( + <> + + + + ); +}; diff --git a/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in_out/index.tsx b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in_out/index.tsx new file mode 100644 index 0000000000000..e0e44b90b824f --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in_out/index.tsx @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './filter_in_out'; diff --git a/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in_out/styles.ts b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in_out/styles.ts new file mode 100644 index 0000000000000..4f7814eb793cc --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/filter_in_out/styles.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CSSObject } from '@emotion/react'; + +export const useStyles = () => { + const button: CSSObject = { + display: 'inline-flex', + }; + + return { + button, + }; +}; diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/query_bar/index.tsx b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/query_bar/index.tsx similarity index 100% rename from x-pack/plugins/threat_intelligence/public/modules/indicators/components/query_bar/index.tsx rename to x-pack/plugins/threat_intelligence/public/modules/query_bar/components/query_bar/index.tsx diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/query_bar/query_bar.stories.tsx b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/query_bar/query_bar.stories.tsx similarity index 100% rename from x-pack/plugins/threat_intelligence/public/modules/indicators/components/query_bar/query_bar.stories.tsx rename to x-pack/plugins/threat_intelligence/public/modules/query_bar/components/query_bar/query_bar.stories.tsx diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/query_bar/query_bar.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/query_bar/query_bar.test.tsx similarity index 100% rename from x-pack/plugins/threat_intelligence/public/modules/indicators/components/query_bar/query_bar.test.tsx rename to x-pack/plugins/threat_intelligence/public/modules/query_bar/components/query_bar/query_bar.test.tsx diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/query_bar/query_bar.tsx b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/query_bar/query_bar.tsx similarity index 98% rename from x-pack/plugins/threat_intelligence/public/modules/indicators/components/query_bar/query_bar.tsx rename to x-pack/plugins/threat_intelligence/public/modules/query_bar/components/query_bar/query_bar.tsx index f5a991015caed..d2739476d7d6b 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/components/query_bar/query_bar.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/query_bar/components/query_bar/query_bar.tsx @@ -132,7 +132,9 @@ export const QueryBar = memo( }, [filterManager, onSubmitQuery, onSavedQuery, savedQuery]); const onFiltersUpdated = useCallback( - (newFilters: Filter[]) => filterManager.setFilters(newFilters), + (newFilters: Filter[]) => { + return filterManager.setFilters(newFilters); + }, [filterManager] ); diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_filters/index.ts b/x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filters/index.ts similarity index 100% rename from x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_filters/index.ts rename to x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filters/index.ts diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_filters/use_filters.test.tsx b/x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filters/use_filters.test.tsx similarity index 100% rename from x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_filters/use_filters.test.tsx rename to x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filters/use_filters.test.tsx diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_filters/use_filters.ts b/x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filters/use_filters.ts similarity index 99% rename from x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_filters/use_filters.ts rename to x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filters/use_filters.ts index da07f70d153f5..73ce49691d5a6 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_filters/use_filters.ts +++ b/x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filters/use_filters.ts @@ -59,7 +59,6 @@ export const useFilters = (): UseFiltersValue => { // Serialize filters into query string useEffect(() => { const filterStateAsString = encodeState({ filters, filterQuery, timeRange }); - if (!deepEqual(filterManager.getFilters(), filters)) { filterManager.setFilters(filters); } diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_filters/utils.test.ts b/x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filters/utils.test.ts similarity index 100% rename from x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_filters/utils.test.ts rename to x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filters/utils.test.ts diff --git a/x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_filters/utils.ts b/x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filters/utils.ts similarity index 100% rename from x-pack/plugins/threat_intelligence/public/modules/indicators/hooks/use_filters/utils.ts rename to x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filters/utils.ts diff --git a/x-pack/plugins/threat_intelligence/public/modules/query_bar/lib/filter.test.ts b/x-pack/plugins/threat_intelligence/public/modules/query_bar/lib/filter.test.ts new file mode 100644 index 0000000000000..fefe488e5e53f --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/query_bar/lib/filter.test.ts @@ -0,0 +1,74 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Filter } from '@kbn/es-query'; +import { FilterIn, FilterOut, updateFiltersArray } from './filter'; + +describe('updateFiltersArray', () => { + it('should add new filter', () => { + const existingFilters: Filter[] = []; + const key: string = 'key'; + const value: string = 'value'; + const filterType: boolean = FilterIn; + + const newFilters = updateFiltersArray(existingFilters, key, value, filterType); + expect(newFilters).toHaveLength(1); + expect(newFilters[0].meta.key).toEqual(key); + expect(newFilters[0].meta.params.query).toEqual(value); + expect(newFilters[0].meta.negate).toEqual(!filterType); + }); + + it(`should replace a filter with it's negation`, () => { + const key: string = 'key'; + const value: string = 'value'; + const existingFilters: Filter[] = [ + { + meta: { + alias: null, + negate: false, + disabled: false, + type: 'phrase', + key, + params: { query: value }, + }, + query: { match_phrase: { [key]: value } }, + }, + ]; + const filterType: boolean = FilterOut; + + const newFilters = updateFiltersArray(existingFilters, key, value, filterType); + expect(newFilters).toHaveLength(1); + expect(newFilters[0].meta.key).toEqual(key); + expect(newFilters[0].meta.params.query).toEqual(value); + expect(newFilters[0].meta.negate).toEqual(!filterType); + }); + + it('should do nothing when filter already exists', () => { + const key: string = 'key'; + const value: string = 'value'; + const existingFilters: Filter[] = [ + { + meta: { + alias: null, + negate: true, + disabled: false, + type: 'phrase', + key, + params: { query: value }, + }, + query: { match_phrase: { [key]: value } }, + }, + ]; + const filterType: boolean = FilterIn; + + const newFilters = updateFiltersArray(existingFilters, key, value, filterType); + expect(newFilters).toHaveLength(1); + expect(newFilters[0].meta.key).toEqual(key); + expect(newFilters[0].meta.params.query).toEqual(value); + expect(newFilters[0].meta.negate).toEqual(!filterType); + }); +}); diff --git a/x-pack/plugins/threat_intelligence/public/modules/query_bar/lib/filter.ts b/x-pack/plugins/threat_intelligence/public/modules/query_bar/lib/filter.ts new file mode 100644 index 0000000000000..fe4c5cb88e06e --- /dev/null +++ b/x-pack/plugins/threat_intelligence/public/modules/query_bar/lib/filter.ts @@ -0,0 +1,81 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Filter } from '@kbn/es-query'; + +export const FilterIn = true; +export const FilterOut = false; + +/** + * Creates a new filter to apply to the KQL bar. + * @param key A string value mainly representing the field of an indicator + * @param value A string value mainly representing the value of the indicator for the field + * @param negate Set to true when we create a negated filter (e.g. NOT threat.indicator.type: url) + * @returns The new {@link Filter} + */ +const createFilter = (key: string, value: string, negate: boolean): Filter => ({ + meta: { + alias: null, + negate, + disabled: false, + type: 'phrase', + key, + params: { query: value }, + }, + query: { match_phrase: { [key]: value } }, +}); + +/** + * Checks if the key/value pair already exists in an array of filters. + * @param filters Array of {@link Filter} retrieved from the SearchBar filterManager. + * @param key A string value mainly representing the field of an indicator + * @param value A string value mainly representing the value of the indicator for the field + * @returns The new {@link Filter} + */ +const filterExistsInFiltersArray = ( + filters: Filter[], + key: string, + value: string +): Filter | undefined => + filters.find((f: Filter) => f.meta.key === key && f.meta.params.query === value); + +/** + * Returns true if the filter exists and should be removed, false otherwise (depending on a FilterIn or FilterOut action) + * @param filter The {@link Filter} + * @param filterType The type of action ({@link FilterIn} or {@link FilterOut}) + */ +const shouldRemoveFilter = (filter: Filter | undefined, filterType: boolean): boolean => + filter != null && filterType === filter.meta.negate; + +/** + * Takes an array of filters and returns the updated array according to: + * - if a filter already exists but negated, replace it by it's negation + * - add the newly created filter + * @param existingFilters List of {@link Filter} retrieved from the filterManager + * @param key The value used in the newly created [@link Filter} as a key + * @param value The value used in the newly created [@link Filter} as a params query + * @param filterType Weather the function is called for a {@link FilterIn} or {@link FilterOut} action + * @returns the updated array of filters + */ +export const updateFiltersArray = ( + existingFilters: Filter[], + key: string, + value: string | null, + filterType: boolean +): Filter[] => { + const newFilter = createFilter(key, value as string, !filterType); + + const filter: Filter | undefined = filterExistsInFiltersArray( + existingFilters, + key, + value as string + ); + + return shouldRemoveFilter(filter, filterType) + ? [...existingFilters.filter((f: Filter) => f !== filter), newFilter] + : [...existingFilters, newFilter]; +}; diff --git a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/add_to_timeline/add_to_timeline.tsx b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/add_to_timeline/add_to_timeline.tsx index 16e71f951b552..c677a7613e3e6 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/timeline/components/add_to_timeline/add_to_timeline.tsx +++ b/x-pack/plugins/threat_intelligence/public/modules/timeline/components/add_to_timeline/add_to_timeline.tsx @@ -9,10 +9,10 @@ import React, { VFC } from 'react'; import { DataProvider, QueryOperator } from '@kbn/timelines-plugin/common'; import { AddToTimelineButtonProps } from '@kbn/timelines-plugin/public'; import { EuiButtonEmpty, EuiButtonIcon } from '@elastic/eui/src/components/button'; +import { getIndicatorFieldAndValue } from '../../../indicators/lib/field_value'; import { EMPTY_VALUE } from '../../../../../common/constants'; import { useKibana } from '../../../../hooks/use_kibana'; -import { unwrapValue } from '../../../indicators/lib/unwrap_value'; -import { Indicator, RawIndicatorFieldId } from '../../../../../common/types/indicator'; +import { Indicator } from '../../../../../common/types/indicator'; import { useStyles } from './styles'; export interface AddToTimelineProps { @@ -48,17 +48,10 @@ export const AddToTimeline: VFC = ({ data, field, component, const addToTimelineButton = useKibana().services.timelines.getHoverActions().getAddToTimelineButton; - let value: string | null; - if (typeof data === 'string') { - value = data; - } else { - value = unwrapValue(data, field as RawIndicatorFieldId); - if (field === RawIndicatorFieldId.Name) { - field = unwrapValue(data, RawIndicatorFieldId.NameOrigin) as string; - } - } + const { key, value } = + typeof data === 'string' ? { key: field, value: data } : getIndicatorFieldAndValue(data, field); - if (!value || value === EMPTY_VALUE || !field) { + if (!value || value === EMPTY_VALUE || !key) { return <>; } @@ -68,12 +61,12 @@ export const AddToTimeline: VFC = ({ data, field, component, { and: [], enabled: true, - id: `timeline-indicator-${field}-${value}`, + id: `timeline-indicator-${key}-${value}`, name: value, excluded: false, kqlQuery: '', queryMatch: { - field, + field: key, value, operator, }, @@ -82,7 +75,7 @@ export const AddToTimeline: VFC = ({ data, field, component, const addToTimelineProps: AddToTimelineButtonProps = { dataProvider, - field, + field: key, ownFocus: false, }; if (component) addToTimelineProps.Component = component; From f54349f26b884e762d1fd753ab2f17dd9f9d98a1 Mon Sep 17 00:00:00 2001 From: Miriam <31922082+MiriamAparicio@users.noreply.github.com> Date: Tue, 6 Sep 2022 09:11:27 +0100 Subject: [PATCH 16/19] Enable skipped e2e tests (#139912) * Enable skipped e2e tests * review comments * return request * return promise --- .../integration_policy.spec.ts | 2 +- .../power_user/settings/custom_links.spec.ts | 32 +++ .../read_only_user/dependencies.spec.ts | 4 +- .../errors/error_details.spec.ts | 2 +- .../integration/read_only_user/home.spec.ts | 2 +- .../service_inventory.spec.ts | 195 +++++++++--------- .../service_overview/header_filters.spec.ts | 4 +- .../service_overview/instances_table.spec.ts | 63 ++++-- .../service_overview/service_overview.spec.ts | 4 +- .../service_overview/time_comparison.spec.ts | 122 ++++++----- .../index.tsx | 2 +- 11 files changed, 249 insertions(+), 183 deletions(-) diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/integration/power_user/integration_settings/integration_policy.spec.ts b/x-pack/plugins/apm/ftr_e2e/cypress/integration/power_user/integration_settings/integration_policy.spec.ts index 7b97813cb1219..c25e6a6800311 100644 --- a/x-pack/plugins/apm/ftr_e2e/cypress/integration/power_user/integration_settings/integration_policy.spec.ts +++ b/x-pack/plugins/apm/ftr_e2e/cypress/integration/power_user/integration_settings/integration_policy.spec.ts @@ -52,7 +52,7 @@ const apisToIntercept = [ }, ]; -describe.skip('when navigating to integration page', () => { +describe('when navigating to integration page', () => { beforeEach(() => { const integrationsPath = '/app/integrations/browse'; diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/integration/power_user/settings/custom_links.spec.ts b/x-pack/plugins/apm/ftr_e2e/cypress/integration/power_user/settings/custom_links.spec.ts index c282c64a1b007..615ff2b49a85a 100644 --- a/x-pack/plugins/apm/ftr_e2e/cypress/integration/power_user/settings/custom_links.spec.ts +++ b/x-pack/plugins/apm/ftr_e2e/cypress/integration/power_user/settings/custom_links.spec.ts @@ -6,10 +6,42 @@ */ const basePath = '/app/apm/settings/custom-links'; +const deleteAllCustomLinks = () => { + // delete customLink if exists + const kibanaUrl = Cypress.env('KIBANA_URL'); + cy.request({ + log: false, + method: 'GET', + url: `${kibanaUrl}/internal/apm/settings/custom_links`, + body: {}, + headers: { + 'kbn-xsrf': 'e2e_test', + }, + auth: { user: 'editor', pass: 'changeme' }, + }).then((response) => { + const promises = response.body.customLinks.map((item: any) => { + if (item.id) { + return cy.request({ + log: false, + method: 'DELETE', + url: `${kibanaUrl}/internal/apm/settings/custom_links/${item.id}`, + body: {}, + headers: { + 'kbn-xsrf': 'e2e_test', + }, + auth: { user: 'editor', pass: 'changeme' }, + failOnStatusCode: false, + }); + } + }); + return Promise.all(promises); + }); +}; describe('Custom links', () => { beforeEach(() => { cy.loginAsEditorUser(); + deleteAllCustomLinks(); }); it('shows empty message and create button', () => { diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/dependencies.spec.ts b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/dependencies.spec.ts index e3746489936ab..653809a8e04d3 100644 --- a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/dependencies.spec.ts +++ b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/dependencies.spec.ts @@ -16,7 +16,7 @@ const timeRange = { rangeTo: end, }; -describe.skip('Dependencies', () => { +describe('Dependencies', () => { before(() => { synthtrace.index( opbeans({ @@ -57,7 +57,7 @@ describe.skip('Dependencies', () => { }); }); - describe.skip('dependency overview page', () => { + describe('dependency overview page', () => { it('shows dependency information and you can navigate to a page for an upstream service', () => { cy.visitKibana( `/app/apm/dependencies/overview?${new URLSearchParams({ diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/errors/error_details.spec.ts b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/errors/error_details.spec.ts index 28b3068503644..19de523c7ab1f 100644 --- a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/errors/error_details.spec.ts +++ b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/errors/error_details.spec.ts @@ -96,7 +96,7 @@ describe('Error details', () => { }); describe('when clicking on View x occurences in discover', () => { - it.skip('should redirects the user to discover', () => { + it('should redirects the user to discover', () => { cy.visitKibana(errorDetailsPageHref); cy.contains('View 1 occurrence in Discover').click(); cy.url().should('include', 'app/discover'); diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/home.spec.ts b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/home.spec.ts index be09ae3f06122..be9acfd38ab0c 100644 --- a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/home.spec.ts +++ b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/home.spec.ts @@ -23,7 +23,7 @@ const serviceInventoryHref = url.format({ }, }); -describe.skip('Home page', () => { +describe('Home page', () => { before(() => { synthtrace.index( opbeans({ diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_inventory/service_inventory.spec.ts b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_inventory/service_inventory.spec.ts index 5b98284cdf52a..015df91d792e9 100644 --- a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_inventory/service_inventory.spec.ts +++ b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_inventory/service_inventory.spec.ts @@ -32,18 +32,11 @@ const mainApiRequestsToIntercept = [ }, ]; -const secondaryApiRequestsToIntercept = [ - { - endpoint: 'internal/apm/suggestions?*', - aliasName: 'suggestionsRequest', - }, -]; - const mainAliasNames = mainApiRequestsToIntercept.map( ({ aliasName }) => `@${aliasName}` ); -describe('When navigating to the service inventory', () => { +describe('Service inventory', () => { before(() => { const { rangeFrom, rangeTo } = timeRange; synthtrace.index( @@ -53,44 +46,44 @@ describe('When navigating to the service inventory', () => { }) ); }); - - beforeEach(() => { - cy.loginAsViewerUser(); - cy.visitKibana(serviceInventoryHref); - }); - after(() => { synthtrace.clean(); }); - it('has no detectable a11y violations on load', () => { - cy.contains('h1', 'Services'); - // set skipFailures to true to not fail the test when there are accessibility failures - checkA11y({ skipFailures: true }); - }); + describe('When navigating to the service inventory', () => { + beforeEach(() => { + cy.loginAsViewerUser(); + cy.visitKibana(serviceInventoryHref); + }); - it('has a list of services', () => { - cy.contains('opbeans-node'); - cy.contains('opbeans-java'); - cy.contains('opbeans-rum'); - }); + it('has no detectable a11y violations on load', () => { + cy.contains('h1', 'Services'); + // set skipFailures to true to not fail the test when there are accessibility failures + checkA11y({ skipFailures: true }); + }); - it('has a list of environments', () => { - cy.get('td:contains(production)').should('have.length', 3); - }); + it('has a list of services', () => { + cy.contains('opbeans-node'); + cy.contains('opbeans-java'); + cy.contains('opbeans-rum'); + }); + + it('has a list of environments', () => { + cy.get('td:contains(production)').should('have.length', 3); + }); - it('when clicking on a service it loads the service overview for that service', () => { - cy.contains('opbeans-node').click({ force: true }); - cy.url().should('include', '/apm/services/opbeans-node/overview'); - cy.contains('h1', 'opbeans-node'); + it('when clicking on a service it loads the service overview for that service', () => { + cy.contains('opbeans-node').click({ force: true }); + cy.url().should('include', '/apm/services/opbeans-node/overview'); + cy.contains('h1', 'opbeans-node'); + }); }); - describe.skip('Calls APIs', () => { + describe('Calls APIs', () => { beforeEach(() => { - [...mainApiRequestsToIntercept, ...secondaryApiRequestsToIntercept].map( - ({ endpoint, aliasName }) => { - cy.intercept('GET', endpoint).as(aliasName); - } + cy.intercept('GET', '/internal/apm/services?*').as('servicesRequest'); + cy.intercept('POST', '/internal/apm/services/detailed_statistics?*').as( + 'detailedStatisticsRequest' ); cy.loginAsViewerUser(); @@ -99,12 +92,8 @@ describe('When navigating to the service inventory', () => { it('with the correct environment when changing the environment', () => { cy.wait(mainAliasNames); - cy.get('[data-test-subj="environmentFilter"]').type('pro'); - cy.expectAPIsToHaveBeenCalledWith({ - apisIntercepted: ['@suggestionsRequest'], - value: 'fieldValue=pro', - }); + cy.get('[data-test-subj="environmentFilter"]').type('production'); cy.contains('button', 'production').click(); @@ -120,7 +109,7 @@ describe('When navigating to the service inventory', () => { cy.wait(mainAliasNames); }); - it.skip('when selecting a different time range and clicking the update button', () => { + it('when selecting a different time range and clicking the update button', () => { cy.wait(mainAliasNames); cy.selectAbsoluteTimeRange( @@ -134,71 +123,75 @@ describe('When navigating to the service inventory', () => { cy.wait(mainAliasNames); }); }); -}); - -describe('Check detailed statistics API with multiple services', () => { - before(() => { - const { rangeFrom, rangeTo } = timeRange; - synthtrace.index( - generateMultipleServicesData({ - from: new Date(rangeFrom).getTime(), - to: new Date(rangeTo).getTime(), - }) - ); - }); - beforeEach(() => { - cy.loginAsViewerUser(); - }); + describe('Check detailed statistics API with multiple services', () => { + before(() => { + // clean previous data created + synthtrace.clean(); + const { rangeFrom, rangeTo } = timeRange; + synthtrace.index( + generateMultipleServicesData({ + from: new Date(rangeFrom).getTime(), + to: new Date(rangeTo).getTime(), + }) + ); + }); - after(() => { - synthtrace.clean(); - }); + beforeEach(() => { + cy.loginAsViewerUser(); + }); - it('calls detailed API with visible items only', () => { - cy.intercept('POST', '/internal/apm/services/detailed_statistics?*').as( - 'detailedStatisticsRequest' - ); - cy.intercept('GET', '/internal/apm/services?*').as('mainStatisticsRequest'); + after(() => { + synthtrace.clean(); + }); - cy.visitKibana( - `${serviceInventoryHref}&pageSize=10&sortField=serviceName&sortDirection=asc` - ); - cy.wait('@mainStatisticsRequest'); - cy.contains('Services'); - cy.get('.euiPagination__list').children().should('have.length', 5); - cy.wait('@detailedStatisticsRequest').then((payload) => { - expect(payload.request.body.serviceNames).eql( - JSON.stringify([ - '0', - '1', - '10', - '11', - '12', - '13', - '14', - '15', - '16', - '17', - ]) + it('calls detailed API with visible items only', () => { + cy.intercept('POST', '/internal/apm/services/detailed_statistics?*').as( + 'detailedStatisticsRequest' ); - }); - cy.get('[data-test-subj="pagination-button-1"]').click(); - cy.wait('@detailedStatisticsRequest').then((payload) => { - expect(payload.request.body.serviceNames).eql( - JSON.stringify([ - '18', - '19', - '2', - '20', - '21', - '22', - '23', - '24', - '25', - '26', - ]) + cy.intercept('GET', '/internal/apm/services?*').as( + 'mainStatisticsRequest' + ); + + cy.visitKibana( + `${serviceInventoryHref}&pageSize=10&sortField=serviceName&sortDirection=asc` ); + cy.wait('@mainStatisticsRequest'); + cy.contains('Services'); + cy.get('.euiPagination__list').children().should('have.length', 5); + cy.wait('@detailedStatisticsRequest').then((payload) => { + expect(payload.request.body.serviceNames).eql( + JSON.stringify([ + '0', + '1', + '10', + '11', + '12', + '13', + '14', + '15', + '16', + '17', + ]) + ); + }); + cy.get('[data-test-subj="pagination-button-1"]').click(); + cy.wait('@detailedStatisticsRequest').then((payload) => { + expect(payload.request.body.serviceNames).eql( + JSON.stringify([ + '18', + '19', + '2', + '20', + '21', + '22', + '23', + '24', + '25', + '26', + ]) + ); + }); }); }); }); diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_overview/header_filters.spec.ts b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_overview/header_filters.spec.ts index cf5102ee6e37e..6376d544821aa 100644 --- a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_overview/header_filters.spec.ts +++ b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_overview/header_filters.spec.ts @@ -89,7 +89,7 @@ describe('Service overview - header filters', () => { ); }); - it.skip('calls APIs with correct transaction type', () => { + it('calls APIs with correct transaction type', () => { apisToIntercept.map(({ endpoint, name }) => { cy.intercept('GET', endpoint).as(name); }); @@ -117,7 +117,7 @@ describe('Service overview - header filters', () => { }); }); - describe.skip('Filtering by kuerybar', () => { + describe('Filtering by kuerybar', () => { beforeEach(() => { cy.loginAsViewerUser(); }); diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_overview/instances_table.spec.ts b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_overview/instances_table.spec.ts index c3b5f37c32acc..03653df2b0bb6 100644 --- a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_overview/instances_table.spec.ts +++ b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_overview/instances_table.spec.ts @@ -12,11 +12,21 @@ import { opbeans } from '../../../fixtures/synthtrace/opbeans'; const start = '2021-10-10T00:00:00.000Z'; const end = '2021-10-10T00:15:00.000Z'; -const serviceOverviewHref = url.format({ +const serviceJavaOverviewHref = url.format({ pathname: '/app/apm/services/opbeans-java/overview', query: { rangeFrom: start, rangeTo: end }, }); +const serviceRumOverviewHref = url.format({ + pathname: '/app/apm/services/opbeans-rum/overview', + query: { rangeFrom: start, rangeTo: end }, +}); + +const testServiveHref = url.format({ + pathname: '/app/apm/services/test-service/overview', + query: { rangeFrom: start, rangeTo: end }, +}); + const serviceNodeName = 'opbeans-java-prod-1'; const apisToIntercept = [ @@ -37,36 +47,53 @@ const apisToIntercept = [ ]; describe('Instances table', () => { - beforeEach(() => { - cy.loginAsViewerUser(); + before(() => { + synthtrace.index( + opbeans({ + from: new Date(start).getTime(), + to: new Date(end).getTime(), + }) + ); }); - describe.skip('when data is not loaded', () => { + describe('when there is no data', () => { + beforeEach(() => { + cy.loginAsViewerUser(); + }); it('shows empty message', () => { - cy.visitKibana(serviceOverviewHref); - cy.contains('opbeans-java'); + cy.visitKibana(testServiveHref); + cy.contains('test-service'); cy.get('[data-test-subj="serviceInstancesTableContainer"]').contains( - 'No items found' + 'No instances found' ); }); }); - describe('when data is loaded', () => { - before(() => { - synthtrace.index( - opbeans({ - from: new Date(start).getTime(), - to: new Date(end).getTime(), - }) + describe('when is RUM service', () => { + beforeEach(() => { + cy.loginAsViewerUser(); + }); + + it('hides instances table', () => { + cy.visitKibana(serviceRumOverviewHref); + cy.contains('opbeans-rum'); + cy.get('[data-test-subj="serviceInstancesTableContainer"]').should( + 'not.exist' ); }); + }); + + describe('when data is loaded', () => { + beforeEach(() => { + cy.loginAsViewerUser(); + }); after(() => { synthtrace.clean(); }); it('has data in the table', () => { - cy.visitKibana(serviceOverviewHref); + cy.visitKibana(serviceJavaOverviewHref); cy.contains('opbeans-java'); cy.contains(serviceNodeName); }); @@ -75,7 +102,7 @@ describe('Instances table', () => { cy.intercept('GET', endpoint).as(name); }); - cy.visitKibana(serviceOverviewHref); + cy.visitKibana(serviceJavaOverviewHref); cy.contains('opbeans-java'); cy.wait('@instancesMainRequest'); @@ -91,12 +118,12 @@ describe('Instances table', () => { }); }); - it.skip('shows actions available', () => { + it('shows actions available', () => { apisToIntercept.map(({ endpoint, name }) => { cy.intercept('GET', endpoint).as(name); }); - cy.visitKibana(serviceOverviewHref); + cy.visitKibana(serviceJavaOverviewHref); cy.contains('opbeans-java'); cy.wait('@instancesMainRequest'); diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_overview/service_overview.spec.ts b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_overview/service_overview.spec.ts index d73713290b4ef..43e607cd23c64 100644 --- a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_overview/service_overview.spec.ts +++ b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_overview/service_overview.spec.ts @@ -219,7 +219,7 @@ describe('Service Overview', () => { cy.visitKibana(baseUrl); }); - it.skip('with the correct environment when changing the environment', () => { + it('with the correct environment when changing the environment', () => { cy.wait(aliasNames); cy.intercept('GET', 'internal/apm/suggestions?*').as( @@ -250,7 +250,7 @@ describe('Service Overview', () => { cy.wait(aliasNames); }); - it.skip('when selecting a different time range and clicking the update button', () => { + it('when selecting a different time range and clicking the update button', () => { cy.wait(aliasNames); const timeStart = moment(start).subtract(5, 'm').toISOString(); diff --git a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_overview/time_comparison.spec.ts b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_overview/time_comparison.spec.ts index 611455163eca3..718a2a4a06cf7 100644 --- a/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_overview/time_comparison.spec.ts +++ b/x-pack/plugins/apm/ftr_e2e/cypress/integration/read_only_user/service_overview/time_comparison.spec.ts @@ -50,7 +50,7 @@ const apisToIntercept = [ }, ]; -describe.skip('Service overview: Time Comparison', () => { +describe('Service overview: Time Comparison', () => { before(() => { synthtrace.index( opbeans({ @@ -65,6 +65,29 @@ describe.skip('Service overview: Time Comparison', () => { }); beforeEach(() => { + cy.intercept( + 'GET', + '/internal/apm/services/opbeans-java/transactions/charts/latency?*' + ).as('latencyChartRequest'); + cy.intercept('GET', '/internal/apm/services/opbeans-java/throughput?*').as( + 'throughputChartRequest' + ); + cy.intercept( + 'GET', + '/internal/apm/services/opbeans-java/transactions/charts/error_rate?*' + ).as('errorRateChartRequest'); + cy.intercept( + 'GET', + '/internal/apm/services/opbeans-java/transactions/groups/detailed_statistics?*' + ).as('transactionGroupsDetailedRequest'); + cy.intercept( + 'POST', + '/internal/apm/services/opbeans-java/errors/groups/detailed_statistics?*' + ).as('errorGroupsDetailedRequest'); + cy.intercept( + 'GET', + '/internal/apm/services/opbeans-java/service_overview_instances/detailed_statistics?*' + ).as('instancesDetailedRequest'); cy.loginAsViewerUser(); }); @@ -74,57 +97,7 @@ describe.skip('Service overview: Time Comparison', () => { cy.url().should('include', 'offset=1d'); }); - describe('when comparison is toggled off', () => { - it('disables select box', () => { - cy.visitKibana(serviceOverviewHref); - cy.contains('opbeans-java'); - - // Comparison is enabled by default - cy.get('[data-test-subj="comparisonSelect"]').should('be.enabled'); - - // toggles off comparison - cy.contains('Comparison').click(); - cy.get('[data-test-subj="comparisonSelect"]').should('be.disabled'); - }); - - it('calls APIs without comparison time range', () => { - apisToIntercept.map(({ endpoint, name }) => { - cy.intercept('GET', endpoint).as(name); - }); - cy.visitKibana(serviceOverviewHref); - - cy.get('[data-test-subj="comparisonSelect"]').should('be.enabled'); - const offset = `offset=1d`; - - // When the page loads it fetches all APIs with comparison time range - cy.wait(apisToIntercept.map(({ name }) => `@${name}`)).then( - (interceptions) => { - interceptions.map((interception) => { - expect(interception.request.url).include(offset); - }); - } - ); - - cy.contains('opbeans-java'); - - // toggles off comparison - cy.contains('Comparison').click(); - cy.get('[data-test-subj="comparisonSelect"]').should('be.disabled'); - // When comparison is disabled APIs are called withou comparison time range - cy.wait(apisToIntercept.map(({ name }) => `@${name}`)).then( - (interceptions) => { - interceptions.map((interception) => { - expect(interception.request.url).not.include(offset); - }); - } - ); - }); - }); - it('changes comparison type', () => { - apisToIntercept.map(({ endpoint, name }) => { - cy.intercept('GET', endpoint).as(name); - }); cy.visitKibana(serviceOverviewPath); cy.contains('opbeans-java'); // opens the page with "Day before" selected @@ -186,9 +159,6 @@ describe.skip('Service overview: Time Comparison', () => { }); it('hovers over throughput chart shows previous and current period', () => { - apisToIntercept.map(({ endpoint, name }) => { - cy.intercept('GET', endpoint).as(name); - }); cy.visitKibana( url.format({ pathname: serviceOverviewPath, @@ -209,4 +179,48 @@ describe.skip('Service overview: Time Comparison', () => { cy.contains('Throughput'); cy.contains('0 tpm'); }); + + describe('when comparison is toggled off', () => { + it('disables select box', () => { + cy.visitKibana(serviceOverviewHref); + cy.contains('opbeans-java'); + + // Comparison is enabled by default + cy.get('[data-test-subj="comparisonSelect"]').should('be.enabled'); + + // toggles off comparison + cy.contains('Comparison').click(); + cy.get('[data-test-subj="comparisonSelect"]').should('be.disabled'); + }); + + it('calls APIs without comparison time range', () => { + cy.visitKibana(serviceOverviewHref); + + cy.get('[data-test-subj="comparisonSelect"]').should('be.enabled'); + const offset = `offset=1d`; + + // When the page loads it fetches all APIs with comparison time range + cy.wait(apisToIntercept.map(({ name }) => `@${name}`)).then( + (interceptions) => { + interceptions.map((interception) => { + expect(interception.request.url).include(offset); + }); + } + ); + + cy.contains('opbeans-java'); + + // toggles off comparison + cy.contains('Comparison').click(); + cy.get('[data-test-subj="comparisonSelect"]').should('be.disabled'); + // When comparison is disabled APIs are called withou comparison time range + cy.wait(apisToIntercept.map(({ name }) => `@${name}`)).then( + (interceptions) => { + interceptions.map((interception) => { + expect(interception.request.url).not.include(offset); + }); + } + ); + }); + }); }); diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/index.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/index.tsx index 5da452bd1719a..5fad00dfa34ff 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/index.tsx @@ -166,7 +166,7 @@ export function ServiceOverviewInstancesTable({ > Date: Tue, 6 Sep 2022 09:41:52 +0100 Subject: [PATCH 17/19] [ML] Removing global ml exhaustive-deps rule (#139907) * [ML] Removing global ml exhaustive-deps rule * changes after main merge --- .eslintrc.js | 6 ------ x-pack/plugins/ml/public/alerting/job_selector.tsx | 3 +++ .../anomaly_detection_jobs_health_rule_trigger.tsx | 4 ++++ .../plugins/ml/public/alerting/ml_alerting_flyout.tsx | 2 ++ .../ml/public/alerting/ml_anomaly_alert_trigger.tsx | 9 +++++++++ .../ml/public/alerting/preview_alert_condition.tsx | 2 ++ .../ml/public/alerting/time_interval_control.tsx | 1 + .../components/annotations/annotation_flyout/index.tsx | 1 + .../components/anomalies_table/links_menu.tsx | 2 ++ .../anomaly_results_view_selector.tsx | 1 + .../components/chart_tooltip/chart_tooltip.tsx | 3 +++ .../color_range_legend/color_range_legend.tsx | 1 + .../checkbox_showcharts/checkbox_showcharts.tsx | 1 + .../components/custom_hooks/use_create_ad_links.ts | 1 + .../custom_selection_table/custom_selection_table.js | 3 +++ .../public/application/components/data_grid/common.ts | 1 + .../application/components/data_grid/data_grid.tsx | 1 + .../application/components/data_grid/use_data_grid.tsx | 2 ++ .../delete_space_aware_item_check_modal.tsx | 1 + .../full_time_range_selector.tsx | 2 ++ .../header_menu_portal/header_menu_portal.tsx | 1 + .../application/components/help_menu/help_menu.tsx | 1 + .../export_jobs_flyout/export_jobs_flyout.tsx | 4 ++++ .../import_jobs_flyout/import_jobs_flyout.tsx | 10 ++++++++++ .../import_export_jobs/import_jobs_flyout/validate.ts | 1 + .../components/job_selector/job_selector.tsx | 1 + .../components/job_selector/job_selector_flyout.tsx | 2 ++ .../components/job_selector/use_job_selection.ts | 3 +++ .../job_spaces_sync/job_spaces_sync_flyout.tsx | 1 + .../new_job_awaiting_node_shared.tsx | 4 ++++ .../components/ml_embedded_map/ml_embedded_map.tsx | 1 + .../public/application/components/ml_page/ml_page.tsx | 1 + .../public/application/components/ml_page/side_nav.tsx | 1 + .../ml_saved_objects_spaces_list.tsx | 2 ++ .../edit_model_snapshot_flyout.tsx | 3 +++ .../model_snapshots/model_snapshots_table.tsx | 3 +++ .../revert_model_snapshot_flyout/create_calendar.tsx | 5 +++++ .../revert_model_snapshot_flyout.tsx | 2 ++ .../date_picker_wrapper/date_picker_wrapper.tsx | 9 +++++++++ .../application/components/page_header/page_header.tsx | 1 + .../saved_objects_warning/saved_objects_warning.tsx | 2 ++ .../scatterplot_matrix/scatterplot_matrix.tsx | 2 ++ .../use_scatterplot_field_options.ts | 1 + .../components/vega_chart/vega_chart_view.tsx | 1 + .../application/contexts/kibana/use_cases_modal.ts | 1 + .../application/contexts/kibana/use_create_url.ts | 2 ++ .../contexts/kibana/use_navigate_to_path.ts | 1 + .../application/contexts/kibana/use_timefilter.ts | 1 + .../ml/public/application/contexts/ml/use_storage.ts | 1 + .../data_frame_analytics/common/analytics.ts | 1 + .../common/use_results_view_config.ts | 1 + .../components/advanced_step/advanced_step_form.tsx | 1 + .../configuration_step/analysis_fields_table.tsx | 1 + .../configuration_step/configuration_step_form.tsx | 9 +++++++++ .../configuration_step/supported_fields_message.tsx | 1 + .../components/configuration_step/use_saved_search.ts | 1 + .../create_analytics_advanced_editor.tsx | 2 ++ .../components/create_step/create_step.tsx | 1 + .../create_step_footer/create_step_footer.tsx | 1 + .../components/details_step/details_step_form.tsx | 4 ++++ .../components/runtime_mappings/runtime_mappings.tsx | 1 + .../validation_step/validation_step_wrapper.tsx | 1 + .../pages/analytics_creation/hooks/use_index_data.ts | 7 +++++++ .../pages/analytics_creation/page.tsx | 2 ++ .../classification_exploration/evaluate_panel.tsx | 1 + .../classification_exploration/use_confusion_matrix.ts | 1 + .../classification_exploration/use_roc_curve.ts | 1 + .../expandable_section_analytics.tsx | 1 + .../exploration_query_bar/exploration_query_bar.tsx | 2 ++ .../use_exploration_results.ts | 6 ++++++ .../use_classification_path_data.tsx | 1 + .../job_config_error_callout.tsx | 1 + .../components/outlier_exploration/use_outlier_data.ts | 5 +++++ .../regression_exploration/evaluate_panel.tsx | 1 + .../pages/analytics_exploration/page.tsx | 2 ++ .../components/action_clone/use_clone_action.tsx | 2 ++ .../components/action_delete/use_delete_action.tsx | 2 ++ .../components/action_map/use_map_action.tsx | 1 + .../components/action_start/use_start_action.tsx | 1 + .../components/action_stop/use_stop_action.tsx | 2 ++ .../components/action_view/use_view_action.tsx | 1 + .../components/analytics_list/analytics_list.tsx | 4 ++++ .../components/analytics_list/expanded_row.tsx | 1 + .../analytics_list/expanded_row_messages_pane.tsx | 2 ++ .../components/analytics_list/use_refresh_interval.ts | 1 + .../analytics_selector/analytics_id_selector.tsx | 2 ++ .../pages/job_map/components/controls.tsx | 3 +++ .../pages/job_map/components/cytoscape.tsx | 2 ++ .../data_frame_analytics/pages/job_map/job_map.tsx | 4 ++++ .../data_frame_analytics/pages/job_map/page.tsx | 1 + .../datavisualizer/file_based/file_datavisualizer.tsx | 2 ++ .../index_based/index_data_visualizer.tsx | 2 ++ .../application/explorer/actions/load_explorer_data.ts | 3 +++ .../ml/public/application/explorer/anomalies_map.tsx | 2 ++ .../application/explorer/anomaly_context_menu.tsx | 1 + .../application/explorer/anomaly_explorer_context.tsx | 3 +++ .../public/application/explorer/anomaly_timeline.tsx | 2 ++ .../add_swimlane_to_dashboard_controls.tsx | 1 + .../use_add_to_dashboard_actions.tsx | 1 + .../dashboard_controls/use_dashboards_table.tsx | 3 +++ .../ml/public/application/explorer/explorer.tsx | 6 ++++++ .../explorer_charts/explorer_charts_container.js | 4 ++++ .../explorer/swimlane_annotation_container.tsx | 1 + .../public/application/explorer/swimlane_container.tsx | 4 ++++ .../application/explorer/swimlane_pagination.tsx | 2 ++ .../confirm_modals/close_jobs_confirm_modal.tsx | 1 + .../confirm_modals/stop_datafeeds_confirm_modal.tsx | 1 + .../datafeed_chart_flyout/datafeed_chart_flyout.tsx | 5 +++++ .../datafeed_chart_flyout/edit_query_delay.tsx | 1 + .../components/delete_job_modal/delete_job_modal.tsx | 2 ++ .../jobs/jobs_list/components/job_actions/results.js | 2 ++ .../components/job_details/job_messages_pane.tsx | 3 +++ .../components/job_filter_bar/job_filter_bar.tsx | 3 +++ .../components/reset_job_modal/reset_job_modal.tsx | 2 ++ .../time_range_selector/time_range_selector.js | 1 + .../new_job/common/components/time_range_picker.tsx | 2 ++ .../common/job_creator/util/model_memory_estimator.ts | 3 +++ .../datafeed_preview_flyout/datafeed_preview.tsx | 2 ++ .../edit_categorization_analyzer_flyout.tsx | 1 + .../common/json_editor_flyout/json_editor_flyout.tsx | 2 ++ .../model_memory_limit/model_memory_limit_input.tsx | 3 +++ .../components/data_view/change_data_view.tsx | 1 + .../components/frequency/frequency_input.tsx | 3 +++ .../datafeed_step/components/query/query_input.tsx | 3 +++ .../components/query_delay/query_delay_input.tsx | 3 +++ .../components/scroll_size/scroll_size_input.tsx | 3 +++ .../datafeed_step/components/time_field/time_field.tsx | 2 ++ .../pages/components/datafeed_step/datafeed.tsx | 1 + .../components/calendars/calendars_selection.tsx | 2 ++ .../components/annotations/annotations_switch.tsx | 2 ++ .../dedicated_index/dedicated_index_switch.tsx | 1 + .../advanced_section/components/mml_callout.tsx | 1 + .../components/model_plot/model_plot_switch.tsx | 2 ++ .../components/groups/groups_input.tsx | 2 ++ .../job_description/job_description_input.tsx | 1 + .../components/job_id/job_id_input.tsx | 2 ++ .../pages/components/job_details_step/job_details.tsx | 1 + .../advanced_detector_modal.tsx | 2 ++ .../components/advanced_view/advanced_view.tsx | 1 + .../components/advanced_view/detector_list.tsx | 2 ++ .../components/advanced_view/metric_selection.tsx | 1 + .../components/agg_select/agg_select.tsx | 1 + .../components/bucket_span/bucket_span.tsx | 4 ++++ .../bucket_span_estimator/bucket_span_estimator.tsx | 2 ++ .../pick_fields_step/components/by_field/by_field.tsx | 5 +++++ .../categorization_detector.tsx | 2 ++ .../categorization_field/categorization_field.tsx | 2 ++ .../categorization_field_select.tsx | 1 + .../categorization_per_partition.tsx | 1 + .../categorization_per_partition_dropdown.tsx | 3 +++ .../categorization_per_partition_input.tsx | 1 + .../categorization_per_partition_switch.tsx | 2 ++ .../categorization_stop_on_warn_switch.tsx | 2 ++ .../categorization_view/categorization_view.tsx | 1 + .../category_stopped_partitions.tsx | 1 + .../categorization_view/metric_selection.tsx | 3 +++ .../categorization_view/metric_selection_summary.tsx | 1 + .../components/categorization_view/top_categories.tsx | 1 + .../components/influencers/influencers.tsx | 2 ++ .../components/multi_metric_view/metric_selection.tsx | 5 +++++ .../multi_metric_view/metric_selection_summary.tsx | 2 ++ .../components/multi_metric_view/multi_metric_view.tsx | 1 + .../components/population_field/population_field.tsx | 5 +++++ .../components/population_view/metric_selection.tsx | 5 +++++ .../population_view/metric_selection_summary.tsx | 3 +++ .../components/population_view/population_view.tsx | 1 + .../components/rare_detector/rare_detector.tsx | 2 ++ .../components/rare_field/rare_field.tsx | 5 +++++ .../components/rare_view/detector_description.tsx | 1 + .../components/rare_view/metric_selection.tsx | 1 + .../components/rare_view/metric_selection_summary.tsx | 2 ++ .../components/rare_view/rare_view.tsx | 1 + .../components/single_metric_view/metric_selection.tsx | 3 +++ .../single_metric_view/metric_selection_summary.tsx | 1 + .../single_metric_view/single_metric_view.tsx | 1 + .../components/sparse_data/sparse_data_switch.tsx | 2 ++ .../components/split_field/split_field.tsx | 5 +++++ .../summary_count_field/summary_count_field.tsx | 3 +++ .../pages/components/pick_fields_step/pick_fields.tsx | 1 + .../new_job/pages/components/summary_step/summary.tsx | 2 ++ .../pages/components/time_range_step/time_range.tsx | 2 ++ .../pages/components/validation_step/validation.tsx | 1 + .../application/jobs/new_job/pages/new_job/page.tsx | 3 +++ .../application/jobs/new_job/pages/new_job/wizard.tsx | 4 ++++ .../jobs/new_job/recognize/components/edit_job.tsx | 1 + .../new_job/recognize/components/job_settings_form.tsx | 2 ++ .../public/application/jobs/new_job/recognize/page.tsx | 1 + .../components/jobs_list_page/jobs_list_page.tsx | 2 ++ .../space_management/space_management.tsx | 2 ++ .../components/analytics_panel/analytics_panel.tsx | 1 + .../anomaly_detection_panel.tsx | 1 + .../plugins/ml/public/application/routing/router.tsx | 1 + .../ml/public/application/routing/routes/explorer.tsx | 5 +++++ .../ml/public/application/routing/routes/jobs_list.tsx | 1 + .../application/routing/routes/timeseriesexplorer.tsx | 5 +++++ .../ml/public/application/routing/use_active_route.tsx | 2 ++ .../ml/public/application/routing/use_refresh.ts | 1 + .../ml/public/application/routing/use_resolver.ts | 1 + .../toast_notification_service.ts | 1 + .../settings/anomaly_detection_settings.tsx | 1 + .../components/entity_control/entity_config.tsx | 1 + .../plot_function_controls/plot_function_controls.tsx | 1 + .../components/series_controls/series_controls.tsx | 1 + .../timeseries_chart/timeseries_chart_with_tooltip.tsx | 2 ++ .../models_management/delete_models_modal.tsx | 1 + .../trained_models/models_management/expanded_row.tsx | 2 ++ .../trained_models/models_management/models_list.tsx | 4 ++++ .../test_models/models/inference_input_form.tsx | 3 +++ .../question_answering/question_answering_input.tsx | 1 + .../models/text_classification/fill_mask_output.tsx | 1 + .../zero_shot_classification_input.tsx | 1 + .../test_models/models/text_input.tsx | 1 + .../nodes_overview/memory_preview_chart.tsx | 1 + .../trained_models/nodes_overview/nodes_list.tsx | 2 ++ .../plugins/ml/public/application/util/url_state.tsx | 3 +++ .../embeddable_anomaly_charts_container.tsx | 3 +++ .../use_anomaly_charts_input_resolver.ts | 4 ++++ .../embeddable_swim_lane_container.tsx | 2 ++ .../anomaly_swimlane/swimlane_input_resolver.ts | 9 +++++++++ .../common/use_embeddable_execution_context.ts | 1 + .../lens/lens_vis_layer_selection_flyout/flyout.tsx | 1 + .../layer/compatible_layer.tsx | 1 + 222 files changed, 472 insertions(+), 6 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index caa408887c499..b73b88ba95de9 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -287,12 +287,6 @@ module.exports = { 'jsx-a11y/click-events-have-key-events': 'off', }, }, - { - files: ['x-pack/plugins/ml/**/*.{js,mjs,ts,tsx}'], - rules: { - 'react-hooks/exhaustive-deps': 'off', - }, - }, /** * Files that require dual-license headers, settings diff --git a/x-pack/plugins/ml/public/alerting/job_selector.tsx b/x-pack/plugins/ml/public/alerting/job_selector.tsx index 3ba9a7c1ff838..2a4791a29e576 100644 --- a/x-pack/plugins/ml/public/alerting/job_selector.tsx +++ b/x-pack/plugins/ml/public/alerting/job_selector.tsx @@ -111,8 +111,10 @@ export const JobSelectorControl: FC = ({ } catch (e) { // TODO add error handling } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [adJobsApiService]); + // eslint-disable-next-line react-hooks/exhaustive-deps const onSelectionChange: EuiComboBoxProps['onChange'] = useCallback( ((selectionUpdate) => { if (selectionUpdate.some((selectedOption) => selectedOption.value === ALL_JOBS_SELECTION)) { @@ -142,6 +144,7 @@ export const JobSelectorControl: FC = ({ useEffect(() => { if (defaultOptions) return; fetchOptions(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return ( diff --git a/x-pack/plugins/ml/public/alerting/jobs_health_rule/anomaly_detection_jobs_health_rule_trigger.tsx b/x-pack/plugins/ml/public/alerting/jobs_health_rule/anomaly_detection_jobs_health_rule_trigger.tsx index 1b88b38788554..9fff85c82888f 100644 --- a/x-pack/plugins/ml/public/alerting/jobs_health_rule/anomaly_detection_jobs_health_rule_trigger.tsx +++ b/x-pack/plugins/ml/public/alerting/jobs_health_rule/anomaly_detection_jobs_health_rule_trigger.tsx @@ -54,6 +54,7 @@ const AnomalyDetectionJobsHealthRuleTrigger: FC = ({ (update: MlAnomalyDetectionJobsHealthRuleParams[T]) => { setRuleParams(param, update); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); @@ -119,6 +120,7 @@ const AnomalyDetectionJobsHealthRuleTrigger: FC = ({ = ({ } else { callback(null); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [])} errors={Array.isArray(errors.excludeJobs) ? errors.excludeJobs : []} multiSelect @@ -159,6 +162,7 @@ const AnomalyDetectionJobsHealthRuleTrigger: FC = ({ diff --git a/x-pack/plugins/ml/public/alerting/ml_alerting_flyout.tsx b/x-pack/plugins/ml/public/alerting/ml_alerting_flyout.tsx index 52707437d3bf9..9bebdfec957ab 100644 --- a/x-pack/plugins/ml/public/alerting/ml_alerting_flyout.tsx +++ b/x-pack/plugins/ml/public/alerting/ml_alerting_flyout.tsx @@ -79,6 +79,7 @@ export const MlAnomalyAlertFlyout: FC = ({ }, }); // deps on id to avoid re-rendering on auto-refresh + // eslint-disable-next-line react-hooks/exhaustive-deps }, [triggersActionsUi, initialAlert?.id, jobIds]); return <>{AlertFlyout}; @@ -114,6 +115,7 @@ export const JobListMlAnomalyAlertFlyout: FC = return () => { unsetShowFunction(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return isVisible && jobIds ? ( diff --git a/x-pack/plugins/ml/public/alerting/ml_anomaly_alert_trigger.tsx b/x-pack/plugins/ml/public/alerting/ml_anomaly_alert_trigger.tsx index f025a2d4bd86d..a5ef1e7943438 100644 --- a/x-pack/plugins/ml/public/alerting/ml_anomaly_alert_trigger.tsx +++ b/x-pack/plugins/ml/public/alerting/ml_anomaly_alert_trigger.tsx @@ -59,6 +59,7 @@ const MlAnomalyAlertTrigger: FC = ({ (update: MlAnomalyDetectionAlertParams[T]) => { setRuleParams(param, update); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); @@ -83,6 +84,7 @@ const MlAnomalyAlertTrigger: FC = ({ toastLifeTimeMs: 5000, }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobsAndGroupIds]); const availableResultTypes = useMemo(() => { @@ -98,6 +100,7 @@ const MlAnomalyAlertTrigger: FC = ({ if (jobsAndGroupIds.length === 0) return; fetchJobsConfig(); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [jobsAndGroupIds] ); @@ -130,6 +133,7 @@ const MlAnomalyAlertTrigger: FC = ({ lookbackInterval, topNBuckets, }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ruleParams.lookbackInterval, ruleParams.topNBuckets, jobConfigs]); const resultParams = useMemo(() => { @@ -164,6 +168,7 @@ const MlAnomalyAlertTrigger: FC = ({ @@ -179,15 +184,18 @@ const MlAnomalyAlertTrigger: FC = ({ @@ -198,6 +206,7 @@ const MlAnomalyAlertTrigger: FC = ({ Object.keys(update).forEach((k) => { setRuleParams(k, update[k as keyof MlAnomalyDetectionAlertAdvancedSettings]); }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [])} /> diff --git a/x-pack/plugins/ml/public/alerting/preview_alert_condition.tsx b/x-pack/plugins/ml/public/alerting/preview_alert_condition.tsx index 951ce81fddbd1..78b76b38fae80 100644 --- a/x-pack/plugins/ml/public/alerting/preview_alert_condition.tsx +++ b/x-pack/plugins/ml/public/alerting/preview_alert_condition.tsx @@ -130,6 +130,7 @@ export const PreviewAlertCondition: FC = ({ [] ); + // eslint-disable-next-line react-hooks/exhaustive-deps const validationErrors = useMemo(() => validators(lookBehindInterval), [lookBehindInterval]); useEffect( @@ -153,6 +154,7 @@ export const PreviewAlertCondition: FC = ({ setPreviewResponse(undefined); setPreviewError(e.body ?? e); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [alertParams, lookBehindInterval]); const sampleHits = useMemo(() => { diff --git a/x-pack/plugins/ml/public/alerting/time_interval_control.tsx b/x-pack/plugins/ml/public/alerting/time_interval_control.tsx index 4ab73500958ae..98915e3565cfb 100644 --- a/x-pack/plugins/ml/public/alerting/time_interval_control.tsx +++ b/x-pack/plugins/ml/public/alerting/time_interval_control.tsx @@ -25,6 +25,7 @@ export const TimeIntervalControl: FC = ({ }) => { const validators = useMemo(() => composeValidators(timeIntervalInputValidator()), []); + // eslint-disable-next-line react-hooks/exhaustive-deps const validationErrors = useMemo(() => validators(value), [value]); const isInvalid = !!value && !!validationErrors; diff --git a/x-pack/plugins/ml/public/application/components/annotations/annotation_flyout/index.tsx b/x-pack/plugins/ml/public/application/components/annotations/annotation_flyout/index.tsx index bf2d41acd116b..5153f3267013c 100644 --- a/x-pack/plugins/ml/public/application/components/annotations/annotation_flyout/index.tsx +++ b/x-pack/plugins/ml/public/application/components/annotations/annotation_flyout/index.tsx @@ -439,6 +439,7 @@ export const AnnotationFlyout: FC = (props) => { const cancelEditingHandler = useCallback(() => { annotationUpdatesService.setValue(null); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); if (annotationProp === undefined || annotationProp === null) { diff --git a/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.tsx b/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.tsx index f4847ea9d41c1..daeadf69a56cc 100644 --- a/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.tsx +++ b/x-pack/plugins/ml/public/application/components/anomalies_table/links_menu.tsx @@ -264,6 +264,7 @@ export const LinksMenuUI = (props: LinksMenuProps) => { return () => { unmounted = true; }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [JSON.stringify(props.anomaly)]); const openCustomUrl = (customUrl: KibanaUrlConfig) => { @@ -759,6 +760,7 @@ export const LinksMenuUI = (props: LinksMenuProps) => { ); } return items; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ openInDiscoverUrl, discoverUrlError, diff --git a/x-pack/plugins/ml/public/application/components/anomaly_results_view_selector/anomaly_results_view_selector.tsx b/x-pack/plugins/ml/public/application/components/anomaly_results_view_selector/anomaly_results_view_selector.tsx index 3db87633b807c..d0111c5aed438 100644 --- a/x-pack/plugins/ml/public/application/components/anomaly_results_view_selector/anomaly_results_view_selector.tsx +++ b/x-pack/plugins/ml/public/application/components/anomaly_results_view_selector/anomaly_results_view_selector.tsx @@ -65,6 +65,7 @@ export const AnomalyResultsViewSelector: FC = ({ viewId, selectedJobs }) 'data-test-subj': 'mlAnomalyResultsViewSelectorExplorer', }, ], + // eslint-disable-next-line react-hooks/exhaustive-deps [isSingleMetricViewerDisabled, selectedJobs?.length] ); diff --git a/x-pack/plugins/ml/public/application/components/chart_tooltip/chart_tooltip.tsx b/x-pack/plugins/ml/public/application/components/chart_tooltip/chart_tooltip.tsx index b721608d53f7e..5ff5d478ffcf9 100644 --- a/x-pack/plugins/ml/public/application/components/chart_tooltip/chart_tooltip.tsx +++ b/x-pack/plugins/ml/public/application/components/chart_tooltip/chart_tooltip.tsx @@ -90,8 +90,10 @@ const Tooltip: FC<{ service: ChartTooltipService }> = React.memo(({ service }) = return () => { subscription.unsubscribe(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + // eslint-disable-next-line react-hooks/exhaustive-deps const triggerCallback = useCallback( (({ triggerRef }) => { // obtain the reference to the trigger setter callback @@ -103,6 +105,7 @@ const Tooltip: FC<{ service: ChartTooltipService }> = React.memo(({ service }) = [] ); + // eslint-disable-next-line react-hooks/exhaustive-deps const tooltipCallback = useCallback( (({ tooltipRef, getTooltipProps }) => { return ( diff --git a/x-pack/plugins/ml/public/application/components/color_range_legend/color_range_legend.tsx b/x-pack/plugins/ml/public/application/components/color_range_legend/color_range_legend.tsx index fb65af0472ddd..5f0c0a401bedd 100644 --- a/x-pack/plugins/ml/public/application/components/color_range_legend/color_range_legend.tsx +++ b/x-pack/plugins/ml/public/application/components/color_range_legend/color_range_legend.tsx @@ -128,6 +128,7 @@ export const ColorRangeLegend: FC = ({ if (!showTicks) { wrapper.selectAll('.axis line').style('display', 'none'); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [JSON.stringify(scale), d3Container.current]); if (title === undefined) { diff --git a/x-pack/plugins/ml/public/application/components/controls/checkbox_showcharts/checkbox_showcharts.tsx b/x-pack/plugins/ml/public/application/components/controls/checkbox_showcharts/checkbox_showcharts.tsx index bab6b6f132558..91cc0af5be61b 100644 --- a/x-pack/plugins/ml/public/application/components/controls/checkbox_showcharts/checkbox_showcharts.tsx +++ b/x-pack/plugins/ml/public/application/components/controls/checkbox_showcharts/checkbox_showcharts.tsx @@ -24,6 +24,7 @@ export const CheckboxShowCharts: FC = () => { const onChange = useCallback((e: React.ChangeEvent) => { chartsStateService.setShowCharts(e.target.checked); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const id = useMemo(() => htmlIdGenerator()(), []); diff --git a/x-pack/plugins/ml/public/application/components/custom_hooks/use_create_ad_links.ts b/x-pack/plugins/ml/public/application/components/custom_hooks/use_create_ad_links.ts index 3e051877fff77..1161b99a61e4b 100644 --- a/x-pack/plugins/ml/public/application/components/custom_hooks/use_create_ad_links.ts +++ b/x-pack/plugins/ml/public/application/components/custom_hooks/use_create_ad_links.ts @@ -33,6 +33,7 @@ export const useCreateADLinks = () => { ); return `${basePath.get()}/app/ml/${resultsUrl}`; }, + // eslint-disable-next-line react-hooks/exhaustive-deps [basePath] ); return { createLinkWithUserDefaults }; diff --git a/x-pack/plugins/ml/public/application/components/custom_selection_table/custom_selection_table.js b/x-pack/plugins/ml/public/application/components/custom_selection_table/custom_selection_table.js index 9062836bc32d2..a592fb571a03e 100644 --- a/x-pack/plugins/ml/public/application/components/custom_selection_table/custom_selection_table.js +++ b/x-pack/plugins/ml/public/application/components/custom_selection_table/custom_selection_table.js @@ -76,11 +76,13 @@ export function CustomSelectionTable({ useEffect(() => { setCurrentItems(items); handleQueryChange({ query: query }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [items]); // When changes to selected ids made via badge removal - update selection in the table accordingly useEffect(() => { setItemIdToSelectedMap(getCurrentlySelectedItemIdsMap()); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedIds]); useEffect(() => { @@ -91,6 +93,7 @@ export function CustomSelectionTable({ lastItemIndex: tablePager.getLastItemIndex(), }); setPager(tablePager); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [currentItems]); function getCurrentlySelectedItemIdsMap() { diff --git a/x-pack/plugins/ml/public/application/components/data_grid/common.ts b/x-pack/plugins/ml/public/application/components/data_grid/common.ts index d65d041c9a204..15e3600d67fe3 100644 --- a/x-pack/plugins/ml/public/application/components/data_grid/common.ts +++ b/x-pack/plugins/ml/public/application/components/data_grid/common.ts @@ -404,6 +404,7 @@ export const useRenderCellValue = ( return cellValue; }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [indexPattern?.fields, pagination.pageIndex, pagination.pageSize, tableItems]); return renderCellValue; }; diff --git a/x-pack/plugins/ml/public/application/components/data_grid/data_grid.tsx b/x-pack/plugins/ml/public/application/components/data_grid/data_grid.tsx index 3edc757c11846..b2fceb58edfa4 100644 --- a/x-pack/plugins/ml/public/application/components/data_grid/data_grid.tsx +++ b/x-pack/plugins/ml/public/application/components/data_grid/data_grid.tsx @@ -176,6 +176,7 @@ export const DataGrid: FC = memo( return ; } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [baseline, data] ); diff --git a/x-pack/plugins/ml/public/application/components/data_grid/use_data_grid.tsx b/x-pack/plugins/ml/public/application/components/data_grid/use_data_grid.tsx index 55c12338b8fd4..331078d9ce671 100644 --- a/x-pack/plugins/ml/public/application/components/data_grid/use_data_grid.tsx +++ b/x-pack/plugins/ml/public/application/components/data_grid/use_data_grid.tsx @@ -80,6 +80,7 @@ export const useDataGrid = ( useEffect(() => { setVisibleColumns(defaultVisibleColumns); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [defaultVisibleColumns.join()]); const [invalidSortingColumnns, setInvalidSortingColumnns] = useState([]); @@ -137,6 +138,7 @@ export const useDataGrid = ( // If both columns are visible sort by their visible sorting order. return visibleColumns.indexOf(a.id) - visibleColumns.indexOf(b.id); }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [columns, columnCharts, chartsVisible, JSON.stringify(visibleColumns)]); // Initialize the mini histogram charts toggle button. diff --git a/x-pack/plugins/ml/public/application/components/delete_space_aware_item_check_modal/delete_space_aware_item_check_modal.tsx b/x-pack/plugins/ml/public/application/components/delete_space_aware_item_check_modal/delete_space_aware_item_check_modal.tsx index 882a351877071..4b576695c981a 100644 --- a/x-pack/plugins/ml/public/application/components/delete_space_aware_item_check_modal/delete_space_aware_item_check_modal.tsx +++ b/x-pack/plugins/ml/public/application/components/delete_space_aware_item_check_modal/delete_space_aware_item_check_modal.tsx @@ -278,6 +278,7 @@ export const DeleteSpaceAwareItemCheckModal: FC = ({ setDidUntag(false); } setIsLoading(false); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [hasManagedJob]); const onUntagClick = async () => { diff --git a/x-pack/plugins/ml/public/application/components/full_time_range_selector/full_time_range_selector.tsx b/x-pack/plugins/ml/public/application/components/full_time_range_selector/full_time_range_selector.tsx index 5b94a9fdc0763..e87c8c47df5a2 100644 --- a/x-pack/plugins/ml/public/application/components/full_time_range_selector/full_time_range_selector.tsx +++ b/x-pack/plugins/ml/public/application/components/full_time_range_selector/full_time_range_selector.tsx @@ -93,6 +93,7 @@ export const FullTimeRangeSelector: FC = ({ dataView, query, disabled, ca setFrozenDataPreference(id as FrozenTierPreference); setRange(dataView, query, id === FROZEN_TIER_PREFERENCE.EXCLUDE); closePopover(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const popoverContent = useMemo( @@ -106,6 +107,7 @@ export const FullTimeRangeSelector: FC = ({ dataView, query, disabled, ca /> ), + // eslint-disable-next-line react-hooks/exhaustive-deps [frozenDataPreference, sortOptions] ); diff --git a/x-pack/plugins/ml/public/application/components/header_menu_portal/header_menu_portal.tsx b/x-pack/plugins/ml/public/application/components/header_menu_portal/header_menu_portal.tsx index 66fa4f2869384..e3190e626a3bd 100644 --- a/x-pack/plugins/ml/public/application/components/header_menu_portal/header_menu_portal.tsx +++ b/x-pack/plugins/ml/public/application/components/header_menu_portal/header_menu_portal.tsx @@ -41,6 +41,7 @@ export const HeaderMenuPortal: FC = ({ children }) => { portalNode.unmount(); setHeaderActionMenu(undefined); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [portalNode, setHeaderActionMenu, services.theme.theme$]); return {children}; diff --git a/x-pack/plugins/ml/public/application/components/help_menu/help_menu.tsx b/x-pack/plugins/ml/public/application/components/help_menu/help_menu.tsx index 2362834508e7c..4d0c88036dad3 100644 --- a/x-pack/plugins/ml/public/application/components/help_menu/help_menu.tsx +++ b/x-pack/plugins/ml/public/application/components/help_menu/help_menu.tsx @@ -29,6 +29,7 @@ export const HelpMenu: FC = React.memo(({ docLink }) => { }, ], }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return null; diff --git a/x-pack/plugins/ml/public/application/components/import_export_jobs/export_jobs_flyout/export_jobs_flyout.tsx b/x-pack/plugins/ml/public/application/components/import_export_jobs/export_jobs_flyout/export_jobs_flyout.tsx index 43bc861f8f83a..4c53bbd1c4a17 100644 --- a/x-pack/plugins/ml/public/application/components/import_export_jobs/export_jobs_flyout/export_jobs_flyout.tsx +++ b/x-pack/plugins/ml/public/application/components/import_export_jobs/export_jobs_flyout/export_jobs_flyout.tsx @@ -52,6 +52,7 @@ export const ExportJobsFlyout: FC = ({ isDisabled, currentTab }) => { }, } = useMlKibana(); + // eslint-disable-next-line react-hooks/exhaustive-deps const jobsExportService = useMemo(() => new JobsExportService(mlApiServices), []); const [loadingADJobs, setLoadingADJobs] = useState(true); @@ -124,6 +125,7 @@ export const ExportJobsFlyout: FC = ({ isDisabled, currentTab }) => { }); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [showFlyout] ); @@ -186,6 +188,7 @@ export const ExportJobsFlyout: FC = ({ isDisabled, currentTab }) => { switchTab(jobType); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [selectedJobIds] ); @@ -193,6 +196,7 @@ export const ExportJobsFlyout: FC = ({ isDisabled, currentTab }) => { setSelectedJobDependencies( jobDependencies.filter(({ jobId }) => selectedJobIds.includes(jobId)) ); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedJobIds]); function switchTab(jobType: JobType) { diff --git a/x-pack/plugins/ml/public/application/components/import_export_jobs/import_jobs_flyout/import_jobs_flyout.tsx b/x-pack/plugins/ml/public/application/components/import_export_jobs/import_jobs_flyout/import_jobs_flyout.tsx index a47d6b478c0dd..0e786a63b222d 100644 --- a/x-pack/plugins/ml/public/application/components/import_export_jobs/import_jobs_flyout/import_jobs_flyout.tsx +++ b/x-pack/plugins/ml/public/application/components/import_export_jobs/import_jobs_flyout/import_jobs_flyout.tsx @@ -104,6 +104,7 @@ export const ImportJobsFlyout: FC = ({ isDisabled }) => { function onFlyoutChange() { reset(); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [showFlyout] ); @@ -170,6 +171,7 @@ export const ImportJobsFlyout: FC = ({ isDisabled }) => { } catch (error) { displayErrorToast(error); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const onImport = useCallback(async () => { @@ -191,6 +193,7 @@ export const ImportJobsFlyout: FC = ({ isDisabled }) => { setImporting(false); setShowFlyout(false); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobType, jobIdObjects, adJobs, dfaJobs]); const bulkCreateADJobs = useCallback(async (jobs: ImportedAdJob[]) => { @@ -219,6 +222,7 @@ export const ImportJobsFlyout: FC = ({ isDisabled }) => { displayImportErrorToast(errors, failedJobIds.size); mlUsageCollection.count('import_failed_anomaly_detector_jobs', failedJobIds.size); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const bulkCreateDfaJobs = useCallback(async (jobs: DataFrameAnalyticsConfig[]) => { @@ -240,6 +244,7 @@ export const ImportJobsFlyout: FC = ({ isDisabled }) => { displayImportErrorToast(errors, errors.length); mlUsageCollection.count('import_failed_data_frame_analytics_jobs', errors.length); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const displayImportSuccessToast = useCallback((count: number) => { @@ -248,6 +253,7 @@ export const ImportJobsFlyout: FC = ({ isDisabled }) => { values: { count }, }); displaySuccessToast(title); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const displayImportErrorToast = useCallback((errors: ErrorType[], failureCount: number) => { @@ -258,6 +264,7 @@ export const ImportJobsFlyout: FC = ({ isDisabled }) => { const errorList = errors.map(extractErrorProperties); displayErrorToast(errorList as unknown as ErrorType, title); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const deleteJob = useCallback( @@ -279,6 +286,7 @@ export const ImportJobsFlyout: FC = ({ isDisabled }) => { setIdsMash(ids); setValidatingJobs(true); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [jobIdObjects, adJobs, dfaJobs] ); @@ -306,6 +314,7 @@ export const ImportJobsFlyout: FC = ({ isDisabled }) => { setIdsMash(ids); setValidatingJobs(true); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [jobIdObjects] ); @@ -321,6 +330,7 @@ export const ImportJobsFlyout: FC = ({ isDisabled }) => { setIdsMash(ids); setValidatingJobs(true); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [jobIdObjects] ); diff --git a/x-pack/plugins/ml/public/application/components/import_export_jobs/import_jobs_flyout/validate.ts b/x-pack/plugins/ml/public/application/components/import_export_jobs/import_jobs_flyout/validate.ts index 4c8ebe4e017aa..611a3c464b440 100644 --- a/x-pack/plugins/ml/public/application/components/import_export_jobs/import_jobs_flyout/validate.ts +++ b/x-pack/plugins/ml/public/application/components/import_export_jobs/import_jobs_flyout/validate.ts @@ -111,6 +111,7 @@ export const useValidateIds = ( setJobIdObjects([...jobIdObjects]); setValidatingJobs(false); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [idsMash, jobIdObjects]); return [validateIds]; diff --git a/x-pack/plugins/ml/public/application/components/job_selector/job_selector.tsx b/x-pack/plugins/ml/public/application/components/job_selector/job_selector.tsx index 51dfe193f7ab0..a33530551a285 100644 --- a/x-pack/plugins/ml/public/application/components/job_selector/job_selector.tsx +++ b/x-pack/plugins/ml/public/application/components/job_selector/job_selector.tsx @@ -110,6 +110,7 @@ export function JobSelector({ dateFormatTz, singleSelection, timeseriesOnly }: J // Ensure JobSelectionBar gets updated when selection via globalState changes. useEffect(() => { setSelectedIds(mergeSelection(selectedJobIds, selectedGroups, singleSelection)); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [JSON.stringify([selectedJobIds, selectedGroups])]); function closeFlyout() { diff --git a/x-pack/plugins/ml/public/application/components/job_selector/job_selector_flyout.tsx b/x-pack/plugins/ml/public/application/components/job_selector/job_selector_flyout.tsx index 630bbe7e32ede..d686019125bbb 100644 --- a/x-pack/plugins/ml/public/application/components/job_selector/job_selector_flyout.tsx +++ b/x-pack/plugins/ml/public/application/components/job_selector/job_selector_flyout.tsx @@ -116,6 +116,7 @@ export const JobSelectorFlyoutContent: FC = ({ groups: groupSelection, time, }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [onSelectionConfirmed, newSelection, jobGroupsMaps, applyTimeRangeConfig]); function removeId(id: string) { @@ -156,6 +157,7 @@ export const JobSelectorFlyoutContent: FC = ({ // Fetch jobs list on flyout open useEffect(() => { fetchJobs(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); async function fetchJobs() { diff --git a/x-pack/plugins/ml/public/application/components/job_selector/use_job_selection.ts b/x-pack/plugins/ml/public/application/components/job_selector/use_job_selection.ts index fc0acc43b0a64..2af031f117e81 100644 --- a/x-pack/plugins/ml/public/application/components/job_selector/use_job_selection.ts +++ b/x-pack/plugins/ml/public/application/components/job_selector/use_job_selection.ts @@ -44,6 +44,7 @@ export const useJobSelection = (jobs: MlJobWithTimeRange[]) => { const invalidIds = useMemo(() => { return getInvalidJobIds(jobs, tmpIds); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [tmpIds]); const validIds = useMemo(() => { @@ -70,6 +71,7 @@ export const useJobSelection = (jobs: MlJobWithTimeRange[]) => { }) ); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [invalidIds]); useEffect(() => { @@ -89,6 +91,7 @@ export const useJobSelection = (jobs: MlJobWithTimeRange[]) => { // flyout closed without selection }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobs, validIds, setGlobalState, globalState?.ml]); return jobSelection; diff --git a/x-pack/plugins/ml/public/application/components/job_spaces_sync/job_spaces_sync_flyout.tsx b/x-pack/plugins/ml/public/application/components/job_spaces_sync/job_spaces_sync_flyout.tsx index a9f43f61ce7fd..ea1bac4b83972 100644 --- a/x-pack/plugins/ml/public/application/components/job_spaces_sync/job_spaces_sync_flyout.tsx +++ b/x-pack/plugins/ml/public/application/components/job_spaces_sync/job_spaces_sync_flyout.tsx @@ -61,6 +61,7 @@ export const JobSpacesSyncFlyout: FC = ({ onClose }) => { useEffect(() => { loadSyncList(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); async function sync() { diff --git a/x-pack/plugins/ml/public/application/components/jobs_awaiting_node_warning/new_job_awaiting_node_shared/new_job_awaiting_node_shared.tsx b/x-pack/plugins/ml/public/application/components/jobs_awaiting_node_warning/new_job_awaiting_node_shared/new_job_awaiting_node_shared.tsx index 866878d477e89..7c634cfed6682 100644 --- a/x-pack/plugins/ml/public/application/components/jobs_awaiting_node_warning/new_job_awaiting_node_shared/new_job_awaiting_node_shared.tsx +++ b/x-pack/plugins/ml/public/application/components/jobs_awaiting_node_warning/new_job_awaiting_node_shared/new_job_awaiting_node_shared.tsx @@ -52,6 +52,7 @@ const MLJobsAwaitingNodeWarning: FC = ({ jobIds }) => { // eslint-disable-next-line no-console console.error('Could not determine ML node information', error); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobIds]); const checkCloudInfo = useCallback(async () => { @@ -72,14 +73,17 @@ const MLJobsAwaitingNodeWarning: FC = ({ jobIds }) => { // eslint-disable-next-line no-console console.error('Could not determine cloud information', error); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [unassignedJobCount]); useEffect(() => { checkCloudInfo(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [unassignedJobCount]); useEffect(() => { checkNodes(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobIds]); if (unassignedJobCount === 0) { diff --git a/x-pack/plugins/ml/public/application/components/ml_embedded_map/ml_embedded_map.tsx b/x-pack/plugins/ml/public/application/components/ml_embedded_map/ml_embedded_map.tsx index 8d399e9234639..ae9dbac3c2d02 100644 --- a/x-pack/plugins/ml/public/application/components/ml_embedded_map/ml_embedded_map.tsx +++ b/x-pack/plugins/ml/public/application/components/ml_embedded_map/ml_embedded_map.tsx @@ -107,6 +107,7 @@ export function MlEmbeddedMapComponent({ setupEmbeddable(); // we want this effect to execute exactly once after the component mounts + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { diff --git a/x-pack/plugins/ml/public/application/components/ml_page/ml_page.tsx b/x-pack/plugins/ml/public/application/components/ml_page/ml_page.tsx index bd12a120420c2..4023cbb0562f8 100644 --- a/x-pack/plugins/ml/public/application/components/ml_page/ml_page.tsx +++ b/x-pack/plugins/ml/public/application/components/ml_page/ml_page.tsx @@ -54,6 +54,7 @@ export const MlPage: FC<{ pageDeps: PageDependencies }> = React.memo(({ pageDeps Object.values(routes) .map((routeFactory) => routeFactory(navigateToPath, basePath.get())) .filter((d) => !d.disabled), + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); diff --git a/x-pack/plugins/ml/public/application/components/ml_page/side_nav.tsx b/x-pack/plugins/ml/public/application/components/ml_page/side_nav.tsx index 055359395270e..b87a128c0c788 100644 --- a/x-pack/plugins/ml/public/application/components/ml_page/side_nav.tsx +++ b/x-pack/plugins/ml/public/application/components/ml_page/side_nav.tsx @@ -59,6 +59,7 @@ export function useSideNavItems(activeRoute: MlRoute | undefined) { await navigateToPath(path, false); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [pageState] ); diff --git a/x-pack/plugins/ml/public/application/components/ml_saved_objects_spaces_list/ml_saved_objects_spaces_list.tsx b/x-pack/plugins/ml/public/application/components/ml_saved_objects_spaces_list/ml_saved_objects_spaces_list.tsx index 1d795398d7d71..ff78f79b7604d 100644 --- a/x-pack/plugins/ml/public/application/components/ml_saved_objects_spaces_list/ml_saved_objects_spaces_list.tsx +++ b/x-pack/plugins/ml/public/application/components/ml_saved_objects_spaces_list/ml_saved_objects_spaces_list.tsx @@ -86,7 +86,9 @@ export const MLSavedObjectsSpacesList: FC = ({ }); } + // eslint-disable-next-line react-hooks/exhaustive-deps const LazySpaceList = useCallback(spacesApi.ui.components.getSpaceList, [spacesApi]); + // eslint-disable-next-line react-hooks/exhaustive-deps const LazyShareToSpaceFlyout = useCallback(spacesApi.ui.components.getShareToSpaceFlyout, [ spacesApi, ]); diff --git a/x-pack/plugins/ml/public/application/components/model_snapshots/edit_model_snapshot_flyout/edit_model_snapshot_flyout.tsx b/x-pack/plugins/ml/public/application/components/model_snapshots/edit_model_snapshot_flyout/edit_model_snapshot_flyout.tsx index 1b9fb52587bda..b3952d700e93c 100644 --- a/x-pack/plugins/ml/public/application/components/model_snapshots/edit_model_snapshot_flyout/edit_model_snapshot_flyout.tsx +++ b/x-pack/plugins/ml/public/application/components/model_snapshots/edit_model_snapshot_flyout/edit_model_snapshot_flyout.tsx @@ -49,6 +49,7 @@ export const EditModelSnapshotFlyout: FC = ({ snapshot, job, closeFlyout useEffect(() => { setIsCurrentSnapshot(snapshot.snapshot_id === job.model_snapshot_id); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [snapshot]); const updateSnapshot = useCallback(async () => { @@ -65,6 +66,7 @@ export const EditModelSnapshotFlyout: FC = ({ snapshot, job, closeFlyout }), }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [retain, description, snapshot]); const deleteSnapshot = useCallback(async () => { @@ -79,6 +81,7 @@ export const EditModelSnapshotFlyout: FC = ({ snapshot, job, closeFlyout }), }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [snapshot]); function closeWithReload() { diff --git a/x-pack/plugins/ml/public/application/components/model_snapshots/model_snapshots_table.tsx b/x-pack/plugins/ml/public/application/components/model_snapshots/model_snapshots_table.tsx index 6e682979fa6b3..cfd586b3a3396 100644 --- a/x-pack/plugins/ml/public/application/components/model_snapshots/model_snapshots_table.tsx +++ b/x-pack/plugins/ml/public/application/components/model_snapshots/model_snapshots_table.tsx @@ -57,6 +57,7 @@ export const ModelSnapshotTable: FC = ({ job, refreshJobList }) => { return () => { isMounted.current = false; }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); async function loadModelSnapshots() { @@ -115,6 +116,7 @@ export const ModelSnapshotTable: FC = ({ job, refreshJobList }) => { if (reload) { loadModelSnapshots(); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const closeRevertFlyout = useCallback(() => { @@ -125,6 +127,7 @@ export const ModelSnapshotTable: FC = ({ job, refreshJobList }) => { loadModelSnapshots(); // wait half a second before refreshing the jobs list setTimeout(refreshJobList, 500); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const columns: Array> = [ diff --git a/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/create_calendar.tsx b/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/create_calendar.tsx index 69e1bfe8a062a..5bb0eb7ad2db7 100644 --- a/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/create_calendar.tsx +++ b/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/create_calendar.tsx @@ -74,6 +74,7 @@ export const CreateCalendar: FC = ({ } } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [calendarEvents] ); @@ -90,6 +91,7 @@ export const CreateCalendar: FC = ({ setCalendarEvents([...calendarEvents]); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [calendarEvents] ); @@ -106,6 +108,7 @@ export const CreateCalendar: FC = ({ setCalendarEvents([...calendarEvents]); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [calendarEvents] ); @@ -117,6 +120,7 @@ export const CreateCalendar: FC = ({ setCalendarEvents([...calendarEvents]); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [calendarEvents] ); @@ -128,6 +132,7 @@ export const CreateCalendar: FC = ({ setCalendarEvents(ce); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [calendarEvents] ); diff --git a/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/revert_model_snapshot_flyout.tsx b/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/revert_model_snapshot_flyout.tsx index 20a5439aeb8ea..e6a76b4539a9d 100644 --- a/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/revert_model_snapshot_flyout.tsx +++ b/x-pack/plugins/ml/public/application/components/model_snapshots/revert_model_snapshot_flyout/revert_model_snapshot_flyout.tsx @@ -78,6 +78,7 @@ export const RevertModelSnapshotFlyout: FC = ({ useEffect(() => { createChartData(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [currentSnapshot]); useEffect(() => { @@ -109,6 +110,7 @@ export const RevertModelSnapshotFlyout: FC = ({ setAnomalies(anomalyData[0]); } setChartReady(true); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [job]); function showRevertModal() { diff --git a/x-pack/plugins/ml/public/application/components/navigation_menu/date_picker_wrapper/date_picker_wrapper.tsx b/x-pack/plugins/ml/public/application/components/navigation_menu/date_picker_wrapper/date_picker_wrapper.tsx index 3cd74d2a53fe7..75cb787abadc4 100644 --- a/x-pack/plugins/ml/public/application/components/navigation_menu/date_picker_wrapper/date_picker_wrapper.tsx +++ b/x-pack/plugins/ml/public/application/components/navigation_menu/date_picker_wrapper/date_picker_wrapper.tsx @@ -92,6 +92,7 @@ export const DatePickerWrapper: FC = () => { }); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [globalState?.time?.from, globalState?.time?.to, globalState?.time?.ts] ); @@ -104,9 +105,11 @@ export const DatePickerWrapper: FC = () => { }); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [globalState?.refreshInterval] ); + // eslint-disable-next-line react-hooks/exhaustive-deps const setRefreshInterval = useCallback( debounce((refreshIntervalUpdate: RefreshInterval) => { setGlobalState('refreshInterval', refreshIntervalUpdate, true); @@ -133,6 +136,7 @@ export const DatePickerWrapper: FC = () => { const value = resultInterval.value; return { value, pause }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [JSON.stringify(globalState?.refreshInterval), timeFilterRefreshInterval]); useEffect( @@ -177,8 +181,11 @@ export const DatePickerWrapper: FC = () => { { toastLifeTimeMs: 30000 } ); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [ + // eslint-disable-next-line react-hooks/exhaustive-deps JSON.stringify(refreshInterval), + // eslint-disable-next-line react-hooks/exhaustive-deps JSON.stringify(globalState?.refreshInterval), setRefreshInterval, ] @@ -221,6 +228,7 @@ export const DatePickerWrapper: FC = () => { return function cleanup() { subscriptions.unsubscribe(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const updateTimeFilter = useCallback( @@ -232,6 +240,7 @@ export const DatePickerWrapper: FC = () => { ...(start === 'now' || end === 'now' ? { ts: Date.now() } : {}), }); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [setGlobalState] ); diff --git a/x-pack/plugins/ml/public/application/components/page_header/page_header.tsx b/x-pack/plugins/ml/public/application/components/page_header/page_header.tsx index 0ae998db158fe..0423e718047c1 100644 --- a/x-pack/plugins/ml/public/application/components/page_header/page_header.tsx +++ b/x-pack/plugins/ml/public/application/components/page_header/page_header.tsx @@ -21,6 +21,7 @@ export const MlPageHeader: FC = ({ children }) => { return () => { setIsHeaderMounted(false); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return {children}; diff --git a/x-pack/plugins/ml/public/application/components/saved_objects_warning/saved_objects_warning.tsx b/x-pack/plugins/ml/public/application/components/saved_objects_warning/saved_objects_warning.tsx index 47d94c03e9ccb..a659f5c87bbdb 100644 --- a/x-pack/plugins/ml/public/application/components/saved_objects_warning/saved_objects_warning.tsx +++ b/x-pack/plugins/ml/public/application/components/saved_objects_warning/saved_objects_warning.tsx @@ -47,6 +47,7 @@ export const SavedObjectsWarning: FC = ({ } catch (error) { console.log('Saved object synchronization check could not be performed.'); // eslint-disable-line no-console } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [showSyncFlyout, setShowWarning]); useEffect( @@ -70,6 +71,7 @@ export const SavedObjectsWarning: FC = ({ if (typeof onCloseFlyout === 'function') { onCloseFlyout(); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [checkStatus, onCloseFlyout, setShowSyncFlyout]); useEffect( diff --git a/x-pack/plugins/ml/public/application/components/scatterplot_matrix/scatterplot_matrix.tsx b/x-pack/plugins/ml/public/application/components/scatterplot_matrix/scatterplot_matrix.tsx index e11de5fea47d3..ee9cf024a6749 100644 --- a/x-pack/plugins/ml/public/application/components/scatterplot_matrix/scatterplot_matrix.tsx +++ b/x-pack/plugins/ml/public/application/components/scatterplot_matrix/scatterplot_matrix.tsx @@ -257,6 +257,7 @@ export const ScatterplotMatrix: FC = ({ options.didCancel = true; }; // stringify the fields array and search, otherwise the comparator will trigger on new but identical instances. + // eslint-disable-next-line react-hooks/exhaustive-deps }, [fetchSize, JSON.stringify({ fields, searchQuery }), index, randomizeQuery, resultsField]); const vegaSpec = useMemo(() => { @@ -275,6 +276,7 @@ export const ScatterplotMatrix: FC = ({ legendType, dynamicSize ); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [resultsField, splom, color, legendType, dynamicSize]); return ( diff --git a/x-pack/plugins/ml/public/application/components/scatterplot_matrix/use_scatterplot_field_options.ts b/x-pack/plugins/ml/public/application/components/scatterplot_matrix/use_scatterplot_field_options.ts index fe1a649cdeb06..7615c9cd2020c 100644 --- a/x-pack/plugins/ml/public/application/components/scatterplot_matrix/use_scatterplot_field_options.ts +++ b/x-pack/plugins/ml/public/application/components/scatterplot_matrix/use_scatterplot_field_options.ts @@ -47,5 +47,6 @@ export const useScatterplotFieldOptions = ( return Array.isArray(excludes) && excludes.length > 0 ? fields.filter((f) => !excludes.includes(f)) : fields; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [indexPattern, includes, excludes]); }; diff --git a/x-pack/plugins/ml/public/application/components/vega_chart/vega_chart_view.tsx b/x-pack/plugins/ml/public/application/components/vega_chart/vega_chart_view.tsx index 93276067f9663..011a3840563db 100644 --- a/x-pack/plugins/ml/public/application/components/vega_chart/vega_chart_view.tsx +++ b/x-pack/plugins/ml/public/application/components/vega_chart/vega_chart_view.tsx @@ -37,6 +37,7 @@ export const VegaChartView: FC = ({ vegaSpec }) => { .initialize(`#${htmlId}`); view.runAsync(); // evaluate and render the view + // eslint-disable-next-line react-hooks/exhaustive-deps }, [vegaSpec]); return
; diff --git a/x-pack/plugins/ml/public/application/contexts/kibana/use_cases_modal.ts b/x-pack/plugins/ml/public/application/contexts/kibana/use_cases_modal.ts index 206d6ddb806ae..0d7811822593e 100644 --- a/x-pack/plugins/ml/public/application/contexts/kibana/use_cases_modal.ts +++ b/x-pack/plugins/ml/public/application/contexts/kibana/use_cases_modal.ts @@ -48,6 +48,7 @@ export const useCasesModal = ( ], }); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [embeddableType] ); }; diff --git a/x-pack/plugins/ml/public/application/contexts/kibana/use_create_url.ts b/x-pack/plugins/ml/public/application/contexts/kibana/use_create_url.ts index 2f0165fffd293..cbd35193c8d94 100644 --- a/x-pack/plugins/ml/public/application/contexts/kibana/use_create_url.ts +++ b/x-pack/plugins/ml/public/application/contexts/kibana/use_create_url.ts @@ -38,6 +38,7 @@ export const useMlLink = (params: MlLocatorParams, getUrlParams?: LocatorGetUrlP return () => { isCancelled = true; }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [params, getUrlParams]); return href; @@ -71,6 +72,7 @@ export const useCreateAndNavigateToMlLink = ( const url = await mlLocator.getUrl({ page: _page, pageState }); await navigateToUrl(url); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [mlLocator, navigateToUrl] ); diff --git a/x-pack/plugins/ml/public/application/contexts/kibana/use_navigate_to_path.ts b/x-pack/plugins/ml/public/application/contexts/kibana/use_navigate_to_path.ts index 00050803b97c6..bd2d3303b8fd8 100644 --- a/x-pack/plugins/ml/public/application/contexts/kibana/use_navigate_to_path.ts +++ b/x-pack/plugins/ml/public/application/contexts/kibana/use_navigate_to_path.ts @@ -36,6 +36,7 @@ export const useNavigateToPath = () => { }); await navigateToUrl(url); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [location] ); }; diff --git a/x-pack/plugins/ml/public/application/contexts/kibana/use_timefilter.ts b/x-pack/plugins/ml/public/application/contexts/kibana/use_timefilter.ts index 4550f0fd2aa1f..cc4cb51169a32 100644 --- a/x-pack/plugins/ml/public/application/contexts/kibana/use_timefilter.ts +++ b/x-pack/plugins/ml/public/application/contexts/kibana/use_timefilter.ts @@ -34,6 +34,7 @@ export const useTimefilter = ({ } else if (autoRefreshSelector === false) { timefilter.disableAutoRefreshSelector(); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [timeRangeSelector, autoRefreshSelector]); return timefilter; diff --git a/x-pack/plugins/ml/public/application/contexts/ml/use_storage.ts b/x-pack/plugins/ml/public/application/contexts/ml/use_storage.ts index e69df2c026795..d41dfedfa32ee 100644 --- a/x-pack/plugins/ml/public/application/contexts/ml/use_storage.ts +++ b/x-pack/plugins/ml/public/application/contexts/ml/use_storage.ts @@ -28,6 +28,7 @@ export function useStorage(key: MlStorageKey, initValue?: T): [T, (value: T) } catch (e) { throw new Error('Unable to update storage with provided value'); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return [val, setStorage]; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/common/analytics.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/common/analytics.ts index bb081e673badf..4638d3824ad61 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/common/analytics.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/common/analytics.ts @@ -270,6 +270,7 @@ export const useRefreshAnalyticsList = ( return () => { subscriptions.map((sub) => sub.unsubscribe()); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [callback.onRefresh]); return { diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/common/use_results_view_config.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/common/use_results_view_config.ts index df740df7fca3c..9f739bfb3d58c 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/common/use_results_view_config.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/common/use_results_view_config.ts @@ -148,6 +148,7 @@ export const useResultsViewConfig = (jobId: string) => { setIsLoadingJobConfig(false); } })(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return { diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/advanced_step/advanced_step_form.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/advanced_step/advanced_step_form.tsx index 379861f133a20..a566aa685b7bc 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/advanced_step/advanced_step_form.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/advanced_step/advanced_step_form.tsx @@ -227,6 +227,7 @@ export const AdvancedStepForm: FC = ({ setFetchingAdvancedParamErrors(false); setAdvancedParamErrors(paramErrors); })(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ alpha, downsampleFactor, diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx index f4a9eb0d5c0a8..85157569e64fb 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx @@ -128,6 +128,7 @@ export const AnalysisFieldsTable: FC<{ }); } setMinimumFieldsRequiredMessage(undefined); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [tableItems]); useEffect(() => { diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx index 758fd01a133c6..724aed7b08294 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/configuration_step_form.tsx @@ -335,6 +335,7 @@ export const ConfigurationStepForm: FC = ({ useEffect(() => { setFormState({ sourceIndex: currentDataView.title }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const indexPatternFieldsTableItems = useMemo(() => { @@ -346,12 +347,14 @@ export const ConfigurationStepForm: FC = ({ })); } return []; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [`${indexData?.indexPatternFields}`]); useEffect(() => { if (typeof savedSearchQueryStr === 'string') { setFormState({ jobConfigQuery: savedSearchQuery, jobConfigQueryString: savedSearchQueryStr }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [JSON.stringify(savedSearchQuery), savedSearchQueryStr]); useEffect(() => { @@ -365,6 +368,7 @@ export const ConfigurationStepForm: FC = ({ loadDepVarOptions(form, runtimeOptions); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobType]); const handleRuntimeUpdate = useCallback(async () => { @@ -476,10 +480,12 @@ export const ConfigurationStepForm: FC = ({ } } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [JSON.stringify(runtimeMappings)]); useEffect(() => { handleRuntimeUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [JSON.stringify(runtimeMappings)]); useEffect(() => { @@ -490,6 +496,7 @@ export const ConfigurationStepForm: FC = ({ return () => { debouncedGetExplainData.cancel(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobType, dependentVariable, trainingPercent, JSON.stringify(includes), jobConfigQueryString]); const scatterplotMatrixProps = useMemo( @@ -504,6 +511,7 @@ export const ConfigurationStepForm: FC = ({ runtimeMappings, indexPattern: currentDataView, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [ currentDataView.title, dependentVariable, @@ -523,6 +531,7 @@ export const ConfigurationStepForm: FC = ({ (jobType === ANALYSIS_CONFIG_TYPE.OUTLIER_DETECTION || (isJobTypeWithDepVar && !dependentVariableEmpty)) && scatterplotMatrixProps.fields.length > 1, + // eslint-disable-next-line react-hooks/exhaustive-deps [dependentVariableEmpty, jobType, scatterplotMatrixProps.fields.length] ); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/supported_fields_message.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/supported_fields_message.tsx index 666f990aa4aa1..9e6d2ee0ad863 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/supported_fields_message.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/supported_fields_message.tsx @@ -92,6 +92,7 @@ export const SupportedFieldsMessage: FC = ({ jobType }) => { if (jobType !== undefined) { validateFields(); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobType]); if (sourceIndexContainsSupportedFields === true) return null; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/use_saved_search.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/use_saved_search.ts index 0a75c6467f9d0..37526b6e66ff8 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/use_saved_search.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/use_saved_search.ts @@ -85,6 +85,7 @@ export function useSavedSearch() { useEffect(() => { getQueryData(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return { diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx index 8a74237a28144..56203e4784227 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_analytics_advanced_editor/create_analytics_advanced_editor.tsx @@ -52,6 +52,7 @@ export const CreateAnalyticsAdvancedEditor: FC = (prop ); } }, 400), + // eslint-disable-next-line react-hooks/exhaustive-deps [jobId] ); @@ -75,6 +76,7 @@ export const CreateAnalyticsAdvancedEditor: FC = (prop return () => { debouncedJobIdCheck.cancel(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobId]); return ( diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/create_step.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/create_step.tsx index 19b1570d1cf63..c32530658e6f8 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/create_step.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/create_step.tsx @@ -58,6 +58,7 @@ export const CreateStep: FC = ({ actions, state, step }) => { if (canCreateDataView === false) { setFormState({ createIndexPattern: false }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [capabilities]); if (step !== ANALYTICS_STEPS.CREATE) return null; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step_footer/create_step_footer.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step_footer/create_step_footer.tsx index f8016bccb1832..4323e759298e9 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step_footer/create_step_footer.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step_footer/create_step_footer.tsx @@ -114,6 +114,7 @@ export const CreateStepFooter: FC = ({ jobId, jobType, showProgress }) => }, PROGRESS_REFRESH_INTERVAL_MS); return () => clearInterval(interval); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [initialized]); return ( diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/details_step/details_step_form.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/details_step/details_step_form.tsx index 6e702c8ab6d1d..a033137413ef4 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/details_step/details_step_form.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/details_step/details_step_form.tsx @@ -99,6 +99,7 @@ export const DetailsStepForm: FC = ({ ); } }, 400), + // eslint-disable-next-line react-hooks/exhaustive-deps [jobId] ); @@ -112,6 +113,7 @@ export const DetailsStepForm: FC = ({ return () => { debouncedJobIdCheck.cancel(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobId]); useEffect(() => { @@ -128,6 +130,7 @@ export const DetailsStepForm: FC = ({ return () => { debouncedIndexCheck.cancel(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [destinationIndex]); useEffect(() => { @@ -136,6 +139,7 @@ export const DetailsStepForm: FC = ({ } else if (destIndexSameAsId === false && hasSwitchedToEditor === false) { setFormState({ destinationIndex: '' }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [destIndexSameAsId, jobId]); return ( diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/runtime_mappings/runtime_mappings.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/runtime_mappings/runtime_mappings.tsx index 962a06410ca50..0d30b6f572a64 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/runtime_mappings/runtime_mappings.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/runtime_mappings/runtime_mappings.tsx @@ -144,6 +144,7 @@ export const RuntimeMappings: FC = ({ actions, state }) => { runtimeMappings: combinedRuntimeMappings, }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return ( diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/validation_step/validation_step_wrapper.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/validation_step/validation_step_wrapper.tsx index 25030801d8580..d5b2ba8251ad4 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/validation_step/validation_step_wrapper.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/validation_step/validation_step_wrapper.tsx @@ -91,6 +91,7 @@ export const ValidationStepWrapper: FC = ({ debouncedValidationChecks(); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [ showValidationStep, dependentVariable, diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts index a865417ff123d..e48358fdb6a3e 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts @@ -125,6 +125,7 @@ export const useIndexData = ( } fetchDataGridSampleDocuments(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); // To be used for data grid column selection @@ -162,6 +163,7 @@ export const useIndexData = ( useEffect(() => { resetPagination(); // custom comparison + // eslint-disable-next-line react-hooks/exhaustive-deps }, [JSON.stringify(query)]); useEffect(() => { @@ -215,14 +217,17 @@ export const useIndexData = ( fetchIndexData(); } // custom comparison + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ indexPattern.title, indexPatternFields, + // eslint-disable-next-line react-hooks/exhaustive-deps JSON.stringify([query, pagination, sortingColumns, combinedRuntimeMappings]), ]); const dataLoader = useMemo( () => new DataLoader(indexPattern, toastNotifications), + // eslint-disable-next-line react-hooks/exhaustive-deps [indexPattern] ); @@ -250,9 +255,11 @@ export const useIndexData = ( fetchColumnChartsData(query); } // custom comparison + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ dataGrid.chartsVisible, indexPattern.title, + // eslint-disable-next-line react-hooks/exhaustive-deps JSON.stringify([query, dataGrid.visibleColumns, runtimeMappings]), ]); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/page.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/page.tsx index 1c17e073ba0a7..bd5f7d3e6d9f2 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/page.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/page.tsx @@ -81,6 +81,7 @@ export const Page: FC = ({ jobId }) => { } })(); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { @@ -88,6 +89,7 @@ export const Page: FC = ({ jobId }) => { activatedSteps.splice(currentStep, 1, true); setActivatedSteps(activatedSteps); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [currentStep]); const analyticsWizardSteps = [ diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/evaluate_panel.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/evaluate_panel.tsx index 8ba780a3e512a..e9a7cbf2c7c27 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/evaluate_panel.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/evaluate_panel.tsx @@ -193,6 +193,7 @@ export const EvaluatePanel: FC = ({ jobConfig, jobStatus, se }, }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [rowIndex, columnId, setCellProps]); let cellContent = columnId === ACTUAL_CLASS_ID ? cellValue : accuracy; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/use_confusion_matrix.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/use_confusion_matrix.ts index c51f5bf3e9665..aaa357363253f 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/use_confusion_matrix.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/use_confusion_matrix.ts @@ -135,6 +135,7 @@ export const useConfusionMatrix = ( } loadConfusionMatrixData(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [JSON.stringify([jobConfig, searchQuery])]); return { diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/use_roc_curve.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/use_roc_curve.ts index f83f9f9f31e0f..56e034eec3cc8 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/use_roc_curve.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/use_roc_curve.ts @@ -121,6 +121,7 @@ export const useRocCurve = ( } loadRocCurveData(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [JSON.stringify([jobConfig, searchQuery, columns])]); return { diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section_analytics.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section_analytics.tsx index 702536a3d9cc3..9dfa5a84f530c 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section_analytics.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section_analytics.tsx @@ -110,6 +110,7 @@ export const ExpandableSectionAnalytics: FC = ( useEffect(() => { fetchStats(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobId]); const analyticsSectionHeaderItems = getAnalyticsSectionHeaderItems(expandedRowItem); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_query_bar/exploration_query_bar.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_query_bar/exploration_query_bar.tsx index c186903686015..79e7403cd3513 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_query_bar/exploration_query_bar.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_query_bar/exploration_query_bar.tsx @@ -84,6 +84,7 @@ export const ExplorationQueryBar: FC = ({ setIdToSelectedMap({ [filterKeyInEffect]: true }); } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); /** @@ -120,6 +121,7 @@ export const ExplorationQueryBar: FC = ({ } catch (e) { setErrorMessage({ query: query.query as string, message: e.message }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [query.query]); const searchSubmitHandler = (q: Query, filtering?: boolean) => { diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts index 593ef5465d196..b52c06905792c 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts @@ -84,11 +84,13 @@ export const useExplorationResults = ( options.didCancel = true; }; // custom comparison + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobConfig && jobConfig.id, dataGrid.pagination, searchQuery, dataGrid.sortingColumns]); const dataLoader = useMemo( () => indexPattern !== undefined ? new DataLoader(indexPattern, toastNotifications) : undefined, + // eslint-disable-next-line react-hooks/exhaustive-deps [indexPattern] ); @@ -116,9 +118,11 @@ export const useExplorationResults = ( fetchColumnChartsData(); } // custom comparison + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ dataGrid.chartsVisible, jobConfig?.dest.index, + // eslint-disable-next-line react-hooks/exhaustive-deps JSON.stringify([searchQuery, dataGrid.visibleColumns]), ]); const predictionFieldName = useMemo(() => { @@ -163,10 +167,12 @@ export const useExplorationResults = ( text: error, }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [mlApiServices, jobConfig]); useEffect(() => { getAnalyticsBaseline(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobConfig]); const resultsField = jobConfig?.dest.results_field ?? DEFAULT_RESULTS_FIELD; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/feature_importance/use_classification_path_data.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/feature_importance/use_classification_path_data.tsx index a956ffa934862..ad9f0b3d0bb71 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/feature_importance/use_classification_path_data.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/feature_importance/use_classification_path_data.tsx @@ -94,6 +94,7 @@ export const useDecisionPathData = ({ predictedProbability, }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [baseline, featureImportance, predictedValue]); return { decisionPathData }; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/job_config_error_callout/job_config_error_callout.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/job_config_error_callout/job_config_error_callout.tsx index 440bab4b27af5..9fc517d293e7f 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/job_config_error_callout/job_config_error_callout.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/job_config_error_callout/job_config_error_callout.tsx @@ -50,6 +50,7 @@ export const JobConfigErrorCallout: FC = ({ getUrlForApp('management', { path: 'kibana/indexPatterns', }), + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/use_outlier_data.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/use_outlier_data.ts index 920023c23a2bd..f0814f8e9b45c 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/use_outlier_data.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/use_outlier_data.ts @@ -62,6 +62,7 @@ export const useOutlierData = ( } return newColumns; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobConfig, indexPattern]); const dataGrid = useExplorationDataGrid( @@ -77,6 +78,7 @@ export const useOutlierData = ( if (jobConfig !== undefined) { dataGrid.setSortingColumns([{ id: getOutlierScoreFieldName(jobConfig), direction: 'desc' }]); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobConfig && jobConfig.id]); // The pattern using `didCancel` allows us to abort out of date remote request. @@ -89,6 +91,7 @@ export const useOutlierData = ( options.didCancel = true; }; // custom comparison + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobConfig && jobConfig.id, dataGrid.pagination, searchQuery, dataGrid.sortingColumns]); const dataLoader = useMemo( @@ -123,12 +126,14 @@ export const useOutlierData = ( fetchColumnChartsData(); } // custom comparison + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ dataGrid.chartsVisible, jobConfig?.dest.index, // Only trigger when search or the visible columns changes. // We're only interested in the visible columns but not their order, that's // why we sort for comparison (and copying it via spread to avoid sort in place). + // eslint-disable-next-line react-hooks/exhaustive-deps JSON.stringify([searchQuery, [...dataGrid.visibleColumns].sort()]), ]); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/evaluate_panel.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/evaluate_panel.tsx index 1249b736960d8..4a10d0e3cd056 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/evaluate_panel.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/evaluate_panel.tsx @@ -218,6 +218,7 @@ export const EvaluatePanel: FC = ({ jobConfig, jobStatus, searchQuery }) setIsTrainingFilter(isTraining); loadData(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [JSON.stringify(searchQuery)]); return ( diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/page.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/page.tsx index 633afaa0c7b4a..b8ed840397675 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/page.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/page.tsx @@ -57,6 +57,7 @@ export const Page: FC<{ useEffect(function checkJobs() { checkJobsExist(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect( @@ -70,6 +71,7 @@ export const Page: FC<{ }); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [analyticsId?.job_id, analyticsId?.model_id] ); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_clone/use_clone_action.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_clone/use_clone_action.tsx index 7b1c1da9ac8a4..825a71934e786 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_clone/use_clone_action.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_clone/use_clone_action.tsx @@ -21,6 +21,7 @@ export const useCloneAction = (canCreateDataFrameAnalytics: boolean) => { const clickHandler = useCallback((item: DataFrameAnalyticsListRow) => { navigateToWizardWithClonedJob(item); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const action: DataFrameAnalyticsListAction = useMemo( @@ -33,6 +34,7 @@ export const useCloneAction = (canCreateDataFrameAnalytics: boolean) => { onClick: clickHandler, 'data-test-subj': 'mlAnalyticsJobCloneButton', }), + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_delete/use_delete_action.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_delete/use_delete_action.tsx index fe87521f028a3..4d1565c1769f3 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_delete/use_delete_action.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_delete/use_delete_action.tsx @@ -117,6 +117,7 @@ export const useDeleteAction = (canDeleteDataFrameAnalytics: boolean) => { checkIndexPatternExists(); // Check if an user has permission to delete the index & data view checkUserIndexPermission(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [isModalVisible]); const closeModal = () => setModalVisible(false); @@ -168,6 +169,7 @@ export const useDeleteAction = (canDeleteDataFrameAnalytics: boolean) => { onClick: (i: DataFrameAnalyticsListRow) => openDeleteJobCheckModal(i), 'data-test-subj': 'mlAnalyticsJobDeleteButton', }), + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_map/use_map_action.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_map/use_map_action.tsx index 6fdcc047bce9d..54161fa8c801a 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_map/use_map_action.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_map/use_map_action.tsx @@ -37,6 +37,7 @@ export const useMapAction = () => { await navigateToPath(path, false); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [globalState] ); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_start/use_start_action.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_start/use_start_action.tsx index 8702a3470306b..56e648a77a956 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_start/use_start_action.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_start/use_start_action.tsx @@ -67,6 +67,7 @@ export const useStartAction = (canStartStopDataFrameAnalytics: boolean) => { onClick: openModal, 'data-test-subj': 'mlAnalyticsJobStartButton', }), + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_stop/use_stop_action.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_stop/use_stop_action.tsx index 04d4ddb387e4c..2a5c9e560a6d8 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_stop/use_stop_action.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_stop/use_stop_action.tsx @@ -46,6 +46,7 @@ export const useStopAction = (canStartStopDataFrameAnalytics: boolean) => { } } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [stopAnalytics] ); @@ -61,6 +62,7 @@ export const useStopAction = (canStartStopDataFrameAnalytics: boolean) => { onClick: clickHandler, 'data-test-subj': 'mlAnalyticsJobStopButton', }), + // eslint-disable-next-line react-hooks/exhaustive-deps [clickHandler] ); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_view/use_view_action.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_view/use_view_action.tsx index 67af4f567e0f6..410f59ebaa098 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_view/use_view_action.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_view/use_view_action.tsx @@ -34,6 +34,7 @@ export const useViewAction = () => { const clickHandler = useCallback((item: DataFrameAnalyticsListRow) => { const analysisType = getAnalysisType(item.config.analysis) as DataFrameAnalysisConfigType; redirectToTab(item.id, analysisType); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const action: DataFrameAnalyticsListAction = useMemo( diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/analytics_list.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/analytics_list.tsx index 64be320648551..f9d4f08d649e4 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/analytics_list.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/analytics_list.tsx @@ -159,8 +159,10 @@ export const DataFrameAnalyticsList: FC = ({ useEffect(() => { filterList(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [searchQueryText]); + // eslint-disable-next-line react-hooks/exhaustive-deps const getAnalyticsCallback = useCallback(() => getAnalytics(true), []); // Subscribe to the refresh observable to trigger reloading the analytics list. @@ -173,6 +175,7 @@ export const DataFrameAnalyticsList: FC = ({ function updateOnTimerRefresh() { getAnalyticsCallback(); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [refreshObs] ); @@ -191,6 +194,7 @@ export const DataFrameAnalyticsList: FC = ({ const navigateToSourceSelection = useCallback(async () => { await navigateToPath(ML_PAGES.DATA_FRAME_ANALYTICS_SOURCE_SELECTION); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const handleSearchOnChange: EuiSearchBarProps['onChange'] = (search) => { diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row.tsx index 2d072d1aecc1f..cbdb9dd6df971 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row.tsx @@ -159,6 +159,7 @@ export const ExpandedRow: FC = ({ item }) => { if (jobIsCompleted && isRegressionJob) { loadData(); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobIsCompleted]); const stateValues: any = { ...item.stats }; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_messages_pane.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_messages_pane.tsx index 7b90648967f39..f74feda63ce6e 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_messages_pane.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_messages_pane.tsx @@ -50,10 +50,12 @@ export const ExpandedRowMessagesPane: FC = ({ analyticsId, dataTestSubj } }) ); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { getMessages(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useRefreshAnalyticsList({ onRefresh: getMessages }); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/use_refresh_interval.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/use_refresh_interval.ts index 0f236984f587c..b5f2a72295528 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/use_refresh_interval.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/use_refresh_interval.ts @@ -85,5 +85,6 @@ export const useRefreshInterval = ( refreshIntervalSubscription.unsubscribe(); clearRefreshInterval(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); // [] as comparator makes sure this only runs once }; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/components/analytics_selector/analytics_id_selector.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/components/analytics_selector/analytics_id_selector.tsx index 544815ee7e4c5..15836fb276a46 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/components/analytics_selector/analytics_id_selector.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/components/analytics_selector/analytics_id_selector.tsx @@ -178,6 +178,7 @@ export function AnalyticsIdSelector({ if (jobsOnly === false) { fetchAnalyticsModels(); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const applySelection = useCallback(() => { @@ -185,6 +186,7 @@ export function AnalyticsIdSelector({ setAnalyticsId(selected); } closeFlyout(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [selected?.model_id, selected?.job_id]); const pagination = { diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/components/controls.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/components/controls.tsx index 5df043792a7a5..dc8584ac9d1c1 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/components/controls.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/components/controls.tsx @@ -130,10 +130,12 @@ export const Controls: FC = React.memo( }) ); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [nodeLabel]); const onCloneJobClick = useCallback(async () => { navigateToWizardWithClonedJob({ config: details[nodeId], stats: details[nodeId]?.stats }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [nodeId]); const onActionsButtonClick = () => { @@ -177,6 +179,7 @@ export const Controls: FC = React.memo( setShowFlyout(false); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [isModalVisible, deleteItem, didUntag] ); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/components/cytoscape.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/components/cytoscape.tsx index 16d312f44b863..24f7b9035d62e 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/components/cytoscape.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/components/cytoscape.tsx @@ -108,6 +108,7 @@ export function Cytoscape({ cy.removeListener('data', undefined, dataHandler as cytoscape.EventHandler); } }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [cy, elements, height, width]); // Trigger a custom "data" event when data changes @@ -122,6 +123,7 @@ export function Cytoscape({ cy.trigger('data'); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [cy, elements]); // Reset the graph to original zoom and pan diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/job_map.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/job_map.tsx index a2c51463cdc6e..8a1f1cdc9501b 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/job_map.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/job_map.tsx @@ -110,18 +110,21 @@ export const JobMap: FC = ({ analyticsId, modelId, forceRefresh }) => { useEffect(() => { fetchAndSetElementsWrapper({ analyticsId, modelId }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [analyticsId, modelId]); useEffect(() => { if (forceRefresh === true) { fetchAndSetElementsWrapper({ analyticsId, modelId }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [forceRefresh]); useEffect(() => { if (message !== undefined) { notifications.toasts.add(message); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [message]); useEffect( @@ -129,6 +132,7 @@ export const JobMap: FC = ({ analyticsId, modelId, forceRefresh }) => { if (!refresh) return; fetchAndSetElementsWrapper({ analyticsId, modelId }); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [refresh] ); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/page.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/page.tsx index c2db3e5958151..084897cf61659 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/page.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/page.tsx @@ -69,6 +69,7 @@ export const Page: FC = () => { useEffect(function checkJobs() { checkJobsExist(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const getEmptyState = () => { diff --git a/x-pack/plugins/ml/public/application/datavisualizer/file_based/file_datavisualizer.tsx b/x-pack/plugins/ml/public/application/datavisualizer/file_based/file_datavisualizer.tsx index 9fcf0df33a0af..c849b921546ba 100644 --- a/x-pack/plugins/ml/public/application/datavisualizer/file_based/file_datavisualizer.tsx +++ b/x-pack/plugins/ml/public/application/datavisualizer/file_based/file_datavisualizer.tsx @@ -94,6 +94,7 @@ export const FileDataVisualizerPage: FC = () => { }, ], ], + // eslint-disable-next-line react-hooks/exhaustive-deps [mlLocator] ); @@ -103,6 +104,7 @@ export const FileDataVisualizerPage: FC = () => { const { getFileDataVisualizerComponent } = dataVisualizer; getFileDataVisualizerComponent().then(setFileDataVisualizer); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return ( diff --git a/x-pack/plugins/ml/public/application/datavisualizer/index_based/index_data_visualizer.tsx b/x-pack/plugins/ml/public/application/datavisualizer/index_based/index_data_visualizer.tsx index ae5c7c9948f18..90d0763aecda8 100644 --- a/x-pack/plugins/ml/public/application/datavisualizer/index_based/index_data_visualizer.tsx +++ b/x-pack/plugins/ml/public/application/datavisualizer/index_based/index_data_visualizer.tsx @@ -56,6 +56,7 @@ export const IndexDataVisualizerPage: FC = () => { const { getIndexDataVisualizerComponent } = dataVisualizer; getIndexDataVisualizerComponent().then(setIndexDataVisualizer); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const getAsyncMLCards = async ({ @@ -178,6 +179,7 @@ export const IndexDataVisualizerPage: FC = () => { const getAdditionalLinks: GetAdditionalLinks = useMemo( () => [getAsyncRecognizedModuleCards, getAsyncMLCards], + // eslint-disable-next-line react-hooks/exhaustive-deps [mlLocator] ); return IndexDataVisualizer ? ( diff --git a/x-pack/plugins/ml/public/application/explorer/actions/load_explorer_data.ts b/x-pack/plugins/ml/public/application/explorer/actions/load_explorer_data.ts index b65daf40f6761..71554deb514ed 100644 --- a/x-pack/plugins/ml/public/application/explorer/actions/load_explorer_data.ts +++ b/x-pack/plugins/ml/public/application/explorer/actions/load_explorer_data.ts @@ -216,14 +216,17 @@ export const useExplorerData = (): [Partial | undefined, (d: any) mlResultsService ); return loadExplorerDataProvider(mlResultsService, anomalyExplorerChartsService, timefilter); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const loadExplorerData$ = useMemo(() => new Subject(), []); + // eslint-disable-next-line react-hooks/exhaustive-deps const explorerData$ = useMemo(() => loadExplorerData$.pipe(switchMap(loadExplorerData)), []); const explorerData = useObservable(explorerData$); const update = useCallback((c) => { loadExplorerData$.next(c); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return [explorerData, update]; diff --git a/x-pack/plugins/ml/public/application/explorer/anomalies_map.tsx b/x-pack/plugins/ml/public/application/explorer/anomalies_map.tsx index 9f247fbce72c2..b9a1ef555dbc1 100644 --- a/x-pack/plugins/ml/public/application/explorer/anomalies_map.tsx +++ b/x-pack/plugins/ml/public/application/explorer/anomalies_map.tsx @@ -186,6 +186,7 @@ export const AnomaliesMap: FC = ({ anomalies, jobIds }) => { ); setEMSSuggestions(suggestions.filter(isDefined)); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [...jobIds]); useEffect( @@ -194,6 +195,7 @@ export const AnomaliesMap: FC = ({ anomalies, jobIds }) => { getEMSTermSuggestions(); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [...jobIds] ); diff --git a/x-pack/plugins/ml/public/application/explorer/anomaly_context_menu.tsx b/x-pack/plugins/ml/public/application/explorer/anomaly_context_menu.tsx index 62dc5aa7b34bf..19e5d69b7b32c 100644 --- a/x-pack/plugins/ml/public/application/explorer/anomaly_context_menu.tsx +++ b/x-pack/plugins/ml/public/application/explorer/anomaly_context_menu.tsx @@ -100,6 +100,7 @@ export const AnomalyContextMenu: FC = ({ ); } return items; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [canEditDashboards, globalTimeRange, closePopoverOnAction, selectedJobs]); const jobIds = selectedJobs.map(({ id }) => id); diff --git a/x-pack/plugins/ml/public/application/explorer/anomaly_explorer_context.tsx b/x-pack/plugins/ml/public/application/explorer/anomaly_explorer_context.tsx index 0d529c1aac3e5..2fd8dc8f66014 100644 --- a/x-pack/plugins/ml/public/application/explorer/anomaly_explorer_context.tsx +++ b/x-pack/plugins/ml/public/application/explorer/anomaly_explorer_context.tsx @@ -61,10 +61,12 @@ export function useAnomalyExplorerContextValue( const [, , tableSeverityState] = useTableSeverity(); + // eslint-disable-next-line react-hooks/exhaustive-deps const mlResultsService = useMemo(() => mlResultsServiceProvider(mlApiServices), []); const anomalyTimelineService = useMemo(() => { return new AnomalyTimelineService(timefilter, uiSettings, mlResultsService); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return useMemo(() => { @@ -98,5 +100,6 @@ export function useAnomalyExplorerContextValue( anomalyTimelineStateService, chartsStateService, }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); } diff --git a/x-pack/plugins/ml/public/application/explorer/anomaly_timeline.tsx b/x-pack/plugins/ml/public/application/explorer/anomaly_timeline.tsx index 4e215c447ad36..6c062aa915491 100644 --- a/x-pack/plugins/ml/public/application/explorer/anomaly_timeline.tsx +++ b/x-pack/plugins/ml/public/application/explorer/anomaly_timeline.tsx @@ -255,6 +255,7 @@ export const AnomalyTimeline: FC = React.memo( } return panels; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [canEditDashboards, openCasesModal, viewBySwimlaneFieldName]); // If selecting a cell in the 'view by' swimlane, indicate the corresponding time in the Overall swimlane. @@ -284,6 +285,7 @@ export const AnomalyTimeline: FC = React.memo( const onResize = useCallback((value: number) => { anomalyTimelineStateService.setContainerWidth(value); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return ( diff --git a/x-pack/plugins/ml/public/application/explorer/dashboard_controls/add_swimlane_to_dashboard_controls.tsx b/x-pack/plugins/ml/public/application/explorer/dashboard_controls/add_swimlane_to_dashboard_controls.tsx index 2e5db456a3153..487e3484fc5f4 100644 --- a/x-pack/plugins/ml/public/application/explorer/dashboard_controls/add_swimlane_to_dashboard_controls.tsx +++ b/x-pack/plugins/ml/public/application/explorer/dashboard_controls/add_swimlane_to_dashboard_controls.tsx @@ -67,6 +67,7 @@ export const AddSwimlaneToDashboardControl: FC = ({ swimlaneType: selectedSwimlane, ...(selectedSwimlane === SWIMLANE_TYPE.VIEW_BY ? { viewBy } : {}), }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedSwimlane]); const { addToDashboardAndEditCallback } = useAddToDashboardActions( diff --git a/x-pack/plugins/ml/public/application/explorer/dashboard_controls/use_add_to_dashboard_actions.tsx b/x-pack/plugins/ml/public/application/explorer/dashboard_controls/use_add_to_dashboard_actions.tsx index 1dbc5ac051b95..449d2bc5cae64 100644 --- a/x-pack/plugins/ml/public/application/explorer/dashboard_controls/use_add_to_dashboard_actions.tsx +++ b/x-pack/plugins/ml/public/application/explorer/dashboard_controls/use_add_to_dashboard_actions.tsx @@ -47,6 +47,7 @@ export function useAddToDashboardActions< }, }); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [getEmbeddableInput] ); diff --git a/x-pack/plugins/ml/public/application/explorer/dashboard_controls/use_dashboards_table.tsx b/x-pack/plugins/ml/public/application/explorer/dashboard_controls/use_dashboards_table.tsx index b79f4d93d10d6..ac023017d43f5 100644 --- a/x-pack/plugins/ml/public/application/explorer/dashboard_controls/use_dashboards_table.tsx +++ b/x-pack/plugins/ml/public/application/explorer/dashboard_controls/use_dashboards_table.tsx @@ -35,6 +35,7 @@ export const useDashboardTable = () => { return () => { fetchDashboards.cancel(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const search: EuiTableProps['search'] = useMemo(() => { @@ -48,10 +49,12 @@ export const useDashboardTable = () => { 'data-test-subj': 'mlDashboardsSearchBox', }, }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const [dashboardItems, setDashboardItems] = useState([]); + // eslint-disable-next-line react-hooks/exhaustive-deps const fetchDashboards = useCallback( debounce(async (query?: string) => { try { diff --git a/x-pack/plugins/ml/public/application/explorer/explorer.tsx b/x-pack/plugins/ml/public/application/explorer/explorer.tsx index 4b610cbcffb96..32a4f613c22d4 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer.tsx +++ b/x-pack/plugins/ml/public/application/explorer/explorer.tsx @@ -208,6 +208,7 @@ export const Explorer: FC = ({ }, 0); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [ collapseFn.current, panelsInitialized, @@ -228,6 +229,7 @@ export const Explorer: FC = ({ }, }); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [anomalyExplorerPanelState] ); @@ -256,6 +258,7 @@ export const Explorer: FC = ({ isCollapsed: !isCurrentlyCollapsed, }, }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [anomalyExplorerPanelState]); const { displayWarningToast, displayDangerToast } = useToastNotificationService(); @@ -333,6 +336,7 @@ export const Explorer: FC = ({ ); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [explorerState, language, filterSettings] ); @@ -348,6 +352,7 @@ export const Explorer: FC = ({ }) ); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const { @@ -435,6 +440,7 @@ export const Explorer: FC = ({ ) .catch(console.error); // eslint-disable-line no-console } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [JSON.stringify(selectedJobIds)]); if (noJobsSelected && !loading) { diff --git a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container.js b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container.js index 73095e6b836d0..d000b5cd465ef 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer_charts/explorer_charts_container.js @@ -123,6 +123,7 @@ function ExplorerChartContainer({ }); return location; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [series?.jobId]); useEffect(() => { @@ -141,6 +142,7 @@ function ExplorerChartContainer({ return () => { isCancelled = true; }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [mlLocator, series]); useEffect( @@ -164,6 +166,7 @@ function ExplorerChartContainer({ isCancelled = true; }; }, + // eslint-disable-next-line react-hooks/exhaustive-deps [series] ); @@ -187,6 +190,7 @@ function ExplorerChartContainer({ recentlyAccessed ); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [explorerSeriesLink, recentlyAccessed]); const { detectorLabel, entityFields } = series; diff --git a/x-pack/plugins/ml/public/application/explorer/swimlane_annotation_container.tsx b/x-pack/plugins/ml/public/application/explorer/swimlane_annotation_container.tsx index 262ac0c37f405..6d98cc8cc2172 100644 --- a/x-pack/plugins/ml/public/application/explorer/swimlane_annotation_container.tsx +++ b/x-pack/plugins/ml/public/application/explorer/swimlane_annotation_container.tsx @@ -219,6 +219,7 @@ export const SwimlaneAnnotationContainer: FC = .on('mouseout', () => tooltipService.hide()); }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [chartWidth, domain, annotationsData, tooltipService]); return
; diff --git a/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx b/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx index 9b121bc91098b..6fecb4d16ed6b 100644 --- a/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx +++ b/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx @@ -196,6 +196,7 @@ export const SwimlaneContainer: FC = ({ // Holds the container height for previously fetched data const containerHeightRef = useRef(); + // eslint-disable-next-line react-hooks/exhaustive-deps const resizeHandler = useCallback( throttle((e: { width: number; height: number }) => { const resultNewWidth = e.width - SWIM_LANE_LABEL_WIDTH; @@ -253,6 +254,7 @@ export const SwimlaneContainer: FC = ({ rowsCount * (CELL_HEIGHT + BORDER_WIDTH * 2) + (showLegend ? LEGEND_HEIGHT : 0) + (showTimeline ? X_AXIS_HEIGHT : 0); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [isLoading, rowsCount]); useEffect(() => { @@ -275,6 +277,7 @@ export const SwimlaneContainer: FC = ({ } return { x: selection.times.map((v) => v * 1000), y: selection.lanes }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [selection, swimlaneData, swimlaneType]); const showBrush = !!onCellsSelection; @@ -330,6 +333,7 @@ export const SwimlaneContainer: FC = ({ }; return theme; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ showSwimlane, swimlaneType, diff --git a/x-pack/plugins/ml/public/application/explorer/swimlane_pagination.tsx b/x-pack/plugins/ml/public/application/explorer/swimlane_pagination.tsx index b84747f138237..f2959cb641bb8 100644 --- a/x-pack/plugins/ml/public/application/explorer/swimlane_pagination.tsx +++ b/x-pack/plugins/ml/public/application/explorer/swimlane_pagination.tsx @@ -40,10 +40,12 @@ export const SwimLanePagination: FC = ({ const goToPage = useCallback((pageNumber: number) => { onPaginationChange({ fromPage: pageNumber + 1 }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const setPerPage = useCallback((perPageUpdate: number) => { onPaginationChange({ perPage: perPageUpdate }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const pageCount = Math.ceil(cardinality / perPage); diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/confirm_modals/close_jobs_confirm_modal.tsx b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/confirm_modals/close_jobs_confirm_modal.tsx index 5e7b7a18e3363..f0c78c3828aeb 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/confirm_modals/close_jobs_confirm_modal.tsx +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/confirm_modals/close_jobs_confirm_modal.tsx @@ -51,6 +51,7 @@ export const CloseJobsConfirmModal: FC = ({ unsetShowFunction(); } }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const showModal = useCallback((jobs: MlSummaryJob[]) => { diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/confirm_modals/stop_datafeeds_confirm_modal.tsx b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/confirm_modals/stop_datafeeds_confirm_modal.tsx index 1a6d9e1e433ff..2edd875279ad0 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/confirm_modals/stop_datafeeds_confirm_modal.tsx +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/confirm_modals/stop_datafeeds_confirm_modal.tsx @@ -52,6 +52,7 @@ export const StopDatafeedsConfirmModal: FC = ({ unsetShowFunction(); } }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const showModal = useCallback((jobs: MlSummaryJob[]) => { diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/datafeed_chart_flyout/datafeed_chart_flyout.tsx b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/datafeed_chart_flyout/datafeed_chart_flyout.tsx index 8c4b96207b3a5..53ca34886b9ca 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/datafeed_chart_flyout/datafeed_chart_flyout.tsx +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/datafeed_chart_flyout/datafeed_chart_flyout.tsx @@ -189,6 +189,7 @@ export const DatafeedChartFlyout: FC = ({ displayErrorToast(error, title); } setIsLoadingChartData(false); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [endDate, data.bucketSpan]); const getJobAndSnapshotData = useCallback(async () => { @@ -218,10 +219,12 @@ export const DatafeedChartFlyout: FC = ({ } catch (error) { displayErrorToast(error); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobId]); useEffect(function loadInitialData() { getJobAndSnapshotData(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect( @@ -231,6 +234,7 @@ export const DatafeedChartFlyout: FC = ({ getChartData(); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [endDate, data.bucketSpan] ); @@ -644,6 +648,7 @@ export const JobListDatafeedChartFlyout: FC = ( return () => { unsetShowFunction(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); if (isVisible === true && job !== undefined) { diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/datafeed_chart_flyout/edit_query_delay.tsx b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/datafeed_chart_flyout/edit_query_delay.tsx index 08513f20b0bce..2dce5e5dce529 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/datafeed_chart_flyout/edit_query_delay.tsx +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/datafeed_chart_flyout/edit_query_delay.tsx @@ -71,6 +71,7 @@ export const EditQueryDelay: FC<{ ); } setIsEditing(false); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [datafeedId, newQueryDelay]); const editButton = ( diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/delete_job_modal/delete_job_modal.tsx b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/delete_job_modal/delete_job_modal.tsx index 701ee35d9ca92..b7cadf0def05a 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/delete_job_modal/delete_job_modal.tsx +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/delete_job_modal/delete_job_modal.tsx @@ -52,6 +52,7 @@ export const DeleteJobModal: FC = ({ setShowFunction, unsetShowFunction, unsetShowFunction(); } }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const showModal = useCallback((jobs: MlSummaryJob[]) => { @@ -74,6 +75,7 @@ export const DeleteJobModal: FC = ({ setShowFunction, unsetShowFunction, closeModal(); refreshJobs(); }, DELETING_JOBS_REFRESH_INTERVAL_MS); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobIds, refreshJobs]); if (modalVisible === false || jobIds.length === 0) { diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_actions/results.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_actions/results.js index 9e60e9bcbe7fa..5bdf1ae389f46 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_actions/results.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_actions/results.js @@ -52,8 +52,10 @@ export function ResultLinks({ jobs }) { const { createLinkWithUserDefaults } = useCreateADLinks(); const timeSeriesExplorerLink = useMemo( () => createLinkWithUserDefaults('timeseriesexplorer', jobs), + // eslint-disable-next-line react-hooks/exhaustive-deps [jobs] ); + // eslint-disable-next-line react-hooks/exhaustive-deps const anomalyExplorerLink = useMemo(() => createLinkWithUserDefaults('explorer', jobs), [jobs]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/job_messages_pane.tsx b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/job_messages_pane.tsx index eba82184438a9..8b3ed99709cb5 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/job_messages_pane.tsx +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/job_messages_pane.tsx @@ -62,6 +62,7 @@ export const JobMessagesPane: FC = React.memo( } }; + // eslint-disable-next-line react-hooks/exhaustive-deps const refreshMessage = useCallback(fetchMessages, [jobId]); // Clear messages for last 24hrs and refresh jobs list @@ -82,10 +83,12 @@ export const JobMessagesPane: FC = React.memo( }) ); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobId, JSON.stringify(notificationIndices)]); useEffect(() => { fetchMessages(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const disabled = notificationIndices.length === 0; diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_filter_bar/job_filter_bar.tsx b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_filter_bar/job_filter_bar.tsx index 47a64dd90d502..dbc64d082f117 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_filter_bar/job_filter_bar.tsx +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_filter_bar/job_filter_bar.tsx @@ -56,6 +56,7 @@ export const JobFilterBar: FC = ({ queryText, setFilters }) = } catch (e) { return []; } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const queryInstance: Query = useMemo(() => { @@ -75,6 +76,7 @@ export const JobFilterBar: FC = ({ queryText, setFilters }) = if (queryText !== undefined) { setFilters(queryInstance); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [queryText]); const filters: SearchFilterConfig[] = useMemo( @@ -132,6 +134,7 @@ export const JobFilterBar: FC = ({ queryText, setFilters }) = options: () => loadGroups(), }, ], + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/reset_job_modal/reset_job_modal.tsx b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/reset_job_modal/reset_job_modal.tsx index 49a2b810c1000..97f6255d213fa 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/reset_job_modal/reset_job_modal.tsx +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/reset_job_modal/reset_job_modal.tsx @@ -51,6 +51,7 @@ export const ResetJobModal: FC = ({ setShowFunction, unsetShowFunction, r unsetShowFunction(); } }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const showModal = useCallback((tempJobs: MlSummaryJob[]) => { @@ -73,6 +74,7 @@ export const ResetJobModal: FC = ({ setShowFunction, unsetShowFunction, r setTimeout(() => { refreshJobs(); }, RESETTING_JOBS_REFRESH_INTERVAL_MS); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobIds, refreshJobs]); if (modalVisible === false || jobIds.length === 0) { diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/start_datafeed_modal/time_range_selector/time_range_selector.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/start_datafeed_modal/time_range_selector/time_range_selector.js index 05e8e60abc4fb..e3c6458fabda9 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/start_datafeed_modal/time_range_selector/time_range_selector.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/start_datafeed_modal/time_range_selector/time_range_selector.js @@ -252,6 +252,7 @@ const DatePickerWithInput = ({ date, onChange, minDate, setIsValid, tab }) => { setDateString(date.format(TIME_FORMAT)); setCurrentTab(tab); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [tab]); function onTextChange(e) { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/components/time_range_picker.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/common/components/time_range_picker.tsx index b86961aabaf98..31cc7b8a15a86 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/components/time_range_picker.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/components/time_range_picker.tsx @@ -46,6 +46,7 @@ export const TimeRangePicker: FC = ({ setTimeRange, timeRange }) => { end: endMoment.valueOf(), }); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [startMoment, endMoment]); // update our local start and end moment objects if @@ -54,6 +55,7 @@ export const TimeRangePicker: FC = ({ setTimeRange, timeRange }) => { useEffect(() => { setStartMoment(moment(timeRange.start)); setEndMoment(moment(timeRange.end)); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [JSON.stringify(timeRange)]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/model_memory_estimator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/model_memory_estimator.ts index a0ca9e4502cc2..842e65cc77b6b 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/model_memory_estimator.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/model_memory_estimator.ts @@ -92,6 +92,7 @@ export const useModelMemoryEstimator = ( // Initialize model memory estimator only once const modelMemoryEstimator = useMemo( () => modelMemoryEstimatorProvider(jobCreator, jobValidator), + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); @@ -129,6 +130,7 @@ export const useModelMemoryEstimator = ( return () => { subscription.unsubscribe(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); // Update model memory estimation payload on the job creator updates @@ -142,5 +144,6 @@ export const useModelMemoryEstimator = ( earliestMs: jobCreator.start, latestMs: jobCreator.end, }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); }; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/common/datafeed_preview_flyout/datafeed_preview.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/common/datafeed_preview_flyout/datafeed_preview.tsx index 48fa2f76ca1a9..5868b3df699d3 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/common/datafeed_preview_flyout/datafeed_preview.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/common/datafeed_preview_flyout/datafeed_preview.tsx @@ -51,6 +51,7 @@ export const DatafeedPreview: FC<{ } catch (error) { // fail silently } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [combinedJob]); const loadDataPreview = useCallback(async () => { @@ -89,6 +90,7 @@ export const DatafeedPreview: FC<{ ); setPreviewJsonString(errorText); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [combinedJob]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/common/edit_categorization_analyzer_flyout/edit_categorization_analyzer_flyout.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/common/edit_categorization_analyzer_flyout/edit_categorization_analyzer_flyout.tsx index 5c41147fb2299..0b62c73620208 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/common/edit_categorization_analyzer_flyout/edit_categorization_analyzer_flyout.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/common/edit_categorization_analyzer_flyout/edit_categorization_analyzer_flyout.tsx @@ -41,6 +41,7 @@ export const EditCategorizationAnalyzerFlyout: FC = () => { if (showJsonFlyout === true) { setCategorizationAnalyzerString(JSON.stringify(jobCreator.categorizationAnalyzer, null, 2)); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [showJsonFlyout]); function toggleJsonFlyout() { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/common/json_editor_flyout/json_editor_flyout.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/common/json_editor_flyout/json_editor_flyout.tsx index 1019c91bfd36e..5b16462300446 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/common/json_editor_flyout/json_editor_flyout.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/common/json_editor_flyout/json_editor_flyout.tsx @@ -56,6 +56,7 @@ export const JsonEditorFlyout: FC = ({ isDisabled, jobEditorMode, datafee useEffect(() => { setJobConfigString(jobCreator.formattedJobJson); setDatafeedConfigString(jobCreator.formattedDatafeedJson); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); useEffect(() => { @@ -72,6 +73,7 @@ export const JsonEditorFlyout: FC = ({ isDisabled, jobEditorMode, datafee } else { setTempCombinedJob(null); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [showJsonFlyout]); const editJsonMode = diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/common/model_memory_limit/model_memory_limit_input.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/common/model_memory_limit/model_memory_limit_input.tsx index b43e31d682ee8..b56f15ada0298 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/common/model_memory_limit/model_memory_limit_input.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/common/model_memory_limit/model_memory_limit_input.tsx @@ -25,14 +25,17 @@ export const ModelMemoryLimitInput: FC = () => { useEffect(() => { jobCreator.modelMemoryLimit = modelMemoryLimit === '' ? null : modelMemoryLimit; jobCreatorUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [modelMemoryLimit]); useEffect(() => { setModelMemoryLimit(jobCreator.modelMemoryLimit === null ? '' : jobCreator.modelMemoryLimit); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); useEffect(() => { setValidation(jobValidator.modelMemoryLimit); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobValidatorUpdated]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/data_view/change_data_view.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/data_view/change_data_view.tsx index 4ff22b93334b9..cc3b20966935b 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/data_view/change_data_view.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/data_view/change_data_view.tsx @@ -76,6 +76,7 @@ export const ChangeDataViewModal: FC = ({ onClose }) => { useEffect(function initialPageLoad() { setCurrentDataViewTitle(jobCreator.indexPatternTitle); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/frequency/frequency_input.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/frequency/frequency_input.tsx index 948b83e49bc34..2800f4be12f18 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/frequency/frequency_input.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/frequency/frequency_input.tsx @@ -23,6 +23,7 @@ export const FrequencyInput: FC = () => { useEffect(() => { jobCreator.frequency = frequency === '' ? null : frequency; jobCreatorUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [frequency]); useEffect(() => { @@ -30,10 +31,12 @@ export const FrequencyInput: FC = () => { const df = createDefaultFrequency(); setDefaultFrequency(df); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); useEffect(() => { setValidation(jobValidator.frequency); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobValidatorUpdated]); function createDefaultFrequency() { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/query/query_input.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/query/query_input.tsx index 26bb64957c925..f91a83e116586 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/query/query_input.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/query/query_input.tsx @@ -26,6 +26,7 @@ export const QueryInput: FC<{ setIsValidQuery(v: boolean): void }> = ({ setIsVal jobCreator.query = JSON.parse(queryString); jobCreatorUpdate(); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [queryString]); useEffect(() => { @@ -39,11 +40,13 @@ export const QueryInput: FC<{ setIsValidQuery(v: boolean): void }> = ({ setIsVal setQueryString(actualQuery); } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); useEffect(() => { const validJson = isValidJson(queryString); setIsValidQuery(validJson); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); function onChange(qs: string) { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/query_delay/query_delay_input.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/query_delay/query_delay_input.tsx index 055acc3731b6c..b88b6149b9170 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/query_delay/query_delay_input.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/query_delay/query_delay_input.tsx @@ -21,14 +21,17 @@ export const QueryDelayInput: FC = () => { useEffect(() => { jobCreator.queryDelay = queryDelay === '' ? null : queryDelay; jobCreatorUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [queryDelay]); useEffect(() => { setQueryDelay(jobCreator.queryDelay === null ? '' : jobCreator.queryDelay); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdate]); useEffect(() => { setValidation(jobValidator.queryDelay); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobValidatorUpdated]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/scroll_size/scroll_size_input.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/scroll_size/scroll_size_input.tsx index 0b8578b57167d..14095edeede95 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/scroll_size/scroll_size_input.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/scroll_size/scroll_size_input.tsx @@ -25,14 +25,17 @@ export const ScrollSizeInput: FC = () => { useEffect(() => { jobCreator.scrollSize = scrollSizeString === '' ? null : +scrollSizeString; jobCreatorUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [scrollSizeString]); useEffect(() => { setScrollSize(jobCreator.scrollSize === null ? '' : `${jobCreator.scrollSize}`); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdate]); useEffect(() => { setValidation(jobValidator.scrollSize); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobValidatorUpdated]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/time_field/time_field.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/time_field/time_field.tsx index a25e3b8097bd9..e1cfff0ee81b0 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/time_field/time_field.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/components/time_field/time_field.tsx @@ -22,10 +22,12 @@ export const TimeField: FC = () => { useEffect(() => { jobCreator.timeFieldName = timeFieldName; jobCreatorUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [timeFieldName]); useEffect(() => { setTimeFieldName(jobCreator.timeFieldName); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/datafeed.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/datafeed.tsx index 47e488ab201ec..29f757953ff96 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/datafeed.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/datafeed_step/datafeed.tsx @@ -32,6 +32,7 @@ export const DatafeedStep: FC = ({ setCurrentStep, isCurrentStep }) = jobValidator.scrollSize.valid && jobValidator.validating === false; setNextActive(active); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobValidatorUpdated, isValidQuery]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/additional_section/components/calendars/calendars_selection.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/additional_section/components/calendars/calendars_selection.tsx index 04663b8dfbaea..65549e1276b1b 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/additional_section/components/calendars/calendars_selection.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/additional_section/components/calendars/calendars_selection.tsx @@ -56,11 +56,13 @@ export const CalendarsSelection: FC = () => { useEffect(() => { loadCalendars(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { jobCreator.calendars = selectedCalendars; jobCreatorUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedCalendars.join()]); const comboBoxProps: EuiComboBoxProps = { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/advanced_section/components/annotations/annotations_switch.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/advanced_section/components/annotations/annotations_switch.tsx index 7bed1cc20cc74..12294a2e3fed4 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/advanced_section/components/annotations/annotations_switch.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/advanced_section/components/annotations/annotations_switch.tsx @@ -22,10 +22,12 @@ export const AnnotationsSwitch: FC = () => { useEffect(() => { jobCreator.modelChangeAnnotations = annotationsEnabled; jobCreatorUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [annotationsEnabled]); useEffect(() => { setShowCallout(jobCreator.modelPlot && !annotationsEnabled); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated, annotationsEnabled]); function toggleAnnotations() { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/advanced_section/components/dedicated_index/dedicated_index_switch.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/advanced_section/components/dedicated_index/dedicated_index_switch.tsx index 4040b900b0b86..b5785a326d916 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/advanced_section/components/dedicated_index/dedicated_index_switch.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/advanced_section/components/dedicated_index/dedicated_index_switch.tsx @@ -18,6 +18,7 @@ export const DedicatedIndexSwitch: FC = () => { useEffect(() => { jobCreator.useDedicatedIndex = useDedicatedIndex; jobCreatorUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [useDedicatedIndex]); function toggleModelPlot() { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/advanced_section/components/mml_callout.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/advanced_section/components/mml_callout.tsx index 75b28412250cd..72410baf3f23a 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/advanced_section/components/mml_callout.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/advanced_section/components/mml_callout.tsx @@ -17,6 +17,7 @@ export const MMLCallout: FC = () => { useEffect(() => { const value = jobValidator.latestValidationResult?.highCardinality?.value ?? null; setHighCardinality(value); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobValidatorUpdated]); return jobCreator.modelPlot && highCardinality !== null ? ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/advanced_section/components/model_plot/model_plot_switch.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/advanced_section/components/model_plot/model_plot_switch.tsx index 9548bc911c175..631922a388faa 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/advanced_section/components/model_plot/model_plot_switch.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/advanced_section/components/model_plot/model_plot_switch.tsx @@ -22,6 +22,7 @@ export const ModelPlotSwitch: FC = () => { useEffect(() => { jobCreator.modelPlot = modelPlotEnabled; jobCreatorUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [modelPlotEnabled]); useEffect(() => { @@ -32,6 +33,7 @@ export const ModelPlotSwitch: FC = () => { isCategorizationJobCreator(jobCreator) && jobCreator.aggregations.some((agg) => aggs.includes(agg.id)); setEnabled(isRareCategoryJob === false); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); function toggleModelPlot() { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/groups/groups_input.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/groups/groups_input.tsx index f325051d6f0a6..e6b6280898868 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/groups/groups_input.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/groups/groups_input.tsx @@ -29,11 +29,13 @@ export const GroupsInput: FC = () => { valid, message, }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobValidatorUpdated]); useEffect(() => { jobCreator.groups = selectedGroups; jobCreatorUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedGroups.join()]); const options: EuiComboBoxOptionOption[] = existingJobsAndGroups.groupIds.map((g: string) => ({ diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/job_description/job_description_input.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/job_description/job_description_input.tsx index 1ec2fc4a5a175..e1a22e40a06f2 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/job_description/job_description_input.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/job_description/job_description_input.tsx @@ -17,6 +17,7 @@ export const JobDescriptionInput: FC = () => { useEffect(() => { jobCreator.description = jobDescription; jobCreatorUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobDescription]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/job_id/job_id_input.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/job_id/job_id_input.tsx index bc643fd4885c4..1b4405ea1e282 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/job_id/job_id_input.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/components/job_id/job_id_input.tsx @@ -29,11 +29,13 @@ export const JobIdInput: FC = () => { valid, message, }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobValidatorUpdated]); useEffect(() => { jobCreator.jobId = jobId; jobCreatorUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobId]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/job_details.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/job_details.tsx index 4f1a314dcf517..aefef92a096e4 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/job_details.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/job_details_step/job_details.tsx @@ -45,6 +45,7 @@ export const JobDetailsStep: FC = ({ jobValidator.latestValidationResult.groupIdsExist?.valid === true && jobValidator.validating === false; setNextActive(active); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobValidatorUpdated]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/advanced_detector_modal/advanced_detector_modal.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/advanced_detector_modal/advanced_detector_modal.tsx index 94bface8317a2..b7ec413b18e2a 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/advanced_detector_modal/advanced_detector_modal.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/advanced_detector_modal/advanced_detector_modal.tsx @@ -191,6 +191,7 @@ export const AdvancedDetectorModal: FC = ({ }; setDetector(dtr); setDescriptionPlaceholder(dtr); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ aggOption, fieldOption, @@ -211,6 +212,7 @@ export const AdvancedDetectorModal: FC = ({ const overField = getField(overFieldOption.label); setExcludeFrequentEnabled(byField !== null || overField !== null); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/advanced_view/advanced_view.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/advanced_view/advanced_view.tsx index 1e5e8fd990103..47c0b99fa2fdc 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/advanced_view/advanced_view.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/advanced_view/advanced_view.tsx @@ -26,6 +26,7 @@ export const AdvancedView: FC = ({ isActive, setCanProceed }) => { if (typeof setCanProceed === 'function') { setCanProceed(metricsValid && settingsValid); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [metricsValid, settingsValid]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/advanced_view/detector_list.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/advanced_view/detector_list.tsx index 637599f02b8f6..56b8a9f5e8245 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/advanced_view/detector_list.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/advanced_view/detector_list.tsx @@ -47,6 +47,7 @@ export const DetectorList: FC = ({ isActive, onEditJob, onDeleteJob }) => useEffect(() => { setDetectors(jobCreator.detectors); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); useEffect(() => { @@ -59,6 +60,7 @@ export const DetectorList: FC = ({ isActive, onEditJob, onDeleteJob }) => if (!jobValidator.categorizerMissingPerPartition.valid) { setValidation(jobValidator.categorizerMissingPerPartition); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobValidatorUpdated]); const Buttons: FC<{ index: number }> = ({ index }) => { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/advanced_view/metric_selection.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/advanced_view/metric_selection.tsx index 36fd27aaba27c..f6cfee8a2305c 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/advanced_view/metric_selection.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/advanced_view/metric_selection.tsx @@ -41,6 +41,7 @@ export const AdvancedDetectors: FC = ({ setIsValid }) => { useEffect(() => { setIsValid(jobCreator.detectors.length > 0); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); function closeModal() { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/agg_select/agg_select.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/agg_select/agg_select.tsx index 6ca18097a07a5..3b829a61d461f 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/agg_select/agg_select.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/agg_select/agg_select.tsx @@ -63,6 +63,7 @@ export const AggSelect: FC = ({ fields, changeHandler, selectedOptions, r useEffect(() => { setValidation(jobValidator.duplicateDetectors); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobValidatorUpdated]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/bucket_span/bucket_span.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/bucket_span/bucket_span.tsx index 8eb895f8110b7..3ff095668211e 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/bucket_span/bucket_span.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/bucket_span/bucket_span.tsx @@ -28,18 +28,22 @@ export const BucketSpan: FC = ({ setIsValid, hideEstimateButton = false } useEffect(() => { jobCreator.bucketSpan = bucketSpan; jobCreatorUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [bucketSpan]); useEffect(() => { setBucketSpan(jobCreator.bucketSpan); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); useEffect(() => { setValidation(jobValidator.bucketSpan); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobValidatorUpdated]); useEffect(() => { setIsValid(estimating === false); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [estimating]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/bucket_span_estimator/bucket_span_estimator.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/bucket_span_estimator/bucket_span_estimator.tsx index ef1c458f0e112..8018c881e3b2e 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/bucket_span_estimator/bucket_span_estimator.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/bucket_span_estimator/bucket_span_estimator.tsx @@ -26,11 +26,13 @@ export const BucketSpanEstimator: FC = ({ setEstimating }) => { useEffect(() => { setEstimating(status === ESTIMATE_STATUS.RUNNING); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [status]); useEffect(() => { setNoDetectors(jobCreator.detectors.length === 0); setIsUsingMlCategory(checkIsUsingMlCategory()); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdate]); function checkIsUsingMlCategory() { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/by_field/by_field.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/by_field/by_field.tsx index 44de94cd1aa41..41d5eb7b909bf 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/by_field/by_field.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/by_field/by_field.tsx @@ -23,12 +23,14 @@ export const ByFieldSelector: FC = ({ detectorIndex }) => { const { jobCreator: jc, jobCreatorUpdate, jobCreatorUpdated } = useContext(JobCreatorContext); const jobCreator = jc as PopulationJobCreator; + // eslint-disable-next-line react-hooks/exhaustive-deps const runtimeCategoryFields = useMemo(() => filterCategoryFields(jobCreator.runtimeFields), []); const allCategoryFields = useMemo( () => [...newJobCapsService.categoryFields, ...runtimeCategoryFields].sort((a, b) => a.name.localeCompare(b.name) ), + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); @@ -46,11 +48,13 @@ export const ByFieldSelector: FC = ({ detectorIndex }) => { jobCreator.addInfluencer(byField.name); } jobCreatorUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [byField]); useEffect(() => { const bf = jobCreator.getByField(detectorIndex); setByField(bf); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); return ( @@ -85,6 +89,7 @@ function useFilteredCategoryFields( } else { setFields(allCategoryFields); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); return fields; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_detector/categorization_detector.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_detector/categorization_detector.tsx index 06e1f772bb17f..1b325c4859087 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_detector/categorization_detector.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_detector/categorization_detector.tsx @@ -26,10 +26,12 @@ export const CategorizationDetector: FC = () => { jobCreator.setDetectorType(categorizationDetectorType); jobCreatorUpdate(); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [categorizationDetectorType]); useEffect(() => { setCategorizationDetectorType(jobCreator.selectedDetectorType); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); function onCountSelection() { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_field/categorization_field.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_field/categorization_field.tsx index 6a441a909692b..127fa36e3e125 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_field/categorization_field.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_field/categorization_field.tsx @@ -31,10 +31,12 @@ export const CategorizationField: FC = () => { jobCreator.categorizationFieldName = categorizationFieldName; jobCreatorUpdate(); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [categorizationFieldName]); useEffect(() => { setCategorizationFieldName(jobCreator.categorizationFieldName); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_field/categorization_field_select.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_field/categorization_field_select.tsx index 9d7a34628426c..a340b79b4567a 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_field/categorization_field_select.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_field/categorization_field_select.tsx @@ -22,6 +22,7 @@ export const CategorizationFieldSelect: FC = ({ fields, changeHandler, se const { jobCreator, jobCreatorUpdated } = useContext(JobCreatorContext); const options: EuiComboBoxOptionOption[] = useMemo( () => [...createFieldOptions(fields, jobCreator.additionalFields)], + // eslint-disable-next-line react-hooks/exhaustive-deps [fields, jobCreatorUpdated] ); diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_partition_field/categorization_per_partition.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_partition_field/categorization_per_partition.tsx index 082ace02b3a62..1ef030c1a4287 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_partition_field/categorization_per_partition.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_partition_field/categorization_per_partition.tsx @@ -27,6 +27,7 @@ export const CategorizationPerPartitionField: FC = () => { const [enablePerPartitionCategorization, setEnablePerPartitionCategorization] = useState(false); useEffect(() => { setEnablePerPartitionCategorization(jobCreator.perPartitionCategorization); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_partition_field/categorization_per_partition_dropdown.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_partition_field/categorization_per_partition_dropdown.tsx index 606ad8af09ba8..6f248acc3b902 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_partition_field/categorization_per_partition_dropdown.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_partition_field/categorization_per_partition_dropdown.tsx @@ -28,11 +28,13 @@ export const CategorizationPerPartitionFieldDropdown = ({ const filteredCategories = useMemo( () => categoryFields.filter((c) => c.id !== jobCreator.categorizationFieldName), + // eslint-disable-next-line react-hooks/exhaustive-deps [categoryFields, jobCreatorUpdated] ); useEffect(() => { jobCreator.categorizationPerPartitionField = categorizationPartitionFieldName; jobCreatorUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [categorizationPartitionFieldName]); useEffect(() => { @@ -48,6 +50,7 @@ export const CategorizationPerPartitionFieldDropdown = ({ } setCategorizationPartitionFieldName(jobCreator.categorizationPerPartitionField); setEnablePerPartitionCategorization(jobCreator.perPartitionCategorization); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); return ( = ({ const { jobCreator, jobCreatorUpdated } = useContext(JobCreatorContext); const options: EuiComboBoxOptionOption[] = useMemo( () => [...createFieldOptions(fields, jobCreator.additionalFields)], + // eslint-disable-next-line react-hooks/exhaustive-deps [fields, jobCreatorUpdated] ); diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_partition_field/categorization_per_partition_switch.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_partition_field/categorization_per_partition_switch.tsx index bd982085a8f28..5ad1c05b3e594 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_partition_field/categorization_per_partition_switch.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_partition_field/categorization_per_partition_switch.tsx @@ -25,6 +25,7 @@ export const CategorizationPerPartitionSwitch: FC = () => { useEffect(() => { setEnablePerPartitionCategorization(jobCreator.perPartitionCategorization); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); useEffect(() => { @@ -35,6 +36,7 @@ export const CategorizationPerPartitionSwitch: FC = () => { jobCreator.perPartitionCategorization = enablePerPartitionCategorization; jobCreatorUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [enablePerPartitionCategorization]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_partition_field/categorization_stop_on_warn_switch.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_partition_field/categorization_stop_on_warn_switch.tsx index d35f8af6399bd..004cd6e636a88 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_partition_field/categorization_stop_on_warn_switch.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_partition_field/categorization_stop_on_warn_switch.tsx @@ -21,10 +21,12 @@ export const CategorizationPerPartitionStopOnWarnSwitch: FC = () => { useEffect(() => { jobCreator.perPartitionStopOnWarn = stopOnWarn; jobCreatorUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [stopOnWarn]); useEffect(() => { setStopOnWarn(jobCreator.perPartitionStopOnWarn); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/categorization_view.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/categorization_view.tsx index 8033ec6f34783..881d758732534 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/categorization_view.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/categorization_view.tsx @@ -25,6 +25,7 @@ export const CategorizationView: FC = ({ isActive, setCanProceed }) => { if (typeof setCanProceed === 'function') { setCanProceed(categoryFieldValid && settingsValid); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [categoryFieldValid, settingsValid]); return isActive === false ? ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/category_stopped_partitions.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/category_stopped_partitions.tsx index b26667ad86b98..8030292bd9e59 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/category_stopped_partitions.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/category_stopped_partitions.tsx @@ -88,6 +88,7 @@ export const CategoryStoppedPartitions: FC = () => { .subscribe(); return () => resultsSubscription.unsubscribe(); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/metric_selection.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/metric_selection.tsx index 34cba31aa17a5..1b89262c9e59f 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/metric_selection.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/metric_selection.tsx @@ -56,6 +56,7 @@ export const CategorizationDetectors: FC = ({ setIsValid }) => { jobCreatorUpdate(); } loadFieldExamples(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [categorizationFieldName]); useEffect(() => { @@ -77,6 +78,7 @@ export const CategorizationDetectors: FC = ({ setIsValid }) => { if (jobCreator.categorizationFieldName !== categorizationFieldName) { setCategorizationFieldName(jobCreator.categorizationFieldName); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); async function loadFieldExamples() { @@ -113,6 +115,7 @@ export const CategorizationDetectors: FC = ({ setIsValid }) => { useEffect(() => { jobCreatorUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [overallValidStatus]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/metric_selection_summary.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/metric_selection_summary.tsx index 157f44aa3a6cb..2cf10849fe054 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/metric_selection_summary.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/metric_selection_summary.tsx @@ -49,6 +49,7 @@ export const CategorizationDetectorsSummary: FC = () => { return () => { resultsSubscription.unsubscribe(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); async function loadChart() { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/top_categories.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/top_categories.tsx index d4a121f094897..4491dfab1abdd 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/top_categories.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/categorization_view/top_categories.tsx @@ -53,6 +53,7 @@ export const TopCategories: FC = () => { return () => { resultsSubscription.unsubscribe(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const columns = [ diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/influencers/influencers.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/influencers/influencers.tsx index 5050a4f3be8ea..c72d3afb23f32 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/influencers/influencers.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/influencers/influencers.tsx @@ -27,10 +27,12 @@ export const Influencers: FC = () => { jobCreator.removeAllInfluencers(); influencers.forEach((i) => jobCreator.addInfluencer(i)); jobCreatorUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [influencers.join()]); useEffect(() => { setInfluencers([...jobCreator.influencers]); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/multi_metric_view/metric_selection.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/multi_metric_view/metric_selection.tsx index 58252feca4b53..76afcc3263ee5 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/multi_metric_view/metric_selection.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/multi_metric_view/metric_selection.tsx @@ -36,6 +36,7 @@ export const MultiMetricDetectors: FC = ({ setIsValid }) => { const fields = useMemo( () => sortFields([...newJobCapsService.fields, ...jobCreator.runtimeFields]), + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); const [selectedOptions, setSelectedOptions] = useState([]); @@ -87,6 +88,7 @@ export const MultiMetricDetectors: FC = ({ setIsValid }) => { jobCreatorUpdate(); loadCharts(); setIsValid(aggFieldPairList.length > 0); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [aggFieldPairList.length]); // watch for change in jobCreator @@ -103,6 +105,7 @@ export const MultiMetricDetectors: FC = ({ setIsValid }) => { } setSplitField(jobCreator.splitField); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); // watch for changes in split field. @@ -123,12 +126,14 @@ export const MultiMetricDetectors: FC = ({ setIsValid }) => { } else { setFieldValues([]); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [splitField]); // watch for changes in the split field values // reload the charts useEffect(() => { loadCharts(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [fieldValues]); async function loadCharts() { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/multi_metric_view/metric_selection_summary.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/multi_metric_view/metric_selection_summary.tsx index d6cbd09419f0b..02736f334a4ca 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/multi_metric_view/metric_selection_summary.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/multi_metric_view/metric_selection_summary.tsx @@ -59,12 +59,14 @@ export const MultiMetricDetectorsSummary: FC = () => { return () => { subscription.unsubscribe(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { if (allDataReady()) { loadCharts(); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [fieldValues]); async function loadCharts() { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/multi_metric_view/multi_metric_view.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/multi_metric_view/multi_metric_view.tsx index c9afbf181e678..a6f7dbb403102 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/multi_metric_view/multi_metric_view.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/multi_metric_view/multi_metric_view.tsx @@ -25,6 +25,7 @@ export const MultiMetricView: FC = ({ isActive, setCanProceed }) => { if (typeof setCanProceed === 'function') { setCanProceed(metricsValid && settingsValid); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [metricsValid, settingsValid]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_field/population_field.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_field/population_field.tsx index e3d11c0d894ba..40a968b6d13ef 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_field/population_field.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_field/population_field.tsx @@ -23,12 +23,14 @@ export const PopulationFieldSelector: FC = () => { const { jobCreator: jc, jobCreatorUpdate, jobCreatorUpdated } = useContext(JobCreatorContext); const jobCreator = jc as PopulationJobCreator | RareJobCreator; + // eslint-disable-next-line react-hooks/exhaustive-deps const runtimeCategoryFields = useMemo(() => filterCategoryFields(jobCreator.runtimeFields), []); const allCategoryFields = useMemo( () => [...newJobCapsService.categoryFields, ...runtimeCategoryFields].sort((a, b) => a.name.localeCompare(b.name) ), + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); const categoryFields = useFilteredCategoryFields( @@ -49,10 +51,12 @@ export const PopulationFieldSelector: FC = () => { jobCreator.addInfluencer(populationField.name); } jobCreatorUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [populationField]); useEffect(() => { setPopulationField(jobCreator.populationField); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); return ( @@ -88,6 +92,7 @@ function useFilteredCategoryFields( setFields(allCategoryFields); } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); return fields; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_view/metric_selection.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_view/metric_selection.tsx index 1f669fea655b7..4faf6b8fdc3fc 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_view/metric_selection.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_view/metric_selection.tsx @@ -39,6 +39,7 @@ export const PopulationDetectors: FC = ({ setIsValid }) => { const fields = useMemo( () => sortFields([...newJobCapsService.fields, ...jobCreator.runtimeFields]), + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); const [selectedOptions, setSelectedOptions] = useState([]); @@ -100,6 +101,7 @@ export const PopulationDetectors: FC = ({ setIsValid }) => { jobCreatorUpdate(); loadCharts(); setIsValid(aggFieldPairList.length > 0); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [aggFieldPairList.length]); // watch for changes in by field values @@ -108,6 +110,7 @@ export const PopulationDetectors: FC = ({ setIsValid }) => { // if the split field or by fields have changed useEffect(() => { loadCharts(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [JSON.stringify(fieldValuesPerDetector), populationField, pageReady]); // watch for change in jobCreator @@ -139,6 +142,7 @@ export const PopulationDetectors: FC = ({ setIsValid }) => { setAggFieldPairList(newList); updateByFields(); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); // watch for changes in split field or by fields. @@ -146,6 +150,7 @@ export const PopulationDetectors: FC = ({ setIsValid }) => { // changes to fieldValues here will trigger the card effect via setFieldValuesPerDetector useEffect(() => { loadFieldExamples(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [populationField, byFieldsUpdated]); async function loadCharts() { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_view/metric_selection_summary.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_view/metric_selection_summary.tsx index 8ff8a85759911..e6e6706f6266e 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_view/metric_selection_summary.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_view/metric_selection_summary.tsx @@ -50,6 +50,7 @@ export const PopulationDetectorsSummary: FC = () => { return () => { subscription.unsubscribe(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); // watch for changes in by field values @@ -60,6 +61,7 @@ export const PopulationDetectorsSummary: FC = () => { if (allDataReady()) { loadCharts(); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [JSON.stringify(fieldValuesPerDetector), jobCreator.populationField]); // watch for changes in split field or by fields. @@ -67,6 +69,7 @@ export const PopulationDetectorsSummary: FC = () => { // changes to fieldValues here will trigger the card effect via setFieldValuesPerDetector useEffect(() => { loadFieldExamples(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreator.populationField]); async function loadCharts() { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_view/population_view.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_view/population_view.tsx index 90efe997b7bdf..24c2f1da95155 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_view/population_view.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/population_view/population_view.tsx @@ -25,6 +25,7 @@ export const PopulationView: FC = ({ isActive, setCanProceed }) => { if (typeof setCanProceed === 'function') { setCanProceed(metricsValid && settingsValid); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [metricsValid, settingsValid]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_detector/rare_detector.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_detector/rare_detector.tsx index 0587d90026ae4..9c4dd9d8c70ff 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_detector/rare_detector.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_detector/rare_detector.tsx @@ -37,6 +37,7 @@ export const RareDetector: FC = ({ onChange }) => { } else { setRareDetectorType(RARE_DETECTOR_TYPE.RARE); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { @@ -48,6 +49,7 @@ export const RareDetector: FC = ({ onChange }) => { jobCreator.frequentlyRare = rareDetectorType === RARE_DETECTOR_TYPE.FREQ_RARE_POPULATION; jobCreatorUpdate(); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [rareDetectorType]); function onRareSelection() { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_field/rare_field.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_field/rare_field.tsx index 663136fc5aa21..bd3e0aeb93782 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_field/rare_field.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_field/rare_field.tsx @@ -19,12 +19,14 @@ export const RareFieldSelector: FC = () => { const { jobCreator: jc, jobCreatorUpdate, jobCreatorUpdated } = useContext(JobCreatorContext); const jobCreator = jc as RareJobCreator; + // eslint-disable-next-line react-hooks/exhaustive-deps const runtimeCategoryFields = useMemo(() => filterCategoryFields(jobCreator.runtimeFields), []); const allCategoryFields = useMemo( () => [...newJobCapsService.categoryFields, ...runtimeCategoryFields].sort((a, b) => a.name.localeCompare(b.name) ), + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); const categoryFields = useFilteredCategoryFields( @@ -42,10 +44,12 @@ export const RareFieldSelector: FC = () => { jobCreator.addInfluencer(rareField.name); } jobCreatorUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [rareField]); useEffect(() => { setRareField(jobCreator.rareField); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); return ( @@ -76,6 +80,7 @@ function useFilteredCategoryFields( } else { setFields(allCategoryFields); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); return fields; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/detector_description.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/detector_description.tsx index 38e52d3f1b5e8..33288020ce757 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/detector_description.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/detector_description.tsx @@ -25,6 +25,7 @@ export const DetectorDescription: FC = ({ detectorType }) => { useEffect(() => { const desc = createDetectorDescription(jobCreator, detectorType); setDescription(desc); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); if (description === null) { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/metric_selection.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/metric_selection.tsx index 1c1a8e83c478b..90acaf9ad4654 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/metric_selection.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/metric_selection.tsx @@ -40,6 +40,7 @@ export const RareDetectors: FC = ({ setIsValid, rareDetectorType, setRare } setIsValid(valid); setDetectorValid(valid); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/metric_selection_summary.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/metric_selection_summary.tsx index bb4b83f639beb..9cd1062231570 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/metric_selection_summary.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/metric_selection_summary.tsx @@ -45,6 +45,7 @@ export const RareDetectorsSummary: FC = () => { } else { return RARE_DETECTOR_TYPE.RARE; } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); function setResultsWrapper(results: Results) { @@ -67,6 +68,7 @@ export const RareDetectorsSummary: FC = () => { return () => { resultsSubscription.unsubscribe(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); async function loadChart() { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/rare_view.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/rare_view.tsx index 4d0ed3b58973d..8e5f58894c407 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/rare_view.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/rare_view/rare_view.tsx @@ -32,6 +32,7 @@ export const RareView: FC = ({ isActive, setCanProceed }) => { if (typeof setCanProceed === 'function') { setCanProceed(rareFieldValid && settingsValid); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [rareFieldValid, settingsValid]); return isActive === false ? ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/single_metric_view/metric_selection.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/single_metric_view/metric_selection.tsx index d41234bbedd81..73181555183d2 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/single_metric_view/metric_selection.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/single_metric_view/metric_selection.tsx @@ -35,6 +35,7 @@ export const SingleMetricDetectors: FC = ({ setIsValid }) => { const fields = useMemo( () => sortFields([...newJobCapsService.fields, ...jobCreator.runtimeFields]), + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); const [selectedOptions, setSelectedOptions] = useState( @@ -66,6 +67,7 @@ export const SingleMetricDetectors: FC = ({ setIsValid }) => { loadChart(); setIsValid(aggFieldPair !== null); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [aggFieldPair]); useEffect(() => { @@ -79,6 +81,7 @@ export const SingleMetricDetectors: FC = ({ setIsValid }) => { setBucketSpanMs(jobCreator.bucketSpanMs); loadChart(); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); async function loadChart() { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/single_metric_view/metric_selection_summary.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/single_metric_view/metric_selection_summary.tsx index 457be612c4fd4..310d03069a7f0 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/single_metric_view/metric_selection_summary.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/single_metric_view/metric_selection_summary.tsx @@ -48,6 +48,7 @@ export const SingleMetricDetectorsSummary: FC = () => { return () => { subscription.unsubscribe(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); async function loadChart() { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/single_metric_view/single_metric_view.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/single_metric_view/single_metric_view.tsx index 2604f98a011b0..2620b4aa75a1a 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/single_metric_view/single_metric_view.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/single_metric_view/single_metric_view.tsx @@ -25,6 +25,7 @@ export const SingleMetricView: FC = ({ isActive, setCanProceed }) => { if (typeof setCanProceed === 'function') { setCanProceed(metricsValid && settingsValid); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [metricsValid, settingsValid]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/sparse_data/sparse_data_switch.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/sparse_data/sparse_data_switch.tsx index 74a2b98141eeb..49d22f18d3887 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/sparse_data/sparse_data_switch.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/sparse_data/sparse_data_switch.tsx @@ -20,6 +20,7 @@ export const SparseDataSwitch: FC = () => { useEffect(() => { jobCreator.sparseData = sparseData; jobCreatorUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [sparseData]); useEffect(() => { @@ -31,6 +32,7 @@ export const SparseDataSwitch: FC = () => { if (isCountOrSum === false && sparseData === true) { setSparseData(false); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); function toggleSparseData() { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field/split_field.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field/split_field.tsx index 146e9f9f92061..3eb1bd6ea840b 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field/split_field.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/split_field/split_field.tsx @@ -23,12 +23,14 @@ export const SplitFieldSelector: FC = () => { const { jobCreator: jc, jobCreatorUpdate, jobCreatorUpdated } = useContext(JobCreatorContext); const jobCreator = jc as MultiMetricJobCreator | RareJobCreator; + // eslint-disable-next-line react-hooks/exhaustive-deps const runtimeCategoryFields = useMemo(() => filterCategoryFields(jobCreator.runtimeFields), []); const allCategoryFields = useMemo( () => [...newJobCapsService.categoryFields, ...runtimeCategoryFields].sort((a, b) => a.name.localeCompare(b.name) ), + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); const categoryFields = useFilteredCategoryFields( @@ -45,10 +47,12 @@ export const SplitFieldSelector: FC = () => { jobCreator.addInfluencer(splitField.name); } jobCreatorUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [splitField]); useEffect(() => { setSplitField(jobCreator.splitField); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); return ( @@ -84,6 +88,7 @@ function useFilteredCategoryFields( setFields(allCategoryFields); } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); return fields; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/summary_count_field/summary_count_field.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/summary_count_field/summary_count_field.tsx index 3345b60ddd4d9..07d68778b32bc 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/summary_count_field/summary_count_field.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/components/summary_count_field/summary_count_field.tsx @@ -34,15 +34,18 @@ export const SummaryCountField: FC = () => { const [validation, setValidation] = useState(jobValidator.summaryCountField); useEffect(() => { setValidation(jobValidator.summaryCountField); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobValidatorUpdated]); useEffect(() => { jobCreator.summaryCountFieldName = summaryCountFieldName; jobCreatorUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [summaryCountFieldName]); useEffect(() => { setSummaryCountFieldName(jobCreator.summaryCountFieldName); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/pick_fields.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/pick_fields.tsx index 2461cfc9d9d04..faef0fef11c36 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/pick_fields.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/pick_fields_step/pick_fields.tsx @@ -33,6 +33,7 @@ export const PickFieldsStep: FC = ({ setCurrentStep, isCurrentStep }) useEffect(() => { setNextActive(selectionValid && jobValidator.isPickFieldsStepValid); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobValidatorUpdated, selectionValid]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/summary_step/summary.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/summary_step/summary.tsx index eca7f03a29ee8..25198f0685c8f 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/summary_step/summary.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/summary_step/summary.tsx @@ -64,6 +64,7 @@ export const SummaryStep: FC = ({ setCurrentStep, isCurrentStep }) => useEffect(() => { jobCreator.subscribeToProgress(setProgress); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { @@ -141,6 +142,7 @@ export const SummaryStep: FC = ({ setCurrentStep, isCurrentStep }) => useEffect(() => { setIsValid(jobValidator.validationSummary.basic); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobValidatorUpdated]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/time_range_step/time_range.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/time_range_step/time_range.tsx index 8bbc7fc5879d0..90bcf4e606859 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/time_range_step/time_range.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/time_range_step/time_range.tsx @@ -69,6 +69,7 @@ export const TimeRangeStep: FC = ({ setCurrentStep, isCurrentStep }) jobCreatorUpdate(); loadChart(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [JSON.stringify(timeRange)]); useEffect(() => { @@ -76,6 +77,7 @@ export const TimeRangeStep: FC = ({ setCurrentStep, isCurrentStep }) start: jobCreator.start, end: jobCreator.end, }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); function fullTimeRangeCallback(range: GetTimeFieldRangeResponse) { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/validation_step/validation.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/validation_step/validation.tsx index ee0786379df51..2e8b017790724 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/validation_step/validation.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/validation_step/validation.tsx @@ -49,6 +49,7 @@ export const ValidationStep: FC = ({ setCurrentStep, isCurrentStep }) // force basic validation to run jobValidator.validate(() => {}, true); jobCreatorUpdate(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); // keep a record of the advanced validation in the jobValidator diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/new_job/page.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/new_job/page.tsx index fda28a063727f..71bfba6bfab69 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/new_job/page.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/new_job/page.tsx @@ -54,6 +54,7 @@ export const Page: FC = ({ existingJobsAndGroups, jobType }) => { mlContext.currentSavedSearch, mlContext.combinedQuery ), + // eslint-disable-next-line react-hooks/exhaustive-deps [jobType] ); @@ -185,6 +186,7 @@ export const Page: FC = ({ existingJobsAndGroups, jobType }) => { const chartLoader = useMemo( () => new ChartLoader(mlContext.currentDataView, jobCreator.query), + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); @@ -192,6 +194,7 @@ export const Page: FC = ({ existingJobsAndGroups, jobType }) => { const resultsLoader = useMemo( () => new ResultsLoader(jobCreator, chartInterval, chartLoader), + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/new_job/wizard.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/new_job/wizard.tsx index 06d532e4bd793..77f1f85220185 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/new_job/wizard.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/new_job/wizard.tsx @@ -88,6 +88,7 @@ export const Wizard: FC = ({ return () => { return subscription.unsubscribe(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { @@ -102,12 +103,14 @@ export const Wizard: FC = ({ setHighestStep(currentStep); setStringifiedConfigs(tempConfigs); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobCreatorUpdated]); useEffect(() => { jobCreator.subscribeToProgress(setProgress); setCurrentStep(firstWizardStep); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); // disable the step links if the job is running @@ -120,6 +123,7 @@ export const Wizard: FC = ({ if (currentStep >= highestStep) { setHighestStep(currentStep); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [currentStep]); useModelMemoryEstimator(jobCreator, jobValidator, jobCreatorUpdate, jobCreatorUpdated); diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/recognize/components/edit_job.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/recognize/components/edit_job.tsx index 8d5e7be5019b9..77694f707bb08 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/recognize/components/edit_job.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/recognize/components/edit_job.tsx @@ -63,6 +63,7 @@ export const EditJob: FC = ({ job, jobOverride, existingGroupIds, useEffect(() => { handleValidation(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [formState.jobGroups]); const onSave = () => { diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/recognize/components/job_settings_form.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/recognize/components/job_settings_form.tsx index 3d7f56a710664..ff2be09d731fb 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/recognize/components/job_settings_form.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/recognize/components/job_settings_form.tsx @@ -89,10 +89,12 @@ export const JobSettingsForm: FC = ({ useEffect(() => { handleValidation(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [formState.jobPrefix]); useEffect(() => { onChange(formState); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [formState]); return ( diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/recognize/page.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/recognize/page.tsx index b0afbd791aa4c..f2cc9b4cabb2c 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/recognize/page.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/recognize/page.tsx @@ -152,6 +152,7 @@ export const Page: FC = ({ moduleId, existingGroupIds }) => { useEffect(() => { loadModule(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); /** diff --git a/x-pack/plugins/ml/public/application/management/jobs_list/components/jobs_list_page/jobs_list_page.tsx b/x-pack/plugins/ml/public/application/management/jobs_list/components/jobs_list_page/jobs_list_page.tsx index df3067deb15b5..2d82464290314 100644 --- a/x-pack/plugins/ml/public/application/management/jobs_list/components/jobs_list_page/jobs_list_page.tsx +++ b/x-pack/plugins/ml/public/application/management/jobs_list/components/jobs_list_page/jobs_list_page.tsx @@ -86,8 +86,10 @@ export const JobsListPage: FC<{ useEffect(() => { check(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + // eslint-disable-next-line react-hooks/exhaustive-deps const ContextWrapper = useCallback( spacesApi ? spacesApi.ui.components.getSpacesContextProvider : getEmptyFunctionComponent, [spacesApi] diff --git a/x-pack/plugins/ml/public/application/management/jobs_list/components/jobs_list_page/space_management/space_management.tsx b/x-pack/plugins/ml/public/application/management/jobs_list/components/jobs_list_page/space_management/space_management.tsx index f5ad133bc2420..6868bdfa4a4e7 100644 --- a/x-pack/plugins/ml/public/application/management/jobs_list/components/jobs_list_page/space_management/space_management.tsx +++ b/x-pack/plugins/ml/public/application/management/jobs_list/components/jobs_list_page/space_management/space_management.tsx @@ -88,6 +88,7 @@ export const SpaceManagement: FC = ({ spacesApi, setCurrentTab }) => { refresh(currentTabId); setPageIndex(0); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [currentTabId] ); @@ -161,6 +162,7 @@ export const SpaceManagement: FC = ({ spacesApi, setCurrentTab }) => { )} ); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [items, columns, isLoading, filters, currentTabId, refresh, onTableChange]); const tabs = useMemo( diff --git a/x-pack/plugins/ml/public/application/overview/components/analytics_panel/analytics_panel.tsx b/x-pack/plugins/ml/public/application/overview/components/analytics_panel/analytics_panel.tsx index 1d64794adecfa..e5c1bb867bbd9 100644 --- a/x-pack/plugins/ml/public/application/overview/components/analytics_panel/analytics_panel.tsx +++ b/x-pack/plugins/ml/public/application/overview/components/analytics_panel/analytics_panel.tsx @@ -56,6 +56,7 @@ export const AnalyticsPanel: FC = ({ setLazyJobCount }) => { useEffect(() => { getAnalytics(true); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [refresh]); const errorDisplay = ( diff --git a/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/anomaly_detection_panel.tsx b/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/anomaly_detection_panel.tsx index 8a4007d5b2835..a18065608fc83 100644 --- a/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/anomaly_detection_panel.tsx +++ b/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/anomaly_detection_panel.tsx @@ -134,6 +134,7 @@ export const AnomalyDetectionPanel: FC = ({ jobCreationDisabled, setLazyJ useEffect(() => { loadJobs(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [refresh?.timeRange]); const errorDisplay = ( diff --git a/x-pack/plugins/ml/public/application/routing/router.tsx b/x-pack/plugins/ml/public/application/routing/router.tsx index a761bce2ce38a..73829b0a76299 100644 --- a/x-pack/plugins/ml/public/application/routing/router.tsx +++ b/x-pack/plugins/ml/public/application/routing/router.tsx @@ -88,6 +88,7 @@ const LegacyHashUrlRedirect: FC = ({ children }) => { if (location.hash.startsWith('#/')) { history.push(location.hash.replace('#', '')); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [location.hash]); return <>{children}; diff --git a/x-pack/plugins/ml/public/application/routing/routes/explorer.tsx b/x-pack/plugins/ml/public/application/routing/routes/explorer.tsx index 83b487b8a3f5e..5f4c71a909720 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/explorer.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/explorer.tsx @@ -131,6 +131,7 @@ const ExplorerUrlStateManager: FC = ({ jobsWithTim setInValidTimeRangeError(true); } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [globalState?.time?.from, globalState?.time?.to, globalState?.time?.ts]); const getJobsWithStoppedPartitions = useCallback(async (selectedJobIds: string[]) => { @@ -163,6 +164,7 @@ const ExplorerUrlStateManager: FC = ({ jobsWithTim explorerService.clearJobs(); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [JSON.stringify(jobIds)] ); @@ -176,6 +178,7 @@ const ExplorerUrlStateManager: FC = ({ jobsWithTim anomalyExplorerContext.anomalyTimelineStateService.destroy(); anomalyExplorerContext.chartsStateService.destroy(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const [explorerData, loadExplorerData] = useExplorerData(); @@ -232,12 +235,14 @@ const ExplorerUrlStateManager: FC = ({ jobsWithTim loadExplorerDataConfig?.selectedJobs! ); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [loadExplorerDataConfig] ); useEffect(() => { if (!loadExplorerDataConfig || loadExplorerDataConfig?.selectedCells === undefined) return; loadExplorerData(loadExplorerDataConfig); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [JSON.stringify(loadExplorerDataConfig)]); const overallSwimlaneData = useObservable( diff --git a/x-pack/plugins/ml/public/application/routing/routes/jobs_list.tsx b/x-pack/plugins/ml/public/application/routing/routes/jobs_list.tsx index 6ac1faf22bccc..e6025147c3226 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/jobs_list.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/jobs_list.tsx @@ -67,6 +67,7 @@ const PageWrapper: FC = ({ deps }) => { ? { pause: false, value: DEFAULT_REFRESH_INTERVAL_MS } : { pause: refreshPause, value: refreshValue }; timefilter.setRefreshInterval(refreshInterval); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const annotationUpdatesService = useMemo(() => new AnnotationUpdatesService(), []); diff --git a/x-pack/plugins/ml/public/application/routing/routes/timeseriesexplorer.tsx b/x-pack/plugins/ml/public/application/routing/routes/timeseriesexplorer.tsx index b6c3879eec74f..b25808d7b637b 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/timeseriesexplorer.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/timeseriesexplorer.tsx @@ -140,6 +140,7 @@ export const TimeSeriesExplorerUrlStateManager: FC { const editCalendarMatch = useRouteMatch('/settings/calendars_list/edit_calendar/:calendarId'); const editFilterMatch = useRouteMatch('/settings/filter_lists/edit_filter_list/:filterId'); + // eslint-disable-next-line react-hooks/exhaustive-deps const routesMap = useMemo(() => keyBy(routesList, 'path'), []); const activeRoute = useMemo(() => { @@ -44,6 +45,7 @@ export const useActiveRoute = (routesList: MlRoute[]): MlRoute => { // Remove trailing slash from the pathname const pathnameKey = pathname.replace(/\/$/, ''); return routesMap[pathnameKey]; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [pathname]); const bannerId = useRef(); diff --git a/x-pack/plugins/ml/public/application/routing/use_refresh.ts b/x-pack/plugins/ml/public/application/routing/use_refresh.ts index ce4a03696034e..8148a013ebc6e 100644 --- a/x-pack/plugins/ml/public/application/routing/use_refresh.ts +++ b/x-pack/plugins/ml/public/application/routing/use_refresh.ts @@ -41,6 +41,7 @@ export const useRefresh = () => { ), annotationsRefresh$.pipe(map((d) => ({ lastRefresh: d }))) ); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return useObservable(refresh$); diff --git a/x-pack/plugins/ml/public/application/routing/use_resolver.ts b/x-pack/plugins/ml/public/application/routing/use_resolver.ts index 26ecb494ab00d..6e16b1d42e6f6 100644 --- a/x-pack/plugins/ml/public/application/routing/use_resolver.ts +++ b/x-pack/plugins/ml/public/application/routing/use_resolver.ts @@ -108,6 +108,7 @@ export const useResolver = ( await redirectToJobsManagementPage(); } })(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return { context, results }; diff --git a/x-pack/plugins/ml/public/application/services/toast_notification_service/toast_notification_service.ts b/x-pack/plugins/ml/public/application/services/toast_notification_service/toast_notification_service.ts index e967f3547b475..8bc7bc8c87e35 100644 --- a/x-pack/plugins/ml/public/application/services/toast_notification_service/toast_notification_service.ts +++ b/x-pack/plugins/ml/public/application/services/toast_notification_service/toast_notification_service.ts @@ -56,5 +56,6 @@ export function getToastNotificationService() { */ export function useToastNotificationService(): ToastNotificationService { const { toasts } = useNotifications(); + // eslint-disable-next-line react-hooks/exhaustive-deps return useMemo(() => toastNotificationServiceProvider(toasts), []); } diff --git a/x-pack/plugins/ml/public/application/settings/anomaly_detection_settings.tsx b/x-pack/plugins/ml/public/application/settings/anomaly_detection_settings.tsx index 98156d8860831..fbec86a8c77e9 100644 --- a/x-pack/plugins/ml/public/application/settings/anomaly_detection_settings.tsx +++ b/x-pack/plugins/ml/public/application/settings/anomaly_detection_settings.tsx @@ -44,6 +44,7 @@ export const AnomalyDetectionSettings: FC = () => { useEffect(() => { loadSummaryStats(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); async function loadSummaryStats() { diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/entity_control/entity_config.tsx b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/entity_control/entity_config.tsx index e0df0bac214e3..b7892f4797d48 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/entity_control/entity_config.tsx +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/entity_control/entity_config.tsx @@ -58,6 +58,7 @@ export const EntityConfig: FC = ({ }), }, ]; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [isModelPlotEnabled, config]); const orderOptions: EuiRadioGroupOption[] = useMemo(() => { diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/plot_function_controls/plot_function_controls.tsx b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/plot_function_controls/plot_function_controls.tsx index 09c22b193d303..cd3706a4560f2 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/plot_function_controls/plot_function_controls.tsx +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/plot_function_controls/plot_function_controls.tsx @@ -96,6 +96,7 @@ export const PlotByFunctionControls = ({ ); } } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ setFunctionDescription, selectedDetectorIndex, diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/series_controls/series_controls.tsx b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/series_controls/series_controls.tsx index 13d1527bda5b7..e5f3e097b5f54 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/series_controls/series_controls.tsx +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/series_controls/series_controls.tsx @@ -193,6 +193,7 @@ export const SeriesControls: FC = ({ useEffect(() => { loadEntityValues(); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedJobId, selectedDetectorIndex, JSON.stringify(selectedEntities), resultFieldsConfig]); const entityFieldSearchChanged = debounce(async (entity, queryTerm) => { diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart_with_tooltip.tsx b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart_with_tooltip.tsx index 174ab8a682b5b..c9ca8250bedd9 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart_with_tooltip.tsx +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart_with_tooltip.tsx @@ -65,6 +65,7 @@ export const TimeSeriesChartWithTooltips: FC = ), ...(error ? { text: extractErrorMessage(error) } : {}), }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { @@ -105,6 +106,7 @@ export const TimeSeriesChartWithTooltips: FC = return () => { unmounted = true; }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [ selectedJob.job_id, detectorIndex, diff --git a/x-pack/plugins/ml/public/application/trained_models/models_management/delete_models_modal.tsx b/x-pack/plugins/ml/public/application/trained_models/models_management/delete_models_modal.tsx index 401f18ab3d3a0..b4f0bc0ec505e 100644 --- a/x-pack/plugins/ml/public/application/trained_models/models_management/delete_models_modal.tsx +++ b/x-pack/plugins/ml/public/application/trained_models/models_management/delete_models_modal.tsx @@ -58,6 +58,7 @@ export const DeleteModelsModal: FC = ({ modelIds, onClos ); } onClose(true); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [modelIds, trainedModelsApiService]); return canDeleteModel ? ( diff --git a/x-pack/plugins/ml/public/application/trained_models/models_management/expanded_row.tsx b/x-pack/plugins/ml/public/application/trained_models/models_management/expanded_row.tsx index f2aec5b768461..879bed447c864 100644 --- a/x-pack/plugins/ml/public/application/trained_models/models_management/expanded_row.tsx +++ b/x-pack/plugins/ml/public/application/trained_models/models_management/expanded_row.tsx @@ -62,6 +62,7 @@ export function useListItemsFormatter() { model_size_bytes: bytesFormatter, required_native_memory_bytes: bytesFormatter, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); @@ -167,6 +168,7 @@ export const ExpandedRow: FC = ({ item }) => { setModelItems(items); })(); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [stats.deployment_stats] ); diff --git a/x-pack/plugins/ml/public/application/trained_models/models_management/models_list.tsx b/x-pack/plugins/ml/public/application/trained_models/models_management/models_list.tsx index ce003996f2676..8073940aef438 100644 --- a/x-pack/plugins/ml/public/application/trained_models/models_management/models_list.tsx +++ b/x-pack/plugins/ml/public/application/trained_models/models_management/models_list.tsx @@ -133,6 +133,7 @@ export const ModelsList: FC = ({ {} ); const [showTestFlyout, setShowTestFlyout] = useState(null); + // eslint-disable-next-line react-hooks/exhaustive-deps const getUserConfirmation = useMemo(() => getUserConfirmationProvider(overlays, theme), []); const getUserInputThreadingParams = useMemo( @@ -206,6 +207,7 @@ export const ModelsList: FC = ({ ); } setIsLoading(false); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [itemIdToExpandedRowMap]); useEffect( @@ -213,6 +215,7 @@ export const ModelsList: FC = ({ if (!refresh) return; fetchModelsData(); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [refresh] ); @@ -258,6 +261,7 @@ export const ModelsList: FC = ({ ); return false; } + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); /** diff --git a/x-pack/plugins/ml/public/application/trained_models/models_management/test_models/models/inference_input_form.tsx b/x-pack/plugins/ml/public/application/trained_models/models_management/test_models/models/inference_input_form.tsx index 08de66d9a1ba1..a1d24330c1c44 100644 --- a/x-pack/plugins/ml/public/application/trained_models/models_management/test_models/models/inference_input_form.tsx +++ b/x-pack/plugins/ml/public/application/trained_models/models_management/test_models/models/inference_input_form.tsx @@ -32,8 +32,11 @@ export const InferenceInputForm: FC = ({ inferrer }) => { const runningState = useObservable(inferrer.runningState$); const inputText = useObservable(inferrer.inputText$); + // eslint-disable-next-line react-hooks/exhaustive-deps const inputComponent = useMemo(() => inferrer.getInputComponent(), []); + // eslint-disable-next-line react-hooks/exhaustive-deps const outputComponent = useMemo(() => inferrer.getOutputComponent(), []); + // eslint-disable-next-line react-hooks/exhaustive-deps const infoComponent = useMemo(() => inferrer.getInfoComponent(), []); async function run() { diff --git a/x-pack/plugins/ml/public/application/trained_models/models_management/test_models/models/question_answering/question_answering_input.tsx b/x-pack/plugins/ml/public/application/trained_models/models_management/test_models/models/question_answering/question_answering_input.tsx index fffff1b382c76..8f485ac584953 100644 --- a/x-pack/plugins/ml/public/application/trained_models/models_management/test_models/models/question_answering/question_answering_input.tsx +++ b/x-pack/plugins/ml/public/application/trained_models/models_management/test_models/models/question_answering/question_answering_input.tsx @@ -22,6 +22,7 @@ const QuestionInput: FC<{ useEffect(() => { inferrer.questionText$.next(questionText); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [questionText]); const runningState = useObservable(inferrer.runningState$); diff --git a/x-pack/plugins/ml/public/application/trained_models/models_management/test_models/models/text_classification/fill_mask_output.tsx b/x-pack/plugins/ml/public/application/trained_models/models_management/test_models/models/text_classification/fill_mask_output.tsx index 62a5a957f8a38..9c92d6714b613 100644 --- a/x-pack/plugins/ml/public/application/trained_models/models_management/test_models/models/text_classification/fill_mask_output.tsx +++ b/x-pack/plugins/ml/public/application/trained_models/models_management/test_models/models/text_classification/fill_mask_output.tsx @@ -20,6 +20,7 @@ const FillMaskOutput: FC<{ inferrer: FillMaskInference; }> = ({ inferrer }) => { const result = useObservable(inferrer.inferenceResult$); + // eslint-disable-next-line react-hooks/exhaustive-deps const title = useMemo(() => inferrer.predictedValue(), []); if (!result) { diff --git a/x-pack/plugins/ml/public/application/trained_models/models_management/test_models/models/text_classification/zero_shot_classification_input.tsx b/x-pack/plugins/ml/public/application/trained_models/models_management/test_models/models/text_classification/zero_shot_classification_input.tsx index 8c497d6baa9d2..adccbd99e2d75 100644 --- a/x-pack/plugins/ml/public/application/trained_models/models_management/test_models/models/text_classification/zero_shot_classification_input.tsx +++ b/x-pack/plugins/ml/public/application/trained_models/models_management/test_models/models/text_classification/zero_shot_classification_input.tsx @@ -22,6 +22,7 @@ const ClassNameInput: FC<{ useEffect(() => { inferrer.labelsText$.next(labelsText); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [labelsText]); const runningState = useObservable(inferrer.runningState$); diff --git a/x-pack/plugins/ml/public/application/trained_models/models_management/test_models/models/text_input.tsx b/x-pack/plugins/ml/public/application/trained_models/models_management/test_models/models/text_input.tsx index ff0cfd21fb82a..ca4af60e87856 100644 --- a/x-pack/plugins/ml/public/application/trained_models/models_management/test_models/models/text_input.tsx +++ b/x-pack/plugins/ml/public/application/trained_models/models_management/test_models/models/text_input.tsx @@ -20,6 +20,7 @@ export const TextInput: FC<{ useEffect(() => { inferrer.inputText$.next(inputText); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [inputText]); const runningState = useObservable(inferrer.runningState$); diff --git a/x-pack/plugins/ml/public/application/trained_models/nodes_overview/memory_preview_chart.tsx b/x-pack/plugins/ml/public/application/trained_models/nodes_overview/memory_preview_chart.tsx index 3121878adf1ad..2decf3c1d2b1b 100644 --- a/x-pack/plugins/ml/public/application/trained_models/nodes_overview/memory_preview_chart.tsx +++ b/x-pack/plugins/ml/public/application/trained_models/nodes_overview/memory_preview_chart.tsx @@ -66,6 +66,7 @@ export const MemoryPreviewChart: FC = ({ memoryOverview colour: euiPaletteGray(5)[0], }, }), + // eslint-disable-next-line react-hooks/exhaustive-deps [] ); diff --git a/x-pack/plugins/ml/public/application/trained_models/nodes_overview/nodes_list.tsx b/x-pack/plugins/ml/public/application/trained_models/nodes_overview/nodes_list.tsx index 4455e9e2709a1..9e2480f265dd4 100644 --- a/x-pack/plugins/ml/public/application/trained_models/nodes_overview/nodes_list.tsx +++ b/x-pack/plugins/ml/public/application/trained_models/nodes_overview/nodes_list.tsx @@ -84,6 +84,7 @@ export const NodesList: FC = ({ compactView = false }) => { ); setIsLoading(false); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [itemIdToExpandedRowMap]); const toggleDetails = (item: NodeItem) => { @@ -184,6 +185,7 @@ export const NodesList: FC = ({ compactView = false }) => { function updateOnTimerRefresh() { fetchNodesData(); }, + // eslint-disable-next-line react-hooks/exhaustive-deps [refresh] ); diff --git a/x-pack/plugins/ml/public/application/util/url_state.tsx b/x-pack/plugins/ml/public/application/util/url_state.tsx index a31b574681827..7e09942412644 100644 --- a/x-pack/plugins/ml/public/application/util/url_state.tsx +++ b/x-pack/plugins/ml/public/application/util/url_state.tsx @@ -151,6 +151,7 @@ export const UrlStateProvider: FC = ({ children }) => { console.error('Could not save url state', error); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [searchString] ); @@ -170,6 +171,7 @@ export const useUrlState = ( if (typeof fullUrlState === 'object') { return fullUrlState[accessor]; } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [searchString]); const setUrlState = useCallback( @@ -277,6 +279,7 @@ export const usePageUrlState = ( prevPageState.current = result; return result; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [pageState]); const onStateUpdate = useCallback( diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_charts/embeddable_anomaly_charts_container.tsx b/x-pack/plugins/ml/public/embeddables/anomaly_charts/embeddable_anomaly_charts_container.tsx index 85350629263e4..a0275176afa24 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_charts/embeddable_anomaly_charts_container.tsx +++ b/x-pack/plugins/ml/public/embeddables/anomaly_charts/embeddable_anomaly_charts_container.tsx @@ -87,6 +87,7 @@ export const EmbeddableAnomalyChartsContainer: FC { @@ -97,6 +98,7 @@ export const EmbeddableAnomalyChartsContainer: FC { if (Math.abs(chartWidth - e.width) > 20) { diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_charts/use_anomaly_charts_input_resolver.ts b/x-pack/plugins/ml/public/embeddables/anomaly_charts/use_anomaly_charts_input_resolver.ts index 3922932d53373..90d598f3b6853 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_charts/use_anomaly_charts_input_resolver.ts +++ b/x-pack/plugins/ml/public/embeddables/anomaly_charts/use_anomaly_charts_input_resolver.ts @@ -136,20 +136,24 @@ export function useAnomalyChartsInputResolver( return () => { subscription.unsubscribe(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { chartWidth$.next(chartWidth); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [chartWidth]); useEffect(() => { severity$.next(severity); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [severity]); useEffect(() => { if (error) { renderCallbacks.onError(error); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [error]); return { chartsData, isLoading, error }; diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/embeddable_swim_lane_container.tsx b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/embeddable_swim_lane_container.tsx index 03c5cf75672f3..c333bbab7ff9e 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/embeddable_swim_lane_container.tsx +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/embeddable_swim_lane_container.tsx @@ -88,6 +88,7 @@ export const EmbeddableSwimLaneContainer: FC = ( fromPage, interval: swimlaneData?.interval, }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [perPage, fromPage, swimlaneData]); const onCellsSelection = useCallback( @@ -102,6 +103,7 @@ export const EmbeddableSwimLaneContainer: FC = ( }); } }, + // eslint-disable-next-line react-hooks/exhaustive-deps [swimlaneData, perPage, fromPage, setSelectedCells] ); diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/swimlane_input_resolver.ts b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/swimlane_input_resolver.ts index b87783592d6c3..d543ff4cc9bf1 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/swimlane_input_resolver.ts +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/swimlane_input_resolver.ts @@ -78,6 +78,7 @@ export function useSwimlaneInputResolver( return getJobsObservable(embeddableInput$, anomalyDetectorService, setError).pipe( shareReplay(1) ); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const bucketInterval$ = useMemo(() => { @@ -95,6 +96,7 @@ export function useSwimlaneInputResolver( return prev.asSeconds() === curr.asSeconds(); }) ); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const fromPage$ = useMemo(() => new Subject(), []); @@ -107,6 +109,7 @@ export function useSwimlaneInputResolver( dateFormat: uiSettings.get('dateFormat'), 'dateFormat:scaled': uiSettings.get('dateFormat:scaled'), }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { @@ -222,31 +225,37 @@ export function useSwimlaneInputResolver( return () => { subscription.unsubscribe(); }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); useEffect(() => { fromPage$.next(fromPage); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [fromPage]); useEffect(() => { if (perPage === undefined) return; perPage$.next(perPage); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [perPage]); useEffect(() => { chartWidth$.next(chartWidth); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [chartWidth]); useEffect(() => { if (error) { renderCallbacks.onError(error); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [error]); useEffect(() => { if (swimlaneData) { renderCallbacks.onRenderComplete(); } + // eslint-disable-next-line react-hooks/exhaustive-deps }, [swimlaneData]); return [ diff --git a/x-pack/plugins/ml/public/embeddables/common/use_embeddable_execution_context.ts b/x-pack/plugins/ml/public/embeddables/common/use_embeddable_execution_context.ts index 68306c54c8590..6cd15c51594f4 100644 --- a/x-pack/plugins/ml/public/embeddables/common/use_embeddable_execution_context.ts +++ b/x-pack/plugins/ml/public/embeddables/common/use_embeddable_execution_context.ts @@ -42,6 +42,7 @@ export function useEmbeddableExecutionContext( ...parentExecutionContext, child, }; + // eslint-disable-next-line react-hooks/exhaustive-deps }, [parentExecutionContext, id]); useExecutionContext(executionContext, embeddableExecutionContext); diff --git a/x-pack/plugins/ml/public/embeddables/lens/lens_vis_layer_selection_flyout/flyout.tsx b/x-pack/plugins/ml/public/embeddables/lens/lens_vis_layer_selection_flyout/flyout.tsx index 7bbc54d1837a4..38e4bf1f327f1 100644 --- a/x-pack/plugins/ml/public/embeddables/lens/lens_vis_layer_selection_flyout/flyout.tsx +++ b/x-pack/plugins/ml/public/embeddables/lens/lens_vis_layer_selection_flyout/flyout.tsx @@ -49,6 +49,7 @@ export const LensLayerSelectionFlyout: FC = ({ onClose, embeddable }) => console.error('Layers could not be extracted from embeddable', error); onClose(); }); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [data, lens, embeddable]); return ( diff --git a/x-pack/plugins/ml/public/embeddables/lens/lens_vis_layer_selection_flyout/layer/compatible_layer.tsx b/x-pack/plugins/ml/public/embeddables/lens/lens_vis_layer_selection_flyout/layer/compatible_layer.tsx index 342a37fe4b0c0..0e163f207edfb 100644 --- a/x-pack/plugins/ml/public/embeddables/lens/lens_vis_layer_selection_flyout/layer/compatible_layer.tsx +++ b/x-pack/plugins/ml/public/embeddables/lens/lens_vis_layer_selection_flyout/layer/compatible_layer.tsx @@ -84,6 +84,7 @@ export const CompatibleLayer: FC = ({ layer, layerIndex, embeddable }) => data.query.timefilter.timefilter, mlApiServices ), + // eslint-disable-next-line react-hooks/exhaustive-deps [data, uiSettings] ); From 725d1280eab6354560d3c3057caf192c91aa0766 Mon Sep 17 00:00:00 2001 From: Mat Schaffer Date: Tue, 6 Sep 2022 18:11:33 +0900 Subject: [PATCH 18/19] Add a `missing` to our debug query (#140048) --- x-pack/plugins/monitoring/dev_docs/runbook/diagnostic_queries.md | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/monitoring/dev_docs/runbook/diagnostic_queries.md b/x-pack/plugins/monitoring/dev_docs/runbook/diagnostic_queries.md index 507a3495306c8..683fc96beb0f9 100644 --- a/x-pack/plugins/monitoring/dev_docs/runbook/diagnostic_queries.md +++ b/x-pack/plugins/monitoring/dev_docs/runbook/diagnostic_queries.md @@ -16,6 +16,7 @@ POST .monitoring-*,*:.monitoring-*,metrics-*,*:metrics-*/_search "clusters": { "terms": { "field": "cluster_uuid", + "missing": "__standalone_cluster__", "size": 100 }, "aggs": { From a93f5d9986a19277826c9e35a37ccb984caeabcc Mon Sep 17 00:00:00 2001 From: Liza Katz Date: Tue, 6 Sep 2022 12:58:57 +0300 Subject: [PATCH 19/19] Performance journey docs (#140034) * journey docs * link * code review * cc * cc --- .../tutorials/adding_performance_metrics.mdx | 51 ++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/dev_docs/tutorials/adding_performance_metrics.mdx b/dev_docs/tutorials/adding_performance_metrics.mdx index ad74ef83eaf77..56ed044e327df 100644 --- a/dev_docs/tutorials/adding_performance_metrics.mdx +++ b/dev_docs/tutorials/adding_performance_metrics.mdx @@ -37,7 +37,7 @@ Each document in the index has the following structure: "_source": { "timestamp": "2022-08-31T11:29:58.275Z" "event_type": "performance_metric", // All events share a common event type to simplify mapping - "eventName": "dashboard_loaded", // Event name as specified when reporting it + "eventName": APP_ACTION, // Event name as specified when reporting it "duration": 736, // Event duration as specified when reporting it "context": { // Context holds information identifying the deployment, version, application and page that generated the event "version": "8.5.0-SNAPSHOT", @@ -159,6 +159,55 @@ to follow if it's important for you to look inside of a specific event e.g. `pag - **Keep performance in mind**. Reporting the performance of Kibana should never harm its own performance. Avoid sending events too frequently (`onMouseMove`) or adding serialized JSON objects (whole `SavedObjects`) into the meta object. +### Benchmarking performance on CI + +One of the use cases for event based telemetry is benchmarking the performance of features over time. +In order to keep track of their stability, the #kibana-performance team has developed a special set of +functional tests called `Journeys`. These journeys execute a UI workflow and allow the telemetry to be +reported to a cluster where it can then be analysed. + +Those journeys run on the key branches (main, release versions) on dedicated machines to produce results +as stable and reproducible as possible. + +#### Machine specifications + +All benchmarks are run on bare-metal machines with the [following specifications](https://www.hetzner.com/dedicated-rootserver/ex100): + +CPU: Intel® Core™ i9-12900K +RAM: 128 GB +SSD: 1.92 TB Datacenter Gen4 NVMe + +Since the tests are run on a local machine, there is also realistic throttling applied to the network to +simulate real life internet connection. This means that all requests have a [fixed latency and limited bandwidth](https://github.com/elastic/kibana/blob/main/x-pack/test/performance/services/performance.ts#L157). + +#### Journey implementation + +If you would like to keep track of the stability of your events, implement a journey by adding a functional +test to the `x-pack/test/performance/journeys` folder. + +The telemetry reported during the execution of those journeys will be reported to the `telemetry-v2-staging` cluster +alongside with execution context. Use the `context.labels.ciBuildName` label to filter down events to only those originating +from performance runs and visualize the duration of events (or their breakdowns). + +Run the test locally for troubleshooting purposes by running + +``` +node scripts/functional_test_runner --config x-pack/test/performance/journeys/$YOUR_JOURNEY_NAME/config.ts +``` + +#### Analyzing journey results + + - Be sure to narrow your analysis down to performance events by specifying a filter `context.labels.ciBuildName: kibana-single-user-performance`. + Otherwise you might be looking at results originating from different hardware. + - You can look at the results of a specific journey by filtering on `context.labels.journeyName`. + +Please contact the #kibana-performance team if you need more help visualising and tracking the results. + +### Production performance tracking + +All users who are opted in to report telemetry will start reporting event based telemetry as well. +The data is available to be analysed on the production telemetry cluster. + # Analytics Client Holds the public APIs to report events, enrich the events' context and set up the transport mechanisms. Please checkout package documentation to get more information about

Check every, @@ -73,7 +73,7 @@ export class QueryThresholdHelpPopover extends Component<{}, State> { size="s" title={i18n.translate('xpack.stackAlerts.esQuery.ui.thresholdHelp.duplicateMatches', { defaultMessage: - 'If the time window is greater than the check interval and a document matches the query in multiple runs, it is used in only the first threshold calculation.', + "If the 'Exclude the hits from previous rule runs' option is checked and the time window is greater than the check interval, a document that matches the query in multiple runs will be used in only the first threshold calculation.", })} /> diff --git a/x-pack/plugins/stack_alerts/public/alert_types/es_query/types.ts b/x-pack/plugins/stack_alerts/public/alert_types/es_query/types.ts index 8844c9e10c588..1430b8e3076ae 100644 --- a/x-pack/plugins/stack_alerts/public/alert_types/es_query/types.ts +++ b/x-pack/plugins/stack_alerts/public/alert_types/es_query/types.ts @@ -29,6 +29,7 @@ export interface CommonAlertParams extends RuleTypeParams { threshold: number[]; timeWindowSize: number; timeWindowUnit: string; + excludeHitsFromPreviousRun: boolean; } export type EsQueryAlertParams = T extends SearchType.searchSource @@ -40,6 +41,7 @@ export interface OnlyEsQueryAlertParams { index: string[]; timeField: string; } + export interface OnlySearchSourceAlertParams { searchType?: 'searchSource'; searchConfiguration?: SerializedSearchSourceFields; diff --git a/x-pack/plugins/stack_alerts/public/alert_types/es_query/validation.test.ts b/x-pack/plugins/stack_alerts/public/alert_types/es_query/validation.test.ts index 9c485455cf19c..a58cae2f8ac9d 100644 --- a/x-pack/plugins/stack_alerts/public/alert_types/es_query/validation.test.ts +++ b/x-pack/plugins/stack_alerts/public/alert_types/es_query/validation.test.ts @@ -25,6 +25,7 @@ describe('expression params validation', () => { timeWindowUnit: 's', threshold: [0], timeField: '', + excludeHitsFromPreviousRun: true, }; expect(validateExpression(initialParams).errors.index.length).toBeGreaterThan(0); expect(validateExpression(initialParams).errors.index[0]).toBe('Index is required.'); @@ -39,6 +40,7 @@ describe('expression params validation', () => { timeWindowUnit: 's', threshold: [0], timeField: '', + excludeHitsFromPreviousRun: true, }; expect(validateExpression(initialParams).errors.timeField.length).toBeGreaterThan(0); expect(validateExpression(initialParams).errors.timeField[0]).toBe('Time field is required.'); @@ -53,6 +55,7 @@ describe('expression params validation', () => { timeWindowUnit: 's', threshold: [0], timeField: '', + excludeHitsFromPreviousRun: true, }; expect(validateExpression(initialParams).errors.esQuery.length).toBeGreaterThan(0); expect(validateExpression(initialParams).errors.esQuery[0]).toBe('Query must be valid JSON.'); @@ -67,6 +70,7 @@ describe('expression params validation', () => { timeWindowUnit: 's', threshold: [0], timeField: '', + excludeHitsFromPreviousRun: true, }; expect(validateExpression(initialParams).errors.esQuery.length).toBeGreaterThan(0); expect(validateExpression(initialParams).errors.esQuery[0]).toBe(`Query field is required.`); @@ -97,6 +101,7 @@ describe('expression params validation', () => { timeWindowUnit: 's', thresholdComparator: '<', timeField: '', + excludeHitsFromPreviousRun: true, }; expect(validateExpression(initialParams).errors.threshold0.length).toBeGreaterThan(0); expect(validateExpression(initialParams).errors.threshold0[0]).toBe('Threshold 0 is required.'); @@ -112,6 +117,7 @@ describe('expression params validation', () => { timeWindowUnit: 's', thresholdComparator: 'between', timeField: '', + excludeHitsFromPreviousRun: true, }; expect(validateExpression(initialParams).errors.threshold1.length).toBeGreaterThan(0); expect(validateExpression(initialParams).errors.threshold1[0]).toBe('Threshold 1 is required.'); @@ -127,6 +133,7 @@ describe('expression params validation', () => { timeWindowUnit: 's', thresholdComparator: 'between', timeField: '', + excludeHitsFromPreviousRun: true, }; expect(validateExpression(initialParams).errors.threshold1.length).toBeGreaterThan(0); expect(validateExpression(initialParams).errors.threshold1[0]).toBe( @@ -143,6 +150,7 @@ describe('expression params validation', () => { timeWindowUnit: 's', threshold: [0], timeField: '', + excludeHitsFromPreviousRun: true, }; expect(validateExpression(initialParams).errors.size.length).toBeGreaterThan(0); expect(validateExpression(initialParams).errors.size[0]).toBe( @@ -159,6 +167,7 @@ describe('expression params validation', () => { timeWindowUnit: 's', threshold: [0], timeField: '', + excludeHitsFromPreviousRun: true, }; expect(validateExpression(initialParams).errors.size.length).toBeGreaterThan(0); expect(validateExpression(initialParams).errors.size[0]).toBe( @@ -175,6 +184,7 @@ describe('expression params validation', () => { timeWindowUnit: 's', threshold: [0], timeField: '@timestamp', + excludeHitsFromPreviousRun: true, }; expect(validateExpression(initialParams).errors.size.length).toBe(0); expect(hasExpressionValidationErrors(initialParams)).toBe(false); diff --git a/x-pack/plugins/stack_alerts/server/alert_types/es_query/executor.test.ts b/x-pack/plugins/stack_alerts/server/alert_types/es_query/executor.test.ts index 97b02a4dc723e..77a820249d006 100644 --- a/x-pack/plugins/stack_alerts/server/alert_types/es_query/executor.test.ts +++ b/x-pack/plugins/stack_alerts/server/alert_types/es_query/executor.test.ts @@ -25,6 +25,7 @@ describe('es_query executor', () => { index: ['test-index'], timeField: '', searchType: 'esQuery', + excludeHitsFromPreviousRun: true, }; describe('tryToParseAsDate', () => { it.each<[string | number]>([['2019-01-01T00:00:00.000Z'], [1546300800000]])( diff --git a/x-pack/plugins/stack_alerts/server/alert_types/es_query/lib/fetch_es_query.ts b/x-pack/plugins/stack_alerts/server/alert_types/es_query/lib/fetch_es_query.ts index 6a954a8efb396..d6f373feb65f6 100644 --- a/x-pack/plugins/stack_alerts/server/alert_types/es_query/lib/fetch_es_query.ts +++ b/x-pack/plugins/stack_alerts/server/alert_types/es_query/lib/fetch_es_query.ts @@ -33,35 +33,36 @@ export async function fetchEsQuery( dateEnd, } = getSearchParams(params); - const filter = timestamp - ? { - bool: { - filter: [ - query, - { - bool: { - must_not: [ - { - bool: { - filter: [ - { - range: { - [params.timeField]: { - lte: timestamp, - format: 'strict_date_optional_time', + const filter = + timestamp && params.excludeHitsFromPreviousRun + ? { + bool: { + filter: [ + query, + { + bool: { + must_not: [ + { + bool: { + filter: [ + { + range: { + [params.timeField]: { + lte: timestamp, + format: 'strict_date_optional_time', + }, }, }, - }, - ], + ], + }, }, - }, - ], + ], + }, }, - }, - ], - }, - } - : query; + ], + }, + } + : query; const sortedQuery = buildSortedEventsQuery({ index: params.index, diff --git a/x-pack/plugins/stack_alerts/server/alert_types/es_query/lib/fetch_search_source_query.test.ts b/x-pack/plugins/stack_alerts/server/alert_types/es_query/lib/fetch_search_source_query.test.ts index 6b177d1b94a86..127224f1bf1b6 100644 --- a/x-pack/plugins/stack_alerts/server/alert_types/es_query/lib/fetch_search_source_query.test.ts +++ b/x-pack/plugins/stack_alerts/server/alert_types/es_query/lib/fetch_search_source_query.test.ts @@ -37,6 +37,7 @@ const defaultParams: OnlySearchSourceRuleParams = { threshold: [0], searchConfiguration: {}, searchType: 'searchSource', + excludeHitsFromPreviousRun: true, }; describe('fetchSearchSourceQuery', () => { @@ -160,5 +161,38 @@ describe('fetchSearchSourceQuery', () => { } `); }); + + it('does not add time range if excludeHitsFromPreviousRun is false', async () => { + const params = { ...defaultParams, excludeHitsFromPreviousRun: false }; + + const searchSourceInstance = createSearchSourceMock({ index: dataViewMock }); + + const { searchSource } = updateSearchSource( + searchSourceInstance, + params, + '2020-02-09T23:12:41.941Z' + ); + const searchRequest = searchSource.getSearchRequestBody(); + expect(searchRequest.query).toMatchInlineSnapshot(` + Object { + "bool": Object { + "filter": Array [ + Object { + "range": Object { + "time": Object { + "format": "strict_date_optional_time", + "gte": "2020-02-09T23:10:41.941Z", + "lte": "2020-02-09T23:15:41.941Z", + }, + }, + }, + ], + "must": Array [], + "must_not": Array [], + "should": Array [], + }, + } + `); + }); }); }); diff --git a/x-pack/plugins/stack_alerts/server/alert_types/es_query/lib/fetch_search_source_query.ts b/x-pack/plugins/stack_alerts/server/alert_types/es_query/lib/fetch_search_source_query.ts index e3922adf1e15c..81f6248d906ca 100644 --- a/x-pack/plugins/stack_alerts/server/alert_types/es_query/lib/fetch_search_source_query.ts +++ b/x-pack/plugins/stack_alerts/server/alert_types/es_query/lib/fetch_search_source_query.ts @@ -71,13 +71,16 @@ export function updateSearchSource( const dateEnd = timerangeFilter?.query.range[timeFieldName].lte; const filters = [timerangeFilter]; - if (latestTimestamp && latestTimestamp > dateStart) { - // add additional filter for documents with a timestamp greater then - // the timestamp of the previous run, so that those documents are not counted twice - const field = index.fields.find((f) => f.name === timeFieldName); - const addTimeRangeField = buildRangeFilter(field!, { gt: latestTimestamp }, index); - filters.push(addTimeRangeField); + if (params.excludeHitsFromPreviousRun) { + if (latestTimestamp && latestTimestamp > dateStart) { + // add additional filter for documents with a timestamp greater then + // the timestamp of the previous run, so that those documents are not counted twice + const field = index.fields.find((f) => f.name === timeFieldName); + const addTimeRangeField = buildRangeFilter(field!, { gt: latestTimestamp }, index); + filters.push(addTimeRangeField); + } } + const searchSourceChild = searchSource.createChild(); searchSourceChild.setField('filter', filters as Filter[]); searchSourceChild.setField('sort', [{ [timeFieldName]: SortDirection.desc }]); diff --git a/x-pack/plugins/stack_alerts/server/alert_types/es_query/rule_type.test.ts b/x-pack/plugins/stack_alerts/server/alert_types/es_query/rule_type.test.ts index ad3c96c69cde3..ac1dd93e3d563 100644 --- a/x-pack/plugins/stack_alerts/server/alert_types/es_query/rule_type.test.ts +++ b/x-pack/plugins/stack_alerts/server/alert_types/es_query/rule_type.test.ts @@ -147,6 +147,7 @@ describe('ruleType', () => { thresholdComparator: Comparator.BETWEEN, threshold: [0], searchType: 'esQuery', + excludeHitsFromPreviousRun: true, }; const ruleServices: RuleExecutorServicesMock = alertsMock.createRuleExecutorServices(); @@ -177,6 +178,7 @@ describe('ruleType', () => { thresholdComparator: Comparator.GT, threshold: [0], searchType: 'esQuery', + excludeHitsFromPreviousRun: true, }; const ruleServices: RuleExecutorServicesMock = alertsMock.createRuleExecutorServices(); @@ -223,6 +225,7 @@ describe('ruleType', () => { thresholdComparator: Comparator.GT, threshold: [0], searchType: 'esQuery', + excludeHitsFromPreviousRun: true, }; const ruleServices: RuleExecutorServicesMock = alertsMock.createRuleExecutorServices(); @@ -272,6 +275,7 @@ describe('ruleType', () => { thresholdComparator: Comparator.GT, threshold: [0], searchType: 'esQuery', + excludeHitsFromPreviousRun: true, }; const ruleServices: RuleExecutorServicesMock = alertsMock.createRuleExecutorServices(); @@ -315,6 +319,7 @@ describe('ruleType', () => { thresholdComparator: Comparator.GT, threshold: [0], searchType: 'esQuery', + excludeHitsFromPreviousRun: true, }; const ruleServices: RuleExecutorServicesMock = alertsMock.createRuleExecutorServices(); @@ -387,6 +392,7 @@ describe('ruleType', () => { thresholdComparator: Comparator.GT, threshold: [0], searchType: 'esQuery', + excludeHitsFromPreviousRun: true, }; const ruleServices: RuleExecutorServicesMock = alertsMock.createRuleExecutorServices(); @@ -433,6 +439,7 @@ describe('ruleType', () => { thresholdComparator: Comparator.GT, threshold: [0], searchType: 'esQuery', + excludeHitsFromPreviousRun: true, }; const ruleServices: RuleExecutorServicesMock = alertsMock.createRuleExecutorServices(); @@ -502,6 +509,7 @@ describe('ruleType', () => { threshold: [0], searchConfiguration: {}, searchType: 'searchSource', + excludeHitsFromPreviousRun: true, }; afterAll(() => { diff --git a/x-pack/plugins/stack_alerts/server/alert_types/es_query/rule_type_params.test.ts b/x-pack/plugins/stack_alerts/server/alert_types/es_query/rule_type_params.test.ts index 865cf330b1c43..0b90589b0fe4c 100644 --- a/x-pack/plugins/stack_alerts/server/alert_types/es_query/rule_type_params.test.ts +++ b/x-pack/plugins/stack_alerts/server/alert_types/es_query/rule_type_params.test.ts @@ -24,6 +24,7 @@ const DefaultParams: Writable> = { thresholdComparator: Comparator.GT, threshold: [0], searchType: 'esQuery', + excludeHitsFromPreviousRun: true, }; describe('alertType Params validate()', () => { @@ -216,6 +217,18 @@ describe('alertType Params validate()', () => { ); }); + it('fails for invalid excludeHitsFromPreviousRun', async () => { + params.excludeHitsFromPreviousRun = ''; + expect(onValidate()).toThrowErrorMatchingInlineSnapshot( + `"[excludeHitsFromPreviousRun]: expected value of type [boolean] but got [string]"` + ); + }); + + it('uses default value "true" if excludeHitsFromPreviousRun is undefined', async () => { + params.excludeHitsFromPreviousRun = undefined; + expect(onValidate()).not.toThrow(); + }); + function onValidate(): () => void { return () => validate(); } diff --git a/x-pack/plugins/stack_alerts/server/alert_types/es_query/rule_type_params.ts b/x-pack/plugins/stack_alerts/server/alert_types/es_query/rule_type_params.ts index a705e84ae54c7..941a45d3a9a1e 100644 --- a/x-pack/plugins/stack_alerts/server/alert_types/es_query/rule_type_params.ts +++ b/x-pack/plugins/stack_alerts/server/alert_types/es_query/rule_type_params.ts @@ -31,6 +31,7 @@ export type EsQueryRuleParamsExtractedParams = Omit { @@ -603,6 +601,102 @@ export default function ruleTests({ getService }: FtrProviderContext) { }) ); + describe('excludeHitsFromPreviousRun', () => { + it('excludes hits from the previous rule run when excludeHitsFromPreviousRun is true', async () => { + endDate = new Date().toISOString(); + + await createEsDocumentsInGroups(ES_GROUPS_TO_WRITE, endDate); + + await createRule({ + name: 'always fire', + esQuery: `{\n \"query\":{\n \"match_all\" : {}\n }\n}`, + size: 100, + thresholdComparator: '>', + threshold: [0], + timeWindowSize: 300, + excludeHitsFromPreviousRun: true, + }); + + const docs = await waitForDocs(2); + + expect(docs[0]._source.hits.length).greaterThan(0); + expect(docs[0]._source.params.message).to.match(/rule 'always fire' is active/); + + expect(docs[1]._source.hits.length).to.be(0); + expect(docs[1]._source.params.message).to.match(/rule 'always fire' is recovered/); + }); + + it('excludes hits from the previous rule run when excludeHitsFromPreviousRun is undefined', async () => { + endDate = new Date().toISOString(); + + await createEsDocumentsInGroups(ES_GROUPS_TO_WRITE, endDate); + + await createRule({ + name: 'always fire', + esQuery: `{\n \"query\":{\n \"match_all\" : {}\n }\n}`, + size: 100, + thresholdComparator: '>', + threshold: [0], + timeWindowSize: 300, + }); + + const docs = await waitForDocs(2); + + expect(docs[0]._source.hits.length).greaterThan(0); + expect(docs[0]._source.params.message).to.match(/rule 'always fire' is active/); + + expect(docs[1]._source.hits.length).to.be(0); + expect(docs[1]._source.params.message).to.match(/rule 'always fire' is recovered/); + }); + + it('does not exclude hits from the previous rule run when excludeHitsFromPreviousRun is false', async () => { + endDate = new Date().toISOString(); + + await createEsDocumentsInGroups(ES_GROUPS_TO_WRITE, endDate); + + await createRule({ + name: 'always fire', + esQuery: `{\n \"query\":{\n \"match_all\" : {}\n }\n}`, + size: 100, + thresholdComparator: '>', + threshold: [0], + timeWindowSize: 300, + excludeHitsFromPreviousRun: false, + }); + + const docs = await waitForDocs(2); + + expect(docs[0]._source.hits.length).greaterThan(0); + expect(docs[0]._source.params.message).to.match(/rule 'always fire' is active/); + + expect(docs[1]._source.hits.length).greaterThan(0); + expect(docs[1]._source.params.message).to.match(/rule 'always fire' is active/); + }); + }); + + async function waitForDocs(count: number): Promise { + return await esTestIndexToolOutput.waitForDocs( + ES_TEST_INDEX_SOURCE, + ES_TEST_INDEX_REFERENCE, + count + ); + } + + interface CreateRuleParams { + name: string; + size: number; + thresholdComparator: string; + threshold: number[]; + timeWindowSize?: number; + esQuery?: string; + timeField?: string; + searchConfiguration?: unknown; + searchType?: 'searchSource'; + notifyWhen?: string; + indexName?: string; + excludeHitsFromPreviousRun?: boolean; + } + async function createRule(params: CreateRuleParams): Promise { const action = { id: connectorId, @@ -676,6 +770,9 @@ export default function ruleTests({ getService }: FtrProviderContext) { thresholdComparator: params.thresholdComparator, threshold: params.threshold, searchType: params.searchType, + ...(params.excludeHitsFromPreviousRun !== undefined && { + excludeHitsFromPreviousRun: params.excludeHitsFromPreviousRun, + }), ...ruleParams, }, }) From e1aba237a05d1d281bd5a3d3afe10feeeb140d69 Mon Sep 17 00:00:00 2001 From: Nav <13634519+navarone-feekery@users.noreply.github.com> Date: Mon, 5 Sep 2022 12:21:59 +0100 Subject: [PATCH 03/19] [Enterprise Search] Register crawlers as connectors upon creation (#139651) --- .../create_crawler_index_api_logic.test.ts | 5 +-- .../server/lib/connectors/add_connector.ts | 3 +- .../server/lib/indices/delete_index.test.ts | 35 +++++++++++++++++ .../server/lib/indices/delete_index.ts | 12 ++++++ .../enterprise_search/crawler/crawler.test.ts | 2 +- .../enterprise_search/crawler/crawler.ts | 39 +++++++++++++++---- 6 files changed, 84 insertions(+), 12 deletions(-) create mode 100644 x-pack/plugins/enterprise_search/server/lib/indices/delete_index.test.ts create mode 100644 x-pack/plugins/enterprise_search/server/lib/indices/delete_index.ts diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/crawler/create_crawler_index_api_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/crawler/create_crawler_index_api_logic.test.ts index dbb4e4939188b..d052fa0ead6ed 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/crawler/create_crawler_index_api_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/crawler/create_crawler_index_api_logic.test.ts @@ -20,8 +20,7 @@ describe('CreateCrawlerIndexApiLogic', () => { it('calls correct api', async () => { const indexName = 'elastic-co-crawler'; const language = 'Universal'; - const promise = Promise.resolve({ created: true }); - http.post.mockReturnValue(promise); + http.post.mockReturnValue(Promise.resolve({ created: indexName })); const result = createCrawlerIndex({ indexName, language }); await nextTick(); @@ -29,7 +28,7 @@ describe('CreateCrawlerIndexApiLogic', () => { expect(http.post).toHaveBeenCalledWith('/internal/enterprise_search/crawler', { body: JSON.stringify({ index_name: indexName, language }), }); - await expect(result).resolves.toEqual({ created: true }); + await expect(result).resolves.toEqual({ created: indexName }); }); }); }); diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.ts index cf41de6030d4b..f673a98a987dd 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.ts +++ b/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.ts @@ -67,6 +67,7 @@ export const addConnector = async ( index_name: string; is_native: boolean; language: string | null; + service_type?: string | null; } ): Promise<{ id: string; index_name: string }> => { const document: ConnectorDocument = { @@ -81,7 +82,7 @@ export const addConnector = async ( last_synced: null, name: input.index_name.startsWith('search-') ? input.index_name.substring(7) : input.index_name, scheduling: { enabled: false, interval: '0 0 0 * * ?' }, - service_type: null, + service_type: input.service_type || null, status: ConnectorStatus.CREATED, sync_now: false, }; diff --git a/x-pack/plugins/enterprise_search/server/lib/indices/delete_index.test.ts b/x-pack/plugins/enterprise_search/server/lib/indices/delete_index.test.ts new file mode 100644 index 0000000000000..cb2c8e02ea521 --- /dev/null +++ b/x-pack/plugins/enterprise_search/server/lib/indices/delete_index.test.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { IScopedClusterClient } from '@kbn/core/server'; + +import { deleteIndex } from './delete_index'; + +describe('deleteIndex lib function', () => { + const mockClient = { + asCurrentUser: { + indices: { + delete: jest.fn(), + }, + }, + asInternalUser: {}, + }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should delete index', async () => { + mockClient.asCurrentUser.indices.delete.mockImplementation(() => true); + await expect( + deleteIndex(mockClient as unknown as IScopedClusterClient, 'indexName') + ).resolves.toEqual(true); + expect(mockClient.asCurrentUser.indices.delete).toHaveBeenCalledWith({ + index: 'indexName', + }); + }); +}); diff --git a/x-pack/plugins/enterprise_search/server/lib/indices/delete_index.ts b/x-pack/plugins/enterprise_search/server/lib/indices/delete_index.ts new file mode 100644 index 0000000000000..760fcd7caef6f --- /dev/null +++ b/x-pack/plugins/enterprise_search/server/lib/indices/delete_index.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { IScopedClusterClient } from '@kbn/core/server'; + +export const deleteIndex = async (client: IScopedClusterClient, index: string) => { + return await client.asCurrentUser.indices.delete({ index }); +}; diff --git a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.test.ts b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.test.ts index 03b02fb0e2841..3947e569349c8 100644 --- a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.test.ts +++ b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.test.ts @@ -42,7 +42,7 @@ describe('crawler routes', () => { }); it('fails validation without language', () => { - const request = { body: { index_name: 'index-ame' } }; + const request = { body: { index_name: 'index-name' } }; mockRouter.shouldThrow(request); }); }); diff --git a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.ts b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.ts index 41a00607cfc25..38e973f7305ad 100644 --- a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.ts +++ b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/crawler/crawler.ts @@ -8,10 +8,14 @@ import { schema } from '@kbn/config-schema'; import { i18n } from '@kbn/i18n'; +import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../../common/constants'; + import { ErrorCode } from '../../../../common/types/error_codes'; +import { addConnector } from '../../../lib/connectors/add_connector'; +import { deleteConnectorById } from '../../../lib/connectors/delete_connector'; import { fetchConnectorByIndexName } from '../../../lib/connectors/fetch_connectors'; import { fetchCrawlerByIndexName } from '../../../lib/crawler/fetch_crawlers'; - +import { deleteIndex } from '../../../lib/indices/delete_index'; import { RouteDependencies } from '../../../plugin'; import { createError } from '../../../utils/create_error'; import { elasticsearchErrorHandler } from '../../../utils/elasticsearch_error_handler'; @@ -34,12 +38,18 @@ export function registerCrawlerRoutes(routeDependencies: RouteDependencies) { }, }, elasticsearchErrorHandler(log, async (context, request, response) => { + const connParams = { + delete_existing_connector: true, + index_name: request.body.index_name, + is_native: true, + language: request.body.language, + service_type: ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE, + }; const { client } = (await context.core).elasticsearch; const indexExists = await client.asCurrentUser.indices.exists({ index: request.body.index_name, }); - if (indexExists) { return createError({ errorCode: ErrorCode.INDEX_ALREADY_EXISTS, @@ -55,7 +65,6 @@ export function registerCrawlerRoutes(routeDependencies: RouteDependencies) { } const crawler = await fetchCrawlerByIndexName(client, request.body.index_name); - if (crawler) { return createError({ errorCode: ErrorCode.CRAWLER_ALREADY_EXISTS, @@ -71,7 +80,6 @@ export function registerCrawlerRoutes(routeDependencies: RouteDependencies) { } const connector = await fetchConnectorByIndexName(client, request.body.index_name); - if (connector) { return createError({ errorCode: ErrorCode.CONNECTOR_DOCUMENT_ALREADY_EXISTS, @@ -86,9 +94,26 @@ export function registerCrawlerRoutes(routeDependencies: RouteDependencies) { }); } - return enterpriseSearchRequestHandler.createRequest({ - path: '/api/ent/v1/internal/indices', - })(context, request, response); + try { + await addConnector(client, connParams); + const res = await enterpriseSearchRequestHandler.createRequest({ + path: '/api/ent/v1/internal/indices', + })(context, request, response); + + if (res.status !== 200) { + throw new Error(res.payload.message); + } + return res; + } catch (error) { + // clean up connector index if it was created + const createdConnector = await fetchConnectorByIndexName(client, request.body.index_name); + if (createdConnector) { + await deleteConnectorById(client, createdConnector.id); + await deleteIndex(client, createdConnector.index_name); + } + + throw error; + } }) ); From 4d15bb1d346b2a612f6d09f95f928d98b1028ab5 Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Mon, 5 Sep 2022 14:10:48 +0200 Subject: [PATCH 04/19] Migrate server-side usageData service to packages (#139844) * create empty packages * moving the files * adapt usages * fix more usages * address NIT --- package.json | 4 + packages/BUILD.bazel | 4 + .../BUILD.bazel | 130 ++++++++++++++++++ .../core-usage-data-server-internal/README.md | 3 + .../core-usage-data-server-internal/index.ts | 10 ++ .../jest.config.js | 13 ++ .../package.json | 8 ++ .../src}/core_usage_data_service.test.ts | 0 .../src}/core_usage_data_service.ts | 2 +- .../src}/core_usage_stats_client.test.ts | 3 +- .../src}/core_usage_stats_client.ts | 3 +- .../src/index.ts | 10 ++ .../src}/is_configured.test.ts | 0 .../src}/is_configured.ts | 0 .../src/saved_objects}/core_usage_stats.ts | 0 .../src/saved_objects/index.ts | 9 ++ .../src/saved_objects}/migrations.test.ts | 0 .../src/saved_objects}/migrations.ts | 0 .../tsconfig.json | 17 +++ .../core-usage-data-server-mocks/BUILD.bazel | 110 +++++++++++++++ .../core-usage-data-server-mocks/README.md | 5 + .../core-usage-data-server-mocks/index.ts | 9 ++ .../jest.config.js | 13 ++ .../core-usage-data-server-mocks/package.json | 8 ++ .../src}/core_usage_data_service.mock.ts | 2 +- .../src}/core_usage_stats_client.mock.ts | 4 +- .../core-usage-data-server-mocks/src/index.ts | 10 ++ .../tsconfig.json | 17 +++ src/core/server/core_usage_data/index.ts | 46 ------- src/core/server/index.ts | 30 ++-- .../saved_objects/routes/bulk_create.test.ts | 12 +- .../saved_objects/routes/bulk_get.test.ts | 12 +- .../saved_objects/routes/bulk_resolve.test.ts | 12 +- .../saved_objects/routes/bulk_update.test.ts | 12 +- .../saved_objects/routes/create.test.ts | 10 +- .../saved_objects/routes/delete.test.ts | 12 +- .../saved_objects/routes/export.test.ts | 10 +- .../saved_objects/routes/find.test.ts | 12 +- .../saved_objects/routes/get.test.ts | 10 +- .../saved_objects/routes/import.test.ts | 12 +- .../legacy_import_export/export.test.ts | 10 +- .../legacy_import_export/import.test.ts | 10 +- .../saved_objects/routes/resolve.test.ts | 10 +- .../routes/resolve_import_errors.test.ts | 12 +- .../saved_objects/routes/update.test.ts | 12 +- src/core/server/internal_types.ts | 5 +- src/core/server/mocks.ts | 5 +- src/core/server/server.ts | 2 +- src/core/server/status/status_service.test.ts | 2 +- src/core/server/status/status_service.ts | 2 +- yarn.lock | 16 +++ 51 files changed, 519 insertions(+), 151 deletions(-) create mode 100644 packages/core/usage-data/core-usage-data-server-internal/BUILD.bazel create mode 100644 packages/core/usage-data/core-usage-data-server-internal/README.md create mode 100644 packages/core/usage-data/core-usage-data-server-internal/index.ts create mode 100644 packages/core/usage-data/core-usage-data-server-internal/jest.config.js create mode 100644 packages/core/usage-data/core-usage-data-server-internal/package.json rename {src/core/server/core_usage_data => packages/core/usage-data/core-usage-data-server-internal/src}/core_usage_data_service.test.ts (100%) rename {src/core/server/core_usage_data => packages/core/usage-data/core-usage-data-server-internal/src}/core_usage_data_service.ts (99%) rename {src/core/server/core_usage_data => packages/core/usage-data/core-usage-data-server-internal/src}/core_usage_stats_client.test.ts (99%) rename {src/core/server/core_usage_data => packages/core/usage-data/core-usage-data-server-internal/src}/core_usage_stats_client.ts (98%) create mode 100644 packages/core/usage-data/core-usage-data-server-internal/src/index.ts rename {src/core/server/core_usage_data => packages/core/usage-data/core-usage-data-server-internal/src}/is_configured.test.ts (100%) rename {src/core/server/core_usage_data => packages/core/usage-data/core-usage-data-server-internal/src}/is_configured.ts (100%) rename {src/core/server/core_usage_data => packages/core/usage-data/core-usage-data-server-internal/src/saved_objects}/core_usage_stats.ts (100%) create mode 100644 packages/core/usage-data/core-usage-data-server-internal/src/saved_objects/index.ts rename {src/core/server/core_usage_data => packages/core/usage-data/core-usage-data-server-internal/src/saved_objects}/migrations.test.ts (100%) rename {src/core/server/core_usage_data => packages/core/usage-data/core-usage-data-server-internal/src/saved_objects}/migrations.ts (100%) create mode 100644 packages/core/usage-data/core-usage-data-server-internal/tsconfig.json create mode 100644 packages/core/usage-data/core-usage-data-server-mocks/BUILD.bazel create mode 100644 packages/core/usage-data/core-usage-data-server-mocks/README.md create mode 100644 packages/core/usage-data/core-usage-data-server-mocks/index.ts create mode 100644 packages/core/usage-data/core-usage-data-server-mocks/jest.config.js create mode 100644 packages/core/usage-data/core-usage-data-server-mocks/package.json rename {src/core/server/core_usage_data => packages/core/usage-data/core-usage-data-server-mocks/src}/core_usage_data_service.mock.ts (98%) rename {src/core/server/core_usage_data => packages/core/usage-data/core-usage-data-server-mocks/src}/core_usage_stats_client.mock.ts (91%) create mode 100644 packages/core/usage-data/core-usage-data-server-mocks/src/index.ts create mode 100644 packages/core/usage-data/core-usage-data-server-mocks/tsconfig.json delete mode 100644 src/core/server/core_usage_data/index.ts diff --git a/package.json b/package.json index c2c7469a58eaa..99ccae8e9fcb8 100644 --- a/package.json +++ b/package.json @@ -279,6 +279,8 @@ "@kbn/core-ui-settings-common": "link:bazel-bin/packages/core/ui-settings/core-ui-settings-common", "@kbn/core-usage-data-base-server-internal": "link:bazel-bin/packages/core/usage-data/core-usage-data-base-server-internal", "@kbn/core-usage-data-server": "link:bazel-bin/packages/core/usage-data/core-usage-data-server", + "@kbn/core-usage-data-server-internal": "link:bazel-bin/packages/core/usage-data/core-usage-data-server-internal", + "@kbn/core-usage-data-server-mocks": "link:bazel-bin/packages/core/usage-data/core-usage-data-server-mocks", "@kbn/crypto": "link:bazel-bin/packages/kbn-crypto", "@kbn/crypto-browser": "link:bazel-bin/packages/kbn-crypto-browser", "@kbn/datemath": "link:bazel-bin/packages/kbn-datemath", @@ -962,6 +964,8 @@ "@types/kbn__core-ui-settings-common": "link:bazel-bin/packages/core/ui-settings/core-ui-settings-common/npm_module_types", "@types/kbn__core-usage-data-base-server-internal": "link:bazel-bin/packages/core/usage-data/core-usage-data-base-server-internal/npm_module_types", "@types/kbn__core-usage-data-server": "link:bazel-bin/packages/core/usage-data/core-usage-data-server/npm_module_types", + "@types/kbn__core-usage-data-server-internal": "link:bazel-bin/packages/core/usage-data/core-usage-data-server-internal/npm_module_types", + "@types/kbn__core-usage-data-server-mocks": "link:bazel-bin/packages/core/usage-data/core-usage-data-server-mocks/npm_module_types", "@types/kbn__crypto": "link:bazel-bin/packages/kbn-crypto/npm_module_types", "@types/kbn__crypto-browser": "link:bazel-bin/packages/kbn-crypto-browser/npm_module_types", "@types/kbn__datemath": "link:bazel-bin/packages/kbn-datemath/npm_module_types", diff --git a/packages/BUILD.bazel b/packages/BUILD.bazel index d8076e30d463c..79c8384b9fdaf 100644 --- a/packages/BUILD.bazel +++ b/packages/BUILD.bazel @@ -144,6 +144,8 @@ filegroup( "//packages/core/ui-settings/core-ui-settings-common:build", "//packages/core/usage-data/core-usage-data-base-server-internal:build", "//packages/core/usage-data/core-usage-data-server:build", + "//packages/core/usage-data/core-usage-data-server-internal:build", + "//packages/core/usage-data/core-usage-data-server-mocks:build", "//packages/home/sample_data_card:build", "//packages/home/sample_data_tab:build", "//packages/home/sample_data_types:build", @@ -445,6 +447,8 @@ filegroup( "//packages/core/ui-settings/core-ui-settings-common:build_types", "//packages/core/usage-data/core-usage-data-base-server-internal:build_types", "//packages/core/usage-data/core-usage-data-server:build_types", + "//packages/core/usage-data/core-usage-data-server-internal:build_types", + "//packages/core/usage-data/core-usage-data-server-mocks:build_types", "//packages/home/sample_data_card:build_types", "//packages/home/sample_data_tab:build_types", "//packages/kbn-ace:build_types", diff --git a/packages/core/usage-data/core-usage-data-server-internal/BUILD.bazel b/packages/core/usage-data/core-usage-data-server-internal/BUILD.bazel new file mode 100644 index 0000000000000..e8ffc9ba8ff47 --- /dev/null +++ b/packages/core/usage-data/core-usage-data-server-internal/BUILD.bazel @@ -0,0 +1,130 @@ +load("@npm//@bazel/typescript:index.bzl", "ts_config") +load("@build_bazel_rules_nodejs//:index.bzl", "js_library") +load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", "ts_project") + +PKG_DIRNAME = "core-usage-data-server-internal" +PKG_REQUIRE_NAME = "@kbn/core-usage-data-server-internal" + +SOURCE_FILES = glob( + [ + "**/*.ts", + ], + exclude = [ + "**/*.config.js", + "**/*.mock.*", + "**/*.test.*", + "**/*.stories.*", + "**/__snapshots__/**", + "**/integration_tests/**", + "**/mocks/**", + "**/scripts/**", + "**/storybook/**", + "**/test_fixtures/**", + "**/test_helpers/**", + ], +) + +SRCS = SOURCE_FILES + +filegroup( + name = "srcs", + srcs = SRCS, +) + +NPM_MODULE_EXTRA_FILES = [ + "package.json", +] + +RUNTIME_DEPS = [ + "@npm//lodash", + "@npm//rxjs", + "@npm//@elastic/elasticsearch", + "//packages/kbn-config", + "//packages/core/saved-objects/core-saved-objects-base-server-internal", + "//packages/core/saved-objects/core-saved-objects-utils-server", + "//packages/core/usage-data/core-usage-data-base-server-internal", +] + +TYPES_DEPS = [ + "@npm//@types/node", + "@npm//@types/jest", + "@npm//lodash", + "@npm//rxjs", + "@npm//@elastic/elasticsearch", + "//packages/kbn-config:npm_module_types", + "//packages/kbn-logging:npm_module_types", + "//packages/core/base/core-base-server-internal:npm_module_types", + "//packages/core/logging/core-logging-server-internal:npm_module_types", + "//packages/core/http/core-http-server:npm_module_types", + "//packages/core/http/core-http-server-internal:npm_module_types", + "//packages/core/elasticsearch/core-elasticsearch-server:npm_module_types", + "//packages/core/elasticsearch/core-elasticsearch-server-internal:npm_module_types", + "//packages/core/metrics/core-metrics-server:npm_module_types", + "//packages/core/saved-objects/core-saved-objects-server:npm_module_types", + "//packages/core/saved-objects/core-saved-objects-api-server:npm_module_types", + "//packages/core/saved-objects/core-saved-objects-base-server-internal:npm_module_types", + "//packages/core/saved-objects/core-saved-objects-utils-server:npm_module_types", + "//packages/core/usage-data/core-usage-data-server:npm_module_types", + "//packages/core/usage-data/core-usage-data-base-server-internal:npm_module_types", +] + +jsts_transpiler( + name = "target_node", + srcs = SRCS, + build_pkg_name = package_name(), +) + +ts_config( + name = "tsconfig", + src = "tsconfig.json", + deps = [ + "//:tsconfig.base.json", + "//:tsconfig.bazel.json", + ], +) + +ts_project( + name = "tsc_types", + args = ['--pretty'], + srcs = SRCS, + deps = TYPES_DEPS, + declaration = True, + declaration_map = True, + emit_declaration_only = True, + out_dir = "target_types", + tsconfig = ":tsconfig", +) + +js_library( + name = PKG_DIRNAME, + srcs = NPM_MODULE_EXTRA_FILES, + deps = RUNTIME_DEPS + [":target_node"], + package_name = PKG_REQUIRE_NAME, + visibility = ["//visibility:public"], +) + +pkg_npm( + name = "npm_module", + deps = [":" + PKG_DIRNAME], +) + +filegroup( + name = "build", + srcs = [":npm_module"], + visibility = ["//visibility:public"], +) + +pkg_npm_types( + name = "npm_module_types", + srcs = SRCS, + deps = [":tsc_types"], + package_name = PKG_REQUIRE_NAME, + tsconfig = ":tsconfig", + visibility = ["//visibility:public"], +) + +filegroup( + name = "build_types", + srcs = [":npm_module_types"], + visibility = ["//visibility:public"], +) diff --git a/packages/core/usage-data/core-usage-data-server-internal/README.md b/packages/core/usage-data/core-usage-data-server-internal/README.md new file mode 100644 index 0000000000000..79b416bf404b1 --- /dev/null +++ b/packages/core/usage-data/core-usage-data-server-internal/README.md @@ -0,0 +1,3 @@ +# @kbn/core-usage-data-server-internal + +This package contains the internal types and implementation for Core's server-side `usage-data` domain. diff --git a/packages/core/usage-data/core-usage-data-server-internal/index.ts b/packages/core/usage-data/core-usage-data-server-internal/index.ts new file mode 100644 index 0000000000000..c05d275d59c0a --- /dev/null +++ b/packages/core/usage-data/core-usage-data-server-internal/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export type { InternalCoreUsageDataSetup } from '@kbn/core-usage-data-base-server-internal'; +export { CoreUsageDataService, CoreUsageStatsClient } from './src'; diff --git a/packages/core/usage-data/core-usage-data-server-internal/jest.config.js b/packages/core/usage-data/core-usage-data-server-internal/jest.config.js new file mode 100644 index 0000000000000..f467993606481 --- /dev/null +++ b/packages/core/usage-data/core-usage-data-server-internal/jest.config.js @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +module.exports = { + preset: '@kbn/test/jest_node', + rootDir: '../../../..', + roots: ['/packages/core/usage-data/core-usage-data-server-internal'], +}; diff --git a/packages/core/usage-data/core-usage-data-server-internal/package.json b/packages/core/usage-data/core-usage-data-server-internal/package.json new file mode 100644 index 0000000000000..ed9ef4ee6838f --- /dev/null +++ b/packages/core/usage-data/core-usage-data-server-internal/package.json @@ -0,0 +1,8 @@ +{ + "name": "@kbn/core-usage-data-server-internal", + "private": true, + "version": "1.0.0", + "main": "./target_node/index.js", + "author": "Kibana Core", + "license": "SSPL-1.0 OR Elastic License 2.0" +} diff --git a/src/core/server/core_usage_data/core_usage_data_service.test.ts b/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.test.ts similarity index 100% rename from src/core/server/core_usage_data/core_usage_data_service.test.ts rename to packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.test.ts diff --git a/src/core/server/core_usage_data/core_usage_data_service.ts b/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts similarity index 99% rename from src/core/server/core_usage_data/core_usage_data_service.ts rename to packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts index da0393d937663..cc969ebbddab2 100644 --- a/src/core/server/core_usage_data/core_usage_data_service.ts +++ b/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_data_service.ts @@ -43,7 +43,7 @@ import type { SavedObjectTypeRegistry } from '@kbn/core-saved-objects-base-serve import type { SavedObjectsServiceStart } from '@kbn/core-saved-objects-server'; import { isConfigured } from './is_configured'; -import { coreUsageStatsType } from './core_usage_stats'; +import { coreUsageStatsType } from './saved_objects'; import { CoreUsageStatsClient } from './core_usage_stats_client'; export type ExposedConfigsToUsage = Map>; diff --git a/src/core/server/core_usage_data/core_usage_stats_client.test.ts b/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_stats_client.test.ts similarity index 99% rename from src/core/server/core_usage_data/core_usage_stats_client.test.ts rename to packages/core/usage-data/core-usage-data-server-internal/src/core_usage_stats_client.test.ts index a06a239217601..f00341fdad0a7 100644 --- a/src/core/server/core_usage_data/core_usage_stats_client.test.ts +++ b/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_stats_client.test.ts @@ -6,7 +6,8 @@ * Side Public License, v 1. */ -import { httpServerMock, httpServiceMock, savedObjectsRepositoryMock } from '../mocks'; +import { httpServerMock, httpServiceMock } from '@kbn/core-http-server-mocks'; +import { savedObjectsRepositoryMock } from '@kbn/core-saved-objects-api-server-mocks'; import { CORE_USAGE_STATS_TYPE, CORE_USAGE_STATS_ID, diff --git a/src/core/server/core_usage_data/core_usage_stats_client.ts b/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_stats_client.ts similarity index 98% rename from src/core/server/core_usage_data/core_usage_stats_client.ts rename to packages/core/usage-data/core-usage-data-server-internal/src/core_usage_stats_client.ts index f7c5709afa52d..49c7333bea772 100644 --- a/src/core/server/core_usage_data/core_usage_stats_client.ts +++ b/packages/core/usage-data/core-usage-data-server-internal/src/core_usage_stats_client.ts @@ -6,6 +6,8 @@ * Side Public License, v 1. */ +import type { KibanaRequest, IBasePath } from '@kbn/core-http-server'; +import type { ISavedObjectsRepository } from '@kbn/core-saved-objects-api-server'; import { DEFAULT_NAMESPACE_STRING } from '@kbn/core-saved-objects-utils-server'; import type { CoreUsageStats } from '@kbn/core-usage-data-server'; import { @@ -18,7 +20,6 @@ import { CORE_USAGE_STATS_ID, REPOSITORY_RESOLVE_OUTCOME_STATS, } from '@kbn/core-usage-data-base-server-internal'; -import { ISavedObjectsRepository, KibanaRequest, IBasePath } from '..'; export const BULK_CREATE_STATS_PREFIX = 'apiCalls.savedObjectsBulkCreate'; export const BULK_GET_STATS_PREFIX = 'apiCalls.savedObjectsBulkGet'; diff --git a/packages/core/usage-data/core-usage-data-server-internal/src/index.ts b/packages/core/usage-data/core-usage-data-server-internal/src/index.ts new file mode 100644 index 0000000000000..e686ddce4baac --- /dev/null +++ b/packages/core/usage-data/core-usage-data-server-internal/src/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { CoreUsageDataService } from './core_usage_data_service'; +export { CoreUsageStatsClient } from './core_usage_stats_client'; diff --git a/src/core/server/core_usage_data/is_configured.test.ts b/packages/core/usage-data/core-usage-data-server-internal/src/is_configured.test.ts similarity index 100% rename from src/core/server/core_usage_data/is_configured.test.ts rename to packages/core/usage-data/core-usage-data-server-internal/src/is_configured.test.ts diff --git a/src/core/server/core_usage_data/is_configured.ts b/packages/core/usage-data/core-usage-data-server-internal/src/is_configured.ts similarity index 100% rename from src/core/server/core_usage_data/is_configured.ts rename to packages/core/usage-data/core-usage-data-server-internal/src/is_configured.ts diff --git a/src/core/server/core_usage_data/core_usage_stats.ts b/packages/core/usage-data/core-usage-data-server-internal/src/saved_objects/core_usage_stats.ts similarity index 100% rename from src/core/server/core_usage_data/core_usage_stats.ts rename to packages/core/usage-data/core-usage-data-server-internal/src/saved_objects/core_usage_stats.ts diff --git a/packages/core/usage-data/core-usage-data-server-internal/src/saved_objects/index.ts b/packages/core/usage-data/core-usage-data-server-internal/src/saved_objects/index.ts new file mode 100644 index 0000000000000..5b1d1852fed06 --- /dev/null +++ b/packages/core/usage-data/core-usage-data-server-internal/src/saved_objects/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { coreUsageStatsType } from './core_usage_stats'; diff --git a/src/core/server/core_usage_data/migrations.test.ts b/packages/core/usage-data/core-usage-data-server-internal/src/saved_objects/migrations.test.ts similarity index 100% rename from src/core/server/core_usage_data/migrations.test.ts rename to packages/core/usage-data/core-usage-data-server-internal/src/saved_objects/migrations.test.ts diff --git a/src/core/server/core_usage_data/migrations.ts b/packages/core/usage-data/core-usage-data-server-internal/src/saved_objects/migrations.ts similarity index 100% rename from src/core/server/core_usage_data/migrations.ts rename to packages/core/usage-data/core-usage-data-server-internal/src/saved_objects/migrations.ts diff --git a/packages/core/usage-data/core-usage-data-server-internal/tsconfig.json b/packages/core/usage-data/core-usage-data-server-internal/tsconfig.json new file mode 100644 index 0000000000000..71bb40fe57f3f --- /dev/null +++ b/packages/core/usage-data/core-usage-data-server-internal/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "../../../../tsconfig.bazel.json", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "emitDeclarationOnly": true, + "outDir": "target_types", + "stripInternal": false, + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + ] +} diff --git a/packages/core/usage-data/core-usage-data-server-mocks/BUILD.bazel b/packages/core/usage-data/core-usage-data-server-mocks/BUILD.bazel new file mode 100644 index 0000000000000..d6c5c460ae9af --- /dev/null +++ b/packages/core/usage-data/core-usage-data-server-mocks/BUILD.bazel @@ -0,0 +1,110 @@ +load("@npm//@bazel/typescript:index.bzl", "ts_config") +load("@build_bazel_rules_nodejs//:index.bzl", "js_library") +load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", "ts_project") + +PKG_DIRNAME = "core-usage-data-server-mocks" +PKG_REQUIRE_NAME = "@kbn/core-usage-data-server-mocks" + +SOURCE_FILES = glob( + [ + "**/*.ts", + ], + exclude = [ + "**/*.config.js", + "**/*.test.*", + "**/*.stories.*", + "**/__snapshots__/**", + "**/integration_tests/**", + "**/mocks/**", + "**/scripts/**", + "**/storybook/**", + "**/test_fixtures/**", + "**/test_helpers/**", + ], +) + +SRCS = SOURCE_FILES + +filegroup( + name = "srcs", + srcs = SRCS, +) + +NPM_MODULE_EXTRA_FILES = [ + "package.json", +] + +RUNTIME_DEPS = [ + "@npm//rxjs", +] + +TYPES_DEPS = [ + "@npm//@types/node", + "@npm//@types/jest", + "@npm//rxjs", + "//packages/kbn-utility-types:npm_module_types", + "//packages/core/usage-data/core-usage-data-server:npm_module_types", + "//packages/core/usage-data/core-usage-data-base-server-internal:npm_module_types", + "//packages/core/usage-data/core-usage-data-server-internal:npm_module_types", +] + +jsts_transpiler( + name = "target_node", + srcs = SRCS, + build_pkg_name = package_name(), +) + +ts_config( + name = "tsconfig", + src = "tsconfig.json", + deps = [ + "//:tsconfig.base.json", + "//:tsconfig.bazel.json", + ], +) + +ts_project( + name = "tsc_types", + args = ['--pretty'], + srcs = SRCS, + deps = TYPES_DEPS, + declaration = True, + declaration_map = True, + emit_declaration_only = True, + out_dir = "target_types", + tsconfig = ":tsconfig", +) + +js_library( + name = PKG_DIRNAME, + srcs = NPM_MODULE_EXTRA_FILES, + deps = RUNTIME_DEPS + [":target_node"], + package_name = PKG_REQUIRE_NAME, + visibility = ["//visibility:public"], +) + +pkg_npm( + name = "npm_module", + deps = [":" + PKG_DIRNAME], +) + +filegroup( + name = "build", + srcs = [":npm_module"], + visibility = ["//visibility:public"], +) + +pkg_npm_types( + name = "npm_module_types", + srcs = SRCS, + deps = [":tsc_types"], + package_name = PKG_REQUIRE_NAME, + tsconfig = ":tsconfig", + visibility = ["//visibility:public"], +) + +filegroup( + name = "build_types", + srcs = [":npm_module_types"], + visibility = ["//visibility:public"], +) diff --git a/packages/core/usage-data/core-usage-data-server-mocks/README.md b/packages/core/usage-data/core-usage-data-server-mocks/README.md new file mode 100644 index 0000000000000..a7270aed0082f --- /dev/null +++ b/packages/core/usage-data/core-usage-data-server-mocks/README.md @@ -0,0 +1,5 @@ +# @kbn/core-usage-data-server-mocks + +This package contains mocks for Core's server-side `usage-data` domain. +- `coreUsageDataServiceMock` +- `coreUsageStatsClientMock` diff --git a/packages/core/usage-data/core-usage-data-server-mocks/index.ts b/packages/core/usage-data/core-usage-data-server-mocks/index.ts new file mode 100644 index 0000000000000..39576ebfbefb6 --- /dev/null +++ b/packages/core/usage-data/core-usage-data-server-mocks/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { coreUsageStatsClientMock, coreUsageDataServiceMock } from './src'; diff --git a/packages/core/usage-data/core-usage-data-server-mocks/jest.config.js b/packages/core/usage-data/core-usage-data-server-mocks/jest.config.js new file mode 100644 index 0000000000000..82892d827455e --- /dev/null +++ b/packages/core/usage-data/core-usage-data-server-mocks/jest.config.js @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +module.exports = { + preset: '@kbn/test/jest_node', + rootDir: '../../../..', + roots: ['/packages/core/usage-data/core-usage-data-server-mocks'], +}; diff --git a/packages/core/usage-data/core-usage-data-server-mocks/package.json b/packages/core/usage-data/core-usage-data-server-mocks/package.json new file mode 100644 index 0000000000000..508797d341cff --- /dev/null +++ b/packages/core/usage-data/core-usage-data-server-mocks/package.json @@ -0,0 +1,8 @@ +{ + "name": "@kbn/core-usage-data-server-mocks", + "private": true, + "version": "1.0.0", + "main": "./target_node/index.js", + "author": "Kibana Core", + "license": "SSPL-1.0 OR Elastic License 2.0" +} diff --git a/src/core/server/core_usage_data/core_usage_data_service.mock.ts b/packages/core/usage-data/core-usage-data-server-mocks/src/core_usage_data_service.mock.ts similarity index 98% rename from src/core/server/core_usage_data/core_usage_data_service.mock.ts rename to packages/core/usage-data/core-usage-data-server-mocks/src/core_usage_data_service.mock.ts index 7c887e4a93948..364b12523d914 100644 --- a/src/core/server/core_usage_data/core_usage_data_service.mock.ts +++ b/packages/core/usage-data/core-usage-data-server-mocks/src/core_usage_data_service.mock.ts @@ -10,7 +10,7 @@ import { BehaviorSubject } from 'rxjs'; import type { PublicMethodsOf } from '@kbn/utility-types'; import type { CoreUsageData, CoreUsageDataStart } from '@kbn/core-usage-data-server'; import type { InternalCoreUsageDataSetup } from '@kbn/core-usage-data-base-server-internal'; -import { CoreUsageDataService } from './core_usage_data_service'; +import type { CoreUsageDataService } from '@kbn/core-usage-data-server-internal'; import { coreUsageStatsClientMock } from './core_usage_stats_client.mock'; const createSetupContractMock = (usageStatsClient = coreUsageStatsClientMock.create()) => { diff --git a/src/core/server/core_usage_data/core_usage_stats_client.mock.ts b/packages/core/usage-data/core-usage-data-server-mocks/src/core_usage_stats_client.mock.ts similarity index 91% rename from src/core/server/core_usage_data/core_usage_stats_client.mock.ts rename to packages/core/usage-data/core-usage-data-server-mocks/src/core_usage_stats_client.mock.ts index ac5855c3a4ba0..a6e76e33057dc 100644 --- a/src/core/server/core_usage_data/core_usage_stats_client.mock.ts +++ b/packages/core/usage-data/core-usage-data-server-mocks/src/core_usage_stats_client.mock.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { CoreUsageStatsClient } from '.'; +import type { ICoreUsageStatsClient } from '@kbn/core-usage-data-base-server-internal'; const createUsageStatsClientMock = () => ({ @@ -26,7 +26,7 @@ const createUsageStatsClientMock = () => incrementSavedObjectsExport: jest.fn().mockResolvedValue(null), incrementLegacyDashboardsImport: jest.fn().mockResolvedValue(null), incrementLegacyDashboardsExport: jest.fn().mockResolvedValue(null), - } as unknown as jest.Mocked); + } as unknown as jest.Mocked); export const coreUsageStatsClientMock = { create: createUsageStatsClientMock, diff --git a/packages/core/usage-data/core-usage-data-server-mocks/src/index.ts b/packages/core/usage-data/core-usage-data-server-mocks/src/index.ts new file mode 100644 index 0000000000000..33eac79606b97 --- /dev/null +++ b/packages/core/usage-data/core-usage-data-server-mocks/src/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { coreUsageDataServiceMock } from './core_usage_data_service.mock'; +export { coreUsageStatsClientMock } from './core_usage_stats_client.mock'; diff --git a/packages/core/usage-data/core-usage-data-server-mocks/tsconfig.json b/packages/core/usage-data/core-usage-data-server-mocks/tsconfig.json new file mode 100644 index 0000000000000..71bb40fe57f3f --- /dev/null +++ b/packages/core/usage-data/core-usage-data-server-mocks/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "../../../../tsconfig.bazel.json", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "emitDeclarationOnly": true, + "outDir": "target_types", + "stripInternal": false, + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + ] +} diff --git a/src/core/server/core_usage_data/index.ts b/src/core/server/core_usage_data/index.ts deleted file mode 100644 index 227edb779e513..0000000000000 --- a/src/core/server/core_usage_data/index.ts +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -export { - CORE_USAGE_STATS_TYPE, - CORE_USAGE_STATS_ID, - REPOSITORY_RESOLVE_OUTCOME_STATS, - type InternalCoreUsageDataSetup, -} from '@kbn/core-usage-data-base-server-internal'; -export { CoreUsageDataService } from './core_usage_data_service'; -export { CoreUsageStatsClient } from './core_usage_stats_client'; - -// Because of #79265 we need to explicitly import, then export these types for -// scripts/telemetry_check.js to work as expected -import type { - CoreUsageStats, - CoreUsageData, - CoreConfigUsageData, - CoreEnvironmentUsageData, - CoreServicesUsageData, - ConfigUsageData, - CoreUsageDataStart, - CoreUsageDataSetup, - CoreUsageCounter, - CoreIncrementUsageCounter, - CoreIncrementCounterParams, -} from '@kbn/core-usage-data-server'; - -export type { - CoreUsageStats, - CoreUsageData, - CoreConfigUsageData, - CoreEnvironmentUsageData, - CoreServicesUsageData, - ConfigUsageData, - CoreUsageDataStart, - CoreUsageDataSetup, - CoreUsageCounter, - CoreIncrementUsageCounter, - CoreIncrementCounterParams, -}; diff --git a/src/core/server/index.ts b/src/core/server/index.ts index 0df6254f728e8..6c539dd1f20f6 100644 --- a/src/core/server/index.ts +++ b/src/core/server/index.ts @@ -64,25 +64,14 @@ import type { SavedObjectsServiceSetup, SavedObjectsServiceStart, } from '@kbn/core-saved-objects-server'; -import { DeprecationsServiceSetup } from '@kbn/core-deprecations-server'; +import type { DeprecationsServiceSetup } from '@kbn/core-deprecations-server'; +import type { CoreUsageDataStart, CoreUsageDataSetup } from '@kbn/core-usage-data-server'; import { I18nServiceSetup } from '@kbn/core-i18n-server'; import { HttpResources } from './http_resources'; import { PluginsServiceSetup, PluginsServiceStart, PluginOpaqueId } from './plugins'; import { UiSettingsServiceSetup, UiSettingsServiceStart } from './ui_settings'; import { StatusServiceSetup } from './status'; -import { CoreUsageDataStart, CoreUsageDataSetup } from './core_usage_data'; - -// Because of #79265 we need to explicitly import, then export these types for -// scripts/telemetry_check.js to work as expected -import { - CoreUsageStats, - CoreUsageData, - CoreConfigUsageData, - ConfigUsageData, - CoreEnvironmentUsageData, - CoreServicesUsageData, -} from './core_usage_data'; import type { CoreRequestHandlerContext } from './core_route_handler_context'; import type { PrebootCoreRequestHandlerContext } from './preboot_core_route_handler_context'; @@ -93,7 +82,12 @@ export type { CoreEnvironmentUsageData, CoreServicesUsageData, ConfigUsageData, -}; + CoreUsageDataSetup, + CoreUsageDataStart, + CoreUsageCounter, + CoreIncrementUsageCounter, + CoreIncrementCounterParams, +} from '@kbn/core-usage-data-server'; export type { KibanaExecutionContext } from '@kbn/core-execution-context-common'; export type { IExecutionContextContainer } from '@kbn/core-execution-context-server'; @@ -442,14 +436,6 @@ export { DEFAULT_APP_CATEGORIES, APP_WRAPPER_CLASS } from '@kbn/core-application export { ServiceStatusLevels } from './status'; export type { CoreStatus, ServiceStatus, ServiceStatusLevel, StatusServiceSetup } from './status'; -export type { - CoreUsageDataSetup, - CoreUsageDataStart, - CoreUsageCounter, - CoreIncrementUsageCounter, - CoreIncrementCounterParams, -} from './core_usage_data'; - export type { DocLinksServiceStart, DocLinksServiceSetup } from '@kbn/core-doc-links-server'; export type { diff --git a/src/core/server/integration_tests/saved_objects/routes/bulk_create.test.ts b/src/core/server/integration_tests/saved_objects/routes/bulk_create.test.ts index 03b4eca6e3a59..91033a02ee134 100644 --- a/src/core/server/integration_tests/saved_objects/routes/bulk_create.test.ts +++ b/src/core/server/integration_tests/saved_objects/routes/bulk_create.test.ts @@ -7,10 +7,12 @@ */ import supertest from 'supertest'; -import { savedObjectsClientMock } from '../../../mocks'; -import { CoreUsageStatsClient } from '../../../core_usage_data'; -import { coreUsageStatsClientMock } from '../../../core_usage_data/core_usage_stats_client.mock'; -import { coreUsageDataServiceMock } from '../../../core_usage_data/core_usage_data_service.mock'; +import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks'; +import type { ICoreUsageStatsClient } from '@kbn/core-usage-data-base-server-internal'; +import { + coreUsageStatsClientMock, + coreUsageDataServiceMock, +} from '@kbn/core-usage-data-server-mocks'; import { setupServer } from './test_utils'; import { registerBulkCreateRoute, @@ -24,7 +26,7 @@ describe('POST /api/saved_objects/_bulk_create', () => { let httpSetup: SetupServerReturn['httpSetup']; let handlerContext: SetupServerReturn['handlerContext']; let savedObjectsClient: ReturnType; - let coreUsageStatsClient: jest.Mocked; + let coreUsageStatsClient: jest.Mocked; beforeEach(async () => { ({ server, httpSetup, handlerContext } = await setupServer()); diff --git a/src/core/server/integration_tests/saved_objects/routes/bulk_get.test.ts b/src/core/server/integration_tests/saved_objects/routes/bulk_get.test.ts index aeaee514e21fc..217c750775048 100644 --- a/src/core/server/integration_tests/saved_objects/routes/bulk_get.test.ts +++ b/src/core/server/integration_tests/saved_objects/routes/bulk_get.test.ts @@ -7,10 +7,12 @@ */ import supertest from 'supertest'; -import { savedObjectsClientMock } from '../../../mocks'; -import { CoreUsageStatsClient } from '../../../core_usage_data'; -import { coreUsageStatsClientMock } from '../../../core_usage_data/core_usage_stats_client.mock'; -import { coreUsageDataServiceMock } from '../../../core_usage_data/core_usage_data_service.mock'; +import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks'; +import type { ICoreUsageStatsClient } from '@kbn/core-usage-data-base-server-internal'; +import { + coreUsageStatsClientMock, + coreUsageDataServiceMock, +} from '@kbn/core-usage-data-server-mocks'; import { setupServer } from './test_utils'; import { registerBulkGetRoute, @@ -24,7 +26,7 @@ describe('POST /api/saved_objects/_bulk_get', () => { let httpSetup: SetupServerReturn['httpSetup']; let handlerContext: SetupServerReturn['handlerContext']; let savedObjectsClient: ReturnType; - let coreUsageStatsClient: jest.Mocked; + let coreUsageStatsClient: jest.Mocked; beforeEach(async () => { ({ server, httpSetup, handlerContext } = await setupServer()); diff --git a/src/core/server/integration_tests/saved_objects/routes/bulk_resolve.test.ts b/src/core/server/integration_tests/saved_objects/routes/bulk_resolve.test.ts index 07d053ec8f6e0..8c2069086fdbd 100644 --- a/src/core/server/integration_tests/saved_objects/routes/bulk_resolve.test.ts +++ b/src/core/server/integration_tests/saved_objects/routes/bulk_resolve.test.ts @@ -7,10 +7,12 @@ */ import supertest from 'supertest'; -import { savedObjectsClientMock } from '../../../mocks'; -import { CoreUsageStatsClient } from '../../../core_usage_data'; -import { coreUsageStatsClientMock } from '../../../core_usage_data/core_usage_stats_client.mock'; -import { coreUsageDataServiceMock } from '../../../core_usage_data/core_usage_data_service.mock'; +import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks'; +import type { ICoreUsageStatsClient } from '@kbn/core-usage-data-base-server-internal'; +import { + coreUsageStatsClientMock, + coreUsageDataServiceMock, +} from '@kbn/core-usage-data-server-mocks'; import { setupServer } from './test_utils'; import { registerBulkResolveRoute, @@ -24,7 +26,7 @@ describe('POST /api/saved_objects/_bulk_resolve', () => { let httpSetup: SetupServerReturn['httpSetup']; let handlerContext: SetupServerReturn['handlerContext']; let savedObjectsClient: ReturnType; - let coreUsageStatsClient: jest.Mocked; + let coreUsageStatsClient: jest.Mocked; beforeEach(async () => { ({ server, httpSetup, handlerContext } = await setupServer()); diff --git a/src/core/server/integration_tests/saved_objects/routes/bulk_update.test.ts b/src/core/server/integration_tests/saved_objects/routes/bulk_update.test.ts index cd6ae064ae9e0..94d9a2f8ebbe7 100644 --- a/src/core/server/integration_tests/saved_objects/routes/bulk_update.test.ts +++ b/src/core/server/integration_tests/saved_objects/routes/bulk_update.test.ts @@ -7,10 +7,12 @@ */ import supertest from 'supertest'; -import { savedObjectsClientMock } from '../../../mocks'; -import { CoreUsageStatsClient } from '../../../core_usage_data'; -import { coreUsageStatsClientMock } from '../../../core_usage_data/core_usage_stats_client.mock'; -import { coreUsageDataServiceMock } from '../../../core_usage_data/core_usage_data_service.mock'; +import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks'; +import type { ICoreUsageStatsClient } from '@kbn/core-usage-data-base-server-internal'; +import { + coreUsageStatsClientMock, + coreUsageDataServiceMock, +} from '@kbn/core-usage-data-server-mocks'; import { setupServer } from './test_utils'; import { registerBulkUpdateRoute, @@ -24,7 +26,7 @@ describe('PUT /api/saved_objects/_bulk_update', () => { let httpSetup: SetupServerReturn['httpSetup']; let handlerContext: SetupServerReturn['handlerContext']; let savedObjectsClient: ReturnType; - let coreUsageStatsClient: jest.Mocked; + let coreUsageStatsClient: jest.Mocked; beforeEach(async () => { ({ server, httpSetup, handlerContext } = await setupServer()); diff --git a/src/core/server/integration_tests/saved_objects/routes/create.test.ts b/src/core/server/integration_tests/saved_objects/routes/create.test.ts index 9f002d9043374..926ff333a29a5 100644 --- a/src/core/server/integration_tests/saved_objects/routes/create.test.ts +++ b/src/core/server/integration_tests/saved_objects/routes/create.test.ts @@ -8,9 +8,11 @@ import supertest from 'supertest'; import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks'; -import { CoreUsageStatsClient } from '../../../core_usage_data'; -import { coreUsageStatsClientMock } from '../../../core_usage_data/core_usage_stats_client.mock'; -import { coreUsageDataServiceMock } from '../../../core_usage_data/core_usage_data_service.mock'; +import type { ICoreUsageStatsClient } from '@kbn/core-usage-data-base-server-internal'; +import { + coreUsageStatsClientMock, + coreUsageDataServiceMock, +} from '@kbn/core-usage-data-server-mocks'; import { setupServer } from './test_utils'; import { registerCreateRoute, @@ -24,7 +26,7 @@ describe('POST /api/saved_objects/{type}', () => { let httpSetup: SetupServerReturn['httpSetup']; let handlerContext: SetupServerReturn['handlerContext']; let savedObjectsClient: ReturnType; - let coreUsageStatsClient: jest.Mocked; + let coreUsageStatsClient: jest.Mocked; const clientResponse = { id: 'logstash-*', diff --git a/src/core/server/integration_tests/saved_objects/routes/delete.test.ts b/src/core/server/integration_tests/saved_objects/routes/delete.test.ts index 9d4b9ce5e27b8..a8e5d97bf0709 100644 --- a/src/core/server/integration_tests/saved_objects/routes/delete.test.ts +++ b/src/core/server/integration_tests/saved_objects/routes/delete.test.ts @@ -7,10 +7,12 @@ */ import supertest from 'supertest'; -import { savedObjectsClientMock } from '../../../mocks'; -import { CoreUsageStatsClient } from '../../../core_usage_data'; -import { coreUsageStatsClientMock } from '../../../core_usage_data/core_usage_stats_client.mock'; -import { coreUsageDataServiceMock } from '../../../core_usage_data/core_usage_data_service.mock'; +import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks'; +import type { ICoreUsageStatsClient } from '@kbn/core-usage-data-base-server-internal'; +import { + coreUsageStatsClientMock, + coreUsageDataServiceMock, +} from '@kbn/core-usage-data-server-mocks'; import { setupServer } from './test_utils'; import { registerDeleteRoute, @@ -24,7 +26,7 @@ describe('DELETE /api/saved_objects/{type}/{id}', () => { let httpSetup: SetupServerReturn['httpSetup']; let handlerContext: SetupServerReturn['handlerContext']; let savedObjectsClient: ReturnType; - let coreUsageStatsClient: jest.Mocked; + let coreUsageStatsClient: jest.Mocked; beforeEach(async () => { ({ server, httpSetup, handlerContext } = await setupServer()); diff --git a/src/core/server/integration_tests/saved_objects/routes/export.test.ts b/src/core/server/integration_tests/saved_objects/routes/export.test.ts index 45c1d42ba7cbc..3b0400de07b69 100644 --- a/src/core/server/integration_tests/saved_objects/routes/export.test.ts +++ b/src/core/server/integration_tests/saved_objects/routes/export.test.ts @@ -8,9 +8,11 @@ import supertest from 'supertest'; import { createListStream } from '@kbn/utils'; -import { CoreUsageStatsClient } from '../../../core_usage_data'; -import { coreUsageStatsClientMock } from '../../../core_usage_data/core_usage_stats_client.mock'; -import { coreUsageDataServiceMock } from '../../../core_usage_data/core_usage_data_service.mock'; +import type { ICoreUsageStatsClient } from '@kbn/core-usage-data-base-server-internal'; +import { + coreUsageStatsClientMock, + coreUsageDataServiceMock, +} from '@kbn/core-usage-data-server-mocks'; import { savedObjectsExporterMock } from '@kbn/core-saved-objects-import-export-server-mocks'; import type { SavedObjectConfig } from '@kbn/core-saved-objects-base-server-internal'; import { setupServer, createExportableType } from './test_utils'; @@ -25,7 +27,7 @@ const config = { maxImportPayloadBytes: 26214400, maxImportExportSize: 10000, } as SavedObjectConfig; -let coreUsageStatsClient: jest.Mocked; +let coreUsageStatsClient: jest.Mocked; describe('POST /api/saved_objects/_export', () => { let server: SetupServerReturn['server']; diff --git a/src/core/server/integration_tests/saved_objects/routes/find.test.ts b/src/core/server/integration_tests/saved_objects/routes/find.test.ts index 249222f6dc86b..ab3ca6c459dae 100644 --- a/src/core/server/integration_tests/saved_objects/routes/find.test.ts +++ b/src/core/server/integration_tests/saved_objects/routes/find.test.ts @@ -9,10 +9,12 @@ import supertest from 'supertest'; import querystring from 'querystring'; -import { savedObjectsClientMock } from '../../../mocks'; -import { CoreUsageStatsClient } from '../../../core_usage_data'; -import { coreUsageStatsClientMock } from '../../../core_usage_data/core_usage_stats_client.mock'; -import { coreUsageDataServiceMock } from '../../../core_usage_data/core_usage_data_service.mock'; +import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks'; +import type { ICoreUsageStatsClient } from '@kbn/core-usage-data-base-server-internal'; +import { + coreUsageStatsClientMock, + coreUsageDataServiceMock, +} from '@kbn/core-usage-data-server-mocks'; import { setupServer } from './test_utils'; import { registerFindRoute, @@ -26,7 +28,7 @@ describe('GET /api/saved_objects/_find', () => { let httpSetup: SetupServerReturn['httpSetup']; let handlerContext: SetupServerReturn['handlerContext']; let savedObjectsClient: ReturnType; - let coreUsageStatsClient: jest.Mocked; + let coreUsageStatsClient: jest.Mocked; const clientResponse = { total: 0, diff --git a/src/core/server/integration_tests/saved_objects/routes/get.test.ts b/src/core/server/integration_tests/saved_objects/routes/get.test.ts index d07749be57e9f..df0e37979dacb 100644 --- a/src/core/server/integration_tests/saved_objects/routes/get.test.ts +++ b/src/core/server/integration_tests/saved_objects/routes/get.test.ts @@ -11,10 +11,12 @@ import { ContextService } from '@kbn/core-http-context-server-internal'; import type { HttpService, InternalHttpServiceSetup } from '@kbn/core-http-server-internal'; import { createHttpServer, createCoreContext } from '@kbn/core-http-server-mocks'; import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks'; -import type { CoreUsageStatsClient } from '../../../core_usage_data'; import { executionContextServiceMock } from '@kbn/core-execution-context-server-mocks'; -import { coreUsageStatsClientMock } from '../../../core_usage_data/core_usage_stats_client.mock'; -import { coreUsageDataServiceMock } from '../../../core_usage_data/core_usage_data_service.mock'; +import type { ICoreUsageStatsClient } from '@kbn/core-usage-data-base-server-internal'; +import { + coreUsageStatsClientMock, + coreUsageDataServiceMock, +} from '@kbn/core-usage-data-server-mocks'; import { contextServiceMock, coreMock } from '../../../mocks'; import { registerGetRoute, @@ -28,7 +30,7 @@ describe('GET /api/saved_objects/{type}/{id}', () => { let httpSetup: InternalHttpServiceSetup; let handlerContext: ReturnType; let savedObjectsClient: ReturnType; - let coreUsageStatsClient: jest.Mocked; + let coreUsageStatsClient: jest.Mocked; beforeEach(async () => { const coreContext = createCoreContext({ coreId }); diff --git a/src/core/server/integration_tests/saved_objects/routes/import.test.ts b/src/core/server/integration_tests/saved_objects/routes/import.test.ts index d6c9f9ab7edbc..fd03a8e5b0d09 100644 --- a/src/core/server/integration_tests/saved_objects/routes/import.test.ts +++ b/src/core/server/integration_tests/saved_objects/routes/import.test.ts @@ -10,10 +10,12 @@ jest.mock('uuid'); import supertest from 'supertest'; import { SavedObjectsErrorHelpers } from '@kbn/core-saved-objects-utils-server'; -import { savedObjectsClientMock } from '../../../mocks'; -import { CoreUsageStatsClient } from '../../../core_usage_data'; -import { coreUsageStatsClientMock } from '../../../core_usage_data/core_usage_stats_client.mock'; -import { coreUsageDataServiceMock } from '../../../core_usage_data/core_usage_data_service.mock'; +import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks'; +import type { ICoreUsageStatsClient } from '@kbn/core-usage-data-base-server-internal'; +import { + coreUsageStatsClientMock, + coreUsageDataServiceMock, +} from '@kbn/core-usage-data-server-mocks'; import { SavedObjectConfig } from '@kbn/core-saved-objects-base-server-internal'; import { SavedObjectsImporter } from '@kbn/core-saved-objects-import-export-server-internal'; import { @@ -26,7 +28,7 @@ type SetupServerReturn = Awaited>; const allowedTypes = ['index-pattern', 'visualization', 'dashboard']; const config = { maxImportPayloadBytes: 26214400, maxImportExportSize: 10000 } as SavedObjectConfig; -let coreUsageStatsClient: jest.Mocked; +let coreUsageStatsClient: jest.Mocked; const URL = '/internal/saved_objects/_import'; describe(`POST ${URL}`, () => { diff --git a/src/core/server/integration_tests/saved_objects/routes/legacy_import_export/export.test.ts b/src/core/server/integration_tests/saved_objects/routes/legacy_import_export/export.test.ts index f648238d21b7a..c5a12dbb0128f 100644 --- a/src/core/server/integration_tests/saved_objects/routes/legacy_import_export/export.test.ts +++ b/src/core/server/integration_tests/saved_objects/routes/legacy_import_export/export.test.ts @@ -28,9 +28,11 @@ const exportObjects = [ ]; import supertest from 'supertest'; -import { CoreUsageStatsClient } from '../../../../core_usage_data'; -import { coreUsageStatsClientMock } from '../../../../core_usage_data/core_usage_stats_client.mock'; -import { coreUsageDataServiceMock } from '../../../../core_usage_data/core_usage_data_service.mock'; +import type { ICoreUsageStatsClient } from '@kbn/core-usage-data-base-server-internal'; +import { + coreUsageStatsClientMock, + coreUsageDataServiceMock, +} from '@kbn/core-usage-data-server-mocks'; import { setupServer } from '../test_utils'; import { loggerMock } from '@kbn/logging-mocks'; import { SavedObjectsBulkResponse } from '@kbn/core-saved-objects-api-server'; @@ -40,7 +42,7 @@ import { } from '@kbn/core-saved-objects-server-internal'; type SetupServerReturn = Awaited>; -let coreUsageStatsClient: jest.Mocked; +let coreUsageStatsClient: jest.Mocked; describe('POST /api/dashboards/export', () => { let server: SetupServerReturn['server']; diff --git a/src/core/server/integration_tests/saved_objects/routes/legacy_import_export/import.test.ts b/src/core/server/integration_tests/saved_objects/routes/legacy_import_export/import.test.ts index 82d26714c0f90..85433600e6293 100644 --- a/src/core/server/integration_tests/saved_objects/routes/legacy_import_export/import.test.ts +++ b/src/core/server/integration_tests/saved_objects/routes/legacy_import_export/import.test.ts @@ -28,9 +28,11 @@ const importObjects = [ ]; import supertest from 'supertest'; -import { CoreUsageStatsClient } from '../../../../core_usage_data'; -import { coreUsageStatsClientMock } from '../../../../core_usage_data/core_usage_stats_client.mock'; -import { coreUsageDataServiceMock } from '../../../../core_usage_data/core_usage_data_service.mock'; +import type { ICoreUsageStatsClient } from '@kbn/core-usage-data-base-server-internal'; +import { + coreUsageStatsClientMock, + coreUsageDataServiceMock, +} from '@kbn/core-usage-data-server-mocks'; import { setupServer } from '../test_utils'; import { loggerMock } from '@kbn/logging-mocks'; import { SavedObjectsBulkResponse } from '@kbn/core-saved-objects-api-server'; @@ -40,7 +42,7 @@ import { } from '@kbn/core-saved-objects-server-internal'; type SetupServerReturn = Awaited>; -let coreUsageStatsClient: jest.Mocked; +let coreUsageStatsClient: jest.Mocked; describe('POST /api/dashboards/import', () => { let server: SetupServerReturn['server']; diff --git a/src/core/server/integration_tests/saved_objects/routes/resolve.test.ts b/src/core/server/integration_tests/saved_objects/routes/resolve.test.ts index dbcf1cbd7a6d7..baf0d1c96f969 100644 --- a/src/core/server/integration_tests/saved_objects/routes/resolve.test.ts +++ b/src/core/server/integration_tests/saved_objects/routes/resolve.test.ts @@ -11,9 +11,11 @@ import { ContextService } from '@kbn/core-http-context-server-internal'; import type { HttpService, InternalHttpServiceSetup } from '@kbn/core-http-server-internal'; import { createHttpServer, createCoreContext } from '@kbn/core-http-server-mocks'; import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks'; -import { CoreUsageStatsClient } from '../../../core_usage_data'; -import { coreUsageStatsClientMock } from '../../../core_usage_data/core_usage_stats_client.mock'; -import { coreUsageDataServiceMock } from '../../../core_usage_data/core_usage_data_service.mock'; +import type { ICoreUsageStatsClient } from '@kbn/core-usage-data-base-server-internal'; +import { + coreUsageStatsClientMock, + coreUsageDataServiceMock, +} from '@kbn/core-usage-data-server-mocks'; import { executionContextServiceMock } from '@kbn/core-execution-context-server-mocks'; import { contextServiceMock, coreMock } from '../../../mocks'; import { @@ -28,7 +30,7 @@ describe('GET /api/saved_objects/resolve/{type}/{id}', () => { let httpSetup: InternalHttpServiceSetup; let handlerContext: ReturnType; let savedObjectsClient: ReturnType; - let coreUsageStatsClient: jest.Mocked; + let coreUsageStatsClient: jest.Mocked; beforeEach(async () => { const coreContext = createCoreContext({ coreId }); diff --git a/src/core/server/integration_tests/saved_objects/routes/resolve_import_errors.test.ts b/src/core/server/integration_tests/saved_objects/routes/resolve_import_errors.test.ts index e263399c2d675..a8d167e41d0d9 100644 --- a/src/core/server/integration_tests/saved_objects/routes/resolve_import_errors.test.ts +++ b/src/core/server/integration_tests/saved_objects/routes/resolve_import_errors.test.ts @@ -9,10 +9,12 @@ jest.mock('uuid'); import supertest from 'supertest'; -import { savedObjectsClientMock } from '../../../mocks'; -import { CoreUsageStatsClient } from '../../../core_usage_data'; -import { coreUsageStatsClientMock } from '../../../core_usage_data/core_usage_stats_client.mock'; -import { coreUsageDataServiceMock } from '../../../core_usage_data/core_usage_data_service.mock'; +import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks'; +import type { ICoreUsageStatsClient } from '@kbn/core-usage-data-base-server-internal'; +import { + coreUsageStatsClientMock, + coreUsageDataServiceMock, +} from '@kbn/core-usage-data-server-mocks'; import { setupServer, createExportableType } from './test_utils'; import { SavedObjectConfig } from '@kbn/core-saved-objects-base-server-internal'; import { SavedObjectsImporter } from '@kbn/core-saved-objects-import-export-server-internal'; @@ -25,7 +27,7 @@ type SetupServerReturn = Awaited>; const allowedTypes = ['index-pattern', 'visualization', 'dashboard']; const config = { maxImportPayloadBytes: 26214400, maxImportExportSize: 10000 } as SavedObjectConfig; -let coreUsageStatsClient: jest.Mocked; +let coreUsageStatsClient: jest.Mocked; const URL = '/api/saved_objects/_resolve_import_errors'; describe(`POST ${URL}`, () => { diff --git a/src/core/server/integration_tests/saved_objects/routes/update.test.ts b/src/core/server/integration_tests/saved_objects/routes/update.test.ts index 3caca07d7570e..5be1cb1f597e6 100644 --- a/src/core/server/integration_tests/saved_objects/routes/update.test.ts +++ b/src/core/server/integration_tests/saved_objects/routes/update.test.ts @@ -7,10 +7,12 @@ */ import supertest from 'supertest'; -import { savedObjectsClientMock } from '../../../mocks'; -import { CoreUsageStatsClient } from '../../../core_usage_data'; -import { coreUsageStatsClientMock } from '../../../core_usage_data/core_usage_stats_client.mock'; -import { coreUsageDataServiceMock } from '../../../core_usage_data/core_usage_data_service.mock'; +import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks'; +import type { ICoreUsageStatsClient } from '@kbn/core-usage-data-base-server-internal'; +import { + coreUsageStatsClientMock, + coreUsageDataServiceMock, +} from '@kbn/core-usage-data-server-mocks'; import { setupServer } from './test_utils'; import { registerUpdateRoute, @@ -24,7 +26,7 @@ describe('PUT /api/saved_objects/{type}/{id?}', () => { let httpSetup: SetupServerReturn['httpSetup']; let handlerContext: SetupServerReturn['handlerContext']; let savedObjectsClient: ReturnType; - let coreUsageStatsClient: jest.Mocked; + let coreUsageStatsClient: jest.Mocked; beforeEach(async () => { const clientResponse = { diff --git a/src/core/server/internal_types.ts b/src/core/server/internal_types.ts index cf073cb50f320..4f655a9e0f3c8 100644 --- a/src/core/server/internal_types.ts +++ b/src/core/server/internal_types.ts @@ -49,7 +49,9 @@ import { InternalDeprecationsServiceSetup, InternalDeprecationsServiceStart, } from '@kbn/core-deprecations-server-internal'; -import { I18nServiceSetup } from '@kbn/core-i18n-server'; +import type { CoreUsageDataStart } from '@kbn/core-usage-data-server'; +import type { InternalCoreUsageDataSetup } from '@kbn/core-usage-data-base-server-internal'; +import type { I18nServiceSetup } from '@kbn/core-i18n-server'; import { InternalUiSettingsServicePreboot, InternalUiSettingsServiceSetup, @@ -58,7 +60,6 @@ import { import { InternalRenderingServiceSetup } from './rendering'; import { InternalHttpResourcesPreboot, InternalHttpResourcesSetup } from './http_resources'; import { InternalStatusServiceSetup } from './status'; -import { CoreUsageDataStart, InternalCoreUsageDataSetup } from './core_usage_data'; /** @internal */ export interface InternalCorePreboot { diff --git a/src/core/server/mocks.ts b/src/core/server/mocks.ts index 033aecba8ae26..5efbbdfbad39b 100644 --- a/src/core/server/mocks.ts +++ b/src/core/server/mocks.ts @@ -27,8 +27,8 @@ import { typeRegistryMock as savedObjectsTypeRegistryMock } from '@kbn/core-save import { savedObjectsServiceMock } from '@kbn/core-saved-objects-server-mocks'; import { savedObjectsClientMock } from '@kbn/core-saved-objects-api-server-mocks'; import { deprecationsServiceMock } from '@kbn/core-deprecations-server-mocks'; +import { coreUsageDataServiceMock } from '@kbn/core-usage-data-server-mocks'; import { i18nServiceMock } from '@kbn/core-i18n-server-mocks'; - import type { PluginInitializerContext, CoreSetup, @@ -42,7 +42,6 @@ import { renderingMock } from './rendering/rendering_service.mock'; import { uiSettingsServiceMock } from './ui_settings/ui_settings_service.mock'; import { SharedGlobalConfig } from './plugins'; import { statusServiceMock } from './status/status_service.mock'; -import { coreUsageDataServiceMock } from './core_usage_data/core_usage_data_service.mock'; export { configServiceMock, configDeprecationsMock } from '@kbn/config-mocks'; export { loggingSystemMock } from '@kbn/core-logging-server-mocks'; @@ -63,7 +62,7 @@ export { statusServiceMock } from './status/status_service.mock'; export { contextServiceMock } from '@kbn/core-http-context-server-mocks'; export { capabilitiesServiceMock } from '@kbn/core-capabilities-server-mocks'; export { deprecationsServiceMock } from '@kbn/core-deprecations-server-mocks'; -export { coreUsageDataServiceMock } from './core_usage_data/core_usage_data_service.mock'; +export { coreUsageDataServiceMock } from '@kbn/core-usage-data-server-mocks'; export { i18nServiceMock } from '@kbn/core-i18n-server-mocks'; export { executionContextServiceMock } from '@kbn/core-execution-context-server-mocks'; export { docLinksServiceMock } from '@kbn/core-doc-links-server-mocks'; diff --git a/src/core/server/server.ts b/src/core/server/server.ts index d4fde1d875912..a6619f33e84f0 100644 --- a/src/core/server/server.ts +++ b/src/core/server/server.ts @@ -55,6 +55,7 @@ import { DeprecationsService, config as deprecationConfig, } from '@kbn/core-deprecations-server-internal'; +import { CoreUsageDataService } from '@kbn/core-usage-data-server-internal'; import { CoreApp } from './core_app'; import { HttpResourcesService } from './http_resources'; import { RenderingService } from './rendering'; @@ -66,7 +67,6 @@ import { StatusService } from './status/status_service'; import { config as uiSettingsConfig } from './ui_settings'; import { config as statusConfig } from './status'; import { InternalCorePreboot, InternalCoreSetup, InternalCoreStart } from './internal_types'; -import { CoreUsageDataService } from './core_usage_data'; import { CoreRouteHandlerContext } from './core_route_handler_context'; import { PrebootCoreRouteHandlerContext } from './preboot_core_route_handler_context'; import { DiscoveredPlugins } from './plugins'; diff --git a/src/core/server/status/status_service.test.ts b/src/core/server/status/status_service.test.ts index 9f8381c937509..a3ca69ca4f243 100644 --- a/src/core/server/status/status_service.test.ts +++ b/src/core/server/status/status_service.test.ts @@ -23,7 +23,7 @@ import { httpServiceMock } from '@kbn/core-http-server-mocks'; import { ServiceStatusLevelSnapshotSerializer } from './test_utils'; import { metricsServiceMock } from '@kbn/core-metrics-server-mocks'; import { configServiceMock } from '@kbn/config-mocks'; -import { coreUsageDataServiceMock } from '../core_usage_data/core_usage_data_service.mock'; +import { coreUsageDataServiceMock } from '@kbn/core-usage-data-server-mocks'; import { analyticsServiceMock } from '@kbn/core-analytics-server-mocks'; import { AnalyticsServiceSetup } from '..'; diff --git a/src/core/server/status/status_service.ts b/src/core/server/status/status_service.ts index 02f66740eb781..8d036177c6e06 100644 --- a/src/core/server/status/status_service.ts +++ b/src/core/server/status/status_service.ts @@ -28,8 +28,8 @@ import type { InternalHttpServiceSetup } from '@kbn/core-http-server-internal'; import type { InternalElasticsearchServiceSetup } from '@kbn/core-elasticsearch-server-internal'; import type { InternalMetricsServiceSetup } from '@kbn/core-metrics-server-internal'; import type { InternalSavedObjectsServiceSetup } from '@kbn/core-saved-objects-server-internal'; +import type { InternalCoreUsageDataSetup } from '@kbn/core-usage-data-base-server-internal'; import { registerStatusRoute } from './routes'; -import type { InternalCoreUsageDataSetup } from '../core_usage_data'; import { config, StatusConfigType } from './status_config'; import { ServiceStatus, CoreStatus, InternalStatusServiceSetup } from './types'; diff --git a/yarn.lock b/yarn.lock index 85a031a31b593..bc6d4518a9bd3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3251,6 +3251,14 @@ version "0.0.0" uid "" +"@kbn/core-usage-data-server-internal@link:bazel-bin/packages/core/usage-data/core-usage-data-server-internal": + version "0.0.0" + uid "" + +"@kbn/core-usage-data-server-mocks@link:bazel-bin/packages/core/usage-data/core-usage-data-server-mocks": + version "0.0.0" + uid "" + "@kbn/core-usage-data-server@link:bazel-bin/packages/core/usage-data/core-usage-data-server": version "0.0.0" uid "" @@ -7337,6 +7345,14 @@ version "0.0.0" uid "" +"@types/kbn__core-usage-data-server-internal@link:bazel-bin/packages/core/usage-data/core-usage-data-server-internal/npm_module_types": + version "0.0.0" + uid "" + +"@types/kbn__core-usage-data-server-mocks@link:bazel-bin/packages/core/usage-data/core-usage-data-server-mocks/npm_module_types": + version "0.0.0" + uid "" + "@types/kbn__core-usage-data-server@link:bazel-bin/packages/core/usage-data/core-usage-data-server/npm_module_types": version "0.0.0" uid "" From 6559bfbc71186f599713c4c732822b091d49109a Mon Sep 17 00:00:00 2001 From: Coen Warmer Date: Mon, 5 Sep 2022 14:32:22 +0200 Subject: [PATCH 05/19] [Actionable Observability] Update links to Observability rule management (#140009) * [Actionable Observability] Update links to Observability rule management * Use path config file for links --- .../public/components/app/observability_status/content.ts | 3 ++- .../observability/public/pages/overview/empty_section.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/observability/public/components/app/observability_status/content.ts b/x-pack/plugins/observability/public/components/app/observability_status/content.ts index 6ab022ef81bba..319c701fd96c2 100644 --- a/x-pack/plugins/observability/public/components/app/observability_status/content.ts +++ b/x-pack/plugins/observability/public/components/app/observability_status/content.ts @@ -7,6 +7,7 @@ import { i18n } from '@kbn/i18n'; import { HttpSetup, DocLinksStart } from '@kbn/core/public'; import { ObservabilityFetchDataPlugins } from '../../../typings/fetch_overview_data'; +import { paths } from '../../../config/paths'; export interface ObservabilityStatusContent { id: ObservabilityFetchDataPlugins | 'alert'; @@ -135,7 +136,7 @@ export const getContent = ( addTitle: i18n.translate('xpack.observability.statusVisualization.alert.link', { defaultMessage: 'Create rules', }), - addLink: http.basePath.prepend('/app/management/insightsAndAlerting/triggersActions/rules'), + addLink: http.basePath.prepend(paths.observability.rules), learnMoreLink: docLinks.links.observability.createAlerts, goToAppTitle: i18n.translate('xpack.observability.statusVisualization.alert.goToAppTitle', { defaultMessage: 'Show alerts', diff --git a/x-pack/plugins/observability/public/pages/overview/empty_section.ts b/x-pack/plugins/observability/public/pages/overview/empty_section.ts index 9e74ec482f50d..78db690cd5c0d 100644 --- a/x-pack/plugins/observability/public/pages/overview/empty_section.ts +++ b/x-pack/plugins/observability/public/pages/overview/empty_section.ts @@ -8,6 +8,7 @@ import { i18n } from '@kbn/i18n'; import { HttpSetup } from '@kbn/core/public'; import { ISection } from '../../typings/section'; +import { paths } from '../../config/paths'; export const getEmptySections = ({ http }: { http: HttpSetup }): ISection[] => { return [ @@ -97,7 +98,7 @@ export const getEmptySections = ({ http }: { http: HttpSetup }): ISection[] => { linkTitle: i18n.translate('xpack.observability.emptySection.apps.alert.link', { defaultMessage: 'Create rule', }), - href: http.basePath.prepend('/app/management/insightsAndAlerting/triggersActions/alerts'), + href: http.basePath.prepend(paths.observability.rules), }, ]; }; From 5e0615f6289e087e945fb48c7d5eb0f6a8ff76de Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 5 Sep 2022 22:44:36 +0930 Subject: [PATCH 06/19] Update platform security modules (main) (#139169) Co-authored-by: Aleh Zasypkin --- package.json | 4 ++-- yarn.lock | 61 +++++++++++++++++++++++++++++----------------------- 2 files changed, 36 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index 99ccae8e9fcb8..7a59e569a7b4d 100644 --- a/package.json +++ b/package.json @@ -579,7 +579,7 @@ "redux-thunks": "^1.0.0", "remark-parse": "^8.0.3", "remark-stringify": "^8.0.3", - "require-in-the-middle": "^5.1.0", + "require-in-the-middle": "^5.2.0", "reselect": "^4.1.6", "resize-observer-polyfill": "^1.5.1", "rison-node": "1.0.2", @@ -1345,7 +1345,7 @@ "tempy": "^0.3.0", "terser": "^5.14.1", "terser-webpack-plugin": "^4.2.3", - "tough-cookie": "^4.0.0", + "tough-cookie": "^4.1.2", "tree-kill": "^1.2.2", "ts-loader": "^7.0.5", "ts-morph": "^13.0.2", diff --git a/yarn.lock b/yarn.lock index bc6d4518a9bd3..3592d046af317 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17410,10 +17410,10 @@ is-ci@^3.0.0: dependencies: ci-info "^3.1.1" -is-core-module@^2.2.0, is-core-module@^2.6.0, is-core-module@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" - integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== +is-core-module@^2.6.0, is-core-module@^2.9.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" + integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== dependencies: has "^1.0.3" @@ -21855,7 +21855,7 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.0.tgz#99a10d870a803bdd5ee6f0470e58dfcd2f9a54d3" integrity sha512-8cChqz0RP6SHJkMt48FW0A7+qUOn+OsnOsVtzI59tZ8m+5bCSk7hzwET0pulwOM2YMn9J1efb07KB9l9f30SGg== -path-parse@^1.0.6, path-parse@^1.0.7: +path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== @@ -24470,14 +24470,14 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -require-in-the-middle@^5.0.3, require-in-the-middle@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/require-in-the-middle/-/require-in-the-middle-5.1.0.tgz#b768f800377b47526d026bbf5a7f727f16eb412f" - integrity sha512-M2rLKVupQfJ5lf9OvqFGIT+9iVLnTmjgbOmpil12hiSQNn5zJTKGPoIisETNjfK+09vP3rpm1zJajmErpr2sEQ== +require-in-the-middle@^5.0.3, require-in-the-middle@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz#4b71e3cc7f59977100af9beb76bf2d056a5a6de2" + integrity sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg== dependencies: debug "^4.1.1" module-details-from-path "^1.0.3" - resolve "^1.12.0" + resolve "^1.22.1" require-main-filename@^2.0.0: version "2.0.0" @@ -24560,22 +24560,23 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.1.4, resolve@^1.1.5, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.9.0: - version "1.22.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== +resolve@^1.1.4, resolve@^1.1.5, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.9.0: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== dependencies: - is-core-module "^2.8.1" + is-core-module "^2.9.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" resolve@^2.0.0-next.3: - version "2.0.0-next.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" - integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== + version "2.0.0-next.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" responselike@^1.0.2: version "1.0.2" @@ -26975,14 +26976,15 @@ tough-cookie@^3.0.1: psl "^1.1.28" punycode "^2.1.1" -tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== +tough-cookie@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" + integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== dependencies: psl "^1.1.33" punycode "^2.1.1" - universalify "^0.1.2" + universalify "^0.2.0" + url-parse "^1.5.3" tr46@^1.0.1: version "1.0.1" @@ -27585,11 +27587,16 @@ universal-user-agent@^6.0.0: resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== -universalify@^0.1.0, universalify@^0.1.2: +universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + universalify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" @@ -27696,7 +27703,7 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -url-parse@^1.5.10: +url-parse@^1.5.10, url-parse@^1.5.3: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== From c72e6ee59e5042a1b3b802c67a9cff284ae31477 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Mon, 5 Sep 2022 16:14:08 +0200 Subject: [PATCH 07/19] [Lens] Add one click filter to Lens table (#139701) * add one click filter to Lens table * fix tests --- .../expressions/datatable/datatable_column.ts | 2 + .../__snapshots__/table_basic.test.tsx.snap | 4 ++ .../datatable/components/cell_value.test.tsx | 45 +++++++++++++++++++ .../datatable/components/cell_value.tsx | 34 +++++++++++--- .../datatable/components/columns.tsx | 5 ++- .../datatable/components/dimension_editor.tsx | 36 +++++++++++++++ .../datatable/components/table_basic.tsx | 1 + .../datatable/components/types.ts | 7 +++ .../datatable/visualization.tsx | 4 ++ 9 files changed, 130 insertions(+), 8 deletions(-) diff --git a/x-pack/plugins/lens/common/expressions/datatable/datatable_column.ts b/x-pack/plugins/lens/common/expressions/datatable/datatable_column.ts index 3d193876b5f38..ae155fe560e88 100644 --- a/x-pack/plugins/lens/common/expressions/datatable/datatable_column.ts +++ b/x-pack/plugins/lens/common/expressions/datatable/datatable_column.ts @@ -30,6 +30,7 @@ export interface ColumnState { columnId: string; width?: number; hidden?: boolean; + oneClickFilter?: boolean; isTransposed?: boolean; // These flags are necessary to transpose columns and map them back later // They are set automatically and are not user-editable @@ -63,6 +64,7 @@ export const datatableColumn: ExpressionFunctionDefinition< alignment: { types: ['string'], help: '' }, sortingHint: { types: ['string'], help: '' }, hidden: { types: ['boolean'], help: '' }, + oneClickFilter: { types: ['boolean'], help: '' }, width: { types: ['number'], help: '' }, isTransposed: { types: ['boolean'], help: '' }, transposable: { types: ['boolean'], help: '' }, diff --git a/x-pack/plugins/lens/public/visualizations/datatable/components/__snapshots__/table_basic.test.tsx.snap b/x-pack/plugins/lens/public/visualizations/datatable/components/__snapshots__/table_basic.test.tsx.snap index 2304544069d03..ddce37121dfa4 100644 --- a/x-pack/plugins/lens/public/visualizations/datatable/components/__snapshots__/table_basic.test.tsx.snap +++ b/x-pack/plugins/lens/public/visualizations/datatable/components/__snapshots__/table_basic.test.tsx.snap @@ -13,6 +13,7 @@ exports[`DatatableComponent it renders actions column when there are row actions "c": "right", }, "getColorForValue": [MockFunction], + "handleFilterClick": [Function], "minMaxByColumnId": Object { "c": Object { "max": 3, @@ -291,6 +292,7 @@ exports[`DatatableComponent it renders custom row height if set to another value "c": "right", }, "getColorForValue": [MockFunction], + "handleFilterClick": [Function], "minMaxByColumnId": Object { "c": Object { "max": 3, @@ -558,6 +560,7 @@ exports[`DatatableComponent it renders the title and value 1`] = ` "c": "right", }, "getColorForValue": [MockFunction], + "handleFilterClick": [Function], "minMaxByColumnId": Object { "c": Object { "max": 3, @@ -823,6 +826,7 @@ exports[`DatatableComponent it should render hide, reset, and sort actions on he "c": "right", }, "getColorForValue": [MockFunction], + "handleFilterClick": [Function], "minMaxByColumnId": Object { "c": Object { "max": 3, diff --git a/x-pack/plugins/lens/public/visualizations/datatable/components/cell_value.test.tsx b/x-pack/plugins/lens/public/visualizations/datatable/components/cell_value.test.tsx index f6092e3dc299a..b6b4c90a5f16a 100644 --- a/x-pack/plugins/lens/public/visualizations/datatable/components/cell_value.test.tsx +++ b/x-pack/plugins/lens/public/visualizations/datatable/components/cell_value.test.tsx @@ -17,6 +17,7 @@ import { ReactWrapper } from 'enzyme'; import { DatatableArgs, ColumnConfigArg } from '../../../../common/expressions'; import { DataContextType } from './types'; import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; +import { EuiLink } from '@elastic/eui'; describe('datatable cell renderer', () => { const table: Datatable = { @@ -146,6 +147,50 @@ describe('datatable cell renderer', () => { expect(cell.find('.lnsTableCell--multiline').exists()).toBeTruthy(); }); + it('renders as EuiLink if oneClickFilter is set', () => { + const MultiLineCellRenderer = createGridCell( + { + a: { convert: (x) => `formatted ${x}` } as FieldFormat, + }, + { + columns: [ + { + columnId: 'a', + type: 'lens_datatable_column', + oneClickFilter: true, + }, + ], + sortingColumnId: '', + sortingDirection: 'none', + }, + DataContext, + { get: jest.fn() } as unknown as IUiSettingsClient, + true + ); + const cell = mountWithIntl( + {}, + }} + > + {}} + isExpandable={false} + isDetails={false} + isExpanded={false} + /> + + ); + expect(cell.find(EuiLink).text()).toEqual('formatted 123'); + }); + describe('dynamic coloring', () => { const paletteRegistry = chartPluginMock.createPaletteRegistry(); const customPalette = paletteRegistry.get('custom'); diff --git a/x-pack/plugins/lens/public/visualizations/datatable/components/cell_value.tsx b/x-pack/plugins/lens/public/visualizations/datatable/components/cell_value.tsx index 4db92a65f9c4d..baad0419074d2 100644 --- a/x-pack/plugins/lens/public/visualizations/datatable/components/cell_value.tsx +++ b/x-pack/plugins/lens/public/visualizations/datatable/components/cell_value.tsx @@ -6,7 +6,7 @@ */ import React, { useContext, useEffect } from 'react'; -import type { EuiDataGridCellValueElementProps } from '@elastic/eui'; +import { EuiDataGridCellValueElementProps, EuiLink } from '@elastic/eui'; import type { IUiSettingsClient } from '@kbn/core/public'; import classNames from 'classnames'; import type { FormatFactory } from '../../../../common'; @@ -25,13 +25,16 @@ export const createGridCell = ( // Changing theme requires a full reload of the page, so we can cache here const IS_DARK_THEME = uiSettings.get('theme:darkMode'); return ({ rowIndex, columnId, setCellProps }: EuiDataGridCellValueElementProps) => { - const { table, alignments, minMaxByColumnId, getColorForValue } = useContext(DataContext); + const { table, alignments, minMaxByColumnId, getColorForValue, handleFilterClick } = + useContext(DataContext); const rowValue = table?.rows[rowIndex]?.[columnId]; - const content = formatters[columnId]?.convert(rowValue, 'html'); - const currentAlignment = alignments && alignments[columnId]; - const { colorMode, palette } = - columnConfig.columns.find(({ columnId: id }) => id === columnId) || {}; + const colIndex = columnConfig.columns.findIndex(({ columnId: id }) => id === columnId); + const { colorMode, palette, oneClickFilter } = columnConfig.columns[colIndex] || {}; + const filterOnClick = oneClickFilter && handleFilterClick; + + const content = formatters[columnId]?.convert(rowValue, filterOnClick ? 'text' : 'html'); + const currentAlignment = alignments && alignments[columnId]; useEffect(() => { const originalId = getOriginalId(columnId); @@ -68,6 +71,25 @@ export const createGridCell = ( }; }, [rowValue, columnId, setCellProps, colorMode, palette, minMaxByColumnId, getColorForValue]); + if (filterOnClick) { + return ( +