client_golang/prometheus
Oleg Zaytsev 005d8de006
Improve performance of WithLabelValues(...)
The slice with variadic arguments passed to MetricVec.WithLabelValues()
was escaping to heap. This change fixes that by performing a copy of the
slice before passing it to fmt.Errorf(), which is where the slice was
escaping. This keeps the hot path without that allocation.

Meaningful benchmark results (skipping ~0 CPU and 0 alloc ones):

                                                               │    old.txt    │               new.txt                │
                                                               │    sec/op     │    sec/op     vs base                │
Counter/With_Label_Values-16                                     108.00n ±  6%   58.06n ±  1%  -46.24% (p=0.000 n=10)
Counter/With_Label_Values_and_Constraint-16                       174.5n ± 15%   136.8n ±  6%  -21.63% (p=0.000 n=10)
Counter/With_triple_Label_Values-16                               309.3n ± 12%   172.9n ±  1%  -44.08% (p=0.000 n=10)
Counter/With_triple_Label_Values_and_Constraint-16                591.5n ± 11%   418.9n ±  3%  -29.17% (p=0.000 n=10)
Counter/With_repeated_Label_Values-16                             212.9n ± 10%   116.8n ± 23%  -45.16% (p=0.000 n=10)
Counter/With_repeated_Label_Values_and_Constraint-16              406.2n ± 14%   275.1n ±  4%  -32.30% (p=0.000 n=10)
CounterWithLabelValuesConcurrent-16                               85.45n ±  2%   89.09n ±  2%   +4.26% (p=0.003 n=10)

                                                               │    old.txt     │                  new.txt                  │
                                                               │      B/op      │     B/op      vs base                     │
Counter/With_Label_Values-16                                       48.00 ± 0%        0.00 ± 0%  -100.00% (p=0.000 n=10)
Counter/With_Label_Values_and_Constraint-16                        96.00 ± 0%       48.00 ± 0%   -50.00% (p=0.000 n=10)
Counter/With_triple_Label_Values-16                                144.0 ± 0%         0.0 ± 0%  -100.00% (p=0.000 n=10)
Counter/With_triple_Label_Values_and_Constraint-16                 288.0 ± 0%       144.0 ± 0%   -50.00% (p=0.000 n=10)
Counter/With_repeated_Label_Values-16                              96.00 ± 0%        0.00 ± 0%  -100.00% (p=0.000 n=10)
Counter/With_repeated_Label_Values_and_Constraint-16              192.00 ± 0%       96.00 ± 0%   -50.00% (p=0.000 n=10)
CounterWithLabelValuesConcurrent-16                                48.00 ± 0%        0.00 ± 0%  -100.00% (p=0.000 n=10)

                                                               │   old.txt    │                 new.txt                 │
                                                               │  allocs/op   │ allocs/op   vs base                     │
Counter/With_Label_Values-16                                     1.000 ± 0%     0.000 ± 0%  -100.00% (p=0.000 n=10)
Counter/With_Label_Values_and_Constraint-16                      2.000 ± 0%     1.000 ± 0%   -50.00% (p=0.000 n=10)
Counter/With_triple_Label_Values-16                              3.000 ± 0%     0.000 ± 0%  -100.00% (p=0.000 n=10)
Counter/With_triple_Label_Values_and_Constraint-16               6.000 ± 0%     3.000 ± 0%   -50.00% (p=0.000 n=10)
Counter/With_repeated_Label_Values-16                            2.000 ± 0%     0.000 ± 0%  -100.00% (p=0.000 n=10)
Counter/With_repeated_Label_Values_and_Constraint-16             4.000 ± 0%     2.000 ± 0%   -50.00% (p=0.000 n=10)
CounterWithLabelValuesConcurrent-16                              1.000 ± 0%     0.000 ± 0%  -100.00% (p=0.000 n=10)

Signed-off-by: Oleg Zaytsev <mail@olegzaytsev.com>
2023-10-04 18:09:15 +02:00
..
collectors Deprecated comment should begin with "Deprecated:" (#1347) 2023-09-21 12:31:45 +01:00
graphite Enable same linters as the Prometheus repo itself (#1056) 2022-06-17 09:04:06 +02:00
internal Fix typos in comments, tests, and errors (#1346) 2023-09-21 12:31:08 +01:00
promauto docs: trivial grammar fixes to improve readability 2023-08-05 11:41:47 +01:00
promhttp Fix data-race in metric without code and method but with `WithLabelFromCtx` (#1318) 2023-08-01 17:11:17 +01:00
push Fix typos in comments, tests, and errors (#1346) 2023-09-21 12:31:08 +01:00
testutil Fix typos in comments, tests, and errors (#1346) 2023-09-21 12:31:08 +01:00
.gitignore Rearrange file and package per convention. 2013-04-04 15:27:09 +02:00
README.md Update status badgets 2021-06-23 10:12:43 +02:00
benchmark_test.go Do not allocate memory when there's no constraints (#1296) 2023-06-27 12:21:36 +01:00
build_info_collector.go Use the runtime/metrics package for the Go collector for 1.17+ (#955) 2022-01-16 16:41:56 +00:00
collector.go collectors.GoCollector: Added rule support for granular metric configuration. (#1102) 2022-08-05 19:37:46 +02:00
collector_test.go Enable same linters as the Prometheus repo itself (#1056) 2022-06-17 09:04:06 +02:00
counter.go Fix typos in comments, tests, and errors (#1346) 2023-09-21 12:31:08 +01:00
counter_test.go Extend Counters, Summaries and Histograms with creation timestamp (#1313) 2023-09-21 10:46:54 +01:00
desc.go Do not allocate memory when there's no constraints (#1296) 2023-06-27 12:21:36 +01:00
desc_test.go Add missing license headers 2018-08-22 13:53:56 +02:00
doc.go Indent example in godoc consistently (#1226) 2023-03-01 16:45:01 +00:00
example_clustermanager_test.go Nitpicking a doc comment 2018-11-20 13:41:38 +01:00
example_metricvec_test.go Extend Counters, Summaries and Histograms with creation timestamp (#1313) 2023-09-21 10:46:54 +01:00
example_timer_complex_test.go Enable same linters as the Prometheus repo itself (#1056) 2022-06-17 09:04:06 +02:00
example_timer_gauge_test.go Enable same linters as the Prometheus repo itself (#1056) 2022-06-17 09:04:06 +02:00
example_timer_test.go Enable same linters as the Prometheus repo itself (#1056) 2022-06-17 09:04:06 +02:00
examples_test.go Extend Counters, Summaries and Histograms with creation timestamp (#1313) 2023-09-21 10:46:54 +01:00
expvar_collector.go Do not allocate memory when there's no constraints (#1296) 2023-06-27 12:21:36 +01:00
expvar_collector_test.go Extend Counters, Summaries and Histograms with creation timestamp (#1313) 2023-09-21 10:46:54 +01:00
fnv.go Add missing license headers 2018-08-22 13:53:56 +02:00
gauge.go Fix typos in comments, tests, and errors (#1346) 2023-09-21 12:31:08 +01:00
gauge_test.go Bump prometheus/client_model (#1323) 2023-08-11 20:17:55 +01:00
gen_go_collector_metrics_set.go Added support for go 1.20. (#1234) 2023-03-21 13:46:37 +00:00
get_pid.go Fix build against GopherJS (#897) 2022-08-05 16:28:54 +02:00
get_pid_gopherjs.go Fix build against GopherJS (#897) 2022-08-05 16:28:54 +02:00
go_collector.go collectors.GoCollector: Added rule support for granular metric configuration. (#1102) 2022-08-05 19:37:46 +02:00
go_collector_go116.go gocollector: Added options to Go Collector for changing the (#1031) 2022-04-13 09:55:22 +01:00
go_collector_go116_test.go Use the runtime/metrics package for the Go collector for 1.17+ (#955) 2022-01-16 16:41:56 +00:00
go_collector_latest.go Replace deprecated github.com/golang/protobuf package (#1183) 2022-12-22 16:14:00 +01:00
go_collector_latest_test.go Fix typos in comments, tests, and errors (#1346) 2023-09-21 12:31:08 +01:00
go_collector_metrics_go117_test.go Remove -Inf buckets from go collector histograms (#1049) 2022-05-13 10:04:45 +02:00
go_collector_metrics_go118_test.go Remove -Inf buckets from go collector histograms (#1049) 2022-05-13 10:04:45 +02:00
go_collector_metrics_go119_test.go Generate new Go runtime metrics for go 1.19 (#1105) 2022-08-05 15:48:33 +02:00
go_collector_metrics_go120_test.go Added support for go 1.20. (#1234) 2023-03-21 13:46:37 +00:00
go_collector_metrics_go121_test.go Add go_godebug_non_default_behavior_tlsmaxrsasize_events_total (#1348) 2023-09-21 10:46:14 +01:00
go_collector_test.go Use simpler locking in the Go 1.17 collector (#975) 2022-01-25 08:43:45 +01:00
histogram.go Fix typos in comments, tests, and errors (#1346) 2023-09-21 12:31:08 +01:00
histogram_test.go Extend Counters, Summaries and Histograms with creation timestamp (#1313) 2023-09-21 10:46:54 +01:00
labels.go Improve performance of WithLabelValues(...) 2023-10-04 18:09:15 +02:00
metric.go Extend Counters, Summaries and Histograms with creation timestamp (#1313) 2023-09-21 10:46:54 +01:00
metric_test.go Replace deprecated github.com/golang/protobuf package (#1183) 2022-12-22 16:14:00 +01:00
num_threads.go Fix build against GopherJS (#897) 2022-08-05 16:28:54 +02:00
num_threads_gopherjs.go Fix build against GopherJS (#897) 2022-08-05 16:28:54 +02:00
observer.go Update documentation for exemplar label limit (#1095) 2022-07-27 17:45:49 +02:00
process_collector.go Fix build against GopherJS (#897) 2022-08-05 16:28:54 +02:00
process_collector_js.go Fix build against GopherJS (#897) 2022-08-05 16:28:54 +02:00
process_collector_other.go Fix build against GopherJS (#897) 2022-08-05 16:28:54 +02:00
process_collector_test.go Add new go:build lines for go 1.17 2021-12-17 23:38:35 +01:00
process_collector_windows.go feat: Change processMemoryCounters struct uint declaration to uintptr 2020-04-13 10:44:09 +08:00
process_collector_windows_test.go Implement process collector for Windows (#596) 2019-06-14 12:26:55 +02:00
registry.go Fix typos in comments, tests, and errors (#1346) 2023-09-21 12:31:08 +01:00
registry_test.go Fix typos in comments, tests, and errors (#1346) 2023-09-21 12:31:08 +01:00
summary.go Fix typos in comments, tests, and errors (#1346) 2023-09-21 12:31:08 +01:00
summary_test.go Extend Counters, Summaries and Histograms with creation timestamp (#1313) 2023-09-21 10:46:54 +01:00
timer.go timer: Added support for exemplars. (#1233) 2023-03-21 19:35:31 +00:00
timer_test.go timer: Added support for exemplars. (#1233) 2023-03-21 19:35:31 +00:00
untyped.go Remove the deprecated uses of Untyped metrics 2017-08-29 17:31:45 +02:00
utils_test.go Extend Counters, Summaries and Histograms with creation timestamp (#1313) 2023-09-21 10:46:54 +01:00
value.go Extend Counters, Summaries and Histograms with creation timestamp (#1313) 2023-09-21 10:46:54 +01:00
value_test.go Extend Counters, Summaries and Histograms with creation timestamp (#1313) 2023-09-21 10:46:54 +01:00
vec.go Do not allocate memory when there's no constraints (#1296) 2023-06-27 12:21:36 +01:00
vec_test.go Reduce constrainLabels allocations (#1272) 2023-06-07 08:39:02 +01:00
vnext.go Add constrained labels and Constrained variant for all MetricVecs (#1151) 2022-12-13 13:47:52 +01:00
wrap.go Replace deprecated github.com/golang/protobuf package (#1183) 2022-12-22 16:14:00 +01:00
wrap_test.go Extend Counters, Summaries and Histograms with creation timestamp (#1313) 2023-09-21 10:46:54 +01:00

README.md

See Go Reference.