mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
57 lines
1.0 KiB
Go
57 lines
1.0 KiB
Go
package promclient
|
|
|
|
import (
|
|
"sort"
|
|
"strings"
|
|
|
|
lru "github.com/hashicorp/golang-lru"
|
|
apiv1 "github.com/prometheus/client_golang/api/prometheus/v1"
|
|
)
|
|
|
|
type ProviderCache struct {
|
|
provider promClientProvider
|
|
cache *lru.Cache
|
|
}
|
|
|
|
type promClientProvider interface {
|
|
GetClient(map[string]string) (apiv1.API, error)
|
|
}
|
|
|
|
func NewProviderCache(p promClientProvider) (*ProviderCache, error) {
|
|
cache, err := lru.New(500)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &ProviderCache{
|
|
provider: p,
|
|
cache: cache,
|
|
}, nil
|
|
}
|
|
|
|
func (c *ProviderCache) GetClient(headers map[string]string) (apiv1.API, error) {
|
|
key := c.key(headers)
|
|
if client, ok := c.cache.Get(key); ok {
|
|
return client.(apiv1.API), nil
|
|
}
|
|
|
|
client, err := c.provider.GetClient(headers)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
c.cache.Add(key, client)
|
|
return client, nil
|
|
}
|
|
|
|
func (c *ProviderCache) key(headers map[string]string) string {
|
|
vals := make([]string, len(headers))
|
|
var i int
|
|
for _, v := range headers {
|
|
vals[i] = v
|
|
i++
|
|
}
|
|
sort.Strings(vals)
|
|
return strings.Join(vals, "")
|
|
}
|