Skip to content

Commit

Permalink
Merge branch 'main' into esql-edit-query
Browse files Browse the repository at this point in the history
  • Loading branch information
stratoula authored Oct 23, 2023
2 parents a85b67c + 0a44a58 commit 649288e
Show file tree
Hide file tree
Showing 78 changed files with 1,177 additions and 642 deletions.
11 changes: 11 additions & 0 deletions docs/api/uptime-api.asciidoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
[[uptime-apis]]
== Uptime APIs

The following APIs are available for Uptime.

* <<get-settings-api, Get settings API>> to get a settings

* <<update-settings-api, Update settings API>> to update the attributes for existing settings

include::uptime/get-settings.asciidoc[leveloffset=+1]
include::uptime/update-settings.asciidoc[leveloffset=+1]
39 changes: 39 additions & 0 deletions docs/api/uptime/get-settings.asciidoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
[[get-settings-api]]
== Get settings API
++++
<titleabbrev>Get settings</titleabbrev>
++++

Retrieve uptime settings existing settings.

[[get-settings-api-request]]
=== {api-request-title}

`GET <kibana host>:<port>/api/uptime/settings`

`GET <kibana host>:<port>/s/<space_id>/api/uptime/settings`

=== {api-prereq-title}

You must have `read` privileges for the *uptime* feature in *{observability}* section of the
<<kibana-feature-privileges,{kib} feature privileges>>.

The API returns the following:

[source,sh]
--------------------------------------------------
{
"heartbeatIndices": "heartbeat-8*",
"certExpirationThreshold": 30,
"certAgeThreshold": 730,
"defaultConnectors": [
"08990f40-09c5-11ee-97ae-912b222b13d4",
"db25f830-2318-11ee-9391-6b0c030836d6"
],
"defaultEmail": {
"to": [],
"cc": [],
"bcc": []
}
}
--------------------------------------------------
117 changes: 117 additions & 0 deletions docs/api/uptime/update-settings.asciidoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
[[update-settings-api]]
== Update settings API
++++
<titleabbrev>Update settings</titleabbrev>
++++

Updates uptime settings attributes like heartbeatIndices, certExpirationThreshold, certAgeThreshold, defaultConnectors or defaultEmail

=== {api-request-title}

`PUT <kibana host>:<port>/api/uptime/settings`

`PUT <kibana host>:<port>/s/<space_id>/api/uptime/settings`

=== {api-prereq-title}

You must have `all` privileges for the *uptime* feature in *{observability}* section of the
<<kibana-feature-privileges,{kib} feature privileges>>.

[[settings-api-update-path-params]]
==== Path parameters

`space_id`::
(Optional, string) An identifier for the space. If `space_id` is not provided in the URL, the default space is used.

[[api-update-request-body]]
==== Request body

A partial update is supported, provided settings keys will be merged with existing settings.

`heartbeatIndices`::
(Optional, string) index pattern string to be used within uptime app/alerts to query heartbeat data. Defaults to `heartbeat-*`.


`certExpirationThreshold`::
(Optional, number) Number of days before a certificate expires to trigger an alert. Defaults to `30`.

`certAgeThreshold`::
(Optional, number) Number of days after a certificate is created to trigger an alert. Defaults to `730`.

`defaultConnectors`::
(Optional, array) List of connector IDs to be used as default connectors for new alerts. Defaults to `[]`.

`defaultEmail`::
(Optional, object) Default email configuration for new alerts. Defaults to `{"to": [], "cc": [], "bcc": []}`.

[[settings-api-update-example]]
==== Example

[source,sh]
--------------------------------------------------
PUT api/uptime/settings
{
"heartbeatIndices": "heartbeat-8*",
"certExpirationThreshold": 30,
"certAgeThreshold": 730,
"defaultConnectors": [
"08990f40-09c5-11ee-97ae-912b222b13d4",
"db25f830-2318-11ee-9391-6b0c030836d6"
],
"defaultEmail": {
"to": [],
"cc": [],
"bcc": []
}
}
--------------------------------------------------

The API returns the following:

[source,json]
--------------------------------------------------
{
"heartbeatIndices": "heartbeat-8*",
"certExpirationThreshold": 30,
"certAgeThreshold": 730,
"defaultConnectors": [
"08990f40-09c5-11ee-97ae-912b222b13d4",
"db25f830-2318-11ee-9391-6b0c030836d6"
],
"defaultEmail": {
"to": [],
"cc": [],
"bcc": []
}
}
--------------------------------------------------
[[settings-api-partial-update-example]]
==== Partial update example

[source,sh]
--------------------------------------------------
PUT api/uptime/settings
{
"heartbeatIndices": "heartbeat-8*",
}
--------------------------------------------------

The API returns the following:

[source,json]
--------------------------------------------------
{
"heartbeatIndices": "heartbeat-8*",
"certExpirationThreshold": 30,
"certAgeThreshold": 730,
"defaultConnectors": [
"08990f40-09c5-11ee-97ae-912b222b13d4",
"db25f830-2318-11ee-9391-6b0c030836d6"
],
"defaultEmail": {
"to": [],
"cc": [],
"bcc": []
}
}
--------------------------------------------------
1 change: 1 addition & 0 deletions docs/user/api.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -109,3 +109,4 @@ include::{kib-repo-dir}/api/osquery-manager.asciidoc[]
include::{kib-repo-dir}/api/short-urls.asciidoc[]
include::{kib-repo-dir}/api/task-manager/health.asciidoc[]
include::{kib-repo-dir}/api/upgrade-assistant.asciidoc[]
include::{kib-repo-dir}/api/uptime-api.asciidoc[]
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -887,7 +887,7 @@
"deep-freeze-strict": "^1.1.1",
"deepmerge": "^4.2.2",
"del": "^6.1.0",
"elastic-apm-node": "^4.0.0",
"elastic-apm-node": "^4.1.0",
"email-addresses": "^5.0.0",
"execa": "^5.1.1",
"expiry-js": "0.1.7",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ const createStartContractMock = () => {
startContract.getIsNavDrawerLocked$.mockReturnValue(new BehaviorSubject(false));
startContract.getBodyClasses$.mockReturnValue(new BehaviorSubject([]));
startContract.hasHeaderBanner$.mockReturnValue(new BehaviorSubject(false));
startContract.getIsSideNavCollapsed$.mockReturnValue(new BehaviorSubject(false));
return startContract;
};

Expand Down
5 changes: 5 additions & 0 deletions packages/kbn-test/src/kbn_client/kbn_client_saved_objects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,12 @@ const STANDARD_LIST_TYPES = [
'lens',
'links',
'map',
// cases saved objects
'cases',
'cases-comments',
'cases-user-actions',
'cases-configure',
'cases-connector-mappings',
// synthetics based objects
'synthetics-monitor',
'uptime-dynamic-settings',
Expand Down
2 changes: 1 addition & 1 deletion x-pack/packages/security-solution/side_nav/panel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@
* 2.0.
*/

export { SolutionSideNavPanel } from './src/solution_side_nav_panel';
export { SolutionSideNavPanelContent } from './src/solution_side_nav_panel';
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,14 @@ import {
accordionButtonClassName,
} from './solution_side_nav_panel.styles';

export interface SolutionSideNavPanelProps {
onClose: () => void;
onOutsideClick: () => void;
export interface SolutionSideNavPanelContentProps {
title: string;
onClose: () => void;
items: SolutionSideNavItem[];
categories?: LinkCategories;
}
export interface SolutionSideNavPanelProps extends SolutionSideNavPanelContentProps {
onOutsideClick: () => void;
bottomOffset?: string;
topOffset?: string;
}
Expand Down Expand Up @@ -85,7 +87,6 @@ export const SolutionSideNavPanel: React.FC<SolutionSideNavPanelProps> = React.m
$topOffset,
});
const panelClasses = classNames(panelClassName, 'eui-yScroll', solutionSideNavPanelStyles);
const titleClasses = classNames(SolutionSideNavTitleStyles(euiTheme));

// ESC key closes PanelNav
const onKeyDown = useCallback(
Expand All @@ -110,24 +111,12 @@ export const SolutionSideNavPanel: React.FC<SolutionSideNavPanelProps> = React.m
paddingSize="m"
data-test-subj="solutionSideNavPanel"
>
<EuiFlexGroup direction="column" gutterSize="m" alignItems="flexStart">
<EuiFlexItem>
<EuiTitle size="xs" className={titleClasses}>
<strong>{title}</strong>
</EuiTitle>
</EuiFlexItem>
<EuiFlexItem style={{ width: '100%' }}>
{categories ? (
<SolutionSideNavPanelCategories
categories={categories}
items={items}
onClose={onClose}
/>
) : (
<SolutionSideNavPanelItems items={items} onClose={onClose} />
)}
</EuiFlexItem>
</EuiFlexGroup>
<SolutionSideNavPanelContent
title={title}
categories={categories}
items={items}
onClose={onClose}
/>
</EuiPanel>
</EuiOutsideClickDetector>
</EuiFocusTrap>
Expand All @@ -137,6 +126,33 @@ export const SolutionSideNavPanel: React.FC<SolutionSideNavPanelProps> = React.m
}
);

export const SolutionSideNavPanelContent: React.FC<SolutionSideNavPanelContentProps> = React.memo(
function SolutionSideNavPanelContent({ title, onClose, categories, items }) {
const { euiTheme } = useEuiTheme();
const titleClasses = classNames(SolutionSideNavTitleStyles(euiTheme));
return (
<EuiFlexGroup direction="column" gutterSize="m" alignItems="flexStart">
<EuiFlexItem>
<EuiTitle size="xs" className={titleClasses}>
<strong>{title}</strong>
</EuiTitle>
</EuiFlexItem>
<EuiFlexItem style={{ width: '100%' }}>
{categories ? (
<SolutionSideNavPanelCategories
categories={categories}
items={items}
onClose={onClose}
/>
) : (
<SolutionSideNavPanelItems items={items} onClose={onClose} />
)}
</EuiFlexItem>
</EuiFlexGroup>
);
}
);

interface SolutionSideNavPanelCategoriesProps {
categories: LinkCategories;
items: SolutionSideNavItem[];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,5 @@ export const TelemetryContextProvider: FC<TelemetryProviderProps> = ({ children,
};

export const useTelemetryContext = () => {
const context = useContext(TelemetryContext);
if (!context) {
throw new Error('No TelemetryContext found.');
}
return context;
return useContext(TelemetryContext) ?? {};
};
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { v4 as uuidv4 } from 'uuid';
import { ProcessorEvent } from '@kbn/observability-plugin/common';
import { waitForIndexStatus } from '@kbn/core-saved-objects-migration-server-internal';
import type { APMIndices } from '@kbn/apm-data-access-plugin/server';
import { ElasticsearchCapabilities } from '@kbn/core-elasticsearch-server';
import { ML_ERRORS } from '../../../common/anomaly_detection';
import { METRICSET_NAME, PROCESSOR_EVENT } from '../../../common/es_fields/apm';
import { Environment } from '../../../common/environment_rt';
Expand All @@ -30,12 +31,14 @@ export async function createAnomalyDetectionJobs({
indices,
environments,
logger,
esCapabilities,
}: {
mlClient?: MlClient;
esClient: ElasticsearchClient;
indices: APMIndices;
environments: Environment[];
logger: Logger;
esCapabilities: ElasticsearchCapabilities;
}) {
if (!mlClient) {
throw Boom.notImplemented(ML_ERRORS.ML_NOT_AVAILABLE);
Expand Down Expand Up @@ -68,6 +71,7 @@ export async function createAnomalyDetectionJobs({
esClient,
environment,
apmMetricIndex,
esCapabilities,
})
);
} catch (e) {
Expand Down Expand Up @@ -97,12 +101,16 @@ async function createAnomalyDetectionJob({
esClient,
environment,
apmMetricIndex,
esCapabilities,
}: {
mlClient: Required<MlClient>;
esClient: ElasticsearchClient;
environment: string;
apmMetricIndex: string;
esCapabilities: ElasticsearchCapabilities;
}) {
const { serverless } = esCapabilities;

return withApmSpan('create_anomaly_detection_job', async () => {
const randomToken = uuidv4().substr(-4);

Expand Down Expand Up @@ -136,12 +144,16 @@ async function createAnomalyDetectionJob({
],
});

await waitForIndexStatus({
client: esClient,
index: '.ml-*',
timeout: DEFAULT_TIMEOUT,
status: 'yellow',
})();
// Waiting for the index is not enabled in serverless, this could potentially cause
// problems when creating jobs in parallels
if (!serverless) {
await waitForIndexStatus({
client: esClient,
index: '.ml-*',
timeout: DEFAULT_TIMEOUT,
status: 'yellow',
})();
}

return anomalyDetectionJob;
});
Expand Down
14 changes: 14 additions & 0 deletions x-pack/plugins/apm/server/lib/helpers/get_es_capabilities.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/

import { APMRouteHandlerResources } from '../../routes/apm_routes/register_apm_server_routes';

export async function getESCapabilities({ core }: APMRouteHandlerResources) {
const es = (await core.start()).elasticsearch;

return es.getCapabilities();
}
Loading

0 comments on commit 649288e

Please sign in to comment.