Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

dnsdist: Add support for multiple carbon servers #3499

Merged
merged 1 commit into from Mar 3, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
124 changes: 62 additions & 62 deletions pdns/dnsdist-carbon.cc
Expand Up @@ -21,77 +21,77 @@ try
{
auto localCarbon = g_carbon.getLocal();
for(int numloops=0;;++numloops) {
if(localCarbon->server == ComboAddress("0.0.0.0", 0)) {
if(localCarbon->servers.empty()) {
sleep(1);
continue;
}
if(numloops)
sleep(localCarbon->interval);

try {
Socket s(localCarbon->server.sin4.sin_family, SOCK_STREAM);

s.setNonBlocking();
s.connect(localCarbon->server); // we do the connect so the attempt happens while we gather stats

ostringstream str;
time_t now=time(0);
string hostname=localCarbon->ourname;
if(hostname.empty()) {
char tmp[80];
memset(tmp, 0, sizeof(tmp));
gethostname(tmp, sizeof(tmp));
char *p = strchr(tmp, '.');
if(p) *p=0;
hostname=tmp;
boost::replace_all(hostname, ".", "_");
}
for(const auto& e : g_stats.entries) {
str<<"dnsdist."<<hostname<<".main."<<e.first<<' ';
if(const auto& val = boost::get<DNSDistStats::stat_t*>(&e.second))
str<<(*val)->load();
else if (const auto& val = boost::get<double*>(&e.second))
str<<**val;
else
str<<(*boost::get<DNSDistStats::statfunction_t>(&e.second))(e.first);
str<<' '<<now<<"\r\n";
}
const auto states = g_dstates.getCopy();
for(const auto& s : states) {
string serverName = s->getName();
boost::replace_all(serverName, ".", "_");
const string base = "dnsdist." + hostname + ".main.servers." + serverName + ".";
str<<base<<"queries" << ' ' << s->queries.load() << " " << now << "\r\n";
str<<base<<"drops" << ' ' << s->reuseds.load() << " " << now << "\r\n";
str<<base<<"latency" << ' ' << s->latencyUsec/1000.0 << " " << now << "\r\n";
str<<base<<"senderrors" << ' ' << s->sendErrors.load() << " " << now << "\r\n";
str<<base<<"outstanding" << ' ' << s->outstanding.load() << " " << now << "\r\n";
}
for(const auto& front : g_frontends) {
if (front->udpFD == -1 && front->tcpFD == -1)
continue;
string hostname=localCarbon->ourname;
if(hostname.empty()) {
char tmp[80];
memset(tmp, 0, sizeof(tmp));
gethostname(tmp, sizeof(tmp));
char *p = strchr(tmp, '.');
if(p) *p=0;
hostname=tmp;
boost::replace_all(hostname, ".", "_");
}
for (auto server : localCarbon->servers) {
try {
Socket s(server.sin4.sin_family, SOCK_STREAM);
s.setNonBlocking();
s.connect(server); // we do the connect so the attempt happens while we gather stats
ostringstream str;
time_t now=time(0);
for(const auto& e : g_stats.entries) {
str<<"dnsdist."<<hostname<<".main."<<e.first<<' ';
if(const auto& val = boost::get<DNSDistStats::stat_t*>(&e.second))
str<<(*val)->load();
else if (const auto& val = boost::get<double*>(&e.second))
str<<**val;
else
str<<(*boost::get<DNSDistStats::statfunction_t>(&e.second))(e.first);
str<<' '<<now<<"\r\n";
}
const auto states = g_dstates.getCopy();
for(const auto& s : states) {
string serverName = s->getName();
boost::replace_all(serverName, ".", "_");
const string base = "dnsdist." + hostname + ".main.servers." + serverName + ".";
str<<base<<"queries" << ' ' << s->queries.load() << " " << now << "\r\n";
str<<base<<"drops" << ' ' << s->reuseds.load() << " " << now << "\r\n";
str<<base<<"latency" << ' ' << s->latencyUsec/1000.0 << " " << now << "\r\n";
str<<base<<"senderrors" << ' ' << s->sendErrors.load() << " " << now << "\r\n";
str<<base<<"outstanding" << ' ' << s->outstanding.load() << " " << now << "\r\n";
}
for(const auto& front : g_frontends) {
if (front->udpFD == -1 && front->tcpFD == -1)
continue;

string frontName = front->local.toStringWithPort() + (front->udpFD >= 0 ? "_udp" : "_tcp");
boost::replace_all(frontName, ".", "_");
const string base = "dnsdist." + hostname + ".main.frontends." + frontName + ".";
str<<base<<"queries" << ' ' << front->queries.load() << " " << now << "\r\n";
}
const string msg = str.str();
string frontName = front->local.toStringWithPort() + (front->udpFD >= 0 ? "_udp" : "_tcp");
boost::replace_all(frontName, ".", "_");
const string base = "dnsdist." + hostname + ".main.frontends." + frontName + ".";
str<<base<<"queries" << ' ' << front->queries.load() << " " << now << "\r\n";
}
const string msg = str.str();

int ret = waitForRWData(s.getHandle(), false, 1 , 0);
if(ret <= 0 ) {
vinfolog("Unable to write data to carbon server on %s: %s", localCarbon->server.toStringWithPort(), (ret<0 ? strerror(errno) : "Timeout"));
continue;
int ret = waitForRWData(s.getHandle(), false, 1 , 0);
if(ret <= 0 ) {
vinfolog("Unable to write data to carbon server on %s: %s", server.toStringWithPort(), (ret<0 ? strerror(errno) : "Timeout"));
continue;
}
s.setBlocking();
ret=writen2(s.getHandle(), msg.c_str(), msg.size());
if(ret < 0)
warnlog("Error writing carbon data to %s: %s", server.toStringWithPort(), strerror(errno));
if(ret==0)
warnlog("EOF writing carbon data to %s", server.toStringWithPort());
}
catch(std::exception& e) {
warnlog("Problem sending carbon data: %s", e.what());
}
s.setBlocking();
ret=writen2(s.getHandle(), msg.c_str(), msg.size());
if(ret < 0)
warnlog("Error writing carbon data to %s: %s", localCarbon->server.toStringWithPort(), strerror(errno));
if(ret==0)
warnlog("EOF writing carbon data to %s", localCarbon->server.toStringWithPort());
}
catch(std::exception& e) {
warnlog("Problem sending carbon data: %s", e.what());
}
}
return 0;
Expand Down
2 changes: 1 addition & 1 deletion pdns/dnsdist-lua.cc
Expand Up @@ -985,7 +985,7 @@ vector<std::function<void(void)>> setupLua(bool client, const std::string& confi
boost::optional<int> interval) {
setLuaSideEffect();
auto ours = g_carbon.getCopy();
ours.server=ComboAddress(address, 2003);
ours.servers.push_back(ComboAddress(address, 2003));
if(ourName)
ours.ourname=*ourName;
if(interval)
Expand Down
2 changes: 1 addition & 1 deletion pdns/dnsdist.hh
Expand Up @@ -432,7 +432,7 @@ void removeServerFromPool(pools_t& pools, const string& poolName, std::shared_pt

struct CarbonConfig
{
ComboAddress server{"0.0.0.0", 0};
vector<ComboAddress> servers;
std::string ourname;
unsigned int interval{30};
};
Expand Down