From 61d10a4d07eb9273414d906d74ac30a0bd3d5cb4 Mon Sep 17 00:00:00 2001 From: Matti Hiljanen Date: Thu, 14 Mar 2019 17:20:05 +0200 Subject: [PATCH] dnsdist: add frontend response statistics --- pdns/dnsdist-tcp.cc | 33 ++++++++++++++++++++++++++++ pdns/dnsdist.cc | 22 ++++++++++++++++++- pdns/dnsdist.hh | 9 ++++++++ pdns/dnsdistdist/docs/statistics.rst | 12 ++++++++++ regression-tests.dnsdist/test_API.py | 2 ++ 5 files changed, 77 insertions(+), 1 deletion(-) diff --git a/pdns/dnsdist-tcp.cc b/pdns/dnsdist-tcp.cc index 777865ff1..41465e16d 100644 --- a/pdns/dnsdist-tcp.cc +++ b/pdns/dnsdist-tcp.cc @@ -467,6 +467,17 @@ void tcpClientThread(int pipefd) #endif handler.writeSizeAndMsg(cachedResponse, cachedResponseSize, g_tcpSendTimeout); g_stats.cacheHits++; + switch (dr.dh->rcode) { + case RCode::NXDomain: + ++g_stats.frontendNXDomain; + break; + case RCode::ServFail: + ++g_stats.frontendServFail; + break; + case RCode::NoError: + ++g_stats.frontendNoError; + break; + } continue; } @@ -501,6 +512,17 @@ void tcpClientThread(int pipefd) #endif handler.writeSizeAndMsg(cachedResponse, cachedResponseSize, g_tcpSendTimeout); ++g_stats.cacheHits; + switch (dr.dh->rcode) { + case RCode::NXDomain: + ++g_stats.frontendNXDomain; + break; + case RCode::ServFail: + ++g_stats.frontendServFail; + break; + case RCode::NoError: + ++g_stats.frontendNoError; + break; + } continue; } ++g_stats.cacheMisses; @@ -711,6 +733,17 @@ void tcpClientThread(int pipefd) } ++g_stats.responses; + switch (dr.dh->rcode) { + case RCode::NXDomain: + ++g_stats.frontendNXDomain; + break; + case RCode::ServFail: + ++g_stats.frontendServFail; + break; + case RCode::NoError: + ++g_stats.frontendNoError; + break; + } struct timespec answertime; gettime(&answertime); unsigned int udiff = 1000000.0*DiffTime(now,answertime); diff --git a/pdns/dnsdist.cc b/pdns/dnsdist.cc index f2dfa39b2..debcd5849 100644 --- a/pdns/dnsdist.cc +++ b/pdns/dnsdist.cc @@ -567,8 +567,17 @@ try { gettime(&ts); g_rings.insertResponse(ts, ids->origRemote, ids->qname, ids->qtype, (unsigned int)udiff, (unsigned int)got, *dh, dss->remote); - if(dh->rcode == RCode::ServFail) { + switch (dh->rcode) { + case RCode::NXDomain: + ++g_stats.frontendNXDomain; + break; + case RCode::ServFail: ++g_stats.servfailResponses; + ++g_stats.frontendServFail; + break; + case RCode::NoError: + ++g_stats.frontendNoError; + break; } dss->latencyUsec = (127.0 * dss->latencyUsec / 128.0) + udiff/128.0; @@ -1352,6 +1361,17 @@ static int sendAndEncryptUDPResponse(LocalHolders& holders, ClientState& cs, con if (cacheHit) { ++g_stats.cacheHits; } + switch (dr.dh->rcode) { + case RCode::NXDomain: + ++g_stats.frontendNXDomain; + break; + case RCode::ServFail: + ++g_stats.frontendServFail; + break; + case RCode::NoError: + ++g_stats.frontendNoError; + break; + } doLatencyStats(0); // we're not going to measure this return 0; } diff --git a/pdns/dnsdist.hh b/pdns/dnsdist.hh index 925d1d0d1..b51a42710 100644 --- a/pdns/dnsdist.hh +++ b/pdns/dnsdist.hh @@ -208,6 +208,9 @@ struct DNSDistStats stat_t responses{0}; stat_t servfailResponses{0}; stat_t queries{0}; + stat_t frontendNXDomain{0}; + stat_t frontendServFail{0}; + stat_t frontendNoError{0}; stat_t nonCompliantQueries{0}; stat_t nonCompliantResponses{0}; stat_t rdQueries{0}; @@ -235,6 +238,9 @@ struct DNSDistStats {"responses", &responses}, {"servfail-responses", &servfailResponses}, {"queries", &queries}, + {"frontend-nxdomain", &frontendNXDomain}, + {"frontend-servfail", &frontendServFail}, + {"frontend-noerror", &frontendNoError}, {"acl-drops", &aclDrops}, {"rule-drop", &ruleDrop}, {"rule-nxdomain", &ruleNXDomain}, @@ -324,6 +330,9 @@ struct MetricDefinitionStorage { { "responses", MetricDefinition(PrometheusMetricType::counter, "Number of responses received from backends") }, { "servfail-responses", MetricDefinition(PrometheusMetricType::counter, "Number of SERVFAIL answers received from backends") }, { "queries", MetricDefinition(PrometheusMetricType::counter, "Number of received queries")}, + { "frontend-nxdomain", MetricDefinition(PrometheusMetricType::counter, "Number of NXDomain answers sent to clients")}, + { "frontend-servfail", MetricDefinition(PrometheusMetricType::counter, "Number of SERVFAIL answers sent to clients")}, + { "frontend-noerror", MetricDefinition(PrometheusMetricType::counter, "Number of NoError answers sent to clients")}, { "acl-drops", MetricDefinition(PrometheusMetricType::counter, "Number of packets dropped because of the ACL")}, { "rule-drop", MetricDefinition(PrometheusMetricType::counter, "Number of queries dropped because of a rule")}, { "rule-nxdomain", MetricDefinition(PrometheusMetricType::counter, "Number of NXDomain answers returned because of a rule")}, diff --git a/pdns/dnsdistdist/docs/statistics.rst b/pdns/dnsdistdist/docs/statistics.rst index a56e9e0fa..10f7de4ff 100644 --- a/pdns/dnsdistdist/docs/statistics.rst +++ b/pdns/dnsdistdist/docs/statistics.rst @@ -67,6 +67,18 @@ fd-usage -------- Number of currently used file descriptors. +frontend-noerror +---------------- +Number of NoError answers sent to clients. + +frontend-nxdomain +----------------- +Number of NXDomain answers sent to clients. + +frontend-servfail +----------------- +Number of ServFail answers sent to clients. + latency-avg100 -------------- Average response latency in microseconds of the last 100 packets diff --git a/regression-tests.dnsdist/test_API.py b/regression-tests.dnsdist/test_API.py index 00578a3e7..05e139128 100644 --- a/regression-tests.dnsdist/test_API.py +++ b/regression-tests.dnsdist/test_API.py @@ -226,6 +226,7 @@ class TestAPIBasics(DNSDistTest): values[entry['name']] = entry['value'] expected = ['responses', 'servfail-responses', 'queries', 'acl-drops', + 'frontend-noerror', 'frontend-nxdomain', 'frontend-servfail', 'rule-drop', 'rule-nxdomain', 'rule-refused', 'self-answered', 'downstream-timeouts', 'downstream-send-errors', 'trunc-failures', 'no-policy', 'latency0-1', 'latency1-10', 'latency10-50', 'latency50-100', 'latency100-1000', @@ -255,6 +256,7 @@ class TestAPIBasics(DNSDistTest): content = r.json() expected = ['responses', 'servfail-responses', 'queries', 'acl-drops', + 'frontend-noerror', 'frontend-nxdomain', 'frontend-servfail', 'rule-drop', 'rule-nxdomain', 'rule-refused', 'self-answered', 'downstream-timeouts', 'downstream-send-errors', 'trunc-failures', 'no-policy', 'latency0-1', 'latency1-10', 'latency10-50', 'latency50-100', 'latency100-1000', -- 2.40.0