Skip to content

Commit 931b89e

Browse files
authored
Make each DNS provider register a diff metric (#2303)
* Make each DNS provider register a diff metric Signed-off-by: Goutham Veeramachaneni <gouthamve@gmail.com> * Add tests to test multi register. Also incorporate review feedback. Signed-off-by: Goutham Veeramachaneni <gouthamve@gmail.com>
1 parent 8a22433 commit 931b89e

File tree

4 files changed

+99
-3
lines changed

4 files changed

+99
-3
lines changed

integration/querier_test.go

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@
33
package main
44

55
import (
6+
"fmt"
7+
"sync"
68
"testing"
79
"time"
810

911
"github.com/prometheus/common/model"
12+
"github.com/prometheus/prometheus/prompb"
1013
"github.com/stretchr/testify/assert"
1114
"github.com/stretchr/testify/require"
1215

@@ -251,3 +254,89 @@ func TestQuerierWithBlocksStorageOnMissingBlocksFromStorage(t *testing.T) {
251254
require.Error(t, err)
252255
assert.Contains(t, err.Error(), "500")
253256
}
257+
258+
func TestQuerierWithChunksStorage(t *testing.T) {
259+
const numUsers = 10
260+
const numQueriesPerUser = 10
261+
262+
s, err := e2e.NewScenario(networkName)
263+
require.NoError(t, err)
264+
defer s.Close()
265+
266+
require.NoError(t, writeFileToSharedDir(s, cortexSchemaConfigFile, []byte(cortexSchemaConfigYaml)))
267+
flags := mergeFlags(ChunksStorageFlags, map[string]string{})
268+
269+
// Start dependencies.
270+
dynamo := e2edb.NewDynamoDB()
271+
272+
consul := e2edb.NewConsul()
273+
require.NoError(t, s.StartAndWaitReady(consul, dynamo))
274+
275+
tableManager := e2ecortex.NewTableManager("table-manager", ChunksStorageFlags, "")
276+
require.NoError(t, s.StartAndWaitReady(tableManager))
277+
278+
// Wait until the first table-manager sync has completed, so that we're
279+
// sure the tables have been created.
280+
require.NoError(t, tableManager.WaitSumMetrics(e2e.Greater(0), "cortex_table_manager_sync_success_timestamp_seconds"))
281+
282+
// Start Cortex components for the write path.
283+
distributor := e2ecortex.NewDistributor("distributor", consul.NetworkHTTPEndpoint(), flags, "")
284+
ingester := e2ecortex.NewIngester("ingester", consul.NetworkHTTPEndpoint(), flags, "")
285+
require.NoError(t, s.StartAndWaitReady(distributor, ingester))
286+
287+
// Wait until the distributor has updated the ring.
288+
require.NoError(t, distributor.WaitSumMetrics(e2e.Equals(512), "cortex_ring_tokens_total"))
289+
290+
// Push a series for each user to Cortex.
291+
now := time.Now()
292+
expectedVectors := make([]model.Vector, numUsers)
293+
294+
for u := 0; u < numUsers; u++ {
295+
c, err := e2ecortex.NewClient(distributor.HTTPEndpoint(), "", "", fmt.Sprintf("user-%d", u))
296+
require.NoError(t, err)
297+
298+
var series []prompb.TimeSeries
299+
series, expectedVectors[u] = generateSeries("series_1", now)
300+
301+
res, err := c.Push(series)
302+
require.NoError(t, err)
303+
require.Equal(t, 200, res.StatusCode)
304+
}
305+
306+
// Add 2 memcache instances to test for: https://github.com/cortexproject/cortex/issues/2302
307+
// Note these are not running but added to trigger the behaviour.
308+
querierFlags := mergeFlags(flags, map[string]string{
309+
"-store.index-cache-read.memcached.addresses": "dns+memcached0:11211",
310+
"-store.index-cache-write.memcached.addresses": "dns+memcached1:11211",
311+
})
312+
313+
querier := e2ecortex.NewQuerier("querier", consul.NetworkHTTPEndpoint(), querierFlags, "")
314+
require.NoError(t, s.StartAndWaitReady(querier))
315+
316+
// Wait until the querier has updated the ring.
317+
require.NoError(t, querier.WaitSumMetrics(e2e.Equals(512), "cortex_ring_tokens_total"))
318+
319+
// Query the series for each user in parallel.
320+
wg := sync.WaitGroup{}
321+
wg.Add(numUsers * numQueriesPerUser)
322+
323+
for u := 0; u < numUsers; u++ {
324+
userID := u
325+
326+
c, err := e2ecortex.NewClient("", querier.HTTPEndpoint(), "", fmt.Sprintf("user-%d", userID))
327+
require.NoError(t, err)
328+
329+
for q := 0; q < numQueriesPerUser; q++ {
330+
go func() {
331+
defer wg.Done()
332+
333+
result, err := c.Query("series_1", now)
334+
require.NoError(t, err)
335+
require.Equal(t, model.ValVector, result.Type())
336+
assert.Equal(t, expectedVectors[userID], result.(model.Vector))
337+
}()
338+
}
339+
}
340+
341+
wg.Wait()
342+
}

integration/query_frontend_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ func runQueryFrontendTest(t *testing.T, setup queryFrontendSetup) {
106106

107107
// Check if we're discovering memcache or not.
108108
require.NoError(t, queryFrontend.WaitSumMetrics(e2e.Equals(1), "cortex_memcache_client_servers"))
109+
require.NoError(t, queryFrontend.WaitSumMetrics(e2e.Greater(0), "cortex_dns_lookups_total"))
109110

110111
// Start the querier after the query-frontend otherwise we're not
111112
// able to get the query-frontend network endpoint.

pkg/chunk/cache/cache.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import (
55
"errors"
66
"flag"
77
"time"
8+
9+
"github.com/prometheus/client_golang/prometheus"
810
)
911

1012
// Cache byte arrays by key.
@@ -79,7 +81,7 @@ func New(cfg Config) (Cache, error) {
7981
cfg.Memcache.Expiration = cfg.DefaultValidity
8082
}
8183

82-
client := NewMemcachedClient(cfg.MemcacheClient, cfg.Prefix)
84+
client := NewMemcachedClient(cfg.MemcacheClient, cfg.Prefix, prometheus.DefaultRegisterer)
8385
cache := NewMemcached(cfg.Memcache, client, cfg.Prefix)
8486

8587
cacheName := cfg.Prefix + "memcache"

pkg/chunk/cache/memcached_client.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ func (cfg *MemcachedClientConfig) RegisterFlagsWithPrefix(prefix, description st
8080

8181
// NewMemcachedClient creates a new MemcacheClient that gets its server list
8282
// from SRV and updates the server list on a regular basis.
83-
func NewMemcachedClient(cfg MemcachedClientConfig, name string) MemcachedClient {
83+
func NewMemcachedClient(cfg MemcachedClientConfig, name string, r prometheus.Registerer) MemcachedClient {
8484
var selector serverSelector
8585
if cfg.ConsistentHash {
8686
selector = &MemcachedJumpHashSelector{}
@@ -92,13 +92,17 @@ func NewMemcachedClient(cfg MemcachedClientConfig, name string) MemcachedClient
9292
client.Timeout = cfg.Timeout
9393
client.MaxIdleConns = cfg.MaxIdleConns
9494

95+
dnsProviderRegisterer := prometheus.WrapRegistererWithPrefix("cortex_", prometheus.WrapRegistererWith(prometheus.Labels{
96+
"name": name,
97+
}, r))
98+
9599
newClient := &memcachedClient{
96100
Client: client,
97101
serverList: selector,
98102
hostname: cfg.Host,
99103
service: cfg.Service,
100104
addresses: strings.Split(cfg.Addresses, ","),
101-
provider: dns.NewProvider(util.Logger, prometheus.DefaultRegisterer, dns.GolangResolverType),
105+
provider: dns.NewProvider(util.Logger, dnsProviderRegisterer, dns.GolangResolverType),
102106
quit: make(chan struct{}),
103107

104108
numServers: memcacheServersDiscovered.WithLabelValues(name),

0 commit comments

Comments
 (0)