From 3abc41c2f4fb3c037b34bbef7fb9fb0d9e9f381d Mon Sep 17 00:00:00 2001 From: Ralph Ursprung Date: Thu, 31 Mar 2022 15:59:13 +0200 Subject: [PATCH 01/48] Add Basic Documentation for Terms Lookup Query this adds very rudimentary documentation for TLQ so that it at least doesn't go unmentioned. however, there are many more details which should be mentioned. this should then be done with #430. more information can be found in the [Elasticsearch TLQ Documentation][ESTLQ]. i'm not 100% sure whether this was under the Apache 2.0 license in 7.10 (the repo states that everything is Apache 2.0 unless explicitly stated otherwise in the file and the documentation files don't seem to include any other license?) and thus didn't simply take over the documentation from there (which would of course be the easiest and most complete way of doing it). also i'm not sure (and didn't find this information anywhere) whether the test data actually exists and the queries can be run against the test data? in that case the provided example either needs to be adapted to the existing test data or the test data needs to be extended accordingly (i doubt that an index `play-assignments` already exists?). due to this the example has also not been tested. Signed-off-by: Ralph Ursprung [ESTLQ]: https://www.elastic.co/guide/en/elasticsearch/reference/7.10/query-dsl-terms-query.html#query-dsl-terms-lookup --- _opensearch/query-dsl/term.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/_opensearch/query-dsl/term.md b/_opensearch/query-dsl/term.md index dccbb762..8a62816c 100644 --- a/_opensearch/query-dsl/term.md +++ b/_opensearch/query-dsl/term.md @@ -271,6 +271,33 @@ GET shakespeare/_search You get back documents that match any of the terms. +### Terms Lookup + +You can use a `terms` query with a `lookup` to match values based on a field in a document in another index. + +Parameter | Behavior +:--- | :--- +`index` | The index from which the document is read. +`id` | The id of the documented. +`path` | Path to the field from which the values are used in the terms query. + +E.g. to get all lines from the shakespeare play for a role (or roles) specified in the index `play-assignments` for the entry `42`: + +```json +GET shakespeare/_search +{ + "query": { + "terms": { + "speaker": { + "index": "play-assignments", + "id": "42", + "path": "role" + } + } + } +} +``` + ## IDs Use the `ids` query to search for one or more document ID values. From 309f79df7fa7d90481edcdefee52e4e0af8559a9 Mon Sep 17 00:00:00 2001 From: alicejw Date: Mon, 18 Apr 2022 14:30:56 -0700 Subject: [PATCH 02/48] for terminology change from 'master' to 'cluster_manager' per issue #450 https://github.com/opensearch-project/documentation-website/issues/450 Signed-off-by: alicejw --- _opensearch/cluster.md | 28 +++++++++---------- _opensearch/install/docker-security.md | 4 +-- .../{cat-master.md => cat-cluster_manager.md} | 14 +++++----- _opensearch/rest-api/cat/cat-nodes.md | 8 +++--- _opensearch/rest-api/cluster-health.md | 4 +-- _opensearch/rest-api/cluster-settings.md | 2 +- _opensearch/rest-api/cluster-stats.md | 6 ++-- _opensearch/stats-api.md | 12 ++++---- 8 files changed, 39 insertions(+), 39 deletions(-) rename _opensearch/rest-api/cat/{cat-master.md => cat-cluster_manager.md} (60%) diff --git a/_opensearch/cluster.md b/_opensearch/cluster.md index 3ee6bd48..2101803e 100644 --- a/_opensearch/cluster.md +++ b/_opensearch/cluster.md @@ -16,19 +16,19 @@ There are many ways to design a cluster. The following illustration shows a basi ![multi-node cluster architecture diagram]({{site.url}}{{site.baseurl}}/images/cluster.png) -This is a four-node cluster that has one dedicated master node, one dedicated coordinating node, and two data nodes that are master-eligible and also used for ingesting data. +This is a four-node cluster that has one dedicated cluster_manager node, one dedicated coordinating node, and two data nodes that are cluster_manager-eligible and also used for ingesting data. The following table provides brief descriptions of the node types: Node type | Description | Best practices for production :--- | :--- | :-- | -`Master` | Manages the overall operation of a cluster and keeps track of the cluster state. This includes creating and deleting indices, keeping track of the nodes that join and leave the cluster, checking the health of each node in the cluster (by running ping requests), and allocating shards to nodes. | Three dedicated master nodes in three different zones is the right approach for almost all production use cases. This configuration ensures your cluster never loses quorum. Two nodes will be idle for most of the time except when one node goes down or needs some maintenance. -`Master-eligible` | Elects one node among them as the master node through a voting process. | For production clusters, make sure you have dedicated master nodes. The way to achieve a dedicated node type is to mark all other node types as false. In this case, you have to mark all the other nodes as not master-eligible. +`Cluster_manager` | Manages the overall operation of a cluster and keeps track of the cluster state. This includes creating and deleting indices, keeping track of the nodes that join and leave the cluster, checking the health of each node in the cluster (by running ping requests), and allocating shards to nodes. | Three dedicated cluster_manager nodes in three different zones is the right approach for almost all production use cases. This configuration ensures your cluster never loses quorum. Two nodes will be idle for most of the time except when one node goes down or needs some maintenance. +`Cluster_manager-eligible` | Elects one node among them as the cluster_manager node through a voting process. | For production clusters, make sure you have dedicated cluster_manager nodes. The way to achieve a dedicated node type is to mark all other node types as false. In this case, you have to mark all the other nodes as not cluster_manager-eligible. `Data` | Stores and searches data. Performs all data-related operations (indexing, searching, aggregating) on local shards. These are the worker nodes of your cluster and need more disk space than any other node type. | As you add data nodes, keep them balanced between zones. For example, if you have three zones, add data nodes in multiples of three, one for each zone. We recommend using storage and RAM-heavy nodes. `Ingest` | Preprocesses data before storing it in the cluster. Runs an ingest pipeline that transforms your data before adding it to an index. | If you plan to ingest a lot of data and run complex ingest pipelines, we recommend you use dedicated ingest nodes. You can also optionally offload your indexing from the data nodes so that your data nodes are used exclusively for searching and aggregating. `Coordinating` | Delegates client requests to the shards on the data nodes, collects and aggregates the results into one final result, and sends this result back to the client. | A couple of dedicated coordinating-only nodes is appropriate to prevent bottlenecks for search-heavy workloads. We recommend using CPUs with as many cores as you can. -By default, each node is a master-eligible, data, ingest, and coordinating node. Deciding on the number of nodes, assigning node types, and choosing the hardware for each node type depends on your use case. You must take into account factors like the amount of time you want to hold on to your data, the average size of your documents, your typical workload (indexing, searches, aggregations), your expected price-performance ratio, your risk tolerance, and so on. +By default, each node is a cluster_manager-eligible, data, ingest, and coordinating node. Deciding on the number of nodes, assigning node types, and choosing the hardware for each node type depends on your use case. You must take into account factors like the amount of time you want to hold on to your data, the average size of your documents, your typical workload (indexing, searches, aggregations), your expected price-performance ratio, your risk tolerance, and so on. After you assess all these requirements, we recommend you use a benchmark testing tool like Rally to provision a small sample cluster and run tests with varying workloads and configurations. Compare and analyze the system and query metrics for these tests to design an optimum architecture. To get started with Rally, see the [Rally documentation](https://esrally.readthedocs.io/en/stable/). @@ -66,18 +66,18 @@ Make the same change on all the nodes to make sure that they'll join to form a c After you name the cluster, set node attributes for each node in your cluster. -#### Master node +#### Cluster manager node -Give your master node a name. If you don't specify a name, OpenSearch assigns a machine-generated name that makes the node difficult to monitor and troubleshoot. +Give your cluster_manager node a name. If you don't specify a name, OpenSearch assigns a machine-generated name that makes the node difficult to monitor and troubleshoot. ```yml -node.name: opensearch-master +node.name: opensearch-cluster_manager ``` -You can also explicitly specify that this node is a master node. This is already true by default, but adding it makes it easier to identify the master node. +You can also explicitly specify that this node is a cluster_manager node. This is already true by default, but adding it makes it easier to identify the cluster_manager node. ```yml -node.roles: [ master ] +node.roles: [ cluster_manager ] ``` @@ -92,7 +92,7 @@ node.name: opensearch-d1 node.name: opensearch-d2 ``` -You can make them master-eligible data nodes that will also be used for ingesting data: +You can make them cluster_manager-eligible data nodes that will also be used for ingesting data: ```yml node.roles: [ data, ingest ] @@ -139,9 +139,9 @@ Now that you've configured the network hosts, you need to configure the discover Zen Discovery is the built-in, default mechanism that uses [unicast](https://en.wikipedia.org/wiki/Unicast) to find other nodes in the cluster. -You can generally just add all your master-eligible nodes to the `discovery.seed_hosts` array. When a node starts up, it finds the other master-eligible nodes, determines which one is the master, and asks to join the cluster. +You can generally just add all your cluster_manager-eligible nodes to the `discovery.seed_hosts` array. When a node starts up, it finds the other cluster_manager-eligible nodes, determines which one is the cluster_manager, and asks to join the cluster. -For example, for `opensearch-master` the line looks something like this: +For example, for `opensearch-cluster_manager` the line looks something like this: ```yml discovery.seed_hosts: ["", "", ""] @@ -169,8 +169,8 @@ curl -XGET https://:9200/_cat/nodes?v -u 'admin:admin' --insecure ``` ``` -ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name -x.x.x.x 13 61 0 0.02 0.04 0.05 mi * opensearch-master +ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role cluster_manager name +x.x.x.x 13 61 0 0.02 0.04 0.05 mi * opensearch-cluster_manager x.x.x.x 16 60 0 0.06 0.05 0.05 md - opensearch-d1 x.x.x.x 34 38 0 0.12 0.07 0.06 md - opensearch-d2 x.x.x.x 23 38 0 0.12 0.07 0.06 md - opensearch-c1 diff --git a/_opensearch/install/docker-security.md b/_opensearch/install/docker-security.md index 056fd206..15fd189d 100644 --- a/_opensearch/install/docker-security.md +++ b/_opensearch/install/docker-security.md @@ -24,7 +24,7 @@ services: - cluster.name=opensearch-cluster - node.name=opensearch-node1 - discovery.seed_hosts=opensearch-node1,opensearch-node2 - - cluster.initial_master_nodes=opensearch-node1,opensearch-node2 + - cluster.initial_cluster_manager_nodes=opensearch-node1,opensearch-node2 - bootstrap.memory_lock=true # along with the memlock settings below, disables swapping - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m" # minimum and maximum Java heap size, recommend setting both to 50% of system RAM - network.host=0.0.0.0 # required if not using the demo security configuration @@ -60,7 +60,7 @@ services: - cluster.name=opensearch-cluster - node.name=opensearch-node2 - discovery.seed_hosts=opensearch-node1,opensearch-node2 - - cluster.initial_master_nodes=opensearch-node1,opensearch-node2 + - cluster.initial_cluster_manager_nodes=opensearch-node1,opensearch-node2 - bootstrap.memory_lock=true - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m" - network.host=0.0.0.0 diff --git a/_opensearch/rest-api/cat/cat-master.md b/_opensearch/rest-api/cat/cat-cluster_manager.md similarity index 60% rename from _opensearch/rest-api/cat/cat-master.md rename to _opensearch/rest-api/cat/cat-cluster_manager.md index 73ca13d1..9f81c83b 100644 --- a/_opensearch/rest-api/cat/cat-master.md +++ b/_opensearch/rest-api/cat/cat-cluster_manager.md @@ -1,39 +1,39 @@ --- layout: default -title: cat master +title: CAT cluster manager parent: CAT grand_parent: REST API reference nav_order: 30 has_children: false --- -# cat master +# CAT cluster_manager Introduced 1.0 {: .label .label-purple } -The cat master operation lists information that helps identify the elected master node. +The cat cluster manager operation lists information that helps identify the elected cluster_manager node. ## Example ``` -GET _cat/master?v +GET _cat/cluster_manager?v ``` ## Path and HTTP methods ``` -GET _cat/master +GET _cat/cluster_manager ``` ## URL parameters -All cat master URL parameters are optional. +All cat cluster manager URL parameters are optional. In addition to the [common URL parameters]({{site.url}}{{site.baseurl}}/opensearch/rest-api/cat/index#common-url-parameters), you can specify the following parameters: Parameter | Type | Description :--- | :--- | :--- -master_timeout | Time | The amount of time to wait for a connection to the master node. Default is 30 seconds. +cluster_manager_timeout | Time | The amount of time to wait for a connection to the cluster_manager node. Default is 30 seconds. ## Response diff --git a/_opensearch/rest-api/cat/cat-nodes.md b/_opensearch/rest-api/cat/cat-nodes.md index d2587bc6..8d3c7c0a 100644 --- a/_opensearch/rest-api/cat/cat-nodes.md +++ b/_opensearch/rest-api/cat/cat-nodes.md @@ -13,7 +13,7 @@ Introduced 1.0 The cat nodes operation lists node-level information, including node roles and load metrics. -A few important node metrics are `pid`, `name`, `master`, `ip`, `port`, `version`, `build`, `jdk`, along with `disk`, `heap`, `ram`, and `file_desc`. +A few important node metrics are `pid`, `name`, `cluster_manager`, `ip`, `port`, `version`, `build`, `jdk`, along with `disk`, `heap`, `ram`, and `file_desc`. ## Example @@ -37,8 +37,8 @@ Parameter | Type | Description :--- | :--- | :--- bytes | Byte size | Specify the units for byte size. For example, `7kb` or `6gb`. For more information, see [Supported units]({{site.url}}{{site.baseurl}}/opensearch/units/). full_id | Boolean | If true, return the full node ID. If false, return the shortened node ID. Defaults to false. -local | Boolean | Whether to return information from the local node only instead of from the master node. Default is false. -master_timeout | Time | The amount of time to wait for a connection to the master node. Default is 30 seconds. +local | Boolean | Whether to return information from the local node only instead of from the cluster_manager node. Default is false. +cluster_manager_timeout | Time | The amount of time to wait for a connection to the cluster_manager node. Default is 30 seconds. time | Time | Specify the units for time. For example, `5d` or `7h`. For more information, see [Supported units]({{site.url}}{{site.baseurl}}/opensearch/units/). include_unloaded_segments | Boolean | Whether to include information from segments not loaded into memory. Default is false. @@ -46,7 +46,7 @@ include_unloaded_segments | Boolean | Whether to include information from segmen ## Response ```json -ip | heap.percent | ram.percent | cpu load_1m | load_5m | load_15m | node.role | master | name +ip | heap.percent | ram.percent | cpu load_1m | load_5m | load_15m | node.role | cluster_manager | name 172.18.0.3 | 31 | 97 | 3 | 0.03 | 0.10 | 0.14 dimr | * | odfe-node2 172.18.0.4 | 45 | 97 | 3 | 0.19 | 0.14 | 0.15 dimr | - | odfe-node1 ``` diff --git a/_opensearch/rest-api/cluster-health.md b/_opensearch/rest-api/cluster-health.md index 64c7a909..f20da3ec 100644 --- a/_opensearch/rest-api/cluster-health.md +++ b/_opensearch/rest-api/cluster-health.md @@ -38,8 +38,8 @@ Parameter | Type | Description :--- | :--- | :--- expand_wildcards | Enum | Expands wildcard expressions to concrete indices. Combine multiple values with commas. Supported values are `all`, `open`, `closed`, `hidden`, and `none`. Default is `open`. level | Enum | The level of detail for returned health information. Supported values are `cluster`, `indices`, and `shards`. Default is `cluster`. -local | Boolean | Whether to return information from the local node only instead of from the master node. Default is false. -master_timeout | Time | The amount of time to wait for a connection to the master node. Default is 30 seconds. +local | Boolean | Whether to return information from the local node only instead of from the cluster_manager node. Default is false. +cluster_manager_timeout | Time | The amount of time to wait for a connection to the cluster_manager node. Default is 30 seconds. timeout | Time | The amount of time to wait for a response. If the timeout expires, the request fails. Default is 30 seconds. wait_for_active_shards | String | Wait until the specified number of shards is active before returning a response. `all` for all shards. Default is `0`. wait_for_events | Enum | Wait until all currently queued events with the given priority are processed. Supported values are `immediate`, `urgent`, `high`, `normal`, `low`, and `languid`. diff --git a/_opensearch/rest-api/cluster-settings.md b/_opensearch/rest-api/cluster-settings.md index 7c8b9870..6a76f182 100644 --- a/_opensearch/rest-api/cluster-settings.md +++ b/_opensearch/rest-api/cluster-settings.md @@ -44,7 +44,7 @@ Parameter | Type | Description :--- | :--- | :--- flat_settings | Boolean | Whether to return settings in the flat form, which can improve readability, especially for heavily nested settings. For example, the flat form of `"cluster": { "max_shards_per_node": 500 }` is `"cluster.max_shards_per_node": "500"`. include_defaults (GET only) | Boolean | Whether to include default settings as part of the response. This parameter is useful for identifying the names and current values of settings you want to update. -master_timeout | Time | The amount of time to wait for a response from the master node. Default is 30 seconds. +cluster_manager_timeout | Time | The amount of time to wait for a response from the cluster_manager node. Default is 30 seconds. timeout (PUT only) | Time | The amount of time to wait for a response from the cluster. Default is 30 seconds. diff --git a/_opensearch/rest-api/cluster-stats.md b/_opensearch/rest-api/cluster-stats.md index 1eef74d0..80815d9a 100644 --- a/_opensearch/rest-api/cluster-stats.md +++ b/_opensearch/rest-api/cluster-stats.md @@ -14,7 +14,7 @@ The cluster stats API operation returns statistics about your cluster. ## Examples ```json -GET _cluster/stats/nodes/_master +GET _cluster/stats/nodes/_cluster_manager ``` ## Path and HTTP methods @@ -31,7 +31,7 @@ All cluster stats parameters are optional. Parameter | Type | Description :--- | :--- | :--- -<node-filters> | List | A comma-separated list of node-filters that OpenSearch uses to filter results. Available options are `all`, `_local`, `_master`, a node name or ID, `master:true`, `master:false`, `data:true`, `data:false`, `ingest:true`, `ingest:false`, `voting_only:true`, `voting_only:false`, `ml:true`, `ml:false`, `coordinating_only:true`, `coordinating_only:false`, and <custom node attributes> : <attribute values> pairs. +<node-filters> | List | A comma-separated list of node-filters that OpenSearch uses to filter results. Available options are `all`, `_local`, `_cluster_manager`, a node name or ID, `cluster_manager:true`, `cluster_manager:false`, `data:true`, `data:false`, `ingest:true`, `ingest:false`, `voting_only:true`, `voting_only:false`, `ml:true`, `ml:false`, `coordinating_only:true`, `coordinating_only:false`, and <custom node attributes> : <attribute values> pairs. ## Response @@ -217,7 +217,7 @@ Parameter | Type | Description "coordinating_only": 0, "data": 1, "ingest": 1, - "master": 1, + "cluster_manager": 1, "remote_cluster_client": 1 }, "versions": [ diff --git a/_opensearch/stats-api.md b/_opensearch/stats-api.md index ac057357..050d0bb6 100644 --- a/_opensearch/stats-api.md +++ b/_opensearch/stats-api.md @@ -44,7 +44,7 @@ If `enforced` is `true`: "roles": [ "data", "ingest", - "master", + "cluster_manager", "remote_cluster_client" ], "attributes": { @@ -151,7 +151,7 @@ If `enforced` is `false`: "roles": [ "data", "ingest", - "master", + "cluster_manager", "remote_cluster_client" ], "attributes": { @@ -264,7 +264,7 @@ GET _nodes/_local/stats/shard_indexing_pressure?include_all "roles": [ "data", "ingest", - "master", + "cluster_manager", "remote_cluster_client" ], "attributes": { @@ -379,7 +379,7 @@ If `enforced` is `true`: "roles": [ "data", "ingest", - "master", + "cluster_manager", "remote_cluster_client" ], "attributes": { @@ -422,7 +422,7 @@ If `enforced` is `false`: "roles": [ "data", "ingest", - "master", + "cluster_manager", "remote_cluster_client" ], "attributes": { @@ -471,7 +471,7 @@ GET _nodes/stats/shard_indexing_pressure "roles": [ "data", "ingest", - "master", + "cluster_manager", "remote_cluster_client" ], "attributes": { From af4afc2c1cc09675b9fbdf396beb394ba1554ee5 Mon Sep 17 00:00:00 2001 From: alicejw Date: Mon, 18 Apr 2022 14:32:49 -0700 Subject: [PATCH 03/48] for more changes to replace terms for #450 Signed-off-by: alicejw --- _opensearch/rest-api/cat/cat-pending-tasks.md | 4 ++-- _opensearch/rest-api/cat/index.md | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/_opensearch/rest-api/cat/cat-pending-tasks.md b/_opensearch/rest-api/cat/cat-pending-tasks.md index 37cf82ac..8f50bfb3 100644 --- a/_opensearch/rest-api/cat/cat-pending-tasks.md +++ b/_opensearch/rest-api/cat/cat-pending-tasks.md @@ -33,8 +33,8 @@ In addition to the [common URL parameters]({{site.url}}{{site.baseurl}}/opensear Parameter | Type | Description :--- | :--- | :--- -local | Boolean | Whether to return information from the local node only instead of from the master node. Default is false. -master_timeout | Time | The amount of time to wait for a connection to the master node. Default is 30 seconds. +local | Boolean | Whether to return information from the local node only instead of from the cluster_manager node. Default is false. +cluster_manager_timeout | Time | The amount of time to wait for a connection to the cluster_manager node. Default is 30 seconds. time | Time | Specify the units for time. For example, `5d` or `7h`. For more information, see [Supported units]({{site.url}}{{site.baseurl}}/opensearch/units/). diff --git a/_opensearch/rest-api/cat/index.md b/_opensearch/rest-api/cat/index.md index c5376636..f38306e5 100644 --- a/_opensearch/rest-api/cat/index.md +++ b/_opensearch/rest-api/cat/index.md @@ -1,6 +1,6 @@ --- layout: default -title: CAT +title: Compact and aligned text (CAT) API parent: REST API reference nav_order: 100 has_children: true @@ -8,15 +8,15 @@ redirect_from: - /opensearch/catapis/ --- -# cat API +# CAT API -You can get essential statistics about your cluster in an easy-to-understand, tabular format using the compact and aligned text (CAT) API. The cat API is a human-readable interface that returns plain text instead of traditional JSON. +You can get essential statistics about your cluster in an easy-to-understand, tabular format using the compact and aligned text (CAT) API. The CAT API is a human-readable interface that returns plain text instead of traditional JSON. -Using the cat API, you can answer questions like which node is the elected master, what state is the cluster in, how many documents are in each index, and so on. +Using the CAT API, you can answer questions like which node is the elected master, what state is the cluster in, how many documents are in each index, and so on. ## Example -To see the available operations in the cat API, use the following command: +To see the available operations in the CAT API, use the following command: ``` GET _cat From 616dcacc13484531eda64a69b7c5dbb703bc6fbe Mon Sep 17 00:00:00 2001 From: alicejw Date: Mon, 18 Apr 2022 15:40:32 -0700 Subject: [PATCH 04/48] for image update to match new terminology text Signed-off-by: alicejw --- _opensearch/cluster.md | 2 +- images/cluster.png | Bin 24024 -> 0 bytes images/cluster.v2.png | Bin 0 -> 24652 bytes 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 images/cluster.png create mode 100644 images/cluster.v2.png diff --git a/_opensearch/cluster.md b/_opensearch/cluster.md index 2101803e..379f0a12 100644 --- a/_opensearch/cluster.md +++ b/_opensearch/cluster.md @@ -14,7 +14,7 @@ To create and deploy an OpenSearch cluster according to your requirements, it’ There are many ways to design a cluster. The following illustration shows a basic architecture: -![multi-node cluster architecture diagram]({{site.url}}{{site.baseurl}}/images/cluster.png) +![multi-node cluster architecture diagram]({{site.url}}{{site.baseurl}}/images/cluster.v2.png) This is a four-node cluster that has one dedicated cluster_manager node, one dedicated coordinating node, and two data nodes that are cluster_manager-eligible and also used for ingesting data. diff --git a/images/cluster.png b/images/cluster.png deleted file mode 100644 index f5262a06efff15c79a47336a9b8a2a26790931d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24024 zcmZs@1ymeC(=LoGumpE^cMtCFZXsA8xVyUscL?t8?hxGF-Q6KrfPa(sz2A55Isfk2 zGc!Fs)z#HAH6>4NxRQb-!YABMU|?Vf(o$k7U|`@=pdSzj4Qk;|@}&Z8z#Ua2MZl^i z@lQYpO5e4lP2}alXhHixFbHr|Fv!1MKwq#>b1=ZaeK0Ue&=w2~G6(#B&*nhiObY)|-bueXO;pXOMVrFGxWn}>MU~qJ|aWZscuyG{&50U>v zN9?4jTC{eE}A}e?9-7w*QX9$Mkpb|BIRb%=BL?XsQCA_?Z4jYyzL; zeo<+IfeC?0iwUc_fnRvT7<|=C`W?qUYc@}@7EeFYIm&P;ozY*42zwI5J}YHN@~5Up z#6a{pMc1beZVV!q0Tz}#=swm)<)S}acD$Rjzougr`?RsKF~7PhGZalg*1n-YnIL__;eKme zr$sNyhtWDVU0qozf5K(G$}S@%1(e=J3=Oofv@~CDu~!}tBu|Tz$_wy|HB~c65gS5< zATA`}b(wCmUMndtkJ#Paou?BJ$oll@({TVCW6sH3u_Qh!vWK`hRHaUHw1tHQy0!@C zF^A`Gt1q1%jiirZbcadAPV@{6>Q5WKA8(2A@w?8P*D=KV&6^&w2lh9+1OAdur_wP) zqEw1m1%rbUJZBa4A`-X4bd)GT2;d}BHNtc#a1aF*t@7!gXLzqV@+&gFk0sN{4jnkm zgriZJJzj2<^}eki31HbnK>2q(AEu8&Kq@PwGW!cbBqb&NP|Dr2Zr&&g6ZrCdWo|CN z!Wo&`2`;JUme1)JnL(?Dm|Pj6JP-znHa=U>w=33EN@>BBTqNs-k!WVJ2bi-HYH4?| z+L)M`Ss4bbl9cD++A<)i9OF6FwOI67>o}TS8FjeLZ@WV(!2>i3Nvxy2} zFw184djeGl2L}&=#ouua{it>a?|_hxk4gc2r1Z=IV4~ap_nlB4z0L>`c-SJ>^rJA} z{f@39IS;QXiEXFBmy{Lky!X^~b>-2h6x1|WN6~n;1$Mzqw6(S0%!z#}35l<$$MW(> zo%P?3@xVzGy;EY$Obq}A8;OaDB_YqrIyNM>yJAg3V04;QYM5|R@WwE=?t4+3i5Q!(bB5Wq(O8frM9r^izCX*S` zmWvh2K~S?`;A9A15`1Rcaf3;kdZk}mac8zy6b0WBbEw3~?(Zgf731KBp#hzSeb7mS zVL-9ymRQM_LSZhQW*c>5aBpE&H$r>st*%U$i`7CYxGDdA%?d5y;NW0d{zx?2^%mtg zwEJK^*%U@~o2CAKF^s`iq%cfIa{~Z9GIRlaIWo38+%VjZ(CsiM-~en4y_)y3MN~IX z9PzPT!VQ}!B-(C{w6d;_RXj1B(^kX7-%0shr^!m00C69UAmv~zg^u5kJ1fu>!v1`t zUDJ?ezjS-?jVR5!{FM|HD(VLqt~+})u{8T?7r@A^1;zo4Bw&Bj^NL>_y(a!gL4U`iri0jY3(1xp{`rrDK3}mrSZa$A2X6fG%7-5NZ-W!5F7%A+lrYe*3-l=I$SXwX_`#txPhW#qVkM_VO@_ zE1G4X9Ke+W1IPr6oq-|p%8|m>(DU%%A>eipYmE{98G*^5qJg(7;z5iJ1YTb6^wC~& zJ06zY8_WdOz(kn9ev_*&E0bw8xq+u|*VOk`*RI~25@PB{;Aa zpi?XWcaWe0cMBjE_Hi4!tL}bpn?-rbC!3p{&8ylW+^sAxS7p475q#H5f*n=u#|DNS zm`6IGG9ZM3;Tj;L(BmSPFoDGfKdw8`#eu zW9rVR>Uy#GuAYkm9p_iVKK5x5XFW6whCB)ypHWUrD&?y~xP$Vh*WJXAM8gL^H$#+P z7_b37Zp0=Vq)1^{`+nENpJLg5z3&lyRL_IVg=H4j z%jE?EF$sZK0IxZDP8x52$o2GTw0>y+_nKSAj%$$vO7X7ury)UFdghZ+9rkiGG1u3N z=5htF*$fWLWKz$4(~{fk=%H6O9vIM5TUH-nZ<&Y|M!5ee51`kBML@hAb8n#hYvNCo ztykdTWM+AlKR%J~ANvPVutL8aKG4MfidxhAK(BXJu_@W*qsB} z?Mr~LA9G`^F#CB8SK|$z*AN%^dMk1F-cSr3E0p#x(%>9>m|TBjVFBbQW{y0eKqLr& zyO5BNY%+Z=jcO4!7OfQSP2ZP3G187LkF&}*4I&^!5SXx!P_z`>r6&9PG)ndkggCC9 zD49TuEC)DY%{X%(#v<#lUV#6wC}-i zSY>NHSkL{-j8b}i2G{kX-Z06-L>0e}vVFVs^^tkP2$wzK?EE<*Cc$~YhsgjZySRfA z9Kx*`-oIBwGH{8Z-LY=jrG&$O4vK>9`$-TQ!{qg0FB{C@dLZKrK5s(+gme6t00@G( zwm^DL_IYBaSVkaxz*S9;fv)*p;$~1JGj3Y`%^;iyh}WCX$FMW^{)Mn9bc06*=HIN; z$mB4t=ZUm_*-eRHjej0sBNmK$+VKdP{3%2g3svLaBO>~9^Eo){DLQ2l<$4foiUfWb zZ3+p~Ny-n!?w-=-7!V&CDV7xm>0u6$S>1L@s~$oupmov%S%4&qhwTQJ6?!?1k_nWz zBOri5Zl&yj$izi4A|c*4uee3EMhF6v0vK7R3I&9-+L;Fc*oFI$#^4JeX9LF&_hIY6 zOU)rT$xSTtZX~g_48!oEn0G^o;lGBMUE3?7v2S((_QRcas-SYsqBy1SF)3$5)3L8= zDuf7$Kkb7~{%oA;wUW znJA&mci%ExCYE@20TNO~H{WJacA=Y6Qwt1>_{&jhIY&fcw03{y-1!|beZ%6|g<8b! z9>8Yh;kOI)j3|Q43iQOR(glvfJkRpbZB7lF8j)0CohDCj|&==SaQAju{sY*Av-<4GE_ zj7!Ov^TT!xYJ|GIr5J|!IzJ7G<`OF~+p9%8%!@q3115!4Z^W@H>SZVC=_-dTcrB8} z91fF8N`$=?w5E>67YM6Pjpd}kOc=?ch|IJ*#JdZQcq}CZ)8gKU2%R;<+*|S8Hg9n@ z))lmp$;Gv!vJD)_5N1k-GreE>D(08;Jmn{ppm6-rcP0ZL-1`tXsUc?Sp!592UuI>Q zXdwDb*~e=PggjE60>asdWygu3a`Sd1Q}3n(^&?D{U6BbXYco7ATPtz$py z5j$xW*5om^pR*Qz)K3YN12K#d;{A27o_igM(PIzbm^yO0`bGm9Kgq)F#H7jF%C@+YV;aRM^$VGE zFvx;PzHJ_Q(PMxt!hVq5G~`R4dPGeaOc20f&>IHe*zya z6j>Aq#Z-lRkb!<&!idC*$cVU>vAL8jNSc?`J`Z#+i_Kky^c)~JB6emN5i>|q6mb?D zoODu1jLfMZ7@E-D{~8+Z=O^SwiT7#W8o#f0L{pXo5L(_+kOk}+#Q4|3KDmu%u!F9Ci1Ipj?z@r`G&o7TRv8NXyaw`q-HgSGC8b};1=zz=n(uF=IPfpMv1t66@Tgb4-Z&l2X>Vm)M#E1Ucf0k$5J8VM=;y#^{@zfzn{*x($b1i62Y zes!S#kKcn#4zb&WfGXtv6&V=-0RR8(Ad)2vK^+74UpI*#V4M(y&2V?Bz-e9DIM<6Q zkS4$pho7bAanzEunz4~+$)YS>p3pSELbHLcIP&LZJ1B~FHItp2KitBK@TFu>VuQak z@w-Bf^@Gdm!f^Y56kkBhJkhgmWTQ*|oM<~T)6O#5yp2qxP9MovvF(k{2M)-t{Q(qT993YV>KCIe{jOY8??g|JM0j($Y9~lrg z0GF44a4qi_oS7N}-9s=}j|W2dF)giacsf^f?w#Tip}>WOki*mgU)uQ8hWm8B<@HO! zc8^?sX|WIo$xsMH=2xf?;uMbb-VP(l)U_f0OzOsl_Z~8eyc#OnKQY6TDs3JjH(OUE z@=`)-58Os3?IwEt^*WHYLdLEHPH>A3xZTz;m0Lh_%lequPUf zMup@QL?FL5#}$BkL0HT8peL2TVCz^3q8X7C^p8JcY{21uYA|0QxRT=3Hzu9`YmAE* zW6!SZJ^VQIQy$%UG^$rPae$TdU(pS+L)58Jg#74EYmRidg&rjRuPePHDP*!1LbMlF zaQ#KxQ*1Wwzf7G0_sOY-Q%x(>0=xt)RsWCl{{YWz<1e0n#W)11#1_(`KzxZu0Ra42 zVtQ&3Q?#;bRp4a4WY)%GjD-Gk-rFP$q^m#+xkRxa>hStRZ1umqPVby27t-#8arZ|vZ5w0W3|({6D9=j|s>*+) zPHX`9F^d+=2PvUwiqz)m;Zzh?LiYCw60#yyS~-konbM;9V!t*hBP}EFSK?Q|;ndh4|;XnnLI z>L>o68M+4Q{&$9OR9b(4{9ecadaSwZt_Yk0R@p;OYwS03vQHWtUqQI*&? zufn=m;ktlX_b~dMA^O_%f!c)n7zHO4J>cii54(%AhRX@f(!71-i+864(wWu>%us+- zf4l8#u~S7yU8IoG*(*uj#b_@)-PTPeCW13$b zCVT33uaMG2gDZ0q0lvj9If*^JrzkFM*&|hY z@8JB1i7B>kb^n2mbhRQ5i!a$cl>f_WttLyzBW!Qab?LXZ{rWI*XZqFar_TG7p^^mY zsl-$~9b!2z*H2|` z_H{2Fsh0#93ro`eYY0VgMW>PEDDVJUxb+vSSm(W6=IAJnWOnRU41{%Q(2qQJpEof!C2{_lhsU!A1FG z{$x`#JKFssk1EXbV?)vz&*?7orJwHoilw>9&7b#{{Xlz^lBUs8+Chd+;h$8LfNt%? zK+mDH6>i9HlXTQ-LIhptIUpXg8*v2kOe#x!V2 zD-FirjU$;w$9oD8}E*?HxR^jL9 z?|oM!0EdOEksHD*|ham)b0p_L^z%y zE4*Jxw=G^HdJ1tMx>|1O<@I>RhX7Erg6Bo&<_CKujX9%yt9Pl9b)wyH*n%vBgoeY= z19u}jWYCjYvWH>hXG@senIzy*G}U)2b$Hfk(evIJ)7N}x&gjHIzG^FDbbD*v9n={a zu(#2B)ca7^ckW8!r>Zeg4!zp(h~^^kY_?G*k9vvfIA6cF_vO3oT?Wccu|^!2pOf-c zzFA^iI2|<1#GGaL+};-_Hn3YfIGFEDN`ANn#*dGjCs$q(oWd^S4pq6Xj2rdWXk2YB0A^5#~ z&lR>>%P|R&;!z!DA6N*V!UIewpEMMz}o4y?xpz``GxvzYXi?dRd~H=O|z)cN6~ben!TJ z*!=#Zb_~txgo*#ri=!zrRk_$;!Z5i36Eh)zXCvm?w!BQe@JZ0>$1A6 z>RU!b>PGudGkdeGJs9WVs+Jo}kCUmGvNgDrY;TFoAvwL+rwGMA$|v~)&1MJOK{s!+ zZ=PyLa0QI0ctAG~kMFi?%hWP?7Y{D9a(BKbgG$ds`)T%Qx61?`tA#&mj(3dk=XIv( zh6)fSDi6JpvS;wFj9qCdk)t%2BT#MBwGdof_I~lhb83+)lHR(sB19wAvnDK4aJtT* ziU-+&Z#hi~A|QS~cLk}K?+9>nyw>A9HWh->;#QeI#4y3f{X(c9_i{?GVEL4RM!Tus z5$IGMb4BR1f_{#nKj7N9!LtF#K)3zi`3>H6G@d9T@ke+<5qt@6Zvn%U1QB?P^+vj7C8ivg@V zZa2OAJBP?)a@>5M#*TFv*u?P|f&Lh3mjF$zyYb2yVFn@`5$ze8) zvS00zykNuZpAoZ#*ozA{kYC&or0)85>1SfHUL##VVQDri$DRJht zLA%4#!7TX_j`G3x!)htVAal+NeIYf%^XEy|%3@K4{OgniRy89Ij9;=LQvum$cTF^H zBI?t1ZQ>NPXCnX**T%*yr4%pRdW01=j8&Q!RfG-^u4G!&2+tiLBht9`S);9WET3}n zsSB^Oyykt{D5l8i4jR>N@0&`T)H$&qi@eh)G!Y4ADSn=wzYq&0E$eS&l7H>#|I$=Tl*gr2y}b{?Y}yV=!H@K}-nNLmbhA%xv7YdOlHb zS?C1y1_p&IuWi5G4C4gk5>9I9w@B?(P&`?*I6n;mbd5^h+1GGNfD!A(n>^wQwt$9= zkF#N!O&!Fn7-TW0uxQEz;3qbf&F9Xf39|?3oj~*%mbr9e3aWVR)1=KG6jm<=l-=)N zT57&?Hjy!!JD-vUrs4x!EA^oEjJWL{OFO^cmlYl#z=0#179obK&T$OIONDp9Bukx> z)sQcd?&Hu6bX3>Uooe?6Nk)R7=%S)77vgVCc-DtQl|9zY-ivMo43xrXRu;`|yG{g; zy-Ff>QEVB(`y*!cR_mjY4E7+px@ce&1oMWY>`k$!=Y77j7dwE4l4{f{S=(eeF7sL- zgV5Sew2o~{GGkT7y27G2IM1CBYBgEZxbq?QA6UU zF?24V+9&kL@8@TSrQ}H@CCh)SZyF(k%T1%-M#cr`>U@u~P+&!UxT+$6N3HdsNY#=j3}J2{TGzP89)(K$RSn5U)7RK%lMigH`9(EZ zi;gdF5R^!TH}nd%0&n7stUI+c?aJR(HUSov)+}W&d5_G%1};94tiEld5}k*pV=MR= zLxn>^QCSjBhbV-HkV#Q`+L+qOAY?*qEb~bE5tFP$lL)7}cs&5J7MEUfnHbpNFnMh* zC6C~&8sQoI!7aF!UuOr{%7$6-B9=^PsHYn!Cw>3K#(T0}PE;I9s3-ZkJ)%0;reZcD zvHxWFNzK^e^jK9IVaLNzy;@;`VXY})pJ%g|PUhuwdWrChtf2S4(Q4gY(5=wD-5XpI z)wkUzd<$DkJntfk0utn&-qV@PJab@bWUjG&6F2RTZ^_mr19P+D4}vQ)9hboscx9#6 zoLDz$O7?Q8oeh@>G9JF7-168dGKwF+p+`rWsBaOIdsswKqrRGGXq42G-9Y()S*U+2 zDaV|GEB7`dd$={Z>=;gAt;&)(Ns%jx(uq+;WeRrR+fZ?^Grj0qOPO7|(p^!^>7B2% zUrAGQ*{zu`2Rrr4B3junz-q3{f*U5<$g@ZOyxOGHV%1p*;pKAEyBUVwt3uH+8Dvu{b2s3y()ttY?~n%mV0GhOaBOIAN6x2Fh>;=-u$6FL}s5Otu1}3 zGpg_0;@x)5NyT||S~_sME=~GAE#+}$c8rLElgNvpf*9$hb7S8{(o~B=>+QgO3uurP zYA?CxePlkaxA7Ivy_vye8G5bf0fmb5t2)B`>oE-a5aUYXcXzp;=ZGdM?22PKEs0{R zH~oYyD{AFKl^LWqst|AcDR^c>n+c;bz`=#&v@8kTx&|T6?rf!sGc{+ps+EaCu?v^O zF}=F+G3CrkLRZd%b@g#k0RO(RB^m*pWGyOn)BiQa@*;V`0mh?*6h;ZC9OnTGo`0n%huZUgHZ5qC=37vBLKQb?o3T2ixGp@e3gh^`b zd8JcwhU z9^{a%*G`<$h&>hAAL9sHP}3Qf@qaMyq3+ULqD%i$ha=2PO_#`i-}4#Go^B=}!R79_ zd|Nzw6Z7D4_z)<(X(^t-bcfp%WH6$0Vna(~>J5s_2|81;(UU4_C z9S5jVAVrfepdcRu3i;gqNX4kv_O{timZKPzd9Yb}sV_t+48MDMQEgWKRmyj#s;0Z9 za6#bB*z^wb=Z}Gc9Qsmab}AHFN5l|1(W;s(l5KhMsLPUHNx*@ET24!zy_LPkixeth z6i399qrRzZx$G)0AC6mQXM>VF=B@!PeFjmt_cyu(DmN^S311c}`_8&CE1QqFxhu4} z`f=7ZjqZWHY?EsB2FZ2nvjzJ{#TC`uPQ3h0{q>J^tM?9h zezYmEm(eu}rzr;02kqKE!Sg#C()J$&j97-?>_k6_QB45&a#_gCczTq^<0rh5Fv5>ig z>gWHw4OxEN{ZS(gb!NgZxZ)9siFt(hxLosynwqo$((K=i3({ZH@kO#EXlr(ybahi@ zG+eJ$&q8I5t~&`ESl=dQx7+id2_>sPawAdQ_iUR`jx)Q}W*79c1}>Lp_{JQ6xZy;k z-$kay#l93xqJ+D)r0RBL^z7YC|J05n5+qcp*6M_5zIZ{?klC}p96+OY`UtRhS_Ba0 z!>dfwc z7)tftvbxC?8FnTk+1^21D5Wu#P|)ILL-$EheVrHbndu`lJq}wN|HAmIot=pp%aJbhA@mjAQ`frzLS}V~m8Ni8J6Ipwz;xIjB+pxYy@ zQ%}+4Q~}eQRjrDyy6R;~?xv8PFSRf>!1KJCR~aBL{0g^PX zx#mluXEqOt)W@ixzWyZC8#OQ;o6F#1b%)6agB&5vA-SR18nL&n?pfj|`8-9?XZJq?E60Z>_$MWoXny zj+<;ym^UZNm!{8QgSqLR+ZVOztH16IBJ667w6?TGlWY6&v;iKq(kJoTpDz?tfwbi=G+85REbiY-h9#i zyXq+QxW$}rfkk%bf~4N{bxkUBnis*3@b|u4)^MS|YGC zH5~b*f^qx<8n!(Xipu`JePG1`i=#!P?B|8kPJa80-i-d^yz)^DQvuc%msE^EX98*} zb!}SnVyt1>C{^`VewXDE#0=DHOrC#&w>6|N)BRLStDYf^T8?FStp|HLuc78X#hlKA zE<5jn7@eER<0LNK#@jEFpT8tmI=!#7Wp1uMmUvdX+Cx^|(VpfL=hCqaU@BoQ^>XQz ztk7`6{Jey-&>SH3$#A9GZspuidL(E;c?+gNl!(qv%uMmOWr`wRU^!M$C>E|Xy>5@N z@$2$we}U%x9|pN(0)?1E;WNiVd#!a|-veXHNzd1CcBPuN%1qMR3C7L2UI*_nd~-i-50j|g2*K6qZ$1ii zG21`qQ%JNyloy0YSbn%0oSWh-P?FA%viTA#tL+5=t*?;`M9p9`!hbstO_}NMaB?P? z0+6XMG@jm^<8Q*Li*W)C(4d^MATY#3R{P{akT001>o#VVcKDoSH)8hm(xWz-6mKYR zWZm)sYLy13OW_F*w3`+5=Nt5>bU=eN^=ZUrE%3hMXX?r5O_nbmkhq1pLxkkvx$q5K zpZRMdE0vKct59@(5AfSw59{YmuCcQNIJOD&ykWN$v6#q8c$E9vF(_1uv|zxAvAZOh z$+r(V;=}Vd94r9p%!AMK@&oq^nzE&SF}R+4mjcZU>$r@UU?v4=Cs}LB(^xiIIWCo- zlDP;Js21uD(&Ex+`oPH&qh@TbY-+~bvn1#ma_<{&-Gk#cv!--X8n|q{R3NhBjtMl$ z1+VD1MI@sMi}Pqy&1Uy$;^e-};zB{tbj&Df+@3@+OWX{{3eN*bx*}|_D&#AxL&HU$ zz2*tT+N+#*=Lf((&iTJe91JN;H>9!A_>z9MKn}+MWgS5tFx_|Qbjy5C#KKIhbhl+0 z=J*C@E%m(+-C#;gbX@5NmV8SrO`2jl_Pu9fvB=7D*U0MZm-VA}A~$|5za+{0wh(>_ zSazQPIm}O(ik^8{->%F3B-9ccGZi`kCmnoMTGAKoo5EHI=G#Q`bxxb z%WvR}0fwz#l+Q|QM}U-gPAct)gc@UCDKRl+Ha_9Xzlkdiz1qVF;8u74i8PO@`ic9N zAhbJ9GrzoQ6Xw9Bq@hrGL0}=7OKQJ#+BWWiidvf6D8IzxLFbxCm9xO{IU#&1G*fFB zrZb`+A7VixCDybe(ISs$j`gMWWS85lscP6({okQL+qI@Lf5<%wYRmT!FsLansMOvBp;1hm^MW*3vi+%%#ItNR%_l7rV@$n@^ z12S9z(lN6mXWY#f7dl&-?Cz|ErpBkr@-ybh5I1}-%l++gQ1wM_N{J*NKi=Y+FITFa zGGbGxj50|iwFFTP$*IB)O0#!?3TRep6%dfq7ox|oA*q}7zg z44iYjej86@#7cU~&^Z~=Z1*Q332sb!?yoL<_NtFK60dC_KM_Kan!r)~K2!$j&1W@b zs4XMv2xm)_Cgj*+GtydP82AMX#mLu~L{S%A{8}dQ`q{xF!5$6Hd?}aJf$R12YIL$s z4Ya^!Q-o{u$u6vj32j!l&>(ldIyQ+ECxt1*1ylKSFx00AN6x9$Dy~h*XBJ1fE2p7pFA^X*aGsd1UM`knk6RYFo*I#yipvcMJ+%rMQ zx588;P*jpl>~$;zH-T`ItE=u0@X9w`>dsWYn0)gS)B3mXmX5a4I18K)nR97bak=Z} z;e5H$24- zz=QBlt~~eZ+FcYSXVk-kn&U3EJk4L)DyD2Dw8*%n3a_0?+uliu`ZRSt+U9=B3P#xt>eGWf5QedbrKnjB2t_) zok(uXsMT%sIz*IJ590F{G3tm=B(lksrIPeb$(G{eH{b56aG z%_rTu=U@h%aNNIsV}Z0LR0rP~P4mM0B% ztGrDjV`JGR3e|pe^2X<++lOs=&f^}f`N3_86God~j_AFC<>-vQ3p9Jt+Ln@`t6ejm zBB=E8Cy7xT9tW9@ICu9FecRb%f58O(N1QlX22n09F7X?S(w}{<&Ku%~ybl$`Z#pmx zX_-XQ zPK>o?sQMi10>Upy;RxF2q*Y~LuHb~m`5`9L(8IheH7HE zFcnq%K1VoB{-AhUIuLb3ajVSZr%Wje!r}U+=J`M4wTG83p@ zj91-$8<|M-ywyFe+4T@ea+Q7K_Z5ii|3^*x6`MT_)&C#BC11$EH=)n>7QjMC%TOG% zDlw?&_ZDf0^gw6FXc|NwN@7 z-foT&kQV%i2@N4vkUwyDG@T*xeNgp?-Dn|LRJf??2!-{JU+jvS=|k@nqx;X~?LPfg zlOMx(Oun9J0_t4QrzF3x`$o1r(p93sqO!71f}G$V_z1ML z(V!4+_CB}kZ}_sE3FJR0UAO0TQ` z>SnCF`=)7YufX5fq(ac~EpogT(SKk6-?(AK)4SJ>wrif3PaUiH;5xTa67RRoDQe96 zcr=lR?yzhgfK%%_mOsZc@v;BzNkDYZuN%yd&(b|vjmzr5bRxdjC$c_9?cUqO?Azbo zzOQrDkV{HgYQV&llsQG;7uA;~-#5*lY^KqQYMhI$jC2k9U^$WPEsfwsEE_wbbl2V;`B&__o!;KhJ{hCQkICgZx_|duxmx-BUV!~x zQ}o33zES&>KCkHWuH$hq;d-34W}C;f`Th)U^mAEiXT(%bqq@EO+Wlq5wfoZc9(5B2 zVl0^obJ{lU(bs4L%8cpN8^l!hIwY)-OP0Np)T)!p)n0`1J*GYoBu~7KF3smruH&xNFmdM;20rw^Q12Ph{bS zlzCj=BdM>yM2_C}V^e*tp|VhzsPXe`>%L2NZEuA>a;R>M-!x6Op=br9AN+^2NCgZ!*^^YqPuZM6k zWBw~7RjkgLjHfrakO=nosJe+LTN&GZv&>8$e zEK?)|lXgSDc7qDBKkWk61wTd}%@Jaf1g-Yc>sFl zW=Oims0o+I$A^W~j7CjtZG9@}voH{;`^#e=k<{3C_tIIZ>Jck-T=P8mw|CimV$1Gk z4e1O)qM=$5Xm}VA|5Cifz#t-jP-bjvKYXP&RUMD9*94BM>|9zwlAQgoIz*5cLyh>) zbKg?~bX!Jq3ORtaMAk4Z*=P*pm}z=R*c*i=LtB1C70_4sUlbz!NMnX{mX7Oru46J2 zqUULiK<%OG*XCS*4}Bv|Gtzji|3W=O#B=&qyeZuY8To&;LrmcQ?p4~z7-~oIuMiKA zG{CsRqWM3n*atAWJm(s+hRL{=7x3r0c#_7iKzNa~mrN+r)SFqSK3`8${B~~P$31XmH(1O1`Iq7cx;0wlLzaMB#gWUiTI;Q#5W$S|RZK1WLT-Pkj!FWKV3 zaX9(}C_zUdWw3>?m=SlLPZ${qt{2exaAqO^}F8#MfyEN zc>5-B;(k6C6C(U_7m|VSPeJk*{Ea@o+-{w@`hM&3ZWUOi{3Y5|NG}z_IW~yK^Jw2& z1Gv9Q>U8ZpdB&p&D&B{Rx?@Tpd_)iTbLqWl)!Y?9^Q^D6WsdRX(-AqIWfadnzftB< zO>1&`n>ZNg{_H1&;KoGDHA+nEIUC&#TYaJ~kYvh4_ryuUkHP^Y-)g5W8yl!vQ^{|? zcy9&Z_Z@iqCWx*#h0ryUpzG;Uui+ztN98h6v6*k`WyoV(DE#t2I>IQJO^hTLJ(5nu z0$iqL%hQD4I9>Lm|Fr0NIX^jhkk7*VY?YJ!eqRhJ^90hMMGt37NG+85_km!z8ga{F z+dogz*m>#FKFy(?RDIifm^G?bBiHODuA%1)*1#&7@rE0MLX)4*(*3pQC{!<3p+R@C z)@ZzDLE5a7tOgIpD5n4Wrl(!XiWKbZ zE+kF6fmN|$a+!XoHm&@F&z4kPfvpIuFfdf{58>UPr@a_hrur2*+s+5fzm=*^_s7Z} zA8(H|0s?w*dkCECLNG{#1)!oobvm1l8wrntBu#1#j-*YWS8GtED~GOKFO*UJU=Ynx z`KQ@m==EadFaVpZ%n^%iioZ|Wj6_Z(zqe03iq36V$Ij!P~Ca>uLNZ@w6GAS#K=PrpZz}!cJWS`Ok(m8@syc`=cwEd_xF{i za{7{P2$rUJ&gfs(w%#RT_$@(7Y*9ZyPbE_-fU*oaiUb&f0?(9C|NYxnpYP-YbP(!8LD5L{*#6TSH#3l3 zpr)^1J;=vG0wnhwV`!ef+-QFeU4y{^-hm9Q1YF30wM@>1>*B z^T19nR~7|t!4eLeQF&RJ*=mFN=vx{1*5+mv(DC>A$|{8m+5_#<`FyD=4b90ojvDbq zd_3xR_g@=ys9ykoLE#WY*~tpr#z=F&Xy`1V z(#FR>iaJ1Qiy};n3{WysT^aba8)^I?9@W^|uKq@_x(`P#`7Q|g*f0ev`YuVKD2C?` z0u(i<$KFeZgCWj}_n{$xo2R!tSUNr+S16+h_viyyS+XV{sAnN&2V2ZY*<9$Z9`Gkl z+uM5?lT8cggj#0n9lrlsP7dor83v`DJAa$OnRIgU1`FluB1*^*?FS>wh;lUH$ZhIo z*-%as>RqDB(fbRonWfzEK}sr`D%w;vp2(3Yn=(UauWM(Cfc|&^Z{Y8L0T?Yo+KVt* znZ+9oss!|Y8FdxjmIDZ7q{5cN>;}0=7Xd~U&UNm*ikf!1S*awW$>9V?QDky|##Eus zFhO9Gg@=?|a*3g$`~O1t{FS zX%BxgrKOX+EUD;Cn5xrMPt<;#aGY>|h_juv>j^Jxd)MWoKhR~ld|2{;dt>{TU%fjH zs_DhHLk#+lefE`g6DOVtL3ZSn_90mQVwn%0`qFjw`lH2nX;O3ZjaY7GYa5;ja}@|u zlpECg_CI&FScLu}=B9}o->Ay92|akZr?+1Vfm${b`~Rvq>!_&ub`9$=APB-x(v3rd zNY{WglG5E>(p@6m-O@-(GjxN9N=Zl~A-vQeHONqB<9p8e&iQ+^vSjB%H#y*1xR zQzDt16!;^;&-!$V1eB$n7``Q&?3%qhGi%2e(@|`bh2JM^$>4F#OX{YcI=bs&Ych!H z0eH$SGVL%1(#t)`1tM6eOJWw0@PVKA58QDu`4^mgG2TCFQT^*%{s#;p=Y4*;w7dj+ z)~gGg<7PB0y7CB%RQv`}DUj6}1Izm9FKOWU0$<@#uQQTzmQ>-_%cW?kJAujKN6kU0 z`v=5W-iWre!Z9euq9(XTTQGeSqEcRh4jkh0de>-^q?MK9JoSsYgJIG_;|hv&kqj>o zb&yK-sW8Y}%i2ystl_B8z-eVsU*_f2RNPe?9d=cQIS7q#9jpAQs}`pW+QT?c@~OR< z`Y%+O${bJ57j=ATEHL{V%q_D;xifRfDF$-Ff%pu|H-dQMvy5>Xbcsj~_i$aKG0Y`` zUWHAai`rt>r#yzTjH5~?-eJe+6uffWqGNmb$cj}7FS7sKR3<(U%9Q+-cwzUhe~)A0 zQQ`wiXwfn+1Nk|LML~Y;Z$w)JR?hvw>Rg$GThwGxwmR1GyIM0gS|ln#71u~kHkt0! z>`;oLGV|huajz_{y8JcjS*qP=S#T+1Q}jnebAjqeL}wsN;LYl^%`Xg#o5fB_kAH>~ zSee;l_)AlQ!1#UE)ble8ngkzF{x#c-3zy5O-)d^qtgIwN8#S#SP=31I*pBa!DNdC5 z{4{MavVzHA%lY;9YNgr*Z2Uo0%lJ$2+g z>FS5bN<+Hx z5PdcQlBm-T69Own!sFNOXY)5indy>ZU3ZRM+XS$5d82pnJy)q06{W@5Ld`nLnv#^+ zWY&Hc?IM?FX>B1)TvVKO^fq15Zl@>jJ|~OX6M_43eOdaQ;Kk*rPOBd=)@j`oDzHmCPLApDn8qu0A}$Psv=0d+>*ybVHN2@p9f^<-1&-U=1V^w@$n;ihFgy zqVgTVXl~LgRhXNY*a?l!nZGao(3eN(qPGW#LMWuH{DWG#mKUY^uNN4%jA4Bap|2`3 zQPmOD1De4NX#h1T8$>j`uuVD|?b?K&(&G9pz*S~*eq+mmzArT3pEt`nGS}@Bp+k(c zMvkxm)h@MSA?{c!U6B<8vpr<>nD^OQ=g zvz=d5jGfBr^+nb5;BaZL9uqkO>jk)rU zpF1>^8HX7y`9a0j%RlL=dWiN=6wJlzHN60l)CG}cghDE|%W%vC$vc^++=Krm8Cvx% zZ$)0uy%Y#6*VRjB_*FBJzNDx~qOw)!a)=ajt*D6>KTF<~cg5*hi;q^UA%qLZ+Rzi@ zgCnG94bKJY7njN_M+OIJ%#!|Y2A}^VPiL;n$)Qg7cs4bSS)s*H-ix}aY!yf#R}B%o z%Bm|F70)EZk^aF^zomLS631*80DV-yBqC{368JV;^#DGZ5#1I?%Rj&drhUi&of1WqoddD zNG=3~K$JLG7-qiw?7#?~ro27~swqhB=s@NRgV!UKP-o>N{l`v#n*mE{a{4qIBCaLPP<)!CAol4^ye8SZL9#ruk~B!S)4b2D?HrFfhX8A`FFBZ z9~r}WYs<%Xc=Es1UcCZ-TfkCOuZp1Eo@_M@$>;UjOy9?lXnj@`ZjJ{(UdPw?vW-Su z_gV2n>t3g=S5>sOCDYXZgzqU%MXg6-if@rOclvTm-apht-hc{nQfBZN;d=f*5yW3W z@z^fMcJ2lu=k@5h8JtaRS8u7%X!4fnup^w$)PpJXePR_eTxQpBneZlExcJ*@Pe?1& zWIu1LKV`DYQC(t_ofOjcq#XHWx;?E7BDT^y8LXE)-W>8@yjzh_5G^4$^qD$y^t((z zZ?+sONlVL`B*753$fpHo9*+IsC=9+l5wb5%;>R6+{pXnol7>Dny3KO%8# z`xAS�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 Date: Mon, 18 Apr 2022 16:08:05 -0700 Subject: [PATCH 05/48] for edits to make consistent in table Signed-off-by: alicejw --- _opensearch/cluster.md | 20 ++++++++++---------- images/cluster.v2.png | Bin 24652 -> 26835 bytes 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/_opensearch/cluster.md b/_opensearch/cluster.md index 379f0a12..259c53f9 100644 --- a/_opensearch/cluster.md +++ b/_opensearch/cluster.md @@ -16,19 +16,19 @@ There are many ways to design a cluster. The following illustration shows a basi ![multi-node cluster architecture diagram]({{site.url}}{{site.baseurl}}/images/cluster.v2.png) -This is a four-node cluster that has one dedicated cluster_manager node, one dedicated coordinating node, and two data nodes that are cluster_manager-eligible and also used for ingesting data. +This is a four-node cluster that has one dedicated cluster manager node, one dedicated coordinating node, and two data nodes that are cluster manager-eligible and also used for ingesting data. The following table provides brief descriptions of the node types: Node type | Description | Best practices for production :--- | :--- | :-- | -`Cluster_manager` | Manages the overall operation of a cluster and keeps track of the cluster state. This includes creating and deleting indices, keeping track of the nodes that join and leave the cluster, checking the health of each node in the cluster (by running ping requests), and allocating shards to nodes. | Three dedicated cluster_manager nodes in three different zones is the right approach for almost all production use cases. This configuration ensures your cluster never loses quorum. Two nodes will be idle for most of the time except when one node goes down or needs some maintenance. -`Cluster_manager-eligible` | Elects one node among them as the cluster_manager node through a voting process. | For production clusters, make sure you have dedicated cluster_manager nodes. The way to achieve a dedicated node type is to mark all other node types as false. In this case, you have to mark all the other nodes as not cluster_manager-eligible. -`Data` | Stores and searches data. Performs all data-related operations (indexing, searching, aggregating) on local shards. These are the worker nodes of your cluster and need more disk space than any other node type. | As you add data nodes, keep them balanced between zones. For example, if you have three zones, add data nodes in multiples of three, one for each zone. We recommend using storage and RAM-heavy nodes. -`Ingest` | Preprocesses data before storing it in the cluster. Runs an ingest pipeline that transforms your data before adding it to an index. | If you plan to ingest a lot of data and run complex ingest pipelines, we recommend you use dedicated ingest nodes. You can also optionally offload your indexing from the data nodes so that your data nodes are used exclusively for searching and aggregating. -`Coordinating` | Delegates client requests to the shards on the data nodes, collects and aggregates the results into one final result, and sends this result back to the client. | A couple of dedicated coordinating-only nodes is appropriate to prevent bottlenecks for search-heavy workloads. We recommend using CPUs with as many cores as you can. +`cluster_manager` | Manages the overall operation of a cluster and keeps track of the cluster state. This includes creating and deleting indices, keeping track of the nodes that join and leave the cluster, checking the health of each node in the cluster (by running ping requests), and allocating shards to nodes. | Three dedicated `cluster_manager` nodes in three different zones is the right approach for almost all production use cases. This configuration ensures your cluster never loses quorum. Two nodes will be idle for most of the time except when one node goes down or needs some maintenance. +`cluster_manager-eligible` | Elects one node among them as the `cluster_manager` node through a voting process. | For production clusters, make sure you have dedicated `cluster_manager` nodes. The way to achieve a dedicated node type is to mark all other node types as false. In this case, you have to mark all the other nodes as not `cluster_manager-eligible`. +`data` | Stores and searches data. Performs all data-related operations (indexing, searching, aggregating) on local shards. These are the worker nodes of your cluster and need more disk space than any other node type. | As you add data nodes, keep them balanced between zones. For example, if you have three zones, add data nodes in multiples of three, one for each zone. We recommend using storage and RAM-heavy nodes. +`ingest` | Pre-processes data before storing it in the cluster. Runs an ingest pipeline that transforms your data before adding it to an index. | If you plan to ingest a lot of data and run complex ingest pipelines, we recommend you use dedicated ingest nodes. You can also optionally offload your indexing from the data nodes so that your data nodes are used exclusively for searching and aggregating. +`coordinating` | Delegates client requests to the shards on the data nodes, collects and aggregates the results into one final result, and sends this result back to the client. | A couple of dedicated coordinating-only nodes is appropriate to prevent bottlenecks for search-heavy workloads. We recommend using CPUs with as many cores as you can. -By default, each node is a cluster_manager-eligible, data, ingest, and coordinating node. Deciding on the number of nodes, assigning node types, and choosing the hardware for each node type depends on your use case. You must take into account factors like the amount of time you want to hold on to your data, the average size of your documents, your typical workload (indexing, searches, aggregations), your expected price-performance ratio, your risk tolerance, and so on. +By default, each node is a management-eligible, data, ingest, and coordinating node. Deciding on the number of nodes, assigning node types, and choosing the hardware for each node type depends on your use case. You must take into account factors like the amount of time you want to hold on to your data, the average size of your documents, your typical workload (indexing, searches, aggregations), your expected price-performance ratio, your risk tolerance, and so on. After you assess all these requirements, we recommend you use a benchmark testing tool like Rally to provision a small sample cluster and run tests with varying workloads and configurations. Compare and analyze the system and query metrics for these tests to design an optimum architecture. To get started with Rally, see the [Rally documentation](https://esrally.readthedocs.io/en/stable/). @@ -74,7 +74,7 @@ Give your cluster_manager node a name. If you don't specify a name, OpenSearch a node.name: opensearch-cluster_manager ``` -You can also explicitly specify that this node is a cluster_manager node. This is already true by default, but adding it makes it easier to identify the cluster_manager node. +You can also explicitly specify that this node is a `cluster_manager` node. This is already true by default, but adding it makes it easier to identify the `cluster_manager` node. ```yml node.roles: [ cluster_manager ] @@ -92,7 +92,7 @@ node.name: opensearch-d1 node.name: opensearch-d2 ``` -You can make them cluster_manager-eligible data nodes that will also be used for ingesting data: +You can make them `cluster_manager-eligible` data nodes that will also be used for ingesting data: ```yml node.roles: [ data, ingest ] @@ -139,7 +139,7 @@ Now that you've configured the network hosts, you need to configure the discover Zen Discovery is the built-in, default mechanism that uses [unicast](https://en.wikipedia.org/wiki/Unicast) to find other nodes in the cluster. -You can generally just add all your cluster_manager-eligible nodes to the `discovery.seed_hosts` array. When a node starts up, it finds the other cluster_manager-eligible nodes, determines which one is the cluster_manager, and asks to join the cluster. +You can generally just add all your `cluster_manager-eligible` nodes to the `discovery.seed_hosts` array. When a node starts up, it finds the other `cluster_manager-eligible` nodes, determines which one is the `cluster_manager`, and asks to join the cluster. For example, for `opensearch-cluster_manager` the line looks something like this: diff --git a/images/cluster.v2.png b/images/cluster.v2.png index 0337eec3a3434d201b964fb97482d7e1763ac4a2..419ee31ad2bee382d7ee27bbcd66905ac731fb3b 100644 GIT binary patch literal 26835 zcmYhjWmp_t(>00=F!{K1lKV> zqdqIzyyCxYeY}!XBtU3gQ2WCGP#8f24TF)1%!i^*(3USEOIX;wpZ42ET+L<4KjjqO z=8VBgPx*R&d0e$!J08404BIl@E5l{a&V9<`=#Q;Hr!>Zs1dwW_h{`2VA*us?+L&2LFO`E5? z3vpcvKy7n#MjHD&mEGOlXg?bteZp8qVD#SM{pemO%R`?0vVC?A1AmYOjznP7G6OQtFdg@@I44@2k@IhuV6Y@CDCE~U`(4eVV>hy1;ikmJ` zCEzMXEz^hugG7NqBGj*)X=#W=ups2--ZWMNnZv`w=!NdtVtH3rZVOAxDckA}8Ae7% zx2s?L$$NZZM^l?lYWDW51A~K8!%5VPY-}o{3VNRK%p`_iPfkuo8iDCqdxP)-L5jG$ z-K~Ha^a^9An0&Ul9lPbGIJVXUs@A)$nA9SSU6m|8k$_MsTf@c|*_1l4tQT*SN| zQtGzy#PZ-z3(!o`($eM(kVfVQVVB}Ne~ypq-tJOBUks1}5ElDU^_`+(Xe>+xdz;6J z2F`P;uCe^76k1u38jD^HL|+RM4atF6uK66XTF{0bfhiG$k-VmX(Wms+kp3JMCeiEjfT zD;psQGTm@CkV}(BIGIy8t}r)noHak-8D^Boc;48zvK29ga^)9su!J9(TbKd1J02b$ z<5r{3&4(faInsx~Uzxno-TB$z-mCp_T^|_NozPue3%~o_bQDEOGZcq=SrCvJV9sly z=l-3CF9R6FV^W832#0)56B*nql86psNi4oy4}6D(sppJ>ii+p_un~$mQy9kuiA_Y@ zvA8~%9QlM$cd_PsHW`jiqQwhF`|5WYMMVTg2Y&#=ffZ}Kf?0a%G}Y8{r+Nf$FNP?X zO@U;PrLi~LXcnvDLK`an``Mm8%W&y*RXxurTcJEz{Eo#5q7QQVF%xup?GUM4BtRkd z&R!p;m{uW%&bOT%^QC&L1ef%XFsNmU`l)L8zv15p2XUONv}mS^Sd8FmQ?SH?gPx`9 zwJ7N-8XB}(sFIM*pvz$RCJcFg=i9 z7j6&&B4N=$OSp@;jpAkb>b@(6b(TEz(@<0rw7Bgq%;7I zywHX2EjWoic}NOGj)Sw$1<(u7fcw;7{sY^hGQ<{?{Dws`@k|G5YsG>AsSq;^hD}J%X-xP^Y4_9P(tKyJ9C-y7*ri6V=LWGi*o zOo~K}Z5VMX)GO$i@+9!(ibC-DdODRB^(092-TjE}OqtR_m>xSwLpca}31wB>+9Vh* z7(TCUE1Ef_vm5qQ_y9Q{5d2ajk?pZ$Gr}6_@w`p(s-|ax71n00!wD*}t!j};QkW62 znWB*B3Y|8G7OP~J zRR!CLyxeUwQLv|ky5FlW@ckoeq#-O z69#tLv>bwKf;GLBcTVPP==3f`iR_INB#AqbUGFCtj0%FEvOI}0z9)Y^TTMp@#qAJ)#JP6(}tA>VBM5+(+h%ri9;aj73Lts+txGt*w^7AwI zto=re2NfSip?Y6#;977eykY~U&Oo}cPpR%ZkQ7MPejE5yecz1AW# z_npd{O#r1SG5C@V7)A*lHF|5Ni+=Qo!l%Bocgwfr?cj_V!D

&>W9BByJ213Wii)1@C6l5N{u@MQVx3Wx- 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 Date: Tue, 19 Apr 2022 10:36:56 -0700 Subject: [PATCH 06/48] fix formatting in table Signed-off-by: alicejw --- _opensearch/cluster.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/_opensearch/cluster.md b/_opensearch/cluster.md index 259c53f9..c3f470e3 100644 --- a/_opensearch/cluster.md +++ b/_opensearch/cluster.md @@ -22,11 +22,11 @@ The following table provides brief descriptions of the node types: Node type | Description | Best practices for production :--- | :--- | :-- | -`cluster_manager` | Manages the overall operation of a cluster and keeps track of the cluster state. This includes creating and deleting indices, keeping track of the nodes that join and leave the cluster, checking the health of each node in the cluster (by running ping requests), and allocating shards to nodes. | Three dedicated `cluster_manager` nodes in three different zones is the right approach for almost all production use cases. This configuration ensures your cluster never loses quorum. Two nodes will be idle for most of the time except when one node goes down or needs some maintenance. -`cluster_manager-eligible` | Elects one node among them as the `cluster_manager` node through a voting process. | For production clusters, make sure you have dedicated `cluster_manager` nodes. The way to achieve a dedicated node type is to mark all other node types as false. In this case, you have to mark all the other nodes as not `cluster_manager-eligible`. -`data` | Stores and searches data. Performs all data-related operations (indexing, searching, aggregating) on local shards. These are the worker nodes of your cluster and need more disk space than any other node type. | As you add data nodes, keep them balanced between zones. For example, if you have three zones, add data nodes in multiples of three, one for each zone. We recommend using storage and RAM-heavy nodes. -`ingest` | Pre-processes data before storing it in the cluster. Runs an ingest pipeline that transforms your data before adding it to an index. | If you plan to ingest a lot of data and run complex ingest pipelines, we recommend you use dedicated ingest nodes. You can also optionally offload your indexing from the data nodes so that your data nodes are used exclusively for searching and aggregating. -`coordinating` | Delegates client requests to the shards on the data nodes, collects and aggregates the results into one final result, and sends this result back to the client. | A couple of dedicated coordinating-only nodes is appropriate to prevent bottlenecks for search-heavy workloads. We recommend using CPUs with as many cores as you can. +Cluster manager | Manages the overall operation of a cluster and keeps track of the cluster state. This includes creating and deleting indexes, keeping track of the nodes that join and leave the cluster, checking the health of each node in the cluster (by running ping requests), and allocating shards to nodes. | Three dedicated `cluster_manager` nodes in three different zones is the right approach for almost all production use cases. This configuration ensures your cluster never loses quorum. Two nodes will be idle for most of the time except when one node goes down or needs some maintenance. +Cluster manager-eligible | Elects one node among them as the `cluster_manager` node through a voting process. | For production clusters, make sure you have dedicated `cluster_manager` nodes. The way to achieve a dedicated node type is to mark all other node types as false. In this case, you have to mark all the other nodes as not cluster manager-eligible. +Data | Stores and searches data. Performs all data-related operations (indexing, searching, aggregating) on local shards. These are the worker nodes of your cluster and need more disk space than any other node type. | As you add data nodes, keep them balanced between zones. For example, if you have three zones, add data nodes in multiples of three, one for each zone. We recommend using storage and RAM-heavy nodes. +Ingest | Pre-processes data before storing it in the cluster. Runs an ingest pipeline that transforms your data before adding it to an index. | If you plan to ingest a lot of data and run complex ingest pipelines, we recommend you use dedicated ingest nodes. You can also optionally offload your indexing from the data nodes so that your data nodes are used exclusively for searching and aggregating. +Coordinating | Delegates client requests to the shards on the data nodes, collects and aggregates the results into one final result, and sends this result back to the client. | A couple of dedicated coordinating-only nodes is appropriate to prevent bottlenecks for search-heavy workloads. We recommend using CPUs with as many cores as you can. By default, each node is a management-eligible, data, ingest, and coordinating node. Deciding on the number of nodes, assigning node types, and choosing the hardware for each node type depends on your use case. You must take into account factors like the amount of time you want to hold on to your data, the average size of your documents, your typical workload (indexing, searches, aggregations), your expected price-performance ratio, your risk tolerance, and so on. From e16dc53ccb6929cc766da7d65381b2ca7a8fdd4a Mon Sep 17 00:00:00 2001 From: alicejw Date: Tue, 19 Apr 2022 11:03:52 -0700 Subject: [PATCH 07/48] to add announcement of nomenclature change, per requirements in issue#450 Signed-off-by: alicejw --- _opensearch/cluster.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/_opensearch/cluster.md b/_opensearch/cluster.md index c3f470e3..eea50c7a 100644 --- a/_opensearch/cluster.md +++ b/_opensearch/cluster.md @@ -12,12 +12,13 @@ OpenSearch can operate as a single-node or multi-node cluster. The steps to conf To create and deploy an OpenSearch cluster according to your requirements, it’s important to understand how node discovery and cluster formation work and what settings govern them. -There are many ways to design a cluster. The following illustration shows a basic architecture: +There are many ways to design a cluster. The following illustration shows a basic architecture that includes a four-node cluster that has one dedicated cluster manager node, one dedicated coordinating node, and two data nodes that are cluster manager-eligible and also used for ingesting data. + + **Note:** The nomenclature recently changed for the master node, it is now called the cluster manager node. + {: .tip } ![multi-node cluster architecture diagram]({{site.url}}{{site.baseurl}}/images/cluster.v2.png) -This is a four-node cluster that has one dedicated cluster manager node, one dedicated coordinating node, and two data nodes that are cluster manager-eligible and also used for ingesting data. - The following table provides brief descriptions of the node types: Node type | Description | Best practices for production From 0664f4d9770a662d50ec91bb1292f0da7af2c808 Mon Sep 17 00:00:00 2001 From: alicejw Date: Tue, 19 Apr 2022 12:29:37 -0700 Subject: [PATCH 08/48] more clarity in example for setting cluster manager node Signed-off-by: alicejw --- _opensearch/cluster.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_opensearch/cluster.md b/_opensearch/cluster.md index eea50c7a..6605e163 100644 --- a/_opensearch/cluster.md +++ b/_opensearch/cluster.md @@ -69,13 +69,13 @@ After you name the cluster, set node attributes for each node in your cluster. #### Cluster manager node -Give your cluster_manager node a name. If you don't specify a name, OpenSearch assigns a machine-generated name that makes the node difficult to monitor and troubleshoot. +Give your cluster manager node a name. If you don't specify a name, OpenSearch assigns a machine-generated name that makes the node difficult to monitor and troubleshoot. ```yml node.name: opensearch-cluster_manager ``` -You can also explicitly specify that this node is a `cluster_manager` node. This is already true by default, but adding it makes it easier to identify the `cluster_manager` node. +You can also explicitly specify that this node is a cluster manager node, even though it is already set to true by default. Set the node role to `cluster_manager` to make it easier to identify the cluster manager node. ```yml node.roles: [ cluster_manager ] From 45946f850a5affff3b9c779ba00638f9abe5da8a Mon Sep 17 00:00:00 2001 From: alicejw Date: Wed, 20 Apr 2022 10:00:43 -0700 Subject: [PATCH 09/48] add table heading Signed-off-by: alicejw --- _opensearch/cluster.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/_opensearch/cluster.md b/_opensearch/cluster.md index 6605e163..8b699e36 100644 --- a/_opensearch/cluster.md +++ b/_opensearch/cluster.md @@ -19,6 +19,8 @@ There are many ways to design a cluster. The following illustration shows a basi ![multi-node cluster architecture diagram]({{site.url}}{{site.baseurl}}/images/cluster.v2.png) +### Nodes + The following table provides brief descriptions of the node types: Node type | Description | Best practices for production @@ -29,7 +31,7 @@ Data | Stores and searches data. Performs all data-related operations (indexing, Ingest | Pre-processes data before storing it in the cluster. Runs an ingest pipeline that transforms your data before adding it to an index. | If you plan to ingest a lot of data and run complex ingest pipelines, we recommend you use dedicated ingest nodes. You can also optionally offload your indexing from the data nodes so that your data nodes are used exclusively for searching and aggregating. Coordinating | Delegates client requests to the shards on the data nodes, collects and aggregates the results into one final result, and sends this result back to the client. | A couple of dedicated coordinating-only nodes is appropriate to prevent bottlenecks for search-heavy workloads. We recommend using CPUs with as many cores as you can. -By default, each node is a management-eligible, data, ingest, and coordinating node. Deciding on the number of nodes, assigning node types, and choosing the hardware for each node type depends on your use case. You must take into account factors like the amount of time you want to hold on to your data, the average size of your documents, your typical workload (indexing, searches, aggregations), your expected price-performance ratio, your risk tolerance, and so on. +By default, each node is a cluster manager-eligible, data, ingest, and coordinating node. Deciding on the number of nodes, assigning node types, and choosing the hardware for each node type depends on your use case. You must take into account factors like the amount of time you want to hold on to your data, the average size of your documents, your typical workload (indexing, searches, aggregations), your expected price-performance ratio, your risk tolerance, and so on. After you assess all these requirements, we recommend you use a benchmark testing tool like Rally to provision a small sample cluster and run tests with varying workloads and configurations. Compare and analyze the system and query metrics for these tests to design an optimum architecture. To get started with Rally, see the [Rally documentation](https://esrally.readthedocs.io/en/stable/). From ade31baf44fdd255c1acc25f3d8b7deacdde06c5 Mon Sep 17 00:00:00 2001 From: alicejw Date: Wed, 20 Apr 2022 10:08:09 -0700 Subject: [PATCH 10/48] to add original png file Signed-off-by: alicejw --- images/cluster.png | Bin 0 -> 24024 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/cluster.png diff --git a/images/cluster.png b/images/cluster.png new file mode 100644 index 0000000000000000000000000000000000000000..f5262a06efff15c79a47336a9b8a2a26790931d9 GIT binary patch literal 24024 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�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 R{N~=1t{|f#T`OrC`d Date: Wed, 20 Apr 2022 10:11:21 -0700 Subject: [PATCH 11/48] to replace updated png with original file name Signed-off-by: alicejw --- images/cluster.png | Bin 24024 -> 26835 bytes images/cluster.v2.png | Bin 26835 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 images/cluster.v2.png diff --git a/images/cluster.png b/images/cluster.png index f5262a06efff15c79a47336a9b8a2a26790931d9..419ee31ad2bee382d7ee27bbcd66905ac731fb3b 100644 GIT binary patch literal 26835 zcmYhjWmp_t(>00=F!{K1lKV> zqdqIzyyCxYeY}!XBtU3gQ2WCGP#8f24TF)1%!i^*(3USEOIX;wpZ42ET+L<4KjjqO z=8VBgPx*R&d0e$!J08404BIl@E5l{a&V9<`=#Q;Hr!>Zs1dwW_h{`2VA*us?+L&2LFO`E5? z3vpcvKy7n#MjHD&mEGOlXg?bteZp8qVD#SM{pemO%R`?0vVC?A1AmYOjznP7G6OQtFdg@@I44@2k@IhuV6Y@CDCE~U`(4eVV>hy1;ikmJ` zCEzMXEz^hugG7NqBGj*)X=#W=ups2--ZWMNnZv`w=!NdtVtH3rZVOAxDckA}8Ae7% zx2s?L$$NZZM^l?lYWDW51A~K8!%5VPY-}o{3VNRK%p`_iPfkuo8iDCqdxP)-L5jG$ z-K~Ha^a^9An0&Ul9lPbGIJVXUs@A)$nA9SSU6m|8k$_MsTf@c|*_1l4tQT*SN| zQtGzy#PZ-z3(!o`($eM(kVfVQVVB}Ne~ypq-tJOBUks1}5ElDU^_`+(Xe>+xdz;6J z2F`P;uCe^76k1u38jD^HL|+RM4atF6uK66XTF{0bfhiG$k-VmX(Wms+kp3JMCeiEjfT zD;psQGTm@CkV}(BIGIy8t}r)noHak-8D^Boc;48zvK29ga^)9su!J9(TbKd1J02b$ z<5r{3&4(faInsx~Uzxno-TB$z-mCp_T^|_NozPue3%~o_bQDEOGZcq=SrCvJV9sly z=l-3CF9R6FV^W832#0)56B*nql86psNi4oy4}6D(sppJ>ii+p_un~$mQy9kuiA_Y@ zvA8~%9QlM$cd_PsHW`jiqQwhF`|5WYMMVTg2Y&#=ffZ}Kf?0a%G}Y8{r+Nf$FNP?X zO@U;PrLi~LXcnvDLK`an``Mm8%W&y*RXxurTcJEz{Eo#5q7QQVF%xup?GUM4BtRkd z&R!p;m{uW%&bOT%^QC&L1ef%XFsNmU`l)L8zv15p2XUONv}mS^Sd8FmQ?SH?gPx`9 zwJ7N-8XB}(sFIM*pvz$RCJcFg=i9 z7j6&&B4N=$OSp@;jpAkb>b@(6b(TEz(@<0rw7Bgq%;7I zywHX2EjWoic}NOGj)Sw$1<(u7fcw;7{sY^hGQ<{?{Dws`@k|G5YsG>AsSq;^hD}J%X-xP^Y4_9P(tKyJ9C-y7*ri6V=LWGi*o zOo~K}Z5VMX)GO$i@+9!(ibC-DdODRB^(092-TjE}OqtR_m>xSwLpca}31wB>+9Vh* z7(TCUE1Ef_vm5qQ_y9Q{5d2ajk?pZ$Gr}6_@w`p(s-|ax71n00!wD*}t!j};QkW62 znWB*B3Y|8G7OP~J zRR!CLyxeUwQLv|ky5FlW@ckoeq#-O z69#tLv>bwKf;GLBcTVPP==3f`iR_INB#AqbUGFCtj0%FEvOI}0z9)Y^TTMp@#qAJ)#JP6(}tA>VBM5+(+h%ri9;aj73Lts+txGt*w^7AwI zto=re2NfSip?Y6#;977eykY~U&Oo}cPpR%ZkQ7MPejE5yecz1AW# z_npd{O#r1SG5C@V7)A*lHF|5Ni+=Qo!l%Bocgwfr?cj_V!D

&>W9BByJ213Wii)1@C6l5N{u@MQVx3Wx- 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�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 R{N~=1t{|f#T`OrC`d00=F!{K1lKV> zqdqIzyyCxYeY}!XBtU3gQ2WCGP#8f24TF)1%!i^*(3USEOIX;wpZ42ET+L<4KjjqO z=8VBgPx*R&d0e$!J08404BIl@E5l{a&V9<`=#Q;Hr!>Zs1dwW_h{`2VA*us?+L&2LFO`E5? z3vpcvKy7n#MjHD&mEGOlXg?bteZp8qVD#SM{pemO%R`?0vVC?A1AmYOjznP7G6OQtFdg@@I44@2k@IhuV6Y@CDCE~U`(4eVV>hy1;ikmJ` zCEzMXEz^hugG7NqBGj*)X=#W=ups2--ZWMNnZv`w=!NdtVtH3rZVOAxDckA}8Ae7% zx2s?L$$NZZM^l?lYWDW51A~K8!%5VPY-}o{3VNRK%p`_iPfkuo8iDCqdxP)-L5jG$ z-K~Ha^a^9An0&Ul9lPbGIJVXUs@A)$nA9SSU6m|8k$_MsTf@c|*_1l4tQT*SN| zQtGzy#PZ-z3(!o`($eM(kVfVQVVB}Ne~ypq-tJOBUks1}5ElDU^_`+(Xe>+xdz;6J z2F`P;uCe^76k1u38jD^HL|+RM4atF6uK66XTF{0bfhiG$k-VmX(Wms+kp3JMCeiEjfT zD;psQGTm@CkV}(BIGIy8t}r)noHak-8D^Boc;48zvK29ga^)9su!J9(TbKd1J02b$ z<5r{3&4(faInsx~Uzxno-TB$z-mCp_T^|_NozPue3%~o_bQDEOGZcq=SrCvJV9sly z=l-3CF9R6FV^W832#0)56B*nql86psNi4oy4}6D(sppJ>ii+p_un~$mQy9kuiA_Y@ zvA8~%9QlM$cd_PsHW`jiqQwhF`|5WYMMVTg2Y&#=ffZ}Kf?0a%G}Y8{r+Nf$FNP?X zO@U;PrLi~LXcnvDLK`an``Mm8%W&y*RXxurTcJEz{Eo#5q7QQVF%xup?GUM4BtRkd z&R!p;m{uW%&bOT%^QC&L1ef%XFsNmU`l)L8zv15p2XUONv}mS^Sd8FmQ?SH?gPx`9 zwJ7N-8XB}(sFIM*pvz$RCJcFg=i9 z7j6&&B4N=$OSp@;jpAkb>b@(6b(TEz(@<0rw7Bgq%;7I zywHX2EjWoic}NOGj)Sw$1<(u7fcw;7{sY^hGQ<{?{Dws`@k|G5YsG>AsSq;^hD}J%X-xP^Y4_9P(tKyJ9C-y7*ri6V=LWGi*o zOo~K}Z5VMX)GO$i@+9!(ibC-DdODRB^(092-TjE}OqtR_m>xSwLpca}31wB>+9Vh* z7(TCUE1Ef_vm5qQ_y9Q{5d2ajk?pZ$Gr}6_@w`p(s-|ax71n00!wD*}t!j};QkW62 znWB*B3Y|8G7OP~J zRR!CLyxeUwQLv|ky5FlW@ckoeq#-O z69#tLv>bwKf;GLBcTVPP==3f`iR_INB#AqbUGFCtj0%FEvOI}0z9)Y^TTMp@#qAJ)#JP6(}tA>VBM5+(+h%ri9;aj73Lts+txGt*w^7AwI zto=re2NfSip?Y6#;977eykY~U&Oo}cPpR%ZkQ7MPejE5yecz1AW# z_npd{O#r1SG5C@V7)A*lHF|5Ni+=Qo!l%Bocgwfr?cj_V!D

&>W9BByJ213Wii)1@C6l5N{u@MQVx3Wx- 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 xgB?)xi>7s~q$vusj_stS^loY?a& Date: Wed, 20 Apr 2022 10:31:06 -0700 Subject: [PATCH 12/48] switch left nav as acronmy-only, and page with full title, then acronym Signed-off-by: alicejw --- _opensearch/rest-api/cat/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_opensearch/rest-api/cat/index.md b/_opensearch/rest-api/cat/index.md index f38306e5..7f18f319 100644 --- a/_opensearch/rest-api/cat/index.md +++ b/_opensearch/rest-api/cat/index.md @@ -1,6 +1,6 @@ --- layout: default -title: Compact and aligned text (CAT) API +title: CAT API parent: REST API reference nav_order: 100 has_children: true @@ -8,7 +8,7 @@ redirect_from: - /opensearch/catapis/ --- -# CAT API +# Compact and aligned text (CAT) API You can get essential statistics about your cluster in an easy-to-understand, tabular format using the compact and aligned text (CAT) API. The CAT API is a human-readable interface that returns plain text instead of traditional JSON. From a5811c17643b3c0edf8562dbc875bbfdb7af153d Mon Sep 17 00:00:00 2001 From: alicejw Date: Wed, 20 Apr 2022 13:58:27 -0700 Subject: [PATCH 13/48] for reviewer comments Signed-off-by: alicejw --- _opensearch/cluster.md | 6 +++--- _opensearch/rest-api/cluster-health.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/_opensearch/cluster.md b/_opensearch/cluster.md index 8b699e36..91d52a4b 100644 --- a/_opensearch/cluster.md +++ b/_opensearch/cluster.md @@ -14,10 +14,10 @@ To create and deploy an OpenSearch cluster according to your requirements, it’ There are many ways to design a cluster. The following illustration shows a basic architecture that includes a four-node cluster that has one dedicated cluster manager node, one dedicated coordinating node, and two data nodes that are cluster manager-eligible and also used for ingesting data. - **Note:** The nomenclature recently changed for the master node, it is now called the cluster manager node. - {: .tip } + The nomenclature recently changed for the master node, it is now called the cluster manager node. + {: .note } -![multi-node cluster architecture diagram]({{site.url}}{{site.baseurl}}/images/cluster.v2.png) +![multi-node cluster architecture diagram]({{site.url}}{{site.baseurl}}/images/cluster.png) ### Nodes diff --git a/_opensearch/rest-api/cluster-health.md b/_opensearch/rest-api/cluster-health.md index f20da3ec..009ae13b 100644 --- a/_opensearch/rest-api/cluster-health.md +++ b/_opensearch/rest-api/cluster-health.md @@ -36,7 +36,7 @@ All cluster health parameters are optional. Parameter | Type | Description :--- | :--- | :--- -expand_wildcards | Enum | Expands wildcard expressions to concrete indices. Combine multiple values with commas. Supported values are `all`, `open`, `closed`, `hidden`, and `none`. Default is `open`. +expand_wildcards | Enum | Expands wildcard expressions to concrete indexes. Combine multiple values with commas. Supported values are `all`, `open`, `closed`, `hidden`, and `none`. Default is `open`. level | Enum | The level of detail for returned health information. Supported values are `cluster`, `indices`, and `shards`. Default is `cluster`. local | Boolean | Whether to return information from the local node only instead of from the cluster_manager node. Default is false. cluster_manager_timeout | Time | The amount of time to wait for a connection to the cluster_manager node. Default is 30 seconds. From 6b9a22cc79d36ea190427d14e69d33503000d5b2 Mon Sep 17 00:00:00 2001 From: alicejw Date: Tue, 26 Apr 2022 13:00:35 -0700 Subject: [PATCH 14/48] for feedback comments Signed-off-by: alicejw --- _opensearch/cluster.md | 4 ++-- _opensearch/rest-api/cluster-stats.md | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/_opensearch/cluster.md b/_opensearch/cluster.md index 91d52a4b..cf979a9d 100644 --- a/_opensearch/cluster.md +++ b/_opensearch/cluster.md @@ -25,8 +25,8 @@ The following table provides brief descriptions of the node types: Node type | Description | Best practices for production :--- | :--- | :-- | -Cluster manager | Manages the overall operation of a cluster and keeps track of the cluster state. This includes creating and deleting indexes, keeping track of the nodes that join and leave the cluster, checking the health of each node in the cluster (by running ping requests), and allocating shards to nodes. | Three dedicated `cluster_manager` nodes in three different zones is the right approach for almost all production use cases. This configuration ensures your cluster never loses quorum. Two nodes will be idle for most of the time except when one node goes down or needs some maintenance. -Cluster manager-eligible | Elects one node among them as the `cluster_manager` node through a voting process. | For production clusters, make sure you have dedicated `cluster_manager` nodes. The way to achieve a dedicated node type is to mark all other node types as false. In this case, you have to mark all the other nodes as not cluster manager-eligible. +Cluster manager | Manages the overall operation of a cluster and keeps track of the cluster state. This includes creating and deleting indexes, keeping track of the nodes that join and leave the cluster, checking the health of each node in the cluster (by running ping requests), and allocating shards to nodes. | Three dedicated cluster manager nodes in three different zones is the right approach for almost all production use cases. This configuration ensures your cluster never loses quorum. Two nodes will be idle for most of the time except when one node goes down or needs some maintenance. +Cluster manager-eligible | Elects one node among them as the cluster manager node through a voting process. | For production clusters, make sure you have dedicated cluster manager nodes. The way to achieve a dedicated node type is to mark all other node types as false. In this case, you have to mark all the other nodes as not cluster manager-eligible. Data | Stores and searches data. Performs all data-related operations (indexing, searching, aggregating) on local shards. These are the worker nodes of your cluster and need more disk space than any other node type. | As you add data nodes, keep them balanced between zones. For example, if you have three zones, add data nodes in multiples of three, one for each zone. We recommend using storage and RAM-heavy nodes. Ingest | Pre-processes data before storing it in the cluster. Runs an ingest pipeline that transforms your data before adding it to an index. | If you plan to ingest a lot of data and run complex ingest pipelines, we recommend you use dedicated ingest nodes. You can also optionally offload your indexing from the data nodes so that your data nodes are used exclusively for searching and aggregating. Coordinating | Delegates client requests to the shards on the data nodes, collects and aggregates the results into one final result, and sends this result back to the client. | A couple of dedicated coordinating-only nodes is appropriate to prevent bottlenecks for search-heavy workloads. We recommend using CPUs with as many cores as you can. diff --git a/_opensearch/rest-api/cluster-stats.md b/_opensearch/rest-api/cluster-stats.md index 80815d9a..13b308cb 100644 --- a/_opensearch/rest-api/cluster-stats.md +++ b/_opensearch/rest-api/cluster-stats.md @@ -33,6 +33,8 @@ Parameter | Type | Description :--- | :--- | :--- <node-filters> | List | A comma-separated list of node-filters that OpenSearch uses to filter results. Available options are `all`, `_local`, `_cluster_manager`, a node name or ID, `cluster_manager:true`, `cluster_manager:false`, `data:true`, `data:false`, `ingest:true`, `ingest:false`, `voting_only:true`, `voting_only:false`, `ml:true`, `ml:false`, `coordinating_only:true`, `coordinating_only:false`, and <custom node attributes> : <attribute values> pairs. + Although the `master` node is now called `cluster_manager` for version 2.0, we retained the `master` field for backwards compatibility. If you have a node that has either a `master` role or a `cluster_manager` role, the `count` increases for both fields by 1. To see an example node count increase, see the Response sample. + {: .note } ## Response @@ -217,6 +219,7 @@ Parameter | Type | Description "coordinating_only": 0, "data": 1, "ingest": 1, + "master": 1, "cluster_manager": 1, "remote_cluster_client": 1 }, From 64e8e4b0693b537aa0a1e628ad267680409a1d46 Mon Sep 17 00:00:00 2001 From: alicejw Date: Wed, 27 Apr 2022 15:37:49 -0700 Subject: [PATCH 15/48] for updates to cluster manager nomenclature throughout descriptive sections Signed-off-by: alicejw --- _opensearch/cluster.md | 12 ++++++------ _opensearch/rest-api/cat/cat-cluster_manager.md | 4 ++-- _opensearch/rest-api/cat/cat-nodes.md | 2 +- _opensearch/rest-api/cat/cat-pending-tasks.md | 2 +- _opensearch/rest-api/cluster-health.md | 4 ++-- _opensearch/rest-api/cluster-settings.md | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/_opensearch/cluster.md b/_opensearch/cluster.md index cf979a9d..d52bdfcd 100644 --- a/_opensearch/cluster.md +++ b/_opensearch/cluster.md @@ -12,9 +12,9 @@ OpenSearch can operate as a single-node or multi-node cluster. The steps to conf To create and deploy an OpenSearch cluster according to your requirements, it’s important to understand how node discovery and cluster formation work and what settings govern them. -There are many ways to design a cluster. The following illustration shows a basic architecture that includes a four-node cluster that has one dedicated cluster manager node, one dedicated coordinating node, and two data nodes that are cluster manager-eligible and also used for ingesting data. +There are many ways to design a cluster. The following illustration shows a basic architecture that includes a four-node cluster that has one dedicated cluster manager node, one dedicated coordinating node, and two data nodes that are cluster manager eligible and also used for ingesting data. - The nomenclature recently changed for the master node, it is now called the cluster manager node. + The nomenclature recently changed for the master node; it is now called the cluster manager node. {: .note } ![multi-node cluster architecture diagram]({{site.url}}{{site.baseurl}}/images/cluster.png) @@ -26,12 +26,12 @@ The following table provides brief descriptions of the node types: Node type | Description | Best practices for production :--- | :--- | :-- | Cluster manager | Manages the overall operation of a cluster and keeps track of the cluster state. This includes creating and deleting indexes, keeping track of the nodes that join and leave the cluster, checking the health of each node in the cluster (by running ping requests), and allocating shards to nodes. | Three dedicated cluster manager nodes in three different zones is the right approach for almost all production use cases. This configuration ensures your cluster never loses quorum. Two nodes will be idle for most of the time except when one node goes down or needs some maintenance. -Cluster manager-eligible | Elects one node among them as the cluster manager node through a voting process. | For production clusters, make sure you have dedicated cluster manager nodes. The way to achieve a dedicated node type is to mark all other node types as false. In this case, you have to mark all the other nodes as not cluster manager-eligible. +Cluster manager eligible | Elects one node among them as the cluster manager node through a voting process. | For production clusters, make sure you have dedicated cluster manager nodes. The way to achieve a dedicated node type is to mark all other node types as false. In this case, you have to mark all the other nodes as not cluster manager eligible. Data | Stores and searches data. Performs all data-related operations (indexing, searching, aggregating) on local shards. These are the worker nodes of your cluster and need more disk space than any other node type. | As you add data nodes, keep them balanced between zones. For example, if you have three zones, add data nodes in multiples of three, one for each zone. We recommend using storage and RAM-heavy nodes. Ingest | Pre-processes data before storing it in the cluster. Runs an ingest pipeline that transforms your data before adding it to an index. | If you plan to ingest a lot of data and run complex ingest pipelines, we recommend you use dedicated ingest nodes. You can also optionally offload your indexing from the data nodes so that your data nodes are used exclusively for searching and aggregating. Coordinating | Delegates client requests to the shards on the data nodes, collects and aggregates the results into one final result, and sends this result back to the client. | A couple of dedicated coordinating-only nodes is appropriate to prevent bottlenecks for search-heavy workloads. We recommend using CPUs with as many cores as you can. -By default, each node is a cluster manager-eligible, data, ingest, and coordinating node. Deciding on the number of nodes, assigning node types, and choosing the hardware for each node type depends on your use case. You must take into account factors like the amount of time you want to hold on to your data, the average size of your documents, your typical workload (indexing, searches, aggregations), your expected price-performance ratio, your risk tolerance, and so on. +By default, each node is a cluster-manager-eligible, data, ingest, and coordinating node. Deciding on the number of nodes, assigning node types, and choosing the hardware for each node type depends on your use case. You must take into account factors like the amount of time you want to hold on to your data, the average size of your documents, your typical workload (indexing, searches, aggregations), your expected price-performance ratio, your risk tolerance, and so on. After you assess all these requirements, we recommend you use a benchmark testing tool like Rally to provision a small sample cluster and run tests with varying workloads and configurations. Compare and analyze the system and query metrics for these tests to design an optimum architecture. To get started with Rally, see the [Rally documentation](https://esrally.readthedocs.io/en/stable/). @@ -95,7 +95,7 @@ node.name: opensearch-d1 node.name: opensearch-d2 ``` -You can make them `cluster_manager-eligible` data nodes that will also be used for ingesting data: +You can make them cluster-manager-eligible data nodes that will also be used for ingesting data: ```yml node.roles: [ data, ingest ] @@ -142,7 +142,7 @@ Now that you've configured the network hosts, you need to configure the discover Zen Discovery is the built-in, default mechanism that uses [unicast](https://en.wikipedia.org/wiki/Unicast) to find other nodes in the cluster. -You can generally just add all your `cluster_manager-eligible` nodes to the `discovery.seed_hosts` array. When a node starts up, it finds the other `cluster_manager-eligible` nodes, determines which one is the `cluster_manager`, and asks to join the cluster. +You can generally just add all of your cluster-manager-eligible nodes to the `discovery.seed_hosts` array. When a node starts up, it finds the other cluster-manager-eligible nodes, determines which one is the cluster manager, and asks to join the cluster. For example, for `opensearch-cluster_manager` the line looks something like this: diff --git a/_opensearch/rest-api/cat/cat-cluster_manager.md b/_opensearch/rest-api/cat/cat-cluster_manager.md index 9f81c83b..fb6850ac 100644 --- a/_opensearch/rest-api/cat/cat-cluster_manager.md +++ b/_opensearch/rest-api/cat/cat-cluster_manager.md @@ -11,7 +11,7 @@ has_children: false Introduced 1.0 {: .label .label-purple } -The cat cluster manager operation lists information that helps identify the elected cluster_manager node. +The cat cluster manager operation lists information that helps identify the elected cluster manager node. ## Example @@ -33,7 +33,7 @@ In addition to the [common URL parameters]({{site.url}}{{site.baseurl}}/opensear Parameter | Type | Description :--- | :--- | :--- -cluster_manager_timeout | Time | The amount of time to wait for a connection to the cluster_manager node. Default is 30 seconds. +cluster_manager_timeout | Time | The amount of time to wait for a connection to the cluster manager node. Default is 30 seconds. ## Response diff --git a/_opensearch/rest-api/cat/cat-nodes.md b/_opensearch/rest-api/cat/cat-nodes.md index 8d3c7c0a..a2f05c36 100644 --- a/_opensearch/rest-api/cat/cat-nodes.md +++ b/_opensearch/rest-api/cat/cat-nodes.md @@ -38,7 +38,7 @@ Parameter | Type | Description bytes | Byte size | Specify the units for byte size. For example, `7kb` or `6gb`. For more information, see [Supported units]({{site.url}}{{site.baseurl}}/opensearch/units/). full_id | Boolean | If true, return the full node ID. If false, return the shortened node ID. Defaults to false. local | Boolean | Whether to return information from the local node only instead of from the cluster_manager node. Default is false. -cluster_manager_timeout | Time | The amount of time to wait for a connection to the cluster_manager node. Default is 30 seconds. +cluster_manager_timeout | Time | The amount of time to wait for a connection to the cluster manager node. Default is 30 seconds. time | Time | Specify the units for time. For example, `5d` or `7h`. For more information, see [Supported units]({{site.url}}{{site.baseurl}}/opensearch/units/). include_unloaded_segments | Boolean | Whether to include information from segments not loaded into memory. Default is false. diff --git a/_opensearch/rest-api/cat/cat-pending-tasks.md b/_opensearch/rest-api/cat/cat-pending-tasks.md index 8f50bfb3..f7276935 100644 --- a/_opensearch/rest-api/cat/cat-pending-tasks.md +++ b/_opensearch/rest-api/cat/cat-pending-tasks.md @@ -34,7 +34,7 @@ In addition to the [common URL parameters]({{site.url}}{{site.baseurl}}/opensear Parameter | Type | Description :--- | :--- | :--- local | Boolean | Whether to return information from the local node only instead of from the cluster_manager node. Default is false. -cluster_manager_timeout | Time | The amount of time to wait for a connection to the cluster_manager node. Default is 30 seconds. +cluster_manager_timeout | Time | The amount of time to wait for a connection to the cluster manager node. Default is 30 seconds. time | Time | Specify the units for time. For example, `5d` or `7h`. For more information, see [Supported units]({{site.url}}{{site.baseurl}}/opensearch/units/). diff --git a/_opensearch/rest-api/cluster-health.md b/_opensearch/rest-api/cluster-health.md index 009ae13b..8af62789 100644 --- a/_opensearch/rest-api/cluster-health.md +++ b/_opensearch/rest-api/cluster-health.md @@ -38,8 +38,8 @@ Parameter | Type | Description :--- | :--- | :--- expand_wildcards | Enum | Expands wildcard expressions to concrete indexes. Combine multiple values with commas. Supported values are `all`, `open`, `closed`, `hidden`, and `none`. Default is `open`. level | Enum | The level of detail for returned health information. Supported values are `cluster`, `indices`, and `shards`. Default is `cluster`. -local | Boolean | Whether to return information from the local node only instead of from the cluster_manager node. Default is false. -cluster_manager_timeout | Time | The amount of time to wait for a connection to the cluster_manager node. Default is 30 seconds. +local | Boolean | Whether to return information from the local node only instead of from the cluster manager node. Default is false. +cluster_manager_timeout | Time | The amount of time to wait for a connection to the cluster manager node. Default is 30 seconds. timeout | Time | The amount of time to wait for a response. If the timeout expires, the request fails. Default is 30 seconds. wait_for_active_shards | String | Wait until the specified number of shards is active before returning a response. `all` for all shards. Default is `0`. wait_for_events | Enum | Wait until all currently queued events with the given priority are processed. Supported values are `immediate`, `urgent`, `high`, `normal`, `low`, and `languid`. diff --git a/_opensearch/rest-api/cluster-settings.md b/_opensearch/rest-api/cluster-settings.md index 6a76f182..570d00f5 100644 --- a/_opensearch/rest-api/cluster-settings.md +++ b/_opensearch/rest-api/cluster-settings.md @@ -44,7 +44,7 @@ Parameter | Type | Description :--- | :--- | :--- flat_settings | Boolean | Whether to return settings in the flat form, which can improve readability, especially for heavily nested settings. For example, the flat form of `"cluster": { "max_shards_per_node": 500 }` is `"cluster.max_shards_per_node": "500"`. include_defaults (GET only) | Boolean | Whether to include default settings as part of the response. This parameter is useful for identifying the names and current values of settings you want to update. -cluster_manager_timeout | Time | The amount of time to wait for a response from the cluster_manager node. Default is 30 seconds. +cluster_manager_timeout | Time | The amount of time to wait for a response from the cluster manager node. Default is 30 seconds. timeout (PUT only) | Time | The amount of time to wait for a response from the cluster. Default is 30 seconds. From 8651556df8c7bd36a99c55a05d70e13c40f4898b Mon Sep 17 00:00:00 2001 From: Chen <19492223+chenqi0805@users.noreply.github.com> Date: Thu, 28 Apr 2022 19:42:00 -0500 Subject: [PATCH 16/48] MAINT: update docs Signed-off-by: Chen <19492223+chenqi0805@users.noreply.github.com> --- .../data-prepper/data-prepper-reference.md | 43 +++++++------ _clients/data-prepper/pipelines.md | 61 +++++++++++++++++++ 2 files changed, 86 insertions(+), 18 deletions(-) diff --git a/_clients/data-prepper/data-prepper-reference.md b/_clients/data-prepper/data-prepper-reference.md index 8936e489..24366454 100644 --- a/_clients/data-prepper/data-prepper-reference.md +++ b/_clients/data-prepper/data-prepper-reference.md @@ -37,22 +37,23 @@ Sources define where your data comes from. Source for the OpenTelemetry Collector. -Option | Required | Type | Description -:--- | :--- | :--- | :--- -port | No | Integer | The port OTel trace source is running on. Default is `21890`. -request_timeout | No | Integer | The request timeout in milliseconds. Default is `10_000`. -health_check_service | No | Boolean | Enables a gRPC health check service under `grpc.health.v1/Health/Check`. Default is `false`. -proto_reflection_service | No | Boolean | Enables a reflection service for Protobuf services (see [gRPC reflection](https://github.com/grpc/grpc/blob/master/doc/server-reflection.md) and [gRPC Server Reflection Tutorial](https://github.com/grpc/grpc-java/blob/master/documentation/server-reflection-tutorial.md) docs). Default is `false`. -unframed_requests | No | Boolean | Enable requests not framed using the gRPC wire protocol. -thread_count | No | Integer | The number of threads to keep in the ScheduledThreadPool. Default is `200`. -max_connection_count | No | Integer | The maximum allowed number of open connections. Default is `500`. -ssl | No | Boolean | Enables connections to the OTel source port over TLS/SSL. Defaults to `true`. -sslKeyCertChainFile | Conditionally | String | File-system path or AWS S3 path to the security certificate (e.g. `"config/demo-data-prepper.crt"` or `"s3://my-secrets-bucket/demo-data-prepper.crt"`). Required if ssl is set to `true`. -sslKeyFile | Conditionally | String | File-system path or AWS S3 path to the security key (e.g. `"config/demo-data-prepper.key"` or `"s3://my-secrets-bucket/demo-data-prepper.key"`). Required if ssl is set to `true`. -useAcmCertForSSL | No | Boolean | Whether to enable TLS/SSL using certificate and private key from AWS Certificate Manager (ACM). Default is `false`. -acmCertificateArn | Conditionally | String | Represents the ACM certificate ARN. ACM certificate take preference over S3 or local file system certificate. Required if `useAcmCertForSSL` is set to `true`. -awsRegion | Conditionally | String | Represents the AWS region to use ACM or S3. Required if `useAcmCertForSSL` is set to `true` or `sslKeyCertChainFile` and `sslKeyFile` are AWS S3 paths. -authentication | No | Object| An authentication configuration. By default, this runs an unauthenticated server. This uses pluggable authentication for HTTPS. To use basic authentication, define the `http_basic` plugin with a `username` and `password`. To provide customer authentication use or create a plugin which implements: [GrpcAuthenticationProvider](https://github.com/opensearch-project/data-prepper/blob/main/data-prepper-plugins/armeria-common/src/main/java/com/amazon/dataprepper/armeria/authentication/GrpcAuthenticationProvider.java). +Option | Required | Type | Description +:--- |:--------------|:--------| :--- +port | No | Integer | The port OTel trace source is running on. Default is `21890`. +request_timeout | No | Integer | The request timeout in milliseconds. Default is `10_000`. +health_check_service | No | Boolean | Enables a gRPC health check service under `grpc.health.v1/Health/Check`. Default is `false`. +proto_reflection_service | No | Boolean | Enables a reflection service for Protobuf services (see [gRPC reflection](https://github.com/grpc/grpc/blob/master/doc/server-reflection.md) and [gRPC Server Reflection Tutorial](https://github.com/grpc/grpc-java/blob/master/documentation/server-reflection-tutorial.md) docs). Default is `false`. +unframed_requests | No | Boolean | Enable requests not framed using the gRPC wire protocol. +thread_count | No | Integer | The number of threads to keep in the ScheduledThreadPool. Default is `200`. +max_connection_count | No | Integer | The maximum allowed number of open connections. Default is `500`. +ssl | No | Boolean | Enables connections to the OTel source port over TLS/SSL. Defaults to `true`. +sslKeyCertChainFile | Conditionally | String | File-system path or AWS S3 path to the security certificate (e.g. `"config/demo-data-prepper.crt"` or `"s3://my-secrets-bucket/demo-data-prepper.crt"`). Required if ssl is set to `true`. +sslKeyFile | Conditionally | String | File-system path or AWS S3 path to the security key (e.g. `"config/demo-data-prepper.key"` or `"s3://my-secrets-bucket/demo-data-prepper.key"`). Required if ssl is set to `true`. +useAcmCertForSSL | No | Boolean | Whether to enable TLS/SSL using certificate and private key from AWS Certificate Manager (ACM). Default is `false`. +acmCertificateArn | Conditionally | String | Represents the ACM certificate ARN. ACM certificate take preference over S3 or local file system certificate. Required if `useAcmCertForSSL` is set to `true`. +awsRegion | Conditionally | String | Represents the AWS region to use ACM or S3. Required if `useAcmCertForSSL` is set to `true` or `sslKeyCertChainFile` and `sslKeyFile` are AWS S3 paths. +authentication | No | Object | An authentication configuration. By default, this runs an unauthenticated server. This uses pluggable authentication for HTTPS. To use basic authentication, define the `http_basic` plugin with a `username` and `password`. To provide customer authentication use or create a plugin which implements: [GrpcAuthenticationProvider](https://github.com/opensearch-project/data-prepper/blob/main/data-prepper-plugins/armeria-common/src/main/java/com/amazon/dataprepper/armeria/authentication/GrpcAuthenticationProvider.java). +record_type | No | String | A string represents the supported record data type that will be written into the buffer plugin. Its value takes either `otlp` or `event`. Default is `otlp`.

  • `otlp`: otel-trace-source will write each incoming ExportTraceServiceRequest as record data type into the buffer.
  • `event`: otel-trace-source will decode each incoming ExportTraceServiceRequest into collection of Data Prepper internal spans serving as buffer items. To achieve better performance in this mode, it is recommended to set the buffer capacity proportional to the estimated number of spans in the incoming request payload.
### http_source @@ -116,13 +117,19 @@ Prior to Data Prepper 1.3, Processors were named Preppers. Starting in Data Prep ### otel_trace_raw_prepper -Converts OpenTelemetry data to OpenSearch-compatible JSON documents. +Converts OpenTelemetry data to OpenSearch-compatible JSON documents and fills in trace group related fields in those JSON documents. It requires `record_type` to be set as `otlp` in `otel_trace_source`. Option | Required | Type | Description :--- | :--- | :--- | :--- -root_span_flush_delay | No | Integer | Represents the time interval in seconds to flush all the root spans in the processor together with their descendants. Default is 30. trace_flush_interval | No | Integer | Represents the time interval in seconds to flush all the descendant spans without any root span. Default is 180. +### otel_trace_raw + +This processor is a Data Prepper event record type compatible version of `otel_trace_raw_prepper` that fills in trace group related fields into all incoming Data Prepper span records. It requires `record_type` to be set as `event` in `otel_trace_source`. + +Option | Required | Type | Description +:--- | :--- | :--- | :--- +trace_flush_interval | No | Integer | Represents the time interval in seconds to flush all the descendant spans without any root span. Default is 180. ### service_map_stateful diff --git a/_clients/data-prepper/pipelines.md b/_clients/data-prepper/pipelines.md index b664d98a..8eb084a4 100644 --- a/_clients/data-prepper/pipelines.md +++ b/_clients/data-prepper/pipelines.md @@ -75,6 +75,8 @@ This example uses weak security. We strongly recommend securing all plugins whic The following example demonstrates how to build a pipeline that supports the [Trace Analytics OpenSearch Dashboards plugin]({{site.url}}{{site.baseurl}}/observability-plugin/trace/ta-dashboards/). This pipeline takes data from the OpenTelemetry Collector and uses two other pipelines as sinks. These two separate pipelines index trace and the service map documents for the dashboard plugin. +#### Classic + ```yml entry-pipeline: delay: "100" @@ -115,6 +117,65 @@ service-map-pipeline: trace_analytics_service_map: true ``` +#### Event record type + +Starting from Data Prepper 1.4, we support event record type in trace analytics pipeline source, buffer and processors. + +```yml +entry-pipeline: + delay: "100" + source: + otel_trace_source: + ssl: false + record_type: event + buffer: + bounded_blocking: + buffer_size: 10240 + batch_size: 160 + sink: + - pipeline: + name: "raw-pipeline" + - pipeline: + name: "service-map-pipeline" +raw-pipeline: + source: + pipeline: + name: "entry-pipeline" + buffer: + bounded_blocking: + buffer_size: 10240 + batch_size: 160 + processor: + - otel_trace_raw: + sink: + - opensearch: + hosts: ["https://localhost:9200"] + insecure: true + username: admin + password: admin + trace_analytics_raw: true +service-map-pipeline: + delay: "100" + source: + pipeline: + name: "entry-pipeline" + buffer: + bounded_blocking: + buffer_size: 10240 + batch_size: 160 + processor: + - service_map_stateful: + sink: + - opensearch: + hosts: ["https://localhost:9200"] + insecure: true + username: admin + password: admin + trace_analytics_service_map: true +``` + +Note that it is recommended to scale the `buffer_size` and `batch_size` by the estimated maximum batch size in the client request payload to maintain similar ingestion throughput and latency as in [Classic](#classic). + ## Migrating from Logstash Data Prepper supports Logstash configuration files for a limited set of plugins. Simply use the logstash config to run Data Prepper. From de422a31420460632d7649711bc6149504bf7e18 Mon Sep 17 00:00:00 2001 From: Chen <19492223+chenqi0805@users.noreply.github.com> Date: Fri, 29 Apr 2022 11:08:37 -0500 Subject: [PATCH 17/48] MAINT: add user recommendation Signed-off-by: Chen <19492223+chenqi0805@users.noreply.github.com> --- _clients/data-prepper/pipelines.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/_clients/data-prepper/pipelines.md b/_clients/data-prepper/pipelines.md index 8eb084a4..3937b599 100644 --- a/_clients/data-prepper/pipelines.md +++ b/_clients/data-prepper/pipelines.md @@ -77,6 +77,8 @@ The following example demonstrates how to build a pipeline that supports the [Tr #### Classic +This pipeline definition will be deprecated in 2.0. Users are recommended to use [Event record type](#event-record-type) pipeline definition. + ```yml entry-pipeline: delay: "100" From a032aa13ae220b998c6e499dd1d86dad5e8b8911 Mon Sep 17 00:00:00 2001 From: Chen <19492223+chenqi0805@users.noreply.github.com> Date: Fri, 29 Apr 2022 19:15:52 -0500 Subject: [PATCH 18/48] MAINT: update working Signed-off-by: Chen <19492223+chenqi0805@users.noreply.github.com> --- _clients/data-prepper/data-prepper-reference.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_clients/data-prepper/data-prepper-reference.md b/_clients/data-prepper/data-prepper-reference.md index 24366454..4d869bc1 100644 --- a/_clients/data-prepper/data-prepper-reference.md +++ b/_clients/data-prepper/data-prepper-reference.md @@ -52,7 +52,7 @@ sslKeyFile | Conditionally | String | File-system path or AWS S3 path to the se useAcmCertForSSL | No | Boolean | Whether to enable TLS/SSL using certificate and private key from AWS Certificate Manager (ACM). Default is `false`. acmCertificateArn | Conditionally | String | Represents the ACM certificate ARN. ACM certificate take preference over S3 or local file system certificate. Required if `useAcmCertForSSL` is set to `true`. awsRegion | Conditionally | String | Represents the AWS region to use ACM or S3. Required if `useAcmCertForSSL` is set to `true` or `sslKeyCertChainFile` and `sslKeyFile` are AWS S3 paths. -authentication | No | Object | An authentication configuration. By default, this runs an unauthenticated server. This uses pluggable authentication for HTTPS. To use basic authentication, define the `http_basic` plugin with a `username` and `password`. To provide customer authentication use or create a plugin which implements: [GrpcAuthenticationProvider](https://github.com/opensearch-project/data-prepper/blob/main/data-prepper-plugins/armeria-common/src/main/java/com/amazon/dataprepper/armeria/authentication/GrpcAuthenticationProvider.java). +authentication | No | Object | An authentication configuration. By default, this creates an unauthenticated server for the pipeline. This uses pluggable authentication for HTTPS. To use basic authentication, define the `http_basic` plugin with a `username` and `password`. To provide customer authentication use or create a plugin which implements: [GrpcAuthenticationProvider](https://github.com/opensearch-project/data-prepper/blob/main/data-prepper-plugins/armeria-common/src/main/java/com/amazon/dataprepper/armeria/authentication/GrpcAuthenticationProvider.java). record_type | No | String | A string represents the supported record data type that will be written into the buffer plugin. Its value takes either `otlp` or `event`. Default is `otlp`.
  • `otlp`: otel-trace-source will write each incoming ExportTraceServiceRequest as record data type into the buffer.
  • `event`: otel-trace-source will decode each incoming ExportTraceServiceRequest into collection of Data Prepper internal spans serving as buffer items. To achieve better performance in this mode, it is recommended to set the buffer capacity proportional to the estimated number of spans in the incoming request payload.
### http_source @@ -66,7 +66,7 @@ request_timeout | No | Integer | The request timeout in millis. Default is `10_0 thread_count | No | Integer | The number of threads to keep in the ScheduledThreadPool. Default is `200`. max_connection_count | No | Integer | The maximum allowed number of open connections. Default is `500`. max_pending_requests | No | Integer | The maximum number of allowed tasks in ScheduledThreadPool work queue. Default is `1024`. -authentication | No | Object | An authentication configuration. By default, this runs an unauthenticated server. This uses pluggable authentication for HTTPS. To use basic authentication define the `http_basic` plugin with a `username` and `password`. To provide customer authentication use or create a plugin which implements: [ArmeriaHttpAuthenticationProvider](https://github.com/opensearch-project/data-prepper/blob/main/data-prepper-plugins/armeria-common/src/main/java/com/amazon/dataprepper/armeria/authentication/ArmeriaHttpAuthenticationProvider.java). +authentication | No | Object | An authentication configuration. By default, this creates an unauthenticated server for the pipeline. This uses pluggable authentication for HTTPS. To use basic authentication define the `http_basic` plugin with a `username` and `password`. To provide customer authentication use or create a plugin which implements: [ArmeriaHttpAuthenticationProvider](https://github.com/opensearch-project/data-prepper/blob/main/data-prepper-plugins/armeria-common/src/main/java/com/amazon/dataprepper/armeria/authentication/ArmeriaHttpAuthenticationProvider.java). ### file From 6418359b620702b6e463b81b0af520c6de74b2c3 Mon Sep 17 00:00:00 2001 From: Liz Snyder Date: Tue, 3 May 2022 09:39:17 -0700 Subject: [PATCH 19/48] Clarify ISM refresh behavior Signed-off-by: Liz Snyder --- _im-plugin/ism/policies.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_im-plugin/ism/policies.md b/_im-plugin/ism/policies.md index 79cc1ed1..16c641d1 100644 --- a/_im-plugin/ism/policies.md +++ b/_im-plugin/ism/policies.md @@ -126,7 +126,7 @@ Parameter | Description | Type | Required ### read_only -Sets a managed index to be read only. +Sets a managed index to be read only. When an index is read only it doesn't refresh. ```json { From 1d1487615ef4723248f04151b01e9ae6acdd6bfa Mon Sep 17 00:00:00 2001 From: Liz Snyder Date: Tue, 3 May 2022 12:05:50 -0700 Subject: [PATCH 20/48] Reword Signed-off-by: Liz Snyder --- _im-plugin/ism/policies.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_im-plugin/ism/policies.md b/_im-plugin/ism/policies.md index 16c641d1..e6760197 100644 --- a/_im-plugin/ism/policies.md +++ b/_im-plugin/ism/policies.md @@ -126,7 +126,7 @@ Parameter | Description | Type | Required ### read_only -Sets a managed index to be read only. When an index is read only it doesn't refresh. +Sets a managed index to be read only. Read-only indexes don't refresh. ```json { From 6145ae10b1576020031fd8d2f60f26fa25c50c9e Mon Sep 17 00:00:00 2001 From: Naarcha-AWS Date: Thu, 5 May 2022 09:39:42 -0500 Subject: [PATCH 21/48] Fix YUM RPM install link Signed-off-by: Naarcha-AWS --- _opensearch/install/rpm.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_opensearch/install/rpm.md b/_opensearch/install/rpm.md index fd57955d..333768e7 100644 --- a/_opensearch/install/rpm.md +++ b/_opensearch/install/rpm.md @@ -59,11 +59,11 @@ YUM, an RPM package management tool, allows you to pull the RPM package from the 1. Create a repository file for both OpenSearch and OpenSearch Dashboards: ```bash - sudo curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch/2.x/opensearch-{{site.opensearch_version}}.repo -o /etc/yum.repos.d/{{site.opensearch_version}}.repo + sudo curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch/2.x/opensearch-2.x.repo -o /etc/yum.repos.d/{{site.opensearch_version}}.repo ``` ```bash - sudo curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch-dashboards/{{site.opensearch_version}}/opensearch-dashboards-{{site.opensearch_version}}.repo -o /etc/yum.repos.d/{{site.opensearch_version}}.repo + sudo curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch-dashboards/{{site.opensearch_version}}/opensearch-dashboards-2.x.repo -o /etc/yum.repos.d/{{site.opensearch_version}}.repo ``` To verify that the repos appear in your repo list, use `sudo yum repolist`. From 8f332383684945d445f65a84072c4671776d37a5 Mon Sep 17 00:00:00 2001 From: Naarcha-AWS Date: Thu, 5 May 2022 09:53:00 -0500 Subject: [PATCH 22/48] Add RPM install instructions for Dashboards Signed-off-by: Naarcha-AWS --- _dashboards/install/rpm.md | 54 ++++++++++++++++++++++++++++++++++++++ _opensearch/install/rpm.md | 2 +- 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 _dashboards/install/rpm.md diff --git a/_dashboards/install/rpm.md b/_dashboards/install/rpm.md new file mode 100644 index 00000000..8fa14f2b --- /dev/null +++ b/_dashboards/install/rpm.md @@ -0,0 +1,54 @@ +--- +layout: default +title: RPM +parent: Install OpenSearch Dashboards +nav_order: 31 +--- + +# Run OpenSearch Dashboards using RPM + +1. Create a repository file for OpenSearch Dashboards: + + ```bash + sudo curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch-dashboards/2.x/opensearch-dashboards-2.x.repo -o /etc/yum.repos.d/{{site.opensearch_version}}.repo + ``` + +2. Clean your YUM cache, to ensure a smooth installation: + + ```bash + sudo yum clean all + ``` + +3. With the repository file downloaded, list all available versions of OpenSearch: + + ```bash + sudo yum list | grep opensearch-dashboards + ``` + +4. Choose the version of OpenSearch Dashboards you want to install: + + ```bash + sudo yum install opensearch-dashboards + ``` + + Unless otherwise indicated, the highest minor version of OpenSearch Dashboards installs. + +5. During installation, the installer stops to see if the GPG key matches the OpenSearch project. Verify that the `Fingerprint` matches the following: + + ```bash + Fingerprint: c5b7 4989 65ef d1c2 924b a9d5 39d3 1987 9310 d3fc + ``` + + If correct, enter `yes` or `y`. The OpenSearch Dashboards installation continues. + +6. Run OpenSearch Dashboards using `systemctl`. + + ```bash + sudo systemctl start opensearch-dashboards.service + ``` + +7. To stop running OpenSearch Dashboards, enter + + ```bash + sudo systemctl stop opensearch-dashboards.service + ``` diff --git a/_opensearch/install/rpm.md b/_opensearch/install/rpm.md index 333768e7..d4e57cbb 100644 --- a/_opensearch/install/rpm.md +++ b/_opensearch/install/rpm.md @@ -63,7 +63,7 @@ YUM, an RPM package management tool, allows you to pull the RPM package from the ``` ```bash - sudo curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch-dashboards/{{site.opensearch_version}}/opensearch-dashboards-2.x.repo -o /etc/yum.repos.d/{{site.opensearch_version}}.repo + sudo curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch-dashboards/2.x/opensearch-dashboards-2.x.repo -o /etc/yum.repos.d/{{site.opensearch_version}}.repo ``` To verify that the repos appear in your repo list, use `sudo yum repolist`. From 530d156b2bd91c2d3aeab521c56d23f2ac164bd5 Mon Sep 17 00:00:00 2001 From: Naarcha-AWS Date: Thu, 5 May 2022 12:16:30 -0500 Subject: [PATCH 23/48] RPM link fixes, again Signed-off-by: Naarcha-AWS --- _dashboards/install/rpm.md | 2 +- _opensearch/install/rpm.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/_dashboards/install/rpm.md b/_dashboards/install/rpm.md index 8fa14f2b..87ec6265 100644 --- a/_dashboards/install/rpm.md +++ b/_dashboards/install/rpm.md @@ -10,7 +10,7 @@ nav_order: 31 1. Create a repository file for OpenSearch Dashboards: ```bash - sudo curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch-dashboards/2.x/opensearch-dashboards-2.x.repo -o /etc/yum.repos.d/{{site.opensearch_version}}.repo + sudo curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch-dashboards/2.x/opensearch-dashboards-2.x.repo -o /etc/yum.repos.d/opensearch-dashboards-2.x.repo ``` 2. Clean your YUM cache, to ensure a smooth installation: diff --git a/_opensearch/install/rpm.md b/_opensearch/install/rpm.md index d4e57cbb..b24312a5 100644 --- a/_opensearch/install/rpm.md +++ b/_opensearch/install/rpm.md @@ -59,11 +59,11 @@ YUM, an RPM package management tool, allows you to pull the RPM package from the 1. Create a repository file for both OpenSearch and OpenSearch Dashboards: ```bash - sudo curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch/2.x/opensearch-2.x.repo -o /etc/yum.repos.d/{{site.opensearch_version}}.repo + sudo curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch/2.x/opensearch-2.x.repo -o /etc/yum.repos.d/opensearch-2.x.repo ``` ```bash - sudo curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch-dashboards/2.x/opensearch-dashboards-2.x.repo -o /etc/yum.repos.d/{{site.opensearch_version}}.repo + sudo curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch-dashboards/2.x/opensearch-dashboards-2.x.repo -o /etc/yum.repos.d/opensearch-dashboards-2.x.repo ``` To verify that the repos appear in your repo list, use `sudo yum repolist`. From 8a4c748d82cc9d96db64d1b183008ed1fe153605 Mon Sep 17 00:00:00 2001 From: Naarcha-AWS Date: Thu, 5 May 2022 12:28:08 -0500 Subject: [PATCH 24/48] Remove dashboards from YUM version directory Signed-off-by: Naarcha-AWS --- _dashboards/install/rpm.md | 2 +- _opensearch/install/rpm.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/_dashboards/install/rpm.md b/_dashboards/install/rpm.md index 87ec6265..5dedf213 100644 --- a/_dashboards/install/rpm.md +++ b/_dashboards/install/rpm.md @@ -10,7 +10,7 @@ nav_order: 31 1. Create a repository file for OpenSearch Dashboards: ```bash - sudo curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch-dashboards/2.x/opensearch-dashboards-2.x.repo -o /etc/yum.repos.d/opensearch-dashboards-2.x.repo + sudo curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch-dashboards/2.x/opensearch-dashboards-2.x.repo -o /etc/yum.repos.d/opensearch-2.x.repo ``` 2. Clean your YUM cache, to ensure a smooth installation: diff --git a/_opensearch/install/rpm.md b/_opensearch/install/rpm.md index b24312a5..bf1566a2 100644 --- a/_opensearch/install/rpm.md +++ b/_opensearch/install/rpm.md @@ -63,7 +63,7 @@ YUM, an RPM package management tool, allows you to pull the RPM package from the ``` ```bash - sudo curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch-dashboards/2.x/opensearch-dashboards-2.x.repo -o /etc/yum.repos.d/opensearch-dashboards-2.x.repo + sudo curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch-dashboards/2.x/opensearch-dashboards-2.x.repo -o /etc/yum.repos.d/opensearch-2.x.repo ``` To verify that the repos appear in your repo list, use `sudo yum repolist`. From bdaec9833329608bf98faa1986788299fa81d343 Mon Sep 17 00:00:00 2001 From: Naarcha-AWS Date: Thu, 5 May 2022 13:01:10 -0500 Subject: [PATCH 25/48] Switch dashboards command back to original Signed-off-by: Naarcha-AWS --- _dashboards/install/rpm.md | 2 +- _opensearch/install/rpm.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/_dashboards/install/rpm.md b/_dashboards/install/rpm.md index 5dedf213..87ec6265 100644 --- a/_dashboards/install/rpm.md +++ b/_dashboards/install/rpm.md @@ -10,7 +10,7 @@ nav_order: 31 1. Create a repository file for OpenSearch Dashboards: ```bash - sudo curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch-dashboards/2.x/opensearch-dashboards-2.x.repo -o /etc/yum.repos.d/opensearch-2.x.repo + sudo curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch-dashboards/2.x/opensearch-dashboards-2.x.repo -o /etc/yum.repos.d/opensearch-dashboards-2.x.repo ``` 2. Clean your YUM cache, to ensure a smooth installation: diff --git a/_opensearch/install/rpm.md b/_opensearch/install/rpm.md index bf1566a2..b24312a5 100644 --- a/_opensearch/install/rpm.md +++ b/_opensearch/install/rpm.md @@ -63,7 +63,7 @@ YUM, an RPM package management tool, allows you to pull the RPM package from the ``` ```bash - sudo curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch-dashboards/2.x/opensearch-dashboards-2.x.repo -o /etc/yum.repos.d/opensearch-2.x.repo + sudo curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch-dashboards/2.x/opensearch-dashboards-2.x.repo -o /etc/yum.repos.d/opensearch-dashboards-2.x.repo ``` To verify that the repos appear in your repo list, use `sudo yum repolist`. From c4d71eb1eb1c2c1b06f4b6a5c2f714a0dd39eb2f Mon Sep 17 00:00:00 2001 From: alicejw Date: Fri, 6 May 2022 14:26:43 -0700 Subject: [PATCH 26/48] for TLQ changes that align with other PR #483 https://github.com/opensearch-project/documentation-website/pull/483 Signed-off-by: alicejw --- _opensearch/query-dsl/full-text.md | 2 +- _opensearch/query-dsl/index.md | 33 ++++++++++++++++++++++---- _opensearch/query-dsl/term.md | 37 +++++++++++------------------- 3 files changed, 43 insertions(+), 29 deletions(-) diff --git a/_opensearch/query-dsl/full-text.md b/_opensearch/query-dsl/full-text.md index e21efaa1..5ddcb39f 100644 --- a/_opensearch/query-dsl/full-text.md +++ b/_opensearch/query-dsl/full-text.md @@ -7,7 +7,7 @@ nav_order: 40 # Full-text queries -This page lists all full-text query types and common options. Given the sheer number of options and subtle behaviors, the best method of ensuring useful search results is to test different queries against representative indices and verify the output. +This page lists all full-text query types and common options. There are many options for full-text queries, each with its own subtle behavior difference, so the best method to ensure that you obtain useful search results is to test different queries against representative indexes and verify the outputs individually. --- diff --git a/_opensearch/query-dsl/index.md b/_opensearch/query-dsl/index.md index f3167f52..14959694 100644 --- a/_opensearch/query-dsl/index.md +++ b/_opensearch/query-dsl/index.md @@ -12,9 +12,31 @@ redirect_from: # Query DSL -While you can use HTTP request parameters to perform simple searches, you can also use the OpenSearch query domain-specific language (DSL), which provides a wider range of search options. The query DSL uses the HTTP request body, so you can more easily customize your queries to get the exact results that you want. +OpenSearch provides a query domain-specific language (DSL) that you can use to search with more options than a simple search via HTTP request parameter alone. The query DSL uses the HTTP request body, so you can more easily customize your queries to get the exact results that you want. -For example, the following request performs a simple search to search for a `speaker` field that has a value of `queen`. +The OpenSearch query DSL provides three query options: term-level queries, full-text queries, and boolean queries. You can even perform more complicated searches by using different elements from each variety to find whatever data you need. + +## DSL Query Types + +OpenSearch supports two types of queries when you search for data: term-level queries and full-text queries. + +The following table describes the differences between them: + +| | Term-level queries | Full-text queries +:--- | :--- | :--- +*Description* | Term-level queries answer which documents match a query. | Full-text queries answer how well the documents match a query. +*Analyzer* | The search term isn't analyzed. This means that the term query searches for your search term as it is. | The search term is analyzed by the same analyzer that was used for the specific field of the document at the time it was indexed. This means that your search term goes through the same analysis process that the document's field did. +*Relevance* | Term-level queries simply return documents that match without sorting them based on the relevance score. They still calculate the relevance score, but this score is the same for all the documents that are returned. | Full-text queries calculate a relevance score for each match and sort the results by decreasing order of relevance. +*Use Case* | Use term-level queries when you want to match exact values such as numbers, dates, tags, and so on, and don't need the matches to be sorted by relevance. | Use full-text queries to match text fields and sort by relevance after taking into account factors like casing and stemming variants. + +OpenSearch uses a probabilistic ranking framework called Okapi BM25 to calculate relevance scores. To learn more about Okapi BM25, see [Wikipedia](https://en.wikipedia.org/wiki/Okapi_BM25). +{: .note } + +To show the difference between a simple HTTP search versus a search via query DSL, we have an example of each one so that you can see how they differ. + +## Example: HTTP simple search + +The following request performs a simple search to search for a `speaker` field that has a value of `queen`. **Sample request** ```json @@ -55,7 +77,9 @@ GET _search?q=speaker:queen } ``` -With query DSL, however, you can include an HTTP request body to look for results more tailored to your needs. The following example shows how to search for `speaker` and `text_entry` fields that have a value of `QUEEN`. +## Example: Query DSL search + +With a query DSL search, you can include an HTTP request body to look for results more tailored to your needs. The following example shows how to search for `speaker` and `text_entry` fields that have a value of `QUEEN`. **Sample request** ```json @@ -118,5 +142,4 @@ With query DSL, however, you can include an HTTP request body to look for result ] } } -``` -The OpenSearch query DSL comes in three varieties: term-level queries, full-text queries, and boolean queries. You can even perform more complicated searches by using different elements from each variety to find whatever data you need. +``` \ No newline at end of file diff --git a/_opensearch/query-dsl/term.md b/_opensearch/query-dsl/term.md index d4a836d4..5b8eee75 100644 --- a/_opensearch/query-dsl/term.md +++ b/_opensearch/query-dsl/term.md @@ -2,25 +2,11 @@ layout: default title: Term-level queries parent: Query DSL -nav_order: 30 +nav_order: 32 --- # Term-level queries -OpenSearch supports two types of queries when you search for data: term-level queries and full-text queries. - -The following table describes the differences between them: - -| | Term-level queries | Full-text queries -:--- | :--- | :--- -*Description* | Term-level queries answer which documents match a query. | Full-text queries answer how well the documents match a query. -*Analyzer* | The search term isn't analyzed. This means that the term query searches for your search term as it is. | The search term is analyzed by the same analyzer that was used for the specific field of the document at the time it was indexed. This means that your search term goes through the same analysis process that the document's field did. -*Relevance* | Term-level queries simply return documents that match without sorting them based on the relevance score. They still calculate the relevance score, but this score is the same for all the documents that are returned. | Full-text queries calculate a relevance score for each match and sort the results by decreasing order of relevance. -*Use Case* | Use term-level queries when you want to match exact values such as numbers, dates, tags, and so on, and don't need the matches to be sorted by relevance. | Use full-text queries to match text fields and sort by relevance after taking into account factors like casing and stemming variants. - -OpenSearch uses a probabilistic ranking framework called Okapi BM25 to calculate relevance scores. To learn more about Okapi BM25, see [Wikipedia](https://en.wikipedia.org/wiki/Okapi_BM25). -{: .note } - Assume that you have the complete works of Shakespeare indexed in an OpenSearch cluster. We use a term-level query to search for the phrase "To be, or not to be" in the `text_entry` field: ```json @@ -228,7 +214,12 @@ The search query “HAMLET” is also searched literally. So, to get a match on --- -## Term +## Term-level query operations + +This section provides examples for term-level query operations that you can use for specific search use cases. + + +## Single term Use the `term` query to search for an exact term in a field. @@ -245,7 +236,7 @@ GET shakespeare/_search } ``` -## Terms +## Multiple terms Use the `terms` query to search for multiple terms in the same field. @@ -265,7 +256,7 @@ GET shakespeare/_search You get back documents that match any of the terms. -## IDs +## Document IDs Use the `ids` query to search for one or more document ID values. @@ -283,7 +274,7 @@ GET shakespeare/_search } ``` -## Range +## Range of values Use the `range` query to search for a range of values in a field. @@ -364,7 +355,7 @@ GET products/_search The keyword `now` refers to the current date and time. -## Prefix +## Multiple terms by prefix Use the `prefix` query to search for terms that begin with a specific prefix. @@ -379,7 +370,7 @@ GET shakespeare/_search } ``` -## Exists +## All instances of a specific field in a document Use the `exists` query to search for documents that contain a specific field. @@ -394,7 +385,7 @@ GET shakespeare/_search } ``` -## Wildcards +## Wildcard patterns Use wildcard queries to search for terms that match a wildcard pattern. @@ -422,7 +413,7 @@ If we change `*` to `?`, we get no matches, because `?` refers to a single chara Wildcard queries tend to be slow because they need to iterate over a lot of terms. Avoid placing wildcard characters at the beginning of a query because it could be a very expensive operation in terms of both resources and time. -## Regex +## Regular expressions (Regex) Use the `regexp` query to search for terms that match a regular expression. From 6b0b9b5275542166630fda84680d6f29089e09cf Mon Sep 17 00:00:00 2001 From: alicejw Date: Fri, 6 May 2022 14:55:06 -0700 Subject: [PATCH 27/48] fix unnecessary nav order change. was remnant of previously added new page that is not needed now Signed-off-by: alicejw --- _opensearch/query-dsl/term.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_opensearch/query-dsl/term.md b/_opensearch/query-dsl/term.md index 5b8eee75..689dcbb9 100644 --- a/_opensearch/query-dsl/term.md +++ b/_opensearch/query-dsl/term.md @@ -2,7 +2,7 @@ layout: default title: Term-level queries parent: Query DSL -nav_order: 32 +nav_order: 30 --- # Term-level queries From fff1f03c4d43485964a978eedff9a308860711da Mon Sep 17 00:00:00 2001 From: alicejw Date: Fri, 6 May 2022 15:09:37 -0700 Subject: [PATCH 28/48] add column title to query type table Signed-off-by: alicejw --- _opensearch/query-dsl/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_opensearch/query-dsl/index.md b/_opensearch/query-dsl/index.md index 14959694..610d7f67 100644 --- a/_opensearch/query-dsl/index.md +++ b/_opensearch/query-dsl/index.md @@ -22,9 +22,9 @@ OpenSearch supports two types of queries when you search for data: term-level qu The following table describes the differences between them: -| | Term-level queries | Full-text queries +| Metrics | Term-level queries | Full-text queries :--- | :--- | :--- -*Description* | Term-level queries answer which documents match a query. | Full-text queries answer how well the documents match a query. +*Query results* | Term-level queries answer which documents match a query. | Full-text queries answer how well the documents match a query. *Analyzer* | The search term isn't analyzed. This means that the term query searches for your search term as it is. | The search term is analyzed by the same analyzer that was used for the specific field of the document at the time it was indexed. This means that your search term goes through the same analysis process that the document's field did. *Relevance* | Term-level queries simply return documents that match without sorting them based on the relevance score. They still calculate the relevance score, but this score is the same for all the documents that are returned. | Full-text queries calculate a relevance score for each match and sort the results by decreasing order of relevance. *Use Case* | Use term-level queries when you want to match exact values such as numbers, dates, tags, and so on, and don't need the matches to be sorted by relevance. | Use full-text queries to match text fields and sort by relevance after taking into account factors like casing and stemming variants. From 2d5062d85bf48e93210f81e759d277f9024bcb15 Mon Sep 17 00:00:00 2001 From: alicejw Date: Fri, 6 May 2022 15:39:01 -0700 Subject: [PATCH 29/48] disambiguate use of TLQ acronym applied incorrectly to because it represents instead. Signed-off-by: alicejw --- .../access-control/document-level-security.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/_security-plugin/access-control/document-level-security.md b/_security-plugin/access-control/document-level-security.md index 210c2d29..6d062d03 100644 --- a/_security-plugin/access-control/document-level-security.md +++ b/_security-plugin/access-control/document-level-security.md @@ -124,11 +124,11 @@ PUT _plugins/_security/api/roles/abac }] } ``` -## Use term-level lookup queries (TLQs) with DLS +## Use term-level lookup queries with DLS -You can perform term-level lookup queries (TLQs) with document-level security (DLS) using either of two modes: adaptive or filter level. The default mode is adaptive, where OpenSearch automatically switches between Lucene-level or filter-level mode depending on whether or not there is a TLQ. DLS queries without TLQs are executed in Lucene-level mode, whereas DLS queries with TLQs are executed in filter-level mode. +You can perform term-level queries with document-level security (DLS) using either of two modes: adaptive or filter level. The default mode is adaptive, where OpenSearch automatically switches between Lucene-level or filter-level mode depending on whether or not there is a term-level query. DLS queries that do not contain a term-level query are executed in Lucene-level mode, whereas DLS queries with term-level queries are executed in filter-level mode. -By default, the security plugin detects if a DLS query contains a TLQ or not and chooses the appropriate mode automatically at runtime. +By default, the security plugin detects if a DLS query contains a term-level query or not and chooses the appropriate mode automatically at runtime. To learn more about OpenSearch queries, see [Term-level queries](https://opensearch.org/docs/latest/opensearch/query-dsl/term/). @@ -144,6 +144,6 @@ plugins.security.dls.mode: filter-level | Evaluation mode | Parameter | Description | Usage | :--- | :--- | :--- | :--- | -Lucene-level DLS | `lucene-level` | This setting makes all DLS queries apply to the Lucene level. | Lucene-level DLS modifies Lucene queries and data structures directly. This is the most efficient mode but does not allow certain advanced constructs in DLS queries, including TLQs. +Lucene-level DLS | `lucene-level` | This setting makes all DLS queries apply to the Lucene level. | Lucene-level DLS modifies Lucene queries and data structures directly. This is the most efficient mode but does not allow certain advanced constructs in DLS queries, including term-level queries. Filter-level DLS | `filter-level` | This setting makes all DLS queries apply to the filter level. | In this mode, OpenSearch applies DLS by modifying queries that OpenSearch receives. This allows for term-level lookup queries in DLS queries, but you can only use the `get`, `search`, `mget`, and `msearch` operations to retrieve data from the protected index. Additionally, cross-cluster searches are limited with this mode. -Adaptive | `adaptive-level` | The default setting that allows OpenSearch to automatically choose the mode. | DLS queries without TLQs are executed in Lucene-level mode, while DLS queries that contain TLQ are executed in filter- level mode. +Adaptive | `adaptive-level` | The default setting that allows OpenSearch to automatically choose the mode. | DLS queries without term-level queries are executed in Lucene-level mode, while DLS queries that contain a term-level query are executed in filter-level mode. From 3d1087ed60c51a91a8acb4c7c59059be91629fcc Mon Sep 17 00:00:00 2001 From: alicejw Date: Fri, 6 May 2022 15:48:06 -0700 Subject: [PATCH 30/48] i found out that the original term was correct here, it is a term lookup query, not the generic so changing it back. Signed-off-by: alicejw --- _security-plugin/access-control/document-level-security.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/_security-plugin/access-control/document-level-security.md b/_security-plugin/access-control/document-level-security.md index 6d062d03..22204983 100644 --- a/_security-plugin/access-control/document-level-security.md +++ b/_security-plugin/access-control/document-level-security.md @@ -124,11 +124,11 @@ PUT _plugins/_security/api/roles/abac }] } ``` -## Use term-level lookup queries with DLS +## Use term lookup queries (TLQs) with DLS -You can perform term-level queries with document-level security (DLS) using either of two modes: adaptive or filter level. The default mode is adaptive, where OpenSearch automatically switches between Lucene-level or filter-level mode depending on whether or not there is a term-level query. DLS queries that do not contain a term-level query are executed in Lucene-level mode, whereas DLS queries with term-level queries are executed in filter-level mode. +You can perform term lookup queries (TLQs) with document-level security (DLS) using either of two modes: adaptive or filter level. The default mode is adaptive, where OpenSearch automatically switches between Lucene-level or filter-level mode depending on whether or not there is a TLQ. DLS queries that do not contain a TLQ are executed in Lucene-level mode, whereas DLS queries with TLQs are executed in filter-level mode. -By default, the security plugin detects if a DLS query contains a term-level query or not and chooses the appropriate mode automatically at runtime. +By default, the security plugin detects if a DLS query contains a TLQ or not and chooses the appropriate mode automatically at runtime. To learn more about OpenSearch queries, see [Term-level queries](https://opensearch.org/docs/latest/opensearch/query-dsl/term/). From e473df4cce60f3492eaca47621f355b41a57a30c Mon Sep 17 00:00:00 2001 From: alicejw Date: Fri, 6 May 2022 15:50:26 -0700 Subject: [PATCH 31/48] found more instances of to change to for Signed-off-by: alicejw --- _security-plugin/access-control/document-level-security.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/_security-plugin/access-control/document-level-security.md b/_security-plugin/access-control/document-level-security.md index 22204983..33920bce 100644 --- a/_security-plugin/access-control/document-level-security.md +++ b/_security-plugin/access-control/document-level-security.md @@ -144,6 +144,6 @@ plugins.security.dls.mode: filter-level | Evaluation mode | Parameter | Description | Usage | :--- | :--- | :--- | :--- | -Lucene-level DLS | `lucene-level` | This setting makes all DLS queries apply to the Lucene level. | Lucene-level DLS modifies Lucene queries and data structures directly. This is the most efficient mode but does not allow certain advanced constructs in DLS queries, including term-level queries. -Filter-level DLS | `filter-level` | This setting makes all DLS queries apply to the filter level. | In this mode, OpenSearch applies DLS by modifying queries that OpenSearch receives. This allows for term-level lookup queries in DLS queries, but you can only use the `get`, `search`, `mget`, and `msearch` operations to retrieve data from the protected index. Additionally, cross-cluster searches are limited with this mode. -Adaptive | `adaptive-level` | The default setting that allows OpenSearch to automatically choose the mode. | DLS queries without term-level queries are executed in Lucene-level mode, while DLS queries that contain a term-level query are executed in filter-level mode. +Lucene-level DLS | `lucene-level` | This setting makes all DLS queries apply to the Lucene level. | Lucene-level DLS modifies Lucene queries and data structures directly. This is the most efficient mode but does not allow certain advanced constructs in DLS queries, including TLQs. +Filter-level DLS | `filter-level` | This setting makes all DLS queries apply to the filter level. | In this mode, OpenSearch applies DLS by modifying queries that OpenSearch receives. This allows for TLQs in DLS queries, but you can only use the `get`, `search`, `mget`, and `msearch` operations to retrieve data from the protected index. Additionally, cross-cluster searches are limited with this mode. +Adaptive | `adaptive-level` | The default setting that allows OpenSearch to automatically choose the mode. | DLS queries without TLQs are executed in Lucene-level mode, while DLS queries that contain a TLQ are executed in filter-level mode. From 8a1605e7e1ba404ee4ac16d7e95f27a2e562641c Mon Sep 17 00:00:00 2001 From: alicejw Date: Mon, 9 May 2022 10:21:34 -0700 Subject: [PATCH 32/48] add a sample response to a terms query Signed-off-by: alicejw --- _opensearch/query-dsl/term.md | 63 +++++++++++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 6 deletions(-) diff --git a/_opensearch/query-dsl/term.md b/_opensearch/query-dsl/term.md index 7bfb90b5..09ad9d17 100644 --- a/_opensearch/query-dsl/term.md +++ b/_opensearch/query-dsl/term.md @@ -238,7 +238,7 @@ GET shakespeare/_search ## Multiple terms -Use the `terms` query to search for multiple terms in the same field. +Use the `terms` operation to search for multiple values for same query field. ```json GET shakespeare/_search @@ -255,16 +255,67 @@ GET shakespeare/_search ``` You get back documents that match any of the terms. +#### Sample response -### Terms Lookup +```json +{ + "took" : 11, + "timed_out" : false, + "_shards" : { + "total" : 1, + "successful" : 1, + "skipped" : 0, + "failed" : 0 + }, + "hits" : { + "total" : { + "value" : 2, + "relation" : "eq" + }, + "max_score" : 1.0, + "hits" : [ + { + "_index" : "shakespeare", + "_id" : "61808", + "_score" : 1.0, + "_source" : { + "type" : "line", + "line_id" : 61809, + "play_name" : "Merchant of Venice", + "speech_number" : 33, + "line_number" : "1.3.115", + "speaker" : "SHYLOCK", + "text_entry" : "Go to, then; you come to me, and you say" + } + }, + { + "_index" : "shakespeare", + "_id" : "61809", + "_score" : 1.0, + "_source" : { + "type" : "line", + "line_id" : 61810, + "play_name" : "Merchant of Venice", + "speech_number" : 33, + "line_number" : "1.3.116", + "speaker" : "SHYLOCK", + "text_entry" : "Shylock, we would have moneys: you say so;" + } + } + ] + } +} +``` -You can use a `terms` query with a `lookup` to match values based on a field in a document in another index. +### Terms lookup query (TQL) + +Use a terms lookup query (TQL) to retrieve multiple field values in a specific document within a specific index. Use the `terms` operation, and specify the index name, document Id and specify the term you want to look up with the `path` parameter. Parameter | Behavior :--- | :--- -`index` | The index from which the document is read. -`id` | The id of the documented. -`path` | Path to the field from which the values are used in the terms query. +`index` | The index name that contains the document that you want search. +`id` | Specifies the exact document to query for terms. +`path` | Specifies the field name for the query. E.g. to get all lines from the shakespeare play for a role (or roles) specified in the index `play-assignments` for the entry `42`: From 9564a2cd455f1c22a843eda0b247088bc7cf7187 Mon Sep 17 00:00:00 2001 From: alicejw Date: Mon, 9 May 2022 10:23:28 -0700 Subject: [PATCH 33/48] descriptions to clarify how to use the terms lookup query Signed-off-by: alicejw --- _opensearch/query-dsl/term.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_opensearch/query-dsl/term.md b/_opensearch/query-dsl/term.md index 09ad9d17..19711b7a 100644 --- a/_opensearch/query-dsl/term.md +++ b/_opensearch/query-dsl/term.md @@ -309,7 +309,7 @@ You get back documents that match any of the terms. ### Terms lookup query (TQL) -Use a terms lookup query (TQL) to retrieve multiple field values in a specific document within a specific index. Use the `terms` operation, and specify the index name, document Id and specify the term you want to look up with the `path` parameter. +Use a terms lookup query (TQL) to retrieve multiple field values in a specific document within a specific index. Use the `terms` operation, and specify the index name, document Id and specify the field you want to look up with the `path` parameter. Parameter | Behavior :--- | :--- From 87e8c5d83da55b3ef962f28d8d0467ddc8ba5881 Mon Sep 17 00:00:00 2001 From: alicejw Date: Mon, 9 May 2022 10:33:52 -0700 Subject: [PATCH 34/48] for typo in acronmym for TLQ Signed-off-by: alicejw --- _opensearch/query-dsl/term.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_opensearch/query-dsl/term.md b/_opensearch/query-dsl/term.md index 19711b7a..38c9c022 100644 --- a/_opensearch/query-dsl/term.md +++ b/_opensearch/query-dsl/term.md @@ -307,9 +307,9 @@ You get back documents that match any of the terms. } ``` -### Terms lookup query (TQL) +### Terms lookup query (TLQ) -Use a terms lookup query (TQL) to retrieve multiple field values in a specific document within a specific index. Use the `terms` operation, and specify the index name, document Id and specify the field you want to look up with the `path` parameter. +Use a terms lookup query (TLQ) to retrieve multiple field values in a specific document within a specific index. Use the `terms` operation, and specify the index name, document Id and specify the field you want to look up with the `path` parameter. Parameter | Behavior :--- | :--- From 01e505b864568113cbafb1ece5ec0c8c2b5e74e1 Mon Sep 17 00:00:00 2001 From: alicejw Date: Mon, 9 May 2022 10:41:20 -0700 Subject: [PATCH 35/48] for typo Signed-off-by: alicejw --- _opensearch/query-dsl/term.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_opensearch/query-dsl/term.md b/_opensearch/query-dsl/term.md index 38c9c022..d3e87ee1 100644 --- a/_opensearch/query-dsl/term.md +++ b/_opensearch/query-dsl/term.md @@ -317,7 +317,7 @@ Parameter | Behavior `id` | Specifies the exact document to query for terms. `path` | Specifies the field name for the query. -E.g. to get all lines from the shakespeare play for a role (or roles) specified in the index `play-assignments` for the entry `42`: +To get all the lines from a Shakespeare play for a role (or roles) specified in the index `play-assignments` for the document `42`: ```json GET shakespeare/_search From 6f4c75d023a602e0c7b6a5a3b04804997f7a782c Mon Sep 17 00:00:00 2001 From: alicejw Date: Mon, 9 May 2022 10:47:34 -0700 Subject: [PATCH 36/48] for heading to match other level 2s Signed-off-by: alicejw --- _opensearch/query-dsl/term.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_opensearch/query-dsl/term.md b/_opensearch/query-dsl/term.md index d3e87ee1..2bc206b9 100644 --- a/_opensearch/query-dsl/term.md +++ b/_opensearch/query-dsl/term.md @@ -307,7 +307,7 @@ You get back documents that match any of the terms. } ``` -### Terms lookup query (TLQ) +## Terms lookup query (TLQ) Use a terms lookup query (TLQ) to retrieve multiple field values in a specific document within a specific index. Use the `terms` operation, and specify the index name, document Id and specify the field you want to look up with the `path` parameter. From 6e65cf24944e2e11d6d2fd4b9a5c35ba2fa52c95 Mon Sep 17 00:00:00 2001 From: alicejw Date: Wed, 11 May 2022 14:33:50 -0700 Subject: [PATCH 37/48] for editor's review comments Signed-off-by: alicejw --- _opensearch/query-dsl/full-text.md | 4 ++-- _opensearch/query-dsl/index.md | 10 +++++----- _opensearch/query-dsl/term.md | 10 +++++----- .../access-control/document-level-security.md | 10 +++++----- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/_opensearch/query-dsl/full-text.md b/_opensearch/query-dsl/full-text.md index 5ddcb39f..7d043e6e 100644 --- a/_opensearch/query-dsl/full-text.md +++ b/_opensearch/query-dsl/full-text.md @@ -405,8 +405,8 @@ GET _search ## Options -Option | Valid values | Description -:--- | :--- | :--- +| Option | Valid values | Description | +:--- | :--- | :--- | `allow_leading_wildcard` | Boolean | Whether `*` and `?` are allowed as the first character of a search term. The default is true. `analyze_wildcard` | Boolean | Whether OpenSearch should attempt to analyze wildcard terms. Some analyzers do a poor job at this task, so the default is false. `analyzer` | `standard, simple, whitespace, stop, keyword, pattern, , fingerprint` | The analyzer you want to use for the query. Different analyzers have different character filters, tokenizers, and token filters. The `stop` analyzer, for example, removes stop words (e.g. "an," "but," "this") from the query string. diff --git a/_opensearch/query-dsl/index.md b/_opensearch/query-dsl/index.md index 610d7f67..aef51ea3 100644 --- a/_opensearch/query-dsl/index.md +++ b/_opensearch/query-dsl/index.md @@ -12,22 +12,22 @@ redirect_from: # Query DSL -OpenSearch provides a query domain-specific language (DSL) that you can use to search with more options than a simple search via HTTP request parameter alone. The query DSL uses the HTTP request body, so you can more easily customize your queries to get the exact results that you want. +OpenSearch provides a query domain-specific language (DSL) that you can use to search with more options than a simple search with an HTTP request parameter alone. The query DSL uses the HTTP request body, so you can more easily customize your queries to get the exact results that you want. The OpenSearch query DSL provides three query options: term-level queries, full-text queries, and boolean queries. You can even perform more complicated searches by using different elements from each variety to find whatever data you need. -## DSL Query Types +## DSL query types OpenSearch supports two types of queries when you search for data: term-level queries and full-text queries. -The following table describes the differences between them: +The following table describes the differences between them. | Metrics | Term-level queries | Full-text queries :--- | :--- | :--- *Query results* | Term-level queries answer which documents match a query. | Full-text queries answer how well the documents match a query. -*Analyzer* | The search term isn't analyzed. This means that the term query searches for your search term as it is. | The search term is analyzed by the same analyzer that was used for the specific field of the document at the time it was indexed. This means that your search term goes through the same analysis process that the document's field did. +*Analyzer* | The search term isn't analyzed. This means that the term query searches for your search term as it is. | The search term is analyzed by the same analyzer that was used for the specific field of the document at the time it was indexed. This means that your search term goes through the same analysis process as the document's field. *Relevance* | Term-level queries simply return documents that match without sorting them based on the relevance score. They still calculate the relevance score, but this score is the same for all the documents that are returned. | Full-text queries calculate a relevance score for each match and sort the results by decreasing order of relevance. -*Use Case* | Use term-level queries when you want to match exact values such as numbers, dates, tags, and so on, and don't need the matches to be sorted by relevance. | Use full-text queries to match text fields and sort by relevance after taking into account factors like casing and stemming variants. +*Use Case* | Use term-level queries when you want to match exact values, such as numbers, dates, tags, and so on, and don't need the matches to be sorted by relevance. | Use full-text queries to match text fields and sort by relevance after taking into account factors like casing and stemming variants. OpenSearch uses a probabilistic ranking framework called Okapi BM25 to calculate relevance scores. To learn more about Okapi BM25, see [Wikipedia](https://en.wikipedia.org/wiki/Okapi_BM25). {: .note } diff --git a/_opensearch/query-dsl/term.md b/_opensearch/query-dsl/term.md index 2bc206b9..d24416a1 100644 --- a/_opensearch/query-dsl/term.md +++ b/_opensearch/query-dsl/term.md @@ -214,7 +214,7 @@ The search query “HAMLET” is also searched literally. So, to get a match on --- -## Term-level query operations +# Term-level query operations This section provides examples for term-level query operations that you can use for specific search use cases. @@ -309,13 +309,13 @@ You get back documents that match any of the terms. ## Terms lookup query (TLQ) -Use a terms lookup query (TLQ) to retrieve multiple field values in a specific document within a specific index. Use the `terms` operation, and specify the index name, document Id and specify the field you want to look up with the `path` parameter. +Use a terms lookup query (TLQ) to retrieve multiple field values in a specific document within a specific index. Use the `terms` operation and specify the index name, document ID and field you want to look up with the `path` parameter. Parameter | Behavior :--- | :--- -`index` | The index name that contains the document that you want search. -`id` | Specifies the exact document to query for terms. -`path` | Specifies the field name for the query. +`index` | The index name that contains the document you want search. +`id` | The exact document to query for terms. +`path` | The field name for the query. To get all the lines from a Shakespeare play for a role (or roles) specified in the index `play-assignments` for the document `42`: diff --git a/_security-plugin/access-control/document-level-security.md b/_security-plugin/access-control/document-level-security.md index 33920bce..e3176aa8 100644 --- a/_security-plugin/access-control/document-level-security.md +++ b/_security-plugin/access-control/document-level-security.md @@ -124,13 +124,13 @@ PUT _plugins/_security/api/roles/abac }] } ``` -## Use term lookup queries (TLQs) with DLS +## Use TLQs with DLS -You can perform term lookup queries (TLQs) with document-level security (DLS) using either of two modes: adaptive or filter level. The default mode is adaptive, where OpenSearch automatically switches between Lucene-level or filter-level mode depending on whether or not there is a TLQ. DLS queries that do not contain a TLQ are executed in Lucene-level mode, whereas DLS queries with TLQs are executed in filter-level mode. +You can perform TLQs with DLS using either of two modes: adaptive or filter level. The default mode is adaptive, where OpenSearch automatically switches between Lucene-level or filter-level mode depending on whether or not there is a TLQ. DLS queries that do not contain a TLQ are executed in Lucene-level mode, whereas DLS queries with TLQs are executed in filter-level mode. By default, the security plugin detects if a DLS query contains a TLQ or not and chooses the appropriate mode automatically at runtime. -To learn more about OpenSearch queries, see [Term-level queries](https://opensearch.org/docs/latest/opensearch/query-dsl/term/). +To learn more about OpenSearch TLQ, see [Terms lookup query (TLQ)](https://opensearch.org/docs/latest/opensearch/query-dsl/term/#terms-lookup-query-tlq). ### How to set the DLS evaluation mode in `opensearch.yml` @@ -145,5 +145,5 @@ plugins.security.dls.mode: filter-level | Evaluation mode | Parameter | Description | Usage | :--- | :--- | :--- | :--- | Lucene-level DLS | `lucene-level` | This setting makes all DLS queries apply to the Lucene level. | Lucene-level DLS modifies Lucene queries and data structures directly. This is the most efficient mode but does not allow certain advanced constructs in DLS queries, including TLQs. -Filter-level DLS | `filter-level` | This setting makes all DLS queries apply to the filter level. | In this mode, OpenSearch applies DLS by modifying queries that OpenSearch receives. This allows for TLQs in DLS queries, but you can only use the `get`, `search`, `mget`, and `msearch` operations to retrieve data from the protected index. Additionally, cross-cluster searches are limited with this mode. -Adaptive | `adaptive-level` | The default setting that allows OpenSearch to automatically choose the mode. | DLS queries without TLQs are executed in Lucene-level mode, while DLS queries that contain a TLQ are executed in filter-level mode. +Filter-level DLS | `filter-level` | This setting makes all DLS queries apply to the filter level. | In this mode, OpenSearch applies DLS by modifying the queries received. This allows for TLQs in DLS queries, but you can only use the `get`, `search`, `mget`, and `msearch` operations to retrieve data from the protected index. Additionally, cross-cluster searches are limited with this mode. +Adaptive | `adaptive-level` | By default, this setting allows OpenSearch to automatically choose the mode. | DLS queries without TLQs are executed in Lucene-level mode, while DLS queries that contain a TLQ are executed in filter-level mode. From 2f897eba941064230c67710514f05a9e8a72d0bb Mon Sep 17 00:00:00 2001 From: alicejw Date: Wed, 11 May 2022 17:07:11 -0700 Subject: [PATCH 38/48] for bug fix on obfuscated table Signed-off-by: alicejw --- _opensearch/query-dsl/full-text.md | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/_opensearch/query-dsl/full-text.md b/_opensearch/query-dsl/full-text.md index 7d043e6e..a86fa48d 100644 --- a/_opensearch/query-dsl/full-text.md +++ b/_opensearch/query-dsl/full-text.md @@ -405,12 +405,15 @@ GET _search ## Options -| Option | Valid values | Description | -:--- | :--- | :--- | +You can increase the specificity of your query by adding the following options. + + + +Option | Valid values | Description +:--- | :--- | :--- `allow_leading_wildcard` | Boolean | Whether `*` and `?` are allowed as the first character of a search term. The default is true. `analyze_wildcard` | Boolean | Whether OpenSearch should attempt to analyze wildcard terms. Some analyzers do a poor job at this task, so the default is false. `analyzer` | `standard, simple, whitespace, stop, keyword, pattern, , fingerprint` | The analyzer you want to use for the query. Different analyzers have different character filters, tokenizers, and token filters. The `stop` analyzer, for example, removes stop words (e.g. "an," "but," "this") from the query string. -`auto_generate_synonyms_phrase_query` | Boolean | A value of true (default) automatically generates [phrase queries](https://lucene.apache.org/core/8_9_0/core/org/apache/lucene/search/PhraseQuery.html) for multi-term synonyms. For example, if you have the synonym `"ba, batting average"` and search for "ba," OpenSearch searches for `ba OR "batting average"` (if this option is true) or `ba OR (batting AND average)` (if this option is false). `boost` | Floating-point | Boosts the clause by the given multiplier. Useful for weighing clauses in compound queries. The default is 1.0. `cutoff_frequency` | Between `0.0` and `1.0` or a positive integer | This value lets you define high and low frequency terms based on number of occurrences in the index. Numbers between 0 and 1 are treated as a percentage. For example, 0.10 is 10%. This value means that if a word occurs within the search field in more than 10% of the documents on the shard, OpenSearch considers the word "high frequency" and deemphasizes it when calculating search score.

Because this setting is *per shard*, testing its impact on search results can be challenging unless a cluster has many documents. `enable_position_increments` | Boolean | When true, result queries are aware of position increments. This setting is useful when the removal of stop words leaves an unwanted "gap" between terms. The default is true. @@ -433,3 +436,16 @@ GET _search `time_zone` | UTC offset | The time zone to use (e.g. `-08:00`) if the query string contains a date range (e.g. `"query": "wind rises release_date[2012-01-01 TO 2014-01-01]"`). The default is `UTC`. `type` | `best_fields, most_fields, cross_fields, phrase, phrase_prefix` | Determines how OpenSearch executes the query and scores the results. The default is `best_fields`. `zero_terms_query` | `none, all` | If the analyzer removes all terms from a query string, whether to match no documents (default) or all documents. For example, the `stop` analyzer removes all terms from the string "an but this." + +#### Multi-term synonym query + +If you are searching for multiple terms such as synonyms, but you only require one term to match, you can use the `auto_generate_synonyms_phrase_query` option to perform your search with logical `OR` operation. This automatically searches for multi-term synonyms in a phrase query. + +This option takes boolean values; `true` is the default value. + +Consider this example search for the synonym `"ba, batting average"`: + +* set to `true` - OpenSearch looks for `ba OR "batting average"` +* set to `false` - OpenSearch looks for `ba OR (batting AND average)`. + +For more details about multi-term synonyms, see [phrase queries](https://lucene.apache.org/core/8_9_0/core/org/apache/lucene/search/PhraseQuery.html). From 99673dd6315d21ac81088d3c2a4e7be96575fd97 Mon Sep 17 00:00:00 2001 From: alicejw Date: Thu, 12 May 2022 16:00:01 -0700 Subject: [PATCH 39/48] for review comments Signed-off-by: alicejw --- _opensearch/query-dsl/full-text.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/_opensearch/query-dsl/full-text.md b/_opensearch/query-dsl/full-text.md index a86fa48d..5614c01f 100644 --- a/_opensearch/query-dsl/full-text.md +++ b/_opensearch/query-dsl/full-text.md @@ -407,8 +407,6 @@ GET _search You can increase the specificity of your query by adding the following options. - - Option | Valid values | Description :--- | :--- | :--- `allow_leading_wildcard` | Boolean | Whether `*` and `?` are allowed as the first character of a search term. The default is true. From 62d5ba4a57153cc9d2c123cc2a577dcf633a615b Mon Sep 17 00:00:00 2001 From: David Venable Date: Fri, 13 May 2022 14:03:41 -0500 Subject: [PATCH 40/48] Documentation for Metrics ingestion in Data Prepper 1.4.0. Signed-off-by: David Venable --- .../data-prepper/data-prepper-reference.md | 23 ++++++++++++++++ _clients/data-prepper/pipelines.md | 27 +++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/_clients/data-prepper/data-prepper-reference.md b/_clients/data-prepper/data-prepper-reference.md index 4d869bc1..1e937c25 100644 --- a/_clients/data-prepper/data-prepper-reference.md +++ b/_clients/data-prepper/data-prepper-reference.md @@ -68,6 +68,29 @@ max_connection_count | No | Integer | The maximum allowed number of open connect max_pending_requests | No | Integer | The maximum number of allowed tasks in ScheduledThreadPool work queue. Default is `1024`. authentication | No | Object | An authentication configuration. By default, this creates an unauthenticated server for the pipeline. This uses pluggable authentication for HTTPS. To use basic authentication define the `http_basic` plugin with a `username` and `password`. To provide customer authentication use or create a plugin which implements: [ArmeriaHttpAuthenticationProvider](https://github.com/opensearch-project/data-prepper/blob/main/data-prepper-plugins/armeria-common/src/main/java/com/amazon/dataprepper/armeria/authentication/ArmeriaHttpAuthenticationProvider.java). +### otel_metrics_source + +Source for the OpenTelemetry Collector for collecting Metric data. + +Option | Required | Type | Description +:--- |:--------------|:--------| :--- +port | No | Integer | The port OTel metrics source is running on. Default is `21891`. +request_timeout | No | Integer | The request timeout in milliseconds. Default is `10_000`. +health_check_service | No | Boolean | Enables a gRPC health check service under `grpc.health.v1/Health/Check`. Default is `false`. +proto_reflection_service | No | Boolean | Enables a reflection service for Protobuf services (see [gRPC reflection](https://github.com/grpc/grpc/blob/master/doc/server-reflection.md) and [gRPC Server Reflection Tutorial](https://github.com/grpc/grpc-java/blob/master/documentation/server-reflection-tutorial.md) docs). Default is `false`. +unframed_requests | No | Boolean | Enable requests not framed using the gRPC wire protocol. +thread_count | No | Integer | The number of threads to keep in the ScheduledThreadPool. Default is `200`. +max_connection_count | No | Integer | The maximum allowed number of open connections. Default is `500`. +ssl | No | Boolean | Enables connections to the OTel source port over TLS/SSL. Defaults to `true`. +sslKeyCertChainFile | Conditionally | String | File-system path or AWS S3 path to the security certificate (e.g. `"config/demo-data-prepper.crt"` or `"s3://my-secrets-bucket/demo-data-prepper.crt"`). Required if ssl is set to `true`. +sslKeyFile | Conditionally | String | File-system path or AWS S3 path to the security key (e.g. `"config/demo-data-prepper.key"` or `"s3://my-secrets-bucket/demo-data-prepper.key"`). Required if ssl is set to `true`. +useAcmCertForSSL | No | Boolean | Whether to enable TLS/SSL using certificate and private key from AWS Certificate Manager (ACM). Default is `false`. +acmCertificateArn | Conditionally | String | Represents the ACM certificate ARN. ACM certificate take preference over S3 or local file system certificate. Required if `useAcmCertForSSL` is set to `true`. +awsRegion | Conditionally | String | Represents the AWS region to use ACM or S3. Required if `useAcmCertForSSL` is set to `true` or `sslKeyCertChainFile` and `sslKeyFile` are AWS S3 paths. +authentication | No | Object | An authentication configuration. By default, this creates an unauthenticated server for the pipeline. This uses pluggable authentication for HTTPS. To use basic authentication, define the `http_basic` plugin with a `username` and `password`. To provide customer authentication use or create a plugin which implements: [GrpcAuthenticationProvider](https://github.com/opensearch-project/data-prepper/blob/main/data-prepper-plugins/armeria-common/src/main/java/com/amazon/dataprepper/armeria/authentication/GrpcAuthenticationProvider.java). + + + ### file Source for flat file input. diff --git a/_clients/data-prepper/pipelines.md b/_clients/data-prepper/pipelines.md index 3937b599..3f00afb6 100644 --- a/_clients/data-prepper/pipelines.md +++ b/_clients/data-prepper/pipelines.md @@ -178,6 +178,33 @@ service-map-pipeline: Note that it is recommended to scale the `buffer_size` and `batch_size` by the estimated maximum batch size in the client request payload to maintain similar ingestion throughput and latency as in [Classic](#classic). +### Metrics Pipeline + +Data Prepper supports metrics ingestion using OTel. It currently supports the following metric types: + +* Guage +* Sum +* Summary +* Histogram + +Other types are not support and Data Prepper will drop these types, including Exponential Histogram and Summary. Additionally, +Data Prepper does not support Scope instrumentation. + +To setup a Metrics pipeline: + +``` +metrics-pipeline: + source: + otel_trace_source: + processor: + - otel_metrics_raw_processor: + sink: + - opensearch: + hosts: ["https://localhost:9200"] + username: admin + password: admin +``` + ## Migrating from Logstash Data Prepper supports Logstash configuration files for a limited set of plugins. Simply use the logstash config to run Data Prepper. From 865b235cc83bd69612e1f94b482e6c6a8a1c8c52 Mon Sep 17 00:00:00 2001 From: Carlos Neto Date: Fri, 13 May 2022 21:01:20 -0300 Subject: [PATCH 41/48] update `order` parameter to `priority` parameter. Signed-off-by: Carlos Neto --- _opensearch/index-templates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_opensearch/index-templates.md b/_opensearch/index-templates.md index 326ad059..743d2a13 100644 --- a/_opensearch/index-templates.md +++ b/_opensearch/index-templates.md @@ -131,7 +131,7 @@ You can create multiple index templates for your indexes. If the index name matc The settings from the more recently created index templates override the settings of older index templates. So, you can first define a few common settings in a generic template that can act as a catch-all and then add more specialized settings as required. -An even better approach is to explicitly specify template priority using the `order` parameter. OpenSearch applies templates with lower priority numbers first and then overrides them with templates with higher priority numbers. +An even better approach is to explicitly specify template priority using the `priority` parameter. OpenSearch applies templates with lower priority numbers first and then overrides them with templates with higher priority numbers. For example, say you have the following two templates that both match the `logs-2020-01-02` index and there’s a conflict in the `number_of_shards` field: From 17c6c4a2a914fe031ff4d1dccb3b3a126d657b2a Mon Sep 17 00:00:00 2001 From: alicejw Date: Mon, 16 May 2022 11:26:21 -0700 Subject: [PATCH 42/48] update old sample names to 'opensearch' instead of 'odfe Signed-off-by: alicejw --- _opensearch/rest-api/cat/cat-allocation.md | 4 +-- _opensearch/rest-api/cat/cat-field-data.md | 4 +-- _opensearch/rest-api/cat/cat-health.md | 2 +- _opensearch/rest-api/cat/cat-master.md | 2 +- _opensearch/rest-api/cat/cat-nodeattrs.md | 2 +- _opensearch/rest-api/cat/cat-nodes.md | 4 +-- _opensearch/rest-api/cat/cat-plugins.md | 40 ++++++++++----------- _opensearch/rest-api/cat/cat-recovery.md | 4 +-- _opensearch/rest-api/cat/cat-shards.md | 4 +-- _opensearch/rest-api/cat/cat-snapshots.md | 4 +-- _opensearch/rest-api/cat/cat-tasks.md | 2 +- _opensearch/rest-api/cat/cat-thread-pool.md | 6 ++-- 12 files changed, 39 insertions(+), 39 deletions(-) diff --git a/_opensearch/rest-api/cat/cat-allocation.md b/_opensearch/rest-api/cat/cat-allocation.md index 6c5c0aa7..02bc8a10 100644 --- a/_opensearch/rest-api/cat/cat-allocation.md +++ b/_opensearch/rest-api/cat/cat-allocation.md @@ -58,6 +58,6 @@ The following response shows that 8 shards are allocated to each the two nodes a ```json shards | disk.indices | disk.used | disk.avail | disk.total | disk.percent host | ip | node - 8 | 989.4kb | 25.9gb | 32.4gb | 58.4gb | 44 172.18.0.4 | 172.18.0.4 | odfe-node1 - 8 | 962.4kb | 25.9gb | 32.4gb | 58.4gb | 44 172.18.0.3 | 172.18.0.3 | odfe-node2 + 8 | 989.4kb | 25.9gb | 32.4gb | 58.4gb | 44 172.18.0.4 | 172.18.0.4 | opensearch-node1 + 8 | 962.4kb | 25.9gb | 32.4gb | 58.4gb | 44 172.18.0.3 | 172.18.0.3 | opensearch-node2 ``` diff --git a/_opensearch/rest-api/cat/cat-field-data.md b/_opensearch/rest-api/cat/cat-field-data.md index d86d17a1..3170ff4e 100644 --- a/_opensearch/rest-api/cat/cat-field-data.md +++ b/_opensearch/rest-api/cat/cat-field-data.md @@ -54,6 +54,6 @@ The following response shows the memory size for all fields as 284 bytes: ```json id host ip node field size -1vo54NuxSxOrbPEYdkSF0w 172.18.0.4 172.18.0.4 odfe-node1 _id 284b -ZaIkkUd4TEiAihqJGkp5CA 172.18.0.3 172.18.0.3 odfe-node2 _id 284b +1vo54NuxSxOrbPEYdkSF0w 172.18.0.4 172.18.0.4 opensearch-node1 _id 284b +ZaIkkUd4TEiAihqJGkp5CA 172.18.0.3 172.18.0.3 opensearch-node2 _id 284b ``` diff --git a/_opensearch/rest-api/cat/cat-health.md b/_opensearch/rest-api/cat/cat-health.md index 476681f8..f261a3f8 100644 --- a/_opensearch/rest-api/cat/cat-health.md +++ b/_opensearch/rest-api/cat/cat-health.md @@ -40,5 +40,5 @@ ts | Boolean | If true, returns HH:MM:SS and Unix epoch timestamps. Default is t GET _cat/health?v&time=5d epoch | timestamp | cluster | status | node.total | node.data | shards | pri | relo | init | unassign | pending_tasks | max_task_wait_time | active_shards_percent -1624248112 | 04:01:52 | odfe-cluster | green | 2 | 2 | 16 | 8 | 0 | 0 | 0 | 0 | - | 100.0% +1624248112 | 04:01:52 | opensearch-cluster | green | 2 | 2 | 16 | 8 | 0 | 0 | 0 | 0 | - | 100.0% ``` diff --git a/_opensearch/rest-api/cat/cat-master.md b/_opensearch/rest-api/cat/cat-master.md index 73ca13d1..7895b39f 100644 --- a/_opensearch/rest-api/cat/cat-master.md +++ b/_opensearch/rest-api/cat/cat-master.md @@ -40,5 +40,5 @@ master_timeout | Time | The amount of time to wait for a connection to the maste ```json id | host | ip | node -ZaIkkUd4TEiAihqJGkp5CA | 172.18.0.3 | 172.18.0.3 | odfe-node2 +ZaIkkUd4TEiAihqJGkp5CA | 172.18.0.3 | 172.18.0.3 | opensearch-node2 ``` diff --git a/_opensearch/rest-api/cat/cat-nodeattrs.md b/_opensearch/rest-api/cat/cat-nodeattrs.md index c06ac527..5f8e488d 100644 --- a/_opensearch/rest-api/cat/cat-nodeattrs.md +++ b/_opensearch/rest-api/cat/cat-nodeattrs.md @@ -41,5 +41,5 @@ master_timeout | Time | The amount of time to wait for a connection to the maste ```json node | host | ip | attr | value -odfe-node2 | 172.18.0.3 | 172.18.0.3 | testattr | test +opensearch-node2 | 172.18.0.3 | 172.18.0.3 | testattr | test ``` diff --git a/_opensearch/rest-api/cat/cat-nodes.md b/_opensearch/rest-api/cat/cat-nodes.md index d2587bc6..a7e308c7 100644 --- a/_opensearch/rest-api/cat/cat-nodes.md +++ b/_opensearch/rest-api/cat/cat-nodes.md @@ -47,6 +47,6 @@ include_unloaded_segments | Boolean | Whether to include information from segmen ```json ip | heap.percent | ram.percent | cpu load_1m | load_5m | load_15m | node.role | master | name -172.18.0.3 | 31 | 97 | 3 | 0.03 | 0.10 | 0.14 dimr | * | odfe-node2 -172.18.0.4 | 45 | 97 | 3 | 0.19 | 0.14 | 0.15 dimr | - | odfe-node1 +172.18.0.3 | 31 | 97 | 3 | 0.03 | 0.10 | 0.14 dimr | * | opensearch-node2 +172.18.0.4 | 45 | 97 | 3 | 0.19 | 0.14 | 0.15 dimr | - | opensearch-node1 ``` diff --git a/_opensearch/rest-api/cat/cat-plugins.md b/_opensearch/rest-api/cat/cat-plugins.md index c4982914..f6e6b16c 100644 --- a/_opensearch/rest-api/cat/cat-plugins.md +++ b/_opensearch/rest-api/cat/cat-plugins.md @@ -41,24 +41,24 @@ master_timeout | Time | The amount of time to wait for a connection to the maste ```json name component version -odfe-node2 opendistro-alerting 1.13.1.0 -odfe-node2 opendistro-anomaly-detection 1.13.0.0 -odfe-node2 opendistro-asynchronous-search 1.13.0.1 -odfe-node2 opendistro-index-management 1.13.2.0 -odfe-node2 opendistro-job-scheduler 1.13.0.0 -odfe-node2 opendistro-knn 1.13.0.0 -odfe-node2 opendistro-performance-analyzer 1.13.0.0 -odfe-node2 opendistro-reports-scheduler 1.13.0.0 -odfe-node2 opendistro-sql 1.13.2.0 -odfe-node2 opendistro_security 1.13.1.0 -odfe-node1 opendistro-alerting 1.13.1.0 -odfe-node1 opendistro-anomaly-detection 1.13.0.0 -odfe-node1 opendistro-asynchronous-search 1.13.0.1 -odfe-node1 opendistro-index-management 1.13.2.0 -odfe-node1 opendistro-job-scheduler 1.13.0.0 -odfe-node1 opendistro-knn 1.13.0.0 -odfe-node1 opendistro-performance-analyzer 1.13.0.0 -odfe-node1 opendistro-reports-scheduler 1.13.0.0 -odfe-node1 opendistro-sql 1.13.2.0 -odfe-node1 opendistro_security 1.13.1.0 +opensearch-node2 opendistro-alerting 1.13.1.0 +opensearch-node2 opendistro-anomaly-detection 1.13.0.0 +opensearch-node2 opendistro-asynchronous-search 1.13.0.1 +opensearch-node2 opendistro-index-management 1.13.2.0 +opensearch-node2 opendistro-job-scheduler 1.13.0.0 +opensearch-node2 opendistro-knn 1.13.0.0 +opensearch-node2 opendistro-performance-analyzer 1.13.0.0 +opensearch-node2 opendistro-reports-scheduler 1.13.0.0 +opensearch-node2 opendistro-sql 1.13.2.0 +opensearch-node2 opendistro_security 1.13.1.0 +opensearch-node1 opendistro-alerting 1.13.1.0 +opensearch-node1 opendistro-anomaly-detection 1.13.0.0 +opensearch-node1 opendistro-asynchronous-search 1.13.0.1 +opensearch-node1 opendistro-index-management 1.13.2.0 +opensearch-node1 opendistro-job-scheduler 1.13.0.0 +opensearch-node1 opendistro-knn 1.13.0.0 +opensearch-node1 opendistro-performance-analyzer 1.13.0.0 +opensearch-node1 opendistro-reports-scheduler 1.13.0.0 +opensearch-node1 opendistro-sql 1.13.2.0 +opensearch-node1 opendistro_security 1.13.1.0 ``` diff --git a/_opensearch/rest-api/cat/cat-recovery.md b/_opensearch/rest-api/cat/cat-recovery.md index 548456c0..2e197c8c 100644 --- a/_opensearch/rest-api/cat/cat-recovery.md +++ b/_opensearch/rest-api/cat/cat-recovery.md @@ -54,6 +54,6 @@ time | Time | Specify the units for time. For example, `5d` or `7h`. For more in ```json index | shard | time | type | stage | source_host | source_node | target_host | target_node | repository | snapshot | files | files_recovered | files_percent | files_total | bytes | bytes_recovered | bytes_percent | bytes_total | translog_ops | translog_ops_recovered | translog_ops_percent -movies | 0 | 117ms | empty_store | done | n/a | n/a | 172.18.0.4 | odfe-node1 | n/a | n/a | 0 | 0 | 0.0% | 0 | 0 | 0 | 0.0% | 0 | 0 | 0 | 100.0% -movies | 0 | 382ms | peer | done | 172.18.0.4 | odfe-node1 | 172.18.0.3 | odfe-node2 | n/a | n/a | 1 | 1 | 100.0% | 1 | 208 | 208 | 100.0% | 208 | 1 | 1 | 100.0% +movies | 0 | 117ms | empty_store | done | n/a | n/a | 172.18.0.4 | opensearch-node1 | n/a | n/a | 0 | 0 | 0.0% | 0 | 0 | 0 | 0.0% | 0 | 0 | 0 | 100.0% +movies | 0 | 382ms | peer | done | 172.18.0.4 | opensearch-node1 | 172.18.0.3 | opensearch-node2 | n/a | n/a | 1 | 1 | 100.0% | 1 | 208 | 208 | 100.0% | 208 | 1 | 1 | 100.0% ``` diff --git a/_opensearch/rest-api/cat/cat-shards.md b/_opensearch/rest-api/cat/cat-shards.md index 00d4b554..8a54172e 100644 --- a/_opensearch/rest-api/cat/cat-shards.md +++ b/_opensearch/rest-api/cat/cat-shards.md @@ -55,6 +55,6 @@ time | Time | Specify the units for time. For example, `5d` or `7h`. For more in ```json index | shard | prirep | state | docs | store | ip | | node -plugins | 0 | p | STARTED | 0 | 208b | 172.18.0.4 | odfe-node1 -plugins | 0 | r | STARTED | 0 | 208b | 172.18.0.3 | odfe-node2 +plugins | 0 | p | STARTED | 0 | 208b | 172.18.0.4 | opensearch-node1 +plugins | 0 | r | STARTED | 0 | 208b | 172.18.0.3 | opensearch-node2 ``` diff --git a/_opensearch/rest-api/cat/cat-snapshots.md b/_opensearch/rest-api/cat/cat-snapshots.md index 71aa30cf..d4cce9fb 100644 --- a/_opensearch/rest-api/cat/cat-snapshots.md +++ b/_opensearch/rest-api/cat/cat-snapshots.md @@ -41,6 +41,6 @@ time | Time | Specify the units for time. For example, `5d` or `7h`. For more in ```json index | shard | prirep | state | docs | store | ip | | node -plugins | 0 | p | STARTED | 0 | 208b | 172.18.0.4 | odfe-node1 -plugins | 0 | r | STARTED | 0 | 208b | 172.18.0.3 | odfe-node2 +plugins | 0 | p | STARTED | 0 | 208b | 172.18.0.4 | opensearch-node1 +plugins | 0 | r | STARTED | 0 | 208b | 172.18.0.3 | opensearch-node2 ``` diff --git a/_opensearch/rest-api/cat/cat-tasks.md b/_opensearch/rest-api/cat/cat-tasks.md index 2d30836b..d8d4aae0 100644 --- a/_opensearch/rest-api/cat/cat-tasks.md +++ b/_opensearch/rest-api/cat/cat-tasks.md @@ -43,5 +43,5 @@ time | Time | Specify the units for time. For example, `5d` or `7h`. For more in ```json action | task_id | parent_task_id | type | start_time | timestamp | running_time | ip | node -cluster:monitor/tasks/lists | 1vo54NuxSxOrbPEYdkSF0w:168062 | - | transport | 1624337809471 | 04:56:49 | 489.5ms | 172.18.0.4 | odfe-node1 +cluster:monitor/tasks/lists | 1vo54NuxSxOrbPEYdkSF0w:168062 | - | transport | 1624337809471 | 04:56:49 | 489.5ms | 172.18.0.4 | opensearch-node1 ``` diff --git a/_opensearch/rest-api/cat/cat-thread-pool.md b/_opensearch/rest-api/cat/cat-thread-pool.md index e15b8e27..f2676140 100644 --- a/_opensearch/rest-api/cat/cat-thread-pool.md +++ b/_opensearch/rest-api/cat/cat-thread-pool.md @@ -47,7 +47,7 @@ master_timeout | Time | The amount of time to wait for a connection to the maste ```json node_name name active queue rejected -odfe-node2 ad-batch-task-threadpool 0 0 0 -odfe-node2 ad-threadpool 0 0 0 -odfe-node2 analyze 0 0 0s +opensearch-node2 ad-batch-task-threadpool 0 0 0 +opensearch-node2 ad-threadpool 0 0 0 +opensearch-node2 analyze 0 0 0s ``` From d601d097d37667cf34e16e19b730db1e408ac727 Mon Sep 17 00:00:00 2001 From: keithhc2 Date: Mon, 16 May 2022 23:54:56 -0700 Subject: [PATCH 43/48] Language tweaks Signed-off-by: keithhc2 --- .../data-prepper/data-prepper-reference.md | 78 ++++++++++--------- _clients/data-prepper/pipelines.md | 15 ++-- 2 files changed, 47 insertions(+), 46 deletions(-) diff --git a/_clients/data-prepper/data-prepper-reference.md b/_clients/data-prepper/data-prepper-reference.md index 1e937c25..dc02f1d2 100644 --- a/_clients/data-prepper/data-prepper-reference.md +++ b/_clients/data-prepper/data-prepper-reference.md @@ -37,23 +37,25 @@ Sources define where your data comes from. Source for the OpenTelemetry Collector. -Option | Required | Type | Description -:--- |:--------------|:--------| :--- -port | No | Integer | The port OTel trace source is running on. Default is `21890`. -request_timeout | No | Integer | The request timeout in milliseconds. Default is `10_000`. -health_check_service | No | Boolean | Enables a gRPC health check service under `grpc.health.v1/Health/Check`. Default is `false`. -proto_reflection_service | No | Boolean | Enables a reflection service for Protobuf services (see [gRPC reflection](https://github.com/grpc/grpc/blob/master/doc/server-reflection.md) and [gRPC Server Reflection Tutorial](https://github.com/grpc/grpc-java/blob/master/documentation/server-reflection-tutorial.md) docs). Default is `false`. -unframed_requests | No | Boolean | Enable requests not framed using the gRPC wire protocol. -thread_count | No | Integer | The number of threads to keep in the ScheduledThreadPool. Default is `200`. -max_connection_count | No | Integer | The maximum allowed number of open connections. Default is `500`. -ssl | No | Boolean | Enables connections to the OTel source port over TLS/SSL. Defaults to `true`. -sslKeyCertChainFile | Conditionally | String | File-system path or AWS S3 path to the security certificate (e.g. `"config/demo-data-prepper.crt"` or `"s3://my-secrets-bucket/demo-data-prepper.crt"`). Required if ssl is set to `true`. -sslKeyFile | Conditionally | String | File-system path or AWS S3 path to the security key (e.g. `"config/demo-data-prepper.key"` or `"s3://my-secrets-bucket/demo-data-prepper.key"`). Required if ssl is set to `true`. -useAcmCertForSSL | No | Boolean | Whether to enable TLS/SSL using certificate and private key from AWS Certificate Manager (ACM). Default is `false`. -acmCertificateArn | Conditionally | String | Represents the ACM certificate ARN. ACM certificate take preference over S3 or local file system certificate. Required if `useAcmCertForSSL` is set to `true`. -awsRegion | Conditionally | String | Represents the AWS region to use ACM or S3. Required if `useAcmCertForSSL` is set to `true` or `sslKeyCertChainFile` and `sslKeyFile` are AWS S3 paths. -authentication | No | Object | An authentication configuration. By default, this creates an unauthenticated server for the pipeline. This uses pluggable authentication for HTTPS. To use basic authentication, define the `http_basic` plugin with a `username` and `password`. To provide customer authentication use or create a plugin which implements: [GrpcAuthenticationProvider](https://github.com/opensearch-project/data-prepper/blob/main/data-prepper-plugins/armeria-common/src/main/java/com/amazon/dataprepper/armeria/authentication/GrpcAuthenticationProvider.java). -record_type | No | String | A string represents the supported record data type that will be written into the buffer plugin. Its value takes either `otlp` or `event`. Default is `otlp`.
  • `otlp`: otel-trace-source will write each incoming ExportTraceServiceRequest as record data type into the buffer.
  • `event`: otel-trace-source will decode each incoming ExportTraceServiceRequest into collection of Data Prepper internal spans serving as buffer items. To achieve better performance in this mode, it is recommended to set the buffer capacity proportional to the estimated number of spans in the incoming request payload.
+Option | Required | Type | Description +:--- |:--- |:--- | :--- +port | No | Integer | The port OTel trace source is running on. Default is `21890`. +request_timeout | No | Integer | The request timeout in milliseconds. Default is `10_000`. +health_check_service | No | Boolean | Enables a gRPC health check service under `grpc.health.v1/Health/Check`. Default is `false`. +proto_reflection_service | No | Boolean | Enables a reflection service for Protobuf services (see [gRPC reflection](https://github.com/grpc/grpc/blob/master/doc/server-reflection.md) and [gRPC Server Reflection Tutorial](https://github.com/grpc/grpc-java/blob/master/documentation/server-reflection-tutorial.md) docs). Default is `false`. +unframed_requests | No | Boolean | Enable requests not framed using the gRPC wire protocol. +thread_count | No | Integer | The number of threads to keep in the ScheduledThreadPool. Default is `200`. +max_connection_count | No | Integer | The maximum allowed number of open connections. Default is `500`. +ssl | No | Boolean | Enables connections to the OTel source port over TLS/SSL. Defaults to `true`. +sslKeyCertChainFile | Conditionally | String | File-system path or AWS S3 path to the security certificate (e.g. `"config/demo-data-prepper.crt"` or `"s3://my-secrets-bucket/demo-data-prepper.crt"`). Required if `ssl` is set to `true`. +sslKeyFile | Conditionally | String | File-system path or AWS S3 path to the security key (e.g. `"config/demo-data-prepper.key"` or `"s3://my-secrets-bucket/demo-data-prepper.key"`). Required if ssl is set to `true`. +useAcmCertForSSL | No | Boolean | Whether to enable TLS/SSL using certificate and private key from AWS Certificate Manager (ACM). Default is `false`. +acmCertificateArn | Conditionally | String | Represents the ACM certificate ARN. ACM certificate take preference over S3 or local file system certificate. Required if `useAcmCertForSSL` is set to `true`. +awsRegion | Conditionally | String | Represents the AWS region to use ACM or S3. Required if `useAcmCertForSSL` is set to `true` or `sslKeyCertChainFile` and `sslKeyFile` are AWS S3 paths. +authentication | No | Object | An authentication configuration. By default, an unauthenticated server is created for the pipeline. This parameter uses pluggable authentication for HTTPS. To use basic authentication, define the `http_basic` plugin with a `username` and `password`. To provide customer authentication, use or create a plugin that implements [GrpcAuthenticationProvider](https://github.com/opensearch-project/data-prepper/blob/main/data-prepper-plugins/armeria-common/src/main/java/com/amazon/dataprepper/armeria/authentication/GrpcAuthenticationProvider.java). +record_type | No | String | A string represents the supported record data type that is written into the buffer plugin. Value options are `otlp` or `event`. Default is `otlp`. +`otlp` | No | String | Otel-trace-source writes each incoming `ExportTraceServiceRequest` request as record data type into the buffer. +`event` | No | String | Otel-trace-source decodes each incoming `ExportTraceServiceRequest` request into a collection of Data Prepper internal spans serving as buffer items. To achieve better performance in this mode, we recommend setting buffer capacity proportional to the estimated number of spans in the incoming request payload. ### http_source @@ -66,28 +68,28 @@ request_timeout | No | Integer | The request timeout in millis. Default is `10_0 thread_count | No | Integer | The number of threads to keep in the ScheduledThreadPool. Default is `200`. max_connection_count | No | Integer | The maximum allowed number of open connections. Default is `500`. max_pending_requests | No | Integer | The maximum number of allowed tasks in ScheduledThreadPool work queue. Default is `1024`. -authentication | No | Object | An authentication configuration. By default, this creates an unauthenticated server for the pipeline. This uses pluggable authentication for HTTPS. To use basic authentication define the `http_basic` plugin with a `username` and `password`. To provide customer authentication use or create a plugin which implements: [ArmeriaHttpAuthenticationProvider](https://github.com/opensearch-project/data-prepper/blob/main/data-prepper-plugins/armeria-common/src/main/java/com/amazon/dataprepper/armeria/authentication/ArmeriaHttpAuthenticationProvider.java). +authentication | No | Object | An authentication configuration. By default, this creates an unauthenticated server for the pipeline. This uses pluggable authentication for HTTPS. To use basic authentication define the `http_basic` plugin with a `username` and `password`. To provide customer authentication, use or create a plugin that implements [ArmeriaHttpAuthenticationProvider](https://github.com/opensearch-project/data-prepper/blob/main/data-prepper-plugins/armeria-common/src/main/java/com/amazon/dataprepper/armeria/authentication/ArmeriaHttpAuthenticationProvider.java). ### otel_metrics_source -Source for the OpenTelemetry Collector for collecting Metric data. +Source for the OpenTelemetry Collector for collecting metric data. -Option | Required | Type | Description -:--- |:--------------|:--------| :--- -port | No | Integer | The port OTel metrics source is running on. Default is `21891`. -request_timeout | No | Integer | The request timeout in milliseconds. Default is `10_000`. -health_check_service | No | Boolean | Enables a gRPC health check service under `grpc.health.v1/Health/Check`. Default is `false`. -proto_reflection_service | No | Boolean | Enables a reflection service for Protobuf services (see [gRPC reflection](https://github.com/grpc/grpc/blob/master/doc/server-reflection.md) and [gRPC Server Reflection Tutorial](https://github.com/grpc/grpc-java/blob/master/documentation/server-reflection-tutorial.md) docs). Default is `false`. -unframed_requests | No | Boolean | Enable requests not framed using the gRPC wire protocol. -thread_count | No | Integer | The number of threads to keep in the ScheduledThreadPool. Default is `200`. -max_connection_count | No | Integer | The maximum allowed number of open connections. Default is `500`. -ssl | No | Boolean | Enables connections to the OTel source port over TLS/SSL. Defaults to `true`. -sslKeyCertChainFile | Conditionally | String | File-system path or AWS S3 path to the security certificate (e.g. `"config/demo-data-prepper.crt"` or `"s3://my-secrets-bucket/demo-data-prepper.crt"`). Required if ssl is set to `true`. -sslKeyFile | Conditionally | String | File-system path or AWS S3 path to the security key (e.g. `"config/demo-data-prepper.key"` or `"s3://my-secrets-bucket/demo-data-prepper.key"`). Required if ssl is set to `true`. -useAcmCertForSSL | No | Boolean | Whether to enable TLS/SSL using certificate and private key from AWS Certificate Manager (ACM). Default is `false`. -acmCertificateArn | Conditionally | String | Represents the ACM certificate ARN. ACM certificate take preference over S3 or local file system certificate. Required if `useAcmCertForSSL` is set to `true`. -awsRegion | Conditionally | String | Represents the AWS region to use ACM or S3. Required if `useAcmCertForSSL` is set to `true` or `sslKeyCertChainFile` and `sslKeyFile` are AWS S3 paths. -authentication | No | Object | An authentication configuration. By default, this creates an unauthenticated server for the pipeline. This uses pluggable authentication for HTTPS. To use basic authentication, define the `http_basic` plugin with a `username` and `password`. To provide customer authentication use or create a plugin which implements: [GrpcAuthenticationProvider](https://github.com/opensearch-project/data-prepper/blob/main/data-prepper-plugins/armeria-common/src/main/java/com/amazon/dataprepper/armeria/authentication/GrpcAuthenticationProvider.java). +Option | Required | Type | Description +:--- |:--- |:--- | :--- +port | No | Integer | The port OTel metrics source is running on. Default is `21891`. +request_timeout | No | Integer | The request timeout in milliseconds. Default is `10_000`. +health_check_service | No | Boolean | Enables a gRPC health check service under `grpc.health.v1/Health/Check`. Default is `false`. +proto_reflection_service | No | Boolean | Enables a reflection service for Protobuf services (see [gRPC reflection](https://github.com/grpc/grpc/blob/master/doc/server-reflection.md) and [gRPC Server Reflection Tutorial](https://github.com/grpc/grpc-java/blob/master/documentation/server-reflection-tutorial.md) docs). Default is `false`. +unframed_requests | No | Boolean | Enable requests not framed using the gRPC wire protocol. +thread_count | No | Integer | The number of threads to keep in the ScheduledThreadPool. Default is `200`. +max_connection_count | No | Integer | The maximum allowed number of open connections. Default is `500`. +ssl | No | Boolean | Enables connections to the OTel source port over TLS/SSL. Defaults to `true`. +sslKeyCertChainFile | Conditionally | String | File-system path or AWS S3 path to the security certificate (e.g. `"config/demo-data-prepper.crt"` or `"s3://my-secrets-bucket/demo-data-prepper.crt"`). Required if ssl is set to `true`. +sslKeyFile | Conditionally | String | File-system path or AWS S3 path to the security key (e.g. `"config/demo-data-prepper.key"` or `"s3://my-secrets-bucket/demo-data-prepper.key"`). Required if ssl is set to `true`. +useAcmCertForSSL | No | Boolean | Whether to enable TLS/SSL using certificate and private key from AWS Certificate Manager (ACM). Default is `false`. +acmCertificateArn | Conditionally | String | Represents the ACM certificate ARN. ACM certificate take preference over S3 or local file system certificate. Required if `useAcmCertForSSL` is set to `true`. +awsRegion | Conditionally | String | Represents the AWS region to use ACM or S3. Required if `useAcmCertForSSL` is set to `true` or `sslKeyCertChainFile` and `sslKeyFile` are AWS S3 paths. +authentication | No | Object | An authentication configuration. By default, an unauthenticated server is created for the pipeline. This uses pluggable authentication for HTTPS. To use basic authentication, define the `http_basic` plugin with a `username` and `password`. To provide customer authentication, use or create a plugin that implements [GrpcAuthenticationProvider](https://github.com/opensearch-project/data-prepper/blob/main/data-prepper-plugins/armeria-common/src/main/java/com/amazon/dataprepper/armeria/authentication/GrpcAuthenticationProvider.java). @@ -148,7 +150,7 @@ trace_flush_interval | No | Integer | Represents the time interval in seconds to ### otel_trace_raw -This processor is a Data Prepper event record type compatible version of `otel_trace_raw_prepper` that fills in trace group related fields into all incoming Data Prepper span records. It requires `record_type` to be set as `event` in `otel_trace_source`. +This processor is a Data Prepper event record type compatible version of `otel_trace_raw_prepper` that fills in trace group related fields into all incoming Data Prepper span records. It requires `record_type` to be set as `event` in `otel_trace_source`. Option | Required | Type | Description :--- | :--- | :--- | :--- @@ -174,7 +176,7 @@ target_port | No | Integer | The destination port to forward requests to. Defaul discovery_mode | No | String | Peer discovery mode to be used. Allowable values are `static`, `dns`, and `aws_cloud_map`. Defaults to `static`. static_endpoints | No | List | List containing string endpoints of all Data Prepper instances. domain_name | No | String | Single domain name to query DNS against. Typically used by creating multiple DNS A Records for the same domain. -ssl | No | Boolean | Indicates whether TLS should be used. Default is true. +ssl | No | Boolean | Indicates whether to use TLS. Default is true. awsCloudMapNamespaceName | Conditionally | String | Name of your CloudMap Namespace. Required if `discovery_mode` is set to `aws_cloud_map`. awsCloudMapServiceName | Conditionally | String | Service name within your CloudMap Namespace. Required if `discovery_mode` is set to `aws_cloud_map`. sslKeyCertChainFile | Conditionally | String | Represents the SSL certificate chain file path or AWS S3 path. S3 path example `s3:///`. Required if `ssl` is set to `true`. @@ -202,7 +204,7 @@ group_duration | No | String | The amount of time that a group should exist befo ### date -Adds a default timestamp to the event or parses timestamp fields, and converts it to ISO 8601 format which can be used as event timestamp. +Adds a default timestamp to the event or parses timestamp fields, and converts it to ISO 8601 format, which can be used as event timestamp. Option | Required | Type | Description :--- | :--- | :--- | :--- diff --git a/_clients/data-prepper/pipelines.md b/_clients/data-prepper/pipelines.md index 3f00afb6..167d870f 100644 --- a/_clients/data-prepper/pipelines.md +++ b/_clients/data-prepper/pipelines.md @@ -71,7 +71,7 @@ log-pipeline: This example uses weak security. We strongly recommend securing all plugins which open external ports in production environments. {: .note} -### Trace Analytics pipeline +### Trace analytics pipeline The following example demonstrates how to build a pipeline that supports the [Trace Analytics OpenSearch Dashboards plugin]({{site.url}}{{site.baseurl}}/observability-plugin/trace/ta-dashboards/). This pipeline takes data from the OpenTelemetry Collector and uses two other pipelines as sinks. These two separate pipelines index trace and the service map documents for the dashboard plugin. @@ -121,7 +121,7 @@ service-map-pipeline: #### Event record type -Starting from Data Prepper 1.4, we support event record type in trace analytics pipeline source, buffer and processors. +Starting from Data Prepper 1.4, Data Prepper supports event record type in trace analytics pipeline source, buffer, and processors. ```yml entry-pipeline: @@ -176,9 +176,9 @@ service-map-pipeline: trace_analytics_service_map: true ``` -Note that it is recommended to scale the `buffer_size` and `batch_size` by the estimated maximum batch size in the client request payload to maintain similar ingestion throughput and latency as in [Classic](#classic). +Note that it is recommended to scale the `buffer_size` and `batch_size` by the estimated maximum batch size in the client request payload to maintain similar ingestion throughput and latency as in [Classic](#classic). -### Metrics Pipeline +### Metrics pipeline Data Prepper supports metrics ingestion using OTel. It currently supports the following metric types: @@ -187,12 +187,11 @@ Data Prepper supports metrics ingestion using OTel. It currently supports the fo * Summary * Histogram -Other types are not support and Data Prepper will drop these types, including Exponential Histogram and Summary. Additionally, -Data Prepper does not support Scope instrumentation. +Other types are not supported. Data Prepper drops all other types, including Exponential Histogram and Summary. Additionally, Data Prepper does not support Scope instrumentation. -To setup a Metrics pipeline: +To set up a metrics pipeline: -``` +```yml metrics-pipeline: source: otel_trace_source: From 28b3503be3c927bf3d9f148068547808d1caf7c8 Mon Sep 17 00:00:00 2001 From: keithhc2 Date: Mon, 16 May 2022 23:57:10 -0700 Subject: [PATCH 44/48] Style fixes Signed-off-by: keithhc2 --- _clients/data-prepper/data-prepper-reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_clients/data-prepper/data-prepper-reference.md b/_clients/data-prepper/data-prepper-reference.md index dc02f1d2..12fb5c18 100644 --- a/_clients/data-prepper/data-prepper-reference.md +++ b/_clients/data-prepper/data-prepper-reference.md @@ -75,7 +75,7 @@ authentication | No | Object | An authentication configuration. By default, this Source for the OpenTelemetry Collector for collecting metric data. Option | Required | Type | Description -:--- |:--- |:--- | :--- +:--- | :--- | :--- | :--- port | No | Integer | The port OTel metrics source is running on. Default is `21891`. request_timeout | No | Integer | The request timeout in milliseconds. Default is `10_000`. health_check_service | No | Boolean | Enables a gRPC health check service under `grpc.health.v1/Health/Check`. Default is `false`. From 0074bc3a2694440cf7c1145c0a543fb021353927 Mon Sep 17 00:00:00 2001 From: Victor Nilsson Date: Tue, 17 May 2022 14:55:11 +0200 Subject: [PATCH 45/48] Fixed the data-prepper URI Signed-off-by: Victor Nilsson --- _clients/data-prepper/get-started.md | 2 +- _clients/data-prepper/pipelines.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/_clients/data-prepper/get-started.md b/_clients/data-prepper/get-started.md index 11ef4ea9..3d00fb4a 100644 --- a/_clients/data-prepper/get-started.md +++ b/_clients/data-prepper/get-started.md @@ -38,7 +38,7 @@ Run the following command with your pipeline configuration YAML. ```bash docker run --name data-prepper \ -v /full/path/to/pipelines.yaml:/usr/share/data-prepper/pipelines.yaml \ - opensearchproject/opensearch-data-prepper:latest + opensearchproject/data-prepper:latest ``` This sample pipeline configuration above demonstrates a simple pipeline with a source (`random`) sending data to a sink (`stdout`). For more examples and details on more advanced pipeline configurations, see [Pipelines]({{site.url}}{{site.baseurl}}/clients/data-prepper/pipelines). diff --git a/_clients/data-prepper/pipelines.md b/_clients/data-prepper/pipelines.md index b664d98a..f0f1ce30 100644 --- a/_clients/data-prepper/pipelines.md +++ b/_clients/data-prepper/pipelines.md @@ -122,7 +122,7 @@ Data Prepper supports Logstash configuration files for a limited set of plugins. ```bash docker run --name data-prepper \ -v /full/path/to/logstash.conf:/usr/share/data-prepper/pipelines.conf \ - opensearchproject/opensearch-data-prepper:latest + opensearchproject/data-prepper:latest ``` This feature is limited by feature parity of Data Prepper. As of Data Prepper 1.2 release, the following plugins from the Logstash configuration are supported: @@ -149,5 +149,5 @@ To configure the Data Prepper server, run Data Prepper with the additional yaml ```bash docker run --name data-prepper -v /full/path/to/pipelines.yaml:/usr/share/data-prepper/pipelines.yaml \ /full/path/to/data-prepper-config.yaml:/usr/share/data-prepper/data-prepper-config.yaml \ - opensearchproject/opensearch-data-prepper:latest + opensearchproject/data-prepper:latest ```` From 9ec7e253ce08b3c2fd0f0b601ae2cad7b9a3805d Mon Sep 17 00:00:00 2001 From: alicejw Date: Tue, 17 May 2022 09:58:41 -0700 Subject: [PATCH 46/48] for a few editor's changes that did not get added to previous PR before it was merged Signed-off-by: alicejw --- _opensearch/query-dsl/index.md | 4 ++-- _opensearch/query-dsl/term.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/_opensearch/query-dsl/index.md b/_opensearch/query-dsl/index.md index aef51ea3..3b6dd4e0 100644 --- a/_opensearch/query-dsl/index.md +++ b/_opensearch/query-dsl/index.md @@ -32,11 +32,11 @@ The following table describes the differences between them. OpenSearch uses a probabilistic ranking framework called Okapi BM25 to calculate relevance scores. To learn more about Okapi BM25, see [Wikipedia](https://en.wikipedia.org/wiki/Okapi_BM25). {: .note } -To show the difference between a simple HTTP search versus a search via query DSL, we have an example of each one so that you can see how they differ. +The following examples show the difference between a simple HTTP search and a search with query DSL. ## Example: HTTP simple search -The following request performs a simple search to search for a `speaker` field that has a value of `queen`. +The following request performs a simple search for a `speaker` field that has a value of `queen`. **Sample request** ```json diff --git a/_opensearch/query-dsl/term.md b/_opensearch/query-dsl/term.md index d24416a1..f0e47ba5 100644 --- a/_opensearch/query-dsl/term.md +++ b/_opensearch/query-dsl/term.md @@ -216,7 +216,7 @@ The search query “HAMLET” is also searched literally. So, to get a match on # Term-level query operations -This section provides examples for term-level query operations that you can use for specific search use cases. +This section provides examples of term-level query operations that you can use for specific search use cases. ## Single term @@ -238,7 +238,7 @@ GET shakespeare/_search ## Multiple terms -Use the `terms` operation to search for multiple values for same query field. +Use the `terms` operation to search for multiple value matches for the same query field. ```json GET shakespeare/_search From bb7320bb7db381b612895e318d9afc2990eea707 Mon Sep 17 00:00:00 2001 From: keithhc2 Date: Tue, 17 May 2022 12:47:45 -0700 Subject: [PATCH 47/48] Addressed comments Signed-off-by: keithhc2 --- _clients/data-prepper/data-prepper-reference.md | 16 ++++++++-------- _clients/data-prepper/pipelines.md | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/_clients/data-prepper/data-prepper-reference.md b/_clients/data-prepper/data-prepper-reference.md index 12fb5c18..6cc5fb09 100644 --- a/_clients/data-prepper/data-prepper-reference.md +++ b/_clients/data-prepper/data-prepper-reference.md @@ -14,7 +14,7 @@ This page lists all supported Data Prepper server, sources, buffers, processors, Option | Required | Type | Description :--- | :--- | :--- | :--- ssl | No | Boolean | Indicates whether TLS should be used for server APIs. Defaults to true. -keyStoreFilePath | No | String | Path to a .jks or .p12 keystore file. Required if ssl is true. +keyStoreFilePath | No | String | Path to a .jks or .p12 keystore file. Required if `ssl` is true. keyStorePassword | No | String | Password for keystore. Optional, defaults to empty string. privateKeyPassword | No | String | Password for private key within keystore. Optional, defaults to empty string. serverPort | No | Integer | Port number to use for server APIs. Defaults to 4900 @@ -38,7 +38,7 @@ Sources define where your data comes from. Source for the OpenTelemetry Collector. Option | Required | Type | Description -:--- |:--- |:--- | :--- +:--- | :--- | :--- | :--- port | No | Integer | The port OTel trace source is running on. Default is `21890`. request_timeout | No | Integer | The request timeout in milliseconds. Default is `10_000`. health_check_service | No | Boolean | Enables a gRPC health check service under `grpc.health.v1/Health/Check`. Default is `false`. @@ -48,7 +48,7 @@ thread_count | No | Integer | The number of threads to keep in the ScheduledThre max_connection_count | No | Integer | The maximum allowed number of open connections. Default is `500`. ssl | No | Boolean | Enables connections to the OTel source port over TLS/SSL. Defaults to `true`. sslKeyCertChainFile | Conditionally | String | File-system path or AWS S3 path to the security certificate (e.g. `"config/demo-data-prepper.crt"` or `"s3://my-secrets-bucket/demo-data-prepper.crt"`). Required if `ssl` is set to `true`. -sslKeyFile | Conditionally | String | File-system path or AWS S3 path to the security key (e.g. `"config/demo-data-prepper.key"` or `"s3://my-secrets-bucket/demo-data-prepper.key"`). Required if ssl is set to `true`. +sslKeyFile | Conditionally | String | File-system path or AWS S3 path to the security key (e.g. `"config/demo-data-prepper.key"` or `"s3://my-secrets-bucket/demo-data-prepper.key"`). Required if `ssl` is set to `true`. useAcmCertForSSL | No | Boolean | Whether to enable TLS/SSL using certificate and private key from AWS Certificate Manager (ACM). Default is `false`. acmCertificateArn | Conditionally | String | Represents the ACM certificate ARN. ACM certificate take preference over S3 or local file system certificate. Required if `useAcmCertForSSL` is set to `true`. awsRegion | Conditionally | String | Represents the AWS region to use ACM or S3. Required if `useAcmCertForSSL` is set to `true` or `sslKeyCertChainFile` and `sslKeyFile` are AWS S3 paths. @@ -84,11 +84,11 @@ unframed_requests | No | Boolean | Enable requests not framed using the gRPC wir thread_count | No | Integer | The number of threads to keep in the ScheduledThreadPool. Default is `200`. max_connection_count | No | Integer | The maximum allowed number of open connections. Default is `500`. ssl | No | Boolean | Enables connections to the OTel source port over TLS/SSL. Defaults to `true`. -sslKeyCertChainFile | Conditionally | String | File-system path or AWS S3 path to the security certificate (e.g. `"config/demo-data-prepper.crt"` or `"s3://my-secrets-bucket/demo-data-prepper.crt"`). Required if ssl is set to `true`. -sslKeyFile | Conditionally | String | File-system path or AWS S3 path to the security key (e.g. `"config/demo-data-prepper.key"` or `"s3://my-secrets-bucket/demo-data-prepper.key"`). Required if ssl is set to `true`. +sslKeyCertChainFile | Conditionally | String | File-system path or AWS S3 path to the security certificate (e.g. `"config/demo-data-prepper.crt"` or `"s3://my-secrets-bucket/demo-data-prepper.crt"`). Required if `ssl` is set to `true`. +sslKeyFile | Conditionally | String | File-system path or AWS S3 path to the security key (e.g. `"config/demo-data-prepper.key"` or `"s3://my-secrets-bucket/demo-data-prepper.key"`). Required if `ssl` is set to `true`. useAcmCertForSSL | No | Boolean | Whether to enable TLS/SSL using certificate and private key from AWS Certificate Manager (ACM). Default is `false`. -acmCertificateArn | Conditionally | String | Represents the ACM certificate ARN. ACM certificate take preference over S3 or local file system certificate. Required if `useAcmCertForSSL` is set to `true`. -awsRegion | Conditionally | String | Represents the AWS region to use ACM or S3. Required if `useAcmCertForSSL` is set to `true` or `sslKeyCertChainFile` and `sslKeyFile` are AWS S3 paths. +acmCertificateArn | Conditionally | String | Represents the ACM certificate ARN. ACM certificate take preference over S3 or local file system certificates. Required if `useAcmCertForSSL` is set to `true`. +awsRegion | Conditionally | String | Represents the AWS Region to use ACM or S3. Required if `useAcmCertForSSL` is set to `true` or `sslKeyCertChainFile` and `sslKeyFile` are AWS S3 paths. authentication | No | Object | An authentication configuration. By default, an unauthenticated server is created for the pipeline. This uses pluggable authentication for HTTPS. To use basic authentication, define the `http_basic` plugin with a `username` and `password`. To provide customer authentication, use or create a plugin that implements [GrpcAuthenticationProvider](https://github.com/opensearch-project/data-prepper/blob/main/data-prepper-plugins/armeria-common/src/main/java/com/amazon/dataprepper/armeria/authentication/GrpcAuthenticationProvider.java). @@ -181,7 +181,7 @@ awsCloudMapNamespaceName | Conditionally | String | Name of your CloudMap Namesp awsCloudMapServiceName | Conditionally | String | Service name within your CloudMap Namespace. Required if `discovery_mode` is set to `aws_cloud_map`. sslKeyCertChainFile | Conditionally | String | Represents the SSL certificate chain file path or AWS S3 path. S3 path example `s3:///`. Required if `ssl` is set to `true`. useAcmCertForSSL | No | Boolean | Enables TLS/SSL using certificate and private key from AWS Certificate Manager (ACM). Default is `false`. -awsRegion | Conditionally | String | Represents the AWS region to use ACM, S3, or CloudMap. Required if `useAcmCertForSSL` is set to `true` or `sslKeyCertChainFile` and `sslKeyFile` are AWS S3 paths. +awsRegion | Conditionally | String | Represents the AWS Region to use ACM, S3, or CloudMap. Required if `useAcmCertForSSL` is set to `true` or `sslKeyCertChainFile` and `sslKeyFile` are AWS S3 paths. acmCertificateArn | Conditionally | String | Represents the ACM certificate ARN. ACM certificate take preference over S3 or local file system certificate. Required if `useAcmCertForSSL` is set to `true`. ### string_converter diff --git a/_clients/data-prepper/pipelines.md b/_clients/data-prepper/pipelines.md index 167d870f..6f4a64a4 100644 --- a/_clients/data-prepper/pipelines.md +++ b/_clients/data-prepper/pipelines.md @@ -182,7 +182,7 @@ Note that it is recommended to scale the `buffer_size` and `batch_size` by the e Data Prepper supports metrics ingestion using OTel. It currently supports the following metric types: -* Guage +* Gauge * Sum * Summary * Histogram From 2bbe6d092a9f6c8617825f490467364844718850 Mon Sep 17 00:00:00 2001 From: alicejw Date: Wed, 18 May 2022 11:08:41 -0700 Subject: [PATCH 48/48] resolve conflicts Signed-off-by: alicejw --- _opensearch/rest-api/cat/cat-cluster_manager.md | 2 +- _opensearch/rest-api/cat/cat-nodes.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/_opensearch/rest-api/cat/cat-cluster_manager.md b/_opensearch/rest-api/cat/cat-cluster_manager.md index fb6850ac..bb18f608 100644 --- a/_opensearch/rest-api/cat/cat-cluster_manager.md +++ b/_opensearch/rest-api/cat/cat-cluster_manager.md @@ -40,5 +40,5 @@ cluster_manager_timeout | Time | The amount of time to wait for a connection to ```json id | host | ip | node -ZaIkkUd4TEiAihqJGkp5CA | 172.18.0.3 | 172.18.0.3 | odfe-node2 +ZaIkkUd4TEiAihqJGkp5CA | 172.18.0.3 | 172.18.0.3 | opensearch-node2 ``` diff --git a/_opensearch/rest-api/cat/cat-nodes.md b/_opensearch/rest-api/cat/cat-nodes.md index a2f05c36..f12a5a37 100644 --- a/_opensearch/rest-api/cat/cat-nodes.md +++ b/_opensearch/rest-api/cat/cat-nodes.md @@ -47,6 +47,6 @@ include_unloaded_segments | Boolean | Whether to include information from segmen ```json ip | heap.percent | ram.percent | cpu load_1m | load_5m | load_15m | node.role | cluster_manager | name -172.18.0.3 | 31 | 97 | 3 | 0.03 | 0.10 | 0.14 dimr | * | odfe-node2 -172.18.0.4 | 45 | 97 | 3 | 0.19 | 0.14 | 0.15 dimr | - | odfe-node1 +172.18.0.3 | 31 | 97 | 3 | 0.03 | 0.10 | 0.14 dimr | * | opensearch-node2 +172.18.0.4 | 45 | 97 | 3 | 0.19 | 0.14 | 0.15 dimr | - | opensearch-node1 ```