github.com/netdata/go.d.plugin@v0.58.1/modules/unbound/unbound_test.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package unbound
     4  
     5  import (
     6  	"bufio"
     7  	"bytes"
     8  	"errors"
     9  	"fmt"
    10  	"os"
    11  	"strings"
    12  	"testing"
    13  
    14  	"github.com/netdata/go.d.plugin/pkg/socket"
    15  	"github.com/netdata/go.d.plugin/pkg/tlscfg"
    16  
    17  	"github.com/netdata/go.d.plugin/agent/module"
    18  	"github.com/stretchr/testify/assert"
    19  	"github.com/stretchr/testify/require"
    20  )
    21  
    22  var (
    23  	commonStatsData, _          = os.ReadFile("testdata/stats/common.txt")
    24  	extStatsData, _             = os.ReadFile("testdata/stats/extended.txt")
    25  	lifeCycleCumulativeData1, _ = os.ReadFile("testdata/stats/lifecycle/cumulative/extended1.txt")
    26  	lifeCycleCumulativeData2, _ = os.ReadFile("testdata/stats/lifecycle/cumulative/extended2.txt")
    27  	lifeCycleCumulativeData3, _ = os.ReadFile("testdata/stats/lifecycle/cumulative/extended3.txt")
    28  	lifeCycleResetData1, _      = os.ReadFile("testdata/stats/lifecycle/reset/extended1.txt")
    29  	lifeCycleResetData2, _      = os.ReadFile("testdata/stats/lifecycle/reset/extended2.txt")
    30  	lifeCycleResetData3, _      = os.ReadFile("testdata/stats/lifecycle/reset/extended3.txt")
    31  )
    32  
    33  func Test_readTestData(t *testing.T) {
    34  	assert.NotNil(t, commonStatsData)
    35  	assert.NotNil(t, extStatsData)
    36  	assert.NotNil(t, lifeCycleCumulativeData1)
    37  	assert.NotNil(t, lifeCycleCumulativeData2)
    38  	assert.NotNil(t, lifeCycleCumulativeData3)
    39  	assert.NotNil(t, lifeCycleResetData1)
    40  	assert.NotNil(t, lifeCycleResetData2)
    41  	assert.NotNil(t, lifeCycleResetData3)
    42  }
    43  
    44  func nonTLSUnbound() *Unbound {
    45  	unbound := New()
    46  	unbound.ConfPath = ""
    47  	unbound.UseTLS = false
    48  	return unbound
    49  }
    50  
    51  func TestNew(t *testing.T) {
    52  	assert.Implements(t, (*module.Module)(nil), New())
    53  }
    54  
    55  func TestUnbound_Init(t *testing.T) {
    56  	unbound := nonTLSUnbound()
    57  
    58  	assert.True(t, unbound.Init())
    59  }
    60  
    61  func TestUnbound_Init_SetEverythingFromUnboundConf(t *testing.T) {
    62  	unbound := New()
    63  	unbound.ConfPath = "testdata/unbound.conf"
    64  	expectedConfig := Config{
    65  		Address:    "10.0.0.1:8954",
    66  		ConfPath:   unbound.ConfPath,
    67  		Timeout:    unbound.Timeout,
    68  		Cumulative: true,
    69  		UseTLS:     false,
    70  		TLSConfig: tlscfg.TLSConfig{
    71  			TLSCert:            "/etc/unbound/unbound_control_other.pem",
    72  			TLSKey:             "/etc/unbound/unbound_control_other.key",
    73  			InsecureSkipVerify: unbound.TLSConfig.InsecureSkipVerify,
    74  		},
    75  	}
    76  
    77  	assert.True(t, unbound.Init())
    78  	assert.Equal(t, expectedConfig, unbound.Config)
    79  }
    80  
    81  func TestUnbound_Init_DisabledInUnboundConf(t *testing.T) {
    82  	unbound := nonTLSUnbound()
    83  	unbound.ConfPath = "testdata/unbound_disabled.conf"
    84  
    85  	assert.False(t, unbound.Init())
    86  }
    87  
    88  func TestUnbound_Init_HandleEmptyConfig(t *testing.T) {
    89  	unbound := nonTLSUnbound()
    90  	unbound.ConfPath = "testdata/unbound_empty.conf"
    91  
    92  	assert.True(t, unbound.Init())
    93  }
    94  
    95  func TestUnbound_Init_HandleNonExistentConfig(t *testing.T) {
    96  	unbound := nonTLSUnbound()
    97  	unbound.ConfPath = "testdata/unbound_non_existent.conf"
    98  
    99  	assert.True(t, unbound.Init())
   100  }
   101  
   102  func TestUnbound_Check(t *testing.T) {
   103  	unbound := nonTLSUnbound()
   104  	require.True(t, unbound.Init())
   105  	unbound.client = mockUnboundClient{data: commonStatsData, err: false}
   106  
   107  	assert.True(t, unbound.Check())
   108  }
   109  
   110  func TestUnbound_Check_ErrorDuringScrapingUnbound(t *testing.T) {
   111  	unbound := nonTLSUnbound()
   112  	require.True(t, unbound.Init())
   113  	unbound.client = mockUnboundClient{err: true}
   114  
   115  	assert.False(t, unbound.Check())
   116  }
   117  
   118  func TestUnbound_Cleanup(t *testing.T) {
   119  	New().Cleanup()
   120  }
   121  
   122  func TestUnbound_Charts(t *testing.T) {
   123  	unbound := nonTLSUnbound()
   124  	require.True(t, unbound.Init())
   125  
   126  	assert.NotNil(t, unbound.Charts())
   127  }
   128  
   129  func TestUnbound_Collect(t *testing.T) {
   130  	unbound := nonTLSUnbound()
   131  	require.True(t, unbound.Init())
   132  	unbound.client = mockUnboundClient{data: commonStatsData, err: false}
   133  
   134  	collected := unbound.Collect()
   135  	assert.Equal(t, expectedCommon, collected)
   136  	testCharts(t, unbound, collected)
   137  }
   138  
   139  func TestUnbound_Collect_ExtendedStats(t *testing.T) {
   140  	unbound := nonTLSUnbound()
   141  	require.True(t, unbound.Init())
   142  	unbound.client = mockUnboundClient{data: extStatsData, err: false}
   143  
   144  	collected := unbound.Collect()
   145  	assert.Equal(t, expectedExtended, collected)
   146  	testCharts(t, unbound, collected)
   147  }
   148  
   149  func TestUnbound_Collect_LifeCycleCumulativeExtendedStats(t *testing.T) {
   150  	tests := []struct {
   151  		input    []byte
   152  		expected map[string]int64
   153  	}{
   154  		{input: lifeCycleCumulativeData1, expected: expectedCumulative1},
   155  		{input: lifeCycleCumulativeData2, expected: expectedCumulative2},
   156  		{input: lifeCycleCumulativeData3, expected: expectedCumulative3},
   157  	}
   158  
   159  	unbound := nonTLSUnbound()
   160  	unbound.Cumulative = true
   161  	require.True(t, unbound.Init())
   162  	ubClient := &mockUnboundClient{err: false}
   163  	unbound.client = ubClient
   164  
   165  	var collected map[string]int64
   166  	for i, test := range tests {
   167  		t.Run(fmt.Sprintf("run %d", i+1), func(t *testing.T) {
   168  			ubClient.data = test.input
   169  			collected = unbound.Collect()
   170  			assert.Equal(t, test.expected, collected)
   171  		})
   172  	}
   173  
   174  	testCharts(t, unbound, collected)
   175  }
   176  
   177  func TestUnbound_Collect_LifeCycleResetExtendedStats(t *testing.T) {
   178  	tests := []struct {
   179  		input    []byte
   180  		expected map[string]int64
   181  	}{
   182  		{input: lifeCycleResetData1, expected: expectedReset1},
   183  		{input: lifeCycleResetData2, expected: expectedReset2},
   184  		{input: lifeCycleResetData3, expected: expectedReset3},
   185  	}
   186  
   187  	unbound := nonTLSUnbound()
   188  	unbound.Cumulative = false
   189  	require.True(t, unbound.Init())
   190  	ubClient := &mockUnboundClient{err: false}
   191  	unbound.client = ubClient
   192  
   193  	var collected map[string]int64
   194  	for i, test := range tests {
   195  		t.Run(fmt.Sprintf("run %d", i+1), func(t *testing.T) {
   196  			ubClient.data = test.input
   197  			collected = unbound.Collect()
   198  			assert.Equal(t, test.expected, collected)
   199  		})
   200  	}
   201  
   202  	testCharts(t, unbound, collected)
   203  }
   204  
   205  func TestUnbound_Collect_EmptyResponse(t *testing.T) {
   206  	unbound := nonTLSUnbound()
   207  	require.True(t, unbound.Init())
   208  	unbound.client = mockUnboundClient{data: []byte{}, err: false}
   209  
   210  	assert.Nil(t, unbound.Collect())
   211  }
   212  
   213  func TestUnbound_Collect_ErrorResponse(t *testing.T) {
   214  	unbound := nonTLSUnbound()
   215  	require.True(t, unbound.Init())
   216  	unbound.client = mockUnboundClient{data: []byte("error unknown command 'unknown'"), err: false}
   217  
   218  	assert.Nil(t, unbound.Collect())
   219  }
   220  
   221  func TestUnbound_Collect_ErrorOnSend(t *testing.T) {
   222  	unbound := nonTLSUnbound()
   223  	require.True(t, unbound.Init())
   224  	unbound.client = mockUnboundClient{err: true}
   225  
   226  	assert.Nil(t, unbound.Collect())
   227  }
   228  
   229  func TestUnbound_Collect_ErrorOnParseBadSyntax(t *testing.T) {
   230  	unbound := nonTLSUnbound()
   231  	require.True(t, unbound.Init())
   232  	data := strings.Repeat("zk_avg_latency	0\nzk_min_latency	0\nzk_mix_latency	0\n", 10)
   233  	unbound.client = mockUnboundClient{data: []byte(data), err: false}
   234  
   235  	assert.Nil(t, unbound.Collect())
   236  }
   237  
   238  type mockUnboundClient struct {
   239  	data []byte
   240  	err  bool
   241  }
   242  
   243  func (m mockUnboundClient) Connect() error {
   244  	return nil
   245  }
   246  
   247  func (m mockUnboundClient) Disconnect() error {
   248  	return nil
   249  }
   250  
   251  func (m mockUnboundClient) Command(_ string, process socket.Processor) error {
   252  	if m.err {
   253  		return errors.New("mock send error")
   254  	}
   255  	s := bufio.NewScanner(bytes.NewReader(m.data))
   256  	for s.Scan() {
   257  		process(s.Bytes())
   258  	}
   259  	return nil
   260  }
   261  
   262  func testCharts(t *testing.T, unbound *Unbound, collected map[string]int64) {
   263  	t.Helper()
   264  	ensureChartsCreatedForEveryThread(t, unbound)
   265  	ensureExtendedChartsCreated(t, unbound)
   266  	ensureCollectedHasAllChartsDimsVarsIDs(t, unbound, collected)
   267  }
   268  
   269  func ensureChartsCreatedForEveryThread(t *testing.T, u *Unbound) {
   270  	for thread := range u.cache.threads {
   271  		for _, chart := range *threadCharts(thread, u.Cumulative) {
   272  			assert.Truef(t, u.Charts().Has(chart.ID), "chart '%s' is not created for '%s' thread", chart.ID, thread)
   273  		}
   274  	}
   275  }
   276  
   277  func ensureExtendedChartsCreated(t *testing.T, u *Unbound) {
   278  	if len(u.cache.answerRCode) == 0 {
   279  		return
   280  	}
   281  	for _, chart := range *extendedCharts(u.Cumulative) {
   282  		assert.Truef(t, u.Charts().Has(chart.ID), "chart '%s' is not added", chart.ID)
   283  	}
   284  
   285  	if chart := u.Charts().Get(queryTypeChart.ID); chart != nil {
   286  		for typ := range u.cache.queryType {
   287  			dimID := "num.query.type." + typ
   288  			assert.Truef(t, chart.HasDim(dimID), "chart '%s' has no dim for '%s' type, expected '%s'", chart.ID, typ, dimID)
   289  		}
   290  	}
   291  	if chart := u.Charts().Get(queryClassChart.ID); chart != nil {
   292  		for class := range u.cache.queryClass {
   293  			dimID := "num.query.class." + class
   294  			assert.Truef(t, chart.HasDim(dimID), "chart '%s' has no dim for '%s' class, expected '%s'", chart.ID, class, dimID)
   295  		}
   296  	}
   297  	if chart := u.Charts().Get(queryOpCodeChart.ID); chart != nil {
   298  		for opcode := range u.cache.queryOpCode {
   299  			dimID := "num.query.opcode." + opcode
   300  			assert.Truef(t, chart.HasDim(dimID), "chart '%s' has no dim for '%s' opcode, expected '%s'", chart.ID, opcode, dimID)
   301  		}
   302  	}
   303  	if chart := u.Charts().Get(answerRCodeChart.ID); chart != nil {
   304  		for rcode := range u.cache.answerRCode {
   305  			dimID := "num.answer.rcode." + rcode
   306  			assert.Truef(t, chart.HasDim(dimID), "chart '%s' has no dim for '%s' rcode, expected '%s'", chart.ID, rcode, dimID)
   307  		}
   308  	}
   309  }
   310  
   311  func ensureCollectedHasAllChartsDimsVarsIDs(t *testing.T, u *Unbound, collected map[string]int64) {
   312  	for _, chart := range *u.Charts() {
   313  		for _, dim := range chart.Dims {
   314  			if dim.ID == "mem.mod.ipsecmod" {
   315  				continue
   316  			}
   317  			_, ok := collected[dim.ID]
   318  			assert.Truef(t, ok, "collected metrics has no data for dim '%s' chart '%s'", dim.ID, chart.ID)
   319  		}
   320  		for _, v := range chart.Vars {
   321  			_, ok := collected[v.ID]
   322  			assert.Truef(t, ok, "collected metrics has no data for var '%s' chart '%s'", v.ID, chart.ID)
   323  		}
   324  	}
   325  }
   326  
   327  var (
   328  	expectedCommon = map[string]int64{
   329  		"thread0.num.cachehits":              21,
   330  		"thread0.num.cachemiss":              7,
   331  		"thread0.num.dnscrypt.cert":          0,
   332  		"thread0.num.dnscrypt.cleartext":     0,
   333  		"thread0.num.dnscrypt.crypted":       0,
   334  		"thread0.num.dnscrypt.malformed":     0,
   335  		"thread0.num.expired":                0,
   336  		"thread0.num.prefetch":               0,
   337  		"thread0.num.queries":                28,
   338  		"thread0.num.queries_ip_ratelimited": 0,
   339  		"thread0.num.recursivereplies":       7,
   340  		"thread0.num.zero_ttl":               0,
   341  		"thread0.recursion.time.avg":         1255,
   342  		"thread0.recursion.time.median":      480,
   343  		"thread0.requestlist.avg":            857,
   344  		"thread0.requestlist.current.all":    0,
   345  		"thread0.requestlist.current.user":   0,
   346  		"thread0.requestlist.exceeded":       0,
   347  		"thread0.requestlist.max":            6,
   348  		"thread0.requestlist.overwritten":    0,
   349  		"thread0.tcpusage":                   0,
   350  		"thread1.num.cachehits":              13,
   351  		"thread1.num.cachemiss":              3,
   352  		"thread1.num.dnscrypt.cert":          0,
   353  		"thread1.num.dnscrypt.cleartext":     0,
   354  		"thread1.num.dnscrypt.crypted":       0,
   355  		"thread1.num.dnscrypt.malformed":     0,
   356  		"thread1.num.prefetch":               0,
   357  		"thread1.num.expired":                0,
   358  		"thread1.num.queries":                16,
   359  		"thread1.num.queries_ip_ratelimited": 0,
   360  		"thread1.num.recursivereplies":       3,
   361  		"thread1.num.zero_ttl":               0,
   362  		"thread1.recursion.time.avg":         93,
   363  		"thread1.recursion.time.median":      0,
   364  		"thread1.requestlist.avg":            0,
   365  		"thread1.requestlist.current.all":    0,
   366  		"thread1.requestlist.current.user":   0,
   367  		"thread1.requestlist.exceeded":       0,
   368  		"thread1.requestlist.max":            0,
   369  		"thread1.requestlist.overwritten":    0,
   370  		"thread1.tcpusage":                   0,
   371  		"time.elapsed":                       88,
   372  		"time.now":                           1574094836,
   373  		"time.up":                            88,
   374  		"total.num.cachehits":                34,
   375  		"total.num.cachemiss":                10,
   376  		"total.num.dnscrypt.cert":            0,
   377  		"total.num.dnscrypt.cleartext":       0,
   378  		"total.num.dnscrypt.crypted":         0,
   379  		"total.num.dnscrypt.malformed":       0,
   380  		"total.num.prefetch":                 0,
   381  		"total.num.expired":                  0,
   382  		"total.num.queries":                  44,
   383  		"total.num.queries_ip_ratelimited":   0,
   384  		"total.num.recursivereplies":         10,
   385  		"total.num.zero_ttl":                 0,
   386  		"total.recursion.time.avg":           907,
   387  		"total.recursion.time.median":        240,
   388  		"total.requestlist.avg":              600,
   389  		"total.requestlist.current.all":      0,
   390  		"total.requestlist.current.user":     0,
   391  		"total.requestlist.exceeded":         0,
   392  		"total.requestlist.max":              6,
   393  		"total.requestlist.overwritten":      0,
   394  		"total.tcpusage":                     0,
   395  	}
   396  
   397  	expectedExtended = map[string]int64{
   398  		"dnscrypt_nonce.cache.count":                 0,
   399  		"dnscrypt_shared_secret.cache.count":         0,
   400  		"infra.cache.count":                          205,
   401  		"key.cache.count":                            9,
   402  		"mem.cache.dnscrypt_nonce":                   0,
   403  		"mem.cache.dnscrypt_shared_secret":           0,
   404  		"mem.cache.message":                          90357,
   405  		"mem.cache.rrset":                            178642,
   406  		"mem.mod.iterator":                           16588,
   407  		"mem.mod.respip":                             0,
   408  		"mem.mod.subnet":                             74504,
   409  		"mem.mod.validator":                          81059,
   410  		"mem.streamwait":                             0,
   411  		"msg.cache.count":                            81,
   412  		"num.answer.bogus":                           0,
   413  		"num.answer.rcode.FORMERR":                   0,
   414  		"num.answer.rcode.NOERROR":                   40,
   415  		"num.answer.rcode.NOTIMPL":                   0,
   416  		"num.answer.rcode.NXDOMAIN":                  4,
   417  		"num.answer.rcode.REFUSED":                   0,
   418  		"num.answer.rcode.SERVFAIL":                  0,
   419  		"num.answer.secure":                          0,
   420  		"num.query.aggressive.NOERROR":               2,
   421  		"num.query.aggressive.NXDOMAIN":              0,
   422  		"num.query.authzone.down":                    0,
   423  		"num.query.authzone.up":                      0,
   424  		"num.query.class.IN":                         44,
   425  		"num.query.dnscrypt.replay":                  0,
   426  		"num.query.dnscrypt.shared_secret.cachemiss": 0,
   427  		"num.query.edns.DO":                          0,
   428  		"num.query.edns.present":                     0,
   429  		"num.query.flags.AA":                         0,
   430  		"num.query.flags.AD":                         0,
   431  		"num.query.flags.CD":                         0,
   432  		"num.query.flags.QR":                         0,
   433  		"num.query.flags.RA":                         0,
   434  		"num.query.flags.RD":                         44,
   435  		"num.query.flags.TC":                         0,
   436  		"num.query.flags.Z":                          0,
   437  		"num.query.ipv6":                             39,
   438  		"num.query.opcode.QUERY":                     44,
   439  		"num.query.ratelimited":                      0,
   440  		"num.query.subnet":                           0,
   441  		"num.query.subnet_cache":                     0,
   442  		"num.query.tcp":                              0,
   443  		"num.query.tcpout":                           1,
   444  		"num.query.tls":                              0,
   445  		"num.query.tls.resume":                       0,
   446  		"num.query.type.A":                           13,
   447  		"num.query.type.AAAA":                        13,
   448  		"num.query.type.MX":                          13,
   449  		"num.query.type.PTR":                         5,
   450  		"num.rrset.bogus":                            0,
   451  		"rrset.cache.count":                          314,
   452  		"thread0.num.cachehits":                      21,
   453  		"thread0.num.cachemiss":                      7,
   454  		"thread0.num.dnscrypt.cert":                  0,
   455  		"thread0.num.dnscrypt.cleartext":             0,
   456  		"thread0.num.dnscrypt.crypted":               0,
   457  		"thread0.num.dnscrypt.malformed":             0,
   458  		"thread0.num.expired":                        0,
   459  		"thread0.num.prefetch":                       0,
   460  		"thread0.num.queries":                        28,
   461  		"thread0.num.queries_ip_ratelimited":         0,
   462  		"thread0.num.recursivereplies":               7,
   463  		"thread0.num.zero_ttl":                       0,
   464  		"thread0.recursion.time.avg":                 1255,
   465  		"thread0.recursion.time.median":              480,
   466  		"thread0.requestlist.avg":                    857,
   467  		"thread0.requestlist.current.all":            0,
   468  		"thread0.requestlist.current.user":           0,
   469  		"thread0.requestlist.exceeded":               0,
   470  		"thread0.requestlist.max":                    6,
   471  		"thread0.requestlist.overwritten":            0,
   472  		"thread0.tcpusage":                           0,
   473  		"thread1.num.cachehits":                      13,
   474  		"thread1.num.cachemiss":                      3,
   475  		"thread1.num.dnscrypt.cert":                  0,
   476  		"thread1.num.dnscrypt.cleartext":             0,
   477  		"thread1.num.dnscrypt.crypted":               0,
   478  		"thread1.num.dnscrypt.malformed":             0,
   479  		"thread1.num.prefetch":                       0,
   480  		"thread1.num.expired":                        0,
   481  		"thread1.num.queries":                        16,
   482  		"thread1.num.queries_ip_ratelimited":         0,
   483  		"thread1.num.recursivereplies":               3,
   484  		"thread1.num.zero_ttl":                       0,
   485  		"thread1.recursion.time.avg":                 93,
   486  		"thread1.recursion.time.median":              0,
   487  		"thread1.requestlist.avg":                    0,
   488  		"thread1.requestlist.current.all":            0,
   489  		"thread1.requestlist.current.user":           0,
   490  		"thread1.requestlist.exceeded":               0,
   491  		"thread1.requestlist.max":                    0,
   492  		"thread1.requestlist.overwritten":            0,
   493  		"thread1.tcpusage":                           0,
   494  		"time.elapsed":                               88,
   495  		"time.now":                                   1574094836,
   496  		"time.up":                                    88,
   497  		"total.num.cachehits":                        34,
   498  		"total.num.cachemiss":                        10,
   499  		"total.num.dnscrypt.cert":                    0,
   500  		"total.num.dnscrypt.cleartext":               0,
   501  		"total.num.dnscrypt.crypted":                 0,
   502  		"total.num.dnscrypt.malformed":               0,
   503  		"total.num.prefetch":                         0,
   504  		"total.num.expired":                          0,
   505  		"total.num.queries":                          44,
   506  		"total.num.queries_ip_ratelimited":           0,
   507  		"total.num.recursivereplies":                 10,
   508  		"total.num.zero_ttl":                         0,
   509  		"total.recursion.time.avg":                   907,
   510  		"total.recursion.time.median":                240,
   511  		"total.requestlist.avg":                      600,
   512  		"total.requestlist.current.all":              0,
   513  		"total.requestlist.current.user":             0,
   514  		"total.requestlist.exceeded":                 0,
   515  		"total.requestlist.max":                      6,
   516  		"total.requestlist.overwritten":              0,
   517  		"total.tcpusage":                             0,
   518  		"unwanted.queries":                           0,
   519  		"unwanted.replies":                           0,
   520  	}
   521  )
   522  
   523  var (
   524  	expectedCumulative1 = map[string]int64{
   525  		"dnscrypt_nonce.cache.count":                 0,
   526  		"dnscrypt_shared_secret.cache.count":         0,
   527  		"infra.cache.count":                          192,
   528  		"key.cache.count":                            11,
   529  		"mem.cache.dnscrypt_nonce":                   0,
   530  		"mem.cache.dnscrypt_shared_secret":           0,
   531  		"mem.cache.message":                          93392,
   532  		"mem.cache.rrset":                            175745,
   533  		"mem.mod.iterator":                           16588,
   534  		"mem.mod.respip":                             0,
   535  		"mem.mod.subnet":                             74504,
   536  		"mem.mod.validator":                          81479,
   537  		"mem.streamwait":                             0,
   538  		"msg.cache.count":                            94,
   539  		"num.answer.bogus":                           0,
   540  		"num.answer.rcode.FORMERR":                   0,
   541  		"num.answer.rcode.NOERROR":                   184,
   542  		"num.answer.rcode.NOTIMPL":                   0,
   543  		"num.answer.rcode.NXDOMAIN":                  16,
   544  		"num.answer.rcode.REFUSED":                   0,
   545  		"num.answer.rcode.SERVFAIL":                  0,
   546  		"num.answer.secure":                          0,
   547  		"num.query.aggressive.NOERROR":               1,
   548  		"num.query.aggressive.NXDOMAIN":              0,
   549  		"num.query.authzone.down":                    0,
   550  		"num.query.authzone.up":                      0,
   551  		"num.query.class.IN":                         200,
   552  		"num.query.dnscrypt.replay":                  0,
   553  		"num.query.dnscrypt.shared_secret.cachemiss": 0,
   554  		"num.query.edns.DO":                          0,
   555  		"num.query.edns.present":                     0,
   556  		"num.query.flags.AA":                         0,
   557  		"num.query.flags.AD":                         0,
   558  		"num.query.flags.CD":                         0,
   559  		"num.query.flags.QR":                         0,
   560  		"num.query.flags.RA":                         0,
   561  		"num.query.flags.RD":                         200,
   562  		"num.query.flags.TC":                         0,
   563  		"num.query.flags.Z":                          0,
   564  		"num.query.ipv6":                             0,
   565  		"num.query.opcode.QUERY":                     200,
   566  		"num.query.ratelimited":                      0,
   567  		"num.query.subnet":                           0,
   568  		"num.query.subnet_cache":                     0,
   569  		"num.query.tcp":                              0,
   570  		"num.query.tcpout":                           0,
   571  		"num.query.tls":                              0,
   572  		"num.query.tls.resume":                       0,
   573  		"num.query.type.A":                           60,
   574  		"num.query.type.AAAA":                        60,
   575  		"num.query.type.MX":                          60,
   576  		"num.query.type.PTR":                         20,
   577  		"num.rrset.bogus":                            0,
   578  		"rrset.cache.count":                          304,
   579  		"thread0.num.cachehits":                      80,
   580  		"thread0.num.cachemiss":                      10,
   581  		"thread0.num.dnscrypt.cert":                  0,
   582  		"thread0.num.dnscrypt.cleartext":             0,
   583  		"thread0.num.dnscrypt.crypted":               0,
   584  		"thread0.num.dnscrypt.malformed":             0,
   585  		"thread0.num.expired":                        0,
   586  		"thread0.num.prefetch":                       0,
   587  		"thread0.num.queries":                        90,
   588  		"thread0.num.queries_ip_ratelimited":         0,
   589  		"thread0.num.recursivereplies":               10,
   590  		"thread0.num.zero_ttl":                       0,
   591  		"thread0.recursion.time.avg":                 222,
   592  		"thread0.recursion.time.median":              337,
   593  		"thread0.requestlist.avg":                    100,
   594  		"thread0.requestlist.current.all":            0,
   595  		"thread0.requestlist.current.user":           0,
   596  		"thread0.requestlist.exceeded":               0,
   597  		"thread0.requestlist.max":                    1,
   598  		"thread0.requestlist.overwritten":            0,
   599  		"thread0.tcpusage":                           0,
   600  		"thread1.num.cachehits":                      101,
   601  		"thread1.num.cachemiss":                      9,
   602  		"thread1.num.dnscrypt.cert":                  0,
   603  		"thread1.num.dnscrypt.cleartext":             0,
   604  		"thread1.num.dnscrypt.crypted":               0,
   605  		"thread1.num.dnscrypt.malformed":             0,
   606  		"thread1.num.expired":                        0,
   607  		"thread1.num.prefetch":                       0,
   608  		"thread1.num.queries":                        110,
   609  		"thread1.num.queries_ip_ratelimited":         0,
   610  		"thread1.num.recursivereplies":               9,
   611  		"thread1.num.zero_ttl":                       0,
   612  		"thread1.recursion.time.avg":                 844,
   613  		"thread1.recursion.time.median":              360,
   614  		"thread1.requestlist.avg":                    222,
   615  		"thread1.requestlist.current.all":            0,
   616  		"thread1.requestlist.current.user":           0,
   617  		"thread1.requestlist.exceeded":               0,
   618  		"thread1.requestlist.max":                    1,
   619  		"thread1.requestlist.overwritten":            0,
   620  		"thread1.tcpusage":                           0,
   621  		"time.elapsed":                               122,
   622  		"time.now":                                   1574103378,
   623  		"time.up":                                    122,
   624  		"total.num.cachehits":                        181,
   625  		"total.num.cachemiss":                        19,
   626  		"total.num.dnscrypt.cert":                    0,
   627  		"total.num.dnscrypt.cleartext":               0,
   628  		"total.num.dnscrypt.crypted":                 0,
   629  		"total.num.dnscrypt.malformed":               0,
   630  		"total.num.expired":                          0,
   631  		"total.num.prefetch":                         0,
   632  		"total.num.queries":                          200,
   633  		"total.num.queries_ip_ratelimited":           0,
   634  		"total.num.recursivereplies":                 19,
   635  		"total.num.zero_ttl":                         0,
   636  		"total.recursion.time.avg":                   516,
   637  		"total.recursion.time.median":                348,
   638  		"total.requestlist.avg":                      157,
   639  		"total.requestlist.current.all":              0,
   640  		"total.requestlist.current.user":             0,
   641  		"total.requestlist.exceeded":                 0,
   642  		"total.requestlist.max":                      1,
   643  		"total.requestlist.overwritten":              0,
   644  		"total.tcpusage":                             0,
   645  		"unwanted.queries":                           0,
   646  		"unwanted.replies":                           0,
   647  	}
   648  
   649  	expectedCumulative2 = map[string]int64{
   650  		"dnscrypt_nonce.cache.count":                 0,
   651  		"dnscrypt_shared_secret.cache.count":         0,
   652  		"infra.cache.count":                          192,
   653  		"key.cache.count":                            11,
   654  		"mem.cache.dnscrypt_nonce":                   0,
   655  		"mem.cache.dnscrypt_shared_secret":           0,
   656  		"mem.cache.message":                          93392,
   657  		"mem.cache.rrset":                            175745,
   658  		"mem.mod.iterator":                           16588,
   659  		"mem.mod.respip":                             0,
   660  		"mem.mod.subnet":                             74504,
   661  		"mem.mod.validator":                          81479,
   662  		"mem.streamwait":                             0,
   663  		"msg.cache.count":                            94,
   664  		"num.answer.bogus":                           0,
   665  		"num.answer.rcode.FORMERR":                   0,
   666  		"num.answer.rcode.NOERROR":                   274,
   667  		"num.answer.rcode.NOTIMPL":                   0,
   668  		"num.answer.rcode.NXDOMAIN":                  16,
   669  		"num.answer.rcode.REFUSED":                   0,
   670  		"num.answer.rcode.SERVFAIL":                  0,
   671  		"num.answer.secure":                          0,
   672  		"num.query.aggressive.NOERROR":               1,
   673  		"num.query.aggressive.NXDOMAIN":              0,
   674  		"num.query.authzone.down":                    0,
   675  		"num.query.authzone.up":                      0,
   676  		"num.query.class.IN":                         290,
   677  		"num.query.dnscrypt.replay":                  0,
   678  		"num.query.dnscrypt.shared_secret.cachemiss": 0,
   679  		"num.query.edns.DO":                          0,
   680  		"num.query.edns.present":                     0,
   681  		"num.query.flags.AA":                         0,
   682  		"num.query.flags.AD":                         0,
   683  		"num.query.flags.CD":                         0,
   684  		"num.query.flags.QR":                         0,
   685  		"num.query.flags.RA":                         0,
   686  		"num.query.flags.RD":                         290,
   687  		"num.query.flags.TC":                         0,
   688  		"num.query.flags.Z":                          0,
   689  		"num.query.ipv6":                             0,
   690  		"num.query.opcode.QUERY":                     290,
   691  		"num.query.ratelimited":                      0,
   692  		"num.query.subnet":                           0,
   693  		"num.query.subnet_cache":                     0,
   694  		"num.query.tcp":                              0,
   695  		"num.query.tcpout":                           0,
   696  		"num.query.tls":                              0,
   697  		"num.query.tls.resume":                       0,
   698  		"num.query.type.A":                           90,
   699  		"num.query.type.AAAA":                        90,
   700  		"num.query.type.MX":                          90,
   701  		"num.query.type.PTR":                         20,
   702  		"num.rrset.bogus":                            0,
   703  		"rrset.cache.count":                          304,
   704  		"thread0.num.cachehits":                      123,
   705  		"thread0.num.cachemiss":                      10,
   706  		"thread0.num.dnscrypt.cert":                  0,
   707  		"thread0.num.dnscrypt.cleartext":             0,
   708  		"thread0.num.dnscrypt.crypted":               0,
   709  		"thread0.num.dnscrypt.malformed":             0,
   710  		"thread0.num.expired":                        0,
   711  		"thread0.num.prefetch":                       0,
   712  		"thread0.num.queries":                        133,
   713  		"thread0.num.queries_ip_ratelimited":         0,
   714  		"thread0.num.recursivereplies":               10,
   715  		"thread0.num.zero_ttl":                       0,
   716  		"thread0.recursion.time.avg":                 0,
   717  		"thread0.recursion.time.median":              0,
   718  		"thread0.requestlist.avg":                    0,
   719  		"thread0.requestlist.current.all":            0,
   720  		"thread0.requestlist.current.user":           0,
   721  		"thread0.requestlist.exceeded":               0,
   722  		"thread0.requestlist.max":                    1,
   723  		"thread0.requestlist.overwritten":            0,
   724  		"thread0.tcpusage":                           0,
   725  		"thread1.num.cachehits":                      148,
   726  		"thread1.num.cachemiss":                      9,
   727  		"thread1.num.dnscrypt.cert":                  0,
   728  		"thread1.num.dnscrypt.cleartext":             0,
   729  		"thread1.num.dnscrypt.crypted":               0,
   730  		"thread1.num.dnscrypt.malformed":             0,
   731  		"thread1.num.prefetch":                       0,
   732  		"thread1.num.expired":                        0,
   733  		"thread1.num.queries":                        157,
   734  		"thread1.num.queries_ip_ratelimited":         0,
   735  		"thread1.num.recursivereplies":               9,
   736  		"thread1.num.zero_ttl":                       0,
   737  		"thread1.recursion.time.avg":                 0,
   738  		"thread1.recursion.time.median":              0,
   739  		"thread1.requestlist.avg":                    0,
   740  		"thread1.requestlist.current.all":            0,
   741  		"thread1.requestlist.current.user":           0,
   742  		"thread1.requestlist.exceeded":               0,
   743  		"thread1.requestlist.max":                    1,
   744  		"thread1.requestlist.overwritten":            0,
   745  		"thread1.tcpusage":                           0,
   746  		"time.elapsed":                               82,
   747  		"time.now":                                   1574103461,
   748  		"time.up":                                    205,
   749  		"total.num.cachehits":                        271,
   750  		"total.num.cachemiss":                        19,
   751  		"total.num.dnscrypt.cert":                    0,
   752  		"total.num.dnscrypt.cleartext":               0,
   753  		"total.num.dnscrypt.crypted":                 0,
   754  		"total.num.dnscrypt.malformed":               0,
   755  		"total.num.prefetch":                         0,
   756  		"total.num.expired":                          0,
   757  		"total.num.queries":                          290,
   758  		"total.num.queries_ip_ratelimited":           0,
   759  		"total.num.recursivereplies":                 19,
   760  		"total.num.zero_ttl":                         0,
   761  		"total.recursion.time.avg":                   0,
   762  		"total.recursion.time.median":                0,
   763  		"total.requestlist.avg":                      0,
   764  		"total.requestlist.current.all":              0,
   765  		"total.requestlist.current.user":             0,
   766  		"total.requestlist.exceeded":                 0,
   767  		"total.requestlist.max":                      1,
   768  		"total.requestlist.overwritten":              0,
   769  		"total.tcpusage":                             0,
   770  		"unwanted.queries":                           0,
   771  		"unwanted.replies":                           0,
   772  	}
   773  
   774  	expectedCumulative3 = map[string]int64{
   775  		"dnscrypt_nonce.cache.count":                 0,
   776  		"dnscrypt_shared_secret.cache.count":         0,
   777  		"infra.cache.count":                          232,
   778  		"key.cache.count":                            14,
   779  		"mem.cache.dnscrypt_nonce":                   0,
   780  		"mem.cache.dnscrypt_shared_secret":           0,
   781  		"mem.cache.message":                          101198,
   782  		"mem.cache.rrset":                            208839,
   783  		"mem.mod.iterator":                           16588,
   784  		"mem.mod.respip":                             0,
   785  		"mem.mod.subnet":                             74504,
   786  		"mem.mod.validator":                          85725,
   787  		"mem.streamwait":                             0,
   788  		"msg.cache.count":                            119,
   789  		"num.answer.bogus":                           0,
   790  		"num.answer.rcode.FORMERR":                   0,
   791  		"num.answer.rcode.NOERROR":                   334,
   792  		"num.answer.rcode.NOTIMPL":                   0,
   793  		"num.answer.rcode.NXDOMAIN":                  16,
   794  		"num.answer.rcode.REFUSED":                   0,
   795  		"num.answer.rcode.SERVFAIL":                  10,
   796  		"num.answer.rcode.nodata":                    20,
   797  		"num.answer.secure":                          0,
   798  		"num.query.aggressive.NOERROR":               1,
   799  		"num.query.aggressive.NXDOMAIN":              0,
   800  		"num.query.authzone.down":                    0,
   801  		"num.query.authzone.up":                      0,
   802  		"num.query.class.IN":                         360,
   803  		"num.query.dnscrypt.replay":                  0,
   804  		"num.query.dnscrypt.shared_secret.cachemiss": 0,
   805  		"num.query.edns.DO":                          0,
   806  		"num.query.edns.present":                     0,
   807  		"num.query.flags.AA":                         0,
   808  		"num.query.flags.AD":                         0,
   809  		"num.query.flags.CD":                         0,
   810  		"num.query.flags.QR":                         0,
   811  		"num.query.flags.RA":                         0,
   812  		"num.query.flags.RD":                         360,
   813  		"num.query.flags.TC":                         0,
   814  		"num.query.flags.Z":                          0,
   815  		"num.query.ipv6":                             0,
   816  		"num.query.opcode.QUERY":                     360,
   817  		"num.query.ratelimited":                      0,
   818  		"num.query.subnet":                           0,
   819  		"num.query.subnet_cache":                     0,
   820  		"num.query.tcp":                              0,
   821  		"num.query.tcpout":                           0,
   822  		"num.query.tls":                              0,
   823  		"num.query.tls.resume":                       0,
   824  		"num.query.type.A":                           120,
   825  		"num.query.type.AAAA":                        110,
   826  		"num.query.type.MX":                          110,
   827  		"num.query.type.PTR":                         20,
   828  		"num.rrset.bogus":                            0,
   829  		"rrset.cache.count":                          401,
   830  		"thread0.num.cachehits":                      150,
   831  		"thread0.num.cachemiss":                      15,
   832  		"thread0.num.dnscrypt.cert":                  0,
   833  		"thread0.num.dnscrypt.cleartext":             0,
   834  		"thread0.num.dnscrypt.crypted":               0,
   835  		"thread0.num.dnscrypt.malformed":             0,
   836  		"thread0.num.expired":                        0,
   837  		"thread0.num.prefetch":                       0,
   838  		"thread0.num.queries":                        165,
   839  		"thread0.num.queries_ip_ratelimited":         0,
   840  		"thread0.num.recursivereplies":               15,
   841  		"thread0.num.zero_ttl":                       0,
   842  		"thread0.recursion.time.avg":                 261,
   843  		"thread0.recursion.time.median":              318,
   844  		"thread0.requestlist.avg":                    66,
   845  		"thread0.requestlist.current.all":            0,
   846  		"thread0.requestlist.current.user":           0,
   847  		"thread0.requestlist.exceeded":               0,
   848  		"thread0.requestlist.max":                    1,
   849  		"thread0.requestlist.overwritten":            0,
   850  		"thread0.tcpusage":                           0,
   851  		"thread1.num.cachehits":                      184,
   852  		"thread1.num.cachemiss":                      11,
   853  		"thread1.num.dnscrypt.cert":                  0,
   854  		"thread1.num.dnscrypt.cleartext":             0,
   855  		"thread1.num.dnscrypt.crypted":               0,
   856  		"thread1.num.dnscrypt.malformed":             0,
   857  		"thread1.num.prefetch":                       0,
   858  		"thread1.num.expired":                        0,
   859  		"thread1.num.queries":                        195,
   860  		"thread1.num.queries_ip_ratelimited":         0,
   861  		"thread1.num.recursivereplies":               11,
   862  		"thread1.num.zero_ttl":                       0,
   863  		"thread1.recursion.time.avg":                 709,
   864  		"thread1.recursion.time.median":              294,
   865  		"thread1.requestlist.avg":                    363,
   866  		"thread1.requestlist.current.all":            0,
   867  		"thread1.requestlist.current.user":           0,
   868  		"thread1.requestlist.exceeded":               0,
   869  		"thread1.requestlist.max":                    2,
   870  		"thread1.requestlist.overwritten":            0,
   871  		"thread1.tcpusage":                           0,
   872  		"time.elapsed":                               82,
   873  		"time.now":                                   1574103543,
   874  		"time.up":                                    288,
   875  		"total.num.cachehits":                        334,
   876  		"total.num.cachemiss":                        26,
   877  		"total.num.dnscrypt.cert":                    0,
   878  		"total.num.dnscrypt.cleartext":               0,
   879  		"total.num.dnscrypt.crypted":                 0,
   880  		"total.num.dnscrypt.malformed":               0,
   881  		"total.num.prefetch":                         0,
   882  		"total.num.expired":                          0,
   883  		"total.num.queries":                          360,
   884  		"total.num.queries_ip_ratelimited":           0,
   885  		"total.num.recursivereplies":                 26,
   886  		"total.num.zero_ttl":                         0,
   887  		"total.recursion.time.avg":                   450,
   888  		"total.recursion.time.median":                306,
   889  		"total.requestlist.avg":                      192,
   890  		"total.requestlist.current.all":              0,
   891  		"total.requestlist.current.user":             0,
   892  		"total.requestlist.exceeded":                 0,
   893  		"total.requestlist.max":                      2,
   894  		"total.requestlist.overwritten":              0,
   895  		"total.tcpusage":                             0,
   896  		"unwanted.queries":                           0,
   897  		"unwanted.replies":                           0,
   898  	}
   899  )
   900  
   901  var (
   902  	expectedReset1 = map[string]int64{
   903  		"dnscrypt_nonce.cache.count":                 0,
   904  		"dnscrypt_shared_secret.cache.count":         0,
   905  		"infra.cache.count":                          181,
   906  		"key.cache.count":                            10,
   907  		"mem.cache.dnscrypt_nonce":                   0,
   908  		"mem.cache.dnscrypt_shared_secret":           0,
   909  		"mem.cache.message":                          86064,
   910  		"mem.cache.rrset":                            172757,
   911  		"mem.mod.iterator":                           16588,
   912  		"mem.mod.respip":                             0,
   913  		"mem.mod.subnet":                             74504,
   914  		"mem.mod.validator":                          79979,
   915  		"mem.streamwait":                             0,
   916  		"msg.cache.count":                            67,
   917  		"num.answer.bogus":                           0,
   918  		"num.answer.rcode.FORMERR":                   0,
   919  		"num.answer.rcode.NOERROR":                   90,
   920  		"num.answer.rcode.NOTIMPL":                   0,
   921  		"num.answer.rcode.NXDOMAIN":                  10,
   922  		"num.answer.rcode.REFUSED":                   0,
   923  		"num.answer.rcode.SERVFAIL":                  0,
   924  		"num.answer.rcode.nodata":                    10,
   925  		"num.answer.secure":                          0,
   926  		"num.query.aggressive.NOERROR":               2,
   927  		"num.query.aggressive.NXDOMAIN":              0,
   928  		"num.query.authzone.down":                    0,
   929  		"num.query.authzone.up":                      0,
   930  		"num.query.class.IN":                         100,
   931  		"num.query.dnscrypt.replay":                  0,
   932  		"num.query.dnscrypt.shared_secret.cachemiss": 0,
   933  		"num.query.edns.DO":                          0,
   934  		"num.query.edns.present":                     0,
   935  		"num.query.flags.AA":                         0,
   936  		"num.query.flags.AD":                         0,
   937  		"num.query.flags.CD":                         0,
   938  		"num.query.flags.QR":                         0,
   939  		"num.query.flags.RA":                         0,
   940  		"num.query.flags.RD":                         100,
   941  		"num.query.flags.TC":                         0,
   942  		"num.query.flags.Z":                          0,
   943  		"num.query.ipv6":                             0,
   944  		"num.query.opcode.QUERY":                     100,
   945  		"num.query.ratelimited":                      0,
   946  		"num.query.subnet":                           0,
   947  		"num.query.subnet_cache":                     0,
   948  		"num.query.tcp":                              0,
   949  		"num.query.tcpout":                           1,
   950  		"num.query.tls":                              0,
   951  		"num.query.tls.resume":                       0,
   952  		"num.query.type.A":                           30,
   953  		"num.query.type.AAAA":                        30,
   954  		"num.query.type.MX":                          30,
   955  		"num.query.type.PTR":                         10,
   956  		"num.rrset.bogus":                            0,
   957  		"rrset.cache.count":                          303,
   958  		"thread0.num.cachehits":                      44,
   959  		"thread0.num.cachemiss":                      7,
   960  		"thread0.num.dnscrypt.cert":                  0,
   961  		"thread0.num.dnscrypt.cleartext":             0,
   962  		"thread0.num.dnscrypt.crypted":               0,
   963  		"thread0.num.dnscrypt.malformed":             0,
   964  		"thread0.num.expired":                        0,
   965  		"thread0.num.prefetch":                       0,
   966  		"thread0.num.queries":                        51,
   967  		"thread0.num.queries_ip_ratelimited":         0,
   968  		"thread0.num.recursivereplies":               7,
   969  		"thread0.num.zero_ttl":                       0,
   970  		"thread0.recursion.time.avg":                 365,
   971  		"thread0.recursion.time.median":              57,
   972  		"thread0.requestlist.avg":                    0,
   973  		"thread0.requestlist.current.all":            0,
   974  		"thread0.requestlist.current.user":           0,
   975  		"thread0.requestlist.exceeded":               0,
   976  		"thread0.requestlist.max":                    0,
   977  		"thread0.requestlist.overwritten":            0,
   978  		"thread0.tcpusage":                           0,
   979  		"thread1.num.cachehits":                      46,
   980  		"thread1.num.cachemiss":                      3,
   981  		"thread1.num.dnscrypt.cert":                  0,
   982  		"thread1.num.dnscrypt.cleartext":             0,
   983  		"thread1.num.dnscrypt.crypted":               0,
   984  		"thread1.num.dnscrypt.malformed":             0,
   985  		"thread1.num.prefetch":                       0,
   986  		"thread1.num.expired":                        0,
   987  		"thread1.num.queries":                        49,
   988  		"thread1.num.queries_ip_ratelimited":         0,
   989  		"thread1.num.recursivereplies":               3,
   990  		"thread1.num.zero_ttl":                       0,
   991  		"thread1.recursion.time.avg":                 1582,
   992  		"thread1.recursion.time.median":              0,
   993  		"thread1.requestlist.avg":                    0,
   994  		"thread1.requestlist.current.all":            0,
   995  		"thread1.requestlist.current.user":           0,
   996  		"thread1.requestlist.exceeded":               0,
   997  		"thread1.requestlist.max":                    0,
   998  		"thread1.requestlist.overwritten":            0,
   999  		"thread1.tcpusage":                           0,
  1000  		"time.elapsed":                               45,
  1001  		"time.now":                                   1574103644,
  1002  		"time.up":                                    45,
  1003  		"total.num.cachehits":                        90,
  1004  		"total.num.cachemiss":                        10,
  1005  		"total.num.dnscrypt.cert":                    0,
  1006  		"total.num.dnscrypt.cleartext":               0,
  1007  		"total.num.dnscrypt.crypted":                 0,
  1008  		"total.num.dnscrypt.malformed":               0,
  1009  		"total.num.prefetch":                         0,
  1010  		"total.num.expired":                          0,
  1011  		"total.num.queries":                          100,
  1012  		"total.num.queries_ip_ratelimited":           0,
  1013  		"total.num.recursivereplies":                 10,
  1014  		"total.num.zero_ttl":                         0,
  1015  		"total.recursion.time.avg":                   730,
  1016  		"total.recursion.time.median":                28,
  1017  		"total.requestlist.avg":                      0,
  1018  		"total.requestlist.current.all":              0,
  1019  		"total.requestlist.current.user":             0,
  1020  		"total.requestlist.exceeded":                 0,
  1021  		"total.requestlist.max":                      0,
  1022  		"total.requestlist.overwritten":              0,
  1023  		"total.tcpusage":                             0,
  1024  		"unwanted.queries":                           0,
  1025  		"unwanted.replies":                           0,
  1026  	}
  1027  	expectedReset2 = map[string]int64{
  1028  		"dnscrypt_nonce.cache.count":                 0,
  1029  		"dnscrypt_shared_secret.cache.count":         0,
  1030  		"infra.cache.count":                          181,
  1031  		"key.cache.count":                            10,
  1032  		"mem.cache.dnscrypt_nonce":                   0,
  1033  		"mem.cache.dnscrypt_shared_secret":           0,
  1034  		"mem.cache.message":                          86064,
  1035  		"mem.cache.rrset":                            172757,
  1036  		"mem.mod.iterator":                           16588,
  1037  		"mem.mod.respip":                             0,
  1038  		"mem.mod.subnet":                             74504,
  1039  		"mem.mod.validator":                          79979,
  1040  		"mem.streamwait":                             0,
  1041  		"msg.cache.count":                            67,
  1042  		"num.answer.bogus":                           0,
  1043  		"num.answer.rcode.FORMERR":                   0,
  1044  		"num.answer.rcode.NOERROR":                   0,
  1045  		"num.answer.rcode.NOTIMPL":                   0,
  1046  		"num.answer.rcode.NXDOMAIN":                  0,
  1047  		"num.answer.rcode.REFUSED":                   0,
  1048  		"num.answer.rcode.SERVFAIL":                  0,
  1049  		"num.answer.rcode.nodata":                    0,
  1050  		"num.answer.secure":                          0,
  1051  		"num.query.aggressive.NOERROR":               0,
  1052  		"num.query.aggressive.NXDOMAIN":              0,
  1053  		"num.query.authzone.down":                    0,
  1054  		"num.query.authzone.up":                      0,
  1055  		"num.query.class.IN":                         0,
  1056  		"num.query.dnscrypt.replay":                  0,
  1057  		"num.query.dnscrypt.shared_secret.cachemiss": 0,
  1058  		"num.query.edns.DO":                          0,
  1059  		"num.query.edns.present":                     0,
  1060  		"num.query.flags.AA":                         0,
  1061  		"num.query.flags.AD":                         0,
  1062  		"num.query.flags.CD":                         0,
  1063  		"num.query.flags.QR":                         0,
  1064  		"num.query.flags.RA":                         0,
  1065  		"num.query.flags.RD":                         0,
  1066  		"num.query.flags.TC":                         0,
  1067  		"num.query.flags.Z":                          0,
  1068  		"num.query.ipv6":                             0,
  1069  		"num.query.opcode.QUERY":                     0,
  1070  		"num.query.ratelimited":                      0,
  1071  		"num.query.subnet":                           0,
  1072  		"num.query.subnet_cache":                     0,
  1073  		"num.query.tcp":                              0,
  1074  		"num.query.tcpout":                           0,
  1075  		"num.query.tls":                              0,
  1076  		"num.query.tls.resume":                       0,
  1077  		"num.query.type.A":                           0,
  1078  		"num.query.type.AAAA":                        0,
  1079  		"num.query.type.MX":                          0,
  1080  		"num.query.type.PTR":                         0,
  1081  		"num.rrset.bogus":                            0,
  1082  		"rrset.cache.count":                          303,
  1083  		"thread0.num.cachehits":                      0,
  1084  		"thread0.num.cachemiss":                      0,
  1085  		"thread0.num.dnscrypt.cert":                  0,
  1086  		"thread0.num.dnscrypt.cleartext":             0,
  1087  		"thread0.num.dnscrypt.crypted":               0,
  1088  		"thread0.num.dnscrypt.malformed":             0,
  1089  		"thread0.num.expired":                        0,
  1090  		"thread0.num.prefetch":                       0,
  1091  		"thread0.num.queries":                        0,
  1092  		"thread0.num.queries_ip_ratelimited":         0,
  1093  		"thread0.num.recursivereplies":               0,
  1094  		"thread0.num.zero_ttl":                       0,
  1095  		"thread0.recursion.time.avg":                 0,
  1096  		"thread0.recursion.time.median":              0,
  1097  		"thread0.requestlist.avg":                    0,
  1098  		"thread0.requestlist.current.all":            0,
  1099  		"thread0.requestlist.current.user":           0,
  1100  		"thread0.requestlist.exceeded":               0,
  1101  		"thread0.requestlist.max":                    0,
  1102  		"thread0.requestlist.overwritten":            0,
  1103  		"thread0.tcpusage":                           0,
  1104  		"thread1.num.cachehits":                      0,
  1105  		"thread1.num.cachemiss":                      0,
  1106  		"thread1.num.dnscrypt.cert":                  0,
  1107  		"thread1.num.dnscrypt.cleartext":             0,
  1108  		"thread1.num.dnscrypt.crypted":               0,
  1109  		"thread1.num.dnscrypt.malformed":             0,
  1110  		"thread1.num.prefetch":                       0,
  1111  		"thread1.num.expired":                        0,
  1112  		"thread1.num.queries":                        0,
  1113  		"thread1.num.queries_ip_ratelimited":         0,
  1114  		"thread1.num.recursivereplies":               0,
  1115  		"thread1.num.zero_ttl":                       0,
  1116  		"thread1.recursion.time.avg":                 0,
  1117  		"thread1.recursion.time.median":              0,
  1118  		"thread1.requestlist.avg":                    0,
  1119  		"thread1.requestlist.current.all":            0,
  1120  		"thread1.requestlist.current.user":           0,
  1121  		"thread1.requestlist.exceeded":               0,
  1122  		"thread1.requestlist.max":                    0,
  1123  		"thread1.requestlist.overwritten":            0,
  1124  		"thread1.tcpusage":                           0,
  1125  		"time.elapsed":                               26,
  1126  		"time.now":                                   1574103671,
  1127  		"time.up":                                    71,
  1128  		"total.num.cachehits":                        0,
  1129  		"total.num.cachemiss":                        0,
  1130  		"total.num.dnscrypt.cert":                    0,
  1131  		"total.num.dnscrypt.cleartext":               0,
  1132  		"total.num.dnscrypt.crypted":                 0,
  1133  		"total.num.dnscrypt.malformed":               0,
  1134  		"total.num.prefetch":                         0,
  1135  		"total.num.expired":                          0,
  1136  		"total.num.queries":                          0,
  1137  		"total.num.queries_ip_ratelimited":           0,
  1138  		"total.num.recursivereplies":                 0,
  1139  		"total.num.zero_ttl":                         0,
  1140  		"total.recursion.time.avg":                   0,
  1141  		"total.recursion.time.median":                0,
  1142  		"total.requestlist.avg":                      0,
  1143  		"total.requestlist.current.all":              0,
  1144  		"total.requestlist.current.user":             0,
  1145  		"total.requestlist.exceeded":                 0,
  1146  		"total.requestlist.max":                      0,
  1147  		"total.requestlist.overwritten":              0,
  1148  		"total.tcpusage":                             0,
  1149  		"unwanted.queries":                           0,
  1150  		"unwanted.replies":                           0,
  1151  	}
  1152  
  1153  	expectedReset3 = map[string]int64{
  1154  		"dnscrypt_nonce.cache.count":                 0,
  1155  		"dnscrypt_shared_secret.cache.count":         0,
  1156  		"infra.cache.count":                          303,
  1157  		"key.cache.count":                            15,
  1158  		"mem.cache.dnscrypt_nonce":                   0,
  1159  		"mem.cache.dnscrypt_shared_secret":           0,
  1160  		"mem.cache.message":                          105471,
  1161  		"mem.cache.rrset":                            235917,
  1162  		"mem.mod.iterator":                           16588,
  1163  		"mem.mod.respip":                             0,
  1164  		"mem.mod.subnet":                             74504,
  1165  		"mem.mod.validator":                          87270,
  1166  		"mem.streamwait":                             0,
  1167  		"msg.cache.count":                            127,
  1168  		"num.answer.bogus":                           0,
  1169  		"num.answer.rcode.FORMERR":                   0,
  1170  		"num.answer.rcode.NOERROR":                   60,
  1171  		"num.answer.rcode.NOTIMPL":                   0,
  1172  		"num.answer.rcode.NXDOMAIN":                  10,
  1173  		"num.answer.rcode.REFUSED":                   0,
  1174  		"num.answer.rcode.SERVFAIL":                  0,
  1175  		"num.answer.rcode.nodata":                    10,
  1176  		"num.answer.secure":                          0,
  1177  		"num.query.aggressive.NOERROR":               2,
  1178  		"num.query.aggressive.NXDOMAIN":              0,
  1179  		"num.query.authzone.down":                    0,
  1180  		"num.query.authzone.up":                      0,
  1181  		"num.query.class.IN":                         70,
  1182  		"num.query.dnscrypt.replay":                  0,
  1183  		"num.query.dnscrypt.shared_secret.cachemiss": 0,
  1184  		"num.query.edns.DO":                          0,
  1185  		"num.query.edns.present":                     0,
  1186  		"num.query.flags.AA":                         0,
  1187  		"num.query.flags.AD":                         0,
  1188  		"num.query.flags.CD":                         0,
  1189  		"num.query.flags.QR":                         0,
  1190  		"num.query.flags.RA":                         0,
  1191  		"num.query.flags.RD":                         70,
  1192  		"num.query.flags.TC":                         0,
  1193  		"num.query.flags.Z":                          0,
  1194  		"num.query.ipv6":                             0,
  1195  		"num.query.opcode.QUERY":                     70,
  1196  		"num.query.ratelimited":                      0,
  1197  		"num.query.subnet":                           0,
  1198  		"num.query.subnet_cache":                     0,
  1199  		"num.query.tcp":                              0,
  1200  		"num.query.tcpout":                           0,
  1201  		"num.query.tls":                              0,
  1202  		"num.query.tls.resume":                       0,
  1203  		"num.query.type.A":                           20,
  1204  		"num.query.type.AAAA":                        20,
  1205  		"num.query.type.MX":                          20,
  1206  		"num.query.type.PTR":                         10,
  1207  		"num.rrset.bogus":                            0,
  1208  		"rrset.cache.count":                          501,
  1209  		"thread0.num.cachehits":                      30,
  1210  		"thread0.num.cachemiss":                      4,
  1211  		"thread0.num.dnscrypt.cert":                  0,
  1212  		"thread0.num.dnscrypt.cleartext":             0,
  1213  		"thread0.num.dnscrypt.crypted":               0,
  1214  		"thread0.num.dnscrypt.malformed":             0,
  1215  		"thread0.num.expired":                        0,
  1216  		"thread0.num.prefetch":                       0,
  1217  		"thread0.num.queries":                        34,
  1218  		"thread0.num.queries_ip_ratelimited":         0,
  1219  		"thread0.num.recursivereplies":               4,
  1220  		"thread0.num.zero_ttl":                       0,
  1221  		"thread0.recursion.time.avg":                 541,
  1222  		"thread0.recursion.time.median":              98,
  1223  		"thread0.requestlist.avg":                    0,
  1224  		"thread0.requestlist.current.all":            0,
  1225  		"thread0.requestlist.current.user":           0,
  1226  		"thread0.requestlist.exceeded":               0,
  1227  		"thread0.requestlist.max":                    0,
  1228  		"thread0.requestlist.overwritten":            0,
  1229  		"thread0.tcpusage":                           0,
  1230  		"thread1.num.cachehits":                      33,
  1231  		"thread1.num.cachemiss":                      3,
  1232  		"thread1.num.dnscrypt.cert":                  0,
  1233  		"thread1.num.dnscrypt.cleartext":             0,
  1234  		"thread1.num.dnscrypt.crypted":               0,
  1235  		"thread1.num.dnscrypt.malformed":             0,
  1236  		"thread1.num.prefetch":                       0,
  1237  		"thread1.num.expired":                        0,
  1238  		"thread1.num.queries":                        36,
  1239  		"thread1.num.queries_ip_ratelimited":         0,
  1240  		"thread1.num.recursivereplies":               3,
  1241  		"thread1.num.zero_ttl":                       0,
  1242  		"thread1.recursion.time.avg":                 62,
  1243  		"thread1.recursion.time.median":              0,
  1244  		"thread1.requestlist.avg":                    1666,
  1245  		"thread1.requestlist.current.all":            0,
  1246  		"thread1.requestlist.current.user":           0,
  1247  		"thread1.requestlist.exceeded":               0,
  1248  		"thread1.requestlist.max":                    5,
  1249  		"thread1.requestlist.overwritten":            0,
  1250  		"thread1.tcpusage":                           0,
  1251  		"time.elapsed":                               59,
  1252  		"time.now":                                   1574103731,
  1253  		"time.up":                                    131,
  1254  		"total.num.cachehits":                        63,
  1255  		"total.num.cachemiss":                        7,
  1256  		"total.num.dnscrypt.cert":                    0,
  1257  		"total.num.dnscrypt.cleartext":               0,
  1258  		"total.num.dnscrypt.crypted":                 0,
  1259  		"total.num.dnscrypt.malformed":               0,
  1260  		"total.num.prefetch":                         0,
  1261  		"total.num.expired":                          0,
  1262  		"total.num.queries":                          70,
  1263  		"total.num.queries_ip_ratelimited":           0,
  1264  		"total.num.recursivereplies":                 7,
  1265  		"total.num.zero_ttl":                         0,
  1266  		"total.recursion.time.avg":                   336,
  1267  		"total.recursion.time.median":                49,
  1268  		"total.requestlist.avg":                      714,
  1269  		"total.requestlist.current.all":              0,
  1270  		"total.requestlist.current.user":             0,
  1271  		"total.requestlist.exceeded":                 0,
  1272  		"total.requestlist.max":                      5,
  1273  		"total.requestlist.overwritten":              0,
  1274  		"total.tcpusage":                             0,
  1275  		"unwanted.queries":                           0,
  1276  		"unwanted.replies":                           0,
  1277  	}
  1278  )