
* add docker build * fix the working dir in Dockerfile * add release publish docker image * address intentation and use default release * migrate keydb_modstatsd to keydb-internal * rm * add submodule cpp-statsd-client * include trigger keydb_modstatsd Makefile in modules Makefile * update * have clean also trigger keydb_modstatsd clean * move cpp-statsd-client to deps * checkout to a06a5b9359f31d946fe163b9038586982971ae49 * update relative path in compilation * remove submodule instead use the source * include building keydb statsd module * fix check in Dockerfile docker-entrypoint.sh * fix * fix the comment caused stuck docker build * use commit hash as tag template * fix * test tag * Revert "test tag" This reverts commit 9cbc57137d57aab4fdd5a9283bae07391b3c7f8b. * make docker build independent * add new build to ci * emit system free metrics with '/proc/meminfo' * have emit system free memory within metrics_time_taken_us and also add metric time taken for it * Remove Expireset (#217) Major refactor to place expiry information directly in the object struct. * update MemFree to MemAvailable in keydb statsd * add metric emit for non-empty primary with less than 2 connected replicas * address comments * Multiply CPU percent metric by 100 * Fix memory leaks * Fix slow to free when low lock contention * fix nodename metricsname * fix unnecessary replace * Make propagating before freeing module context optional (#225) * don't propogate on module context free for rdb load * default in wrong place * Flash expiration (#197) Design Doc: https://docs.google.com/document/d/1NmnYGnHLdZp-KOUCUatX5iXpF-L3YK4VUc9Lm3Tqxpo/edit?usp=sharing * Emit more aggregate metrics in modstatsd (#223) * Permit keys of differing slots as long as they are served by this cluster and we are not migrating * Fix over pessimistic checks that prevent replicas from serving mget * Fix logic bug * async rehash is preventing rehashing during RDB load after a db flush. Ensure it can't interefere after a flush * make async rehash configurable * only use internal locks when multithreaded (#205) * Fix crossslot error migrating batches of keys * Fix bug where we erroneously answer queries belonging to another shard * fix mac compile * enable level_compaction_dynamic_level_bytes after flush, and flush expires for FLASH (#229) * enable level_compaction_dynamic_level_bytes after flush, and flush expires * update debug reload for flash * update debug reload for flash complete * missing forward declare * commit existing changes then track changes for debug reload * missing args * commitChanges is conditional Co-authored-by: John Sully <jsully@snapchat.com> --------- Co-authored-by: zliang <zliang@snapchat.com> Co-authored-by: John Sully <jsully@snapchat.com> Co-authored-by: Alex Cope <acope@snapchat.com> Co-authored-by: John Sully <john@csquare.ca>
81 lines
2.3 KiB
C++
81 lines
2.3 KiB
C++
#ifndef STATSD_SERVER_HPP
|
|
#define STATSD_SERVER_HPP
|
|
|
|
// It might make sense to include this test class in the UDPSender header
|
|
// it includes most of the cross platform defines etc that we need for socket io
|
|
#include "cpp-statsd-client/UDPSender.hpp"
|
|
|
|
#include <algorithm>
|
|
#include <string>
|
|
|
|
namespace Statsd {
|
|
|
|
class StatsdServer {
|
|
public:
|
|
StatsdServer(unsigned short port = 8125) noexcept {
|
|
#ifdef _WIN32
|
|
if (!detail::WinSockSingleton::getInstance().ok()) {
|
|
m_errorMessage = "WSAStartup failed: errno=" + std::to_string(SOCKET_ERRNO);
|
|
}
|
|
#endif
|
|
|
|
// Create the socket
|
|
m_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
|
if (!detail::isValidSocket(m_socket)) {
|
|
m_errorMessage = "socket creation failed: errno=" + std::to_string(SOCKET_ERRNO);
|
|
return;
|
|
}
|
|
|
|
// Binding should be with ipv4 to all interfaces
|
|
struct sockaddr_in address {};
|
|
address.sin_family = AF_INET;
|
|
address.sin_port = htons(port);
|
|
address.sin_addr.s_addr = INADDR_ANY;
|
|
|
|
// Try to bind
|
|
if (bind(m_socket, reinterpret_cast<const struct sockaddr*>(&address), sizeof(address)) != 0) {
|
|
SOCKET_CLOSE(m_socket);
|
|
m_socket = k_invalidSocket;
|
|
m_errorMessage = "bind failed: errno=" + std::to_string(SOCKET_ERRNO);
|
|
}
|
|
}
|
|
|
|
~StatsdServer() {
|
|
if (detail::isValidSocket(m_socket)) {
|
|
SOCKET_CLOSE(m_socket);
|
|
}
|
|
}
|
|
|
|
const std::string& errorMessage() const noexcept {
|
|
return m_errorMessage;
|
|
}
|
|
|
|
std::string receive() noexcept {
|
|
// If uninitialized then bail
|
|
if (!detail::isValidSocket(m_socket)) {
|
|
return "";
|
|
}
|
|
|
|
// Try to receive (this is blocking)
|
|
std::string buffer(256, '\0');
|
|
int string_len;
|
|
if ((string_len = recv(m_socket, &buffer[0], static_cast<int>(buffer.size()), 0)) < 1) {
|
|
m_errorMessage = "Could not recv on the socket file descriptor";
|
|
return "";
|
|
}
|
|
|
|
// No error return the trimmed result
|
|
m_errorMessage.clear();
|
|
buffer.resize(std::min(static_cast<size_t>(string_len), buffer.size()));
|
|
return buffer;
|
|
}
|
|
|
|
private:
|
|
SOCKET_TYPE m_socket;
|
|
std::string m_errorMessage;
|
|
};
|
|
|
|
} // namespace Statsd
|
|
|
|
#endif
|