From 6e55472ca3747b48b21aa4294b57bad38d366a2f Mon Sep 17 00:00:00 2001 From: Marci W <333176+marciw@users.noreply.github.com> Date: Fri, 7 Mar 2025 08:37:23 -0500 Subject: [PATCH] [docs] Migrate docs from AsciiDoc to Markdown (#2582) (#2596) * delete asciidoc files * add migrated files --------- Co-authored-by: Marci W <333176+marciw@users.noreply.github.com> (cherry picked from commit 7aedc17771e71315d50ad808160f3a7a82200bcf) Co-authored-by: Colleen McGinnis <colleen.j.mcginnis@gmail.com> --- docs/basic-config.asciidoc | 37 -- docs/config.asciidoc | 9 - docs/docset.yml | 490 ++++++++++++++++++ docs/dsl.asciidoc | 6 - docs/ecs.asciidoc | 34 -- docs/examples/apm/screenshot.jpg | Bin 324480 -> 0 bytes docs/getting-started.asciidoc | 141 ----- docs/helpers/index.asciidoc | 10 - docs/index.asciidoc | 32 -- docs/installation.asciidoc | 61 --- docs/integrations.asciidoc | 30 -- docs/open-telemetry.asciidoc | 94 ---- docs/overview.asciidoc | 38 -- docs/rails.asciidoc | 24 - .../Helpers.md} | 131 +++-- .../activemodel_activerecord.md} | 51 +- .../advanced-config.md} | 199 +++---- docs/{api.asciidoc => reference/api.md} | 104 ++-- docs/reference/basic-config.md | 37 ++ docs/reference/client-helpers.md | 14 + docs/reference/configuration.md | 14 + .../connecting.md} | 209 ++++---- docs/reference/dsl.md | 11 + docs/reference/ecs.md | 37 ++ .../esql.asciidoc => reference/esql.md} | 78 ++- .../examples.md} | 96 ++-- docs/reference/getting-started.md | 125 +++++ docs/reference/index.md | 40 ++ docs/reference/installation.md | 44 ++ docs/reference/integrations.md | 26 + docs/reference/opentelemetry.md | 97 ++++ .../persistence.md} | 78 ++- docs/reference/ruby_on_rails.md | 23 + docs/reference/toc.yml | 24 + .../transport.md} | 169 +++--- docs/release-notes/breaking-changes.md | 28 + docs/release-notes/deprecations.md | 28 + docs/release-notes/index.md | 27 + docs/release-notes/known-issues.md | 20 + docs/release-notes/toc.yml | 5 + docs/release_notes/70.asciidoc | 195 ------- docs/release_notes/710.asciidoc | 62 --- docs/release_notes/711.asciidoc | 49 -- docs/release_notes/712.asciidoc | 28 - docs/release_notes/713.asciidoc | 53 -- docs/release_notes/714.asciidoc | 93 ---- docs/release_notes/715.asciidoc | 20 - docs/release_notes/716.asciidoc | 96 ---- docs/release_notes/717.asciidoc | 29 -- docs/release_notes/75.asciidoc | 59 --- docs/release_notes/76.asciidoc | 86 --- docs/release_notes/77.asciidoc | 77 --- docs/release_notes/78.asciidoc | 103 ---- docs/release_notes/79.asciidoc | 60 --- docs/release_notes/80.asciidoc | 74 --- docs/release_notes/81.asciidoc | 55 -- docs/release_notes/810.asciidoc | 51 -- docs/release_notes/811.asciidoc | 24 - docs/release_notes/812.asciidoc | 65 --- docs/release_notes/813.asciidoc | 76 --- docs/release_notes/814.asciidoc | 52 -- docs/release_notes/815.asciidoc | 99 ---- docs/release_notes/816.asciidoc | 57 -- docs/release_notes/817.asciidoc | 20 - docs/release_notes/82.asciidoc | 49 -- docs/release_notes/83.asciidoc | 33 -- docs/release_notes/84.asciidoc | 31 -- docs/release_notes/85.asciidoc | 105 ---- docs/release_notes/86.asciidoc | 23 - docs/release_notes/87.asciidoc | 35 -- docs/release_notes/88.asciidoc | 47 -- docs/release_notes/89.asciidoc | 54 -- docs/release_notes/index.asciidoc | 74 --- docs/troubleshooting.asciidoc | 97 ---- 74 files changed, 1552 insertions(+), 3300 deletions(-) delete mode 100644 docs/basic-config.asciidoc delete mode 100644 docs/config.asciidoc create mode 100644 docs/docset.yml delete mode 100644 docs/dsl.asciidoc delete mode 100644 docs/ecs.asciidoc delete mode 100644 docs/examples/apm/screenshot.jpg delete mode 100644 docs/getting-started.asciidoc delete mode 100644 docs/helpers/index.asciidoc delete mode 100644 docs/index.asciidoc delete mode 100644 docs/installation.asciidoc delete mode 100644 docs/integrations.asciidoc delete mode 100644 docs/open-telemetry.asciidoc delete mode 100644 docs/overview.asciidoc delete mode 100644 docs/rails.asciidoc rename docs/{helpers/bulk-scroll.asciidoc => reference/Helpers.md} (78%) rename docs/{model.asciidoc => reference/activemodel_activerecord.md} (55%) rename docs/{advanced-config.asciidoc => reference/advanced-config.md} (55%) rename docs/{api.asciidoc => reference/api.md} (68%) create mode 100644 docs/reference/basic-config.md create mode 100644 docs/reference/client-helpers.md create mode 100644 docs/reference/configuration.md rename docs/{connecting.asciidoc => reference/connecting.md} (57%) create mode 100644 docs/reference/dsl.md create mode 100644 docs/reference/ecs.md rename docs/{helpers/esql.asciidoc => reference/esql.md} (72%) rename docs/{examples.asciidoc => reference/examples.md} (82%) create mode 100644 docs/reference/getting-started.md create mode 100644 docs/reference/index.md create mode 100644 docs/reference/installation.md create mode 100644 docs/reference/integrations.md create mode 100644 docs/reference/opentelemetry.md rename docs/{persistence.asciidoc => reference/persistence.md} (56%) create mode 100644 docs/reference/ruby_on_rails.md create mode 100644 docs/reference/toc.yml rename docs/{transport.asciidoc => reference/transport.md} (57%) create mode 100644 docs/release-notes/breaking-changes.md create mode 100644 docs/release-notes/deprecations.md create mode 100644 docs/release-notes/index.md create mode 100644 docs/release-notes/known-issues.md create mode 100644 docs/release-notes/toc.yml delete mode 100644 docs/release_notes/70.asciidoc delete mode 100644 docs/release_notes/710.asciidoc delete mode 100644 docs/release_notes/711.asciidoc delete mode 100644 docs/release_notes/712.asciidoc delete mode 100644 docs/release_notes/713.asciidoc delete mode 100644 docs/release_notes/714.asciidoc delete mode 100644 docs/release_notes/715.asciidoc delete mode 100644 docs/release_notes/716.asciidoc delete mode 100644 docs/release_notes/717.asciidoc delete mode 100644 docs/release_notes/75.asciidoc delete mode 100644 docs/release_notes/76.asciidoc delete mode 100644 docs/release_notes/77.asciidoc delete mode 100644 docs/release_notes/78.asciidoc delete mode 100644 docs/release_notes/79.asciidoc delete mode 100644 docs/release_notes/80.asciidoc delete mode 100644 docs/release_notes/81.asciidoc delete mode 100644 docs/release_notes/810.asciidoc delete mode 100644 docs/release_notes/811.asciidoc delete mode 100644 docs/release_notes/812.asciidoc delete mode 100644 docs/release_notes/813.asciidoc delete mode 100644 docs/release_notes/814.asciidoc delete mode 100644 docs/release_notes/815.asciidoc delete mode 100644 docs/release_notes/816.asciidoc delete mode 100644 docs/release_notes/817.asciidoc delete mode 100644 docs/release_notes/82.asciidoc delete mode 100644 docs/release_notes/83.asciidoc delete mode 100644 docs/release_notes/84.asciidoc delete mode 100644 docs/release_notes/85.asciidoc delete mode 100644 docs/release_notes/86.asciidoc delete mode 100644 docs/release_notes/87.asciidoc delete mode 100644 docs/release_notes/88.asciidoc delete mode 100644 docs/release_notes/89.asciidoc delete mode 100644 docs/release_notes/index.asciidoc delete mode 100644 docs/troubleshooting.asciidoc diff --git a/docs/basic-config.asciidoc b/docs/basic-config.asciidoc deleted file mode 100644 index d0edd7ec76..0000000000 --- a/docs/basic-config.asciidoc +++ /dev/null @@ -1,37 +0,0 @@ -[[basic-config]] -=== Basic configuration - -The table below contains the most important initialization parameters that you -can use. - - -[cols="<,<,<"] -|=== - -| **Parameter** | **Data type** | **Description** -| `adapter` | Symbol | A specific adapter for Faraday (for example, `:patron`). -| `api_key` | String, Hash | For API key Authentication. Either the base64 encoding of `id` and `api_key` joined by a colon as a string, or a hash with the `id` and `api_key` values. -| `compression` | Boolean | Whether to compress requests. Gzip compression is used. Defaults to `false`. Responses are automatically inflated if they are compressed. If a custom transport object is used, it must handle the request compression and response inflation. -| `enable_meta_header` | Boolean | Whether to enable sending the meta data header to Cloud. Defaults to `true`. -| `hosts` | String, Array | Single host passed as a string or hash, or multiple hosts passed as an array; `host` or `url` keys are also valid. -| `log` | Boolean | Whether to use the default logger. Disabled by default. -| `logger` | Object | An instance of a Logger-compatible object. -| `opaque_id_prefix` | String | Sets a prefix for X-Opaque-Id when initializing the client. This is prepended to the id you set before each request if you're using X-Opaque-Id. -| `opentelemetry_tracer_provider` | `OpenTelemetry::Trace::TracerProvider` | An explicit TracerProvider to use instead of the global one with OpenTelemetry. This enables better dependency injection and simplifies testing. -| `randomize_hosts` | Boolean | Whether to shuffle connections on initialization and reload. Defaults to `false`. -| `reload_connections` | Boolean, Number | Whether to reload connections after X requests. Defaults to `false`. -| `reload_on_failure` | Boolean | Whether to reload connections after failure. Defaults to `false`. -| `request_timeout` | Integer | The request timeout to be passed to transport in options. -| `resurrect_after` | Integer | Specifies after how many seconds a dead connection should be tried again. -| `retry_on_failure` | Boolean, Number | Whether to retry X times when request fails before raising and exception. Defaults to `false`. -| `retry_on_status` | Array, Number | Specifies which status code needs to be returned to retry. -| `selector` | Constant | An instance of selector strategy implemented with {Elastic::Transport::Transport::Connections::Selector::Base}. -| `send_get_body_as` | String | Specifies the HTTP method to use for GET requests with a body. Defaults to `GET`. -| `serializer_class` | Constant | Specifies a serializer class to use. It is initialized by the transport and passed the transport instance. -| `sniffer_timeout` | Integer | Specifies the timeout for reloading connections in seconds. Defaults to `1`. -| `trace` | Boolean | Whether to use the default tracer. Disabled by default. -| `tracer` | Object | Specifies an instance of a Logger-compatible object. -| `transport` | Object | Specifies a transport instance. -| `transport_class` | Constant | Specifies a transport class to use. It is initialized by the client and passed hosts and all arguments. -| `transport_options` | Hash | Specifies the options to be passed to the `Faraday::Connection` constructor. -|=== diff --git a/docs/config.asciidoc b/docs/config.asciidoc deleted file mode 100644 index c9897f8313..0000000000 --- a/docs/config.asciidoc +++ /dev/null @@ -1,9 +0,0 @@ -[[ruby-config]] -== Configuration - -This page contains information about how to configure the Ruby client tailored -to your needs. Almost every aspect of the client is configurable. However, in -most cases you only need to set a couple of parameters. - -* <<basic-config>> -* <<advanced-config>> \ No newline at end of file diff --git a/docs/docset.yml b/docs/docset.yml new file mode 100644 index 0000000000..fb1b1471b7 --- /dev/null +++ b/docs/docset.yml @@ -0,0 +1,490 @@ +project: 'Ruby client' +exclude: + - examples/** +cross_links: + - docs-content + - ecs + - ecs-logging-ruby +toc: + - toc: reference + - toc: release-notes +subs: + ref: "https://www.elastic.co/guide/en/elasticsearch/reference/current" + ref-bare: "https://www.elastic.co/guide/en/elasticsearch/reference" + ref-8x: "https://www.elastic.co/guide/en/elasticsearch/reference/8.1" + ref-80: "https://www.elastic.co/guide/en/elasticsearch/reference/8.0" + ref-7x: "https://www.elastic.co/guide/en/elasticsearch/reference/7.17" + ref-70: "https://www.elastic.co/guide/en/elasticsearch/reference/7.0" + ref-60: "https://www.elastic.co/guide/en/elasticsearch/reference/6.0" + ref-64: "https://www.elastic.co/guide/en/elasticsearch/reference/6.4" + xpack-ref: "https://www.elastic.co/guide/en/x-pack/6.2" + logstash-ref: "https://www.elastic.co/guide/en/logstash/current" + kibana-ref: "https://www.elastic.co/guide/en/kibana/current" + kibana-ref-all: "https://www.elastic.co/guide/en/kibana" + beats-ref-root: "https://www.elastic.co/guide/en/beats" + beats-ref: "https://www.elastic.co/guide/en/beats/libbeat/current" + beats-ref-60: "https://www.elastic.co/guide/en/beats/libbeat/6.0" + beats-ref-63: "https://www.elastic.co/guide/en/beats/libbeat/6.3" + beats-devguide: "https://www.elastic.co/guide/en/beats/devguide/current" + auditbeat-ref: "https://www.elastic.co/guide/en/beats/auditbeat/current" + packetbeat-ref: "https://www.elastic.co/guide/en/beats/packetbeat/current" + metricbeat-ref: "https://www.elastic.co/guide/en/beats/metricbeat/current" + filebeat-ref: "https://www.elastic.co/guide/en/beats/filebeat/current" + functionbeat-ref: "https://www.elastic.co/guide/en/beats/functionbeat/current" + winlogbeat-ref: "https://www.elastic.co/guide/en/beats/winlogbeat/current" + heartbeat-ref: "https://www.elastic.co/guide/en/beats/heartbeat/current" + journalbeat-ref: "https://www.elastic.co/guide/en/beats/journalbeat/current" + ingest-guide: "https://www.elastic.co/guide/en/ingest/current" + fleet-guide: "https://www.elastic.co/guide/en/fleet/current" + apm-guide-ref: "https://www.elastic.co/guide/en/apm/guide/current" + apm-guide-7x: "https://www.elastic.co/guide/en/apm/guide/7.17" + apm-app-ref: "https://www.elastic.co/guide/en/kibana/current" + apm-agents-ref: "https://www.elastic.co/guide/en/apm/agent" + apm-android-ref: "https://www.elastic.co/guide/en/apm/agent/android/current" + apm-py-ref: "https://www.elastic.co/guide/en/apm/agent/python/current" + apm-py-ref-3x: "https://www.elastic.co/guide/en/apm/agent/python/3.x" + apm-node-ref-index: "https://www.elastic.co/guide/en/apm/agent/nodejs" + apm-node-ref: "https://www.elastic.co/guide/en/apm/agent/nodejs/current" + apm-node-ref-1x: "https://www.elastic.co/guide/en/apm/agent/nodejs/1.x" + apm-rum-ref: "https://www.elastic.co/guide/en/apm/agent/rum-js/current" + apm-ruby-ref: "https://www.elastic.co/guide/en/apm/agent/ruby/current" + apm-java-ref: "https://www.elastic.co/guide/en/apm/agent/java/current" + apm-go-ref: "https://www.elastic.co/guide/en/apm/agent/go/current" + apm-dotnet-ref: "https://www.elastic.co/guide/en/apm/agent/dotnet/current" + apm-php-ref: "https://www.elastic.co/guide/en/apm/agent/php/current" + apm-ios-ref: "https://www.elastic.co/guide/en/apm/agent/swift/current" + apm-lambda-ref: "https://www.elastic.co/guide/en/apm/lambda/current" + apm-attacher-ref: "https://www.elastic.co/guide/en/apm/attacher/current" + docker-logging-ref: "https://www.elastic.co/guide/en/beats/loggingplugin/current" + esf-ref: "https://www.elastic.co/guide/en/esf/current" + kinesis-firehose-ref: "https://www.elastic.co/guide/en/kinesis/{{kinesis_version}}" + estc-welcome-current: "https://www.elastic.co/guide/en/starting-with-the-elasticsearch-platform-and-its-solutions/current" + estc-welcome: "https://www.elastic.co/guide/en/starting-with-the-elasticsearch-platform-and-its-solutions/current" + estc-welcome-all: "https://www.elastic.co/guide/en/starting-with-the-elasticsearch-platform-and-its-solutions" + hadoop-ref: "https://www.elastic.co/guide/en/elasticsearch/hadoop/current" + stack-ref: "https://www.elastic.co/guide/en/elastic-stack/current" + stack-ref-67: "https://www.elastic.co/guide/en/elastic-stack/6.7" + stack-ref-68: "https://www.elastic.co/guide/en/elastic-stack/6.8" + stack-ref-70: "https://www.elastic.co/guide/en/elastic-stack/7.0" + stack-ref-80: "https://www.elastic.co/guide/en/elastic-stack/8.0" + stack-ov: "https://www.elastic.co/guide/en/elastic-stack-overview/current" + stack-gs: "https://www.elastic.co/guide/en/elastic-stack-get-started/current" + stack-gs-current: "https://www.elastic.co/guide/en/elastic-stack-get-started/current" + javaclient: "https://www.elastic.co/guide/en/elasticsearch/client/java-api/current" + java-api-client: "https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current" + java-rest: "https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current" + jsclient: "https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current" + jsclient-current: "https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current" + es-ruby-client: "https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current" + es-dotnet-client: "https://www.elastic.co/guide/en/elasticsearch/client/net-api/current" + es-php-client: "https://www.elastic.co/guide/en/elasticsearch/client/php-api/current" + es-python-client: "https://www.elastic.co/guide/en/elasticsearch/client/python-api/current" + defguide: "https://www.elastic.co/guide/en/elasticsearch/guide/2.x" + painless: "https://www.elastic.co/guide/en/elasticsearch/painless/current" + plugins: "https://www.elastic.co/guide/en/elasticsearch/plugins/current" + plugins-8x: "https://www.elastic.co/guide/en/elasticsearch/plugins/8.1" + plugins-7x: "https://www.elastic.co/guide/en/elasticsearch/plugins/7.17" + plugins-6x: "https://www.elastic.co/guide/en/elasticsearch/plugins/6.8" + glossary: "https://www.elastic.co/guide/en/elastic-stack-glossary/current" + upgrade_guide: "https://www.elastic.co/products/upgrade_guide" + blog-ref: "https://www.elastic.co/blog/" + curator-ref: "https://www.elastic.co/guide/en/elasticsearch/client/curator/current" + curator-ref-current: "https://www.elastic.co/guide/en/elasticsearch/client/curator/current" + metrics-ref: "https://www.elastic.co/guide/en/metrics/current" + metrics-guide: "https://www.elastic.co/guide/en/metrics/guide/current" + logs-ref: "https://www.elastic.co/guide/en/logs/current" + logs-guide: "https://www.elastic.co/guide/en/logs/guide/current" + uptime-guide: "https://www.elastic.co/guide/en/uptime/current" + observability-guide: "https://www.elastic.co/guide/en/observability/current" + observability-guide-all: "https://www.elastic.co/guide/en/observability" + siem-guide: "https://www.elastic.co/guide/en/siem/guide/current" + security-guide: "https://www.elastic.co/guide/en/security/current" + security-guide-all: "https://www.elastic.co/guide/en/security" + endpoint-guide: "https://www.elastic.co/guide/en/endpoint/current" + sql-odbc: "https://www.elastic.co/guide/en/elasticsearch/sql-odbc/current" + ecs-ref: "https://www.elastic.co/guide/en/ecs/current" + ecs-logging-ref: "https://www.elastic.co/guide/en/ecs-logging/overview/current" + ecs-logging-go-logrus-ref: "https://www.elastic.co/guide/en/ecs-logging/go-logrus/current" + ecs-logging-go-zap-ref: "https://www.elastic.co/guide/en/ecs-logging/go-zap/current" + ecs-logging-go-zerolog-ref: "https://www.elastic.co/guide/en/ecs-logging/go-zap/current" + ecs-logging-java-ref: "https://www.elastic.co/guide/en/ecs-logging/java/current" + ecs-logging-dotnet-ref: "https://www.elastic.co/guide/en/ecs-logging/dotnet/current" + ecs-logging-nodejs-ref: "https://www.elastic.co/guide/en/ecs-logging/nodejs/current" + ecs-logging-php-ref: "https://www.elastic.co/guide/en/ecs-logging/php/current" + ecs-logging-python-ref: "https://www.elastic.co/guide/en/ecs-logging/python/current" + ecs-logging-ruby-ref: "https://www.elastic.co/guide/en/ecs-logging/ruby/current" + ml-docs: "https://www.elastic.co/guide/en/machine-learning/current" + eland-docs: "https://www.elastic.co/guide/en/elasticsearch/client/eland/current" + eql-ref: "https://eql.readthedocs.io/en/latest/query-guide" + extendtrial: "https://www.elastic.co/trialextension" + wikipedia: "https://en.wikipedia.org/wiki" + forum: "https://discuss.elastic.co/" + xpack-forum: "https://discuss.elastic.co/c/50-x-pack" + security-forum: "https://discuss.elastic.co/c/x-pack/shield" + watcher-forum: "https://discuss.elastic.co/c/x-pack/watcher" + monitoring-forum: "https://discuss.elastic.co/c/x-pack/marvel" + graph-forum: "https://discuss.elastic.co/c/x-pack/graph" + apm-forum: "https://discuss.elastic.co/c/apm" + enterprise-search-ref: "https://www.elastic.co/guide/en/enterprise-search/current" + app-search-ref: "https://www.elastic.co/guide/en/app-search/current" + workplace-search-ref: "https://www.elastic.co/guide/en/workplace-search/current" + enterprise-search-node-ref: "https://www.elastic.co/guide/en/enterprise-search-clients/enterprise-search-node/current" + enterprise-search-php-ref: "https://www.elastic.co/guide/en/enterprise-search-clients/php/current" + enterprise-search-python-ref: "https://www.elastic.co/guide/en/enterprise-search-clients/python/current" + enterprise-search-ruby-ref: "https://www.elastic.co/guide/en/enterprise-search-clients/ruby/current" + elastic-maps-service: "https://maps.elastic.co" + integrations-docs: "https://docs.elastic.co/en/integrations" + integrations-devguide: "https://www.elastic.co/guide/en/integrations-developer/current" + time-units: "https://www.elastic.co/guide/en/elasticsearch/reference/current/api-conventions.html#time-units" + byte-units: "https://www.elastic.co/guide/en/elasticsearch/reference/current/api-conventions.html#byte-units" + apm-py-ref-v: "https://www.elastic.co/guide/en/apm/agent/python/current" + apm-node-ref-v: "https://www.elastic.co/guide/en/apm/agent/nodejs/current" + apm-rum-ref-v: "https://www.elastic.co/guide/en/apm/agent/rum-js/current" + apm-ruby-ref-v: "https://www.elastic.co/guide/en/apm/agent/ruby/current" + apm-java-ref-v: "https://www.elastic.co/guide/en/apm/agent/java/current" + apm-go-ref-v: "https://www.elastic.co/guide/en/apm/agent/go/current" + apm-ios-ref-v: "https://www.elastic.co/guide/en/apm/agent/swift/current" + apm-dotnet-ref-v: "https://www.elastic.co/guide/en/apm/agent/dotnet/current" + apm-php-ref-v: "https://www.elastic.co/guide/en/apm/agent/php/current" + ecloud: "Elastic Cloud" + esf: "Elastic Serverless Forwarder" + ess: "Elasticsearch Service" + ece: "Elastic Cloud Enterprise" + eck: "Elastic Cloud on Kubernetes" + serverless-full: "Elastic Cloud Serverless" + serverless-short: "Serverless" + es-serverless: "Elasticsearch Serverless" + es3: "Elasticsearch Serverless" + obs-serverless: "Elastic Observability Serverless" + sec-serverless: "Elastic Security Serverless" + serverless-docs: "https://docs.elastic.co/serverless" + cloud: "https://www.elastic.co/guide/en/cloud/current" + ess-utm-params: "?page=docs&placement=docs-body" + ess-baymax: "?page=docs&placement=docs-body" + ess-trial: "https://cloud.elastic.co/registration?page=docs&placement=docs-body" + ess-product: "https://www.elastic.co/cloud/elasticsearch-service?page=docs&placement=docs-body" + ess-console: "https://cloud.elastic.co?page=docs&placement=docs-body" + ess-console-name: "Elasticsearch Service Console" + ess-deployments: "https://cloud.elastic.co/deployments?page=docs&placement=docs-body" + ece-ref: "https://www.elastic.co/guide/en/cloud-enterprise/current" + eck-ref: "https://www.elastic.co/guide/en/cloud-on-k8s/current" + ess-leadin: "You can run Elasticsearch on your own hardware or use our hosted Elasticsearch Service that is available on AWS, GCP, and Azure. https://cloud.elastic.co/registration{ess-utm-params}[Try the Elasticsearch Service for free]." + ess-leadin-short: "Our hosted Elasticsearch Service is available on AWS, GCP, and Azure, and you can https://cloud.elastic.co/registration{ess-utm-params}[try it for free]." + ess-icon: "image:https://doc-icons.s3.us-east-2.amazonaws.com/logo_cloud.svg[link=\"https://cloud.elastic.co/registration{ess-utm-params}\", title=\"Supported on Elasticsearch Service\"]" + ece-icon: "image:https://doc-icons.s3.us-east-2.amazonaws.com/logo_cloud_ece.svg[link=\"https://cloud.elastic.co/registration{ess-utm-params}\", title=\"Supported on Elastic Cloud Enterprise\"]" + cloud-only: "This feature is designed for indirect use by https://cloud.elastic.co/registration{ess-utm-params}[Elasticsearch Service], https://www.elastic.co/guide/en/cloud-enterprise/{ece-version-link}[Elastic Cloud Enterprise], and https://www.elastic.co/guide/en/cloud-on-k8s/current[Elastic Cloud on Kubernetes]. Direct use is not supported." + ess-setting-change: "image:https://doc-icons.s3.us-east-2.amazonaws.com/logo_cloud.svg[link=\"{ess-trial}\", title=\"Supported on {ess}\"] indicates a change to a supported https://www.elastic.co/guide/en/cloud/current/ec-add-user-settings.html[user setting] for Elasticsearch Service." + ess-skip-section: "If you use Elasticsearch Service, skip this section. Elasticsearch Service handles these changes for you." + api-cloud: "https://www.elastic.co/docs/api/doc/cloud" + api-ece: "https://www.elastic.co/docs/api/doc/cloud-enterprise" + api-kibana-serverless: "https://www.elastic.co/docs/api/doc/serverless" + es-feature-flag: "This feature is in development and not yet available for use. This documentation is provided for informational purposes only." + es-ref-dir: "'{{elasticsearch-root}}/docs/reference'" + apm-app: "APM app" + uptime-app: "Uptime app" + synthetics-app: "Synthetics app" + logs-app: "Logs app" + metrics-app: "Metrics app" + infrastructure-app: "Infrastructure app" + siem-app: "SIEM app" + security-app: "Elastic Security app" + ml-app: "Machine Learning" + dev-tools-app: "Dev Tools" + ingest-manager-app: "Ingest Manager" + stack-manage-app: "Stack Management" + stack-monitor-app: "Stack Monitoring" + alerts-ui: "Alerts and Actions" + rules-ui: "Rules" + rac-ui: "Rules and Connectors" + connectors-ui: "Connectors" + connectors-feature: "Actions and Connectors" + stack-rules-feature: "Stack Rules" + user-experience: "User Experience" + ems: "Elastic Maps Service" + ems-init: "EMS" + hosted-ems: "Elastic Maps Server" + ipm-app: "Index Pattern Management" + ingest-pipelines: "ingest pipelines" + ingest-pipelines-app: "Ingest Pipelines" + ingest-pipelines-cap: "Ingest pipelines" + ls-pipelines: "Logstash pipelines" + ls-pipelines-app: "Logstash Pipelines" + maint-windows: "maintenance windows" + maint-windows-app: "Maintenance Windows" + maint-windows-cap: "Maintenance windows" + custom-roles-app: "Custom Roles" + data-source: "data view" + data-sources: "data views" + data-source-caps: "Data View" + data-sources-caps: "Data Views" + data-source-cap: "Data view" + data-sources-cap: "Data views" + project-settings: "Project settings" + manage-app: "Management" + index-manage-app: "Index Management" + data-views-app: "Data Views" + rules-app: "Rules" + saved-objects-app: "Saved Objects" + tags-app: "Tags" + api-keys-app: "API keys" + transforms-app: "Transforms" + connectors-app: "Connectors" + files-app: "Files" + reports-app: "Reports" + maps-app: "Maps" + alerts-app: "Alerts" + crawler: "Enterprise Search web crawler" + ents: "Enterprise Search" + app-search-crawler: "App Search web crawler" + agent: "Elastic Agent" + agents: "Elastic Agents" + fleet: "Fleet" + fleet-server: "Fleet Server" + integrations-server: "Integrations Server" + ingest-manager: "Ingest Manager" + ingest-management: "ingest management" + package-manager: "Elastic Package Manager" + integrations: "Integrations" + package-registry: "Elastic Package Registry" + artifact-registry: "Elastic Artifact Registry" + aws: "AWS" + stack: "Elastic Stack" + xpack: "X-Pack" + es: "Elasticsearch" + kib: "Kibana" + esms: "Elastic Stack Monitoring Service" + esms-init: "ESMS" + ls: "Logstash" + beats: "Beats" + auditbeat: "Auditbeat" + filebeat: "Filebeat" + heartbeat: "Heartbeat" + metricbeat: "Metricbeat" + packetbeat: "Packetbeat" + winlogbeat: "Winlogbeat" + functionbeat: "Functionbeat" + journalbeat: "Journalbeat" + es-sql: "Elasticsearch SQL" + esql: "ES|QL" + elastic-agent: "Elastic Agent" + k8s: "Kubernetes" + log-driver-long: "Elastic Logging Plugin for Docker" + security: "X-Pack security" + security-features: "security features" + operator-feature: "operator privileges feature" + es-security-features: "Elasticsearch security features" + stack-security-features: "Elastic Stack security features" + endpoint-sec: "Endpoint Security" + endpoint-cloud-sec: "Endpoint and Cloud Security" + elastic-defend: "Elastic Defend" + elastic-sec: "Elastic Security" + elastic-endpoint: "Elastic Endpoint" + swimlane: "Swimlane" + sn: "ServiceNow" + sn-itsm: "ServiceNow ITSM" + sn-itom: "ServiceNow ITOM" + sn-sir: "ServiceNow SecOps" + jira: "Jira" + ibm-r: "IBM Resilient" + webhook: "Webhook" + webhook-cm: "Webhook - Case Management" + opsgenie: "Opsgenie" + bedrock: "Amazon Bedrock" + gemini: "Google Gemini" + hive: "TheHive" + monitoring: "X-Pack monitoring" + monitor-features: "monitoring features" + stack-monitor-features: "Elastic Stack monitoring features" + watcher: "Watcher" + alert-features: "alerting features" + reporting: "X-Pack reporting" + report-features: "reporting features" + graph: "X-Pack graph" + graph-features: "graph analytics features" + searchprofiler: "Search Profiler" + xpackml: "X-Pack machine learning" + ml: "machine learning" + ml-cap: "Machine learning" + ml-init: "ML" + ml-features: "machine learning features" + stack-ml-features: "Elastic Stack machine learning features" + ccr: "cross-cluster replication" + ccr-cap: "Cross-cluster replication" + ccr-init: "CCR" + ccs: "cross-cluster search" + ccs-cap: "Cross-cluster search" + ccs-init: "CCS" + ilm: "index lifecycle management" + ilm-cap: "Index lifecycle management" + ilm-init: "ILM" + dlm: "data lifecycle management" + dlm-cap: "Data lifecycle management" + dlm-init: "DLM" + search-snap: "searchable snapshot" + search-snaps: "searchable snapshots" + search-snaps-cap: "Searchable snapshots" + slm: "snapshot lifecycle management" + slm-cap: "Snapshot lifecycle management" + slm-init: "SLM" + rollup-features: "data rollup features" + ipm: "index pattern management" + ipm-cap: "Index pattern" + rollup: "rollup" + rollup-cap: "Rollup" + rollups: "rollups" + rollups-cap: "Rollups" + rollup-job: "rollup job" + rollup-jobs: "rollup jobs" + rollup-jobs-cap: "Rollup jobs" + dfeed: "datafeed" + dfeeds: "datafeeds" + dfeed-cap: "Datafeed" + dfeeds-cap: "Datafeeds" + ml-jobs: "machine learning jobs" + ml-jobs-cap: "Machine learning jobs" + anomaly-detect: "anomaly detection" + anomaly-detect-cap: "Anomaly detection" + anomaly-job: "anomaly detection job" + anomaly-jobs: "anomaly detection jobs" + anomaly-jobs-cap: "Anomaly detection jobs" + dataframe: "data frame" + dataframes: "data frames" + dataframe-cap: "Data frame" + dataframes-cap: "Data frames" + watcher-transform: "payload transform" + watcher-transforms: "payload transforms" + watcher-transform-cap: "Payload transform" + watcher-transforms-cap: "Payload transforms" + transform: "transform" + transforms: "transforms" + transform-cap: "Transform" + transforms-cap: "Transforms" + dataframe-transform: "transform" + dataframe-transform-cap: "Transform" + dataframe-transforms: "transforms" + dataframe-transforms-cap: "Transforms" + dfanalytics-cap: "Data frame analytics" + dfanalytics: "data frame analytics" + dataframe-analytics-config: "'{dataframe} analytics config'" + dfanalytics-job: "'{dataframe} analytics job'" + dfanalytics-jobs: "'{dataframe} analytics jobs'" + dfanalytics-jobs-cap: "'{dataframe-cap} analytics jobs'" + cdataframe: "continuous data frame" + cdataframes: "continuous data frames" + cdataframe-cap: "Continuous data frame" + cdataframes-cap: "Continuous data frames" + cdataframe-transform: "continuous transform" + cdataframe-transforms: "continuous transforms" + cdataframe-transforms-cap: "Continuous transforms" + ctransform: "continuous transform" + ctransform-cap: "Continuous transform" + ctransforms: "continuous transforms" + ctransforms-cap: "Continuous transforms" + oldetection: "outlier detection" + oldetection-cap: "Outlier detection" + olscore: "outlier score" + olscores: "outlier scores" + fiscore: "feature influence score" + evaluatedf-api: "evaluate {dataframe} analytics API" + evaluatedf-api-cap: "Evaluate {dataframe} analytics API" + binarysc: "binary soft classification" + binarysc-cap: "Binary soft classification" + regression: "regression" + regression-cap: "Regression" + reganalysis: "regression analysis" + reganalysis-cap: "Regression analysis" + depvar: "dependent variable" + feature-var: "feature variable" + feature-vars: "feature variables" + feature-vars-cap: "Feature variables" + classification: "classification" + classification-cap: "Classification" + classanalysis: "classification analysis" + classanalysis-cap: "Classification analysis" + infer-cap: "Inference" + infer: "inference" + lang-ident-cap: "Language identification" + lang-ident: "language identification" + data-viz: "Data Visualizer" + file-data-viz: "File Data Visualizer" + feat-imp: "feature importance" + feat-imp-cap: "Feature importance" + nlp: "natural language processing" + nlp-cap: "Natural language processing" + apm-agent: "APM agent" + apm-go-agent: "Elastic APM Go agent" + apm-go-agents: "Elastic APM Go agents" + apm-ios-agent: "Elastic APM iOS agent" + apm-ios-agents: "Elastic APM iOS agents" + apm-java-agent: "Elastic APM Java agent" + apm-java-agents: "Elastic APM Java agents" + apm-dotnet-agent: "Elastic APM .NET agent" + apm-dotnet-agents: "Elastic APM .NET agents" + apm-node-agent: "Elastic APM Node.js agent" + apm-node-agents: "Elastic APM Node.js agents" + apm-php-agent: "Elastic APM PHP agent" + apm-php-agents: "Elastic APM PHP agents" + apm-py-agent: "Elastic APM Python agent" + apm-py-agents: "Elastic APM Python agents" + apm-ruby-agent: "Elastic APM Ruby agent" + apm-ruby-agents: "Elastic APM Ruby agents" + apm-rum-agent: "Elastic APM Real User Monitoring (RUM) JavaScript agent" + apm-rum-agents: "Elastic APM RUM JavaScript agents" + apm-lambda-ext: "Elastic APM AWS Lambda extension" + project-monitors: "project monitors" + project-monitors-cap: "Project monitors" + private-location: "Private Location" + private-locations: "Private Locations" + pwd: "YOUR_PASSWORD" + esh: "ES-Hadoop" + default-dist: "default distribution" + oss-dist: "OSS-only distribution" + observability: "Observability" + api-request-title: "Request" + api-prereq-title: "Prerequisites" + api-description-title: "Description" + api-path-parms-title: "Path parameters" + api-query-parms-title: "Query parameters" + api-request-body-title: "Request body" + api-response-codes-title: "Response codes" + api-response-body-title: "Response body" + api-example-title: "Example" + api-examples-title: "Examples" + api-definitions-title: "Properties" + multi-arg: "†footnoteref:[multi-arg,This parameter accepts multiple arguments.]" + multi-arg-ref: "†footnoteref:[multi-arg]" + yes-icon: "image:https://doc-icons.s3.us-east-2.amazonaws.com/icon-yes.png[Yes,20,15]" + no-icon: "image:https://doc-icons.s3.us-east-2.amazonaws.com/icon-no.png[No,20,15]" + es-repo: "https://github.com/elastic/elasticsearch/" + es-issue: "https://github.com/elastic/elasticsearch/issues/" + es-pull: "https://github.com/elastic/elasticsearch/pull/" + es-commit: "https://github.com/elastic/elasticsearch/commit/" + kib-repo: "https://github.com/elastic/kibana/" + kib-issue: "https://github.com/elastic/kibana/issues/" + kibana-issue: "'{kib-repo}issues/'" + kib-pull: "https://github.com/elastic/kibana/pull/" + kibana-pull: "'{kib-repo}pull/'" + kib-commit: "https://github.com/elastic/kibana/commit/" + ml-repo: "https://github.com/elastic/ml-cpp/" + ml-issue: "https://github.com/elastic/ml-cpp/issues/" + ml-pull: "https://github.com/elastic/ml-cpp/pull/" + ml-commit: "https://github.com/elastic/ml-cpp/commit/" + apm-repo: "https://github.com/elastic/apm-server/" + apm-issue: "https://github.com/elastic/apm-server/issues/" + apm-pull: "https://github.com/elastic/apm-server/pull/" + kibana-blob: "https://github.com/elastic/kibana/blob/current/" + apm-get-started-ref: "https://www.elastic.co/guide/en/apm/get-started/current" + apm-server-ref: "https://www.elastic.co/guide/en/apm/server/current" + apm-server-ref-v: "https://www.elastic.co/guide/en/apm/server/current" + apm-server-ref-m: "https://www.elastic.co/guide/en/apm/server/master" + apm-server-ref-62: "https://www.elastic.co/guide/en/apm/server/6.2" + apm-server-ref-64: "https://www.elastic.co/guide/en/apm/server/6.4" + apm-server-ref-70: "https://www.elastic.co/guide/en/apm/server/7.0" + apm-overview-ref-v: "https://www.elastic.co/guide/en/apm/get-started/current" + apm-overview-ref-70: "https://www.elastic.co/guide/en/apm/get-started/7.0" + apm-overview-ref-m: "https://www.elastic.co/guide/en/apm/get-started/master" + infra-guide: "https://www.elastic.co/guide/en/infrastructure/guide/current" + a-data-source: "a data view" + icon-bug: "pass:[<span class=\"eui-icon icon-bug\"></span>]" + icon-checkInCircleFilled: "pass:[<span class=\"eui-icon icon-checkInCircleFilled\"></span>]" + icon-warningFilled: "pass:[<span class=\"eui-icon icon-warningFilled\"></span>]" diff --git a/docs/dsl.asciidoc b/docs/dsl.asciidoc deleted file mode 100644 index 922624a4fa..0000000000 --- a/docs/dsl.asciidoc +++ /dev/null @@ -1,6 +0,0 @@ -[[dsl]] -=== Elasticsearch DSL - -The https://github.com/elastic/elasticsearch-dsl-ruby[elasticsearch-dsl] gem provides a Ruby API for the https://www.elasticsearch.com/guide/en/elasticsearch/reference/current/query-dsl.html[Elasticsearch Query DSL]. The library allows to programmatically build complex search definitions for {es} in Ruby, which are translated to Hashes, and ultimately, JSON, the language of {es}. - -See https://github.com/elastic/elasticsearch-dsl-ruby#elasticsearchdsl[the README] for more information. diff --git a/docs/ecs.asciidoc b/docs/ecs.asciidoc deleted file mode 100644 index 218708038b..0000000000 --- a/docs/ecs.asciidoc +++ /dev/null @@ -1,34 +0,0 @@ -[[ecs]] -=== Elastic Common Schema (ECS) - -The https://www.elastic.co/guide/en/ecs/current/ecs-reference.html[Elastic Common Schema (ECS)] is an open source format that defines a common set of fields to be used when storing event data like logs in Elasticsearch. - -You can use the library https://github.com/elastic/ecs-logging-ruby[ecs-logging] which is a set of libraries that enables you to transform your application logs to structured logs that comply with the ECS format. - -Add this line to your application's Gemfile: - -[source,ruby] ------------------------------------- -gem 'ecs-logging' ------------------------------------- - -Then execute `bundle install`. Or install from the command line yourself: - -[source,ruby] ------------------------------------- -$ gem install ecs-logging ------------------------------------- - -Then configure the client to use the logger: -[source,ruby] ------------------------------------- -require 'ecs_logging/logger' -require 'elasticsearch' - -logger = EcsLogging::Logger.new($stdout) -client = Elasticsearch::Client.new(logger: logger) -> client.info -{"@timestamp":"2022-07-12T05:31:18.590Z","log.level":"INFO","message":"GET http://localhost:9200/ [status:200, request:0.009s, query:n/a]","ecs.version":"1.4.0"}... ------------------------------------- - -See https://www.elastic.co/guide/en/ecs-logging/ruby/current/index.html[ECS Logging Ruby Reference] for more information on how to configure the logger. diff --git a/docs/examples/apm/screenshot.jpg b/docs/examples/apm/screenshot.jpg deleted file mode 100644 index 6ba778dfb5d651ce72fafa085953dab3087bad71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 324480 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%0DG03p-DVmEWomnxiyJwbM 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�bndv8R1``Yu0uA0+7rU%ET`}W-Hxc>c1 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%0A<CbcE&&#Hj38pJ^)7@LN^6Hw$OWowF&lf8~ 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 Ch~I($ diff --git a/docs/getting-started.asciidoc b/docs/getting-started.asciidoc deleted file mode 100644 index a4500847b4..0000000000 --- a/docs/getting-started.asciidoc +++ /dev/null @@ -1,141 +0,0 @@ -[[getting-started-ruby]] -== Getting started - -This page guides you through the installation process of the Ruby client, shows -you how to instantiate the client, and how to perform basic Elasticsearch -operations with it. - -[discrete] -=== Requirements - -A currently maintained version of Ruby (3.0+) or JRuby (9.3+). - -[discrete] -=== Installation - -To install the latest version of the client, run the following command: - -[source,shell] --------------------------- -gem install elasticsearch --------------------------- - -Refer to the <<ruby-install>> page to learn more. - - -[discrete] -=== Connecting - -You can connect to the Elastic Cloud using an API key and the Elasticsearch -endpoint. - -[source,rb] ----- -client = Elasticsearch::Client.new( - cloud_id: '<CloudID>', - api_key: '<ApiKey>' -) ----- - -Your Elasticsearch endpoint can be found on the **My deployment** page of your -deployment: - -image::images/es_endpoint.jpg[alt="Finding Elasticsearch endpoint",align="center"] - -You can generate an API key on the **Management** page under Security. - -image::images/create_api_key.png[alt="Create API key",align="center"] - -For other connection options, refer to the <<connecting>> section. - - -[discrete] -=== Operations - -Time to use Elasticsearch! This section walks you through the basic, and most -important, operations of Elasticsearch. For more operations and more advanced -examples, refer to the <<examples>> page. - - -[discrete] -==== Creating an index - -This is how you create the `my_index` index: - -[source,rb] ----- -client.indices.create(index: 'my_index') ----- - - -[discrete] -==== Indexing documents - -This is a simple way of indexing a document: - -[source,rb] ----- -document = { name: 'elasticsearch-ruby' } -response = client.index(index: 'my_index', body: document) -# You can get the indexed document id with: -response['_id'] -=> "PlgIDYkBWS9Ngdx5IMy-" -id = response['_id'] ----- - - -[discrete] -==== Getting documents - -You can get documents by using the following code: - -[source,rb] ----- -client.get(index: 'my_index', id: id) ----- - - -[discrete] -==== Searching documents - -This is how you can create a single match query with the Ruby client: - -[source,rb] ----- -client.search(index: 'my_index', body: { query: { match_all: {} } }) ----- - - -[discrete] -==== Updating documents - -This is how you can update a document, for example to add a new field: - -[source,rb] ----- -client.update(index: 'my_index', id: id, body: { doc: { language: 'Ruby' } }) ----- - - -[discrete] -==== Deleting documents - -[source,rb] ----- -client.delete(index: 'my_index', id: id) ----- - - -[discrete] -==== Deleting an index - -[source,rb] ----- -client.indices.delete(index: 'my_index') ----- - - -[discrete] -== Further reading - -* Use <<Helpers>> for a more confortable experience with the APIs. \ No newline at end of file diff --git a/docs/helpers/index.asciidoc b/docs/helpers/index.asciidoc deleted file mode 100644 index 1e475886cd..0000000000 --- a/docs/helpers/index.asciidoc +++ /dev/null @@ -1,10 +0,0 @@ -[[client-helpers]] -== Client helpers - -The Ruby client includes the following helpers: - -* <<Helpers>> -* <<esql>> - -include::bulk-scroll.asciidoc[] -include::esql.asciidoc[] \ No newline at end of file diff --git a/docs/index.asciidoc b/docs/index.asciidoc deleted file mode 100644 index b83dd47058..0000000000 --- a/docs/index.asciidoc +++ /dev/null @@ -1,32 +0,0 @@ -= Elasticsearch Ruby Client - -:doctype: book - -include::{asciidoc-dir}/../../shared/versions/stack/{source_branch}.asciidoc[] -include::{asciidoc-dir}/../../shared/attributes.asciidoc[] - -:es-docs: https://www.elastic.co/guide/en/elasticsearch/reference/{branch} - -include::overview.asciidoc[] - -include::getting-started.asciidoc[] - -include::installation.asciidoc[] - -include::connecting.asciidoc[] - -include::config.asciidoc[] - -include::basic-config.asciidoc[] - -include::advanced-config.asciidoc[] - -include::integrations.asciidoc[] - -include::examples.asciidoc[] - -include::troubleshooting.asciidoc[] - -include::helpers/index.asciidoc[] - -include::release_notes/index.asciidoc[] diff --git a/docs/installation.asciidoc b/docs/installation.asciidoc deleted file mode 100644 index 15ce2f60a8..0000000000 --- a/docs/installation.asciidoc +++ /dev/null @@ -1,61 +0,0 @@ -[[ruby-install]] -== Installation - -Install the Rubygem for the latest {es} version by using the following command: - -[source,sh] ------------------------------------- -gem install elasticsearch ------------------------------------- - - -Or add the `elasticsearch` Ruby gem to your Gemfile: - -[source,ruby] ------------------------------------- -gem 'elasticsearch' ------------------------------------- - - - -You can install the Ruby gem for a specific {es} version by using the following -command: - -[source,sh] ------------------------------------- -gem install elasticsearch -v 7.0.0 ------------------------------------- - - -Or you can add a specific version of {es} to your Gemfile: - -[source,ruby] ------------------------------------- -gem 'elasticsearch', '~> 7.0' ------------------------------------- - - -[discrete] -=== {es} and Ruby Version Compatibility - -The {es} client is compatible with currently maintained Ruby versions. We follow -Ruby’s own maintenance policy and officially support all currently maintained -versions per -https://www.ruby-lang.org/en/downloads/branches/[Ruby Maintenance Branches]. - -Language clients are forward compatible; meaning that clients support -communicating with greater or equal minor versions of {es} without breaking. It -does not mean that the client automatically supports new features of newer {es} -versions; it is only possible after a release of a new client version. For -example, a 8.12 client version won't automatically support the new features of -the 8.13 version of {es}, the 8.13 client version is required for that. -{es} language clients are only backwards compatible with default distributions -and without guarantees made. - -|=== -| Gem Version | | {es} Version | Supported - -| 7.x | → | 7.x | 7.17 -| 8.x | → | 8.x | 8.x -| main | → | main | -|=== \ No newline at end of file diff --git a/docs/integrations.asciidoc b/docs/integrations.asciidoc deleted file mode 100644 index c758d17201..0000000000 --- a/docs/integrations.asciidoc +++ /dev/null @@ -1,30 +0,0 @@ -[[integrations]] -== Integrations - -The Rubygems listed on this page make it easier to operate with {es} by using -the Ruby client. - -* <<transport>> -* <<api>> -* <<opentelemetry>> -* <<ecs>> -* <<activemodel_activerecord>> -* <<ruby_on_rails>> -* <<persistence>> -* <<dsl>> - -include::transport.asciidoc[] - -include::api.asciidoc[] - -include::open-telemetry.asciidoc[] - -include::ecs.asciidoc[] - -include::model.asciidoc[] - -include::rails.asciidoc[] - -include::persistence.asciidoc[] - -include::dsl.asciidoc[] diff --git a/docs/open-telemetry.asciidoc b/docs/open-telemetry.asciidoc deleted file mode 100644 index 87fd86206b..0000000000 --- a/docs/open-telemetry.asciidoc +++ /dev/null @@ -1,94 +0,0 @@ -[[opentelemetry]] -=== Using OpenTelemetry - -You can use https://opentelemetry.io/[OpenTelemetry] to monitor the performance and behavior of your {es} requests through the Ruby Client. -The Ruby Client comes with built-in OpenTelemetry instrumentation that emits https://www.elastic.co/guide/en/apm/guide/current/apm-distributed-tracing.html[distributed tracing spans] by default. -With that, applications https://opentelemetry.io/docs/instrumentation/ruby/manual/[instrumented with OpenTelemetry] or using the https://opentelemetry.io/docs/instrumentation/ruby/automatic/[OpenTelemetry Ruby SDK] are inherently enriched with additional spans that contain insightful information about the execution of the {es} requests. - -The native instrumentation in the Ruby Client follows the https://opentelemetry.io/docs/specs/semconv/database/elasticsearch/[OpenTelemetry Semantic Conventions for {es}]. In particular, the instrumentation in the client covers the logical layer of {es} requests. A single span per request is created that is processed by the service through the Ruby Client. The following image shows a trace that records the handling of two different {es} requests: a `ping` request and a `search` request. - -[role="screenshot"] -image::images/otel-waterfall-without-http.png[alt="Distributed trace with Elasticsearch spans",align="center"] - -Usually, OpenTelemetry auto-instrumentation modules come with instrumentation support for HTTP-level communication. In this case, in addition to the logical {es} client requests, spans will be captured for the physical HTTP requests emitted by the client. The following image shows a trace with both, {es} spans (in blue) and the corresponding HTTP-level spans (in red): - -[role="screenshot"] -image::images/otel-waterfall-with-http.png[alt="Distributed trace with Elasticsearch spans",align="center"] - -Advanced Ruby Client behavior such as nodes round-robin and request retries are revealed through the combination of logical {es} spans and the physical HTTP spans. The following example shows a `search` request in a scenario with two nodes: - -[role="screenshot"] -image::images/otel-waterfall-retry.png[alt="Distributed trace with Elasticsearch spans",align="center"] - -The first node is unavailable and results in an HTTP error, while the retry to the second node succeeds. Both HTTP requests are subsumed by the logical {es} request span (in blue). - -[discrete] -==== Setup the OpenTelemetry instrumentation - -When using the https://opentelemetry.io/docs/instrumentation/ruby/manual[OpenTelemetry Ruby SDK manually] or using the https://opentelemetry.io/docs/instrumentation/ruby/automatic/[OpenTelemetry Ruby Auto-Instrumentations], the Ruby Client's OpenTelemetry instrumentation is enabled by default and uses the global OpenTelemetry SDK with the global tracer provider. You can provide a tracer provider via the Ruby Client configuration option `opentelemetry_tracer_provider` when instantiating the client. This is sometimes useful for testing or other specific use cases. - -[source,ruby] ------------------------------------- -client = Elasticsearch::Client.new( - cloud_id: '<CloudID>', - api_key: '<ApiKey>', - opentelemetry_tracer_provider: tracer_provider -) ------------------------------------- - -[discrete] -==== Configuring the OpenTelemetry instrumentation - -You can configure the OpenTelemetry instrumentation through Environment Variables. -The following configuration options are available. - -[discrete] -[[opentelemetry-config-enable]] -===== Enable / Disable the OpenTelemetry instrumentation - -With this configuration option you can enable (default) or disable the built-in OpenTelemetry instrumentation. - -**Default:** `true` - -|============ -| Environment Variable | `OTEL_RUBY_INSTRUMENTATION_ELASTICSEARCH_ENABLED` -|============ - -[discrete] -===== Capture search request bodies - -Per default, the built-in OpenTelemetry instrumentation does not capture request bodies due to data privacy considerations. You can use this option to enable capturing of search queries from the request bodies of {es} search requests in case you wish to gather this information regardless. The options are to capture the raw search query, sanitize the query with a default list of sensitive keys, or not capture it at all. - -**Default:** `omit` - -**Valid Options:** `omit`, `sanitize`, `raw` - -|============ -| Environment Variable | `OTEL_RUBY_INSTRUMENTATION_ELASTICSEARCH_CAPTURE_SEARCH_QUERY` -|============ - -[discrete] -===== Sanitize the {es} search request body - -You can configure the list of keys whose values are redacted when the search query is captured. Values must be comma-separated. -Note in v8.3.0 and v8.3.1, the environment variable `OTEL_INSTRUMENTATION_ELASTICSEARCH_CAPTURE_SEARCH_QUERY` was available -but is now deprecated in favor of the environment variable including `RUBY`. - -**Default:** `nil` - -|============ -| Environment Variable | `OTEL_RUBY_INSTRUMENTATION_ELASTICSEARCH_SEARCH_QUERY_SANITIZE_KEYS` -|============ - -Example: - -```bash -OTEL_RUBY_INSTRUMENTATION_ELASTICSEARCH_SEARCH_QUERY_SANITIZE_KEYS='sensitive-key,other-sensitive-key' -``` - -[discrete] -==== Overhead - -The OpenTelemetry instrumentation (as any other monitoring approach) may come with a slight overhead on CPU, memory, and/or latency. The overhead may only occur when the instrumentation is enabled (default) and an OpenTelemetry SDK is active in the target application. When the instrumentation is disabled or no OpenTelemetry SDK is active within the target application, monitoring overhead is not expected when using the client. - -Even in cases where the instrumentation is enabled and is actively used (by an OpenTelemetry SDK), the overhead is minimal and negligible in the vast majority of cases. In edge cases where there is a noticeable overhead, the <<opentelemetry-config-enable,instrumentation can be explicitly disabled>> to eliminate any potential impact on performance. \ No newline at end of file diff --git a/docs/overview.asciidoc b/docs/overview.asciidoc deleted file mode 100644 index 108094e23b..0000000000 --- a/docs/overview.asciidoc +++ /dev/null @@ -1,38 +0,0 @@ -[[ruby_client]] -== Overview - -The `elasticsearch` http://rubygems.org/gems/elasticsearch[Rubygem] provides a low-level client for communicating with an {es} cluster, fully compatible with other official clients. - -More documentation is hosted in https://github.com/elastic/elasticsearch-ruby[Github] and http://rubydoc.info/gems/elasticsearch[RubyDoc]. - -Refer to the <<getting-started-ruby>> page for a step-by-step quick start with -the Ruby client. - -[discrete] -=== Features - -* Pluggable logging and tracing -* Pluggable connection selection strategies (round-robin, random, custom) -* Pluggable transport implementation, customizable and extendable -* Pluggable serializer implementation -* Request retries and dead connections handling -* Node reloading (based on cluster state) on errors or on demand -* Modular API implementation -* 100% REST API coverage - - -[discrete] -[[transport-api]] -=== Transport and API - -The `elasticsearch` gem combines two separate Rubygems: - -* https://github.com/elastic/elastic-transport-ruby/[`elastic-transport`] - provides an HTTP Ruby client for connecting to the {es} cluster. Refer to the documentation: <<transport>> - -* https://github.com/elastic/elasticsearch-ruby/tree/main/elasticsearch-api[`elasticsearch-api`] - provides a Ruby API for the {es} RESTful API. - -Please consult their respective documentation for configuration options and technical details. - -Notably, the documentation and comprehensive examples for all the API methods are contained in the source, and available online at http://rubydoc.info/gems/elasticsearch-api/Elasticsearch/API/Actions[Rubydoc]. - -Keep in mind, that for optimal performance, you should use an HTTP library which supports persistent ("keep-alive") HTTP connections. diff --git a/docs/rails.asciidoc b/docs/rails.asciidoc deleted file mode 100644 index d1c84e1b86..0000000000 --- a/docs/rails.asciidoc +++ /dev/null @@ -1,24 +0,0 @@ -[[ruby_on_rails]] -=== Ruby On Rails - -The `elasticsearch-rails` http://rubygems.org/gems/elasticsearch-rails[Rubygem] -provides features suitable for Ruby on Rails applications. - - -[discrete] -==== Features - -* Rake tasks for importing data from application models -* Integration with Rails' instrumentation framework -* Templates for generating example Rails application - - -[discrete] -==== Example applications - -You can generate a fully working example Ruby on Rails application with -templates provides. - -Please refer to the -https://github.com/elastic/elasticsearch-rails/tree/master/elasticsearch-rails[documentation] -for more information. diff --git a/docs/helpers/bulk-scroll.asciidoc b/docs/reference/Helpers.md similarity index 78% rename from docs/helpers/bulk-scroll.asciidoc rename to docs/reference/Helpers.md index 8d638bab65..67c7be3393 100644 --- a/docs/helpers/bulk-scroll.asciidoc +++ b/docs/reference/Helpers.md @@ -1,98 +1,93 @@ -[[Helpers]] -=== Bulk and Scroll helpers +--- +mapped_pages: + - https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/Helpers.html +--- -The {es} Ruby client includes Bulk and Scroll helpers for working with results more efficiently. +# Bulk and Scroll helpers [Helpers] -[discrete] -==== Bulk helper +The {{es}} Ruby client includes Bulk and Scroll helpers for working with results more efficiently. -The Bulk API in Elasticsearch allows you to perform multiple indexing or deletion operations through a single API call, resulting in reduced overhead and improved indexing speed. The actions are specified in the request body using a newline delimited JSON (NDJSON) structure. In the Elasticsearch Ruby client, the `bulk` method supports several data structures as a parameter. You can use the Bulk API in an idiomatic way without concerns about payload formatting. Refer to <<ex-bulk>> for more information. +## Bulk helper [_bulk_helper] -The BulkHelper provides a better developer experience when using the Bulk API. At its simplest, you can send it a collection of hashes in an array, and it will bulk ingest them into {es}. +The Bulk API in Elasticsearch allows you to perform multiple indexing or deletion operations through a single API call, resulting in reduced overhead and improved indexing speed. The actions are specified in the request body using a newline delimited JSON (NDJSON) structure. In the Elasticsearch Ruby client, the `bulk` method supports several data structures as a parameter. You can use the Bulk API in an idiomatic way without concerns about payload formatting. Refer to [Bulk requests](/reference/examples.md#ex-bulk) for more information. + +The BulkHelper provides a better developer experience when using the Bulk API. At its simplest, you can send it a collection of hashes in an array, and it will bulk ingest them into {{es}}. To use the BulkHelper, require it in your code: -[source,ruby] ----- +```ruby require 'elasticsearch/helpers/bulk_helper' ----- +``` Instantiate a BulkHelper with a client, and an index: -[source,ruby] ----- + +```ruby client = Elasticsearch::Client.new bulk_helper = Elasticsearch::Helpers::BulkHelper.new(client, index) ----- +``` This helper works on the index you pass in during initialization, but you can change the index at any time in your code: -[source,ruby] ----- +```ruby bulk_helper.index = 'new_index' ----- +``` If you want to index a collection of documents, use the `ingest` method: -[source,ruby] ----- +```ruby documents = [ { name: 'document1', date: '2024-05-16' }, { name: 'document2', date: '2023-12-19' }, { name: 'document3', date: '2024-07-07' } ] bulk_helper.ingest(documents) ----- +``` -If you're ingesting a large set of data and want to separate the documents into smaller pieces before sending them to {es}, use the `slice` parameter. +If you’re ingesting a large set of data and want to separate the documents into smaller pieces before sending them to {{es}}, use the `slice` parameter. -[source,ruby] ----- +```ruby bulk_helper.ingest(documents, { slice: 2 }) ----- +``` This way the data will be sent in two different bulk requests. You can also include the parameters you would send to the Bulk API either in the query parameters or in the request body. The method signature is `ingest(docs, params = {}, body = {}, &block)`. Additionally, the method can be called with a block, that will provide access to the response object received from calling the Bulk API and the documents sent in the request: -[source,ruby] ----- +```ruby helper.ingest(documents) { |_, docs| puts "Ingested #{docs.count} documents" } ----- +``` You can update and delete documents with the BulkHelper too. To delete a set of documents, you can send an array of document ids: -[source,ruby] ----- +```ruby ids = ['shm0I4gB6LpJd9ljO9mY', 'sxm0I4gB6LpJd9ljO9mY', 'tBm0I4gB6LpJd9ljO9mY', 'tRm0I4gB6LpJd9ljO9mY', 'thm0I4gB6LpJd9ljO9mY', 'txm0I4gB6LpJd9ljO9mY', 'uBm0I4gB6LpJd9ljO9mY', 'uRm0I4gB6LpJd9ljO9mY', 'uhm0I4gB6LpJd9ljO9mY', 'uxm0I4gB6LpJd9ljO9mY'] helper.delete(ids) ----- +``` To update documents, you can send the array of documents with their respective ids: -[source,ruby] ----- + +```ruby documents = [ {name: 'updated name 1', id: 'AxkFJYgB6LpJd9ljOtr7'}, {name: 'updated name 2', id: 'BBkFJYgB6LpJd9ljOtr7'} ] helper.update(documents) ----- +``` -[discrete] -===== Ingest a JSON file + +### Ingest a JSON file [_ingest_a_json_file] `BulkHelper` also provides a helper to ingest data straight from a JSON file. By giving a file path as an input, the helper will parse and ingest the documents in the file: -[source,ruby] ----- +```ruby file_path = './data.json' helper.ingest_json(file_path) ----- +``` In cases where the array of data you want to ingest is not necessarily in the root of the JSON file, you can provide the keys to access the data, for example given the following JSON file: -[source,json] ----- +```json { "field": "value", "status": 200, @@ -107,56 +102,50 @@ In cases where the array of data you want to ingest is not necessarily in the ro ] } } ----- +``` The following is an example of the Ruby code to ingest the documents in the JSON above: -[source,ruby] ----- +```ruby bulk_helper.ingest_json(file_path, { keys: ['data', 'items'] }) ----- +``` + -[discrete] -==== Scroll helper +## Scroll helper [_scroll_helper] This helper provides an easy way to get results from a Scroll. To use the ScrollHelper, require it in your code: -[source,ruby] ----- +```ruby require 'elasticsearch/helpers/scroll_helper' ----- +``` Instantiate a ScrollHelper with a client, an index, and a body (with the scroll API parameters) which will be used in every following scroll request: -[source,ruby] ----- +```ruby client = Elasticsearch::Client.new scroll_helper = Elasticsearch::Helpers::ScrollHelper.new(client, index, body) ----- +``` There are two ways to get the results from a scroll using the helper. 1. You can iterate over a scroll using the methods in `Enumerable` such as `each` and `map`: -+ --- -[source,ruby] ----- -scroll_helper.each do |item| - puts item -end ----- --- + + ```ruby + scroll_helper.each do |item| + puts item + end + ``` + 2. You can fetch results by page, with the `results` function: -+ --- -[source,ruby] ----- -my_documents = [] -while !(documents = scroll_helper.results).empty? - my_documents << documents -end -scroll_helper.clear ----- --- + + ```ruby + my_documents = [] + while !(documents = scroll_helper.results).empty? + my_documents << documents + end + scroll_helper.clear + ``` + + diff --git a/docs/model.asciidoc b/docs/reference/activemodel_activerecord.md similarity index 55% rename from docs/model.asciidoc rename to docs/reference/activemodel_activerecord.md index 8f4da31f7c..8a143def32 100644 --- a/docs/model.asciidoc +++ b/docs/reference/activemodel_activerecord.md @@ -1,16 +1,16 @@ -[[activemodel_activerecord]] -=== ActiveModel / ActiveRecord +--- +mapped_pages: + - https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/activemodel_activerecord.html +--- -The `elasticsearch-model` http://rubygems.org/gems/elasticsearch-model[Rubygem] -provides integration with Ruby domain objects ("models"), commonly found for -example, in Ruby on Rails applications. +# ActiveModel / ActiveRecord [activemodel_activerecord] -It uses the `elasticsearch` Rubygem as the client communicating with the {es} -cluster. +The `elasticsearch-model` [Rubygem](http://rubygems.org/gems/elasticsearch-model) provides integration with Ruby domain objects ("models"), commonly found for example, in Ruby on Rails applications. +It uses the `elasticsearch` Rubygem as the client communicating with the {{es}} cluster. -[discrete] -==== Features + +## Features [_features_2] * ActiveModel integration with adapters for ActiveRecord and Mongoid * Enumerable-based wrapper for search results @@ -18,44 +18,38 @@ cluster. * Convenience model methods such as `search`, `mapping`, `import`, etc * Support for Kaminari and WillPaginate pagination * Extension implemented via proxy object to shield model namespace from collisions -* Convenience methods for (re)creating the index, setting up mappings, indexing documents, ... +* Convenience methods for (re)creating the index, setting up mappings, indexing documents, …​ -[discrete] -==== Usage +## Usage [_usage] Add the library to your Gemfile: -[source,ruby] ------------------------------------- +```ruby gem 'elasticsearch-rails' ------------------------------------- +``` Include the extension module in your model class: -[source,ruby] ------------------------------------- +```ruby class Article < ActiveRecord::Base include Elasticsearch::Model end ------------------------------------- +``` Import some data and perform a search: -[source,ruby] ------------------------------------- +```ruby Article.import response = Article.search 'fox dog' response.took # => 3 ------------------------------------- +``` -It is possible to either return results as model instances, or decorated -documents from {es}, with the `records` and `results` methods, respectively: +It is possible to either return results as model instances, or decorated documents from {{es}}, with the `records` and `results` methods, respectively: -[source,ruby] ------------------------------------- +```ruby response.records.first # Article Load (0.4ms) SELECT "articles".* FROM "articles" WHERE ... => #<Article id: 3, title: "Foo " ...> @@ -65,8 +59,7 @@ response.results.first._score response.results.first._source.title # => "Quick brown fox" ------------------------------------- +``` + +Consult the [documentation](https://github.com/elastic/elasticsearch-rails/tree/master/elasticsearch-model) for more information. -Consult the -https://github.com/elastic/elasticsearch-rails/tree/master/elasticsearch-model[documentation] -for more information. diff --git a/docs/advanced-config.asciidoc b/docs/reference/advanced-config.md similarity index 55% rename from docs/advanced-config.asciidoc rename to docs/reference/advanced-config.md index 916a8f84c3..a05d51340c 100644 --- a/docs/advanced-config.asciidoc +++ b/docs/reference/advanced-config.md @@ -1,14 +1,16 @@ -[[advanced-config]] -=== Advanced configuration +--- +mapped_pages: + - https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/advanced-config.html +--- -The client supports many configurations options for setting up and managing -connections, configuring logging, customizing the transport library, and so on. +# Advanced configuration [advanced-config] -[discrete] -[[setting-hosts]] -==== Setting hosts +The client supports many configurations options for setting up and managing connections, configuring logging, customizing the transport library, and so on. -To connect to a specific {es} host: + +## Setting hosts [setting-hosts] + +To connect to a specific {{es}} host: ```ruby Elasticsearch::Client.new(host: 'search.myserver.com') @@ -32,12 +34,12 @@ Instead of strings, you can pass host information as an array of Hashes: Elasticsearch::Client.new(hosts: [ { host: 'myhost1', port: 8080 }, { host: 'myhost2', port: 8080 } ]) ``` -NOTE: When specifying multiple hosts, you might want to enable the -`retry_on_failure` or `retry_on_status` options to perform a failed request on -another node (refer to <<retry-failures>>). +::::{note} +When specifying multiple hosts, you might want to enable the `retry_on_failure` or `retry_on_status` options to perform a failed request on another node (refer to [Retrying on Failures](#retry-failures)). +:::: + -Common URL parts – scheme, HTTP authentication credentials, URL prefixes, and so -on – are handled automatically: +Common URL parts – scheme, HTTP authentication credentials, URL prefixes, and so on – are handled automatically: ```ruby Elasticsearch::Client.new(url: 'https://username:password@api.server.org:4430/search') @@ -51,37 +53,25 @@ Elasticsearch::Client.new(urls: 'http://localhost:9200,http://localhost:9201') Another way to configure URLs is to export the `ELASTICSEARCH_URL` variable. -The client is automatically going to use a round-robin algorithm across the -hosts (unless you select or implement a different <<connection-selector>>). +The client is automatically going to use a round-robin algorithm across the hosts (unless you select or implement a different [Connection Selector](#connection-selector)). -[discrete] -[[default-port]] -==== Default port +## Default port [default-port] -The default port is `9200`. Specify a port for your host(s) if they differ from -this default. +The default port is `9200`. Specify a port for your host(s) if they differ from this default. -If you are using Elastic Cloud, the default port is port `9243`. You must supply -your username and password separately, and optionally a port. Refer to -<<auth-ec>>. +If you are using Elastic Cloud, the default port is port `9243`. You must supply your username and password separately, and optionally a port. Refer to [Elastic Cloud](/reference/connecting.md#auth-ec). -[discrete] -[[logging]] -==== Logging +## Logging [logging] -To log requests and responses to standard output with the default logger (an -instance of Ruby's `::Logger` class), set the log argument to true: +To log requests and responses to standard output with the default logger (an instance of Ruby’s `::Logger` class), set the log argument to true: ```ruby Elasticsearch::Client.new(log: true) ``` -You can also use https://github.com/elastic/ecs-logging-ruby[`ecs-logging`] -which is a set of libraries that enables you to transform your application logs -to structured logs that comply with the -https://www.elastic.co/guide/en/ecs/current/ecs-reference.html[Elastic Common Schema]. See <<ecs>>. +You can also use [`ecs-logging`](https://github.com/elastic/ecs-logging-ruby) which is a set of libraries that enables you to transform your application logs to structured logs that comply with the [Elastic Common Schema](ecs://docs/reference/index.md). See [Elastic Common Schema (ECS)](/reference/ecs.md). To trace requests and responses in the Curl format, set the `trace` argument: @@ -91,11 +81,10 @@ Elasticsearch::Client.new(trace: true) You can customize the default logger or tracer: -[source,ruby] ------------------------------------- +```ruby client.transport.logger.formatter = proc { |s, d, p, m| "#{s}: #{m}\n" } client.transport.logger.level = Logger::INFO ------------------------------------- +``` Or, you can use a custom `::Logger` instance: @@ -105,8 +94,7 @@ Elasticsearch::Client.new(logger: Logger.new(STDERR)) You can pass the client any conforming logger implementation: -[source,ruby] ------------------------------------- +```ruby require 'logging' # https://github.com/TwP/logging/ log = Logging.logger['elasticsearch'] @@ -114,60 +102,42 @@ log.add_appenders Logging.appenders.stdout log.level = :info client = Elasticsearch::Client.new(logger: log) ------------------------------------- +``` -[discrete] -[[apm-integration]] -==== APM integration +## APM integration [apm-integration] -This client integrates seamlessly with Elastic APM via the Elastic APM Agent. It -automatically captures client requests if you are using the agent on your code. -If you're using `elastic-apm` v3.8.0 or up, you can set -`capture_elasticsearch_queries` to `true` in `config/elastic_apm.yml` to also -capture the body from requests in {es}. Refer to -https://github.com/elastic/elasticsearch-ruby/tree/main/docs/examples/apm[this example]. +This client integrates seamlessly with Elastic APM via the Elastic APM Agent. It automatically captures client requests if you are using the agent on your code. If you’re using `elastic-apm` v3.8.0 or up, you can set `capture_elasticsearch_queries` to `true` in `config/elastic_apm.yml` to also capture the body from requests in {{es}}. Refer to [this example](https://github.com/elastic/elasticsearch-ruby/tree/main/docs/examples/apm). -[discrete] -[[custom-http-headers]] -==== Custom HTTP Headers +## Custom HTTP Headers [custom-http-headers] -You can set a custom HTTP header on the client's initializer: +You can set a custom HTTP header on the client’s initializer: -[source,ruby] ------------------------------------- +```ruby client = Elasticsearch::Client.new( transport_options: { headers: {user_agent: "My App"} } ) ------------------------------------- +``` -You can also pass in `headers` as a parameter to any of the API Endpoints to set -custom headers for the request: +You can also pass in `headers` as a parameter to any of the API Endpoints to set custom headers for the request: ```ruby client.search(index: 'myindex', q: 'title:test', headers: {user_agent: "My App"}) ``` -[discrete] -[[x-opaque-id]] -==== Identifying running tasks with X-Opaque-Id +## Identifying running tasks with X-Opaque-Id [x-opaque-id] -The X-Opaque-Id header allows to track certain calls, or associate certain tasks -with the client that started them (refer to -https://www.elastic.co/guide/en/elasticsearch/reference/current/tasks.html#_identifying_running_tasks[the documentation]). -To use this feature, you need to set an id for `opaque_id` on the client on each -request. Example: +The X-Opaque-Id header allows to track certain calls, or associate certain tasks with the client that started them (refer to [the documentation](https://www.elastic.co/docs/api/doc/elasticsearch/group/endpoint-tasks)). To use this feature, you need to set an id for `opaque_id` on the client on each request. Example: -[source,ruby] ------------------------------------- +```ruby client = Elasticsearch::Client.new client.search(index: 'myindex', q: 'title:test', opaque_id: '123456') ------------------------------------- +``` The search request includes the following HTTP Header: @@ -175,15 +145,12 @@ The search request includes the following HTTP Header: X-Opaque-Id: 123456 ``` -You can also set a prefix for X-Opaque-Id when initializing the client. This is -prepended to the id you set before each request if you're using X-Opaque-Id. -Example: +You can also set a prefix for X-Opaque-Id when initializing the client. This is prepended to the id you set before each request if you’re using X-Opaque-Id. Example: -[source,ruby] ------------------------------------- +```ruby client = Elasticsearch::Client.new(opaque_id_prefix: 'eu-west1_') client.search(index: 'myindex', q: 'title:test', opaque_id: '123456') ------------------------------------- +``` The request includes the following HTTP Header: @@ -192,12 +159,9 @@ X-Opaque-Id: eu-west1_123456 ``` -[discrete] -[[setting-timeouts]] -==== Setting Timeouts +## Setting Timeouts [setting-timeouts] -For many operations in {es}, the default timeouts of HTTP libraries are too low. -To increase the timeout, you can use the `request_timeout` parameter: +For many operations in {{es}}, the default timeouts of HTTP libraries are too low. To increase the timeout, you can use the `request_timeout` parameter: ```ruby Elasticsearch::Client.new(request_timeout: 5*60) @@ -206,42 +170,30 @@ Elasticsearch::Client.new(request_timeout: 5*60) You can also use the `transport_options` argument documented below. -[discrete] -[[randomizing-hosts]] -==== Randomizing Hosts +## Randomizing Hosts [randomizing-hosts] -If you pass multiple hosts to the client, it rotates across them in a -round-robin fashion by default. When the same client would be running in -multiple processes (for example, in a Ruby web server such as Thin), it might -keep connecting to the same nodes "at once". To prevent this, you can randomize -the hosts collection on initialization and reloading: +If you pass multiple hosts to the client, it rotates across them in a round-robin fashion by default. When the same client would be running in multiple processes (for example, in a Ruby web server such as Thin), it might keep connecting to the same nodes "at once". To prevent this, you can randomize the hosts collection on initialization and reloading: ```ruby Elasticsearch::Client.new(hosts: ['localhost:9200', 'localhost:9201'], randomize_hosts: true) ``` -[discrete] -[[retry-failures]] -==== Retrying on Failures +## Retrying on Failures [retry-failures] -When the client is initialized with multiple hosts, it makes sense to retry a -failed request on a different host: +When the client is initialized with multiple hosts, it makes sense to retry a failed request on a different host: ```ruby Elasticsearch::Client.new(hosts: ['localhost:9200', 'localhost:9201'], retry_on_failure: true) ``` -By default, the client does not retry the request. You can specify how many -times to retry before it raises an exception by passing a number to -`retry_on_failure`: +By default, the client does not retry the request. You can specify how many times to retry before it raises an exception by passing a number to `retry_on_failure`: ```ruby Elasticsearch::Client.new(hosts: ['localhost:9200', 'localhost:9201'], retry_on_failure: 5) ``` -You can also use `retry_on_status` to retry when specific status codes are -returned: +You can also use `retry_on_status` to retry when specific status codes are returned: ```ruby Elasticsearch::Client.new(hosts: ['localhost:9200', 'localhost:9201'], retry_on_status: [502, 503]) @@ -259,23 +211,18 @@ You can also set a `delay_on_retry` value in milliseconds. This will add a delay Elasticsearch::Client.new(hosts: ['localhost:9200', 'localhost:9201'], retry_on_failure: 5, delay_on_retry: 1000) ``` -[discrete] -[[reload-hosts]] -==== Reloading Hosts -{es} dynamically discovers new nodes in the cluster by default. You can leverage -this in the client, and periodically check for new nodes to spread the load. +## Reloading Hosts [reload-hosts] -To retrieve and use the information from the -https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-nodes-info.html[Nodes Info API] -on every 10,000th request: +{{es}} dynamically discovers new nodes in the cluster by default. You can leverage this in the client, and periodically check for new nodes to spread the load. + +To retrieve and use the information from the [Nodes Info API](https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-nodes-info) on every 10,000th request: ```ruby Elasticsearch::Client.new(hosts: ['localhost:9200', 'localhost:9201'], reload_connections: true) ``` -You can pass a specific number of requests after which reloading should be -performed: +You can pass a specific number of requests after which reloading should be performed: ```ruby Elasticsearch::Client.new(hosts: ['localhost:9200', 'localhost:9201'], reload_connections: 1_000) @@ -287,38 +234,34 @@ To reload connections on failures, use: Elasticsearch::Client.new(hosts: ['localhost:9200', 'localhost:9201'], reload_on_failure: true) ``` -The reloading timeouts if not finished under 1 second by default. To change the -setting: +The reloading timeouts if not finished under 1 second by default. To change the setting: ```ruby Elasticsearch::Client.new(hosts: ['localhost:9200', 'localhost:9201'], sniffer_timeout: 3) ``` -NOTE: When using reloading hosts ("sniffing") together with authentication, pass -the scheme, user and password with the host info – or, for more clarity, in the -`http` options: +::::{note} +When using reloading hosts ("sniffing") together with authentication, pass the scheme, user and password with the host info – or, for more clarity, in the `http` options: +:::: + -[source,ruby] ------------------------------------- +```ruby Elasticsearch::Client.new( host: 'localhost:9200', http: { scheme: 'https', user: 'U', password: 'P' }, reload_connections: true, reload_on_failure: true ) ------------------------------------- +``` -[discrete] -[[connection-selector]] -==== Connection Selector +## Connection Selector [connection-selector] By default, the client rotates the connections in a round-robin fashion, using the `Elastic::Transport::Transport::Connections::Selector::RoundRobin` strategy. -You can implement your own strategy to customize the behaviour. For example, let's have a "rack aware" strategy, which prefers the nodes with a specific attribute. The strategy uses the other nodes, only when these are unavailable: +You can implement your own strategy to customize the behaviour. For example, let’s have a "rack aware" strategy, which prefers the nodes with a specific attribute. The strategy uses the other nodes, only when these are unavailable: -[source,ruby] ------------------------------------- +```ruby class RackIdSelector include Elastic::Transport::Transport::Connections::Selector::Base @@ -331,24 +274,19 @@ class RackIdSelector end Elasticsearch::Client.new hosts: ['x1.search.org', 'x2.search.org'], selector_class: RackIdSelector ------------------------------------- +``` -[discrete] -[[serializer-implementations]] -==== Serializer Implementations +## Serializer Implementations [serializer-implementations] -By default, the https://rubygems.org/gems/multi_json[MultiJSON] library is used as the serializer implementation, and it picks up the "right" adapter based on gems available. +By default, the [MultiJSON](https://rubygems.org/gems/multi_json) library is used as the serializer implementation, and it picks up the "right" adapter based on gems available. The serialization component is pluggable, though, so you can write your own by including the `Elastic::Transport::Transport::Serializer::Base` module, implementing the required contract, and passing it to the client as the `serializer_class` or `serializer` parameter. -[discrete] -[[exception-handling]] -==== Exception Handling +## Exception Handling [exception-handling] -The library defines a -https://github.com/elastic/elastic-transport-ruby/blob/main/lib/elastic/transport/transport/errors.rb[number of exception classes] for various client and server errors, as well as unsuccessful HTTP responses, making it possible to rescue specific exceptions with desired granularity. +The library defines a [number of exception classes](https://github.com/elastic/elastic-transport-ruby/blob/main/lib/elastic/transport/transport/errors.rb) for various client and server errors, as well as unsuccessful HTTP responses, making it possible to rescue specific exceptions with desired granularity. The highest-level exception is `Elastic::Transport::Transport::Error` and is raised for any generic client or server errors. @@ -357,3 +295,4 @@ The highest-level exception is `Elastic::Transport::Transport::Error` and is rai As an example for response-specific errors, a 404 response status raises an `Elastic::Transport::Transport::Errors::NotFound` exception. Finally, `Elastic::Transport::Transport::SnifferTimeoutError` is raised when connection reloading ("sniffing") times out. + diff --git a/docs/api.asciidoc b/docs/reference/api.md similarity index 68% rename from docs/api.asciidoc rename to docs/reference/api.md index 85386c8122..261413b45c 100644 --- a/docs/api.asciidoc +++ b/docs/reference/api.md @@ -1,52 +1,49 @@ -[[api]] -=== Elasticsearch API +--- +mapped_pages: + - https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/api.html +--- -The `elasticsearch-api` library provides a Ruby implementation of the https://www.elastic.co/elastic-stack/[Elasticsearch] REST API. +# Elasticsearch API [api] -[discrete] -[[api-install]] -==== Installation +The `elasticsearch-api` library provides a Ruby implementation of the [Elasticsearch](https://www.elastic.co/elastic-stack/) REST API. -Install the package from https://rubygems.org[Rubygems]: -[source,bash] ----------------------------- +## Installation [api-install] + +Install the package from [Rubygems](https://rubygems.org): + +```bash gem install elasticsearch-api ----------------------------- +``` -To use an unreleased version, either add it to your `Gemfile` for https://bundler.io/[Bundler]: +To use an unreleased version, either add it to your `Gemfile` for [Bundler](https://bundler.io/): -[source,bash] ----------------------------- +```bash gem 'elasticsearch-api', git: 'git://github.com/elasticsearch/elasticsearch-ruby.git' ----------------------------- +``` or install it from a source code checkout: -[source,bash] ----------------------------- +```bash git clone https://github.com/elasticsearch/elasticsearch-ruby.git cd elasticsearch-ruby/elasticsearch-api bundle install rake install ----------------------------- +``` + + +## Example usage [api-example-usage] -[discrete] -[[api-example-usage]] -==== Example usage +The library is designed as a group of standalone Ruby modules, which can be mixed into a class providing connection to Elasticsearch — an Elasticsearch client. -The library is designed as a group of standalone Ruby modules, which can be mixed into a class -providing connection to Elasticsearch -- an Elasticsearch client. -[discrete] -===== Usage with the `elasticsearch` gem +### Usage with the `elasticsearch` gem [_usage_with_the_elasticsearch_gem] -**When you use the client from the https://github.com/elasticsearch/elasticsearch-ruby[`elasticsearch-ruby`] client, the library modules have been already included**, so you just call the API methods. +**When you use the client from the [`elasticsearch-ruby`](https://github.com/elasticsearch/elasticsearch-ruby) client, the library modules have been already included**, so you just call the API methods. The response will be an `Elasticsearch::API::Response` object which wraps an `Elasticsearch::Transport::Transport::Response` object. It provides `body`, `status` and `headers` methods, but you can treat is as a hash and access the keys directly. -[source,rb] ----------------------------- +```rb require 'elasticsearch' client = Elasticsearch::Client.new @@ -91,22 +88,21 @@ client.search(index: 'myindex', body: { query: { match: { title: 'test' } } }) "content-encoding"=>"gzip", "content-length"=>"188"}, @status=200>> ----------------------------- +``` -Full documentation and examples are included as RDoc annotations in the source code and available online at <http://rubydoc.info/gems/elasticsearch-api>. +Full documentation and examples are included as RDoc annotations in the source code and available online at [http://rubydoc.info/gems/elasticsearch-api](http://rubydoc.info/gems/elasticsearch-api). -[discrete] -===== Usage with a custom client -When you want to mix the library with your own client, it must conform to the following _contract_: +### Usage with a custom client [_usage_with_a_custom_client] + +When you want to mix the library with your own client, it must conform to the following *contract*: * It responds to a `perform_request(method, path, params, body, headers)` method, * the method returns an object with `status`, `body` and `headers` methods. -A simple client could look like this (_with a dependency on `active_support` to parse the query params_): +A simple client could look like this (*with a dependency on `active_support` to parse the query params*): -[source,rb] ----------------------------- +```rb require 'multi_json' require 'faraday' require 'elasticsearch/api' @@ -151,17 +147,14 @@ p client.cluster.health p client.index(index: 'myindex', id: 'custom', body: { title: "Indexing from my client" }) # --> PUT myindex/mytype/custom {} {:title=>"Indexing from my client"} # => "{"ok":true, ... }" ----------------------------- +``` + -[discrete] -===== Using JSON Builders +### Using JSON Builders [_using_json_builders] -Instead of passing the `:body` argument as a Ruby _Hash_, you can pass it as a _String_, potentially -taking advantage of JSON builders such as https://github.com/rails/jbuilder[JBuilder] or -https://github.com/bsiggelkow/jsonify[Jsonify]: +Instead of passing the `:body` argument as a Ruby *Hash*, you can pass it as a *String*, potentially taking advantage of JSON builders such as [JBuilder](https://github.com/rails/jbuilder) or [Jsonify](https://github.com/bsiggelkow/jsonify): -[source,rb] ----------------------------- +```rb require 'jbuilder' query = Jbuilder.encode do |json| @@ -181,16 +174,14 @@ client.search(index: 'myindex', body: query) # 2013-06-25 09:56:05 +0200: > {"query":{"match":{"title":{"query":"test 1","operator":"and"}}}} # ... # => {"took"=>21, ..., "hits"=>{"total"=>1, "hits"=>[{ "_source"=>{"title"=>"Test 1", ...}}]}} ----------------------------- +``` -[discrete] -===== Using Hash Wrappers -For a more comfortable access to response properties, you may wrap it in one of the _Hash_ "object access" -wrappers, such as https://github.com/intridea/hashie[`Hashie::Mash`]: +### Using Hash Wrappers [_using_hash_wrappers] -[source,rb] ----------------------------- +For a more comfortable access to response properties, you may wrap it in one of the *Hash* "object access" wrappers, such as [`Hashie::Mash`](https://github.com/intridea/hashie): + +```rb require 'hashie' response = client.search( @@ -205,16 +196,15 @@ mash = Hashie::Mash.new(response) mash.hits.hits.first._source.title # => 'Test' ----------------------------- +``` + -[discrete] -===== Using a Custom JSON Serializer +### Using a Custom JSON Serializer [_using_a_custom_json_serializer] -The library uses the https://rubygems.org/gems/multi_json/[MultiJson] gem by default but allows you to set a custom JSON library, provided it uses the standard `load/dump` interface: +The library uses the [MultiJson](https://rubygems.org/gems/multi_json/) gem by default but allows you to set a custom JSON library, provided it uses the standard `load/dump` interface: -[source,rb] ----------------------------- +```rb Elasticsearch::API.settings[:serializer] = JrJackson::Json Elasticsearch::API.serializer.dump({foo: 'bar'}) # => {"foo":"bar"} ----------------------------- +``` diff --git a/docs/reference/basic-config.md b/docs/reference/basic-config.md new file mode 100644 index 0000000000..f7bd47df7a --- /dev/null +++ b/docs/reference/basic-config.md @@ -0,0 +1,37 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/basic-config.html +--- + +# Basic configuration [basic-config] + +The table below contains the most important initialization parameters that you can use. + +| | | | +| --- | --- | --- | +| **Parameter** | **Data type** | **Description** | +| `adapter` | Symbol | A specific adapter for Faraday (for example, `:patron`). | +| `api_key` | String, Hash | For API key Authentication. Either the base64 encoding of `id` and `api_key` joined by a colon as a string, or a hash with the `id` and `api_key` values. | +| `compression` | Boolean | Whether to compress requests. Gzip compression is used. Defaults to `false`. Responses are automatically inflated if they are compressed. If a custom transport object is used, it must handle the request compression and response inflation. | +| `enable_meta_header` | Boolean | Whether to enable sending the meta data header to Cloud. Defaults to `true`. | +| `hosts` | String, Array | Single host passed as a string or hash, or multiple hosts passed as an array; `host` or `url` keys are also valid. | +| `log` | Boolean | Whether to use the default logger. Disabled by default. | +| `logger` | Object | An instance of a Logger-compatible object. | +| `opaque_id_prefix` | String | Sets a prefix for X-Opaque-Id when initializing the client. This is prepended to the id you set before each request if you’re using X-Opaque-Id. | +| `opentelemetry_tracer_provider` | `OpenTelemetry::Trace::TracerProvider` | An explicit TracerProvider to use instead of the global one with OpenTelemetry. This enables better dependency injection and simplifies testing. | +| `randomize_hosts` | Boolean | Whether to shuffle connections on initialization and reload. Defaults to `false`. | +| `reload_connections` | Boolean, Number | Whether to reload connections after X requests. Defaults to `false`. | +| `reload_on_failure` | Boolean | Whether to reload connections after failure. Defaults to `false`. | +| `request_timeout` | Integer | The request timeout to be passed to transport in options. | +| `resurrect_after` | Integer | Specifies after how many seconds a dead connection should be tried again. | +| `retry_on_failure` | Boolean, Number | Whether to retry X times when request fails before raising and exception. Defaults to `false`. | +| `retry_on_status` | Array, Number | Specifies which status code needs to be returned to retry. | +| `selector` | Constant | An instance of selector strategy implemented with {Elastic::Transport::Transport::Connections::Selector::Base}. | +| `send_get_body_as` | String | Specifies the HTTP method to use for GET requests with a body. Defaults to `GET`. | +| `serializer_class` | Constant | Specifies a serializer class to use. It is initialized by the transport and passed the transport instance. | +| `sniffer_timeout` | Integer | Specifies the timeout for reloading connections in seconds. Defaults to `1`. | +| `trace` | Boolean | Whether to use the default tracer. Disabled by default. | +| `tracer` | Object | Specifies an instance of a Logger-compatible object. | +| `transport` | Object | Specifies a transport instance. | +| `transport_class` | Constant | Specifies a transport class to use. It is initialized by the client and passed hosts and all arguments. | +| `transport_options` | Hash | Specifies the options to be passed to the `Faraday::Connection` constructor. | diff --git a/docs/reference/client-helpers.md b/docs/reference/client-helpers.md new file mode 100644 index 0000000000..72220c37b7 --- /dev/null +++ b/docs/reference/client-helpers.md @@ -0,0 +1,14 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/client-helpers.html +--- + +# Client helpers [client-helpers] + +The Ruby client includes the following helpers: + +* [Bulk and Scroll helpers](/reference/Helpers.md) +* [ES|QL](/reference/esql.md) + + + diff --git a/docs/reference/configuration.md b/docs/reference/configuration.md new file mode 100644 index 0000000000..fdebc05c75 --- /dev/null +++ b/docs/reference/configuration.md @@ -0,0 +1,14 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/ruby-config.html +--- + +# Configuration [ruby-config] + +This page contains information about how to configure the Ruby client tailored to your needs. Almost every aspect of the client is configurable. However, in most cases you only need to set a couple of parameters. + +* [Basic configuration](/reference/basic-config.md) +* [Advanced configuration](/reference/advanced-config.md) + + + diff --git a/docs/connecting.asciidoc b/docs/reference/connecting.md similarity index 57% rename from docs/connecting.asciidoc rename to docs/reference/connecting.md index 80e2acba63..8a75793639 100644 --- a/docs/connecting.asciidoc +++ b/docs/reference/connecting.md @@ -1,34 +1,28 @@ -[[connecting]] -== Connecting +--- +mapped_pages: + - https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/connecting.html +--- -This page contains the information you need to connect and use the Client with -{es}. +# Connecting [connecting] -**On this page** +This page contains the information you need to connect and use the Client with {{es}}. -* <<client-auth, Authentication options>> -* <<client-usage, Using the client>> -* <<client-faas, Using the Client in a Function-as-a-Service Environment>> -* <<client-comp, Enabling the Compatibility Mode>> +## Authentication [client-auth] -[discrete] -[[client-auth]] -=== Authentication +This document contains code snippets to show you how to connect to various {{es}} providers. -This document contains code snippets to show you how to connect to various {es} providers. -[discrete] -[[auth-ec]] -==== Elastic Cloud +### Elastic Cloud [auth-ec] -If you are using https://www.elastic.co/cloud[Elastic Cloud], the client offers an easy way to connect to it. You need the Cloud ID that you can find in the cloud console, then your username and password. +If you are using [Elastic Cloud](https://www.elastic.co/cloud), the client offers an easy way to connect to it. You need the Cloud ID that you can find in the cloud console, then your username and password. -image::images/cloud_id.png["Cloud ID"] +:::{image} ../images/cloud_id.png +:alt: Cloud ID +::: Once you have collected the Cloud ID you can use the client to connect to your Elastic Cloud instance, as follows: -[source,ruby] ------------------------------------- +```ruby require 'elasticsearch' client = Elasticsearch::Client.new( @@ -36,55 +30,56 @@ client = Elasticsearch::Client.new( user: '<Username>', password: '<Password>', ) ------------------------------------- +``` You can also connect to the Cloud by using API Key authentication. You can generate an `API key` in the `Management` page under the section `Security`. -image::images/cloud_api_key.png["API key"] +:::{image} ../images/cloud_api_key.png +:alt: API key +::: When you click on `Create API key` you can choose a name and set the other options (eg. restrict privileges, expire after time, etc). -image::images/api_key_name.png["Choose an API name"] +:::{image} ../images/api_key_name.png +:alt: Choose an API name +::: -After this step you will get the `API key` in the API keys page. +After this step you will get the `API key` in the API keys page. -image::images/cloud_api_key.png["API key"] +:::{image} ../images/cloud_api_key.png +:alt: API key +::: **IMPORTANT**: you need to copy and store the `API key` in a secure place, since you will not be able to view it again in Elastic Cloud. -Once you have collected the `Cloud ID` and the `API key` you can use the client -to connect to your Elastic Cloud instance, as follows: +Once you have collected the `Cloud ID` and the `API key` you can use the client to connect to your Elastic Cloud instance, as follows: -[source,ruby] ------------------------------------- +```ruby client = Elasticsearch::Client.new( cloud_id: '<CloudID>', api_key: '<ApiKey>' ) ------------------------------------- +``` If you create the API Key through the dev console or the REST API, you may get instead a pair of `id` and `APIKey` values. The client also accepts a Hash for the `api_key` parameter, so you can pass in these values and it will encode the API Key internally: -[source,ruby] ------------------------------------- +```ruby client = Elasticsearch::Client.new( cloud_id: '<CloudID>', api_key: {id: '<Id>', api_key: '<APIKey>'} ) ------------------------------------- +``` -[discrete] -[[connect-self-managed]] -=== Connecting to a self-managed cluster -{es} 8.0 offers security by default, that means authentication and TLS are enabled. +## Connecting to a self-managed cluster [connect-self-managed] -To connect to the {es} cluster you’ll need to configure the Ruby {es} client to use HTTPS with the generated CA certificate in order to make requests successfully. +{{es}} 8.0 offers security by default, that means authentication and TLS are enabled. -If you’re just getting started with {es} we recommend reading the documentation on configuring and starting {es} to ensure your cluster is running as expected. +To connect to the {{es}} cluster you’ll need to configure the Ruby {{es}} client to use HTTPS with the generated CA certificate in order to make requests successfully. -When you start {es} for the first time you’ll see a distinct block like the one below in the output from {es} (you may have to scroll up if it’s been a while): +If you’re just getting started with {{es}} we recommend reading the documentation on configuring and starting {{es}} to ensure your cluster is running as expected. +When you start {{es}} for the first time you’ll see a distinct block like the one below in the output from {{es}} (you may have to scroll up if it’s been a while): ```sh ---------------------------------------------------------------- @@ -105,31 +100,25 @@ Note down the `elastic` user password and HTTP CA fingerprint for the next secti Depending on the circumstances there are two options for verifying the HTTPS connection, either verifying with the CA certificate itself or via the HTTP CA certificate fingerprint. -[discrete] -[[ca-certificates]] -==== Verifying HTTPS with CA certificates +### Verifying HTTPS with CA certificates [ca-certificates] -The generated root CA certificate can be found in the `certs` directory in your {es} config location (`$ES_CONF_PATH/certs/http_ca.crt`). If you're running {es} in Docker there is https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html[additional documentation for retrieving the CA certificate]. +The generated root CA certificate can be found in the `certs` directory in your {{es}} config location (`$ES_CONF_PATH/certs/http_ca.crt`). If you’re running {{es}} in Docker there is [additional documentation for retrieving the CA certificate](docs-content://deploy-manage/deploy/self-managed/install-elasticsearch-with-docker.md). Once you have the `http_ca.crt` file somewhere accessible pass the path to the client via `ca_certs`: -[source,ruby] ------------------------------------- +```ruby client = Elasticsearch::Client.new( host: "https://elastic:#{ELASTIC_PASSWORD}@localhost:9200", transport_options: { ssl: { ca_path: CERT_DIR } } ) ------------------------------------- +``` -[discrete] -[[ca-fingerprint]] -==== Verifying HTTPS with certificate fingerprints +### Verifying HTTPS with certificate fingerprints [ca-fingerprint] -This method of verifying the HTTPS connection takes advantage of the certificate fingerprint value noted down earlier. Take this SHA256 fingerprint value and pass it to the Ruby {es} client via `ca_fingerprint`: +This method of verifying the HTTPS connection takes advantage of the certificate fingerprint value noted down earlier. Take this SHA256 fingerprint value and pass it to the Ruby {{es}} client via `ca_fingerprint`: -[source,ruby] ------------------------------------- +```ruby # Colons and uppercase/lowercase don't matter when using # the 'ca_fingerprint' parameter CERT_FINGERPRINT = '64F2593F...' @@ -142,77 +131,65 @@ client = Elasticsearch::Client.new( transport_options: { ssl: { verify: false } }, ca_fingerprint: CERT_FINGERPRINT ) ------------------------------------- +``` The verification will be run once per connection. - The certificate fingerprint can be calculated using `openssl x509` with the certificate file: -[source,sh] ----- +```sh openssl x509 -fingerprint -sha256 -noout -in /path/to/http_ca.crt ----- +``` -If you don't have access to the generated CA file from {es} you can use the following script to output the root CA fingerprint of the {es} instance with `openssl s_client`: +If you don’t have access to the generated CA file from {{es}} you can use the following script to output the root CA fingerprint of the {{es}} instance with `openssl s_client`: -[source,sh] ----- +```sh # Replace the values of 'localhost' and '9200' to the # corresponding host and port values for the cluster. openssl s_client -connect localhost:9200 -servername localhost -showcerts </dev/null 2>/dev/null \ | openssl x509 -fingerprint -sha256 -noout -in /dev/stdin ----- +``` The output of `openssl x509` will look something like this: -[source,sh] ----- +```sh SHA256 Fingerprint=A5:2D:D9:35:11:E8:C6:04:5E:21:F1:66:54:B7:7C:9E:E0:F3:4A:EA:26:D9:F4:03:20:B5:31:C4:74:67:62:28 ----- - +``` +### API Key authentication [auth-api-key] -[discrete] -[[auth-api-key]] -==== API Key authentication +You can also use [ApiKey](https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-security-create-api-key) authentication. -You can also use https://www.elastic.co/guide/en/elasticsearch/reference/current/security-api-create-api-key.html[ApiKey] authentication. +::::{note} +If you provide both basic authentication credentials and the ApiKey configuration, the ApiKey takes precedence. +:::: -NOTE: If you provide both basic authentication credentials and the ApiKey configuration, the ApiKey takes precedence. -[source,ruby] ------------------------------------- +```ruby Elasticsearch::Client.new( host: host, transport_options: transport_options, api_key: credentials ) ------------------------------------- +``` -Where credentials is either the base64 encoding of `id` and `api_key` joined by -a colon or a hash with the `id` and `api_key`: +Where credentials is either the base64 encoding of `id` and `api_key` joined by a colon or a hash with the `id` and `api_key`: -[source,ruby] ------------------------------------- +```ruby Elasticsearch::Client.new( host: host, transport_options: transport_options, api_key: {id: 'my_id', api_key: 'my_api_key'} ) ------------------------------------- +``` -[discrete] -[[auth-basic]] -==== Basic authentication +### Basic authentication [auth-basic] -You can pass the authentication credentials, scheme and port in the host -configuration hash: +You can pass the authentication credentials, scheme and port in the host configuration hash: -[source,ruby] ------------------------------------- +```ruby client = Elasticsearch::Client.new( hosts: [ @@ -225,36 +202,31 @@ client = Elasticsearch::Client.new( } ] ) ------------------------------------- +``` Or use the common URL format: -[source,ruby] ------------------------------------- +```ruby client = Elasticsearch::Client.new(url: 'https://username:password@localhost:9200') ------------------------------------- +``` -To pass a custom certificate for SSL peer verification to Faraday-based clients, -use the `transport_options` option: +To pass a custom certificate for SSL peer verification to Faraday-based clients, use the `transport_options` option: -[source,ruby] ------------------------------------- +```ruby Elasticsearch::Client.new( url: 'https://username:password@localhost:9200', transport_options: { ssl: { ca_file: '/path/to/http_ca.crt' } } ) ------------------------------------- +``` + -[discrete] -[[client-usage]] -=== Usage +## Usage [client-usage] The following snippet shows an example of using the Ruby client: -[source,ruby] ------------------------------------- +```ruby require 'elasticsearch' client = Elasticsearch::Client.new log: true @@ -266,20 +238,17 @@ client.index(index: 'my-index', id: 1, body: { title: 'Test' }) client.indices.refresh(index: 'my-index') client.search(index: 'my-index', body: { query: { match: { title: 'test' } } }) ------------------------------------- +``` + +## Using the Client in a Function-as-a-Service Environment [client-faas] -[discrete] -[[client-faas]] -=== Using the Client in a Function-as-a-Service Environment +This section illustrates the best practices for leveraging the {{es}} client in a Function-as-a-Service (FaaS) environment. The most influential optimization is to initialize the client outside of the function, the global scope. This practice does not only improve performance but also enables background functionality as – for example – sniffing. The following examples provide a skeleton for the best practices. -This section illustrates the best practices for leveraging the {es} client in a Function-as-a-Service (FaaS) environment. The most influential optimization is to initialize the client outside of the function, the global scope. This practice does not only improve performance but also enables background functionality as – for example – sniffing. The following examples provide a skeleton for the best practices. -[discrete] -==== GCP Cloud Functions +### GCP Cloud Functions [_gcp_cloud_functions] -[source,ruby] ------------------------------------- +```ruby require 'functions_framework' require 'elasticsearch' @@ -304,13 +273,12 @@ FunctionsFramework.http "hello_world" do |request| } ) end ------------------------------------- +``` -[discrete] -==== AWS Lambda -[source,ruby] ------------------------------------- +### AWS Lambda [_aws_lambda] + +```ruby require 'elasticsearch' def client @@ -336,17 +304,16 @@ def lambda_handler(event:, context:) } ) end ------------------------------------- +``` Resources used to assess these recommendations: -* https://cloud.google.com/functions/docs/bestpractices/tips#use_global_variables_to_reuse_objects_in_future_invocations[GCP Cloud Functions: Tips & Tricks] -* https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html[Best practices for working with AWS Lambda functions] +* [GCP Cloud Functions: Tips & Tricks](https://cloud.google.com/functions/docs/bestpractices/tips#use_global_variables_to_reuse_objects_in_future_invocations) +* [Best practices for working with AWS Lambda functions](https://docs.aws.amazon.com/lambda/latest/dg/best-practices.md) + -[discrete] -[[client-comp]] -=== Enabling the Compatibility Mode +## Enabling the Compatibility Mode [client-comp] The Elasticsearch server version 8.0 is introducing a new compatibility mode that allows you a smoother upgrade experience from 7 to 8. In a nutshell, you can use the latest 7.x Elasticsearch client with an 8.x Elasticsearch server, giving more room to coordinate the upgrade of your codebase to the next major version. -If you want to leverage this functionality, please make sure that you are using the latest 7.x client and set the environment variable `ELASTIC_CLIENT_APIVERSIONING` to `true`. The client is handling the rest internally. For every 8.0 and beyond client, you're all set! The compatibility mode is enabled by default. +If you want to leverage this functionality, please make sure that you are using the latest 7.x client and set the environment variable `ELASTIC_CLIENT_APIVERSIONING` to `true`. The client is handling the rest internally. For every 8.0 and beyond client, you’re all set! The compatibility mode is enabled by default. diff --git a/docs/reference/dsl.md b/docs/reference/dsl.md new file mode 100644 index 0000000000..af686223d1 --- /dev/null +++ b/docs/reference/dsl.md @@ -0,0 +1,11 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/dsl.html +--- + +# Elasticsearch DSL [dsl] + +The [elasticsearch-dsl](https://github.com/elastic/elasticsearch-dsl-ruby) gem provides a Ruby API for the [Elasticsearch Query DSL](https://www.elasticsearch.com/guide/en/elasticsearch/reference/current/query-dsl.md). The library allows to programmatically build complex search definitions for {{es}} in Ruby, which are translated to Hashes, and ultimately, JSON, the language of {{es}}. + +See [the README](https://github.com/elastic/elasticsearch-dsl-ruby#elasticsearchdsl) for more information. + diff --git a/docs/reference/ecs.md b/docs/reference/ecs.md new file mode 100644 index 0000000000..65100ebe4a --- /dev/null +++ b/docs/reference/ecs.md @@ -0,0 +1,37 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/ecs.html +--- + +# Elastic Common Schema (ECS) [ecs] + +The [Elastic Common Schema (ECS)][Elastic Common Schema (ECS)](ecs://docs/reference/index.md)) is an open source format that defines a common set of fields to be used when storing event data like logs in Elasticsearch. + +You can use the library [ecs-logging](https://github.com/elastic/ecs-logging-ruby) which is a set of libraries that enables you to transform your application logs to structured logs that comply with the ECS format. + +Add this line to your application’s Gemfile: + +```ruby +gem 'ecs-logging' +``` + +Then execute `bundle install`. Or install from the command line yourself: + +```ruby +$ gem install ecs-logging +``` + +Then configure the client to use the logger: + +```ruby +require 'ecs_logging/logger' +require 'elasticsearch' + +logger = EcsLogging::Logger.new($stdout) +client = Elasticsearch::Client.new(logger: logger) +> client.info +{"@timestamp":"2022-07-12T05:31:18.590Z","log.level":"INFO","message":"GET http://localhost:9200/ [status:200, request:0.009s, query:n/a]","ecs.version":"1.4.0"}... +``` + +See [ECS Logging Ruby Reference](ecs-logging-ruby://docs/reference/index.md) for more information on how to configure the logger. + diff --git a/docs/helpers/esql.asciidoc b/docs/reference/esql.md similarity index 72% rename from docs/helpers/esql.asciidoc rename to docs/reference/esql.md index 9a310911b5..6fea4bcdd9 100644 --- a/docs/helpers/esql.asciidoc +++ b/docs/reference/esql.md @@ -1,36 +1,29 @@ -[[esql]] -=== ES|QL in the Ruby client -++++ -<titleabbrev>ES|QL</titleabbrev> -++++ +--- +navigation_title: "ES|QL" +mapped_pages: + - https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/esql.html +--- -This page helps you understand and use {ref}/esql.html[ES|QL] in the -Ruby client. +# ES|QL in the Ruby client [esql] + + +This page helps you understand and use [ES|QL](docs-content://explore-analyze/query-filter/languages/esql.md) in the Ruby client. There are two ways to use ES|QL in the Ruby client: -* Use the Elasticsearch {es-docs}/esql-apis.html[ES|QL API] directly: This -is the most flexible approach, but it's also the most complex because you must handle -results in their raw form. You can choose the precise format of results, -such as JSON, CSV, or text. -* Use the Ruby ES|QL helper: The helper maps the raw response to an object that's -more readily usable by your application. +* Use the Elasticsearch [ES|QL API](https://www.elastic.co/docs/api/doc/elasticsearch/group/endpoint-esql) directly: This is the most flexible approach, but it’s also the most complex because you must handle results in their raw form. You can choose the precise format of results, such as JSON, CSV, or text. +* Use the Ruby ES|QL helper: The helper maps the raw response to an object that’s more readily usable by your application. -[discrete] -[[esql-how-to]] -==== ES|QL API +## ES|QL API [esql-how-to] -The {es-docs}/esql-query-api.html[ES|QL query API] allows you to specify how -results should be returned. You can choose a -{es-docs}/esql-rest.html#esql-rest-format[response format] such as CSV, text, or -JSON, then fine-tune it with parameters like column separators and locale. +The [ES|QL query API](https://www.elastic.co/docs/api/doc/elasticsearch/group/endpoint-esql) allows you to specify how results should be returned. You can choose a [response format](docs-content://explore-analyze/query-filter/languages/esql-rest.md#esql-rest-format) such as CSV, text, or JSON, then fine-tune it with parameters like column separators and locale. By default, the `query` API returns a Hash response with `columns` and `values`: -[[esql-query]] -[source,ruby] ----- +$$$esql-query$$$ + +```ruby query = <<ESQL FROM sample_data | EVAL duration_ms = ROUND(event.duration / 1000000.0, 1) @@ -55,29 +48,22 @@ puts response ["2023-10-23T13:53:55.832Z", "172.21.3.15", 5033755, "Connection error", 5.0], ["2023-10-23T13:55:01.543Z", "172.21.3.15", 1756467, "Connected to 10.1.0.1", 1.8] ]} ----- +``` -[discrete] -[[esql-helper]] -==== ES|QL helper +## ES|QL helper [esql-helper] -The ES|QL helper in the Ruby client provides an object response from the ES|QL -query API, instead of the default JSON value. +The ES|QL helper in the Ruby client provides an object response from the ES|QL query API, instead of the default JSON value. To use the ES|QL helper, require it in your code: -[source,ruby] ----- +```ruby require 'elasticsearch/helpers/esql_helper' ----- +``` -The helper returns an array of hashes with the columns as keys and the -respective values. Using the <<esql-query,preceding example>>, the helper returns -the following: +The helper returns an array of hashes with the columns as keys and the respective values. Using the [preceding example](#esql-query), the helper returns the following: -[source,ruby] ----- +```ruby response = Elasticsearch::Helpers::ESQLHelper.query(client, query) puts response @@ -87,15 +73,11 @@ puts response {"duration_ms"=>1.2, "message"=>"Disconnected", "event.duration"=>1232382, "client.ip"=>"172.21.0.5", "@timestamp"=>"2023-10-23T13:33:34.937Z"} {"duration_ms"=>0.7, "message"=>"Connection error", "event.duration"=>725448, "client.ip"=>"172.21.3.15", "@timestamp"=>"2023-10-23T13:51:54.732Z"} {"duration_ms"=>8.3, "message"=>"Connection error", "event.duration"=>8268153, "client.ip"=>"172.21.3.15", "@timestamp"=>"2023-10-23T13:52:55.015Z"} ----- +``` -Additionally, you can transform the data in the response by passing in a Hash -of `column => Proc` values. You could use this for example to convert -'@timestamp' into a DateTime object. Pass in a Hash to `query` as a `parser` -defining a `Proc` for each value you'd like to parse: +Additionally, you can transform the data in the response by passing in a Hash of `column => Proc` values. You could use this for example to convert *@timestamp* into a DateTime object. Pass in a Hash to `query` as a `parser` defining a `Proc` for each value you’d like to parse: -[source,ruby] ----- +```ruby require 'elasticsearch/helpers/esql_helper' parser = { @@ -104,12 +86,11 @@ parser = { response = Elasticsearch::Helpers::ESQLHelper.query(client, query, parser: parser) response.first['@timestamp'] # <DateTime: 2023-10-23T12:15:03+00:00 ((2460241j,44103s,360000000n),+0s,2299161j)> ----- +``` You can pass in as many Procs as there are columns in the response. For example: -[source,ruby] ----- +```ruby parser = { '@timestamp' => Proc.new { |t| DateTime.parse(t) }, 'client.ip' => Proc.new { |i| IPAddr.new(i) }, @@ -125,4 +106,5 @@ puts response {"duration_ms"=>1.2, "message"=>"Disconnected", "event.duration"=>"1232382", "client.ip"=>#<IPAddr: IPv4:172.21.0.5/255.255.255.255>, "@timestamp"=>#<DateTime: 2023-10-23T13:33:34+00:00 ((2460241j,48814s,937000000n),+0s,2299161j)>} {"duration_ms"=>0.7, "message"=>"Connection error", "event.duration"=>"725448", "client.ip"=>#<IPAddr: IPv4:172.21.3.15/255.255.255.255>, "@timestamp"=>#<DateTime: 2023-10-23T13:51:54+00:00 ((2460241j,49914s,732000000n),+0s,2299161j)>} {"duration_ms"=>8.3, "message"=>"Connection error", "event.duration"=>"8268153", "client.ip"=>#<IPAddr: IPv4:172.21.3.15/255.255.255.255>, "@timestamp"=>#<DateTime: 2023-10-23T13:52:55+00:00 ((2460241j,49975s,15000000n),+0s,2299161j)>} ----- +``` + diff --git a/docs/examples.asciidoc b/docs/reference/examples.md similarity index 82% rename from docs/examples.asciidoc rename to docs/reference/examples.md index 22e9619505..75e850cfbc 100644 --- a/docs/examples.asciidoc +++ b/docs/reference/examples.md @@ -1,26 +1,26 @@ -[[examples]] -== Examples +--- +mapped_pages: + - https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/examples.html +--- -Below you can find examples of how to use the most frequently called APIs with -the Ruby client. +# Examples [examples] -* <<ex-index>> -* <<ex-get>> -* <<ex-update>> -* <<ex-delete>> -* <<ex-bulk>> -* <<ex-search>> -* <<ex-multisearch>> -* <<ex-scroll>> -* <<ex-reindex>> +Below you can find examples of how to use the most frequently called APIs with the Ruby client. +* [Indexing a document](#ex-index) +* [Getting a document](#ex-get) +* [Updating a document](#ex-update) +* [Deleting a document](#ex-delete) +* [Bulk requests](#ex-bulk) +* [Searching for a document](#ex-search) +* [Multi search](#ex-multisearch) +* [Scrolling](#ex-scroll) +* [Reindexing](#ex-reindex) -[discrete] -[[ex-index]] -=== Indexing a document -Let's index a document with the following fields: `name`, `author`, -`release_date`, and `page_count`: +## Indexing a document [ex-index] + +Let’s index a document with the following fields: `name`, `author`, `release_date`, and `page_count`: ```ruby body = { @@ -34,9 +34,7 @@ client.index(index: 'books', body: body) ``` -[discrete] -[[ex-get]] -=== Getting a document +## Getting a document [ex-get] You can get a document by ID: @@ -46,9 +44,7 @@ client.get(index: 'books', id: id) ``` -[discrete] -[[ex-update]] -=== Updating a document +## Updating a document [ex-update] Assume you have the following document: @@ -65,9 +61,7 @@ client.update(index: 'books', id: id, body: { doc: { page_count: 225 } }) ``` -[discrete] -[[ex-delete]] -=== Deleting a document +## Deleting a document [ex-delete] You can delete a document by ID: @@ -77,13 +71,9 @@ client.delete(index: 'books', id: id) ``` -[discrete] -[[ex-bulk]] -=== Bulk requests +## Bulk requests [ex-bulk] -The `bulk` operation of the client supports various different formats of the -payload: array of strings, header/data pairs, or the combined format where data -is passed along with the header in a single item in a custom `:data` key. +The `bulk` operation of the client supports various different formats of the payload: array of strings, header/data pairs, or the combined format where data is passed along with the header in a single item in a custom `:data` key. Index several documents in one request: @@ -109,8 +99,7 @@ body = [ client.bulk(body: body) ``` -As mentioned, you can perform several operations in a single request with the -combined format passing data in the `:data` option: +As mentioned, you can perform several operations in a single request with the combined format passing data in the `:data` option: ```ruby body = [ @@ -122,17 +111,13 @@ client.bulk(body: body) ``` -[discrete] -[[ex-search]] -=== Searching for a document +## Searching for a document [ex-search] -This example uses the same data that is used in the -https://www.elastic.co/guide/en/elasticsearch/reference/current/find-structure.html#find-structure-example-nld-json[Find structure API documentation]. +This example uses the same data that is used in the [Find structure API documentation](https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-text-structure-find-structure). First, bulk index it: -[source,ruby] ----- +```ruby body = [ { index: { _index: 'books', data: { name: 'Leviathan Wakes', author: 'James S.A. Corey', release_date: '2011-06-02', page_count: 561 } } }, { index: { _index: 'books', data: { name: 'Hyperion', author: 'Dan Simmons', release_date: '1989-05-26', page_count: 482 } } }, @@ -160,10 +145,9 @@ body = [ { index: { _index: 'books', data: { name: 'The Moon is a Harsh Mistress', author: 'Robert A. Heinlein', release_date: '1966-04-01', page_count: 288 } } } ] client.bulk(body: body) ----- +``` -The `field` parameter is a common parameter, so it can be passed in directly in -the following way: +The `field` parameter is a common parameter, so it can be passed in directly in the following way: ```ruby client.search(index: 'books', q: 'dune') @@ -178,10 +162,10 @@ response['hits']['hits'].count # => 15 ``` -[discrete] -[[ex-multisearch]] -=== Multi search +## Multi search [ex-multisearch] + The following example shows how to perform a multisearch API call on `books` index: + ```ruby body = [ {}, @@ -192,12 +176,10 @@ body = [ client.msearch(index:'books', body: body) ``` -[discrete] -[[ex-scroll]] -=== Scrolling -Submit a search API request that includes an argument for the scroll query -parameter, save the search ID, then print out the book names you found: +## Scrolling [ex-scroll] + +Submit a search API request that includes an argument for the scroll query parameter, save the search ID, then print out the book names you found: ```ruby # Search request with a scroll argument: @@ -214,13 +196,11 @@ end ``` -[discrete] -[[ex-reindex]] -=== Reindexing +## Reindexing [ex-reindex] -The following example shows how to reindex the `books` index into a new index -called `books-reindexed`: +The following example shows how to reindex the `books` index into a new index called `books-reindexed`: ```ruby client.reindex(body: {source: { index: 'books'}, dest: {index: 'books-reindexed' } }) ``` + diff --git a/docs/reference/getting-started.md b/docs/reference/getting-started.md new file mode 100644 index 0000000000..41920656aa --- /dev/null +++ b/docs/reference/getting-started.md @@ -0,0 +1,125 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/getting-started-ruby.html + - https://www.elastic.co/guide/en/serverless/current/elasticsearch-ruby-client-getting-started.html +--- + +# Getting started [getting-started-ruby] + +This page guides you through the installation process of the Ruby client, shows you how to instantiate the client, and how to perform basic Elasticsearch operations with it. + + +### Requirements [_requirements] + +A currently maintained version of Ruby (3.0+) or JRuby (9.3+). + + +### Installation [_installation] + +To install the latest version of the client, run the following command: + +```shell +gem install elasticsearch +``` + +Refer to the [*Installation*](/reference/installation.md) page to learn more. + + +### Connecting [_connecting] + +You can connect to the Elastic Cloud using an API key and the Elasticsearch endpoint. + +```rb +client = Elasticsearch::Client.new( + cloud_id: '<CloudID>', + api_key: '<ApiKey>' +) +``` + +Your Elasticsearch endpoint can be found on the **My deployment** page of your deployment: + +:::{image} ../images/es_endpoint.jpg +:alt: Finding Elasticsearch endpoint +::: + +You can generate an API key on the **Management** page under Security. + +:::{image} ../images/create_api_key.png +:alt: Create API key +::: + +For other connection options, refer to the [*Connecting*](/reference/connecting.md) section. + + +### Operations [_operations] + +Time to use Elasticsearch! This section walks you through the basic, and most important, operations of Elasticsearch. For more operations and more advanced examples, refer to the [*Examples*](/reference/examples.md) page. + + +#### Creating an index [_creating_an_index] + +This is how you create the `my_index` index: + +```rb +client.indices.create(index: 'my_index') +``` + + +#### Indexing documents [_indexing_documents] + +This is a simple way of indexing a document: + +```rb +document = { name: 'elasticsearch-ruby' } +response = client.index(index: 'my_index', body: document) +# You can get the indexed document id with: +response['_id'] +=> "PlgIDYkBWS9Ngdx5IMy-" +id = response['_id'] +``` + + +#### Getting documents [_getting_documents] + +You can get documents by using the following code: + +```rb +client.get(index: 'my_index', id: id) +``` + + +#### Searching documents [_searching_documents] + +This is how you can create a single match query with the Ruby client: + +```rb +client.search(index: 'my_index', body: { query: { match_all: {} } }) +``` + + +#### Updating documents [_updating_documents] + +This is how you can update a document, for example to add a new field: + +```rb +client.update(index: 'my_index', id: id, body: { doc: { language: 'Ruby' } }) +``` + + +#### Deleting documents [_deleting_documents] + +```rb +client.delete(index: 'my_index', id: id) +``` + + +#### Deleting an index [_deleting_an_index] + +```rb +client.indices.delete(index: 'my_index') +``` + + +## Further reading [_further_reading] + +* Use [Bulk and Scroll helpers](/reference/Helpers.md) for a more confortable experience with the APIs. diff --git a/docs/reference/index.md b/docs/reference/index.md new file mode 100644 index 0000000000..088cd04b9b --- /dev/null +++ b/docs/reference/index.md @@ -0,0 +1,40 @@ +--- +mapped_pages: + https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/index.html + - https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/ruby_client.html +--- + +# Ruby [ruby_client] + +The `elasticsearch` [Rubygem](http://rubygems.org/gems/elasticsearch) provides a low-level client for communicating with an {{es}} cluster, fully compatible with other official clients. + +More documentation is hosted in [Github](https://github.com/elastic/elasticsearch-ruby) and [RubyDoc](http://rubydoc.info/gems/elasticsearch). + +Refer to the [*Getting started*](/reference/getting-started.md) page for a step-by-step quick start with the Ruby client. + + +## Features [_features] + +* Pluggable logging and tracing +* Pluggable connection selection strategies (round-robin, random, custom) +* Pluggable transport implementation, customizable and extendable +* Pluggable serializer implementation +* Request retries and dead connections handling +* Node reloading (based on cluster state) on errors or on demand +* Modular API implementation +* 100% REST API coverage + + +## Transport and API [transport-api] + +The `elasticsearch` gem combines two separate Rubygems: + +* [`elastic-transport`](https://github.com/elastic/elastic-transport-ruby/) - provides an HTTP Ruby client for connecting to the {{es}} cluster. Refer to the documentation: [Transport](/reference/transport.md) +* [`elasticsearch-api`](https://github.com/elastic/elasticsearch-ruby/tree/main/elasticsearch-api) - provides a Ruby API for the {{es}} RESTful API. + +Please consult their respective documentation for configuration options and technical details. + +Notably, the documentation and comprehensive examples for all the API methods are contained in the source, and available online at [Rubydoc](http://rubydoc.info/gems/elasticsearch-api/Elasticsearch/API/Actions). + +Keep in mind, that for optimal performance, you should use an HTTP library which supports persistent ("keep-alive") HTTP connections. + diff --git a/docs/reference/installation.md b/docs/reference/installation.md new file mode 100644 index 0000000000..73048cfa0d --- /dev/null +++ b/docs/reference/installation.md @@ -0,0 +1,44 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/ruby-install.html +--- + +# Installation [ruby-install] + +Install the Rubygem for the latest {{es}} version by using the following command: + +```sh +gem install elasticsearch +``` + +Or add the `elasticsearch` Ruby gem to your Gemfile: + +```ruby +gem 'elasticsearch' +``` + +You can install the Ruby gem for a specific {{es}} version by using the following command: + +```sh +gem install elasticsearch -v 7.0.0 +``` + +Or you can add a specific version of {{es}} to your Gemfile: + +```ruby +gem 'elasticsearch', '~> 7.0' +``` + + +## {{es}} and Ruby version compatibility [_es_and_ruby_version_compatibility] + +The {{es}} client is compatible with currently maintained Ruby versions. We follow Ruby’s own maintenance policy and officially support all currently maintained versions per [Ruby Maintenance Branches](https://www.ruby-lang.org/en/downloads/branches/). + +Language clients are forward compatible; meaning that clients support communicating with greater or equal minor versions of {{es}} without breaking. It does not mean that the client automatically supports new features of newer {{es}} versions; it is only possible after a release of a new client version. For example, a 8.12 client version won’t automatically support the new features of the 8.13 version of {{es}}, the 8.13 client version is required for that. {{es}} language clients are only backwards compatible with default distributions and without guarantees made. + +| Gem Version | | {{es}} Version | Supported | +| --- | --- | --- | --- | +| 7.x | → | 7.x | 7.17 | +| 8.x | → | 8.x | 8.x | +| main | → | main | | + diff --git a/docs/reference/integrations.md b/docs/reference/integrations.md new file mode 100644 index 0000000000..2b54bab453 --- /dev/null +++ b/docs/reference/integrations.md @@ -0,0 +1,26 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/integrations.html +--- + +# Integrations [integrations] + +The Rubygems listed on this page make it easier to operate with {{es}} by using the Ruby client. + +* [Transport](/reference/transport.md) +* [Elasticsearch API](/reference/api.md) +* [Using OpenTelemetry](/reference/opentelemetry.md) +* [Elastic Common Schema (ECS)](/reference/ecs.md) +* [ActiveModel / ActiveRecord](/reference/activemodel_activerecord.md) +* [Ruby On Rails](/reference/ruby_on_rails.md) +* [Persistence](/reference/persistence.md) +* [Elasticsearch DSL](/reference/dsl.md) + + + + + + + + + diff --git a/docs/reference/opentelemetry.md b/docs/reference/opentelemetry.md new file mode 100644 index 0000000000..ccc4863a8c --- /dev/null +++ b/docs/reference/opentelemetry.md @@ -0,0 +1,97 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/opentelemetry.html +--- + +# Using OpenTelemetry [opentelemetry] + +You can use [OpenTelemetry](https://opentelemetry.io/) to monitor the performance and behavior of your {{es}} requests through the Ruby Client. The Ruby Client comes with built-in OpenTelemetry instrumentation that emits [distributed tracing spans](docs-content://solutions/observability/apps/traces-2.md) by default. With that, applications [instrumented with OpenTelemetry](https://opentelemetry.io/docs/instrumentation/ruby/manual/) or using the [OpenTelemetry Ruby SDK](https://opentelemetry.io/docs/instrumentation/ruby/automatic/) are inherently enriched with additional spans that contain insightful information about the execution of the {{es}} requests. + +The native instrumentation in the Ruby Client follows the [OpenTelemetry Semantic Conventions for {{es}}](https://opentelemetry.io/docs/specs/semconv/database/elasticsearch/). In particular, the instrumentation in the client covers the logical layer of {{es}} requests. A single span per request is created that is processed by the service through the Ruby Client. The following image shows a trace that records the handling of two different {{es}} requests: a `ping` request and a `search` request. + +:::{image} ../images/otel-waterfall-without-http.png +:alt: Distributed trace with Elasticsearch spans +:class: screenshot +::: + +Usually, OpenTelemetry auto-instrumentation modules come with instrumentation support for HTTP-level communication. In this case, in addition to the logical {{es}} client requests, spans will be captured for the physical HTTP requests emitted by the client. The following image shows a trace with both, {{es}} spans (in blue) and the corresponding HTTP-level spans (in red): + +:::{image} ../images/otel-waterfall-with-http.png +:alt: Distributed trace with Elasticsearch spans +:class: screenshot +::: + +Advanced Ruby Client behavior such as nodes round-robin and request retries are revealed through the combination of logical {{es}} spans and the physical HTTP spans. The following example shows a `search` request in a scenario with two nodes: + +:::{image} ../images/otel-waterfall-retry.png +:alt: Distributed trace with Elasticsearch spans +:class: screenshot +::: + +The first node is unavailable and results in an HTTP error, while the retry to the second node succeeds. Both HTTP requests are subsumed by the logical {{es}} request span (in blue). + + +## Setup the OpenTelemetry instrumentation [_setup_the_opentelemetry_instrumentation] + +When using the [OpenTelemetry Ruby SDK manually](https://opentelemetry.io/docs/instrumentation/ruby/manual) or using the [OpenTelemetry Ruby Auto-Instrumentations](https://opentelemetry.io/docs/instrumentation/ruby/automatic/), the Ruby Client’s OpenTelemetry instrumentation is enabled by default and uses the global OpenTelemetry SDK with the global tracer provider. You can provide a tracer provider via the Ruby Client configuration option `opentelemetry_tracer_provider` when instantiating the client. This is sometimes useful for testing or other specific use cases. + +```ruby +client = Elasticsearch::Client.new( + cloud_id: '<CloudID>', + api_key: '<ApiKey>', + opentelemetry_tracer_provider: tracer_provider +) +``` + + +## Configuring the OpenTelemetry instrumentation [_configuring_the_opentelemetry_instrumentation] + +You can configure the OpenTelemetry instrumentation through Environment Variables. The following configuration options are available. + + +### Enable / Disable the OpenTelemetry instrumentation [opentelemetry-config-enable] + +With this configuration option you can enable (default) or disable the built-in OpenTelemetry instrumentation. + +**Default:** `true` + +| | | +| --- | --- | +| Environment Variable | `OTEL_RUBY_INSTRUMENTATION_ELASTICSEARCH_ENABLED` | + + +### Capture search request bodies [_capture_search_request_bodies] + +Per default, the built-in OpenTelemetry instrumentation does not capture request bodies due to data privacy considerations. You can use this option to enable capturing of search queries from the request bodies of {{es}} search requests in case you wish to gather this information regardless. The options are to capture the raw search query, sanitize the query with a default list of sensitive keys, or not capture it at all. + +**Default:** `omit` + +**Valid Options:** `omit`, `sanitize`, `raw` + +| | | +| --- | --- | +| Environment Variable | `OTEL_RUBY_INSTRUMENTATION_ELASTICSEARCH_CAPTURE_SEARCH_QUERY` | + + +### Sanitize the {{es}} search request body [_sanitize_the_es_search_request_body] + +You can configure the list of keys whose values are redacted when the search query is captured. Values must be comma-separated. Note in v8.3.0 and v8.3.1, the environment variable `OTEL_INSTRUMENTATION_ELASTICSEARCH_CAPTURE_SEARCH_QUERY` was available but is now deprecated in favor of the environment variable including `RUBY`. + +**Default:** `nil` + +| | | +| --- | --- | +| Environment Variable | `OTEL_RUBY_INSTRUMENTATION_ELASTICSEARCH_SEARCH_QUERY_SANITIZE_KEYS` | + +Example: + +```bash +OTEL_RUBY_INSTRUMENTATION_ELASTICSEARCH_SEARCH_QUERY_SANITIZE_KEYS='sensitive-key,other-sensitive-key' +``` + + +## Overhead [_overhead] + +The OpenTelemetry instrumentation (as any other monitoring approach) may come with a slight overhead on CPU, memory, and/or latency. The overhead may only occur when the instrumentation is enabled (default) and an OpenTelemetry SDK is active in the target application. When the instrumentation is disabled or no OpenTelemetry SDK is active within the target application, monitoring overhead is not expected when using the client. + +Even in cases where the instrumentation is enabled and is actively used (by an OpenTelemetry SDK), the overhead is minimal and negligible in the vast majority of cases. In edge cases where there is a noticeable overhead, the [instrumentation can be explicitly disabled](#opentelemetry-config-enable) to eliminate any potential impact on performance. diff --git a/docs/persistence.asciidoc b/docs/reference/persistence.md similarity index 56% rename from docs/persistence.asciidoc rename to docs/reference/persistence.md index 8567a723cf..2bb497a96b 100644 --- a/docs/persistence.asciidoc +++ b/docs/reference/persistence.md @@ -1,42 +1,37 @@ -[[persistence]] -=== Persistence +--- +mapped_pages: + - https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/persistence.html +--- -The `elasticsearch-persistence` -http://rubygems.org/gems/elasticsearch-persistence[Rubygem] provides persistence -layer for Ruby domain objects. +# Persistence [persistence] -It supports the repository design patterns. Versions before 6.0 also supported -the _active record_ design pattern. +The `elasticsearch-persistence` [Rubygem](http://rubygems.org/gems/elasticsearch-persistence) provides persistence layer for Ruby domain objects. +It supports the repository design patterns. Versions before 6.0 also supported the *active record* design pattern. -[discrete] -==== Repository -The `Elasticsearch::Persistence::Repository` module provides an implementation -of the repository pattern and allows to save, delete, find and search objects -stored in {es}, as well as configure mappings and settings for the index. +## Repository [_repository] +The `Elasticsearch::Persistence::Repository` module provides an implementation of the repository pattern and allows to save, delete, find and search objects stored in {{es}}, as well as configure mappings and settings for the index. -[discrete] -===== Features -* Access to the {es} client +### Features [_features_4] + +* Access to the {{es}} client * Setting the index name, document type, and object class for deserialization * Composing mappings and settings for the index * Creating, deleting or refreshing the index * Finding or searching for documents * Providing access both to domain objects and hits for search results -* Providing access to the {es} response for search results +* Providing access to the {{es}} response for search results * Defining the methods for serialization and deserialization -[discrete] -===== Usage +### Usage [_usage_2] -Let's have a simple plain old Ruby object (PORO): +Let’s have a simple plain old Ruby object (PORO): -[source,ruby] ------------------------------------- +```ruby class Note attr_reader :attributes @@ -48,69 +43,58 @@ class Note @attributes end end ------------------------------------- +``` Create a default, "dumb" repository, as a first step: -[source,ruby] ------------------------------------- +```ruby require 'elasticsearch/persistence' class MyRepository; include Elasticsearch::Persistence::Repository; end repository = MyRepository.new ------------------------------------- +``` Save a `Note` instance into the repository: -[source,ruby] ------------------------------------- +```ruby note = Note.new id: 1, text: 'Test' repository.save(note) # PUT http://localhost:9200/repository/_doc/1 [status:201, request:0.210s, query:n/a] # > {"id":1,"text":"Test"} # < {"_index":"repository","_type":"note","_id":"1","_version":1,"created":true} ------------------------------------- +``` Find it: -[source,ruby] ------------------------------------- +```ruby n = repository.find(1) # GET http://localhost:9200/repository/_doc/1 [status:200, request:0.003s, query:n/a] # < {"_index":"repository","_type":"note","_id":"1","_version":2,"found":true, "_source" : {"id":1,"text":"Test"}} => <Note:0x007fcbfc0c4980 @attributes={"id"=>1, "text"=>"Test"}> ------------------------------------- +``` Search for it: -[source,ruby] ------------------------------------- +```ruby repository.search(query: { match: { text: 'test' } }).first # GET http://localhost:9200/repository/_search [status:200, request:0.005s, query:0.002s] # > {"query":{"match":{"text":"test"}}} # < {"took":2, ... "hits":{"total":1, ... "hits":[{ ... "_source" : {"id":1,"text":"Test"}}]}} => <Note:0x007fcbfc1c7b70 @attributes={"id"=>1, "text"=>"Test"}> ------------------------------------- +``` Delete it: -[source,ruby] ------------------------------------- +```ruby repository.delete(note) # DELETE http://localhost:9200/repository/_doc/1 [status:200, request:0.014s, query:n/a] # < {"found":true,"_index":"repository","_type":"note","_id":"1","_version":3} => {"found"=>true, "_index"=>"repository", "_type"=>"note", "_id"=>"1", "_version"=>2} ------------------------------------- +``` + +The repository module provides a number of features and facilities to configure and customize the behaviour, as well as support for extending your own, custom repository class. -The repository module provides a number of features and facilities to configure -and customize the behaviour, as well as support for extending your own, custom -repository class. +Please refer to the [documentation](https://github.com/elastic/elasticsearch-rails/tree/master/elasticsearch-persistence#the-repository-pattern) for more information. -Please refer to the -https://github.com/elastic/elasticsearch-rails/tree/master/elasticsearch-persistence#the-repository-pattern[documentation] -for more information. +Also, check out the [example application](https://github.com/elastic/elasticsearch-rails/tree/master/elasticsearch-persistence#example-application) which demonstrates the usage patterns of the *repository* approach to persistence. -Also, check out the -https://github.com/elastic/elasticsearch-rails/tree/master/elasticsearch-persistence#example-application[example application] -which demonstrates the usage patterns of the _repository_ approach to -persistence. diff --git a/docs/reference/ruby_on_rails.md b/docs/reference/ruby_on_rails.md new file mode 100644 index 0000000000..500fcbb762 --- /dev/null +++ b/docs/reference/ruby_on_rails.md @@ -0,0 +1,23 @@ +--- +mapped_pages: + - https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/ruby_on_rails.html +--- + +# Ruby On Rails [ruby_on_rails] + +The `elasticsearch-rails` [Rubygem](http://rubygems.org/gems/elasticsearch-rails) provides features suitable for Ruby on Rails applications. + + +## Features [_features_3] + +* Rake tasks for importing data from application models +* Integration with Rails' instrumentation framework +* Templates for generating example Rails application + + +## Example applications [_example_applications] + +You can generate a fully working example Ruby on Rails application with templates provides. + +Please refer to the [documentation](https://github.com/elastic/elasticsearch-rails/tree/master/elasticsearch-rails) for more information. + diff --git a/docs/reference/toc.yml b/docs/reference/toc.yml new file mode 100644 index 0000000000..be3fc7f854 --- /dev/null +++ b/docs/reference/toc.yml @@ -0,0 +1,24 @@ +toc: + - file: index.md + - file: getting-started.md + - file: installation.md + - file: connecting.md + - file: configuration.md + children: + - file: basic-config.md + - file: advanced-config.md + - file: integrations.md + children: + - file: transport.md + - file: api.md + - file: opentelemetry.md + - file: ecs.md + - file: activemodel_activerecord.md + - file: ruby_on_rails.md + - file: persistence.md + - file: dsl.md + - file: examples.md + - file: client-helpers.md + children: + - file: Helpers.md + - file: esql.md \ No newline at end of file diff --git a/docs/transport.asciidoc b/docs/reference/transport.md similarity index 57% rename from docs/transport.asciidoc rename to docs/reference/transport.md index b9199b19ed..fa38c71f2d 100644 --- a/docs/transport.asciidoc +++ b/docs/reference/transport.md @@ -1,26 +1,33 @@ -[[transport]] -=== Transport +--- +mapped_pages: + - https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/transport.html +--- -The `elastic-transport` library provides a low-level Ruby client for connecting to an {es} cluster. It currently powers the https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/index.html[Elasticsearch Ruby] and the https://www.elastic.co/guide/en/enterprise-search-clients/ruby/current/index.html[Enterprise Search Ruby] clients. +# Transport [transport] + +The `elastic-transport` library provides a low-level Ruby client for connecting to an {{es}} cluster. It powers the [Elasticsearch Ruby](/reference/index.md) client. When available, it handles connecting to multiple nodes in the cluster, rotating across connections, logging and tracing requests and responses, maintaining failed connections, discovering nodes in the cluster, and provides an abstraction for data serialization and transport. -It does not handle calling the {es} or Enterprise Search APIs. +It does not handle calling the {{es}} APIs. -This library uses https://github.com/lostisland/faraday[Faraday] by default as the HTTP transport implementation. We test it with Faraday versions 1.x and 2.x. +This library uses [Faraday](https://github.com/lostisland/faraday) by default as the HTTP transport implementation. We test it with Faraday versions 1.x and 2.x. -For optimal performance, use a HTTP library which supports persistent ("keep-alive") connections, such as https://github.com/toland/patron[patron] or https://github.com/typhoeus/typhoeus[Typhoeus]. Require the library (`require 'patron'`) in your code for Faraday 1.x or the adapter (`require 'faraday/patron'`) for Faraday 2.x, and it will be automatically used. +For optimal performance, use a HTTP library which supports persistent ("keep-alive") connections, such as [patron](https://github.com/toland/patron) or [Typhoeus](https://github.com/typhoeus/typhoeus). Require the library (`require 'patron'`) in your code for Faraday 1.x or the adapter (`require 'faraday/patron'`) for Faraday 2.x, and it will be automatically used. Currently these libraries are supported: -* https://github.com/toland/patron[Patron] -* https://github.com/typhoeus/typhoeus[Typhoeus] -* https://rubygems.org/gems/httpclient[HTTPClient] -* https://rubygems.org/gems/net-http-persistent[Net::HTTP::Persistent] +* [Patron](https://github.com/toland/patron) +* [Typhoeus](https://github.com/typhoeus/typhoeus) +* [HTTPClient](https://rubygems.org/gems/httpclient) +* [Net::HTTP::Persistent](https://rubygems.org/gems/net-http-persistent) + +::::{note} +Use [Typhoeus](https://github.com/typhoeus/typhoeus) v1.4.0 or up since older versions are not compatible with Faraday 1.0. +:::: -NOTE: Use https://github.com/typhoeus/typhoeus[Typhoeus] v1.4.0 or up since older versions are not compatible with Faraday 1.0. -You can customize Faraday and implement your own HTTP transport. For detailed information, see the example configurations and more information <<transport-implementations,below>>. +You can customize Faraday and implement your own HTTP transport. For detailed information, see the example configurations and more information [below](#transport-implementations). Features overview: @@ -31,87 +38,74 @@ Features overview: * Request retries and dead connections handling * Node reloading (based on cluster state) on errors or on demand -Refer to <<advanced-config,Advanced Configuration>> to read about more configuration options. +Refer to [Advanced Configuration](/reference/advanced-config.md) to read about more configuration options. + -[discrete] -[[transport-install]] -==== Installation +## Installation [transport-install] -Install the package from https://rubygems.org/[Rubygems]: +Install the package from [Rubygems](https://rubygems.org/): -[source,bash] ----------------------------- +```bash gem install elastic-transport ----------------------------- +``` -To use an unreleased version, either add it to your `Gemfile` for -http://gembundler.com/[Bundler]: +To use an unreleased version, either add it to your `Gemfile` for [Bundler](http://gembundler.com/): -[source,bash] ----------------------------- +```bash gem 'elastic-transport', git: 'git@github.com:elastic/elastic-transport-ruby.git' ----------------------------- +``` or install it from a source code checkout: -[source,bash] ----------------------------- +```bash git clone https://github.com/elastic/elastic-transport-ruby.git cd elastic-transport bundle install rake install ----------------------------- +``` -[discrete] -[[transport-example-usage]] -==== Example usage -In the simplest form, connect to {es} running on http://localhost:9200 without any configuration: +## Example usage [transport-example-usage] -[source,rb] ----------------------------- +In the simplest form, connect to {{es}} running on [http://localhost:9200](http://localhost:9200) without any configuration: + +```rb require 'elastic/transport' client = Elastic::Transport::Client.new response = client.perform_request('GET', '_cluster/health') # => #<Elastic::Transport::Transport::Response:0x007fc5d506ce38 @status=200, @body={ ... } > ----------------------------- +``` -Documentation is included as RDoc annotations in the source code and available online at http://rubydoc.info/gems/elastic-transport[RubyDoc]. +Documentation is included as RDoc annotations in the source code and available online at [RubyDoc](http://rubydoc.info/gems/elastic-transport). -[discrete] -[[transport-implementations]] -==== Transport implementations -By default, the client uses the https://rubygems.org/gems/faraday[Faraday] HTTP library as a transport implementation. +## Transport implementations [transport-implementations] -The Client auto-detects and uses an _adapter_ for _Faraday_ based on gems loaded in your code, preferring HTTP clients with support for persistent connections. Faraday 2 changed the way adapters are used (https://github.com/lostisland/faraday/blob/main/UPGRADING.md#adapters-have-moved[read more here]). If you're using Faraday 1.x, you can require the HTTP library. To use the https://github.com/toland/patron[_Patron_] HTTP, for example, require it: +By default, the client uses the [Faraday](https://rubygems.org/gems/faraday) HTTP library as a transport implementation. +The Client auto-detects and uses an *adapter* for *Faraday* based on gems loaded in your code, preferring HTTP clients with support for persistent connections. Faraday 2 changed the way adapters are used ([read more here](https://github.com/lostisland/faraday/blob/main/UPGRADING.md#adapters-have-moved)). If you’re using Faraday 1.x, you can require the HTTP library. To use the [*Patron*](https://github.com/toland/patron) HTTP, for example, require it: -To use the https://github.com/toland/patron[Patron] HTTP, for example, require it: +To use the [Patron](https://github.com/toland/patron) HTTP, for example, require it: -[source,rb] ----------------------------- +```rb require 'patron' ----------------------------- +``` -If you're using Faraday 2.x, you need to add the corresponding adapter gem to your Gemfile and require it after you require `faraday`: +If you’re using Faraday 2.x, you need to add the corresponding adapter gem to your Gemfile and require it after you require `faraday`: -[source,rb] ----------------------------- +```rb # Gemfile gem 'faraday-patron' # Code require 'faraday' require 'faraday/patron' ----------------------------- - +``` Then, create a new client, and the Patron gem will be used as the "driver": -[source,rb] ----------------------------- +```rb client = Elastic::Transport::Client.new client.transport.connections.first.connection.builder.adapter @@ -127,43 +121,39 @@ end # => Stiletoo : 24 # => Stiletoo : 24 # => ... ----------------------------- +``` To use a specific adapter for Faraday, pass it as the `adapter` argument: -[source,rb] ----------------------------- +```rb client = Elastic::Client.new(adapter: :net_http_persistent) client.transport.connections.first.connection.builder.handlers # => [Faraday::Adapter::NetHttpPersistent] ----------------------------- +``` If you see this error: -[source,rb] ----------------------------- +```rb Faraday::Error: :net_http_persistent is not registered on Faraday::Adapter ----------------------------- -When you're using Faraday 2, you need to require the adapter before instantiating the client: +``` -[source,rb] ----------------------------- +When you’re using Faraday 2, you need to require the adapter before instantiating the client: + +```rb > client = Elasticsearch::Client.new(adapter: :net_http_persistent) Faraday::Error: :net_http_persistent is not registered on Faraday::Adapter > require 'faraday/net_http_persistent' => true > client = Elasticsearch::Client.new(adapter: :net_http_persistent) => #<Elasticsearch::Client:0x00007eff2e7728e0 ----------------------------- - +``` -When using the Elasticsearch or Enterprise Search clients, you can pass the `adapter` parameter when initializing the clients. +When using the Elasticsearch client, you can pass the `adapter` parameter when initializing the clients. -To pass options to the https://github.com/lostisland/faraday/blob/master/lib/faraday/connection.rb[`Faraday::Connection`] constructor, use the `transport_options` key: +To pass options to the [`Faraday::Connection`](https://github.com/lostisland/faraday/blob/master/lib/faraday/connection.rb) constructor, use the `transport_options` key: -[source,rb] ----------------------------- +```rb client = Elastic::Client.new( transport_options: { request: { open_timeout: 1 }, @@ -172,26 +162,24 @@ client = Elastic::Client.new( ssl: { verify: false } } ) ----------------------------- +``` To configure the Faraday instance directly, use a block: -[source,rb] ----------------------------- +```rb require 'patron' client = Elastic::Client.new(host: 'localhost', port: '9200') do |f| f.response :logger f.adapter :patron end ----------------------------- +``` You can use any standard Faraday middleware and plugins in the configuration block. -You can also initialize the transport class yourself, and pass it to the client constructor as the `transport` argument. The Elasticsearch and Enterprise Search clients accept `:transport` as parameter when initializing a client. So you can pass in a transport you've initialized with the following options: +You can also initialize the transport class yourself, and pass it to the client constructor as the `transport` argument. The Elasticsearch client accepts `:transport` parameter when initializing a client. So you can pass in a transport you’ve initialized with the following options: -[source,rb] ----------------------------- +```rb require 'patron' transport_configuration = lambda do |f| @@ -207,12 +195,11 @@ transport = Elastic::Transport::Transport::HTTP::Faraday.new( # Pass the transport to the client # client = Elastic::Client.new(transport: transport) ----------------------------- +``` Instead of passing the transport to the constructor, you can inject it at run time: -[source,rb] ----------------------------- +```rb # Set up the transport # faraday_configuration = lambda do |f| @@ -240,12 +227,11 @@ client = Elastic::Client.new # Inject the transport to the client # client.transport = faraday_client ----------------------------- +``` -You can also use a bundled https://rubygems.org/gems/curb[Curb] based transport implementation: +You can also use a bundled [Curb](https://rubygems.org/gems/curb) based transport implementation: -[source,rb] ----------------------------- +```rb require 'curb' require 'elastic/transport/transport/http/curb' @@ -253,32 +239,31 @@ client = Elastic::Client.new(transport_class: Elastic::Transport::Transport::HTT client.transport.connections.first.connection # => #<Curl::Easy http://localhost:9200/> ----------------------------- +``` -It's possible to customize the Curb instance by passing a block to the constructor as well (in this case, as an inline block): +It’s possible to customize the Curb instance by passing a block to the constructor as well (in this case, as an inline block): -[source,rb] ----------------------------- +```rb transport = Elastic::Transport::Transport::HTTP::Curb.new( hosts: [ { host: 'localhost', port: '9200' } ], & lambda { |c| c.verbose = true } ) client = Elastic::Client.new(transport: transport) ----------------------------- +``` You can write your own transport implementation by including the {Elastic::Transport::Transport::Base} module, implementing the required contract, and passing it to the client as the `transport_class` parameter – or by injecting it directly. -[discrete] -[[transport-architecture]] -==== Transport architecture + +## Transport architecture [transport-architecture] * `Elastic::Transport::Client` is composed of `Elastic::Transport::Transport`. * `Elastic::Transport::Transport` is composed of `Elastic::Transport::Transport::Connections`, and an instance of logger, tracer, serializer and sniffer. -* Logger and tracer can be any object conforming to Ruby logging interface, for example, an instance of https://ruby-doc.org/stdlib-1.9.3/libdoc/logger/rdoc/Logger.html[`Logger`], https://rubygems.org/gems/log4r[log4r], https://github.com/TwP/logging/[logging], and so on. -* The `Elastic::Transport::Transport::Serializer::Base` implementations handle converting data for {es} (for example, to JSON). You can implement your own serializer. +* Logger and tracer can be any object conforming to Ruby logging interface, for example, an instance of [`Logger`](https://ruby-doc.org/stdlib-1.9.3/libdoc/logger/rdoc/Logger.md), [log4r](https://rubygems.org/gems/log4r), [logging](https://github.com/TwP/logging/), and so on. +* The `Elastic::Transport::Transport::Serializer::Base` implementations handle converting data for {{es}} (for example, to JSON). You can implement your own serializer. * `Elastic::Transport::Transport::Sniffer` allows to discover nodes in the cluster and use them as connections. * `Elastic::Transport::Transport::Connections::Collection` is composed of `Elastic::Transport::Transport::Connections::Connection` instances and a selector instance. * `Elastic::Transport::Transport::Connections::Connection` contains the connection attributes such as hostname and port, as well as the concrete persistent "session" connected to a specific node. * The `Elastic::Transport::Transport::Connections::Selector::Base` implementations allow to choose connections from the pool, for example, in a round-robin or random fashion. You can implement your own selector strategy. * The `Elastic::Transport::Transport::Response` object wraps the Elasticsearch JSON response. It provides `body`, `status`, and `headers` methods but you can treat it as a hash and access the keys directly. + diff --git a/docs/release-notes/breaking-changes.md b/docs/release-notes/breaking-changes.md new file mode 100644 index 0000000000..fba96055e4 --- /dev/null +++ b/docs/release-notes/breaking-changes.md @@ -0,0 +1,28 @@ +--- +navigation_title: "Elasticsearch Ruby Client" +--- + +# Elasticsearch Ruby Client breaking changes [elasticsearch-ruby-client-breaking-changes] +Before you upgrade, carefully review the Elasticsearch Ruby Client breaking changes and take the necessary steps to mitigate any issues. + +To learn how to upgrade, check out <uprade docs>. + +% ## Next version [elasticsearch-ruby-client-nextversion-breaking-changes] +% **Release date:** Month day, year + +% ::::{dropdown} Title of breaking change +% Description of the breaking change. +% For more information, check [PR #](PR link). +% **Impact**<br> Impact of the breaking change. +% **Action**<br> Steps for mitigating deprecation impact. +% :::: + +% ## 9.0.0 [elasticsearch-ruby-client-900-breaking-changes] +% **Release date:** March 25, 2025 + +% ::::{dropdown} Title of breaking change +% Description of the breaking change. +% For more information, check [PR #](PR link). +% **Impact**<br> Impact of the breaking change. +% **Action**<br> Steps for mitigating deprecation impact. +% :::: \ No newline at end of file diff --git a/docs/release-notes/deprecations.md b/docs/release-notes/deprecations.md new file mode 100644 index 0000000000..4c27fcb8bd --- /dev/null +++ b/docs/release-notes/deprecations.md @@ -0,0 +1,28 @@ +--- +navigation_title: "Elasticsearch Ruby Client" +--- + +# Elasticsearch Ruby Client deprecations [elasticsearch-ruby-client-deprecations] +Review the deprecated functionality for your Elasticsearch Ruby Client version. While deprecations have no immediate impact, we strongly encourage you update your implementation after you upgrade. + +To learn how to upgrade, check out <uprade docs>. + +% ## Next version [elasticsearch-ruby-client-versionnext-deprecations] +% **Release date:** Month day, year + +% ::::{dropdown} Deprecation title +% Description of the deprecation. +% For more information, check [PR #](PR link). +% **Impact**<br> Impact of deprecation. +% **Action**<br> Steps for mitigating deprecation impact. +% :::: + +% ## 9.0.0 [elasticsearch-ruby-client-900-deprecations] +% **Release date:** March 25, 2025 + +% ::::{dropdown} Deprecation title +% Description of the deprecation. +% For more information, check [PR #](PR link). +% **Impact**<br> Impact of deprecation. +% **Action**<br> Steps for mitigating deprecation impact. +% :::: \ No newline at end of file diff --git a/docs/release-notes/index.md b/docs/release-notes/index.md new file mode 100644 index 0000000000..c2d13a705e --- /dev/null +++ b/docs/release-notes/index.md @@ -0,0 +1,27 @@ +--- +navigation_title: "Elasticsearch Ruby Client" +--- + +# Elasticsearch Ruby Client release notes [elasticsearch-ruby-client-release-notes] + +Review the changes, fixes, and more in each version of Elasticsearch Ruby Client. + +To check for security updates, go to [Security announcements for the Elastic stack](https://discuss.elastic.co/c/announcements/security-announcements/31). + +% Release notes include only features, enhancements, and fixes. Add breaking changes, deprecations, and known issues to the applicable release notes sections. + +% ## version.next [elasticsearch-ruby-client-next-release-notes] +% **Release date:** Month day, year + +% ### Features and enhancements [elasticsearch-ruby-client-next-features-enhancements] +% * + +% ### Fixes [elasticsearch-ruby-client-next-fixes] +% * + +## 9.0.0 [elasticsearch-ruby-client-900-release-notes] +**Release date:** March 25, 2025 + +### Features and enhancements [elasticsearch-ruby-client-900-features-enhancements] + +### Fixes [elasticsearch-ruby-client-900-fixes] \ No newline at end of file diff --git a/docs/release-notes/known-issues.md b/docs/release-notes/known-issues.md new file mode 100644 index 0000000000..91ff1765df --- /dev/null +++ b/docs/release-notes/known-issues.md @@ -0,0 +1,20 @@ +--- +navigation_title: "Elasticsearch Ruby Client" + +--- + +# Elasticsearch Ruby Client known issues [elasticsearch-ruby-client-known-issues] + +% Use the following template to add entries to this page. + +% :::{dropdown} Title of known issue +% **Details** +% On [Month/Day/Year], a known issue was discovered that [description of known issue]. + +% **Workaround** +% Workaround description. + +% **Resolved** +% On [Month/Day/Year], this issue was resolved. + +::: \ No newline at end of file diff --git a/docs/release-notes/toc.yml b/docs/release-notes/toc.yml new file mode 100644 index 0000000000..a410067947 --- /dev/null +++ b/docs/release-notes/toc.yml @@ -0,0 +1,5 @@ +toc: + - file: index.md + - file: known-issues.md + - file: breaking-changes.md + - file: deprecations.md \ No newline at end of file diff --git a/docs/release_notes/70.asciidoc b/docs/release_notes/70.asciidoc deleted file mode 100644 index d620366ed9..0000000000 --- a/docs/release_notes/70.asciidoc +++ /dev/null @@ -1,195 +0,0 @@ -[[release_notes_70]] -=== 7.0 Release notes - -This version contains the following changes: - -* Added `elastic_ruby_console` executable. It opens a console with the elasticsearch gems you have installed required. -* Added macro benchmarking framework, available when developing. Use `rake -T` to view all available benchmarking tasks. - - -[discrete] -==== Client - -* Fixed failing integration test -* Updated the Manticore development dependency -* Fixed a failing Manticore unit test -* Removed "turn" and switched the tests to Minitest -* Fixed integration tests for Patron -* Allow passing request headers in `perform_request` -* Added integration test for passing request headers in `perform_request` -* Added, that request headers are printed in trace output, if set -* Fix typos in elasticsearch-transport/README.md -* Assert that connection count is at least previous count when reloaded -* Adjust test for change in default number of shards on ES 7 -* Abstract logging functionality into a Loggable Module (#556) -* Convert client integration tests to rspec -* Add flexible configuration in spec helper -* Use helper methods in spec_helper -* Remove minitest client integration tests in favor of rspec test -* Convert tests to rspec and refactor client -* minor changes to the client specs -* Use pry-nav in development for JRuby -* Keep arguments variable name for now -* Skip round-robin test for now -* Mark test as pending until there is a better way to detect rotating nodes -* Remove client unit test in favor of rspec test -* Comment-out round-robin test as it occasionally passes and pending is ineffective -* Document the default host and port constant -* Add documentation to spec_helper methods -* Redacted password if host info is printed in error message -* Adds tests for not including password in logged error message -* The redacted string change will be in 6.1.1 -* Add more tests for different ways to specify client host argument -* Do not duplicate connections in connection pool after rebuild (#591) -* Ensure that the spec rake task is run as part of integration tests -* Use constant to define Elasticsearch hosts and avoid yellow status when number of nodes is 1 -* Update handling of publish_address in _nodes/http response -* Add another test for hostname/ipv6:port format - - -[discrete] -==== API - -* Added the `wait_for_active_shards` parameter to the "Indices Open" API -* Added the "Indices Split" API -* Added the `wait_for_no_initializing_shards` argument to the "Cluster Health" API -* Added the "Cluster Remote Info" API -* Remove the dependency on "turn" -* Clear cluster transient settings in test setups -* Use `YAML.load_documents` in the REST tests runner -* Removed pinning dependency for Minitest -* Replaced the testing framework from Test::Unit to Minites and improved test output -* Added, that trace logs are printed when the `TRACE` environment variable is set -* Removed the "turn" dependency from generated test_helper.rb -* Update the "Delete By Query" API to support :slices -* Speed up `Elasticsearch::API::Utils.__listify` -* Speed up `Elasticsearch::API::Utils.__pathify` -* Use "String#strip" and "String.empty?" in `Utils.__pathify` -* Updated the inline documentation for using scripts in the "Update" API -* Updated the "Scroll" API inline example with passing the scroll ID in the body -* Marked the `percolate` method as deprecated and added an example for current percolator -* Fixed, that `Utils.__report_unsupported_parameters` and `Utils.__report_unsupported_method` use `Kernel.warn` so they can be suppressed -* Fixed the "greedy" regex in the `Utils.__rescue_from_not_found` method -* Fixed the incorrect `create` method -* Allow passing headers in `perform_request` -* Set application/x-ndjson content type on Bulk and Msearch requests -* Update the Reindex API to support :slices -* Fixed and improved the YAML tests runner -* Added the `include_type_name` parameter to APIs -* Fixed the helper for unit tests -* Removed the requirement for passing the `type` parameter to APIs -* Removed dead code from the YAML tests runner -* Fixed the `api:code:generate` Thor task -* Add copy_settings as valid param to split API -* Port api/actions tests to rspec (#543) -* Update tests to not require type -* Account for escape_utils not being available for JRuby -* Add nodes/reload_secure_settings endpoint support (#546) -* Add new params for search and msearch API -* Retrieve stashed variable if referenced in test -* Convert cat API tests to rspec -* Convert cluster API tests to rspec -* Convert indices tests to rspec -* Fix documentation of #indices.analyze -* Avoid instantiating an array of valid params for each request, each time it is called (#550) -* Add headers to custom client documentation (#527) -* Fix typos in README -* Minor update to scroll documentation example -* Convert snapshot, ingest, tasks, nodes api tests to rspec -* Update source_includes and source_excludes params names for mget -* Update source_includes and source_excludes params names for get, search, bulk, explain -* Update source_includes and source_excludes params names for get_source -* Mark _search endpoint as deprecated -* Link to 6.0 documentation explicitly for _suggest deprecation -* Update documentation for msearch -* Update documentation for scroll_id to be in body of scroll endpoint -* Remove reference to deprecated format option for _analyze endpoint -* Correct endpoints used for get and put search template -* Fix minor typo -* Note that a non-empty body argument is required for the bulk api -* Add note about empty body in yard documentation -* Support if_primary_term param on index API -* Delete test2 template in between tests in case a test is not cleanup up properly -* Support ignore_throttled option on search API -* Updates for types removal changes -* Add missing update param -* Add missing params to methods -* Support if_primary_term param for delete -* Delete an index and index template not cleaned up after in rest api tests -* Update supported params for cat API endpoints -* Update supported params for cluster API endpoints -* Update supported params for indices API endpoints -* Update supported params for ingest API endpoints -* Update supported params for nodes API endpoints -* Update supported params for snapshot API endpoints -* Update missed node API endpoints -* Update missed tasks API endpoints -* Update top-level api endpoints -* Adjust specs and code after test failures -* Fix accidental overwrite of index code -* Add missing param in cat/thread_pool -* The type argument is not required in the index method -* Delete 'nomatch' template to account for lack of test cleanup -* Ensure that the :index param is supported for cat.segments -* Ensure that the :name param is passed to the templates API - -[discrete] -==== DSL - -* Add inner_hits option support for has_parent query -* Add inner_hits option support for has_child query -* Add inner_hits option support for has_parent filter -* Add inner_hits option support for has_child filter -* adds query support for nested queries in filter context (#531) -* Convert aggregations/pipeline tests to rspec (#564) -* Convert aggregations tests to rspec (#566) -* Convert filters tests to rspec (#567) -* Fix bug in applying no_match_filter to indices filter -* Update test for current elasticsearch version -* Fix integration tests for join field syntax -* Update agg scripted metric test for deprecation in ES issue #29328 -* Fix script in update for #29328 -* minor: fix spacing -* Convert queries tests to rspec (#569) -* Add inner_hits test after cherry-picking rspec conversion -* Remove tests already converted to rspec -* spec directory structure should mirror code directory structure -* Support query_string type option -* Ensure that filters are registered when called on bool queries (#609) -* Don't specify a type when creating mappings in tests - - -[discrete] -==== X-Pack - -* Embedded the source code for the `elasticsearch-xpack` Rubygem -* Fixed the `setup` for YAML integration tests -* Added missing X-Pack APIs -* Improved the YAML integration test runner -* Updated the Rakefile for running integration tests -* Added, that password for Elasticsearch is generated -* Fixed the Watcher example -* Updated the README -* Added gitignore for the `elasticsearch-xpack` Rubygem -* Add ruby-prof as a development dependency -* Handle multiple roles passed to get_role_mapping -* Minor updates to xpack api methods (#586) -* Support freeze and unfreeze APIs -* Rewrite xpack rest api yaml test handler (#585) -* Updates to take into account SSL settings -* Fix mistake in testing version range so test can be skipped -* Support set_upgrade_mode machine learning API -* Support typed_keys and rest_total_hits_as_int params for rollup_search -* Improve string output for xpack rest api tests -* Fix logic in version checking -* Support if_seq_no and if_primary_term in put_watch -* Don't test execute_watch/60_http_input because of possible Docker issue -* Support api key methods -* Fix minor typo in test description -* Fix issue with replacing argument value with an Integer value -* Support transform_and_set in yaml tests -* Skip two more tests -* Run security tests against elasticsearch 7.0.0-rc2 -* Account for error when forecast_id is not provided and legacy path is used -* Blacklist specific tests, not the whole file -* Fix version check for skipping test \ No newline at end of file diff --git a/docs/release_notes/710.asciidoc b/docs/release_notes/710.asciidoc deleted file mode 100644 index 9751bf2026..0000000000 --- a/docs/release_notes/710.asciidoc +++ /dev/null @@ -1,62 +0,0 @@ -[[release_notes_710]] -=== 7.10 Release notes - -[discrete] -[[release_notes_7101]] -=== 7.10.1 Release notes -[discrete] -==== Client - -- Updates for connecting with Cloud. - -[discrete] -[[release_notes_7100]] -=== 7.10 Release notes - -[discrete] -==== Client - -- Support for Elasticsearch version `7.10.0`. -- Fixes a bug when building the complete endpoint URL could end with duplicate slashes `//`. -- Fixes a bug when building the complete endpoint URL with cloud id could end with duplicate ports https://github.com/elastic/elasticsearch-ruby/issues/1081[#1081]. - -[discrete] -==== API - -- Fix in RubyDoc comments, some parameters were being duplicated. -- Deprecation notice: Synced flush (`indices.flush_synced`) is deprecated and will be removed in 8.0. Use flush instead. - -[discrete] -===== New API Endpoints - -- `snapshot.clone` - - -[discrete] -===== API Changes - -- `bulk`, `index`, `update`: new parameter `require_alias` (boolean): When true, requires destination to be an alias (default: false) for `index` and `update`. For `bulk` it sets `require_alias` for all incoming documents. Defaults to unset (false). - - -[discrete] -==== X-Pack - -Deprecation notice: `searchable_snapshots.repository_stats` is deprecated and is replaced by the Repositories Metering API. - -[discrete] -===== New API Endpoints - -- `close_point_in_time` -- `open_point_in_time` -- `security.clear_api_key_cache` -- `security.grant_api_key` - -[discrete] -===== API Changes - -- `cat.ml_datafeeds`, `cat.ml_jobs`, `machine_learning.close_job`, `machine_learning.get_datafeed_stats`, `machine_learning.get_datafeeds`, `machine_learning.get_job_stats`, `machine_learning.get_jobs`, `machine_learning.get_overall_buckets`, `machine_learning.stop_datafeed`: new parameter `allow_no_match` (boolean): Whether to ignore if a wildcard expression matches no datafeeds (this includes `_all` string or when no datafeeds have been specified). --`machine_learning.get_data_frame_analytics`: new parameter `verbose` (boolean), whether the stats response should be verbose. -- `machine_learning.get_trained_models`: new parameter `include` (string), a comma-separate list of fields to optionally include. Valid options are 'definition' and 'total_feature_importance'. Default is none. -- `machine_learning.stop_datafeed`: endpoint now accepts a `body`: the URL params optionally sent in the body. -- `security.get_role`, `security/get_role_mapping`: The name parameter is now a comma-separated list of role-mapping names. -- `machine_learning.delete_trained_model`, `machine_learning.get_trained_models`, `machine_learning.get_trained_models_stats`, `machine_learning.put_trained_model`: Internal change, url changed from `_ml/inference` to `_ml/trained_models`. diff --git a/docs/release_notes/711.asciidoc b/docs/release_notes/711.asciidoc deleted file mode 100644 index 9df6f1ba1f..0000000000 --- a/docs/release_notes/711.asciidoc +++ /dev/null @@ -1,49 +0,0 @@ -[[release_notes_711]] -=== 7.11 Release notes - -[discrete] -[[release_notes_7112]] -=== 7.11.2 Release notes - -[discrete] -==== Client - -* Bug fix in meta header, fixes fail when http adapter library hasn't been loaded yet: https://github.com/elastic/elasticsearch-ruby/issues/1224[Issue]. - -[discrete] -[[release_notes_7111]] -=== 7.11.1 Release notes - -[discrete] -==== Client - -* Bug fix in meta header, adds support for unknown Faraday adapters. https://github.com/elastic/elasticsearch-ruby/pull/1204[Pull Request]. - -[discrete] -[[release_notes_7110]] -=== 7.11.0 Release notes - -[discrete] -==== Client - -- Support for Elasticsearch version `7.11.0`. -- Fixes a bug with headers in our default Faraday class. https://github.com/elastic/elasticsearch-ruby/commit/9c4afc452467cc6344359b54b98bbe5af1469219[Commit]. -- Adds the `X-Elastic-Client-Meta` HTTP header which is used by Elastic Cloud and can be disabled with the `enable_meta_header` parameter set to `false`. - - -[discrete] -==== API - -- `cat.tasks` - Parameter `node_id` changes name to `nodes`, a comma-separated list of node IDS or names. Parameter `parent_task` changes name to `parent_task_id`. -- APIs that are no longer experimental: `cluster.delete_component_template`, `cluster.exists_component_template`, `cluster.get_component_template`, `cluster.put_component_template`, `indices.delete_index_template`, `indices.exists_index_template`, `indices.get_index_template`, `indices.put_index_template`, `indices.simulate_index_template`, `indices.simulate_template`. -- Deprecation notice: The _upgrade API is no longer useful and will be removed. Instead, see `_reindex API`. Deprecated since version 8.0.0. Endpoints: `indices.get_upgrade`, `indices.upgrade` - -[discrete] -==== X-Pack - -- New endpoints:`async_search.status`, `autoscaling.get_autoscaling_capacity` (experimental), `indices.migrate_to_data_stream`, `indices.promote_data_stream`, `machine_learning.upgrade_job_snapshot`, `rollup.rollup`, `watcher.query_watches`. -- APIs that are no longer experimental: `eql.delete`, `eql.get`, `eql.search`, -- APIs promoted from experimental to beta: `machine_learning.delete_data_frame_analytics`, `ml.delete_trained_model`, `machine_learning.evaluate_data_frame`, `machine_learning.explain_data_frame_analytics`, `machine_learning.get_data_frame_analytics`, `machine_learning.get_datafeed_stats`, `machine_learning.get_trained_models`, `machine_learning.get_trained_models_stats`, `machine_learning.put_data_frame_analytics`, `machine_learning.put_trained_model`, `machine_learning.start_data_frame_analytics`, `machine_learning.stop_data_frame_analytics`, `machine_learning.update_data_frame_analytics` -- `indices.delete_data_stream`, `indices.get_data_stream` add parameter `expand_wildcards`, wether wildcard expressions should get expanded to open or closed indices (default: open). Options: open, closed, hidden, none, all. -- `machine_learning.get_data_frame_analytics`, `machine_learning.get_datafeeds`, `machine_learning.get_jobs`, `machine_learning.get_trained_models`, `transform.get_transform` add parameter `exclude_generated` - omits fields that are illegal to set on PUT. -- `data_frame_transform_deprecated.get_transform` (_data_frame/transforms/ is deprecated, use _transform/ in the future) adds parameter `exclude_generated` - omits generated files. diff --git a/docs/release_notes/712.asciidoc b/docs/release_notes/712.asciidoc deleted file mode 100644 index c23f8c560c..0000000000 --- a/docs/release_notes/712.asciidoc +++ /dev/null @@ -1,28 +0,0 @@ -[[release_notes_712]] -=== 7.12 Release notes - -[discrete] -==== Client - -- Support for Elasticsearch version 7.12.0 -- Ruby 3 is now tested, it was added to the entire test suite. -- New official documentation pages for configuration: https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/basic-config.html[Basic Configuration] and https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/advanced-config.html[Advanced Configuration]. -- Integration tests runner refactored to keep skipped tests in a yaml file. - -[discrete] -==== API - -- New API namespace: `features` and endpoints `features.get_features` and `snapshot.get_features`. -- `cat.plugins` adds parameter `include_bootstrap`: Include bootstrap plugins in the response. -- Update in `indices.close` parameter `wait_for_active_shards`: Sets the number of active shards to wait for before the operation returns. Set to `index-setting` to wait according to the index setting `index.write.wait_for_active_shards`, or `all` to wait for all shards, or an integer. Defaults to `0`. -- `actions.search` adds parameter `min_compatible_shard_node`: The minimum compatible version that all shards involved in search should have for this request to be successful. - -[discrete] -==== X-Pack - -- New API namespace: `text_structure` and endpoints `text_structure.find_structure`. -- New API namespace: `logstash` and endpoints `logstash.delete_pipeline`, `logstash.get_pipeline`, `logstash.put_pipeline`. -- New API: `eql.get_status`. -- APIs migrated from experimental to stable: `autoscaling.delete_autoscaling_policy`, `autoscaling.get_autoscaling_capacity`, `autoscaling.get_autoscaling_policy`, `autoscaling.put_autoscaling_policy`. -- `searchable_snapshots.mount` adds parameter `storage`: Selects the kind of local storage used to accelerate searches. Experimental, and defaults to `full_copy`. -- `searchable_snapshots.stats` adds parameter `level`: Return stats aggregated at cluster, index or shard level (options: cluster, indices, shards). diff --git a/docs/release_notes/713.asciidoc b/docs/release_notes/713.asciidoc deleted file mode 100644 index 47594bdd12..0000000000 --- a/docs/release_notes/713.asciidoc +++ /dev/null @@ -1,53 +0,0 @@ -[[release_notes_713]] -=== 7.13 Release notes - -[discrete] -[[release_notes_7133]] -=== 7.13.3 Release notes - -- API Support for Elasticsearch version 7.13.3 - -[discrete] -[[release_notes_7132]] -=== 7.13.2 Release notes - -- Mute release, yanked from RubyGems. - -[discrete] -[[release_notes_7131]] -=== 7.13.1 Release notes - -[discrete] -==== Client -- Fixes thread safety issue in `get_connection` - https://github.com/elastic/elasticsearch-ruby/pull/1325[Pull Request]. - -[discrete] -[[release_notes_7130]] -=== 7.13.0 Release notes - -[discrete] -==== Client - -- Support for Elasticsearch version 7.13.0 -- Adds support for compatibility header for Elasticsearch. If the environment variable 'ELASTIC_CLIENT_APIVERSIONING' is set to `true` or `1`, the client will send the headers `Accept` and `Content-Type` with the following value: `application/vnd.elasticsearch+json;compatible-with=7`. -- Better detection of Elasticsearch and Enterprise Search clients in the meta header used by cloud. - -[discrete] -==== API - -- The REST API tests now use an artifact downloaded from the Elastic servers instead of depending of cloning `elasticsearch` locally. Check the README for more information. -- New parameter `include_unloaded_segments` in `cat.nodes`, `nodes.stats`: If set to true segment stats will include stats for segments that are not currently loaded into memory -- New parameter `summary` in `ingest.get_pipeline`: Return pipelines without their definitions (default: false) -- New parameter `index_details` in `snapshot.get`: Whether to include details of each index in the snapshot, if those details are available. Defaults to false. -- New endpoint `features.reset_features`, `ingest/geo_ip_stats` -- New experimental endpoints: `shutdown.delete_node`, `shutdown.get_node`, `shutdown.put_node`. - -[discrete] -==== X-Pack - -- Refactored test tasks, made it easier to run the tests by default. -- New experimental endpoints: `fleet.global_checkpoints`, `searchable_snapshots.cache_stats`. -- New beta endpoints: `security.clear_cached_service_tokens`, `security.create_service_token`, `security.delete_service_token`, `security.get_service_accounts`, `security.get_service_credentials` -- New endpoints: `machine_learning.delete_trained_model_alias`, `machine_learning.preview_data_frame_analytics`, `machine_learning.put_trained_model_alias`. -- APIs migrated from experimental or beta to stable: `machine_learning.delete_data_frame_analytics`, `machine_learning.delete_trained_model`, `machine_learning.estimate_model_memory`, `machine_learning.explain_data_frame_analytics`, `machine_learning.get_data_frame_analytics`, `machine_learning.get_data_frame_analytics_stats`, `machine_learning.get_trained_models`, `machine_learning.get_trained_models_stats`, `machine_learning.put_data_frame_analytics`, `machine_learning.put_trained_model`, `machine_learning.start_data_frame_analytics`, `machine_learning.stop_data_frame_analytics`, `machine_learning.update_data_frame_analytics` -- New parameter `body` in `machine_learning.preview_datafeed`: The datafeed config and job config with which to execute the preview. diff --git a/docs/release_notes/714.asciidoc b/docs/release_notes/714.asciidoc deleted file mode 100644 index 5cdf6092cd..0000000000 --- a/docs/release_notes/714.asciidoc +++ /dev/null @@ -1,93 +0,0 @@ -[[release_notes_714]] -=== 7.14 Release notes - -[discrete] -[[release_notes_7141]] -=== 7.14.1 Release notes - -[discrete] -==== Client - - - Fixes for Manticore Implementation: Addresses custom headers on initialization (https://github.com/elastic/elasticsearch-ruby/commit/3732dd4f6de75365460fa99c1cd89668b107ef1c[3732dd4]) and fixes tracing (https://github.com/elastic/elasticsearch-ruby/commit/3c48ebd9a783988d1f71bfb9940459832ccd63e4[3c48ebd]). Related to https://github.com/elastic/elasticsearch-ruby/issues/1426[#1426] and https://github.com/elastic/elasticsearch-ruby/issues/1428[#1428]. - -[discrete] -[[release_notes_7140]] -=== 7.14.0 Release notes - -[discrete] -==== Client - -Added check that client is connected to an Elasticsearch cluster. If the client isn't connected to a supported Elasticsearch cluster the `UnsupportedProductError` exception will be raised. - -This release changes the way in which the transport layer and the client interact. Previously, when using `elasticsearch-transport`, `Elasticsearch::Transport::Client` had a convenient wrapper, so it could be used as `Elasticsearch::Client`. Now, we are decoupling the transport layer from the Elasticsearch client. If you're using the `elasticsearch` gem, not much will change. It will instantiate a new `Elasticsearch::Transport::Client` when you instantiate `Elasticsearch::Client` and the endpoints from `elasticsearch-api` will be available. - -`Elasticsearch::Client` has an `attr_accessor` for the transport instance: - -[source,ruby] ------------------------------------- -> client = Elasticsearch::Client.new -> client.transport.class -=> Elasticsearch::Transport::Client -> client.transport.transport.class -=> Elasticsearch::Transport::Transport::HTTP::Faraday ------------------------------------- - -The interaction with `elasticsearch-api` remains unchanged. You can use the API endpoints just like before: - -[source,ruby] ------------------------------------- -> client.info -=> {"name"=>"instance", - "cluster_name"=>"elasticsearch", - "cluster_uuid"=>"id", - "version"=> - {"number"=>"7.14.0", - ... -}, - "tagline"=>"You Know, for Search"} ------------------------------------- - -Or perform request directly from the client which will return an `Elasticsearch::Transport::Response` object: - -[source,ruby] ------------------------------------- -> client.perform_request('GET', '/') -# This is the same as doing client.transport.perform_request('GET', '/') -=> #<Elasticsearch::Transport::Transport::Response:0x000055c80bf94bc8 - @body= - {"name"=>"instance", - "cluster_name"=>"elasticsearch", - "cluster_uuid"=>"id", - "version"=> - {"number"=>"7.14.0-SNAPSHOT", - ... - }, - "tagline"=>"You Know, for Search"}, - @headers= - {"content-type"=>"application/json; charset=UTF-8", - "content-length"=>"571", - ... - }, - @status=200> ------------------------------------- - -If you have any problems, please report them in https://github.com/elastic/elasticsearch-ruby/issues/1344[this issue]. - -[discrete] -==== API - -Code is now generated from Elastic artifacts instead of checked out code of Elasticsearch. See https://github.com/elastic/elasticsearch-ruby/blob/7.14/elasticsearch-api/utils/README.md#generate[the Generator README] for more info. - -- Endpoints `msearch`, `msearch_template` and `search_template` remove `query_and_fetch` and `dfs_query_and_fetch` options from the `search_type` parameter. -- New parameter `include_repository` in `snapshot.get`: (boolean) Whether to include the repository name in the snapshot info. Defaults to true. - -[discrete] -==== X-Pack - -X-Pack is being deprecated. The first time using `xpack` on the client, a warning will be triggered. Please check https://github.com/elastic/elasticsearch-ruby/issues/1274[this issue] for more information. - - -- New endpoints: `index_lifecycle_management.migrate_to_data_tiers`, `machine_learning.reset_job`, `security.saml_authenticate`, `security.saml_complete_logout`, `security.saml_invalidate`, `security.saml_logout`, `security.saml_prepare_authentication`, `security.saml_service_provider_metadata`, `sql.delete_async`, `sql.get_async`, `sql.get_async_status`, `terms_enum`. -- New experimental endpoints: `machine_learning.infer_trained_model_deployment`, `machine_learning.start_trained_model_deployment`, `machine_learning.stop_trained_model_deployment`. -- Deprecation: `indices.freeze` and `indices.unfreeze`: Frozen indices are deprecated because they provide no benefit given improvements in heap memory utilization. They will be removed in a future release. - diff --git a/docs/release_notes/715.asciidoc b/docs/release_notes/715.asciidoc deleted file mode 100644 index 5962394afe..0000000000 --- a/docs/release_notes/715.asciidoc +++ /dev/null @@ -1,20 +0,0 @@ -[[release_notes_715]] -=== 7.15 Release notes - -[discrete] -==== Client - -- Support for Elasticsearch v7.15.0 APIs. -- We've tested and added documentation on best practices for leveraging the client in a Function-as-a-Service (FaaS) environment to the https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/connecting.html#client-faas[official docs]. - -[discrete] -==== API -- New experimental endpoints: `indices.disk_usage`. `indices.field_usage_stats`, `nodes.clear_repositories_metering_archive`, `get_repositories_metering_info`, https://www.elastic.co/guide/en/elasticsearch/reference/7.15/search-vector-tile-api.html[`search_mvt`] -- The `index` parameter is now required for `open_point_in_time`. -- The `index_metric` parameter in `nodes.stats` adds the `shards` option. - -[discrete] -==== X-Pack - -- New parameters for `ml.put_job`: `ignore_unavailable`, `allow_no_indices`, `ignore_throttled`, `expand_wildcards`. -- New endpoint: https://www.elastic.co/guide/en/elasticsearch/reference/7.15/security-api-query-api-key.html[`security.query_api_keys`]. diff --git a/docs/release_notes/716.asciidoc b/docs/release_notes/716.asciidoc deleted file mode 100644 index 11c1b68ad7..0000000000 --- a/docs/release_notes/716.asciidoc +++ /dev/null @@ -1,96 +0,0 @@ -[[release_notes_716]] -=== 7.16 Release notes - -[discrete] -[[release_notes_7163]] -=== 7.16.3 Release notes - -==== API - -Bugfix for https://github.com/elastic/elasticsearch-ruby/issues/1475[#1475], an issue where if you indexed a document with an id such as `an id`, it would get escaped to `an+id` instead of `an%20id` when using `index` or `create`. This would result in the document id being `an+id` instead of the intended value `an id`. - -[discrete] -[[release_notes_7162]] -=== 7.16.2 Release notes - -No release. - -[discrete] -[[release_notes_7161]] -=== 7.16.1 Release notes - -Patch release corresponding with Elastic Stack version 7.16.1 that addresses the Apache Log4j2 vulnerability, https://discuss.elastic.co/t/apache-log4j2-remote-code-execution-rce-vulnerability-cve-2021-44228-esa-2021-31/291476[more information]. - -==== Client - -The only changes in the client since 7.16.0 are a few minor updates for the https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/current/connecting.html#client-comp[Compatibility mode with 8.0]. We added the compatibility header in `7.13.0`, but now we have integration tests and compatibility tests for version `7.x` of the client with Elasticsearch `8.0`. - -[discrete] -[[release_notes_7160]] -=== 7.16.0 Release notes - -[discrete] -==== Client - -- Adds the `delay_on_retry` parameter, a value in milliseconds to wait between each failed connection, thanks https://github.com/DinoPullerUqido[DinoPullerUqido]! https://github.com/elastic/elasticsearch-ruby/pull/1521[Pull Request] and https://github.com/elastic/elasticsearch-ruby/pull/1523[backport]. -- Adds *CA fingerprinting*. You can configure the client to only trust certificates that are signed by a specific CA certificate (CA certificate pinning) by providing a `ca_fingerprint` option. This will verify that the fingerprint of the CA certificate that has signed the certificate of the server matches the supplied value. The verification will be run once per connection. Code example: - -[source,ruby] ------------------------------------- -ca_fingerprint = '64F2593F...' -client = Elasticsearch::Client.new( - host: 'https://elastic:changeme@localhost:9200', - transport_options: { ssl: { verify: false } }, - ca_fingerprint: ca_fingerprint -) ------------------------------------- - -- Fixes compression. When `compression` is set to `true`, the client will now gzip the request body properly and use the appropiate headers. Thanks https://github.com/johnnyshields[johnnyshields]! https://github.com/elastic/elasticsearch-ruby/pull/1478[Pull Request] and https://github.com/elastic/elasticsearch-ruby/pull/1526[backport]. -- Warnings emitted by Elasticsearch are now logged via `log_warn` through the Loggable interface in the client, instead of using `Kernel.warn`. https://github.com/elastic/elasticsearch-ruby/pull/1517[Pull Request]. - -[discrete] -==== API - -- Cleaned up some deprecated code. -- `count` - The API is documented as using `GET`, but it supports both GET and POST on the Elasticsearch side. So it was updated to only use `POST` when there's a body present, or else use `GET`. Elasticsearch would still accept a body with `GET`, but to be more semantically correct in the clients we use `POST` when there's a body. -- `delete_index_template` was updated to support the `ignore_404` parameter to ignore 404 errors when attempting to delete a non-existing template. -- `ingest.put_pipeline` adds new parameter `if_version`: Required version for optimistic concurrency control for pipeline updates. -- `ml.put_trained_model`: adds new parameter `defer_definition_decompression`: If set to `true` and a `compressed_definition` is provided, the request defers definition decompression and skips relevant validations. -- `nodes.hot_threads` adds new parameter `sort`: The sort order for 'cpu' type (default: total) (options: cpu, total). -- `open_point_in_time`: `keep_alive` is now a required parameter. -- `search_mvt`: adds new parameter `track_total_hits`: Indicate if the number of documents that match the query should be tracked. A number can also be specified, to accurately track the total hit count up to the number. -- `transform.preview_transform`: adds new parameter `transform_id`. Body is now optional and the API will use `GET` or `POST` depending on the presence of a body. - -*APIs promoted from experimental to stable since last version:* - -- `fleet.global_checkpoints` -- `get_script_context` -- `get_script_language` -- `indices.resolve_index` -- `monitoring.bulk` -- `rank_eval` -- `searchable_snapshots.mount` -- `searchable_snapshots.stats` -- `security.clear_cached_service_tokens` -- `security.create_service_token` -- `security.delete_service_token` -- `security.get_service_accounts` -- `security.get_service_credentials` -- `shutdown.delete_node` -- `shutdown.get_node` -- `shutdown.put_node` -- `terms_enum` - -*New APIs* - -- `fleet.mseach` -- `fleet.search` -- `indices.modify_data_stream` -- `ml.infer_trained_model_deployment` -- `ml.start_trained_model_deployment` -- `ml.stop_trained_model_deployment` -- `migration.get_feature_upgrade_status` -- `migration.post_feature_upgrade_status` -- `security.enroll_kibana` -- `security.enroll_node` -- `transform.updgrade_transforms` diff --git a/docs/release_notes/717.asciidoc b/docs/release_notes/717.asciidoc deleted file mode 100644 index 4413dd225a..0000000000 --- a/docs/release_notes/717.asciidoc +++ /dev/null @@ -1,29 +0,0 @@ -[[release_notes_717]] -=== 7.17 Release notes - -[discrete] -[[release_notes_7177]] -=== 7.17.7 Release notes - -- Compatibility with Elasticsearch v7.17.7 APIs. -- Tested versions of Ruby for 7.17.7: Ruby (MRI) 2.6, 2.7, 3.0 and 3.1, JRuby 9.3. - -[discrete] -[[release_notes_7172]] -=== 7.17.2, 7.17.3, 7.17.4, 7.17.5, 7.17.6 Release notes - -No release. - -[discrete] -[[release_notes_7171]] -=== 7.17.1 Release notes - -- Improves handling of YAML parsing, uses `safe_load` instead of `load` when doing the product verification (should only affect Ruby < 3.0). -- Updates headers setup when using the Manticore adapter. This fixes an issue where the user-agent header was being foverridden even when it was being set on initialization via the transport options. https://github.com/elastic/elasticsearch-ruby/pull/1685[Pull Request], https://github.com/elastic/elasticsearch-ruby/issues/1684[issue]. - -[discrete] -[[release_notes_7170]] -=== 7.17.0 Release notes - -- Drops Ruby 2.5 from the test matrix. Support for Ruby 2.5 was dropped March 2021. -- Updates the product verification when the response is a `413` error. diff --git a/docs/release_notes/75.asciidoc b/docs/release_notes/75.asciidoc deleted file mode 100644 index ac874d0cfb..0000000000 --- a/docs/release_notes/75.asciidoc +++ /dev/null @@ -1,59 +0,0 @@ -[[release_notes_75]] -=== 7.5 Release notes - -- Support for Elasticsearch 7.5. -- Update API spec generator: The code for Elasticsearch OSS and X-Pack APIs is being generated from the rest api spec. -- Specs have been updated to address new/deprecated parameters. -- Ruby versions tested: 2.3.8, 2.4.9, 2.5.7, 2.6.5 and 2.7.0 (new). - - -[discrete] -==== API - -Endpoints that changed: - -- `_bulk`: body is now required as an argument. -- `cat`: `local` and `master_timeout` parameters are gone. - - `health`: New parameter `health`. - - `indices`: Adds `time` and `include_unload_segments` parameters. - - `nodes`: Adds `bytes`, `time` parameters. - - `pending_tasks`: Adds `time` parameter. - - `recovery`: Adds `active_only`, `detailed`, `index`, `time` parameters. - - `segments`: Removes `index` parameter and it's now a url part. - - `shards`: Adds `time` parameter. - - `snapshots`: Adds `time` parameter. - - `tasks`: Adds `time` parameter. - - `templates`: The `name` parameter is now passed in as a part but not a parameter. - - `thread_pool`: The `thread_pool_patterns` parameter is now passed in as a part but not as a parameter. -- `cluster` - - `put_settings`: body is required. - - `state`: `index_templates` is gone. - - `node_id` is now a url part. -- `delete` - `parent` parameter is gone. -- `delete_by_query`: `analyzer` parameters are gone, `max_docs` is a new parameter, `body` is now a required parameter. -- `delete_by_query_rethrottle` new endpoint. -- `delete_by_rethrottle` - uses `delete_by_query_rethrottle` and hasn't changed. -- `exists`, `exists_source`, `explain`: `parent` parameter is gone. -- `field_caps`: `fields` param is no longer required. -- `get`: `parent` parameter is gone -- `get_source`: `parent` parameter is gone -- `index`: `body` parameter is required, `wait_for_shard` is a new parameter, `consistency`, `include_type_name`, `parent`, `percolate`, `replication`, `timestamp`, `ttl` parameters are gone -- `indices` - - `get`: `feature` paramatere was deprecated and is gone. - - `delete_aliases`, `put_alias`: URL changed internally to 'aliases' instead of 'alias' but shouldn't affect the client's API. -- `render_search_template`: `id` is now a part not a parameter -- `search`: `fielddata_fields`, `include_type_name`, `fields`, `ignore_indices`, `lowercase_expanded_terms`, `query_cache`, `source` parameters are gone, `ccs_minimize_roundtrips`, `track_scores` are new parameters. -- `tasks` - `list`: task_id is not supported anymore, it's in get now. -- `termvectors`: `parent` parameter is gone. -- `update`: `version` parameter is not supported anymore. - - -[discrete] -==== X-Pack - -Some urls changed internally to remove `_xpack`, but it shouldn't affect the client's API. - -- `explore`: `index` is now required. -- `info`: `human` parameter is gone. -- `migration`: some endpoints are gone: `get_assistance`, `get_assistance_test` and `upgrade_test`. -- `watcher`: `restart` endpoint is gone. diff --git a/docs/release_notes/76.asciidoc b/docs/release_notes/76.asciidoc deleted file mode 100644 index bd546df82f..0000000000 --- a/docs/release_notes/76.asciidoc +++ /dev/null @@ -1,86 +0,0 @@ -[[release_notes_76]] -=== 7.6 Release notes - - -[discrete] -==== Client - -* Support for Elasticsearch version 7.6. -* Last release supporting Ruby 2.4. Ruby 2.4 has reached it's end of life and no more security updates will be provided, users are suggested to update to a newer version of Ruby. - - -[discrete] -===== API Key Support - -The client now supports API Key Authentication, check "Authentication" on the https://github.com/elastic/elasticsearch-ruby/tree/7.x/elasticsearch-transport#authentication[transport README] for information on how to use it. - - -[discrete] -===== X-Opaque-Id Support - -The client now supports identifying running tasks with X-Opaque-Id. Check https://github.com/elastic/elasticsearch-ruby/tree/7.x/elasticsearch-transport#identifying-running-tasks-with-x-opaque-id[transport README] for information on how to use X-Opaque-Id. - - -[discrete] -===== Faraday migrated to 1.0 - -We're now using version 1.0 of Faraday: - -* The client initializer was modified but this should not disrupt final users at all, check this commit for more information. -* Migrated error checking to remove the deprecated Faraday::Error namespace. -* *This change is not compatible with https://github.com/typhoeus/typhoeus[Typhoeus]*. The latest release is 1.3.1, but it's https://github.com/typhoeus/typhoeus/blob/v1.3.1/lib/typhoeus/adapters/faraday.rb#L100[still using the deprecated `Faraday::Error` namespace]. This has been fixed on master, but the last release was November 6, 2018. Version 1.4.0 should be ok once it's released. -* Note: Faraday 1.0 drops official support for JRuby. It installs fine on the tests we run with JRuby in this repo, but it's something we should pay attention to. - -Reference: https://github.com/lostisland/faraday/blob/master/UPGRADING.md[Upgrading - Faraday 1.0] - -https://github.com/elastic/elasticsearch-ruby/pull/808[Pull Request] - - -[discrete] -==== API - - -[discrete] -===== API Changes: - -- `cat.indices`: argument `bytes` options were: `b,k,m,g` and are now `b,k,kb,m,mb,g,gb,t,tb,p,pb`. -- `delete_by_query`: New parameter `analyzer` - The analyzer to use for the query string. -- `indices.put_template`: Removed parameters: `timeout`, `flat_settings`. -- `msearch_template`: New Parameter `ccs_minimize_roundtrips` - Indicates whether network round-trips should be minimized as part of cross-cluster search requests execution. -- `rank_eval`: New parameter `search_type` - Search operation type (options: `query_then_fetch,dfs_query_then_fetch`). -- `search_template`: New parameter `ccs_minimize_roundtrips` - Indicates whether network round-trips should be minimized as part of cross-cluster search requests execution. - - -[discrete] -===== New API endpoints: - -- `get_script_context` -- `get_script_languages` - - -[discrete] -===== Warnings: - -Synced flush is deprecated and will be removed in 8.0. - - -[discrete] -==== X-Pack - - -[discrete] -===== New API endpoints: - -- `ml/delete_trained_model` -- `ml/explain_data_frame_analytics` -- `ml/get_trained_models` -- `ml/get_trained_models_stats` -- `ml/put_trained_model` - - -[discrete] -===== API changes: - -- `license/get`: Added parameter `accept_enterprise`. -- `ml/delete_data_frame_analytics` Added parameter `force`. -- `monitoring/bulk` - Removed parameter `system_version`. \ No newline at end of file diff --git a/docs/release_notes/77.asciidoc b/docs/release_notes/77.asciidoc deleted file mode 100644 index 87f5e1bdbb..0000000000 --- a/docs/release_notes/77.asciidoc +++ /dev/null @@ -1,77 +0,0 @@ -[[release_notes_77]] -=== 7.7 Release notes - -This version drops support for Ruby 2.4 since it's reached it's end of life. - - -[discrete] -==== Client - -- Support for Elasticsearch version `7.7` - - -[discrete] -===== Custom Headers - -You can set custom HTTP headers on the client's initializer or pass them as a parameter to any API endpoint. https://github.com/elastic/elasticsearch-ruby/tree/7.x/elasticsearch-transport#custom-http-headers[More info and code examples]. - - -[discrete] -==== API - - -[discrete] -===== API Changes - -- Clean: Removes up some deprecated endpoints: `abort_benchmark`, `benchmark`, `delete_by_rethrottle`, `nodes.shutdown`, `remote.info`. -- `expand_wildcards` Whether to expand wildcard expressions to concrete indices that are open, closed or both. Options: open, closed, hidden, none, all. `hidden` option is new. It was also added to the following endpoints: `cat.aliases`, `cat.indices`. -- `delete_by_query`: Parameter `slices` can now be set to `auto`. -- `reindex`: Parameter `slices` can now be set to `auto`. -- `update_by_query`: Parameter `slices` can now be set to `auto`. -- `snapshot.cleanup_repository`: Parameter `body` is removed. - - -[discrete] -===== New API Endpoints - -- `cluster.delete_component_template` -- `cluster.get_component_template` -- `cluster.put_component_template` -- `indices.create_data_stream` (experimental) -- `indices.delete_data_stream` (experimental) -- `indices.get_data_stream` (experimental) - - -[discrete] -==== X-Pack - - -[discrete] -===== API Changes - -- `machine_learing.get_trained_models`: New parameter `tags` -- `machine_learning.put_datafeed`, `machine_learning.update_datafeed`: Added parameters `ignore_unavailable`, `allow_no_indices`, `ignore_throttled`, `expand_wildcards` -- `reload_secure_settings`: New parameter `body`, an object containing the password for the keystore. - - -[discrete] -===== New API Endpoints - -- `async_search.delete` -- `async_search.get` -- `async_search.submit` -- `cat.ml_data_frame_analytics` -- `cat.ml_datafeeds` -- `cat.ml_jobs` -- `cat.ml_trained_models` -- `cat.transform` -- `cat.transforms` -- `machine_learning.estimate_model_memory` -- `transform.delete_transform` -- `transform.get_transform` -- `transform.get_transform_stats` -- `transform.preview_transform` -- `transform.put_transform` -- `transform.start_transform` -- `transform.stop_transform` -- `transform.update_transform` \ No newline at end of file diff --git a/docs/release_notes/78.asciidoc b/docs/release_notes/78.asciidoc deleted file mode 100644 index a5d59e985e..0000000000 --- a/docs/release_notes/78.asciidoc +++ /dev/null @@ -1,103 +0,0 @@ -[[release_notes_78]] -=== 7.8 Release notes - -[discrete] -[[release_notes_781]] -=== 7.8.1 Release notes - -[discrete] -==== Client - -- Support for Elasticsearch version `7.8.1`. -- Bug fix: Fixed a bug on the API endpoints documentation for RubyDocs: there was an unnecessary empty new line in the documentation for parameters that have options. So the parameters before that empty newline were not being documented in RubyDocs. - - -[discrete] -==== X-Pack - - -[discrete] -===== API Changes - -- Update to `info` endpoint. New parameter `accept_enterprise` (boolean): If an enterprise license is installed, return the type and mode as 'enterprise' (default: false). - - -[discrete] -[[release_notes_780]] -=== 7.8.0 Release notes - -[discrete] -==== Client - -- Support for Elasticsearch version `7.8`. -- Surface deprecation headers from Elasticsearch. When there's a `warning` response header in Elasticsearch's response, the client will emit a warning with `warn`. -- Typhoeus is supported again, version 1.4+ and has been added back to the docs. -- Adds documentation and example for integrating with Elastic APM. - - -[discrete] -==== API - - -[discrete] -===== New API Endpoints - -- `abort_benchmark` -- `benchmark` -- `cluster.delete_voting_config_exclusions` -- `cluster.post_voting_config_exclusions` -- `delete_by_rethrottle` -- `nodes.shutdown` -- `remote.info` - -Experimental endpoints: - -- `cluster.delete_component_template` -- `cluster.exists_component_template` -- `cluster.get_component_template` -- `cluster.put_component_template` - -- `indices.delete_index_template` -- `indices.exists_index_template` -- `indices.get_index_template` -- `indices.put_index_template` -- `indices.simulate_index_template` - - -[discrete] -===== API Changes - -- `cat/thread_pool`: `size` is deprecated. -- `indices.get_data_streams`: `name` is now a string instead of list, the name or wildcard expression of the requested data streams. -- `indices.put_index_template`: new parameter: `cause` (string), user defined reason for creating/updating the index template. -- `indices.simulate_index_template`: Two new parameters: `create`, whether the index template we optionally defined in the body should only be dry-run added if new or can also replace an existing one. `cause` User defined reason for dry-run creating the new template for simulation purposes. -- `snapshot.delete_repository`: New parameter `repository`, name of the snapshot repository, wildcard (`*`) patterns are now supported. -- `task.cancel`: new parameter `wait_for_completion` (boolean) Should the request block until the cancellation of the task and its descendant tasks is completed. Defaults to false. - - -[discrete] -==== X-Pack - - -[discrete] -===== New API Endpoints - -New namespace: `indices` - -- `indices.freeze` -- `indices.reload_search_analyzers` -- `indices.unfreeze` - -New namespace: `searchable_snapshots` - -- `clear_cache` -- `mount` -- `repository_stats` -- `stats` - - -[discrete] -===== API Changes - -- `machine_learning.delete_expired_data` new param `body`: deleting expired data parameters. -- `machine_learning.delete_data_frame_analytics` new param `timeout`: controls the time to wait until a job is deleted. Defaults to 1 minute. diff --git a/docs/release_notes/79.asciidoc b/docs/release_notes/79.asciidoc deleted file mode 100644 index cd780239fb..0000000000 --- a/docs/release_notes/79.asciidoc +++ /dev/null @@ -1,60 +0,0 @@ -[[release_notes_79]] -=== 7.9 Release notes - -[discrete] -==== Client - -- Support for Elasticsearch version `7.9.0`. -- Transport/Connection: Considers attributes values for equality - https://github.com/elastic/elasticsearch-ruby/commit/06ffd03bf51f5f33a0d87e9914e66b39357d40af[Commit]. -- When an API endpoint accepts both `GET` and `POST`, the client will always use `POST` when a request body is present. - -[discrete] -==== API - -- Documentation for API endpoints will point out when an API is experimental, beta or unstable. - -[discrete] -===== New API Endpoints - -- New namespace: `dangling_indices` -- `dangling_indices.delete_dangling_index` -- `dangling_indices.import_dangling_index` -- `dangling_indices.list_dangling_indices` -- `indices.add_block` - -Experimental endpoints: -- `indices.resolve_index` -- `simulate_template` - -[discrete] -===== API Changes - -- `field_caps`: adds body parameter allowing to filter indices if `index_filter` is provided. -- `eql.search`: new parameters `wait_for_completion`, `keep_on_completion` and `keep_alive`. -- `info`: New parameter `accept_enterprise`: If an enterprise license is installed, return the type and mode as 'enterprise' (default: false). -- `indices.put_mapping`: new parameter `write_index_only`. - -[discrete] -==== X-Pack - -[discrete] -===== New API Endpoints - -The Ruby client now supports all the X-Pack API endpoints. - -- New namespace `autoscaling`: `autoscaling.delete_autoscaling_policy`, `autoscaling.get_autoscaling_decision`, `autoscaling.get_autoscaling_policy`, `autoscaling.put_autoscaling_policy` -- New namespace `enrich`: `enrich.delete_policy`, `enrich.execute_policy`, `enrich.get_policy`, `enrich.put_policy`, `enrich.stats` -- New namespace `eql`: `eql.delete`, `eql.get`, `eql.search` -- New namespace `cross_cluster_replication`: `cross_cluster_replication.delete_auto_follow_pattern`, `cross_cluster_replication.follow`, `cross_cluster_replication.follow_info`, `cross_cluster_replication.follow_stats`, `cross_cluster_replication.forget_follower`, `cross_cluster_replication.get_auto_follow_pattern`, `cross_cluster_replication.pause_auto_follow_pattern`, `cross_cluster_replication.pause_follow`, `cross_cluster_replication.put_auto_follow_pattern`, `cross_cluster_replication.resume_auto_follow_pattern`, `cross_cluster_replication.resume_follow`, `cross_cluster_replication.stats`, `cross_cluster_replication.unfollow` -- New namespace `snapshot_lifecycle_management`: `snapshot_lifecycle_management.delete_lifecycle`, `snapshot_lifecycle_management.execute_lifecycle`, `snapshot_lifecycle_management.execute_retention`, `snapshot_lifecycle_management.get_lifecycle`, `snapshot_lifecycle_management.get_stats`, `snapshot_lifecycle_management.get_status`, `snapshot_lifecycle_management.put_lifecycle`, `snapshot_lifecycle_management.start`, `snapshot_lifecycle_management.stop` -- `indices.create_data_stream` -- `indices.data_streams_stats` -- `indices.delete_data_stream` -- `indices.get_data_stream` -- `security.clear_cached_privileges` -- `machine_learning.update_data_frame_analytics` - -[discrete] -===== API Changes - -- `machine_learning.delete_expired_data`: new parameters `job_id`, `requests_per_second` and `timeout` \ No newline at end of file diff --git a/docs/release_notes/80.asciidoc b/docs/release_notes/80.asciidoc deleted file mode 100644 index c97e91cc7b..0000000000 --- a/docs/release_notes/80.asciidoc +++ /dev/null @@ -1,74 +0,0 @@ -[[release_notes_80]] -=== 8.0 Release notes - -[discrete] -[[release_notes_801]] -=== 8.0.1 Release notes - -- Fixes an issue with the generated API code. When updating the code generator for 8.x, the order of `arguments.clone` in the generated code was changed. This would make it so that we would modify the parameters passed in before cloning them, which is undesired. Issue: https://github.com/elastic/elasticsearch-ruby/issues/1727[#1727]. - -[discrete] -[[release_notes_800]] -=== 8.0.0 Release notes - -First release for the 8.x branch with a few major changes. - -- Tested versions of Ruby for 8.0.0: Ruby (MRI) 2.6, 2.7, 3.0 and 3.1, JRuby 9.3. - -[discrete] -==== Client - -The code for the dependency `elasticsearch-transport` has been promoted to https://github.com/elastic/elastic-transport-ruby[its own repository] and the project and gem have been renamed to https://rubygems.org/gems/elastic-transport[`elastic-transport`]. This gem now powers https://rubygems.org/gems/elasticsearch[`elasticsearch`] and https://rubygems.org/gems/elastic-enterprise-search[`elastic-enterprise-search`]. The `elasticsearch-transport` gem won't be maintained after the last release in the `7.x` branch, in favour of `elastic-transport`. - -This will allow us to better address maintainance in both clients and the library itself. - -[discrete] -==== API - -The `elasticsearch-api` library has been generated based on the {es} 8.0.0 REST specification. - -#### X-Pack Deprecation - -X-Pack has been deprecated. The `elasticsearch-xpack` gem will no longer be maintained after the last release in the `7.x` branch. The "X-Pack" integration library codebase was merged into `elasticsearch-api`. All the functionality is available from `elasticsearch-api`. The `xpack` namespace was removed for accessing any APIs other than `_xpack` (`client.xpack.info`) and `_xpack/usage` (`client.xpack.usage`). But APIs which were previously available through the `xpack` namespace e.g.: `client.xpack.machine_learning` are now only available directly: `client.machine_learning`. - -#### Parameter checking was removed - -The code in `elasticsearch-api` will no longer validate all the parameters sent. It will only validate the required parameters such as those needed to build the path for the request. But other API parameters are going to be validated by {es}. This provides better forwards and backwards compatibility in the client. - -#### Response object - -In previous versions of the client, calling an API endpoint would return the JSON body of the response. With `8.0`, we are returning a new Response object `Elasticsearch::API::Response`. It still behaves like a Hash to maintain backwards compatibility, but adds the `status` and `headers` methods from the `Elastic::Transport:Transport::Response` object: - -```ruby -elastic_ruby(main)> response = client.info -=> #<Elasticsearch::API::Response:0x000055752b0c50a8 - @response= - #<Elastic::Transport::Transport::Response:0x000055752b0c50f8 - @body= - {"name"=>"instance", - "cluster_name"=>"elasticsearch-8-0-0-SNAPSHOT-rest-test", - "cluster_uuid"=>"oIfRARuYRGuVYybjxQJ87w", - "version"=> - {"number"=>"8.0.0-SNAPSHOT", - "build_flavor"=>"default", - "build_type"=>"docker", - "build_hash"=>"7e23c54eb31cc101d1a4811b9ab9c4fd33ed6a8d", - "build_date"=>"2021-11-04T00:21:32.464485627Z", - "build_snapshot"=>true, - "lucene_version"=>"9.0.0", - "minimum_wire_compatibility_version"=>"7.16.0", - "minimum_index_compatibility_version"=>"7.0.0"}, - "tagline"=>"You Know, for Search"}, - @headers={"X-elastic-product"=>"Elasticsearch", "content-type"=>"application/json", "content-length"=>"567"}, - @status=200>> -elastic_ruby(main)> response.status -=> 200 -elastic_ruby(main)> response.headers -=> {"X-elastic-product"=>"Elasticsearch", "content-type"=>"application/json", "content-length"=>"567"} -elastic_ruby(main)> response['name'] -=> "instance" -elastic_ruby(main)> response['tagline'] -=> "You Know, for Search" -``` - -Please https://github.com/elastic/elasticsearch-ruby/issues[let us know if you find any issues]. diff --git a/docs/release_notes/81.asciidoc b/docs/release_notes/81.asciidoc deleted file mode 100644 index 871486ead8..0000000000 --- a/docs/release_notes/81.asciidoc +++ /dev/null @@ -1,55 +0,0 @@ -[[release_notes_81]] -=== 8.1 Release notes - -[discrete] -[[release_notes_812]] -=== 8.1.2 Release notes - -[discrete] -==== API - -- Fixes an issue with the generated API code. When updating the code generator for 8.x, the order of `arguments.clone` in the generated code was changed. This would make it so that we would modify the parameters passed in before cloning them, which is undesired. Issue: https://github.com/elastic/elasticsearch-ruby/issues/1727[#1727]. - -[discrete] -[[release_notes_811]] -=== 8.1.1 Release notes - -No release, no changes on the client. - -[discrete] -[[release_notes_810]] -=== 8.1.0 Release notes - -- Tested versions of Ruby for 8.1.0: Ruby (MRI) 2.6, 2.7, 3.0 and 3.1, JRuby 9.3. - -[discrete] -==== API - -Updated for compatibility with Elasticsearch 8.1's API. - -[discrete] -===== New parameters: -- `indices.forcemerge` - `wait_for_completion` Should the request wait until the force merge is completed. -- `indices.get` - `features` Return only information on specified index features (options: aliases, mappings, settings). -- `ingest.put_pipeline` `if_version` (Integer), required version for optimistic concurrency control for pipeline updates. -- `ml.delete_trained_model` - `timeout` controls the amount of time to wait for the model to be deleted. `force` (Boolean) true if the model should be forcefully deleted. -- `ml.stop_trained_model_deployment` - `allow_no_match` whether to ignore if a wildcard expression matches no deployments. (This includes `_all` string or when no deployments have been specified). `force` true if the deployment should be forcefully stopped. Adds `body` parameter, the stop deployment parameters. -- `nodes.hot_threads` - `sort` the sort order for 'cpu' type (default: total) (options: cpu, total) - -[discrete] -===== Updated parameters: -- `indices.get_index_template` - `name` is now a String, a pattern that returned template names must match. -- `knn_search` - `index` removes option to use empty string to perform the operation on all indices. -- `ml.close_job`, `ml.get_job_stats`, `ml.get_jobs`, `ml.get_overall_buckets` - Remove `allow_no_jobs` parameter. -- `ml.get_datafeed_stats`, `ml.get_datafeeds` - Remove `allow_no_datafeeds` parameter. -- `nodes.hot_threads` - `type` parameter adds `mem` option. -- `nodes.info` - `metric` updated to use `_all` to retrieve all metrics and `_none` to retrieve the node identity without any additional metrics. (options: settings, os, process, jvm, thread_pool, transport, http, plugins, ingest, indices, aggregations, _all, _none). `index_metric` option `shards` changes to `shard_stats`. -- `open_point_in_time` - `keep_alive` is now a required parameter. -- `search_mvt` - `grid_type` parameter adds `centroid` option in addition to `grid` and `point`. - -- New experimental APIs, designed for internal use by the fleet server project: `fleet.search`, `fleet.msearch`. - -[discrete] -===== New APIs -- OpenID Connect Authentication: `security.oidc_authenticate`, `security.oidc_logout`, `security.oidc_prepare_authentication`. -- `transform.reset_transform`. diff --git a/docs/release_notes/810.asciidoc b/docs/release_notes/810.asciidoc deleted file mode 100644 index c58f777d8e..0000000000 --- a/docs/release_notes/810.asciidoc +++ /dev/null @@ -1,51 +0,0 @@ -[[release_notes_8100]] -=== 8.10 Release notes - -[discrete] -[[release_notes_810_0]] -=== 8.10.0 Release notes - -[discrete] -=== Client -* Tested versions of Ruby for 8.10.0: Ruby (MRI) 3.0, 3.1 and 3.2. JRuby 9.3 and JRuby 9.4. - -[discrete] -=== API - -[discrete] -==== New Experimental APIs, for internal use: -- `fleet.delete_secret` -- `fleet.get_secret` -- `fleet.post_secret` - -[discrete] -==== New stable APIs: -- `security.get_settings` - Retrieve settings for the security system indices -- `security.update_settings` - Update settings for the security system indices - -[discrete] -==== New Experimental API: -- `query_ruleset.list` List query rulesets. - -[discrete] -==== API Changes: -- `indices.reload_search_analyzers` - Adds parameter `resource` changed resource to reload analyzers from if applicable - -Promoted from Experimental to Beta: - -- `security.create_cross_cluster_api_key` -- `security.update_cross_cluster_api_key` - -[discrete] -==== Synonyms namespace update: - -All synonym related APIs have been moved to the `synonyms` namespace and some of the endpoints have been renamed, as well as their parameters: - -- `synonyms.delete` => `synonyms.delete_synonym` - requires `id`, the id of the synonyms set to be deleted. -- `synonyms.get` => `synonyms.get_synonym` - requires `id`, the name of the synonyms set to be retrieved. -- `synonyms_set.get_synonyms_sets` => `synonyms.get_synonyms_sets` -- `synonyms.put` => `synonyms.put_synonym` - requires `id` of the synonyms set to be created or updated. -- `synonym_rule.put` => `synonyms.put_synonym_rule` - Parameters changed to `set_id` (the id of the synonym set to be updated with the synonym rule) and `rule_id` (the id of the synonym rule to be updated or created). -- New Experimental API `synonyms.delete_synonym_rule` - Deletes a synonym rule in a synonym set -- New Experimental API `synonyms.get_synonym_rule` - Retrieves a synonym rule from a synonym set - diff --git a/docs/release_notes/811.asciidoc b/docs/release_notes/811.asciidoc deleted file mode 100644 index 43c43427de..0000000000 --- a/docs/release_notes/811.asciidoc +++ /dev/null @@ -1,24 +0,0 @@ -[[release_notes_8110]] -=== 8.11 Release notes - -[discrete] -[[release_notes_811_0]] -=== 8.11.0 Release notes - -[discrete] -=== Client - -* Tested versions of Ruby for 8.11.0: Ruby (MRI) 3.0, 3.1 and 3.2. JRuby 9.3 and JRuby 9.4. -* Adds native support for *Open Telemetry*. See <<opentelemetry>> for documentation. -* Improved documentation, now you can find more examples in Ruby in the https://www.elastic.co/guide/en/elasticsearch/reference/8.11/rest-apis.html[REST API reference]. - -[discrete] -=== API - -New Experimental APIs: - -* `esql.query` - Executes an ESQL request. -* `inference.delete_model` - Delete model in the Inference API -* `inference.get_model` - Get a model in the Inference API -* `inference.inference` - Perform inference on a model -* `inference.put_model` - Configure a model for use in the Inference API diff --git a/docs/release_notes/812.asciidoc b/docs/release_notes/812.asciidoc deleted file mode 100644 index 7fb1c52f6e..0000000000 --- a/docs/release_notes/812.asciidoc +++ /dev/null @@ -1,65 +0,0 @@ -[[release_notes_8_12]] -=== 8.12 Release notes - -[discrete] -[[release_notes_8_12_0]] -=== 8.12.0 Release notes - -[discrete] -==== Client -* Tested versions of Ruby for 8.12.0: Ruby (MRI) 3.0, 3.1, 3.2 and 3.3. JRuby 9.3 and JRuby 9.4. - -[discrete] -==== API - -API Changes: - -* `bulk` - Adds boolean `:list_executed_pipelines` parameter: Sets `list_executed_pipelines` for all incoming documents. Defaults to unset (false). -* `indices.put_settings` - Adds boolean `:reopen` parameter: Whether to close and reopen the index to apply non-dynamic settings. If set to `true` the indices to which the settings are being applied will be closed temporarily and then reopened in order to apply the changes. The default is `false`. -* `open_point_in_time` - Adds Hash `:body` parameter: an index_filter specified with the Query DSL. -* `security.get_api_key` - Adds boolean `:active_only` parameter: flag to limit response to only active (not invalidated or expired) API keys. - -[discrete] -===== Connectors - -Version 8.12 introduces the experimental https://www.elastic.co/guide/en/elasticsearch/reference/8.12/connector-apis.html[Connectors API]. - -Use the following APIs to manage connectors: - -* `connector.post` - Creates a connector. See https://www.elastic.co/guide/en/elasticsearch/reference/8.12/create-connector-api.html[documentation]. -* `connector.put` - Creates or updates a connector. See https://www.elastic.co/guide/en/elasticsearch/reference/8.12/create-connector-api.html[documentation]. -* `connector.delete` - Deletes a connector. See https://www.elastic.co/guide/en/elasticsearch/reference/8.12/delete-connector-api.html[documentation]. -* `connector.get` - Returns the details about a connector. See https://www.elastic.co/guide/en/elasticsearch/reference/8.12/get-connector-api.html[documentation]. -* `connector.list` - Lists all connectors. See https://www.elastic.co/guide/en/elasticsearch/reference/8.12/list-connector-api.html[documentation]. -* `connector.check_in` - Updates the last_seen timestamp in the connector document. See https://www.elastic.co/guide/en/elasticsearch/reference/8.12/check-in-connector-api.html[documentation]. -* `connector.update_configuration` - Updates the connector configuration. See https://www.elastic.co/guide/en/elasticsearch/reference/8.12/update-connector-configuration-api.html[documentation]. -* `connector.update_error` - Updates the error field in the connector document. See https://www.elastic.co/guide/en/elasticsearch/reference/8.12/update-connector-error-api.html[documentation]. -* `connector.update_filtering` - Updates the filtering field in the connector document. See https://www.elastic.co/guide/en/elasticsearch/reference/8.12/update-connector-filtering-api.html[documentation]. -* `connector.last_sync` - Updates the stats of last sync in the connector document. See https://www.elastic.co/guide/en/elasticsearch/reference/8.12/update-connector-last-sync-api.html[documentation]. -* `connector.update_name` - Updates the name and/or description fields in the connector document. See https://www.elastic.co/guide/en/elasticsearch/reference/8.12/update-connector-name-description-api.html[documentation]. -* `connector.update_pipeline` - Updates the pipeline field in the connector document. See https://www.elastic.co/guide/en/elasticsearch/reference/8.12/update-connector-pipeline-api.html[documentation]. -* `connector.update_scheduling` - Updates the scheduling field in the connector document. See https://www.elastic.co/guide/en/elasticsearch/reference/8.12/update-connector-scheduling-api.html[documentation]. - -Use the following APIs to manage sync jobs: - -* `connector_sync_job.cancel` - Cancels a connector sync job. See https://www.elastic.co/guide/en/elasticsearch/reference/8.12/cancel-connector-sync-job-api.html[documentation]. -* `connector_sync_job.check_in` - Checks in a connector sync job (refreshes 'last_seen'). See https://www.elastic.co/guide/en/elasticsearch/reference/8.12/check-in-connector-sync-job-api.html[documentation]. -* `connector_sync_job.delete` - Deletes a connector sync job. See https://www.elastic.co/guide/en/elasticsearch/reference/8.12/delete-connector-sync-job-api.html[documentation]. -* `connector_sync_job.error` - Sets an error for a connector sync job. See https://www.elastic.co/guide/en/elasticsearch/reference/8.12/set-connector-sync-job-error-api.html[documentation]. -* `connector_sync_job.get` - Returns the details about a connector sync job. See https://www.elastic.co/guide/en/elasticsearch/reference/8.12/get-connector-sync-job-api.html[documentation]. -* `connector_sync_job.list` - Lists all connector sync jobs. See https://www.elastic.co/guide/en/elasticsearch/reference/8.12/list-connector-sync-jobs-api.html[documentation]. -* `connector_sync_job.post` - Creates a connector sync job. See https://www.elastic.co/guide/en/elasticsearch/reference/8.12/create-connector-sync-job-api.html[documentation]. -* `connector_sync_job.update_stats` - Updates the stats fields in the connector sync job document. See https://www.elastic.co/guide/en/elasticsearch/reference/8.12/set-connector-sync-job-stats-api.html[documentation]. - -[discrete] -===== Profiling -New API for https://www.elastic.co/guide/en/observability/8.12/universal-profiling.html[Universal profiling]. - -* `profiling.status` - Returns basic information about the status of Universal Profiling. - - -[discrete] -===== Simulate -New experimental API: - -* `simulate.ingest` - Simulates running ingest with example documents. See: https://www.elastic.co/guide/en/elasticsearch/reference/8.12/simulate-ingest-api.html diff --git a/docs/release_notes/813.asciidoc b/docs/release_notes/813.asciidoc deleted file mode 100644 index 0c3066d3e4..0000000000 --- a/docs/release_notes/813.asciidoc +++ /dev/null @@ -1,76 +0,0 @@ -[[release_notes_8_13]] -=== 8.13 Release notes - -[discrete] -[[release_notes_8_13_0]] -=== 8.13.0 Release notes - -[discrete] -==== Client -* Tested versions of Ruby for 8.13.0: Ruby (MRI) 3.0, 3.1, 3.2 and 3.3. JRuby 9.3 and JRuby 9.4. - -[discrete] -==== Experimental ES|QL Helper - -This version provides a new experimental Helper for the ES|QL `query` API. Please check out https://www.elastic.co/guide/en/elasticsearch/client/ruby-api/8.13/Helpers.html#esql-helper[the documentation] and https://github.com/elastic/elasticsearch-ruby/issues/new/choose[open an issue] if you encounter any problems or have any feedback. - -[discrete] -==== API - -API Changes: - -* `async_search.status` - adds Time `:keep_alive` parameter: Specify the time interval in which the results (partial or final) for this search will be available. -* `bulk` - adds boolean `:require_data_stream` parameter: When true, requires the destination to be a data stream (existing or to-be-created). Default is false. -* `connector.list` - Adds the following parameters: - * `:index_name` (List): A comma-separated list of connector index names to fetch connector documents for. - * `:connector_name` (List): A comma-separated list of connector names to fetch connector documents for. - * `:service_type` (List): A comma-separated list of connector service types to fetch connector documents for. - * `:query` (String): A search string for querying connectors, filtering results by matching against connector names, descriptions, and index names. -* `esql.query` - adds boolean `:drop_null_columns` parameter: Should entirely null columns be removed from the results? Their name and type will be returning in a new `all_columns` section. -* `field_caps` - Adds `:include_empty_fields` boolean parameter: Include empty fields in result. -* `index` - adds boolean `:require_data_stream` parameter: When true, requires the destination to be a data stream (existing or to-be-created). Default is false. -* `indices.rollover` - adds boolean `:lazy` parameter: If set to true, the rollover action will only mark a data stream to signal that it needs to be rolled over at the next write. Only allowed on data streams. -* connector_sync_job.list - adds List `:job_type` parameter: A comma-separated list of job types. -* `inference.delete_model`, `inference.get_model`, `inference.inference`, `inference.put_model`: renames `:model_id` parameter to `:inference_id`. -* `termvector` will show a warning since it's been deprecated. Please use the plural version, `termvectors`. - -New APIs: - -* `indices.resolve_cluster` - Resolves the specified index expressions to return information about each cluster, including the local cluster, if included. -* `profiling.flamegraph` - Extracts a UI-optimized structure to render flamegraphs from Universal Profiling. -* `profiling.stacktraces` - Extracts raw stacktrace information from Universal Profiling. -* `security.query_user` - Retrieves information for Users using a subset of query DSL -* `text_structure.test_grok_pattern` - Tests a Grok pattern on some text. - -APIs Migrated from experimental to stable: - -* `synonyms.delete_synonym` -* `synonyms.delete_synonym_rule` -* `synonyms.get_synonym` -* `synonyms.get_synonym_rule` -* `synonyms.get_synonyms_sets` -* `synonyms.put_synonym` -* `synonyms.put_synonym_rule` - -New Experimental APIs - -* `connector.update_api_key_id` - Updates the API key id and/or API key secret id fields in the connector document. -* `connector.update_index_name` - Updates the index name of the connector. -* `connector.update_native` - Updates the is_native flag of the connector. -* `connector.update_service_type` - Updates the service type of the connector. -* `connector.update_status` - Updates the status of the connector. -* `esql.async_query` - Executes an ESQL request asynchronously -* `esql.async_query_get` - Retrieves the results of a previously submitted async query request given its ID. - -New Experimental namespace `connector_secret`: - -* `connector_secret.delete` - Deletes a connector secret. -* `connector_secret.get` - Retrieves a secret stored by Connectors. -* `connector_secret.post` - Creates a secret for a Connector. -* `connector_secret.put` - Creates or updates a secret for a Connector. - -[discrete] -==== Development - -* Migrated from `byebug` to `debug`. -* Added extra testing for OpenTelemetry. diff --git a/docs/release_notes/814.asciidoc b/docs/release_notes/814.asciidoc deleted file mode 100644 index 6bb42142f9..0000000000 --- a/docs/release_notes/814.asciidoc +++ /dev/null @@ -1,52 +0,0 @@ -[[release_notes_8_14]] -=== 8.14 Release notes - -[discrete] -[[release_notes_8_14_0]] -=== 8.14.0 Release notes - -[discrete] -==== Client -* Tested versions of Ruby for 8.14.0: Ruby (MRI) 3.0, 3.1, 3.2 and 3.3. JRuby 9.3 and JRuby 9.4. - -[discrete] -==== API - -API changes: - -* All Connector APIs have been migrated to one common namespace `connector`: -** `connector_secret.delete` -> `connector.secret_delete` -** `connector_secret.get` -> `connector.secret_get` -** `connector_secret.post` -> `connector.secret_post` -** `connector_secret.put` -> `connector.secret_put` -** `connector_sync_job.cancel` -> `connector.sync_job_cancel` -** `connector_sync_job.check_in` -> `connector.sync_job_check_in` -** `connector_sync_job.delete` -> `connector.sync_job_delete` -** `connector_sync_job.error` -> `connector.sync_job_error` -** `connector_sync_job.get` -> `connector.sync_job_get` -** `connector_sync_job.post` -> `connector.sync_job_post` -** `connector_sync_job.update_stats` -> `connector.sync_job_update_stats` - -* `connector.delete` - Adds Boolean parameter `:delete_sync_jobs`: Determines whether associated sync jobs are also deleted. -* `cross_cluster_replication.delete_auto_follow_pattern`, `cross_cluster_replication.follow`, `cross_cluster_replication.follow_info`, `cross_cluster_replication.get_auto_follow_pattern`, `cross_cluster_replication.pause_auto_follow_pattern`, `cross_cluster_replication.pause_follow`, `cross_cluster_replication.put_auto_follow_pattern`, `cross_cluster_replication.resume_auto_follow_pattern`, `cross_cluster_replication.resume_follow`, `cross_cluster_replication.stats`, `cross_cluster_replication.unfollow` - Add Time parameter `:master_timeout`: Explicit operation timeout for connection to master node. -* `cross_cluster_replication.follow_stats`, `cross_cluster_replication.forget_follower`, `cross_cluster_replication.stats` - Add Time parameter `:timeout`: Explicit operation timeout. -* `indices/rollover` - Adds Boolean parameter `:target_failure` If set to true, the rollover action will be applied on the failure store of the data stream. -* `inference.get_model` - Parameter `inference_id` no longer required. -* `search_application.search` - Adds Boolean parameter `:typed_keys`: Specify whether aggregation and suggester names should be prefixed by their respective types in the response. -* `security.get_api_key`, `security.query_api_keys` - Add Boolean parameter `:with_profile_uid`: flag to also retrieve the API Key's owner profile uid, if it exists. - -New APIs: - -- `profiling.topn_functions` - Extracts a list of topN functions from Universal Profiling. -- `text_structure.find_field_structure` - Finds the structure of a text field in an index. -- `text_structure/find_message_structure`- Finds the structure of a list of messages. The messages must contain data that is suitable to be ingested into Elasticsearch. - -APIs Migrated from experimental to stable: - -- `esql.async_query` -- `esql.query` - -New Experimental APIs: - -- `connector.update_active_filtering` - Activates the draft filtering rules if they are in a validated state. -- `connector.update_filtering_validation` - Updates the validation info of the draft filtering rules. diff --git a/docs/release_notes/815.asciidoc b/docs/release_notes/815.asciidoc deleted file mode 100644 index 38312a5922..0000000000 --- a/docs/release_notes/815.asciidoc +++ /dev/null @@ -1,99 +0,0 @@ -[[release_notes_8_15]] -=== 8.15 Release notes - -[discrete] -[[release_notes_8_15_0]] -=== 8.15.0 Release notes - -[discrete] -==== Client -* Tested versions of Ruby for 8.15.0: Ruby (MRI) 3.0, 3.1, 3.2 and 3.3. JRuby 9.3 and JRuby 9.4. - -[discrete] -==== API - -[discrete] -===== API changes - -* `cluster.allocation_explain` - `body` is no longer a required parameter. -* `connector.put` - (experimental API) `body` and `connector_id` are no longer required parameters. -* `machine_learning.update_trained_model_deployment` has been promoted to stable from Beta. Adds Integer parameter `number_of_allocations`, updates the model deployment to this number of allocations. -* `snapshot.delete` - Adds `wait_for_completion` Boolean parameter, should this request wait until the operation has completed before returning. - -[discrete] -====== `master_timeout` and `timeout` parameters - -These parameters have been added to several APIs: - -* `master_timeout` timeout for processing on master node. -* `timeout` timeout for acknowledgement of update from all nodes in cluster parameters. - -The APIs: - -* `autoscaling.delete_autoscaling_policy` - both. -* `autoscaling.get_autoscaling_capacity`- `master_timeout`. -* `get_autoscaling_policy` - `master_timeout`. -* `put_autoscaling_policy` - both. -* `enrich.delete_policy` - `master_timeout`. -* `enrich.execute_policy` - `master_timeout`. -* `enrich.get_policy` - `master_timeout`. -* `enrich.put_policy` - `master_timeout`. -* `enrich.stats` - `master_timeout`. -* `features.reset_features` - `master_timeout`. -* `license.delete` - both. -* `license.post` - both. -* `license.post_start_basic` - both. -* `license.post_start_trial` - both. -* `security.get_settings` - `master_timeout`. -* `security.update_settings` - both. -* `shutdown.get_node` - `master_timeout`. -* `snapshot_lifecycle_management.start` - both. -* `snapshot_lifecycle_management.stop` - both. -* `watcher.get_settings` - `master_timeout`. -* `watcher.start` - `master_timeout`. -* `watcher.stop` - `master_timeout`. -* `watcher.update_settings` - both. - -[discrete] -====== Inference APIs have been renamed: - -* `inference.delete_model` => `inference.delete`. Also adds two new parameters: -** `dry_run` (Boolean), if true the endpoint will not be deleted and a list of ingest processors which reference this endpoint will be returned. -** `force` (Boolean), if true the endpoint will be forcefully stopped (regardless of whether or not it is referenced by any ingest processors or semantic text fields). -* `inference.get_model` => `inference.get` -* `inference.put_model` => `inference.put` - -[discrete] -====== Query Rules parameters consolidated - -Changes in `query_ruleset` and `query_rules` APIs, These have been combined into the `query_rules` namespace: - -* `query_rules.delete_ruleset` - Renamed from `query_ruleset.delete`, promoted from experimental to stable. -* `query_rules.delete_rule` - Deletes an individual query rule within a ruleset. -* `query_rules.get_rule` - Returns the details about an individual query rule within a ruleset. -* `query_rules.get_ruleset` - Renamed from `query_ruleset.get`, promoted from experimental to stable. -* `query_rules.list_rulesets` - Renamed from `query_ruleset.list`, promoted from experimental to stable. -* `query_rules.put_rule` - Creates or updates a query rule within a ruleset. -* `query_rules.put_ruleset` - Renamed from `query_ruleset.put_ruleset`, promoted from experimental to stable. - -[discrete] -===== New APIs: - -* `ingest.delete_geoip_database` - Deletes a geoip database configuration. -* `ingest.get_geoip_database` - Returns geoip database configuration. -* `ingest.put_geoip_database` - Puts the configuration for a geoip database to be downloaded. -* `security.bulk_delete_role` - Bulk delete roles in the native realm. -* `security.bulk_put_role` - Bulk adds and updates roles in the native realm. -* `security.query_role` - Retrieves information for Roles using a subset of query DSL. -* `transform.get_node_stats` - Retrieves transform usage information for transform nodes. - -[discrete] -===== New Experimental APIs: - -* `connector.sync_job_claim` - Claims a connector sync job. -* `connector.update_features` - Updates the connector features in the connector document. - -[discrete] -==== Development - -- Added a build using https://github.com/elastic/es-test-runner-ruby[es-test-runner-ruby] and https://github.com/elastic/elasticsearch-clients-tests[Elasticsearch Clients Tests] which will replace the Elasticsearch YAML test runner. diff --git a/docs/release_notes/816.asciidoc b/docs/release_notes/816.asciidoc deleted file mode 100644 index c32e719f57..0000000000 --- a/docs/release_notes/816.asciidoc +++ /dev/null @@ -1,57 +0,0 @@ -[[release_notes_8_16]] -=== 8.16 Release notes - -[discrete] -[[release_notes_8_16_0]] -=== 8.16.0 Release notes - -[discrete] -==== Client -* Tested versions of Ruby for 8.16.0: Ruby (MRI) 3.1, 3.2 and 3.3. JRuby 9.3 and JRuby 9.4. - -[discrete] -==== API - -[discrete] -===== API changes - -* `capabilities` - Adds `local_only` boolean parameter: True if only the node being called should be considered. -* `cluster.stats`- Removes `flat_settings` parameter, adds `include_remotes` boolean parameter: Include remote cluster data into the response (default: false). -* `indices.get_data_stream` - Adds `verbose` boolean parameter: Whether the maximum timestamp for each data stream should be calculated and returned (default: false). Adds `master_timeout` (see below). -* `query_rules.delete_ruleset` - Accepts `ignore: 404` common parameter. - -These parameters have been added to several APIs: - -* `master_timeout` timeout for processing on master node. -* `timeout` timeout for acknowledgement of update from all nodes in cluster parameters. - -Added in: - -* `indices.create_data_stream` - both. -* `indices.delete_data_stream` - `master_timeout`. -* `indices.get_data_lifecycle` - `master_timeout`. -* `indices.get_data_stream` - `master_timeout`. -* `indices.migrate_to_data_stream` - both. -* `indices.promote_data_stream` - `master_timeout`. -* `search_shards` - `master_timeout`. - -**APIs Promoted from Experimental to Stable:** - -* `indices.delete_data_lifecycle` -* `indices.explain_data_lifecycle` -* `indices.get_data_lifecycle` -* `indices.put_data_lifecycle` -* `security.create_cross_cluster_api_key` -* `security.update_cross_cluster_api_key` - -**New APIs** - -* `ingest.delete_ip_location_database` - Deletes an ip location database configuration. -* `ingest.get_ip_location_database` - Returns the specified ip location database configuration. -* `ingest.put_ip_location_database` - Puts the configuration for a ip location database to be downloaded. - - -**New Experimental APIs** - -* `inference.stream_inference` - Perform streaming inference. -* `query_rules.test` - Tests a query ruleset to identify the rules that would match input criteria. diff --git a/docs/release_notes/817.asciidoc b/docs/release_notes/817.asciidoc deleted file mode 100644 index 2963eeb0d1..0000000000 --- a/docs/release_notes/817.asciidoc +++ /dev/null @@ -1,20 +0,0 @@ -[[release_notes_8_17]] -=== 8.17 Release notes - -[discrete] -[[release_notes_8_17_0]] -=== 8.17.0 Release notes - -[discrete] -==== Client -* Tested versions of Ruby for 8.17.0: Ruby (MRI) 3.1, 3.2 and 3.3. JRuby 9.3 and JRuby 9.4. - -[discrete] -==== API - -[discrete] -===== API changes -* `async_search.submit` - Removes `keep_alive` parameter. Adds: -** `ccs_minimize_roundtrips` (Boolean): When doing a cross-cluster search, setting it to true may improve overall search latency, particularly when searching clusters with a large number of shards. However, when set to true, the progress of searches on the remote clusters will not be received until the search finishes on all clusters. -** `rest_total_hits_as_int` (Boolean): Indicates whether hits.total should be rendered as an integer or an object in the rest search response. -* `open_point_in_time` - Adds `allow_partial_search_results` (Boolean) parameter: Specify whether to tolerate shards missing when creating the point-in-time, or otherwise throw an exception (default: false). diff --git a/docs/release_notes/82.asciidoc b/docs/release_notes/82.asciidoc deleted file mode 100644 index 401958b6c7..0000000000 --- a/docs/release_notes/82.asciidoc +++ /dev/null @@ -1,49 +0,0 @@ -[[release_notes_82]] -=== 8.2 Release notes - -[discrete] -[[release_notes_822]] -=== 8.2.2 Release notes - -- Updates dependency on `elastic-transport` to `~> 8.0` - - -[discrete] -[[release_notes_821]] -=== 8.2.1 Release notes - -No release, no changes on the client. - -[discrete] -[[release_notes_820]] -=== 8.2.0 Release notes - - -- Tested versions of Ruby for 8.2.0: Ruby (MRI) 2.7, 3.0 and 3.1, JRuby 9.3. - -[discrete] -==== API - -Updated for compatibility with Elasticsearch 8.2's API. - -[discrete] -===== New parameters: - -* `field_caps` -** `filters` An optional set of filters: can include +metadata,-metadata,-nested,-multifield,-parent -** `types` Only return results for fields that have one of the types in the list - -[discrete] -===== New APIs - -- `cat.component_templates` - Returns information about existing component_templates templates. -- `ml.get_memory_stats` - Returns information on how ML is using memory. - -[discrete] -===== New Experimental APIs -- `security.activate_user_profile` - Creates or updates the user profile on behalf of another user. -- `security.disable_user_profile` - Disables a user profile so it's not visible in user profile searches. -- `security.enable_user_profile` - Enables a user profile so it's visible in user profile searches. -- `security.get_user_profile` - Retrieves a user profile for the given unique ID. -- `security.suggest_user_profiles` - Get suggestions for user profiles that match specified search criteria. -- `security.update_user_profile_data` - Update application specific data for the user profile of the given unique ID. diff --git a/docs/release_notes/83.asciidoc b/docs/release_notes/83.asciidoc deleted file mode 100644 index aa0b2d8d53..0000000000 --- a/docs/release_notes/83.asciidoc +++ /dev/null @@ -1,33 +0,0 @@ -[[release_notes_83]] -=== 8.3 Release notes - -[discrete] -[[release_notes_830]] -=== 8.3.0 Release notes - -- Tested versions of Ruby for 8.3.0: Ruby (MRI) 2.7, 3.0 and 3.1, JRuby 9.3. - -[discrete] -==== API - -- Added build hash to auto generated code. The code generator obtains the git hash from the Elasticsearch specification and adds it as a comment in the code. This allows us to track the version for each generated class. -- Updated for compatibility with Elasticsearch 8.3's API. - -[discrete] -===== API Changes - -* `cluster.delete_voting_config_exclusions`, `cluster.post_voting_config_exclusions` - Add new parameter `master_timeout` (Time) Timeout for submitting request to master. -* `machine_learning.infer_trained_model_deployment` is renamed to `machine_learning.infer_trained_model`. The url `/_ml/trained_models/{model_id}/deployment/_infer` is deprecated since 8.3, use `/_ml/trained_models/{model_id}/_infer` instead. -* `machine_learning.preview_datafeed` - Adds new parameters: -** `start` (String) The start time from where the datafeed preview should begin -** `end` (String) The end time when the datafeed preview should stop -* `machine_learning.start_trained_model_deployment` - Adds new parameters: -** `number_of_allocations` (Integer) The number of model allocations on each node where the model is deployed. -** `threads_per_allocation` (Integer) The number of threads used by each model allocation during inference. -** `queue_capacity` (Integer) Controls how many inference requests are allowed in the queue at a time. -* `search_mvt` - Adds new parameter: `with_labels` (Boolean) If true, the hits and aggs layers will contain additional point features with suggested label positions for the original features -* `snapshot.get` - Adds new parameter: `index_names` (Boolean) Whether to include the name of each index in the snapshot. Defaults to true. - -[discrete] -===== New Experimental APIs -* `security.has_privileges_user_profile` Determines whether the users associated with the specified profile IDs have all the requested privileges diff --git a/docs/release_notes/84.asciidoc b/docs/release_notes/84.asciidoc deleted file mode 100644 index 19901f675e..0000000000 --- a/docs/release_notes/84.asciidoc +++ /dev/null @@ -1,31 +0,0 @@ -[[release_notes_84]] -=== 8.4 Release notes - -[discrete] -[[release_notes_840]] -=== 8.4.0 Release notes - -- Tested versions of Ruby for 8.4.0: Ruby (MRI) 2.7, 3.0 and 3.1, JRuby 9.3. - -[discrete] -==== API - -[discrete] -===== New APIs - -* `security.update_api_key` - Updates attributes of an existing API key. https://www.elastic.co/guide/en/elasticsearch/reference/8.4/security-api-update-api-key.html[Documentation]. - -[discrete] -===== API Changes -* `get` - Adds new parameter `force_synthetic_source` (Boolean) Should this request force synthetic _source? Use this to test if the mapping supports synthetic _source and to get a sense of the worst case performance. Fetches with this enabled will be slower the enabling synthetic source natively in the index. -* `machine_learning.start_trained_model_deployment` - Adds new parameter `cache_size` (String) A byte-size value for configuring the inference cache size. For example, 20mb. -* `mget` - Adds new parameter `force_synthetic_source` (Boolean) Should this request force synthetic _source? Use this to test if the mapping supports synthetic _source and to get a sense of the worst case performance. Fetches with this enabled will be slower the enabling synthetic source natively in the index. -* `search` - Adds new parameter `force_synthetic_source` (Boolean) Should this request force synthetic _source? Use this to test if the mapping supports synthetic _source and to get a sense of the worst case performance. Fetches with this enabled will be slower the enabling synthetic source natively in the index. -* `snapshot.get` - Adds new parameters: -** `sort` (String) Allows setting a sort order for the result. Defaults to start_time (options: start_time, duration, name, repository, index_count, shard_count, failed_shard_count). -** `size` (Integer) Maximum number of snapshots to return. Defaults to 0 which means return all that match without limit. -** `order` (String) Sort order (options: asc, desc). -** `from_sort_value` (String) Value of the current sort column at which to start retrieval. -** `after` (String) Offset identifier to start pagination from as returned by the 'next' field in the response body. -** `offset` (Integer) Numeric offset to start pagination based on the snapshots matching the request. Defaults to 0. -** `slm_policy_filter` (String) Filter snapshots by a comma-separated list of SLM policy names that snapshots belong to. Accepts wildcards. Use the special pattern '_none' to match snapshots without an SLM policy. diff --git a/docs/release_notes/85.asciidoc b/docs/release_notes/85.asciidoc deleted file mode 100644 index 4ba0e56497..0000000000 --- a/docs/release_notes/85.asciidoc +++ /dev/null @@ -1,105 +0,0 @@ -[[release_notes_85]] -=== 8.5 Release notes - -[discrete] -[[release_notes_852]] -=== 8.5.2 Release notes - -[discrete] -==== API Bugfix - -Fixes `security.create_service_token` API, uses `POST` when token name isn't present. -Thanks https://github.com/carlosdelest[@carlosdelest] for reporting in https://github.com/elastic/elasticsearch-ruby/pull/1961[#1961]. - -[discrete] -[[release_notes_851]] -=== 8.5.1 Release notes - -[discrete] -==== Bugfixes - -Fixes bug when instantiating client with `api_key`: When passing in `api_key` and `transport_options` that don't include headers to the client, the `api_key` code would overwrite the arguments passed in for `transport_options`. This was fixed in https://github.com/elastic/elasticsearch-ruby/pull/1941/files[this Pull Request]. -Thanks @svdasein for reporting in https://github.com/elastic/elasticsearch-ruby/issues/1940[#1940]. - -[discrete] -[[release_notes_850]] -=== 8.5.0 Release notes - -- Tested versions of Ruby for 8.5.0: Ruby (MRI) 2.7, 3.0 and 3.1, JRuby 9.3. - -[discrete] -==== Client - -With the latest release of `elastic-transport` - `v8.1.0` - this gem now supports Faraday v2. Elasticsearch Ruby has an open dependency on `elastic-transport` (`'elastic-transport', '~> 8'`), so when you upgrade your gems, `8.1.0` will be installed. This supports both Faraday v1 and Faraday v2. The main change on dependencies when using Faraday v2 is all adapters, except for the default `net_http` one, have been moved out of Faraday into separate gems. This means if you're not using the default adapter and you migrate to Faraday v2, you'll need to add the adapter gems to your Gemfile. - -These are the gems required for the different adapters with Faraday 2, instead of the libraries on which they were based: - -[source,ruby] ------------------------------------- -# HTTPCLient -gem 'faraday-httpclient' - -# NetHTTPPersistent -gem 'faraday-net_http_persistent' - -# Patron -gem 'faraday-patron' - -# Typhoeus -gem 'faraday-typhoeus' ------------------------------------- - -Things should work fine if you migrate to Faraday 2 as long as you include the adapter (unless you're using the default one `net-http`), but worst case scenario, you can always lock the version of Faraday in your project to 1.x: -gem 'faraday', '~> 1' - -Be aware if migrating to Faraday v2 that it requires at least Ruby `2.6`, unlike Faraday v1 which requires `2.4`. - -*Troubleshooting* - -If you see a message like: - -[source,ruby] ------------------------------------- -:adapter is not registered on Faraday::Adapter (Faraday::Error) ------------------------------------- -Then you probably need to include the adapter library in your gemfile and require it. - -Please https://github.com/elastic/elasticsearch-ruby/issues[submit an issue] if you encounter any problems. - -[discrete] -==== API - -[discrete] -===== New APIs - -- `machine_learning.clear_trained_model_deployment_cache` - Clear the cached results from a trained model deployment (Beta). -- `security.bulk_update_api_keys` - Updates the attributes of multiple existing API keys. - -[discrete] -===== API Changes - -- `rollup.rollup` renamed to `indices.downsample`. The method now receives the `index` to downsample (Required) and instead of `rollup_index`, use target_index as the index to store downsampled data. - -- `security.get_api_key` and `security.query_api_keys` add `:with_limited_by` flag to show the limited-by role descriptors of API Keys. -- `security.get_user` adds `:with_profile_uid` flag to retrieve profile uid (if exists) associated to the user. -- `security.get_user_profile` now retrieves user profiles for given unique ID(s). `:uid` is now a list of comma-separated list of unique identifier for user profiles. -- `text_structure.find_structure` adds `:ecs_compatibility`, optional parameter to specify the compatibility mode with ECS Grok patterns - may be either 'v1' or 'disabled'. - -Machine learning APIs promoted from *Experimental* to *Beta*: - -- `machine_learning.clear_trained_model_deployment_cache.rb` -- `machine_learning.infer_trained_model.rb` -- `machine_learning.put_trained_model_definition_part.rb` -- `machine_learning.put_trained_model_vocabulary.rb` -- `machine_learning.start_trained_model_deployment.rb` -- `machine_learning.stop_trained_model_deployment.rb` - -Security usef profile APIs promoted from *Experimental* to *Stable*: - -- `security/activate_user_profile` -- `security/disable_user_profile` -- `security/enable_user_profile` -- `security/get_user_profile` -- `security/has_privileges_user_profile` -- `security/suggest_user_profile` -- `security/update_user_profile_data` diff --git a/docs/release_notes/86.asciidoc b/docs/release_notes/86.asciidoc deleted file mode 100644 index 88a7ad47d2..0000000000 --- a/docs/release_notes/86.asciidoc +++ /dev/null @@ -1,23 +0,0 @@ -[[release_notes_86]] -=== 8.6 Release notes - -[discrete] -[[release_notes_860]] -=== 8.6.0 Release notes - -- Tested versions of Ruby for 8.6.0: Ruby (MRI) 2.7, 3.0, 3.1 and **3.2**. JRuby 9.3 and **JRuby 9.4**. - -[discrete] -==== API - -[discrete] -===== New APIs - -- `update_trained_model_deployment` - Updates certain properties of trained model deployment (This functionality is in Beta and is subject to change). - -[discrete] -===== API Changes - -- `cluster.reroute` - `:metric` parameter adds `none` as an option. -- `ml.start_trained_model_deployment` - New parameter `:priority` (String), the deployment priority - diff --git a/docs/release_notes/87.asciidoc b/docs/release_notes/87.asciidoc deleted file mode 100644 index f58e0856c6..0000000000 --- a/docs/release_notes/87.asciidoc +++ /dev/null @@ -1,35 +0,0 @@ -[[release_notes_87]] -=== 8.7 Release notes - -[discrete] -[[release_notes_871]] -=== 8.7.1 Release notes - -[discrete] -==== API Bugfix - -- Updates `logstash.get_pipeline`, fixed in the specification `id` is not a required parameter, so removes raising `ArgumentError` when id is not present. - - -[discrete] -[[release_notes_870]] -=== 8.7.0 Release notes - -- Tested versions of Ruby for 8.7.0: Ruby (MRI) 2.7, 3.0, 3.1 and **3.2**. JRuby 9.3 and JRuby 9.4. Ruby 2.7's end of life is coming in a few days, so this'll probably be the last release to test for Ruby 2.7. - -[discrete] -==== API - -[discrete] -===== New APIs - -- `health_report` - Returns the health of the cluster. -- `transform.schedule_now_transform` - Schedules now a transform. - -[discrete] -===== API Changes - -- `transform.get_transform_stats` - Adds `timeout` (Time) parameter. Controls the time to wait for the stats. -- `transform.start_transform` - Adds `from` (String) parameter. Restricts the set of transformed entities to those changed after this time. -- `ml.delete_job`, `ml.reset_job` - Add `delete_user_annotations` (Boolean) parameter. Should annotations added by the user be deleted. -- `ml.clear_trained_model_deployment_cache`, `ml.infer_trained_model`, `ml.put_trained_model_definition_part`, `ml.put_trained_model_vocabulary`, `ml.start_trained_model_deployment`, `ml.stop_trained_model_deployment` - These APIs are no longer in Beta. diff --git a/docs/release_notes/88.asciidoc b/docs/release_notes/88.asciidoc deleted file mode 100644 index 13f093fd07..0000000000 --- a/docs/release_notes/88.asciidoc +++ /dev/null @@ -1,47 +0,0 @@ -[[release_notes_88]] -=== 8.8 Release notes - -[discrete] -[[release_notes_880]] -=== 8.8.0 Release notes - -- Tested versions of Ruby for 8.8.0: Ruby (MRI) 3.0, 3.1 and **3.2**. JRuby 9.3 and JRuby 9.4. - -[discrete] -==== API - -- Updates development dependency `minitest-reporters` to `>= 1.6` to include showing failures at the end of the test run. - -[discrete] -===== New APIs - -- `watcher.get_settings` - Retrieve settings for the watcher system index. -- `watcher.update_settings` - Update settings for the watcher system index. - -[discrete] -===== New Experimental APIs - -- `indices.delete_data_lifecycle`- Deletes the data lifecycle of the selected data streams -- `indices.explain_data_lifecycle` - Retrieves information about the index's current DLM lifecycle, such as any potential encountered error, time since creation etc. -- `indices.get_data_lifecycle` - Returns the data lifecycle of the selected data streams. -- `indices.put_data_lifecycle` - Updates the data lifecycle of the selected data streams. -- `search_application.delete` - Deletes a search application. -- `search_application.delete_behavioral_analytics` - Delete a behavioral analytics collection. -- `search_application.get` - Returns the details about a search application. -- `search_application.get_behavioral_analytics` - Returns the existing behavioral analytics collections. -- `search_application.list` - Returns the existing search applications. -- `search_application.post_behavioral_analytics_event` - Creates a behavioral analytics event for existing collection. -- `search_application.put` - Creates or updates a search application. -- `search_application.put_behavioral_analytics` - Creates a behavioral analytics collection. -- `search_application.search` - Perform a search against a search application. - -[discrete] -===== API Changes - -- `clear_scroll` now works with the argument `ignore: 404`. https://github.com/elastic/elasticsearch-ruby/issues/2067[Issue on GitHub]. -- The code generator was updated to fix a bug for `ignore: 404`. APIs that were supposed to support this wouldn't parse the parameters correctly. The support it now: `security.get_role`, `watcher.delete_watch` -- `cluster.get_component_template`, `indices.get_data_stream`, `indices.get_index_template`, `indices.simulate_index_template`, `indices.simulate_template` - Add `include_defaults` (Boolean) parameter: Return all default configurations for the component template (default: false). -- `machine_learning.put_trained_model` - Adds `wait_for_completion` (Boolean) parameter: Whether to wait for all child operations(e.g. model download) to complete, before returning or not (default: false). -- `machine_learning.start_trained_model_deployment` - Adds `deployiment_id` (String) parameter: The Id of the new deployment. Defaults to the model_id if not set. -- `search` - Adds `include_named_queries_score` (Boolean) parameter: Indicates whether hit.matched_queries should be rendered as a map that includes the name of the matched query associated with its score (true) or as an array containing the name of the matched queries (false). -- `transform.delete_transform` - Adds `delete_dest_index` (Boolean) parameter: When `true`, the destination index is deleted together with the transform. The default value is `false`, meaning that the destination index will not be deleted. diff --git a/docs/release_notes/89.asciidoc b/docs/release_notes/89.asciidoc deleted file mode 100644 index de0f431856..0000000000 --- a/docs/release_notes/89.asciidoc +++ /dev/null @@ -1,54 +0,0 @@ -[[release_notes_89]] -=== 8.9 Release notes - -[discrete] -[[release_notes_890]] -=== 8.9.0 Release notes - -[discrete] -=== Client -* Tested versions of Ruby for 8.9.0: Ruby (MRI) 3.0, 3.1 and 3.2. JRuby 9.3 and JRuby 9.4. -* Updated product validation. The code for the product validation was refactored in a few ways: -** Just check header, does not check the version of the server. -** Warns only once when there's a general server error. -** Removes the call to '/' (client.info) when doing the first request, checking on the first actual request from the client. -* Fixes User-Agent code. In the migration to 8.x, the user agent code was extracted into transport, since we're now using that library in other projects. So for the Elasticsearch Client, the user-agent would be reported as the one defined in elastic-transport. This release fixes the issue and brings back the user agent in the format that was being used in 7.x - -[discrete] -=== Helpers -This release introduces two new Helpers in the client: - -* BulkHelper - This helper provides a better developer experience when using the Bulk API. At its simplest, you can send it a collection of hashes in an array, and it will bulk ingest them into {es}. -* ScrollHelper - This helper provides an easy way to get results from a Scroll. - -See <<Helpers>> to read more about them. - -[discrete] -=== API - -[discrete] -==== New APIs - -* `cluster.info` - Returns different information about the cluster. - -[discrete] -==== New Experimental APIs and namespaces: - -This functionality is Experimental and may be changed or removed completely in a future release. Elastic will take a best effort approach to fix any issues, but experimental features are not subject to the support SLA of official GA features. - -* New namespace: `query_ruleset` -** `query_ruleset.delete` - Deletes a query ruleset. -** `query_ruleset.get` - Returns the details about a query ruleset. -** `query_ruleset.put` - Creates or updates a query ruleset. -* New API: `search_application.render_query` Renders a query for given search application search parameters. -* New API: `security.create_cross_cluster_api_key` - Creates a cross-cluster API key for API key based remote cluster access. -* New API: `security.upate_cross_cluster_api_key` - Updates attributes of an existing cross-cluster API key. -* New namespace: `synonyms` -** `synonyms.delete`- Deletes a synonym set -** `synonyms.get` - Retrieves a synonym set -** `synonyms.put` - Creates or updates a synonyms set -* New namespace: `synonym_rule` -** `synonym_rule.put` - Creates or updates a synonym rule in a synonym set -* New namespace: `synonyms` -** `synonyms_set.get` - Retrieves a summary of all defined synonym sets - diff --git a/docs/release_notes/index.asciidoc b/docs/release_notes/index.asciidoc deleted file mode 100644 index 3b2ef35788..0000000000 --- a/docs/release_notes/index.asciidoc +++ /dev/null @@ -1,74 +0,0 @@ -[[release_notes]] -== Release Notes - -[discrete] -=== 8.x - -* <<release_notes_8_17, 8.17 Release Notes>> -* <<release_notes_8_16, 8.16 Release Notes>> -* <<release_notes_8_15, 8.15 Release Notes>> -* <<release_notes_8_14, 8.14 Release Notes>> -* <<release_notes_8_13, 8.13 Release Notes>> -* <<release_notes_8_12, 8.12 Release Notes>> -* <<release_notes_8110, 8.11 Release Notes>> -* <<release_notes_8100, 8.10 Release Notes>> -* <<release_notes_89, 8.9 Release Notes>> -* <<release_notes_88, 8.8 Release Notes>> -* <<release_notes_87, 8.7 Release Notes>> -* <<release_notes_86, 8.6 Release Notes>> -* <<release_notes_85, 8.5 Release Notes>> -* <<release_notes_84, 8.4 Release Notes>> -* <<release_notes_83, 8.3 Release Notes>> -* <<release_notes_82, 8.2 Release Notes>> -* <<release_notes_81, 8.1 Release Notes>> -* <<release_notes_80, 8.0 Release Notes>> - -[discrete] -=== 7.x -* <<release_notes_717, 7.17 Release Notes>> -* <<release_notes_716, 7.16 Release Notes>> -* <<release_notes_715, 7.15 Release Notes>> -* <<release_notes_714, 7.14 Release Notes>> -* <<release_notes_713, 7.13 Release Notes>> -* <<release_notes_712, 7.12 Release Notes>> -* <<release_notes_711, 7.11 Release Notes>> -* <<release_notes_710, 7.10 Release Notes>> -* <<release_notes_79, 7.9 Release Notes>> -* <<release_notes_78, 7.8 Release Notes>> -* <<release_notes_77, 7.7 Release Notes>> -* <<release_notes_76, 7.6 Release Notes>> -* <<release_notes_75, 7.5 Release Notes>> -* <<release_notes_70, 7.0 Release Notes>> - -include::817.asciidoc[] -include::816.asciidoc[] -include::815.asciidoc[] -include::814.asciidoc[] -include::813.asciidoc[] -include::812.asciidoc[] -include::811.asciidoc[] -include::810.asciidoc[] -include::89.asciidoc[] -include::88.asciidoc[] -include::87.asciidoc[] -include::86.asciidoc[] -include::85.asciidoc[] -include::84.asciidoc[] -include::83.asciidoc[] -include::82.asciidoc[] -include::81.asciidoc[] -include::80.asciidoc[] -include::717.asciidoc[] -include::716.asciidoc[] -include::715.asciidoc[] -include::714.asciidoc[] -include::713.asciidoc[] -include::712.asciidoc[] -include::711.asciidoc[] -include::710.asciidoc[] -include::79.asciidoc[] -include::78.asciidoc[] -include::77.asciidoc[] -include::76.asciidoc[] -include::75.asciidoc[] -include::70.asciidoc[] diff --git a/docs/troubleshooting.asciidoc b/docs/troubleshooting.asciidoc deleted file mode 100644 index a2e6a19e05..0000000000 --- a/docs/troubleshooting.asciidoc +++ /dev/null @@ -1,97 +0,0 @@ -[[troubleshooting]] -== Troubleshooting - -Use the information in this section to troubleshoot common problems and find -answers for frequently asked questions. - - -[discrete] -[[ruby-ts-logging]] -=== Logging - -The client provides several options for logging that can help when things go -wrong. Check out the extensive documentation on <<logging>>. - -If you are having trouble sending a request to {es} with the client, we suggest -enabling `tracing` on the client and testing the cURL command that appears in -your terminal: - -[source,rb] ----------------------------- -client = Elasticsearch::Client.new(trace: true) -client.info -curl -X GET -H 'x-elastic-client-meta: es=8.9.0,rb=3.2.2,t=8.2.1,fd=2.7.4,nh=0.3.2, User-Agent: elastic-t -ransport-ruby/8.2.1 (RUBY_VERSION: 3.2.2; linux x86_64; Faraday v2.7.4), Content-Type: application/json' 'http://localhost:9200//?pretty' ----------------------------- - -Testing the cURL command can help find out if there's a connection issue or if -the issue is in the client code. - - -[discrete] -[[ruby-ts-connection]] -=== Troubleshooting connection issues - -When working with multiple hosts, you might want to enable the -`retry_on_failure` or `retry_on_status` options to perform a failed request on -another node (refer to <<retry-failures>>). - -For optimal performance, use a HTTP library which supports persistent -("keep-alive") connections, such as https://github.com/toland/patron[patron] or -https://github.com/typhoeus/typhoeus[Typhoeus]. Require the library -(`require 'patron'`) in your code for Faraday 1.x or the adapter -(`require 'faraday/patron'`) for Faraday 2.x, and it will be automatically used. - - -[discrete] -[[ruby-ts-adapter]] -=== Adapter is not registered on Faraday - -If you see a message like: -``` -:adapter is not registered on Faraday::Adapter (Faraday::Error) -``` - -Then you might need to include the adapter library in your Gemfile and require -it. You might get this error when migrating from Faraday v1 to Faraday v2. The -main change when using Faraday v2 is all adapters, except for the default -`net_http` one, have been moved out into separate gems. This means if you're not -using the default adapter and you migrate to Faraday v2, you'll need to add the -adapter gems to your Gemfile. - -These are the gems required for the different adapters with Faraday 2, instead -of the libraries on which they were based: - -[source,ruby] ------------------------------------- -# HTTPCLient -gem 'faraday-httpclient' - -# NetHTTPPersistent -gem 'faraday-net_http_persistent' - -# Patron -gem 'faraday-patron' - -# Typhoeus -gem 'faraday-typhoeus' ------------------------------------- - -Migrating to Faraday 2 solves the issue as long as the adapter is included -(unless you're using the default one `net-http`). Alternatively, you can lock -the version of Faraday in your project to 1.x: -`gem 'faraday', '~> 1'` - -IMPORTANT: Migrating to Faraday v2 requires at least Ruby `2.6`. Faraday v1 -requires `2.4`. - -[discrete] -=== More Help - -If you need more help, visit the -https://discuss.elastic.co/[Elastic community forums] and get answers from the -experts in the community, including people from Elastic. - -If you find a bug, have feedback, or find any other issue using the client, -https://github.com/elastic/elasticsearch-ruby/issues/new/choose[submit an issue] -on GitHub. \ No newline at end of file