diff --git a/docs/command_line_reference.rst b/docs/command_line_reference.rst
index dd1855d5..afecc539 100644
--- a/docs/command_line_reference.rst
+++ b/docs/command_line_reference.rst
@@ -82,16 +82,15 @@ Consider the following track snippet showing a single challenge::
 
     {
       "name": "index-only",
-      "index-settings": {
-        "index.number_of_replicas": {{ replica_count|default(0) }},
-        "index.number_of_shards": {{ shard_count|default(5) }},
-      },
       "schedule": [
-        {
-          "operation": "bulk-index",
-          "warmup-time-period": 120,
-          "clients": 8
-        }
+         {
+           "operation": {
+             "operation-type": "bulk",
+             "bulk-size": {{ bulk_size|default(5000) }}
+           },
+           "warmup-time-period": 120,
+           "clients": {{ clients|default(8) }}
+         }
       ]
     }
 
@@ -99,28 +98,28 @@ Rally tracks can use the Jinja templating language and the construct ``{{ some_v
 
 We can see that it defines two variables:
 
-* ``replica_count`` with a default value of 0
-* ``shard_count`` with a default value of 5
+* ``bulk_size`` with a default value of 5000
+* ``clients`` with a default value of 8
 
 When we run this track, we can override these defaults:
 
-* ``--track-params="replica_count:1,shard_count:3"`` will set the number of replicas to 1 and the number of shards to 3.
-* ``--track-params="replica_count:1"`` will just set the number of replicas to 1 and just keep the default value of 5 shards.
+* ``--track-params="bulk_size:2000,clients:16"`` will set the bulk size to 2000 and the number of clients for bulk indexing to 16.
+* ``--track-params="bulk_size:8000"`` will just set the bulk size to 8000 and keep the default value of 8 clients.
 * ``--track-params="params.json"`` will read the track parameters from a JSON file (defined below)
 
 Example JSON file::
 
    {
-      "replica_count": 1,
-      "shard_count": 3
+      "bulk_size": 2000,
+      "clients": 16
    }
 
 All track parameters are recorded for each metrics record in the metrics store. Also, when you run ``esrally list races``, it will show all track parameters::
 
-    Race Timestamp    Track    Track Parameters               Challenge            Car       User Tag
-    ----------------  -------  ------------------------------ -------------------  --------  ---------
-    20160518T122341Z  pmc      replica_count=1                append-no-conflicts  defaults
-    20160518T112341Z  pmc      replica_count=1,shard_count=3  append-no-conflicts  defaults
+    Race Timestamp    Track    Track Parameters          Challenge            Car       User Tag
+    ----------------  -------  ------------------------- -------------------  --------  ---------
+    20160518T122341Z  pmc      bulk_size=8000            append-no-conflicts  defaults
+    20160518T112341Z  pmc      bulk_size=2000,clients=16 append-no-conflicts  defaults
 
 Note that the default values are not recorded or shown (Rally does not know about them).
 
diff --git a/docs/metrics.rst b/docs/metrics.rst
index 9f952e04..d6ba4a61 100644
--- a/docs/metrics.rst
+++ b/docs/metrics.rst
@@ -149,4 +149,6 @@ Rally stores the following metrics:
 * ``indexing_throttle_time``: Total time that indexing has been throttled as reported by the indices stats API. Note that this is not Wall clock time.
 * ``refresh_total_time``: Total time used for index refresh as reported by the indices stats API. Note that this is not Wall clock time.
 * ``flush_total_time``: Total time used for index flush as reported by the indices stats API. Note that this is not Wall clock time.
-* ``final_index_size_bytes``: Final resulting index size after the benchmark.
+* ``final_index_size_bytes``: Final resulting index size on the file system after all nodes have been shutdown at the end of the benchmark. It includes all files in the nodes' data directories (actual index files and translog).
+* ``store_size_in_bytes``: The size in bytes of the index (excluding the translog) as reported by the indices stats API.
+* ``translog_size_in_bytes``: The size in bytes of the translog as reported by the indices stats API.
diff --git a/docs/summary_report.rst b/docs/summary_report.rst
index e1edb140..46e9c16e 100644
--- a/docs/summary_report.rst
+++ b/docs/summary_report.rst
@@ -81,9 +81,21 @@ Total Old Gen GC
 Index size
 ----------
 
-* **Definition**: Final resulting index size after the benchmark.
+* **Definition**: Final resulting index size on the file system after all nodes have been shutdown at the end of the benchmark. It includes all files in the nodes' data directories (actual index files and translog).
 * **Corresponding metrics key**: ``final_index_size_bytes``
 
+Store size
+----------
+
+* **Definition**: The size in bytes of the index (excluding the translog) as reported by the indices stats API.
+* **Corresponding metrics key**: ``store_size_in_bytes``
+
+Translog size
+-------------
+
+* **Definition**: The size in bytes of the translog as reported by the indices stats API.
+* **Corresponding metrics key**: ``translog_size_in_bytes``
+
 Totally written
 ---------------
 
diff --git a/docs/track.rst b/docs/track.rst
index 7af77b92..0bea3c76 100644
--- a/docs/track.rst
+++ b/docs/track.rst
@@ -665,7 +665,6 @@ Each challenge consists of the following properties:
 * ``name`` (mandatory): A descriptive name of the challenge. Should not contain spaces in order to simplify handling on the command line for users.
 * ``description`` (optional): A human readable description of the challenge.
 * ``default`` (optional): If true, Rally selects this challenge by default if the user did not specify a challenge on the command line. If your track only defines one challenge, it is implicitly selected as default, otherwise you need define ``"default": true`` on exactly one challenge.
-* ``index-settings`` (optional): Defines the index settings of the benchmark candidate when an index is created.
 * ``schedule`` (mandatory): Defines the concrete execution order of operations. It is described in more detail below.
 
 .. note::
diff --git a/esrally/client.py b/esrally/client.py
index f81d432b..8da59ff8 100644
--- a/esrally/client.py
+++ b/esrally/client.py
@@ -12,22 +12,47 @@ class EsClientFactory:
     Abstracts how the Elasticsearch client is created. Intended for testing.
     """
     def __init__(self, hosts, client_options):
-        logger.info("Creating ES client connected to %s with options [%s]" % (hosts, client_options))
+        masked_client_options = dict(client_options)
+        if "basic_auth_password" in masked_client_options:
+            masked_client_options["basic_auth_password"] = "*****"
+        if "http_auth" in masked_client_options:
+            masked_client_options["http_auth"] = (client_options["http_auth"][0], "*****")
+        logger.info("Creating ES client connected to %s with options [%s]", hosts, masked_client_options)
         self.hosts = hosts
         self.client_options = client_options
+        self.ssl_context = None
+
+        # we're using an SSL context now and it is not allowed to have use_ssl present in client options anymore
+        if client_options.pop("use_ssl", False):
+            import ssl
+            from elasticsearch.connection import create_ssl_context
+            logger.info("SSL support: on")
+            client_options["scheme"] = "https"
+
+            self.ssl_context = create_ssl_context(cafile=client_options.pop("ca_certs", certifi.where()))
+
+            if not client_options.pop("verify_certs", True):
+                logger.info("SSL certificate verification: off")
+                self.ssl_context.check_hostname = False
+                self.ssl_context.verify_mode = ssl.CERT_NONE
+
+                logger.warning("User has enabled SSL but disabled certificate verification. This is dangerous but may be ok for a "
+                               "benchmark. Disabling urllib warnings now to avoid a logging storm. "
+                               "See https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings for details.")
+                # disable:  "InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly \
+                # advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings"
+                urllib3.disable_warnings()
+            else:
+                logger.info("SSL certificate verification: on")
+        else:
+            logger.info("SSL support: off")
+            client_options["scheme"] = "http"
 
-        if self._is_set(client_options, "use_ssl") and self._is_set(client_options, "verify_certs") and "ca_certs" not in client_options:
-            self.client_options["ca_certs"] = certifi.where()
-        elif self._is_set(client_options, "use_ssl") and not self._is_set(client_options, "verify_certs"):
-            logger.warning("User has enabled SSL but disabled certificate verification. This is dangerous but may be ok for a benchmark. "
-                           "Disabling urllib warnings now to avoid a logging storm. "
-                           "See https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings for details.")
-            # disable:  "InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly \
-            # advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings"
-            urllib3.disable_warnings()
         if self._is_set(client_options, "basic_auth_user") and self._is_set(client_options, "basic_auth_password"):
-            # Maybe we should remove these keys from the dict?
-            self.client_options["http_auth"] = (client_options["basic_auth_user"], client_options["basic_auth_password"])
+            logger.info("HTTP basic authentication: on")
+            self.client_options["http_auth"] = (client_options.pop("basic_auth_user"), client_options.pop("basic_auth_password"))
+        else:
+            logger.info("HTTP basic authentication: off")
 
     def _is_set(self, client_opts, k):
         try:
@@ -55,8 +80,12 @@ class EsClientFactory:
             def __init__(self, compressed=False, **kwargs):
                 super(ConfigurableHttpConnection, self).__init__(**kwargs)
                 if compressed:
+                    logger.info("HTTP compression: on")
                     self.headers.update(urllib3.make_headers(accept_encoding=True))
                     self.headers.update({"Content-Encoding": "gzip"})
+                else:
+                    logger.info("HTTP compression: off")
                 self.pool = PoolWrap(self.pool, **kwargs)
 
-        return elasticsearch.Elasticsearch(hosts=self.hosts, connection_class=ConfigurableHttpConnection, **self.client_options)
+        return elasticsearch.Elasticsearch(hosts=self.hosts, connection_class=ConfigurableHttpConnection,
+                                           ssl_context=self.ssl_context, **self.client_options)
diff --git a/esrally/mechanic/telemetry.py b/esrally/mechanic/telemetry.py
index 6d8ae9c0..27bcdd82 100644
--- a/esrally/mechanic/telemetry.py
+++ b/esrally/mechanic/telemetry.py
@@ -708,7 +708,7 @@ class IndexStats(InternalTelemetryDevice):
         # the pipeline "benchmark-only" where we don't have control over the cluster and the user might not have restarted
         # the cluster so we can at least tell them.
         if self.first_time:
-            index_times = self.index_times(self.primaries_index_stats())
+            index_times = self.index_times(self.index_stats()["primaries"])
             for k, v in index_times.items():
                 if v > 0:
                     console.warn("%s is %d ms indicating that the cluster is not in a defined clean state. Recorded index time "
@@ -718,8 +718,9 @@ class IndexStats(InternalTelemetryDevice):
     def on_benchmark_stop(self):
         import json
         logger.info("Gathering indices stats for all primaries on benchmark stop.")
-        p = self.primaries_index_stats()
-        logger.info("Returned indices stats:\n%s" % json.dumps(p, indent=2))
+        index_stats = self.index_stats()
+        logger.info("Returned indices stats:\n%s" % json.dumps(index_stats, indent=2))
+        p = index_stats["primaries"]
         # actually this is add_count
         self.add_metrics(self.extract_value(p, ["segments", "count"]), "segments_count")
         self.add_metrics(self.extract_value(p, ["segments", "memory_in_bytes"]), "segments_memory_in_bytes", "byte")
@@ -733,12 +734,14 @@ class IndexStats(InternalTelemetryDevice):
         self.add_metrics(self.extract_value(p, ["segments", "terms_memory_in_bytes"]), "segments_terms_memory_in_bytes", "byte")
         self.add_metrics(self.extract_value(p, ["segments", "norms_memory_in_bytes"]), "segments_norms_memory_in_bytes", "byte")
         self.add_metrics(self.extract_value(p, ["segments", "points_memory_in_bytes"]), "segments_points_memory_in_bytes", "byte")
+        self.add_metrics(self.extract_value(index_stats, ["total", "store", "size_in_bytes"]), "store_size_in_bytes", "byte")
+        self.add_metrics(self.extract_value(index_stats, ["total", "translog", "size_in_bytes"]), "translog_size_in_bytes", "byte")
 
-    def primaries_index_stats(self):
+    def index_stats(self):
         # noinspection PyBroadException
         try:
             stats = self.client.indices.stats(metric="_all", level="shards")
-            return stats["_all"]["primaries"]
+            return stats["_all"]
         except BaseException:
             logger.exception("Could not retrieve index stats.")
             return {}
diff --git a/esrally/metrics.py b/esrally/metrics.py
index 1e284dd7..44ce00c6 100644
--- a/esrally/metrics.py
+++ b/esrally/metrics.py
@@ -132,18 +132,24 @@ class EsClientFactory:
         password = self._config.opts("reporting", "datastore.password")
         verify = self._config.opts("reporting", "datastore.ssl.verification_mode", default_value="full", mandatory=False) != "none"
         ca_path = self._config.opts("reporting", "datastore.ssl.certificate_authorities", default_value=None, mandatory=False)
-        if ca_path is None and verify:
-            ca_path = certifi.where()
 
+        from esrally import client
+
+        # Instead of duplicating code, we're just adapting the metrics store specific properties to match the regular client options.
+        client_options = {
+            "use_ssl": secure,
+            "verify_certs": verify,
+            "timeout": 120
+        }
+        if ca_path:
+            client_options["ca_certs"] = ca_path
         if user and password:
-            auth = (user, password)
-        else:
-            auth = None
-        logger.info("Creating connection to metrics store at %s:%s" % (host, port))
-        import elasticsearch
-        self._client = elasticsearch.Elasticsearch(hosts=[{"host": host, "port": port}],
-                                                   use_ssl=secure, http_auth=auth, verify_certs=verify, ca_certs=ca_path,
-                                                   timeout=120, request_timeout=120)
+            client_options["basic_auth_user"] = user
+            client_options["basic_auth_password"] = password
+
+        logger.info("Creating connection to metrics store at %s:%s", host, port)
+        factory = client.EsClientFactory(hosts=[{"host": host, "port": port}], client_options=client_options)
+        self._client = factory.create()
 
     def create(self):
         return EsClient(self._client)
diff --git a/esrally/reporter.py b/esrally/reporter.py
index ee0b997a..c1bcfdca 100644
--- a/esrally/reporter.py
+++ b/esrally/reporter.py
@@ -168,9 +168,13 @@ class StatsCalculator:
         result.memory_points = self.median("segments_points_memory_in_bytes")
         result.memory_stored_fields = self.median("segments_stored_fields_memory_in_bytes")
 
-        # This metric will only be written for the last iteration (as it can only be determined after the cluster has been shut down)
         logger.debug("Gathering disk metrics.")
+        # This metric will only be written for the last iteration (as it can only be determined after the cluster has been shut down)
         result.index_size = self.sum("final_index_size_bytes")
+        # we need to use the median here because these two are captured with the indices stats API and thus once per lap. If we'd
+        # sum up the values we'd get wrong results for benchmarks that ran for multiple laps.
+        result.store_size = self.median("store_size_in_bytes")
+        result.translog_size = self.median("translog_size_in_bytes")
         result.bytes_written = self.sum("disk_io_write_bytes")
 
         # convert to int, fraction counts are senseless
@@ -264,6 +268,8 @@ class Stats:
         self.memory_stored_fields = self.v(d, "memory_stored_fields")
 
         self.index_size = self.v(d, "index_size")
+        self.store_size = self.v(d, "store_size")
+        self.translog_size = self.v(d, "translog_size")
         self.bytes_written = self.v(d, "bytes_written")
 
         self.segment_count = self.v(d, "segment_count")
@@ -497,6 +503,8 @@ class SummaryReporter:
 
     def report_disk_usage(self, stats):
         return self.join(
+            self.line("Store size", "", stats.store_size, "GB", convert.bytes_to_gb),
+            self.line("Translog size", "", stats.translog_size, "GB", convert.bytes_to_gb),
             self.line("Index size", "", stats.index_size, "GB", convert.bytes_to_gb),
             self.line("Totally written", "", stats.bytes_written, "GB", convert.bytes_to_gb)
         )
@@ -688,6 +696,10 @@ class ComparisonReporter:
 
     def report_disk_usage(self, baseline_stats, contender_stats):
         return self.join(
+            self.line("Store size", baseline_stats.store_size, contender_stats.store_size, "", "GB",
+                      treat_increase_as_improvement=False, formatter=convert.bytes_to_gb),
+            self.line("Translog size", baseline_stats.translog_size, contender_stats.translog_size, "", "GB",
+                      treat_increase_as_improvement=False, formatter=convert.bytes_to_gb),
             self.line("Index size", baseline_stats.index_size, contender_stats.index_size, "", "GB",
                       treat_increase_as_improvement=False, formatter=convert.bytes_to_gb),
             self.line("Totally written", baseline_stats.bytes_written, contender_stats.bytes_written, "", "GB",
diff --git a/esrally/resources/track-schema.json b/esrally/resources/track-schema.json
index f148778f..8e9c3829 100644
--- a/esrally/resources/track-schema.json
+++ b/esrally/resources/track-schema.json
@@ -29,10 +29,6 @@
           "type": "object",
           "description": "Defines the cluster settings of the benchmark candidate."
         },
-        "index-settings": {
-          "type": "object",
-          "description": "Defines the index settings of the benchmark candidate when an index is created."
-        },
         "schedule": {
           "type": "array",
           "minItems": 1,
diff --git a/esrally/track/loader.py b/esrally/track/loader.py
index 5adf6d71..d04c516d 100644
--- a/esrally/track/loader.py
+++ b/esrally/track/loader.py
@@ -829,14 +829,8 @@ class TrackSpecificationReader:
             meta_data = self._r(challenge_spec, "meta", error_ctx=name, mandatory=False)
             # if we only have one challenge it is treated as default challenge, no matter what the user has specified
             default = number_of_challenges == 1 or self._r(challenge_spec, "default", error_ctx=name, mandatory=False)
-            # TODO #381: Remove this setting
-            index_settings = self._r(challenge_spec, "index-settings", error_ctx=name, mandatory=False)
             cluster_settings = self._r(challenge_spec, "cluster-settings", error_ctx=name, mandatory=False)
 
-            if index_settings and self.name not in DEFAULT_TRACKS:
-                console.warn("Challenge [%s] in track [%s] defines the [index-settings] property which will be removed soon. For details "
-                             "please see the migration guide in the docs." % (name, self.name))
-
             if default and default_challenge is not None:
                 self._error("Both '%s' and '%s' are defined as default challenges. Please define only one of them as default."
                             % (default_challenge.name, name))
@@ -867,7 +861,6 @@ class TrackSpecificationReader:
                                         meta_data=meta_data,
                                         description=description,
                                         user_info=user_info,
-                                        index_settings=index_settings,
                                         cluster_settings=cluster_settings,
                                         default=default,
                                         schedule=schedule)
diff --git a/esrally/track/track.py b/esrally/track/track.py
index 2bd67231..1b9dde50 100644
--- a/esrally/track/track.py
+++ b/esrally/track/track.py
@@ -349,7 +349,6 @@ class Challenge:
                  name,
                  description=None,
                  user_info=None,
-                 index_settings=None,
                  cluster_settings=None,
                  default=False,
                  meta_data=None,
@@ -358,7 +357,6 @@ class Challenge:
         self.meta_data = meta_data if meta_data else {}
         self.description = description
         self.user_info = user_info
-        self.index_settings = index_settings if index_settings else {}
         self.cluster_settings = cluster_settings if cluster_settings else {}
         self.default = default
         self.schedule = schedule if schedule else []
@@ -379,13 +377,13 @@ class Challenge:
         return ", ".join(r)
 
     def __hash__(self):
-        return hash(self.name) ^ hash(self.description) ^ hash(self.index_settings) ^ hash(self.cluster_settings) ^ hash(self.default) ^ \
+        return hash(self.name) ^ hash(self.description) ^ hash(self.cluster_settings) ^ hash(self.default) ^ \
                hash(self.meta_data) ^ hash(self.schedule)
 
     def __eq__(self, othr):
         return (isinstance(othr, type(self)) and
-                (self.name, self.description, self.index_settings, self.cluster_settings, self.default, self.meta_data, self.schedule) ==
-                (othr.name, othr.description, othr.index_settings, othr.cluster_settings, othr.default, othr.meta_data, othr.schedule))
+                (self.name, self.description, self.cluster_settings, self.default, self.meta_data, self.schedule) ==
+                (othr.name, othr.description, othr.cluster_settings, othr.default, othr.meta_data, othr.schedule))
 
 
 @unique
diff --git a/run.sh b/run.sh
index 6fdd7311..5c952382 100755
--- a/run.sh
+++ b/run.sh
@@ -18,9 +18,9 @@ install_esrally_with_setuptools () {
     fi
 
     if [[ ${IN_VIRTUALENV} == 0 ]]; then
-        python3 setup.py -q develop --user
+        python3 setup.py -q develop --user --upgrade
     else
-        python3 setup.py -q develop
+        python3 setup.py -q develop --upgrade
     fi
 }
 
diff --git a/setup.py b/setup.py
index 9ad27054..0accae0e 100644
--- a/setup.py
+++ b/setup.py
@@ -27,7 +27,7 @@ long_description = str_from_file("README.rst")
 #
 ################################################################################################
 install_requires = [
-    "elasticsearch==6.0.0",
+    "elasticsearch==6.2.0",
     "psutil==5.4.0",
     "py-cpuinfo==3.2.0",
     "tabulate==0.8.1",

Upgrade Elasticsearch client to 6.2.0
The Elasticsearch 6.1.1 client adds the ability to set custom HTTP headers which is necessary for some API calls (e.g. `msearch`, see also the [respective Discuss thread](https://discuss.elastic.co/t/msearch-capability/110702/11)).

When we upgrade, we should also reimplement SSL handling as described in https://github.com/elastic/elasticsearch-py/issues/712#issuecomment-357750570.
diff --git a/tests/mechanic/telemetry_test.py b/tests/mechanic/telemetry_test.py
index 28a2aae5..58f6e1eb 100644
--- a/tests/mechanic/telemetry_test.py
+++ b/tests/mechanic/telemetry_test.py
@@ -764,6 +764,17 @@ class IndexStatsTests(TestCase):
                     "flush": {
                         "total_time_in_millis": 100
                     }
+                },
+                "total": {
+                    "store": {
+                        "size_in_bytes": 2113867510
+                    },
+                    "translog": {
+                        "operations": 6840000,
+                        "size_in_bytes": 2647984713,
+                        "uncommitted_operations": 0,
+                        "uncommitted_size_in_bytes": 430
+                    }
                 }
             }
         })
@@ -784,7 +795,8 @@ class IndexStatsTests(TestCase):
             mock.call("segments_stored_fields_memory_in_bytes", 1024, "byte"),
             mock.call("segments_terms_memory_in_bytes", 256, "byte"),
             # we don't have norms, so nothing should have been called
-            mock.call("segments_points_memory_in_bytes", 512, "byte"),
+            mock.call("store_size_in_bytes", 2113867510, "byte"),
+            mock.call("translog_size_in_bytes", 2647984713, "byte"),
         ], any_order=True)
 
     @mock.patch("esrally.metrics.EsMetricsStore.put_value_cluster_level")
diff --git a/tests/metrics_test.py b/tests/metrics_test.py
index 1c676b4a..ea1224ca 100644
--- a/tests/metrics_test.py
+++ b/tests/metrics_test.py
@@ -668,7 +668,7 @@ class EsResultsStoreTests(TestCase):
 
         t = track.Track(name="unittest-track",
                         indices=[track.Index(name="tests", types=["test-type"])],
-                        challenges=[track.Challenge(name="index", default=True, index_settings=None, schedule=schedule)])
+                        challenges=[track.Challenge(name="index", default=True, schedule=schedule)])
 
         c = cluster.Cluster([], [], None)
         c.distribution_version = "5.0.0"
diff --git a/tests/track/loader_test.py b/tests/track/loader_test.py
index 85f8bb31..7afea9a7 100644
--- a/tests/track/loader_test.py
+++ b/tests/track/loader_test.py
@@ -691,7 +691,6 @@ class TrackPostProcessingTests(TestCase):
                 {
                     "name": "default-challenge",
                     "description": "Default challenge",
-                    "index-settings": {},
                     "schedule": [
                         {
                             "clients": 8,
@@ -764,7 +763,6 @@ class TrackPostProcessingTests(TestCase):
                 {
                     "name": "default-challenge",
                     "description": "Default challenge",
-                    "index-settings": {},
                     "schedule": [
                         {
                             "clients": 8,
@@ -1024,7 +1022,6 @@ class TrackSpecificationReaderTests(TestCase):
             "challenges": [
                 {
                     "name": "default-challenge",
-                    "index-settings": {},
                     "schedule": [
                         {
                             "clients": 8,
@@ -1148,7 +1145,6 @@ class TrackSpecificationReaderTests(TestCase):
             "challenges": [
                 {
                     "name": "default-challenge",
-                    "index-settings": {},
                     "schedule": [
                         {
                             "clients": 8,
@@ -1327,9 +1323,6 @@ class TrackSpecificationReaderTests(TestCase):
                         "mixed": True,
                         "max-clients": 8
                     },
-                    "index-settings": {
-                        "index.number_of_replicas": 2
-                    },
                     "schedule": [
                         {
                             "clients": 8,
@@ -1414,8 +1407,6 @@ class TrackSpecificationReaderTests(TestCase):
         self.assertEqual(1, len(resulting_track.challenges))
         self.assertEqual("default-challenge", resulting_track.challenges[0].name)
         self.assertEqual("Default challenge", resulting_track.challenges[0].description)
-        self.assertEqual(1, len(resulting_track.challenges[0].index_settings))
-        self.assertEqual(2, resulting_track.challenges[0].index_settings["index.number_of_replicas"])
         self.assertEqual({"mixed": True, "max-clients": 8}, resulting_track.challenges[0].meta_data)
         self.assertEqual({"append": True}, resulting_track.challenges[0].schedule[0].operation.meta_data)
         self.assertEqual({"operation-index": 0}, resulting_track.challenges[0].schedule[0].meta_data)

pip install -e .
parse_log_pytest
pytest
tox pytest pytest-benchmark
apt-get update apt-get install -y gcc
3.6
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs @ file:///opt/conda/conda-bld/attrs_1642510447205/work
certifi==2021.5.30
distlib==0.3.9
elasticsearch==6.0.0
-e git+https://github.com/elastic/rally.git@f245f685dcd625ac4d7f0fa151a885a4366f85a6#egg=esrally
filelock==3.4.1
importlib-metadata==4.8.3
importlib-resources==5.4.0
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
Jinja2==2.9.5
jsonschema==2.5.1
MarkupSafe==2.0.1
more-itertools @ file:///tmp/build/80754af9/more-itertools_1637733554872/work
packaging @ file:///tmp/build/80754af9/packaging_1637314298585/work
platformdirs==2.4.0
pluggy @ file:///tmp/build/80754af9/pluggy_1615976315926/work
psutil==5.4.0
py @ file:///opt/conda/conda-bld/py_1644396412707/work
py-cpuinfo==3.2.0
pyparsing @ file:///tmp/build/80754af9/pyparsing_1635766073266/work
pytest==6.2.4
pytest-benchmark==3.4.1
six==1.17.0
tabulate==0.8.1
thespian==3.9.2
toml @ file:///tmp/build/80754af9/toml_1616166611790/work
tox==3.28.0
typing_extensions @ file:///opt/conda/conda-bld/typing_extensions_1647553014482/work
urllib3==1.22
virtualenv==20.17.1
zipp @ file:///tmp/build/80754af9/zipp_1633618647012/work

name: rally
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=21.4.0=pyhd3eb1b0_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - importlib_metadata=4.8.1=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - more-itertools=8.12.0=pyhd3eb1b0_0
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=21.3=pyhd3eb1b0_0
  - pip=21.2.2=py36h06a4308_0
  - pluggy=0.13.1=py36h06a4308_0
  - py=1.11.0=pyhd3eb1b0_0
  - pyparsing=3.0.4=pyhd3eb1b0_0
  - pytest=6.2.4=py36h06a4308_2
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - toml=0.10.2=pyhd3eb1b0_0
  - typing_extensions=4.1.1=pyh06a4308_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.6.0=pyhd3eb1b0_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - distlib==0.3.9
      - elasticsearch==6.0.0
      - filelock==3.4.1
      - importlib-metadata==4.8.3
      - importlib-resources==5.4.0
      - jinja2==2.9.5
      - jsonschema==2.5.1
      - markupsafe==2.0.1
      - platformdirs==2.4.0
      - psutil==5.4.0
      - py-cpuinfo==3.2.0
      - pytest-benchmark==3.4.1
      - six==1.17.0
      - tabulate==0.8.1
      - thespian==3.9.2
      - tox==3.28.0
      - urllib3==1.22
      - virtualenv==20.17.1
prefix: /opt/conda/envs/rally

tests/mechanic/telemetry_test.py::IndexStatsTests::test_stores_available_index_stats
tests/mechanic/telemetry_test.py::TelemetryTests::test_merges_options_set_by_different_devices tests/mechanic/telemetry_test.py::StartupTimeTests::test_store_calculated_metrics tests/mechanic/telemetry_test.py::MergePartsDeviceTests::test_store_calculated_metrics tests/mechanic/telemetry_test.py::MergePartsDeviceTests::test_store_nothing_if_no_metrics_present tests/mechanic/telemetry_test.py::JfrTests::test_sets_options_for_java_9_or_above_custom_recording_template tests/mechanic/telemetry_test.py::JfrTests::test_sets_options_for_java_9_or_above_default_recording_template tests/mechanic/telemetry_test.py::JfrTests::test_sets_options_for_pre_java_9_custom_recording_template tests/mechanic/telemetry_test.py::JfrTests::test_sets_options_for_pre_java_9_default_recording_template tests/mechanic/telemetry_test.py::GcTests::test_sets_options_for_java_9_or_above tests/mechanic/telemetry_test.py::GcTests::test_sets_options_for_pre_java_9 tests/mechanic/telemetry_test.py::ClusterEnvironmentInfoTests::test_stores_cluster_level_metrics_on_attach tests/mechanic/telemetry_test.py::NodeEnvironmentInfoTests::test_stores_node_level_metrics_on_attach tests/mechanic/telemetry_test.py::ExternalEnvironmentInfoTests::test_fallback_when_host_not_available tests/mechanic/telemetry_test.py::ExternalEnvironmentInfoTests::test_stores_all_node_metrics_on_attach tests/mechanic/telemetry_test.py::ClusterMetaDataInfoTests::test_enriches_cluster_nodes_for_elasticsearch_1_x tests/mechanic/telemetry_test.py::ClusterMetaDataInfoTests::test_enriches_cluster_nodes_for_elasticsearch_after_1_x tests/mechanic/telemetry_test.py::NodeStatsTests::test_stores_only_diff_of_gc_times tests/mechanic/telemetry_test.py::IndexStatsTests::test_index_stats_are_per_lap tests/mechanic/telemetry_test.py::IndexSizeTests::test_stores_index_size_for_data_paths tests/mechanic/telemetry_test.py::IndexSizeTests::test_stores_nothing_if_no_data_path tests/metrics_test.py::ExtractUserTagsTests::test_extracts_proper_user_tags tests/metrics_test.py::ExtractUserTagsTests::test_missing_comma_raises_error tests/metrics_test.py::ExtractUserTagsTests::test_missing_value_raises_error tests/metrics_test.py::ExtractUserTagsTests::test_no_tags_returns_empty_dict tests/metrics_test.py::EsClientTests::test_fails_after_too_many_timeouts tests/metrics_test.py::EsClientTests::test_raises_rally_error_on_unknown_problems tests/metrics_test.py::EsClientTests::test_raises_sytem_setup_error_on_authentication_problems tests/metrics_test.py::EsClientTests::test_raises_sytem_setup_error_on_authorization_problems tests/metrics_test.py::EsClientTests::test_raises_sytem_setup_error_on_connection_problems tests/metrics_test.py::EsClientTests::test_retries_on_timeouts tests/metrics_test.py::EsMetricsTests::test_get_error_rate_additional_unknown_key tests/metrics_test.py::EsMetricsTests::test_get_error_rate_explicit_one tests/metrics_test.py::EsMetricsTests::test_get_error_rate_explicit_zero tests/metrics_test.py::EsMetricsTests::test_get_error_rate_implicit_one tests/metrics_test.py::EsMetricsTests::test_get_error_rate_implicit_zero tests/metrics_test.py::EsMetricsTests::test_get_error_rate_mixed tests/metrics_test.py::EsMetricsTests::test_get_median tests/metrics_test.py::EsMetricsTests::test_get_value tests/metrics_test.py::EsMetricsTests::test_put_value_with_explicit_timestamps tests/metrics_test.py::EsMetricsTests::test_put_value_with_meta_info tests/metrics_test.py::EsMetricsTests::test_put_value_without_meta_info tests/metrics_test.py::EsRaceStoreTests::test_store_race tests/metrics_test.py::EsResultsStoreTests::test_store_results tests/metrics_test.py::InMemoryMetricsStoreTests::test_externalize_and_bulk_add tests/metrics_test.py::InMemoryMetricsStoreTests::test_get_error_rate_by_sample_type tests/metrics_test.py::InMemoryMetricsStoreTests::test_get_error_rate_mixed tests/metrics_test.py::InMemoryMetricsStoreTests::test_get_error_rate_zero_without_samples tests/metrics_test.py::InMemoryMetricsStoreTests::test_get_median tests/metrics_test.py::InMemoryMetricsStoreTests::test_get_percentile tests/metrics_test.py::InMemoryMetricsStoreTests::test_get_value tests/metrics_test.py::InMemoryMetricsStoreTests::test_meta_data_per_document tests/metrics_test.py::FileRaceStoreTests::test_store_race tests/track/loader_test.py::SimpleTrackRepositoryTests::test_track_from_directory tests/track/loader_test.py::SimpleTrackRepositoryTests::test_track_from_directory_without_track tests/track/loader_test.py::SimpleTrackRepositoryTests::test_track_from_file tests/track/loader_test.py::SimpleTrackRepositoryTests::test_track_from_file_but_not_json tests/track/loader_test.py::SimpleTrackRepositoryTests::test_track_from_named_pipe tests/track/loader_test.py::SimpleTrackRepositoryTests::test_track_from_non_existing_path tests/track/loader_test.py::GitRepositoryTests::test_track_from_existing_repo tests/track/loader_test.py::TrackPreparationTests::test_decompresses_if_archive_available tests/track/loader_test.py::TrackPreparationTests::test_does_nothing_if_document_file_available tests/track/loader_test.py::TrackPreparationTests::test_download_document_archive_if_no_file_available tests/track/loader_test.py::TrackPreparationTests::test_download_document_file_if_no_file_available tests/track/loader_test.py::TrackPreparationTests::test_prepare_bundled_document_set_decompresses_compressed_docs tests/track/loader_test.py::TrackPreparationTests::test_prepare_bundled_document_set_does_nothing_if_no_document_files tests/track/loader_test.py::TrackPreparationTests::test_prepare_bundled_document_set_error_compressed_docs_wrong_size tests/track/loader_test.py::TrackPreparationTests::test_prepare_bundled_document_set_if_document_file_available tests/track/loader_test.py::TrackPreparationTests::test_prepare_bundled_document_set_uncompressed_docs_wrong_size tests/track/loader_test.py::TrackPreparationTests::test_raise_download_error_if_no_url_provided_and_file_missing tests/track/loader_test.py::TrackPreparationTests::test_raise_download_error_if_no_url_provided_and_wrong_file_size tests/track/loader_test.py::TrackPreparationTests::test_raise_download_error_if_offline tests/track/loader_test.py::TrackPreparationTests::test_raise_download_error_no_test_mode_file tests/track/loader_test.py::TrackPreparationTests::test_raise_download_error_on_connection_problems tests/track/loader_test.py::TrackPreparationTests::test_raise_error_if_compressed_does_not_contain_expected_document_file tests/track/loader_test.py::TrackPreparationTests::test_raise_error_on_wrong_uncompressed_file_size tests/track/loader_test.py::TemplateRenderTests::test_render_simple_template tests/track/loader_test.py::TemplateRenderTests::test_render_template_with_external_variables tests/track/loader_test.py::TemplateRenderTests::test_render_template_with_globbing tests/track/loader_test.py::TemplateRenderTests::test_render_template_with_variables tests/track/loader_test.py::TrackPostProcessingTests::test_post_processes_track_spec tests/track/loader_test.py::TrackPathTests::test_sets_absolute_path tests/track/loader_test.py::TrackFilterTests::test_create_filters_from_empty_included_tasks tests/track/loader_test.py::TrackFilterTests::test_create_filters_from_mixed_included_tasks tests/track/loader_test.py::TrackFilterTests::test_filters_tasks tests/track/loader_test.py::TrackFilterTests::test_rejects_invalid_syntax tests/track/loader_test.py::TrackFilterTests::test_rejects_unknown_filter_type tests/track/loader_test.py::TrackSpecificationReaderTests::test_at_least_one_default_challenge tests/track/loader_test.py::TrackSpecificationReaderTests::test_can_read_track_info tests/track/loader_test.py::TrackSpecificationReaderTests::test_description_is_optional tests/track/loader_test.py::TrackSpecificationReaderTests::test_document_count_mandatory_if_file_present tests/track/loader_test.py::TrackSpecificationReaderTests::test_exactly_one_default_challenge tests/track/loader_test.py::TrackSpecificationReaderTests::test_inline_operations tests/track/loader_test.py::TrackSpecificationReaderTests::test_not_more_than_one_default_challenge_possible tests/track/loader_test.py::TrackSpecificationReaderTests::test_parallel_tasks_with_completed_by_set tests/track/loader_test.py::TrackSpecificationReaderTests::test_parallel_tasks_with_completed_by_set_multiple_tasks_match tests/track/loader_test.py::TrackSpecificationReaderTests::test_parallel_tasks_with_completed_by_set_no_task_matches tests/track/loader_test.py::TrackSpecificationReaderTests::test_parallel_tasks_with_default_clients_does_not_propagate tests/track/loader_test.py::TrackSpecificationReaderTests::test_parallel_tasks_with_default_values tests/track/loader_test.py::TrackSpecificationReaderTests::test_parse_challenge_and_challenges_are_defined tests/track/loader_test.py::TrackSpecificationReaderTests::test_parse_duplicate_explicit_task_names tests/track/loader_test.py::TrackSpecificationReaderTests::test_parse_duplicate_implicit_task_names tests/track/loader_test.py::TrackSpecificationReaderTests::test_parse_missing_challenge_or_challenges tests/track/loader_test.py::TrackSpecificationReaderTests::test_parse_unique_task_names tests/track/loader_test.py::TrackSpecificationReaderTests::test_parse_valid_track_specification tests/track/loader_test.py::TrackSpecificationReaderTests::test_parse_valid_track_specification_with_index_template tests/track/loader_test.py::TrackSpecificationReaderTests::test_parse_with_mixed_warmup_iterations_and_measurement tests/track/loader_test.py::TrackSpecificationReaderTests::test_parse_with_mixed_warmup_time_period_and_iterations tests/track/loader_test.py::TrackSpecificationReaderTests::test_selects_sole_challenge_implicitly_as_default tests/track/loader_test.py::TrackSpecificationReaderTests::test_supports_target_interval tests/track/loader_test.py::TrackSpecificationReaderTests::test_supports_target_throughput tests/track/loader_test.py::TrackSpecificationReaderTests::test_unique_challenge_names
docs/command_line_reference.rst docs/metrics.rst esrally/metrics.py setup.py esrally/client.py esrally/track/track.py esrally/resources/track-schema.json docs/track.rst run.sh esrally/reporter.py esrally/mechanic/telemetry.py docs/summary_report.rst esrally/track/loader.py
docs/command_line_reference.rst docs/metrics.rst esrally/metrics.py setup.py esrally/client.py esrally/track/track.py esrally/resources/track-schema.json docs/track.rst run.sh esrally/reporter.py esrally/mechanic/telemetry.py docs/summary_report.rst esrally/track/loader.py