resolvePodRef is in a hot path:
```
ROUTINE ======================== github.com/prometheus/prometheus/discovery/kubernetes.(*Endpoints).resolvePodRef in discovery/kubernetes/endpoints.go
2.50TB 2.66TB (flat, cum) 22.28% of Total
. . 447:func (e *Endpoints) resolvePodRef(ref *apiv1.ObjectReference) *apiv1.Pod {
. . 448: if ref == nil || ref.Kind != "Pod" {
. . 449: return nil
. . 450: }
2.50TB 2.50TB 451: p := &apiv1.Pod{}
. . 452: p.Namespace = ref.Namespace
. . 453: p.Name = ref.Name
. . 454:
. 156.31GB 455: obj, exists, err := e.podStore.Get(p)
. . 456: if err != nil {
. . 457: level.Error(e.logger).Log("msg", "resolving pod ref failed", "err", err)
. . 458: return nil
. . 459: }
. . 460: if !exists {
```
This is some low hanging fruit that we can easily optimize. The key of
an object has format "namespace/name" so generate that inside of
Prometheus itself and use pooling.
```
goos: linux
goarch: amd64
pkg: github.com/prometheus/prometheus/discovery/kubernetes
cpu: Intel(R) Core(TM) i9-10885H CPU @ 2.40GHz
│ olddisc │ newdisc │
│ sec/op │ sec/op vs base │
ResolvePodRef-16 516.3n ± 17% 289.5n ± 7% -43.92% (p=0.000 n=10)
│ olddisc │ newdisc │
│ B/op │ B/op vs base │
ResolvePodRef-16 1168.00 ± 0% 24.00 ± 0% -97.95% (p=0.000 n=10)
│ olddisc │ newdisc │
│ allocs/op │ allocs/op vs base │
ResolvePodRef-16 2.000 ± 0% 2.000 ± 0% ~ (p=1.000 n=10) ¹
¹ all samples are equal
```
Signed-off-by: Giedrius Statkevičius <giedrius.statkevicius@vinted.com>
pull/15230/head
parent
685d6d169f
commit
e452308e37
Loading…
Reference in new issue