[Ingest Pipelines] Add generated copy for all processors (#95507)

* - minor refactor of 'description' -> 'typeDescription' for
  generic processor descriptions
- added initial pass of generated descriptions for all processors

* fix i18n

* added wrapping div and title to description and changed default description to appear as placeholder

* reworked the description width and overflow styling

* only show the text title on hover when we are not showing the text input

* fixed a number of minor issues with using values as though they are strings and doing better serialization

* slight optimisation to scss

* - implement copy feedback
- clean up a lot of uses of "target_field = field". it is better
  to not show these
- made "replacement" a required field on gsub (which it was not)

* revert the previouis validation as empty values are acceptbale for the replacement text

* - updated the copy per feedback and fixed a missing i18n.translate
- slight update to SCSS classes to not have unused class

* Added an empty string field validator that accepts spaces so that
the KV processor value and field split fields accept " "

* replace use of HTML "title" with EuiToolTip

* remove unused variable and import

* implemented feedback; removed if from default descriptions and other minor updates

* update default description of foreach to always display

Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
This commit is contained in:
Jean-Louis Leysens 2021-04-08 23:43:38 +02:00 committed by GitHub
parent cf7fdecdfe
commit cbc0fa0289
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 404 additions and 73 deletions

View file

@ -7,7 +7,7 @@
import classNames from 'classnames';
import React, { useState, useEffect, useCallback, memo } from 'react';
import { EuiFieldText, EuiText, keys } from '@elastic/eui';
import { EuiFieldText, EuiText, keys, EuiToolTip } from '@elastic/eui';
export interface Props {
placeholder: string;
@ -90,11 +90,13 @@ function _InlineTextInput({
tabIndex={disabled ? -1 : 0}
onFocus={() => setIsShowingTextInput(true)}
>
<EuiText size="s" color="subdued">
<div className="pipelineProcessorsEditor__item__description">
{text || <em>{placeholder}</em>}
</div>
</EuiText>
<EuiToolTip content={text ?? placeholder}>
<EuiText size="s" color="subdued">
<div className="pipelineProcessorsEditor__item__description">
{text || <em>{placeholder}</em>}
</div>
</EuiText>
</EuiToolTip>
</div>
);
}

View file

@ -38,7 +38,6 @@
overflow-x: hidden;
white-space: nowrap;
text-overflow: ellipsis;
max-width: 600px;
}
&__textInput {
@ -60,4 +59,23 @@
// Prevent content jump when spinner renders
min-width: 15px;
}
&__controlsContainer {
// Make sure this element knows how wide it is
width: 100%;
// The last element in these controls is an editable text description that can contain an unknown amount (i.e., width) of text.
overflow: hidden;
}
// By default, flex sets the element width to "auto", we set this explicitly again to avoid the flex item growing beyond the width given
// by flex. This applies to both of the classes below.
&__controlsFlexItem {
min-width: 0;
}
&__descriptionContainer {
min-width: 0;
&--displayNone {
display: none;
}
}
}

View file

@ -67,6 +67,8 @@ export const PipelineProcessorsEditorItem: FunctionComponent<Props> = memo(
const isMovingOtherProcessor = editor.mode.id === 'movingProcessor' && !isMovingThisProcessor;
const isDimmed = isEditingOtherProcessor || isMovingOtherProcessor;
const processorDescriptor = getProcessorDescriptor(processor.type);
const { testPipelineData } = useTestPipelineContext();
const {
config: { selectedDocumentIndex },
@ -85,10 +87,14 @@ export const PipelineProcessorsEditorItem: FunctionComponent<Props> = memo(
'pipelineProcessorsEditor__item--dimmed': isDimmed,
});
const inlineTextInputContainerClasses = classNames({
// eslint-disable-next-line @typescript-eslint/naming-convention
'pipelineProcessorsEditor__item--displayNone': isInMoveMode && !processor.options.description,
});
const inlineTextInputContainerClasses = classNames(
'pipelineProcessorsEditor__item__descriptionContainer',
{
// eslint-disable-next-line @typescript-eslint/naming-convention
'pipelineProcessorsEditor__item__descriptionContainer--displayNone':
isInMoveMode && !processor.options.description,
}
);
const onDescriptionChange = useCallback(
(nextDescription) => {
@ -167,8 +173,13 @@ export const PipelineProcessorsEditorItem: FunctionComponent<Props> = memo(
data-test-subj={selectorToDataTestSubject(selector)}
data-processor-id={processor.id}
>
<EuiFlexItem>
<EuiFlexGroup gutterSize="m" alignItems="center" responsive={false}>
<EuiFlexItem className="pipelineProcessorsEditor__item__controlsFlexItem">
<EuiFlexGroup
className="pipelineProcessorsEditor__item__controlsContainer"
gutterSize="m"
alignItems="center"
responsive={false}
>
<EuiFlexItem grow={false}>{renderMoveButton()}</EuiFlexItem>
<EuiFlexItem grow={false} className="pipelineProcessorsEditor__item__statusContainer">
{isExecutingPipeline ? (
@ -193,7 +204,7 @@ export const PipelineProcessorsEditorItem: FunctionComponent<Props> = memo(
}}
data-test-subj="manageItemButton"
>
<b>{getProcessorDescriptor(processor.type)?.label ?? processor.type}</b>
<b>{processorDescriptor?.label ?? processor.type}</b>
</EuiLink>
</EuiText>
</EuiFlexItem>
@ -203,7 +214,10 @@ export const PipelineProcessorsEditorItem: FunctionComponent<Props> = memo(
onChange={onDescriptionChange}
ariaLabel={i18nTexts.processorTypeLabel({ type: processor.type })}
text={description}
placeholder={i18nTexts.descriptionPlaceholder}
placeholder={
processorDescriptor?.getDefaultDescription(processor.options) ??
i18nTexts.descriptionPlaceholder
}
/>
</EuiFlexItem>
</EuiFlexGroup>

View file

@ -81,7 +81,7 @@ export const ProcessorTypeField: FunctionComponent<Props> = ({ initialType }) =>
const type = typeField.value;
const processorDescriptor = getProcessorDescriptor(type);
if (processorDescriptor) {
description = processorDescriptor.description || '';
description = processorDescriptor.typeDescription || '';
selectedOptions = [{ label: processorDescriptor.label, value: type }];
} else {
// If there is no label for this processor type, just use the type as the label

View file

@ -12,20 +12,17 @@ import { EuiCode } from '@elastic/eui';
import {
FIELD_TYPES,
fieldValidators,
UseField,
Field,
ComboBoxField,
ToggleField,
} from '../../../../../../shared_imports';
import { FieldsConfig, from, to } from './shared';
import { FieldsConfig, from, to, isEmptyString } from './shared';
import { FieldNameField } from './common_fields/field_name_field';
import { TargetField } from './common_fields/target_field';
import { IgnoreMissingField } from './common_fields/ignore_missing_field';
const { emptyField } = fieldValidators;
const fieldsConfig: FieldsConfig = {
/* Required fields config */
field_split: {
@ -45,7 +42,7 @@ const fieldsConfig: FieldsConfig = {
),
validations: [
{
validator: emptyField(
validator: isEmptyString(
i18n.translate('xpack.ingestPipelines.pipelineEditor.kvForm.fieldSplitRequiredError', {
defaultMessage: 'A value is required.',
})
@ -70,7 +67,7 @@ const fieldsConfig: FieldsConfig = {
),
validations: [
{
validator: emptyField(
validator: isEmptyString(
i18n.translate('xpack.ingestPipelines.pipelineEditor.kvForm.valueSplitRequiredError', {
defaultMessage: 'A value is required.',
})

View file

@ -10,7 +10,9 @@ import * as rt from 'io-ts';
import { i18n } from '@kbn/i18n';
import { isRight } from 'fp-ts/lib/Either';
import { FieldConfig, ValidationFunc } from '../../../../../../shared_imports';
import { FieldConfig, ValidationFunc, fieldValidators } from '../../../../../../shared_imports';
const { emptyField } = fieldValidators;
export const arrayOfStrings = rt.array(rt.string);
@ -118,6 +120,20 @@ export const isJSONStringValidator: ValidationFunc = ({ value }) => {
}
};
/**
* Similar to the emptyField validator but we accept whitespace characters.
*/
export const isEmptyString = (message: string): ValidationFunc => (field) => {
const { value } = field;
if (typeof value === 'string') {
const hasLength = Boolean(value.length);
const hasNonWhiteSpaceChars = hasLength && Boolean(value.trim().length);
if (hasNonWhiteSpaceChars) {
return emptyField(message)(field);
}
}
};
export const EDITOR_PX_HEIGHT = {
extraSmall: 75,
small: 100,

View file

@ -56,7 +56,14 @@ interface FieldDescriptor {
* A sentence case label that can be displayed to users
*/
label: string;
description?: string | ((esDocUrl: string) => ReactNode);
/**
* A general description of the processor type
*/
typeDescription?: string | ((esDocUrl: string) => ReactNode);
/**
* Default
*/
getDefaultDescription: (processorOptions: Record<string, any>) => string | undefined;
}
type MapProcessorTypeToDescriptor = Record<string, FieldDescriptor>;
@ -68,10 +75,18 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.append', {
defaultMessage: 'Append',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.append', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.append', {
defaultMessage:
"Appends values to a field's array. If the field contains a single value, the processor first converts it to an array. If the field doesn't exist, the processor creates an array containing the appended values.",
}),
getDefaultDescription: ({ field, value }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.append', {
defaultMessage: 'Appends "{value}" to the "{field}" field',
values: {
field,
value,
},
}),
},
bytes: {
FieldsComponent: Bytes,
@ -79,10 +94,17 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.bytes', {
defaultMessage: 'Bytes',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.bytes', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.bytes', {
defaultMessage:
'Converts digital storage units to bytes. For example, 1KB becomes 1024 bytes.',
}),
getDefaultDescription: ({ field }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.bytes', {
defaultMessage: 'Converts "{field}" to its value in bytes',
values: {
field,
},
}),
},
circle: {
FieldsComponent: Circle,
@ -90,9 +112,16 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.circle', {
defaultMessage: 'Circle',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.circle', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.circle', {
defaultMessage: 'Converts a circle definition into an approximate polygon.',
}),
getDefaultDescription: ({ field }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.circle', {
defaultMessage: 'Converts a circle definition of "{field}" into an approximate polygon',
values: {
field,
},
}),
},
convert: {
FieldsComponent: Convert,
@ -100,10 +129,18 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.convert', {
defaultMessage: 'Convert',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.convert', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.convert', {
defaultMessage:
'Converts a field to a different data type. For example, you can convert a string to an long.',
}),
getDefaultDescription: ({ field, type }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.convert', {
defaultMessage: 'Converts "{field}" to type "{type}"',
values: {
field,
type,
},
}),
},
csv: {
FieldsComponent: CSV,
@ -111,9 +148,17 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.csv', {
defaultMessage: 'CSV',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.csv', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.csv', {
defaultMessage: 'Extracts field values from CSV data.',
}),
getDefaultDescription: ({ field, target_fields: targetFields }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.csv', {
defaultMessage: 'Extracts CSV values from "{field}" to {target_fields}',
values: {
field,
target_fields: targetFields.map((v: string) => `"${v}"`).join(', '),
},
}),
},
date: {
FieldsComponent: DateProcessor,
@ -121,9 +166,17 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.date', {
defaultMessage: 'Date',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.date', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.date', {
defaultMessage: 'Converts a date to a document timestamp.',
}),
getDefaultDescription: ({ field, target_field: targetField = '@timestamp' }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.date', {
defaultMessage: 'Parses a date from "{field}" to a date type on field "{target_field}"',
values: {
field,
target_field: targetField,
},
}),
},
date_index_name: {
FieldsComponent: DateIndexName,
@ -131,13 +184,32 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.dateIndexName', {
defaultMessage: 'Date index name',
}),
description: () => (
typeDescription: () => (
<FormattedMessage
id="xpack.ingestPipelines.processors.description.dateIndexName"
defaultMessage="Uses a date or timestamp to add documents to the correct time-based index. Index names must use a date math pattern, such as {value}."
values={{ value: <EuiCode>{'my-index-yyyy-MM-dd'}</EuiCode> }}
/>
),
getDefaultDescription: ({ field, index_name_prefix: indexNamePrefix }) => {
const prefix = indexNamePrefix
? i18n.translate(
'xpack.ingestPipelines.processors.defaultDescription.dateIndexName.indexNamePrefixDefault.prefixValueLabel',
{ defaultMessage: 'with the prefix "{prefix}"', values: { prefix: indexNamePrefix } }
)
: i18n.translate(
'xpack.ingestPipelines.processors.defaultDescription.dateIndexName.indexNamePrefixDefault.noPrefixValueLabel',
{ defaultMessage: 'with no prefix' }
);
return i18n.translate('xpack.ingestPipelines.processors.defaultDescription.date_index_name', {
defaultMessage:
'Adds documents to a time-based index based on the timestamp value in "{field}", {prefix}',
values: {
field,
prefix,
},
});
},
},
dissect: {
FieldsComponent: Dissect,
@ -145,9 +217,16 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.dissect', {
defaultMessage: 'Dissect',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.dissect', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.dissect', {
defaultMessage: 'Uses dissect patterns to extract matches from a field.',
}),
getDefaultDescription: ({ field }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.dissect', {
defaultMessage: 'Extracts values from "{field}" that match a dissect pattern',
values: {
field,
},
}),
},
dot_expander: {
FieldsComponent: DotExpander,
@ -155,10 +234,17 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.dotExpander', {
defaultMessage: 'Dot expander',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.dotExpander', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.dotExpander', {
defaultMessage:
'Expands a field containing dot notation into an object field. The object field is then accessible by other processors in the pipeline.',
}),
getDefaultDescription: ({ field }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.dot_expander', {
defaultMessage: 'Expands "{field}" into an object field',
values: {
field,
},
}),
},
drop: {
FieldsComponent: Drop,
@ -166,10 +252,13 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.drop', {
defaultMessage: 'Drop',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.drop', {
defaultMessage:
'Drops documents without returning an error. Used to only index documents that meet specified conditions.',
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.drop', {
defaultMessage: 'Drops documents without returning an error.',
}),
getDefaultDescription: () =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.drop', {
defaultMessage: 'Drops documents without returning an error',
}),
},
enrich: {
FieldsComponent: Enrich,
@ -177,7 +266,7 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.enrich', {
defaultMessage: 'Enrich',
}),
description: (esDocUrl) => {
typeDescription: (esDocUrl) => {
return (
<FormattedMessage
id="xpack.ingestPipelines.processors.description.enrich"
@ -192,6 +281,16 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
/>
);
},
getDefaultDescription: ({ field, policy_name: policyName, target_field: targetField }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.enrich', {
defaultMessage:
'Enriches data to "{target_field}" if the "{policy_name}" policy matches "{field}"',
values: {
field,
policy_name: policyName,
target_field: targetField,
},
}),
},
fail: {
FieldsComponent: Fail,
@ -199,10 +298,14 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.fail', {
defaultMessage: 'Fail',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.fail', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.fail', {
defaultMessage:
'Returns a custom error message on failure. Often used to notify requesters of required conditions.',
}),
getDefaultDescription: () =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.fail', {
defaultMessage: 'Raises an exception that halts execution',
}),
},
foreach: {
FieldsComponent: Foreach,
@ -210,9 +313,16 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.foreach', {
defaultMessage: 'Foreach',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.foreach', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.foreach', {
defaultMessage: 'Applies an ingest processor to each value in an array.',
}),
getDefaultDescription: ({ field }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.foreach', {
defaultMessage: 'Runs a processor for each object in "{field}"',
values: {
field,
},
}),
},
geoip: {
FieldsComponent: GeoIP,
@ -220,10 +330,17 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.geoip', {
defaultMessage: 'GeoIP',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.geoip', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.geoip', {
defaultMessage:
'Adds geo data based on an IP address. Uses geo data from a Maxmind database file.',
}),
getDefaultDescription: ({ field }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.geoip', {
defaultMessage: 'Adds geo data to documents based on the value of "{field}"',
values: {
field,
},
}),
},
grok: {
FieldsComponent: Grok,
@ -231,7 +348,7 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.grok', {
defaultMessage: 'Grok',
}),
description: (esDocUrl) => {
typeDescription: (esDocUrl) => {
return (
<FormattedMessage
id="xpack.ingestPipelines.processors.description.grok"
@ -246,6 +363,13 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
/>
);
},
getDefaultDescription: ({ field }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.grok', {
defaultMessage: 'Extracts values from "{field}" that match a grok pattern',
values: {
field,
},
}),
},
gsub: {
FieldsComponent: Gsub,
@ -253,9 +377,18 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.gsub', {
defaultMessage: 'Gsub',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.gsub', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.gsub', {
defaultMessage: 'Uses a regular expression to replace field substrings.',
}),
getDefaultDescription: ({ pattern, field, replacement }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.gsub', {
defaultMessage: 'Replaces values matching "{pattern}" in "{field}" with "{replacement}"',
values: {
pattern,
field,
replacement,
},
}),
},
html_strip: {
FieldsComponent: HtmlStrip,
@ -263,9 +396,16 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.htmlStrip', {
defaultMessage: 'HTML strip',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.htmlStrip', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.htmlStrip', {
defaultMessage: 'Removes HTML tags from a field.',
}),
getDefaultDescription: ({ field }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.html_strip', {
defaultMessage: 'Removes HTML tags from "{field}"',
values: {
field,
},
}),
},
inference: {
FieldsComponent: Inference,
@ -273,10 +413,21 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.inference', {
defaultMessage: 'Inference',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.inference', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.inference', {
defaultMessage:
'Uses a pre-trained data frame analytics model to infer against incoming data.',
}),
getDefaultDescription: ({
model_id: modelId,
target_field: targetField = 'ml.inference.<processor_tag>',
}) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.inference', {
defaultMessage: 'Runs the model "{modelId}" and stores the result in "{target_field}"',
values: {
modelId,
target_field: targetField,
},
}),
},
join: {
FieldsComponent: Join,
@ -284,10 +435,17 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.join', {
defaultMessage: 'Join',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.join', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.join', {
defaultMessage:
'Joins array elements into a string. Inserts a separator between each element.',
}),
getDefaultDescription: ({ field }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.join', {
defaultMessage: 'Joins each element of the array stored in "{field}"',
values: {
field,
},
}),
},
json: {
FieldsComponent: Json,
@ -295,9 +453,16 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.json', {
defaultMessage: 'JSON',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.json', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.json', {
defaultMessage: 'Creates a JSON object from a compatible string.',
}),
getDefaultDescription: ({ field }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.json', {
defaultMessage: 'Parses "{field}" to create a JSON object from a string',
values: {
field,
},
}),
},
kv: {
FieldsComponent: Kv,
@ -305,9 +470,19 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.kv', {
defaultMessage: 'Key-value (KV)',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.kv', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.kv', {
defaultMessage: 'Extracts fields from a string containing key-value pairs.',
}),
getDefaultDescription: ({ field, field_split: fieldSplit, value_split: valueSplit }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.kv', {
defaultMessage:
'Extracts key-value pairs from "{field}" and splits on "{field_split}" and "{value_split}"',
values: {
field,
field_split: fieldSplit,
value_split: valueSplit,
},
}),
},
lowercase: {
FieldsComponent: Lowercase,
@ -315,9 +490,16 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.lowercase', {
defaultMessage: 'Lowercase',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.lowercase', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.lowercase', {
defaultMessage: 'Converts a string to lowercase.',
}),
getDefaultDescription: ({ field }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.lowercase', {
defaultMessage: 'Converts values in "{field}" to lowercase',
values: {
field,
},
}),
},
pipeline: {
FieldsComponent: Pipeline,
@ -325,9 +507,16 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.pipeline', {
defaultMessage: 'Pipeline',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.pipeline', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.pipeline', {
defaultMessage: 'Runs another ingest node pipeline.',
}),
getDefaultDescription: ({ name }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.pipeline', {
defaultMessage: 'Runs the "{name}" ingest pipeline',
values: {
name,
},
}),
},
remove: {
FieldsComponent: Remove,
@ -335,9 +524,16 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.remove', {
defaultMessage: 'Remove',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.remove', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.remove', {
defaultMessage: 'Removes one or more fields.',
}),
getDefaultDescription: ({ field }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.remove', {
defaultMessage: 'Removes "{field}"',
values: {
field: Array.isArray(field) ? field.map((v) => `"${v}"`).join(', ') : field,
},
}),
},
rename: {
FieldsComponent: Rename,
@ -345,9 +541,17 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.rename', {
defaultMessage: 'Rename',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.rename', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.rename', {
defaultMessage: 'Renames an existing field.',
}),
getDefaultDescription: ({ field, target_field: targetField }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.rename', {
defaultMessage: 'Renames "{field}" to "{target_field}"',
values: {
field,
target_field: targetField,
},
}),
},
script: {
FieldsComponent: Script,
@ -355,9 +559,10 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.script', {
defaultMessage: 'Script',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.script', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.script', {
defaultMessage: 'Runs a script on incoming documents.',
}),
getDefaultDescription: () => 'Runs a script on incoming documents',
},
set: {
FieldsComponent: SetProcessor,
@ -365,9 +570,17 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.set', {
defaultMessage: 'Set',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.set', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.set', {
defaultMessage: 'Sets the value of a field.',
}),
getDefaultDescription: ({ field, value }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.set', {
defaultMessage: 'Sets value of "{field}" to "{value}"',
values: {
field,
value,
},
}),
},
set_security_user: {
FieldsComponent: SetSecurityUser,
@ -375,10 +588,18 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.setSecurityUser', {
defaultMessage: 'Set security user',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.setSecurityUser', {
defaultMessage:
'Adds details about the current user, such user name and email address, to incoming documents. Requires an authenticated user for the indexing request.',
}),
typeDescription: i18n.translate(
'xpack.ingestPipelines.processors.description.setSecurityUser',
{
defaultMessage:
'Adds details about the current user, such user name and email address, to incoming documents. Requires an authenticated user for the indexing request.',
}
),
getDefaultDescription: ({ field }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.setSecurityUser', {
defaultMessage: 'Adds details about the current user to "{field}"',
values: { field },
}),
},
sort: {
FieldsComponent: Sort,
@ -386,9 +607,26 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.sort', {
defaultMessage: 'Sort',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.sort', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.sort', {
defaultMessage: "Sorts a field's array elements.",
}),
getDefaultDescription: ({ field, order = 'asc' }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.sort', {
defaultMessage: 'Sorts elements in the array "{field}" in {order} order',
values: {
field,
order:
order === 'asc'
? i18n.translate(
'xpack.ingestPipelines.processors.defaultDescription.sort.orderAscendingLabel',
{ defaultMessage: 'ascending' }
)
: i18n.translate(
'xpack.ingestPipelines.processors.defaultDescription.sort.orderDescendingLabel',
{ defaultMessage: 'descending' }
),
},
}),
},
split: {
FieldsComponent: Split,
@ -396,9 +634,16 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.split', {
defaultMessage: 'Split',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.split', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.split', {
defaultMessage: 'Splits a field value into an array.',
}),
getDefaultDescription: ({ field }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.split', {
defaultMessage: 'Splits the string stored in "{field}" to an array',
values: {
field,
},
}),
},
trim: {
FieldsComponent: Trim,
@ -406,9 +651,16 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.trim', {
defaultMessage: 'Trim',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.trim', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.trim', {
defaultMessage: 'Removes leading and trailing whitespace from a string.',
}),
getDefaultDescription: ({ field }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.trim', {
defaultMessage: 'Trims whitespaces from "{field}"',
values: {
field,
},
}),
},
uppercase: {
FieldsComponent: Uppercase,
@ -416,9 +668,16 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.uppercase', {
defaultMessage: 'Uppercase',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.uppercase', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.uppercase', {
defaultMessage: 'Converts a string to uppercase.',
}),
getDefaultDescription: ({ field }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.uppercase', {
defaultMessage: 'Converts values in "{field}" to uppercase',
values: {
field,
},
}),
},
urldecode: {
FieldsComponent: UrlDecode,
@ -426,19 +685,16 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.urldecode', {
defaultMessage: 'URL decode',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.urldecode', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.urldecode', {
defaultMessage: 'Decodes a URL-encoded string.',
}),
},
user_agent: {
FieldsComponent: UserAgent,
docLinkPath: '/user-agent-processor.html',
label: i18n.translate('xpack.ingestPipelines.processors.label.userAgent', {
defaultMessage: 'User agent',
}),
description: i18n.translate('xpack.ingestPipelines.processors.description.userAgent', {
defaultMessage: "Extracts values from a browser's user agent string.",
}),
getDefaultDescription: ({ field }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.url_decode', {
defaultMessage: 'Decodes the URL in "{field}"',
values: {
field,
},
}),
},
uri_parts: {
FieldsComponent: UriParts,
@ -446,10 +702,38 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = {
label: i18n.translate('xpack.ingestPipelines.processors.label.uriPartsLabel', {
defaultMessage: 'URI parts',
}),
description: i18n.translate('xpack.ingestPipelines.processors.uriPartsDescription', {
typeDescription: i18n.translate('xpack.ingestPipelines.processors.uriPartsDescription', {
defaultMessage:
'Parses a Uniform Resource Identifier (URI) string and extracts its components as an object.',
}),
getDefaultDescription: ({ field, target_field: targetField = 'url' }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.uri_parts', {
defaultMessage:
'Parses the URI string in "{field}" and stores the result in "{target_field}"',
values: {
field,
target_field: targetField,
},
}),
},
user_agent: {
FieldsComponent: UserAgent,
docLinkPath: '/user-agent-processor.html',
label: i18n.translate('xpack.ingestPipelines.processors.label.userAgent', {
defaultMessage: 'User agent',
}),
typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.userAgent', {
defaultMessage: "Extracts values from a browser's user agent string.",
}),
getDefaultDescription: ({ field, target_field: targetField = 'user_agent' }) =>
i18n.translate('xpack.ingestPipelines.processors.defaultDescription.user_agent', {
defaultMessage:
'Extracts the user agent from "{field}" and stores the results in "{target_field}"',
values: {
field,
target_field: targetField,
},
}),
},
};