return IOState::Done;
}
-static void updateTCPLatency(const std::shared_ptr<DownstreamState>& ds, double udiff)
-{
- ds->latencyUsecTCP = (127.0 * ds->latencyUsecTCP / 128.0) + udiff/128.0;
-}
-
static void handleResponseSent(std::shared_ptr<IncomingTCPConnectionState>& state, const TCPResponse& currentResponse)
{
if (currentResponse.d_idstate.qtype == QType::AXFR || currentResponse.d_idstate.qtype == QType::IXFR) {
backendProtocol = dnsdist::Protocol::DoTCP;
}
::handleResponseSent(ids, udiff, state->d_ci.remote, ds->d_config.remote, static_cast<unsigned int>(currentResponse.d_buffer.size()), currentResponse.d_cleartextDH, backendProtocol);
-
- updateTCPLatency(ds, udiff);
}
}
output << "# TYPE " << statesbase << "tcpavgconnduration " << "gauge" << "\n";
output << "# HELP " << statesbase << "tlsresumptions " << "The number of times a TLS session has been resumed" << "\n";
output << "# TYPE " << statesbase << "tlsersumptions " << "counter" << "\n";
+ output << "# HELP " << statesbase << "tcplatency " << "Server's latency when answering TCP questions in milliseconds" << "\n";
+ output << "# TYPE " << statesbase << "tcplatency " << "gauge" << "\n";
for (const auto& state : *states) {
string serverName;
output << statesbase << "queries" << label << " " << state->queries.load() << "\n";
output << statesbase << "responses" << label << " " << state->responses.load() << "\n";
output << statesbase << "drops" << label << " " << state->reuseds.load() << "\n";
- if (state->isUp())
- output << statesbase << "latency" << label << " " << state->latencyUsec/1000.0 << "\n";
+ if (state->isUp()) {
+ output << statesbase << "latency" << label << " " << state->latencyUsec/1000.0 << "\n";
+ output << statesbase << "tcplatency" << label << " " << state->latencyUsecTCP/1000.0 << "\n";
+ }
output << statesbase << "senderrors" << label << " " << state->sendErrors.load() << "\n";
output << statesbase << "outstanding" << label << " " << state->outstanding.load() << "\n";
output << statesbase << "order" << label << " " << state->d_config.order << "\n";
{"tcpAvgQueriesPerConnection", (double)a->tcpAvgQueriesPerConnection},
{"tcpAvgConnectionDuration", (double)a->tcpAvgConnectionDuration},
{"tlsResumptions", (double)a->tlsResumptions},
+ {"tcpLatency", (double)(a->latencyUsecTCP/1000.0)},
{"dropRate", (double)a->dropRate}
};
/* sending a latency for a DOWN server doesn't make sense */
if (a->d_config.availability == DownstreamState::Availability::Down) {
server["latency"] = nullptr;
+ server["tcpLatency"] = nullptr;
}
servers.push_back(std::move(server));
dh->id = ids->origID;
++dss->responses;
+ double udiff = ids->sentTime.udiff();
+ // do that _before_ the processing, otherwise it's not fair to the backend
+ cerr<<"udiff is "<<(udiff/1000.0)<<endl;
+ dss->latencyUsec = (127.0 * dss->latencyUsec / 128.0) + udiff / 128.0;
+
/* don't call processResponse for DOH */
if (du) {
#ifdef HAVE_DNS_OVER_HTTPS
sendUDPResponse(origFD, response, dr.delayMsec, ids->hopLocal, ids->hopRemote);
}
- double udiff = ids->sentTime.udiff();
+ udiff = ids->sentTime.udiff();
vinfolog("Got answer from %s, relayed to %s, took %f usec", dss->d_config.remote.toStringWithPort(), ids->origRemote.toStringWithPort(), udiff);
handleResponseSent(*ids, udiff, *dr.remote, dss->d_config.remote, static_cast<unsigned int>(got), cleartextDH, dss->getProtocol());
dss->releaseState(queryId);
- dss->latencyUsec = (127.0 * dss->latencyUsec / 128.0) + udiff/128.0;
-
doLatencyStats(udiff);
}
}
handleResponseSent(ids, udiff, *dr.remote, d_ds->d_config.remote, response.d_buffer.size(), cleartextDH, d_ds->getProtocol());
- d_ds->latencyUsec = (127.0 * d_ds->latencyUsec / 128.0) + udiff/128.0;
-
doLatencyStats(udiff);
}
--conn->d_ds->outstanding;
auto ids = std::move(it->second.d_query.d_idstate);
+ const double udiff = ids.sentTime.udiff();
+ conn->d_ds->latencyUsecTCP = (127.0 * conn->d_ds->latencyUsecTCP / 128.0) + udiff / 128.0;
+
d_pendingResponses.erase(it);
/* marking as idle for now, so we can accept new queries if our queues are empty */
if (d_pendingQueries.empty() && d_pendingResponses.empty()) {