Repository: VictoriaMetrics/VictoriaMetrics
Pull request #5899 (2024-02-29 13:33:30)

opentelemetry: fix firehose message parsing
https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-metric-streams-formats-opentelemetry.html


Patch:
diff --git a/README.md b/README.md
index b5b6eee88..c99cb2be4 100644
--- a/README.md
+++ b/README.md
@@ -911,9 +911,9 @@ VictoriaMetrics supports the following handlers from [Prometheus querying API](h
 
 * [/api/v1/query](https://docs.victoriametrics.com/keyConcepts.html#instant-query)
 * [/api/v1/query_range](https://docs.victoriametrics.com/keyConcepts.html#range-query)
-* [/api/v1/series](https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers)
-* [/api/v1/labels](https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names)
-* [/api/v1/label/.../values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values)
+* [/api/v1/series](https://docs.victoriametrics.com/url-examples/#apiv1series)
+* [/api/v1/labels](https://docs.victoriametrics.com/url-examples/#apiv1labels)
+* [/api/v1/label/.../values](https://docs.victoriametrics.com/url-examples/#apiv1labelvalues)
 * [/api/v1/status/tsdb](https://prometheus.io/docs/prometheus/latest/querying/api/#tsdb-stats). See [these docs](#tsdb-stats) for details.
 * [/api/v1/targets](https://prometheus.io/docs/prometheus/latest/querying/api/#targets) - see [these docs](#how-to-scrape-prometheus-exporters-such-as-node-exporter) for more details.
 * [/federate](https://prometheus.io/docs/prometheus/latest/federation/) - see [these docs](#federation) for more details.
@@ -1690,39 +1690,38 @@ By default, VictoriaMetrics is tuned for an optimal resource usage under typical
   during [subquery](https://docs.victoriametrics.com/MetricsQL.html#subqueries) evaluation.
 - `-search.maxSeriesPerAggrFunc` limits the number of time series, which can be generated by [MetricsQL aggregate functions](https://docs.victoriametrics.com/MetricsQL.html#aggregate-functions)
   in a single query.
-- `-search.maxSeries` limits the number of time series, which may be returned from [/api/v1/series](https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers).
+- `-search.maxSeries` limits the number of time series, which may be returned from [/api/v1/series](https://docs.victoriametrics.com/url-examples/#apiv1series).
   This endpoint is used mostly by Grafana for auto-completion of metric names, label names and label values. Queries to this endpoint may take big amounts
   of CPU time and memory when the database contains big number of unique time series because of [high churn rate](https://docs.victoriametrics.com/FAQ.html#what-is-high-churn-rate).
   In this case it might be useful to set the `-search.maxSeries` to quite low value in order limit CPU and memory usage.
   See also `-search.maxLabelsAPIDuration` and `-search.maxLabelsAPISeries`.
-- `-search.maxTagKeys` limits the number of items, which may be returned from [/api/v1/labels](https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names).
+- `-search.maxTagKeys` limits the number of items, which may be returned from [/api/v1/labels](https://docs.victoriametrics.com/url-examples/#apiv1labels).
   This endpoint is used mostly by Grafana for auto-completion of label names. Queries to this endpoint may take big amounts of CPU time and memory
   when the database contains big number of unique time series because of [high churn rate](https://docs.victoriametrics.com/FAQ.html#what-is-high-churn-rate).
   In this case it might be useful to set the `-search.maxTagKeys` to quite low value in order to limit CPU and memory usage.
   See also `-search.maxLabelsAPIDuration` and `-search.maxLabelsAPISeries`.
-- `-search.maxTagValues` limits the number of items, which may be returned from [/api/v1/label/.../values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values).
+- `-search.maxTagValues` limits the number of items, which may be returned from [/api/v1/label/.../values](https://docs.victoriametrics.com/url-examples/#apiv1labelvalues).
   This endpoint is used mostly by Grafana for auto-completion of label values. Queries to this endpoint may take big amounts of CPU time and memory
   when the database contains big number of unique time series because of [high churn rate](https://docs.victoriametrics.com/FAQ.html#what-is-high-churn-rate).
   In this case it might be useful to set the `-search.maxTagValues` to quite low value in order to limit CPU and memory usage.
   See also `-search.maxLabelsAPIDuration` and `-search.maxLabelsAPISeries`.
-- `-search.maxLabelsAPISeries` limits the number of time series, which can be scanned when performing [/api/v1/labels](https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names),
-  [/api/v1/label/.../values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values)
-  or [/api/v1/series](https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers) requests.
+- `-search.maxLabelsAPISeries` limits the number of time series, which can be scanned when performing [/api/v1/labels](https://docs.victoriametrics.com/url-examples/#apiv1labels),
+  [/api/v1/label/.../values](https://docs.victoriametrics.com/url-examples/#apiv1labelvalues)
+  or [/api/v1/series](https://docs.victoriametrics.com/url-examples/#apiv1series) requests.
   These endpoints are used mostly by Grafana for auto-completion of label names and label values. Queries to these endpoints may take big amounts of CPU time and memory
   when the database contains big number of unique time series because of [high churn rate](https://docs.victoriametrics.com/FAQ.html#what-is-high-churn-rate).
   In this case it might be useful to set the `-search.maxLabelsAPISeries` to quite low value in order to limit CPU and memory usage.
   See also `-search.maxLabelsAPIDuration` and `-search.ignoreExtraFiltersAtLabelsAPI`.
-- `-search.maxLabelsAPIDuration` limits the duration for reuqests to [/api/v1/labels](https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names),
-  [/api/v1/label/.../values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values)
-  or [/api/v1/series](https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers).
+- `-search.maxLabelsAPIDuration` limits the duration for reuqests to [/api/v1/labels](https://docs.victoriametrics.com/url-examples/#apiv1labels),
+  [/api/v1/label/.../values](https://docs.victoriametrics.com/url-examples/#apiv1labelvalues)
+  or [/api/v1/series](https://docs.victoriametrics.com/url-examples/#apiv1series).
   These endpoints are used mostly by Grafana for auto-completion of label names and label values. Queries to these endpoints may take big amounts of CPU time and memory
   when the database contains big number of unique time series because of [high churn rate](https://docs.victoriametrics.com/FAQ.html#what-is-high-churn-rate).
   In this case it might be useful to set the `-search.maxLabelsAPIDuration` to quite low value in order to limit CPU and memory usage.
   See also `-search.maxLabelsAPISeries` and `-search.ignoreExtraFiltersAtLabelsAPI`.
-- `-search.ignoreExtraFiltersAtLabelsAPI` enables ignoring of [`extra_label` and `extra_filters`](https://docs.victoriametrics.com/#prometheus-querying-api-enhancements)
-  query args at [/api/v1/labels](https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names),
-  [/api/v1/label/.../values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values)
-  and [/api/v1/series](https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers).
+- `-search.ignoreExtraFiltersAtLabelsAPI` enables ignoring of `match[]`, [`extra_filters[]` and `extra_label`](https://docs.victoriametrics.com/#prometheus-querying-api-enhancements)
+  query args at [/api/v1/labels](https://docs.victoriametrics.com/url-examples/#apiv1labels) and
+  [/api/v1/label/.../values](https://docs.victoriametrics.com/url-examples/#apiv1labelvalues).
   This may be useful for reducing the load on VictoriaMetrics if the provided extra filters match too many time series.
   The downside is that the endpoints can return labels and series, which do not match the provided extra filters.
 - `-search.maxTagValueSuffixesPerSearch` limits the number of entries, which may be returned from `/metrics/find` endpoint. See [Graphite Metrics API usage docs](#graphite-metrics-api-usage).
@@ -2970,7 +2969,7 @@ Pass `-help` to VictoriaMetrics in order to see the list of supported command-li
   -search.graphiteStorageStep duration
      The interval between datapoints stored in the database. It is used at Graphite Render API handler for normalizing the interval between datapoints in case it isn't normalized. It can be overridden by sending 'storage_step' query arg to /render API or by sending the desired interval via 'Storage-Step' http header during querying /render API (default 10s)
   -search.ignoreExtraFiltersAtLabelsAPI
-     Whether to ignore extra_filters and extra_label query args at /api/v1/labels, /api/v1/label/.../values and /api/v1/series . This may be useful for decreasing load on VictoriaMetrics when extra filters match too many time series. The downside is that suprflouos labels or series could be returned, which do not match the extra filters. See also -search.maxLabelsAPISeries and -search.maxLabelsAPIDuration
+     Whether to ignore match[], extra_filters[] and extra_label query args at /api/v1/labels and /api/v1/label/.../values . This may be useful for decreasing load on VictoriaMetrics when extra filters match too many time series. The downside is that suprflouos labels or series could be returned, which do not match the extra filters. See also -search.maxLabelsAPISeries and -search.maxLabelsAPIDuration
   -search.latencyOffset duration
      The time when data points become visible in query results after the collection. It can be overridden on per-query basis via latency_offset arg. Too small value can result in incomplete last points for query results (default 30s)
   -search.logQueryMemoryUsage size
diff --git a/app/vmselect/prometheus/prometheus.go b/app/vmselect/prometheus/prometheus.go
index 5a296b2bf..a897bdf7b 100644
--- a/app/vmselect/prometheus/prometheus.go
+++ b/app/vmselect/prometheus/prometheus.go
@@ -59,8 +59,8 @@ var (
 		"This option doesn't limit the number of scanned raw samples in the database. The main purpose of this option is to limit the number of per-series points "+
 		"returned to graphing UI such as VMUI or Grafana. There is no sense in setting this limit to values bigger than the horizontal resolution of the graph. "+
 		"See also -search.maxResponseSeries")
-	ignoreExtraFiltersAtLabelsAPI = flag.Bool("search.ignoreExtraFiltersAtLabelsAPI", false, "Whether to ignore extra_filters and extra_label query args at "+
-		"/api/v1/labels, /api/v1/label/.../values and /api/v1/series . This may be useful for decreasing load on VictoriaMetrics when extra filters "+
+	ignoreExtraFiltersAtLabelsAPI = flag.Bool("search.ignoreExtraFiltersAtLabelsAPI", false, "Whether to ignore match[], extra_filters[] and extra_label query args at "+
+		"/api/v1/labels and /api/v1/label/.../values . This may be useful for decreasing load on VictoriaMetrics when extra filters "+
 		"match too many time series. The downside is that suprflouos labels or series could be returned, which do not match the extra filters. "+
 		"See also -search.maxLabelsAPISeries and -search.maxLabelsAPIDuration")
 )
@@ -1181,18 +1181,18 @@ func getCommonParamsInternal(r *http.Request, startTime time.Time, requireNonEmp
 	if requireNonEmptyMatch && len(matches) == 0 {
 		return nil, fmt.Errorf("missing `match[]` arg")
 	}
-	tagFilterss, err := getTagFilterssFromMatches(matches)
-	if err != nil {
-		return nil, err
-	}
 
-	filterss := tagFilterss
+	var filterss [][]storage.TagFilter
 	if !isLabelsAPI || !*ignoreExtraFiltersAtLabelsAPI {
+		tagFilterss, err := getTagFilterssFromMatches(matches)
+		if err != nil {
+			return nil, err
+		}
 		etfs, err := searchutils.GetExtraTagFilters(r)
 		if err != nil {
 			return nil, err
 		}
-		filterss = searchutils.JoinTagFilterss(filterss, etfs)
+		filterss = searchutils.JoinTagFilterss(tagFilterss, etfs)
 	}
 
 	cp := &commonParams{
diff --git a/docs/CHANGELOG_2022.md b/docs/CHANGELOG_2022.md
index e59d20456..6abcafeeb 100644
--- a/docs/CHANGELOG_2022.md
+++ b/docs/CHANGELOG_2022.md
@@ -635,7 +635,7 @@ scrape_configs:
 
 * FEATURE: add ability to pass `limit` query arg to `api/v1/series` endpoint. This can be used if only a sample of up to `limit` series must be returned from the endpoint. See [this feature request](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2841) and [these docs](https://docs.victoriametrics.com/#prometheus-querying-api-enhancements).
 * FEATURE: [query tracing](https://docs.victoriametrics.com/Single-server-VictoriaMetrics.html#query-tracing): show timestamps in query traces in human-readable format (aka `RFC3339` in UTC timezone) instead of milliseconds since Unix epoch. For example, `2022-06-27T10:32:54.506Z` instead of `1656325974506`. This improves traces' readability.
-* FEATURE: improve performance of [/api/v1/series](https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers) requests, which return big number of time series.
+* FEATURE: improve performance of [/api/v1/series](https://docs.victoriametrics.com/url-examples/#apiv1series) requests, which return big number of time series.
 * FEATURE: [VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html): improve query performance when [replication is enabled](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#replication-and-data-safety).
 * FEATURE: [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html): properly handle partial counter resets in [remove_resets](https://docs.victoriametrics.com/MetricsQL.html#remove_resets) function. Now `remove_resets(sum(m))` should returns the expected increasing line when some time series matching `m` disappear on the selected time range. Previously such a query would return horizontal line after the disappeared series.
 * FEATURE: expose `vm_next_retention_seconds` metric at `http://victoriametrics:8428/metrics`, which shows the number of seconds left until the next `indexdb` rotation. Thanks to @guidao for the [pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/2863).
@@ -696,8 +696,8 @@ Released at 2022-06-20
 * FEATURE: add support of `lowercase` and `uppercase` relabeling actions in the same way as [Prometheus 2.36.0 does](https://github.com/prometheus/prometheus/releases/tag/v2.36.0). See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2664).
 * FEATURE: add ability to change the `indexdb` rotation timezone offset via `-retentionTimezoneOffset` command-line flag. Previously it was performed at 4am UTC time. This could lead to performance degradation in the middle of the day when VictoriaMetrics runs in time zones located too far from UTC. Thanks to @cnych for [the pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/2574).
 * FEATURE: limit the number of background merge threads on systems with big number of CPU cores by default. This increases the max size of parts, which can be created during background merge when `-storageDataPath` directory has limited free disk space. This may improve on-disk data compression efficiency and query performance. The limits can be tuned if needed with `-smallMergeConcurrency` and `-bigMergeConcurrency` command-line flags. See [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/2673).
-* FEATURE: accept optional `limit` query arg at [/api/v1/labels](https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names) and [/api/v1/label/.../values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values) for limiting the numbef of sample entries returned from these endpoints. See [these docs](https://docs.victoriametrics.com/#prometheus-querying-api-enhancements).
-* FEATURE: optimize performance for [/api/v1/labels](https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names) and [/api/v1/label/.../values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values) endpoints when `match[]`, `extra_label` or `extra_filters[]` query args are passed to these endpoints. This should help with [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1533).
+* FEATURE: accept optional `limit` query arg at [/api/v1/labels](https://docs.victoriametrics.com/url-examples/#apiv1labels) and [/api/v1/label/.../values](https://docs.victoriametrics.com/url-examples/#apiv1labelvalues) for limiting the numbef of sample entries returned from these endpoints. See [these docs](https://docs.victoriametrics.com/#prometheus-querying-api-enhancements).
+* FEATURE: optimize performance for [/api/v1/labels](https://docs.victoriametrics.com/url-examples/#apiv1labels) and [/api/v1/label/.../values](https://docs.victoriametrics.com/url-examples/#apiv1labelvalues) endpoints when `match[]`, `extra_label` or `extra_filters[]` query args are passed to these endpoints. This should help with [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1533).
 * FEATURE: [vmalert](https://docs.victoriametrics.com/vmalert.html): support `limit` param per-group for limiting number of produced samples per each rule. Thanks to @Howie59 for [implementation](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/2676).
 * FEATURE: [vmalert](https://docs.victoriametrics.com/vmalert.html): remove dependency on Internet access at [web API pages](https://docs.victoriametrics.com/vmalert.html#web). Previously the functionality and the layout of these pages was broken without Internet access. See [shis issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/2594).
 * FEATURE: [vmalert](https://docs.victoriametrics.com/vmalert.html): send alerts to the configured notifiers in parallel. Previously alerts were sent to notifiers sequentially. This could delay sending pending alerts when notifier blocks on the currently sent alert.
diff --git a/docs/Cluster-VictoriaMetrics.md b/docs/Cluster-VictoriaMetrics.md
index 168fef8f3..349222607 100644
--- a/docs/Cluster-VictoriaMetrics.md
+++ b/docs/Cluster-VictoriaMetrics.md
@@ -393,9 +393,9 @@ Check practical examples of VictoriaMetrics API [here](https://docs.victoriametr
   - `<suffix>` may have the following values:
     - `api/v1/query` - performs [PromQL instant query](https://docs.victoriametrics.com/keyConcepts.html#instant-query).
     - `api/v1/query_range` - performs [PromQL range query](https://docs.victoriametrics.com/keyConcepts.html#range-query).
-    - `api/v1/series` - performs [series query](https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers).
-    - `api/v1/labels` - returns a [list of label names](https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names).
-    - `api/v1/label/<label_name>/values` - returns values for the given `<label_name>` according [to API](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values).
+    - `api/v1/series` - performs [series query](https://docs.victoriametrics.com/url-examples/#apiv1series).
+    - `api/v1/labels` - returns a [list of label names](https://docs.victoriametrics.com/url-examples/#apiv1labels).
+    - `api/v1/label/<label_name>/values` - returns values for the given `<label_name>` according [to the API](https://docs.victoriametrics.com/url-examples/#apiv1labelvalues).
     - `federate` - returns [federated metrics](https://prometheus.io/docs/prometheus/latest/federation/).
     - `api/v1/export` - exports raw data in JSON line format. See [this article](https://medium.com/@valyala/analyzing-prometheus-data-with-external-tools-5f3e5e147639) for details.
     - `api/v1/export/native` - exports raw data in native binary format. It may be imported into another VictoriaMetrics via `api/v1/import/native` (see above).
@@ -677,42 +677,41 @@ Some workloads may need fine-grained resource usage limits. In these cases the f
   per each matching time series during [subquery](https://docs.victoriametrics.com/MetricsQL.html#subqueries) evaluation.
 - `-search.maxSeriesPerAggrFunc` limits the number of time series, which can be generated by [MetricsQL aggregate functions](https://docs.victoriametrics.com/MetricsQL.html#aggregate-functions) in a single query.
 - `-search.maxSeries` at `vmselect` limits the number of time series, which may be returned from
-  [/api/v1/series](https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers).
+  [/api/v1/series](https://docs.victoriametrics.com/url-examples/#apiv1series).
   This endpoint is used mostly by Grafana for auto-completion of metric names, label names and label values.
   Queries to this endpoint may take big amounts of CPU time and memory at `vmstorage` and `vmselect` when the database contains
   big number of unique time series because of [high churn rate](https://docs.victoriametrics.com/FAQ.html#what-is-high-churn-rate).
   In this case it might be useful to set the `-search.maxSeries` to quite low value in order limit CPU and memory usage.
 - `-search.maxTagKeys` at `vmstorage` limits the number of items, which may be returned from
-  [/api/v1/labels](https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names). This endpoint is used mostly by Grafana
+  [/api/v1/labels](https://docs.victoriametrics.com/url-examples/#apiv1labels). This endpoint is used mostly by Grafana
   for auto-completion of label names. Queries to this endpoint may take big amounts of CPU time and memory at `vmstorage` and `vmselect`
   when the database contains big number of unique time series because of [high churn rate](https://docs.victoriametrics.com/FAQ.html#what-is-high-churn-rate).
   In this case it might be useful to set the `-search.maxTagKeys` to quite low value in order to limit CPU and memory usage.
   See also `-search.maxLabelsAPIDuration` and `-search.maxLabelsAPISeries`.
 - `-search.maxTagValues` at `vmstorage` limits the number of items, which may be returned from
-  [/api/v1/label/.../values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values). This endpoint is used mostly by Grafana
+  [/api/v1/label/.../values](https://docs.victoriametrics.com/url-examples/#apiv1labelvalues). This endpoint is used mostly by Grafana
   for auto-completion of label values. Queries to this endpoint may take big amounts of CPU time and memory at `vmstorage` and `vmselect`
   when the database contains big number of unique time series because of [high churn rate](https://docs.victoriametrics.com/FAQ.html#what-is-high-churn-rate).
   In this case it might be useful to set the `-search.maxTagValues` to quite low value in order to limit CPU and memory usage.
   See also `-search.maxLabelsAPIDuration` and `-search.maxLabelsAPISeries`.
 - `-search.maxLabelsAPISeries` at `vmselect` limits the number of time series, which can be scanned
-  when performing [/api/v1/labels](https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names),
-  [/api/v1/label/.../values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values)
-  or [/api/v1/series](https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers) requests.
+  when performing [/api/v1/labels](https://docs.victoriametrics.com/url-examples/#apiv1labels),
+  [/api/v1/label/.../values](https://docs.victoriametrics.com/url-examples/#apiv1labelvalues)
+  or [/api/v1/series](https://docs.victoriametrics.com/url-examples/#apiv1series) requests.
   These endpoints are used mostly by Grafana for auto-completion of label names and label values. Queries to these endpoints may take big amounts of CPU time and memory
   when the database contains big number of unique time series because of [high churn rate](https://docs.victoriametrics.com/FAQ.html#what-is-high-churn-rate).
   In this case it might be useful to set the `-search.maxLabelsAPISeries` to quite low value in order to limit CPU and memory usage.
   See also `-search.maxLabelsAPIDuration` and `-search.ignoreExtraFiltersAtLabelsAPI`.
-- `-search.maxLabelsAPIDuration` at `vmselect` limits the duration for reuqests to [/api/v1/labels](https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names),
-  [/api/v1/label/.../values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values)
-  or [/api/v1/series](https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers).
+- `-search.maxLabelsAPIDuration` at `vmselect` limits the duration for reuqests to [/api/v1/labels](https://docs.victoriametrics.com/url-examples/#apiv1labels),
+  [/api/v1/label/.../values](https://docs.victoriametrics.com/url-examples/#apiv1labelvalues)
+  or [/api/v1/series](https://docs.victoriametrics.com/url-examples/#apiv1series).
   These endpoints are used mostly by Grafana for auto-completion of label names and label values. Queries to these endpoints may take big amounts of CPU time and memory
   when the database contains big number of unique time series because of [high churn rate](https://docs.victoriametrics.com/FAQ.html#what-is-high-churn-rate).
   In this case it might be useful to set the `-search.maxLabelsAPIDuration` to quite low value in order to limit CPU and memory usage.
   See also `-search.maxLabelsAPISeries` and `-search.ignoreExtraFiltersAtLabelsAPI`.
-- `-search.ignoreExtraFiltersAtLabelsAPI` at `vmselect` enables ignoring of [`extra_label` and `extra_filters`](https://docs.victoriametrics.com/#prometheus-querying-api-enhancements)
-  query args at [/api/v1/labels](https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names),
-  [/api/v1/label/.../values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values)
-  and [/api/v1/series](https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers).
+- `-search.ignoreExtraFiltersAtLabelsAPI` at `vmselect` enables ignoring of `match[]`, [`extra_filters[]` and `extra_label`](https://docs.victoriametrics.com/#prometheus-querying-api-enhancements)
+  query args at [/api/v1/labels](https://docs.victoriametrics.com/url-examples/#apiv1labels) and
+  [/api/v1/label/.../values](https://docs.victoriametrics.com/url-examples/#apiv1labelvalues).
   This may be useful for reducing the load on `vmstorage` if the provided extra filters match too many time series.
   The downside is that the endpoints can return labels and series, which do not match the provided extra filters.
 - `-storage.maxDailySeries` at `vmstorage` can be used for limiting the number of time series seen per day aka
@@ -1436,6 +1435,8 @@ Below is the output for `/path/to/vmselect -help`:
      The maximum number of points per series Graphite render API can return (default 1000000)
   -search.graphiteStorageStep duration
      The interval between datapoints stored in the database. It is used at Graphite Render API handler for normalizing the interval between datapoints in case it isn't normalized. It can be overridden by sending 'storage_step' query arg to /render API or by sending the desired interval via 'Storage-Step' http header during querying /render API (default 10s)
+  -search.ignoreExtraFiltersAtLabelsAPI
+     Whether to ignore match[], extra_filters[] and extra_label query args at /api/v1/labels and /api/v1/label/.../values . This may be useful for decreasing load on VictoriaMetrics when extra filters match too many time series. The downside is that suprflouos labels or series could be returned, which do not match the extra filters. See also -search.maxLabelsAPISeries and -search.maxLabelsAPIDuration
   -search.latencyOffset duration
      The time when data points become visible in query results after the collection. It can be overridden on per-query basis via latency_offset arg. Too small value can result in incomplete last points for query results (default 30s)
   -search.logQueryMemoryUsage size
diff --git a/docs/README.md b/docs/README.md
index 6e7934a3a..90371699f 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -914,9 +914,9 @@ VictoriaMetrics supports the following handlers from [Prometheus querying API](h
 
 * [/api/v1/query](https://docs.victoriametrics.com/keyConcepts.html#instant-query)
 * [/api/v1/query_range](https://docs.victoriametrics.com/keyConcepts.html#range-query)
-* [/api/v1/series](https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers)
-* [/api/v1/labels](https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names)
-* [/api/v1/label/.../values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values)
+* [/api/v1/series](https://docs.victoriametrics.com/url-examples/#apiv1series)
+* [/api/v1/labels](https://docs.victoriametrics.com/url-examples/#apiv1labels)
+* [/api/v1/label/.../values](https://docs.victoriametrics.com/url-examples/#apiv1labelvalues)
 * [/api/v1/status/tsdb](https://prometheus.io/docs/prometheus/latest/querying/api/#tsdb-stats). See [these docs](#tsdb-stats) for details.
 * [/api/v1/targets](https://prometheus.io/docs/prometheus/latest/querying/api/#targets) - see [these docs](#how-to-scrape-prometheus-exporters-such-as-node-exporter) for more details.
 * [/federate](https://prometheus.io/docs/prometheus/latest/federation/) - see [these docs](#federation) for more details.
@@ -1693,39 +1693,38 @@ By default, VictoriaMetrics is tuned for an optimal resource usage under typical
   during [subquery](https://docs.victoriametrics.com/MetricsQL.html#subqueries) evaluation.
 - `-search.maxSeriesPerAggrFunc` limits the number of time series, which can be generated by [MetricsQL aggregate functions](https://docs.victoriametrics.com/MetricsQL.html#aggregate-functions)
   in a single query.
-- `-search.maxSeries` limits the number of time series, which may be returned from [/api/v1/series](https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers).
+- `-search.maxSeries` limits the number of time series, which may be returned from [/api/v1/series](https://docs.victoriametrics.com/url-examples/#apiv1series).
   This endpoint is used mostly by Grafana for auto-completion of metric names, label names and label values. Queries to this endpoint may take big amounts
   of CPU time and memory when the database contains big number of unique time series because of [high churn rate](https://docs.victoriametrics.com/FAQ.html#what-is-high-churn-rate).
   In this case it might be useful to set the `-search.maxSeries` to quite low value in order limit CPU and memory usage.
   See also `-search.maxLabelsAPIDuration` and `-search.maxLabelsAPISeries`.
-- `-search.maxTagKeys` limits the number of items, which may be returned from [/api/v1/labels](https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names).
+- `-search.maxTagKeys` limits the number of items, which may be returned from [/api/v1/labels](https://docs.victoriametrics.com/url-examples/#apiv1labels).
   This endpoint is used mostly by Grafana for auto-completion of label names. Queries to this endpoint may take big amounts of CPU time and memory
   when the database contains big number of unique time series because of [high churn rate](https://docs.victoriametrics.com/FAQ.html#what-is-high-churn-rate).
   In this case it might be useful to set the `-search.maxTagKeys` to quite low value in order to limit CPU and memory usage.
   See also `-search.maxLabelsAPIDuration` and `-search.maxLabelsAPISeries`.
-- `-search.maxTagValues` limits the number of items, which may be returned from [/api/v1/label/.../values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values).
+- `-search.maxTagValues` limits the number of items, which may be returned from [/api/v1/label/.../values](https://docs.victoriametrics.com/url-examples/#apiv1labelvalues).
   This endpoint is used mostly by Grafana for auto-completion of label values. Queries to this endpoint may take big amounts of CPU time and memory
   when the database contains big number of unique time series because of [high churn rate](https://docs.victoriametrics.com/FAQ.html#what-is-high-churn-rate).
   In this case it might be useful to set the `-search.maxTagValues` to quite low value in order to limit CPU and memory usage.
   See also `-search.maxLabelsAPIDuration` and `-search.maxLabelsAPISeries`.
-- `-search.maxLabelsAPISeries` limits the number of time series, which can be scanned when performing [/api/v1/labels](https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names),
-  [/api/v1/label/.../values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values)
-  or [/api/v1/series](https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers) requests.
+- `-search.maxLabelsAPISeries` limits the number of time series, which can be scanned when performing [/api/v1/labels](https://docs.victoriametrics.com/url-examples/#apiv1labels),
+  [/api/v1/label/.../values](https://docs.victoriametrics.com/url-examples/#apiv1labelvalues)
+  or [/api/v1/series](https://docs.victoriametrics.com/url-examples/#apiv1series) requests.
   These endpoints are used mostly by Grafana for auto-completion of label names and label values. Queries to these endpoints may take big amounts of CPU time and memory
   when the database contains big number of unique time series because of [high churn rate](https://docs.victoriametrics.com/FAQ.html#what-is-high-churn-rate).
   In this case it might be useful to set the `-search.maxLabelsAPISeries` to quite low value in order to limit CPU and memory usage.
   See also `-search.maxLabelsAPIDuration` and `-search.ignoreExtraFiltersAtLabelsAPI`.
-- `-search.maxLabelsAPIDuration` limits the duration for reuqests to [/api/v1/labels](https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names),
-  [/api/v1/label/.../values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values)
-  or [/api/v1/series](https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers).
+- `-search.maxLabelsAPIDuration` limits the duration for reuqests to [/api/v1/labels](https://docs.victoriametrics.com/url-examples/#apiv1labels),
+  [/api/v1/label/.../values](https://docs.victoriametrics.com/url-examples/#apiv1labelvalues)
+  or [/api/v1/series](https://docs.victoriametrics.com/url-examples/#apiv1series).
   These endpoints are used mostly by Grafana for auto-completion of label names and label values. Queries to these endpoints may take big amounts of CPU time and memory
   when the database contains big number of unique time series because of [high churn rate](https://docs.victoriametrics.com/FAQ.html#what-is-high-churn-rate).
   In this case it might be useful to set the `-search.maxLabelsAPIDuration` to quite low value in order to limit CPU and memory usage.
   See also `-search.maxLabelsAPISeries` and `-search.ignoreExtraFiltersAtLabelsAPI`.
-- `-search.ignoreExtraFiltersAtLabelsAPI` enables ignoring of [`extra_label` and `extra_filters`](https://docs.victoriametrics.com/#prometheus-querying-api-enhancements)
-  query args at [/api/v1/labels](https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names),
-  [/api/v1/label/.../values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values)
-  and [/api/v1/series](https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers).
+- `-search.ignoreExtraFiltersAtLabelsAPI` enables ignoring of `match[]`, [`extra_filters[]` and `extra_label`](https://docs.victoriametrics.com/#prometheus-querying-api-enhancements)
+  query args at [/api/v1/labels](https://docs.victoriametrics.com/url-examples/#apiv1labels) and
+  [/api/v1/label/.../values](https://docs.victoriametrics.com/url-examples/#apiv1labelvalues).
   This may be useful for reducing the load on VictoriaMetrics if the provided extra filters match too many time series.
   The downside is that the endpoints can return labels and series, which do not match the provided extra filters.
 - `-search.maxTagValueSuffixesPerSearch` limits the number of entries, which may be returned from `/metrics/find` endpoint. See [Graphite Metrics API usage docs](#graphite-metrics-api-usage).
@@ -2973,7 +2972,7 @@ Pass `-help` to VictoriaMetrics in order to see the list of supported command-li
   -search.graphiteStorageStep duration
      The interval between datapoints stored in the database. It is used at Graphite Render API handler for normalizing the interval between datapoints in case it isn't normalized. It can be overridden by sending 'storage_step' query arg to /render API or by sending the desired interval via 'Storage-Step' http header during querying /render API (default 10s)
   -search.ignoreExtraFiltersAtLabelsAPI
-     Whether to ignore extra_filters and extra_label query args at /api/v1/labels, /api/v1/label/.../values and /api/v1/series . This may be useful for decreasing load on VictoriaMetrics when extra filters match too many time series. The downside is that suprflouos labels or series could be returned, which do not match the extra filters. See also -search.maxLabelsAPISeries and -search.maxLabelsAPIDuration
+     Whether to ignore match[], extra_filters[] and extra_label query args at /api/v1/labels and /api/v1/label/.../values . This may be useful for decreasing load on VictoriaMetrics when extra filters match too many time series. The downside is that suprflouos labels or series could be returned, which do not match the extra filters. See also -search.maxLabelsAPISeries and -search.maxLabelsAPIDuration
   -search.latencyOffset duration
      The time when data points become visible in query results after the collection. It can be overridden on per-query basis via latency_offset arg. Too small value can result in incomplete last points for query results (default 30s)
   -search.logQueryMemoryUsage size
diff --git a/docs/Single-server-VictoriaMetrics.md b/docs/Single-server-VictoriaMetrics.md
index b5fba9931..6feccc9ef 100644
--- a/docs/Single-server-VictoriaMetrics.md
+++ b/docs/Single-server-VictoriaMetrics.md
@@ -922,9 +922,9 @@ VictoriaMetrics supports the following handlers from [Prometheus querying API](h
 
 * [/api/v1/query](https://docs.victoriametrics.com/keyConcepts.html#instant-query)
 * [/api/v1/query_range](https://docs.victoriametrics.com/keyConcepts.html#range-query)
-* [/api/v1/series](https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers)
-* [/api/v1/labels](https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names)
-* [/api/v1/label/.../values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values)
+* [/api/v1/series](https://docs.victoriametrics.com/url-examples/#apiv1series)
+* [/api/v1/labels](https://docs.victoriametrics.com/url-examples/#apiv1labels)
+* [/api/v1/label/.../values](https://docs.victoriametrics.com/url-examples/#apiv1labelvalues)
 * [/api/v1/status/tsdb](https://prometheus.io/docs/prometheus/latest/querying/api/#tsdb-stats). See [these docs](#tsdb-stats) for details.
 * [/api/v1/targets](https://prometheus.io/docs/prometheus/latest/querying/api/#targets) - see [these docs](#how-to-scrape-prometheus-exporters-such-as-node-exporter) for more details.
 * [/federate](https://prometheus.io/docs/prometheus/latest/federation/) - see [these docs](#federation) for more details.
@@ -1701,39 +1701,38 @@ By default, VictoriaMetrics is tuned for an optimal resource usage under typical
   during [subquery](https://docs.victoriametrics.com/MetricsQL.html#subqueries) evaluation.
 - `-search.maxSeriesPerAggrFunc` limits the number of time series, which can be generated by [MetricsQL aggregate functions](https://docs.victoriametrics.com/MetricsQL.html#aggregate-functions)
   in a single query.
-- `-search.maxSeries` limits the number of time series, which may be returned from [/api/v1/series](https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers).
+- `-search.maxSeries` limits the number of time series, which may be returned from [/api/v1/series](https://docs.victoriametrics.com/url-examples/#apiv1series).
   This endpoint is used mostly by Grafana for auto-completion of metric names, label names and label values. Queries to this endpoint may take big amounts
   of CPU time and memory when the database contains big number of unique time series because of [high churn rate](https://docs.victoriametrics.com/FAQ.html#what-is-high-churn-rate).
   In this case it might be useful to set the `-search.maxSeries` to quite low value in order limit CPU and memory usage.
   See also `-search.maxLabelsAPIDuration` and `-search.maxLabelsAPISeries`.
-- `-search.maxTagKeys` limits the number of items, which may be returned from [/api/v1/labels](https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names).
+- `-search.maxTagKeys` limits the number of items, which may be returned from [/api/v1/labels](https://docs.victoriametrics.com/url-examples/#apiv1labels).
   This endpoint is used mostly by Grafana for auto-completion of label names. Queries to this endpoint may take big amounts of CPU time and memory
   when the database contains big number of unique time series because of [high churn rate](https://docs.victoriametrics.com/FAQ.html#what-is-high-churn-rate).
   In this case it might be useful to set the `-search.maxTagKeys` to quite low value in order to limit CPU and memory usage.
   See also `-search.maxLabelsAPIDuration` and `-search.maxLabelsAPISeries`.
-- `-search.maxTagValues` limits the number of items, which may be returned from [/api/v1/label/.../values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values).
+- `-search.maxTagValues` limits the number of items, which may be returned from [/api/v1/label/.../values](https://docs.victoriametrics.com/url-examples/#apiv1labelvalues).
   This endpoint is used mostly by Grafana for auto-completion of label values. Queries to this endpoint may take big amounts of CPU time and memory
   when the database contains big number of unique time series because of [high churn rate](https://docs.victoriametrics.com/FAQ.html#what-is-high-churn-rate).
   In this case it might be useful to set the `-search.maxTagValues` to quite low value in order to limit CPU and memory usage.
   See also `-search.maxLabelsAPIDuration` and `-search.maxLabelsAPISeries`.
-- `-search.maxLabelsAPISeries` limits the number of time series, which can be scanned when performing [/api/v1/labels](https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names),
-  [/api/v1/label/.../values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values)
-  or [/api/v1/series](https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers) requests.
+- `-search.maxLabelsAPISeries` limits the number of time series, which can be scanned when performing [/api/v1/labels](https://docs.victoriametrics.com/url-examples/#apiv1labels),
+  [/api/v1/label/.../values](https://docs.victoriametrics.com/url-examples/#apiv1labelvalues)
+  or [/api/v1/series](https://docs.victoriametrics.com/url-examples/#apiv1series) requests.
   These endpoints are used mostly by Grafana for auto-completion of label names and label values. Queries to these endpoints may take big amounts of CPU time and memory
   when the database contains big number of unique time series because of [high churn rate](https://docs.victoriametrics.com/FAQ.html#what-is-high-churn-rate).
   In this case it might be useful to set the `-search.maxLabelsAPISeries` to quite low value in order to limit CPU and memory usage.
   See also `-search.maxLabelsAPIDuration` and `-search.ignoreExtraFiltersAtLabelsAPI`.
-- `-search.maxLabelsAPIDuration` limits the duration for reuqests to [/api/v1/labels](https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names),
-  [/api/v1/label/.../values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values)
-  or [/api/v1/series](https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers).
+- `-search.maxLabelsAPIDuration` limits the duration for reuqests to [/api/v1/labels](https://docs.victoriametrics.com/url-examples/#apiv1labels),
+  [/api/v1/label/.../values](https://docs.victoriametrics.com/url-examples/#apiv1labelvalues)
+  or [/api/v1/series](https://docs.victoriametrics.com/url-examples/#apiv1series).
   These endpoints are used mostly by Grafana for auto-completion of label names and label values. Queries to these endpoints may take big amounts of CPU time and memory
   when the database contains big number of unique time series because of [high churn rate](https://docs.victoriametrics.com/FAQ.html#what-is-high-churn-rate).
   In this case it might be useful to set the `-search.maxLabelsAPIDuration` to quite low value in order to limit CPU and memory usage.
   See also `-search.maxLabelsAPISeries` and `-search.ignoreExtraFiltersAtLabelsAPI`.
-- `-search.ignoreExtraFiltersAtLabelsAPI` enables ignoring of [`extra_label` and `extra_filters`](https://docs.victoriametrics.com/#prometheus-querying-api-enhancements)
-  query args at [/api/v1/labels](https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names),
-  [/api/v1/label/.../values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values)
-  and [/api/v1/series](https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers).
+- `-search.ignoreExtraFiltersAtLabelsAPI` enables ignoring of `match[]`, [`extra_filters[]` and `extra_label`](https://docs.victoriametrics.com/#prometheus-querying-api-enhancements)
+  query args at [/api/v1/labels](https://docs.victoriametrics.com/url-examples/#apiv1labels) and
+  [/api/v1/label/.../values](https://docs.victoriametrics.com/url-examples/#apiv1labelvalues).
   This may be useful for reducing the load on VictoriaMetrics if the provided extra filters match too many time series.
   The downside is that the endpoints can return labels and series, which do not match the provided extra filters.
 - `-search.maxTagValueSuffixesPerSearch` limits the number of entries, which may be returned from `/metrics/find` endpoint. See [Graphite Metrics API usage docs](#graphite-metrics-api-usage).
@@ -2981,7 +2980,7 @@ Pass `-help` to VictoriaMetrics in order to see the list of supported command-li
   -search.graphiteStorageStep duration
      The interval between datapoints stored in the database. It is used at Graphite Render API handler for normalizing the interval between datapoints in case it isn't normalized. It can be overridden by sending 'storage_step' query arg to /render API or by sending the desired interval via 'Storage-Step' http header during querying /render API (default 10s)
   -search.ignoreExtraFiltersAtLabelsAPI
-     Whether to ignore extra_filters and extra_label query args at /api/v1/labels, /api/v1/label/.../values and /api/v1/series . This may be useful for decreasing load on VictoriaMetrics when extra filters match too many time series. The downside is that suprflouos labels or series could be returned, which do not match the extra filters. See also -search.maxLabelsAPISeries and -search.maxLabelsAPIDuration
+     Whether to ignore match[], extra_filters[] and extra_label query args at /api/v1/labels and /api/v1/label/.../values . This may be useful for decreasing load on VictoriaMetrics when extra filters match too many time series. The downside is that suprflouos labels or series could be returned, which do not match the extra filters. See also -search.maxLabelsAPISeries and -search.maxLabelsAPIDuration
   -search.latencyOffset duration
      The time when data points become visible in query results after the collection. It can be overridden on per-query basis via latency_offset arg. Too small value can result in incomplete last points for query results (default 30s)
   -search.logQueryMemoryUsage size
diff --git a/docs/url-examples.md b/docs/url-examples.md
index 40d739f24..ccf5521f2 100644
--- a/docs/url-examples.md
+++ b/docs/url-examples.md
@@ -266,8 +266,8 @@ By default, VictoriaMetrics returns labels seen during the last day starting at
 The specified `start..end` time range is rounded to day granularity because of performance optimization concerns.
 
 Additional information:
+* [Getting label names](https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names)
 * [Prometheus querying API usage](https://docs.victoriametrics.com/#prometheus-querying-api-usage)
-* [Querying label values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values)
 * [URL format for VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format)
 
 ### /api/v1/label/.../values
@@ -292,8 +292,8 @@ By default, VictoriaMetrics returns labels values seen during the last day start
 The specified `start..end` time range is rounded to day granularity because of performance optimization concerns.
 
 Additional information:
+* [Querying label values](https://prometheus.io/docs/prometheus/latest/querying/api/#querying-label-values)
 * [Prometheus querying API usage](https://docs.victoriametrics.com/#prometheus-querying-api-usage)
-* [Getting label names](https://prometheus.io/docs/prometheus/latest/querying/api/#getting-label-names)
 * [URL format for VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format)
 
 ### /api/v1/query
@@ -315,8 +315,8 @@ curl http://<vmselect>:8481/select/0/prometheus/api/v1/query -d 'query=vm_http_r
 
 
 Additional information:
-* [Prometheus querying API usage](https://docs.victoriametrics.com/#prometheus-querying-api-usage)
 * [Instant queries](https://docs.victoriametrics.com/keyConcepts.html#instant-query)
+* [Prometheus querying API usage](https://docs.victoriametrics.com/#prometheus-querying-api-usage)
 * [Query language](https://docs.victoriametrics.com/keyConcepts.html#metricsql)
 * [URL format for VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format)
 
@@ -339,8 +339,8 @@ curl http://<vmselect>:8481/select/0/prometheus/api/v1/query_range -d 'query=sum
 
 
 Additional information:
-* [Prometheus querying API usage](https://docs.victoriametrics.com/#prometheus-querying-api-usage)
 * [Range queries](https://docs.victoriametrics.com/keyConcepts.html#range-query)
+* [Prometheus querying API usage](https://docs.victoriametrics.com/#prometheus-querying-api-usage)
 * [Query language](https://docs.victoriametrics.com/keyConcepts.html#metricsql)
 * [URL format for VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format)
 
@@ -366,8 +366,8 @@ By default, VictoriaMetrics returns time series seen during the last day startin
 The specified `start..end` time range is rounded to day granularity because of performance optimization concerns.
 
 Additional information:
-* [Prometheus querying API usage](https://docs.victoriametrics.com/#prometheus-querying-api-usage)
 * [Finding series by label matchers](https://prometheus.io/docs/prometheus/latest/querying/api/#finding-series-by-label-matchers)
+* [Prometheus querying API usage](https://docs.victoriametrics.com/#prometheus-querying-api-usage)
 * [URL format for VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format)
 VictoriaMetrics accepts `limit` query arg for `/api/v1/series` handlers for limiting the number of returned entries. For example, the query to `/api/v1/series?limit=5` returns a sample of up to 5 series, while ignoring the rest. If the provided `limit` value exceeds the corresponding `-search.maxSeries` command-line flag values, then limits specified in the command-line flags are used.
 
@@ -390,8 +390,8 @@ curl http://<vmselect>:8481/select/0/prometheus/api/v1/status/tsdb
 
 
 Additional information:
-* [Prometheus querying API usage](https://docs.victoriametrics.com/#prometheus-querying-api-usage)
 * [TSDB Stats](https://prometheus.io/docs/prometheus/latest/querying/api/#tsdb-stats)
+* [Prometheus querying API usage](https://docs.victoriametrics.com/#prometheus-querying-api-usage)
 * [URL format for VictoriaMetrics cluster](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#url-format)
 
 ### /datadog
diff --git a/lib/protoparser/opentelemetry/firehose/parser.go b/lib/protoparser/opentelemetry/firehose/parser.go
index 7e7fb6200..e6801e3e7 100644
--- a/lib/protoparser/opentelemetry/firehose/parser.go
+++ b/lib/protoparser/opentelemetry/firehose/parser.go
@@ -1,6 +1,7 @@
 package firehose
 
 import (
+	"encoding/binary"
 	"encoding/json"
 	"fmt"
 )
@@ -32,8 +33,18 @@ func ProcessRequestBody(b []byte) ([]byte, error) {
 
 	var dst []byte
 	for _, r := range req.Records {
-		dst = append(dst, r.Data...)
+		for len(r.Data) > 0 {
+			messageLength, varIntLength := binary.Uvarint(r.Data)
+			if varIntLength > binary.MaxVarintLen32 {
+				return nil, fmt.Errorf("failed to parse OpenTelemetry message: invalid variant")
+			}
+			totalLength := varIntLength + int(messageLength)
+			if totalLength > len(r.Data) {
+				return nil, fmt.Errorf("failed to parse OpenTelementry message: insufficient length of buffer")
+			}
+			dst = append(dst, r.Data[varIntLength:totalLength]...)
+			r.Data = r.Data[totalLength:]
+		}
 	}
-
 	return dst, nil
 }


Test patch:
diff --git a/lib/protoparser/opentelemetry/firehose/parser_test.go b/lib/protoparser/opentelemetry/firehose/parser_test.go
index fdede8568..b5c588971 100644
--- a/lib/protoparser/opentelemetry/firehose/parser_test.go
+++ b/lib/protoparser/opentelemetry/firehose/parser_test.go
@@ -1,17 +1,33 @@
 package firehose
 
 import (
+	"bytes"
+	"github.com/VictoriaMetrics/VictoriaMetrics/lib/prompbmarshal"
+	"github.com/VictoriaMetrics/VictoriaMetrics/lib/protoparser/opentelemetry/stream"
+	"strings"
 	"testing"
 )
 
 func TestProcessRequestBody(t *testing.T) {
-	data := []byte(`{"records": [{"data": "SGVsbG8sIA=="}, {"data": "d29ybGQh"}]}`)
-	result, err := ProcessRequestBody(data)
+	data := []byte(`{"requestId":"94885867-d282-4110-a3c5-4af3f9ce1150","timestamp":1709217414040,"records":[{"data":"oB0KnR0KuwEKFwoOY2xvdWQucHJvdmlkZXISBQoDYXdzCiIKEGNsb3VkLmFjY291bnQuaWQSDgoMNjc3NDM1ODkwNTk4ChsKDGNsb3VkLnJlZ2lvbhILCgl1cy1lYXN0LTEKXwoQYXdzLmV4cG9ydGVyLmFybhJLCklhcm46YXdzOmNsb3Vkd2F0Y2g6dXMtZWFzdC0xOjY3NzQzNTg5MDU5ODptZXRyaWMtc3RyZWFtL2N1c3RvbV9lYnNfbWV0cmljEtwbErEBCiNhbWF6b25hd3MuY29tL0FXUy9FQlMvVm9sdW1lUmVhZE9wcxoHe0NvdW50fVqAAQp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMDg2Y2ZjMTA4NTQwOGUwZGMRABjlKfhbuBcZAHAsIgZcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/ErEBCiNhbWF6b25hd3MuY29tL0FXUy9FQlMvVm9sdW1lUmVhZE9wcxoHe0NvdW50fVqAAQp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMDZkMDc4YWIxYmNjMDBlYzMRABjlKfhbuBcZAHAsIgZcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/ErEBCiNhbWF6b25hd3MuY29tL0FXUy9FQlMvVm9sdW1lUmVhZE9wcxoHe0NvdW50fVqAAQp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMGJkMTU0NjVkNjljMjNhOWERABjlKfhbuBcZAHAsIgZcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/ErEBCiNhbWF6b25hd3MuY29tL0FXUy9FQlMvVm9sdW1lUmVhZE9wcxoHe0NvdW50fVqAAQp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMDM3YjdmMjg3ZWViNzlmYTkRABjlKfhbuBcZAHAsIgZcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/ErEBCiNhbWF6b25hd3MuY29tL0FXUy9FQlMvVm9sdW1lUmVhZE9wcxoHe0NvdW50fVqAAQp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMGJlZWY0OWRlMGQ2OGYzMmMRABjlKfhbuBcZAHAsIgZcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/ErEBCiNhbWF6b25hd3MuY29tL0FXUy9FQlMvVm9sdW1lUmVhZE9wcxoHe0NvdW50fVqAAQp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMDMzMTMzMjU5ZGY2N2JiOTcRABjlKfhbuBcZAHAsIgZcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/ErEBCiNhbWF6b25hd3MuY29tL0FXUy9FQlMvVm9sdW1lUmVhZE9wcxoHe0NvdW50fVqAAQp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMDljZDEwMGIxNTliYjI1ZDYRABjlKfhbuBcZAHAsIgZcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/ErEBCiNhbWF6b25hd3MuY29tL0FXUy9FQlMvVm9sdW1lUmVhZE9wcxoHe0NvdW50fVqAAQp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMGU4MzgzMTkyMWQ3MzU1NjMRABjlKfhbuBcZAHAsIgZcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/ErEBCiNhbWF6b25hd3MuY29tL0FXUy9FQlMvVm9sdW1lUmVhZE9wcxoHe0NvdW50fVqAAQp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMDIzZWQzMjZhZTg2MDA1NWERABjlKfhbuBcZAHAsIgZcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/ErEBCiNhbWF6b25hd3MuY29tL0FXUy9FQlMvVm9sdW1lUmVhZE9wcxoHe0NvdW50fVqAAQp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMGJjYTQ2ZTAyMjQzZjdhNTQRABjlKfhbuBcZAHAsIgZcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/ErEBCiNhbWF6b25hd3MuY29tL0FXUy9FQlMvVm9sdW1lUmVhZE9wcxoHe0NvdW50fVqAAQp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMGZmOGMzODkzNDNmZTZlMGYRABjlKfhbuBcZAHAsIgZcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/ErEBCiNhbWF6b25hd3MuY29tL0FXUy9FQlMvVm9sdW1lUmVhZE9wcxoHe0NvdW50fVqAAQp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMDYyZDE4MmE5ZTNkNjk3MWYRABjlKfhbuBcZAHAsIgZcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/ErEBCiNhbWF6b25hd3MuY29tL0FXUy9FQlMvVm9sdW1lUmVhZE9wcxoHe0NvdW50fVqAAQp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMDAzMDUyZjNiMzlkNjI3OWMRABjlKfhbuBcZAHAsIgZcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/ErECCiNhbWF6b25hd3MuY29tL0FXUy9FQlMvVm9sdW1lUmVhZE9wcxoHe0NvdW50fVqAAgp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMGM0NDEwOTk3YmUyMzEzNDARABjlKfhbuBcZAHAsIgZcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/Cn4KFAoJTmFtZXNwYWNlEgdBV1MvRUJTChsKCk1ldHJpY05hbWUSDVZvbHVtZVJlYWRPcHMKIQoIVm9sdW1lSWQSFXZvbC0wYzQ0MTA5OTdiZTIzMTM0MBEAwJ0x6lu4FxkAGOUp+Fu4FyEBAAAAAAAAADIAMgkJAAAAAAAA8D8SsQEKI2FtYXpvbmF3cy5jb20vQVdTL0VCUy9Wb2x1bWVSZWFkT3BzGgd7Q291bnR9WoABCn4KFAoJTmFtZXNwYWNlEgdBV1MvRUJTChsKCk1ldHJpY05hbWUSDVZvbHVtZVJlYWRPcHMKIQoIVm9sdW1lSWQSFXZvbC0wM2VlNzM1Y2VkZjFmNDZjZREAGOUp+Fu4FxkAcCwiBly4FyEBAAAAAAAAADIAMgkJAAAAAAAA8D8SsQEKI2FtYXpvbmF3cy5jb20vQVdTL0VCUy9Wb2x1bWVSZWFkT3BzGgd7Q291bnR9WoABCn4KFAoJTmFtZXNwYWNlEgdBV1MvRUJTChsKCk1ldHJpY05hbWUSDVZvbHVtZVJlYWRPcHMKIQoIVm9sdW1lSWQSFXZvbC0wOThmZmY4ZTc5ZmJkMmVmNxEAGOUp+Fu4FxkAcCwiBly4FyEBAAAAAAAAADIAMgkJAAAAAAAA8D8SsQEKI2FtYXpvbmF3cy5jb20vQVdTL0VCUy9Wb2x1bWVSZWFkT3BzGgd7Q291bnR9WoABCn4KFAoJTmFtZXNwYWNlEgdBV1MvRUJTChsKCk1ldHJpY05hbWUSDVZvbHVtZVJlYWRPcHMKIQoIVm9sdW1lSWQSFXZvbC0wMWY2ZjNhMzEwNGM4ZWRjYREAGOUp+Fu4FxkAcCwiBly4FyEBAAAAAAAAADIAMgkJAAAAAAAA8D8SsQEKI2FtYXpvbmF3cy5jb20vQVdTL0VCUy9Wb2x1bWVSZWFkT3BzGgd7Q291bnR9WoABCn4KFAoJTmFtZXNwYWNlEgdBV1MvRUJTChsKCk1ldHJpY05hbWUSDVZvbHVtZVJlYWRPcHMKIQoIVm9sdW1lSWQSFXZvbC0wN2E3NmViNGJhMDVlODNkMREAwJ0x6lu4FxkAGOUp+Fu4FyEBAAAAAAAAADIAMgkJAAAAAAAA8D8SsQEKI2FtYXpvbmF3cy5jb20vQVdTL0VCUy9Wb2x1bWVSZWFkT3BzGgd7Q291bnR9WoABCn4KFAoJTmFtZXNwYWNlEgdBV1MvRUJTChsKCk1ldHJpY05hbWUSDVZvbHVtZVJlYWRPcHMKIQoIVm9sdW1lSWQSFXZvbC0wMTFiYjVjNWJkZDc2ZDk2NREAGOUp+Fu4FxkAcCwiBly4FyEBAAAAAAAAADIAMgkJAAAAAAAA8D8="},{"data":"9CwK8SwKuwEKFwoOY2xvdWQucHJvdmlkZXISBQoDYXdzCiIKEGNsb3VkLmFjY291bnQuaWQSDgoMNjc3NDM1ODkwNTk4ChsKDGNsb3VkLnJlZ2lvbhILCgl1cy1lYXN0LTEKXwoQYXdzLmV4cG9ydGVyLmFybhJLCklhcm46YXdzOmNsb3Vkd2F0Y2g6dXMtZWFzdC0xOjY3NzQzNTg5MDU5ODptZXRyaWMtc3RyZWFtL2N1c3RvbV9lYnNfbWV0cmljErArErEBCiNhbWF6b25hd3MuY29tL0FXUy9FQlMvVm9sdW1lUmVhZE9wcxoHe0NvdW50fVqAAQp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMGQ1NDc2ZGI3ZWQ2OWVlMTcRABjlKfhbuBcZAHAsIgZcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/ErEBCiNhbWF6b25hd3MuY29tL0FXUy9FQlMvVm9sdW1lUmVhZE9wcxoHe0NvdW50fVqAAQp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMDRmZGY0YTExZGQ5Yzk1ZTURAHAsIgZcuBcZAMhzGhRcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/ErEBCiNhbWF6b25hd3MuY29tL0FXUy9FQlMvVm9sdW1lUmVhZE9wcxoHe0NvdW50fVqAAQp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMDM0ODNlODQwYTg5MjkxZDURAHAsIgZcuBcZAMhzGhRcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/ErEBCiNhbWF6b25hd3MuY29tL0FXUy9FQlMvVm9sdW1lUmVhZE9wcxoHe0NvdW50fVqAAQp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMDRhYjlkN2VkM2M4MzEyNjQRABjlKfhbuBcZAHAsIgZcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/ErEBCiNhbWF6b25hd3MuY29tL0FXUy9FQlMvVm9sdW1lUmVhZE9wcxoHe0NvdW50fVqAAQp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMDA5OGQwODYyNWYxNGVlMDkRAHAsIgZcuBcZAMhzGhRcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/ErEBCiNhbWF6b25hd3MuY29tL0FXUy9FQlMvVm9sdW1lUmVhZE9wcxoHe0NvdW50fVqAAQp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMDUyOGEyNDhiNGQ3Nzk2ZTARAHAsIgZcuBcZAMhzGhRcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/ErEBCiNhbWF6b25hd3MuY29tL0FXUy9FQlMvVm9sdW1lUmVhZE9wcxoHe0NvdW50fVqAAQp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMDdiY2FlNDRiMGFlZGVhNTURAHAsIgZcuBcZAMhzGhRcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/ErEBCiNhbWF6b25hd3MuY29tL0FXUy9FQlMvVm9sdW1lUmVhZE9wcxoHe0NvdW50fVqAAQp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMGNhZDQzNzQzOWUzODFjZjYRAHAsIgZcuBcZAMhzGhRcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/ErECCiNhbWF6b25hd3MuY29tL0FXUy9FQlMvVm9sdW1lUmVhZE9wcxoHe0NvdW50fVqAAgp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMDJmNjM0ZDEyNjY2N2NjYjgRAHAsIgZcuBcZAMhzGhRcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/Cn4KFAoJTmFtZXNwYWNlEgdBV1MvRUJTChsKCk1ldHJpY05hbWUSDVZvbHVtZVJlYWRPcHMKIQoIVm9sdW1lSWQSFXZvbC0wMmY2MzRkMTI2NjY3Y2NiOBEAGOUp+Fu4FxkAcCwiBly4FyEBAAAAAAAAADIAMgkJAAAAAAAA8D8SsQEKI2FtYXpvbmF3cy5jb20vQVdTL0VCUy9Wb2x1bWVSZWFkT3BzGgd7Q291bnR9WoABCn4KFAoJTmFtZXNwYWNlEgdBV1MvRUJTChsKCk1ldHJpY05hbWUSDVZvbHVtZVJlYWRPcHMKIQoIVm9sdW1lSWQSFXZvbC0wNTgxYWMwZjJkMWVmODM4ZBEAcCwiBly4FxkAyHMaFFy4FyEBAAAAAAAAADIAMgkJAAAAAAAA8D8SsQEKI2FtYXpvbmF3cy5jb20vQVdTL0VCUy9Wb2x1bWVSZWFkT3BzGgd7Q291bnR9WoABCn4KFAoJTmFtZXNwYWNlEgdBV1MvRUJTChsKCk1ldHJpY05hbWUSDVZvbHVtZVJlYWRPcHMKIQoIVm9sdW1lSWQSFXZvbC0wZDhmNWQ5MWFiYjMxNTNiNREAcCwiBly4FxkAyHMaFFy4FyEBAAAAAAAAADIAMgkJAAAAAAAA8D8SsQEKI2FtYXpvbmF3cy5jb20vQVdTL0VCUy9Wb2x1bWVSZWFkT3BzGgd7Q291bnR9WoABCn4KFAoJTmFtZXNwYWNlEgdBV1MvRUJTChsKCk1ldHJpY05hbWUSDVZvbHVtZVJlYWRPcHMKIQoIVm9sdW1lSWQSFXZvbC0wY2U2ZGMwN2QyZDQ1MGUwMhEAcCwiBly4FxkAyHMaFFy4FyEBAAAAAAAAADIAMgkJAAAAAAAA8D8SsQEKI2FtYXpvbmF3cy5jb20vQVdTL0VCUy9Wb2x1bWVSZWFkT3BzGgd7Q291bnR9WoABCn4KFAoJTmFtZXNwYWNlEgdBV1MvRUJTChsKCk1ldHJpY05hbWUSDVZvbHVtZVJlYWRPcHMKIQoIVm9sdW1lSWQSFXZvbC0wNWJjNjZjNmM5NDZjMzRlNhEAcCwiBly4FxkAyHMaFFy4FyEBAAAAAAAAADIAMgkJAAAAAAAA8D8SsQIKI2FtYXpvbmF3cy5jb20vQVdTL0VCUy9Wb2x1bWVSZWFkT3BzGgd7Q291bnR9WoACCn4KFAoJTmFtZXNwYWNlEgdBV1MvRUJTChsKCk1ldHJpY05hbWUSDVZvbHVtZVJlYWRPcHMKIQoIVm9sdW1lSWQSFXZvbC0wNDkwMjlmZTZjNDdhZjdhNhEAcCwiBly4FxkAyHMaFFy4FyEBAAAAAAAAADIAMgkJAAAAAAAA8D8KfgoUCglOYW1lc3BhY2USB0FXUy9FQlMKGwoKTWV0cmljTmFtZRINVm9sdW1lUmVhZE9wcwohCghWb2x1bWVJZBIVdm9sLTA0OTAyOWZlNmM0N2FmN2E2EQAY5Sn4W7gXGQBwLCIGXLgXIQEAAAAAAAAAMgAyCQkAAAAAAADwPxKxAQojYW1hem9uYXdzLmNvbS9BV1MvRUJTL1ZvbHVtZVJlYWRPcHMaB3tDb3VudH1agAEKfgoUCglOYW1lc3BhY2USB0FXUy9FQlMKGwoKTWV0cmljTmFtZRINVm9sdW1lUmVhZE9wcwohCghWb2x1bWVJZBIVdm9sLTAwMDNmMTcyMDYzMmJhM2FhEQBwLCIGXLgXGQDIcxoUXLgXIQEAAAAAAAAAMgAyCQkAAAAAAADwPxKxAQojYW1hem9uYXdzLmNvbS9BV1MvRUJTL1ZvbHVtZVJlYWRPcHMaB3tDb3VudH1agAEKfgoUCglOYW1lc3BhY2USB0FXUy9FQlMKGwoKTWV0cmljTmFtZRINVm9sdW1lUmVhZE9wcwohCghWb2x1bWVJZBIVdm9sLTAyMjZkMWUzMGNmMTFjYzE3EQAY5Sn4W7gXGQBwLCIGXLgXIQEAAAAAAAAAMgAyCQkAAAAAAADwPxKxAQojYW1hem9uYXdzLmNvbS9BV1MvRUJTL1ZvbHVtZVJlYWRPcHMaB3tDb3VudH1agAEKfgoUCglOYW1lc3BhY2USB0FXUy9FQlMKGwoKTWV0cmljTmFtZRINVm9sdW1lUmVhZE9wcwohCghWb2x1bWVJZBIVdm9sLTA4YmNiZGU4ODkwNDcwYjdmEQBwLCIGXLgXGQDIcxoUXLgXIQEAAAAAAAAAMgAyCQkAAAAAAADwPxKxAQojYW1hem9uYXdzLmNvbS9BV1MvRUJTL1ZvbHVtZVJlYWRPcHMaB3tDb3VudH1agAEKfgoUCglOYW1lc3BhY2USB0FXUy9FQlMKGwoKTWV0cmljTmFtZRINVm9sdW1lUmVhZE9wcwohCghWb2x1bWVJZBIVdm9sLTBhZjA3MGJjMzkxMDRjYzQ1EQBwLCIGXLgXGQDIcxoUXLgXIQEAAAAAAAAAMgAyCQkAAAAAAADwPxKxAQojYW1hem9uYXdzLmNvbS9BV1MvRUJTL1ZvbHVtZVJlYWRPcHMaB3tDb3VudH1agAEKfgoUCglOYW1lc3BhY2USB0FXUy9FQlMKGwoKTWV0cmljTmFtZRINVm9sdW1lUmVhZE9wcwohCghWb2x1bWVJZBIVdm9sLTA0YjZhMTZiYTYyM2UyZjQxEQAY5Sn4W7gXGQBwLCIGXLgXIQEAAAAAAAAAMgAyCQkAAAAAAADwPxKxAQojYW1hem9uYXdzLmNvbS9BV1MvRUJTL1ZvbHVtZVJlYWRPcHMaB3tDb3VudH1agAEKfgoUCglOYW1lc3BhY2USB0FXUy9FQlMKGwoKTWV0cmljTmFtZRINVm9sdW1lUmVhZE9wcwohCghWb2x1bWVJZBIVdm9sLTAwNTliNzExODZmZjI3MDQ1EQAY5Sn4W7gXGQBwLCIGXLgXIQEAAAAAAAAAMgAyCQkAAAAAAADwPxKxAQojYW1hem9uYXdzLmNvbS9BV1MvRUJTL1ZvbHVtZVJlYWRPcHMaB3tDb3VudH1agAEKfgoUCglOYW1lc3BhY2USB0FXUy9FQlMKGwoKTWV0cmljTmFtZRINVm9sdW1lUmVhZE9wcwohCghWb2x1bWVJZBIVdm9sLTBiM2QwNGFjYmQ3YWIyNjVhEQBwLCIGXLgXGQDIcxoUXLgXIQEAAAAAAAAAMgAyCQkAAAAAAADwPxKxAQojYW1hem9uYXdzLmNvbS9BV1MvRUJTL1ZvbHVtZVJlYWRPcHMaB3tDb3VudH1agAEKfgoUCglOYW1lc3BhY2USB0FXUy9FQlMKGwoKTWV0cmljTmFtZRINVm9sdW1lUmVhZE9wcwohCghWb2x1bWVJZBIVdm9sLTA0YjdmOGRjMjY0NjZmYTZjEQBwLCIGXLgXGQDIcxoUXLgXIQEAAAAAAAAAMgAyCQkAAAAAAADwPxKxAQojYW1hem9uYXdzLmNvbS9BV1MvRUJTL1ZvbHVtZVJlYWRPcHMaB3tDb3VudH1agAEKfgoUCglOYW1lc3BhY2USB0FXUy9FQlMKGwoKTWV0cmljTmFtZRINVm9sdW1lUmVhZE9wcwohCghWb2x1bWVJZBIVdm9sLTBkOTUwOGMxOGEyNzYxOTdkEQBwLCIGXLgXGQDIcxoUXLgXIQEAAAAAAAAAMgAyCQkAAAAAAADwPxKxAgojYW1hem9uYXdzLmNvbS9BV1MvRUJTL1ZvbHVtZVJlYWRPcHMaB3tDb3VudH1agAIKfgoUCglOYW1lc3BhY2USB0FXUy9FQlMKGwoKTWV0cmljTmFtZRINVm9sdW1lUmVhZE9wcwohCghWb2x1bWVJZBIVdm9sLTAyMjZhZWJjYTYxMTk4ZDY0EQBwLCIGXLgXGQDIcxoUXLgXIQEAAAAAAAAAMgAyCQkAAAAAAADwPwp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMDIyNmFlYmNhNjExOThkNjQRABjlKfhbuBcZAHAsIgZcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/ErEBCiNhbWF6b25hd3MuY29tL0FXUy9FQlMvVm9sdW1lUmVhZE9wcxoHe0NvdW50fVqAAQp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMDAzMmE4OTVmZGU1OWQ2OWQRAHAsIgZcuBcZAMhzGhRcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/ErEBCiNhbWF6b25hd3MuY29tL0FXUy9FQlMvVm9sdW1lUmVhZE9wcxoHe0NvdW50fVqAAQp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMDg5ZWYxMzZiOWE2NjE2N2YRABjlKfhbuBcZAHAsIgZcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/ErECCiNhbWF6b25hd3MuY29tL0FXUy9FQlMvVm9sdW1lUmVhZE9wcxoHe0NvdW50fVqAAgp+ChQKCU5hbWVzcGFjZRIHQVdTL0VCUwobCgpNZXRyaWNOYW1lEg1Wb2x1bWVSZWFkT3BzCiEKCFZvbHVtZUlkEhV2b2wtMDA4ZTc3ZmNjOTFkNjM2NzARAHAsIgZcuBcZAMhzGhRcuBchAQAAAAAAAAAyADIJCQAAAAAAAPA/Cn4KFAoJTmFtZXNwYWNlEgdBV1MvRUJTChsKCk1ldHJpY05hbWUSDVZvbHVtZVJlYWRPcHMKIQoIVm9sdW1lSWQSFXZvbC0wMDhlNzdmY2M5MWQ2MzY3MBEAGOUp+Fu4FxkAcCwiBly4FyEBAAAAAAAAADIAMgkJAAAAAAAA8D8SsQEKI2FtYXpvbmF3cy5jb20vQVdTL0VCUy9Wb2x1bWVSZWFkT3BzGgd7Q291bnR9WoABCn4KFAoJTmFtZXNwYWNlEgdBV1MvRUJTChsKCk1ldHJpY05hbWUSDVZvbHVtZVJlYWRPcHMKIQoIVm9sdW1lSWQSFXZvbC0wNmMzNTlhOTc1NzUxMzYzYhEAcCwiBly4FxkAyHMaFFy4FyEBAAAAAAAAADIAMgkJAAAAAAAA8D8="}]}`)
+	var totalTss []prompbmarshal.TimeSeries
+	err := stream.ParseStream(bytes.NewReader(data), false, ProcessRequestBody, func(tss []prompbmarshal.TimeSeries) error {
+		totalTss = append(totalTss, tss...)
+		for _, ts := range tss {
+			for _, label := range ts.Labels {
+				if label.Name == "__name__" {
+					if !strings.HasPrefix(label.Value, "amazonaws.com/AWS/EBS/VolumeReadOps") {
+						t.Fatalf("got %q, expected prefix amazonaws.com/AWS/EBS/VolumeReadOps", label.Value)
+					}
+				}
+			}
+		}
+		return nil
+	})
 	if err != nil {
 		t.Fatalf("unexpected error: %v", err)
 	}
-	resultExpected := "Hello, world!"
-	if string(result) != resultExpected {
-		t.Fatalf("unexpected result; got %q; want %q", result, resultExpected)
+	if len(totalTss) == 0 {
+		t.Fatalf("unexpected number of series: %d", len(totalTss))
 	}
 }