Skip to content

Commit

Permalink
begin adding some metrics to tcp-proxy
Browse files Browse the repository at this point in the history
  • Loading branch information
glimberg committed May 7, 2024
1 parent 0fb9d43 commit 342657e
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 6 deletions.
13 changes: 9 additions & 4 deletions tcp-proxy/Makefile
@@ -1,9 +1,14 @@
CXX=$(shell which clang++ g++ c++ 2>/dev/null | head -n 1)

INCLUDES?=-I../ext/prometheus-cpp-lite-1.0/core/include -I../ext/prometheus-cpp-lite-1.0/simpleapi/include
INCLUDES?=-isystem ../ext/prometheus-cpp-lite-1.0/core/include -isystem ../ext/prometheus-cpp-lite-1.0/simpleapi/include

all:
$(CXX) -O3 -fno-rtti $(INCLUDES) -std=c++11 -pthread -frtti -o tcp-proxy tcp-proxy.cpp ../node/Metrics.cpp
OBJS=Metrics.o \
../node/Metrics.o

CXXFLAGS=-O3 -fno-rtti $(INCLUDES) -std=c++17 -pthread -frtti

all: $(OBJS) tcp-proxy.o
$(CXX) -O3 -fno-rtti $(INCLUDES) -std=c++17 -pthread -frtti -o tcp-proxy tcp-proxy.o $(OBJS)

clean:
rm -f *.o tcp-proxy *.dSYM
rm -f $(OBJS) tcp-proxy.o tcp-proxy *.dSYM
24 changes: 24 additions & 0 deletions tcp-proxy/Metrics.cpp
@@ -0,0 +1,24 @@
#include <prometheus/simpleapi.h>


namespace ZeroTier {
namespace Metrics {
prometheus::simpleapi::counter_metric_t udp_open_failed
{"udp_open_failed", "UDP open failed"};

prometheus::simpleapi::counter_metric_t tcp_opened
{"tcp_opened", "TCP opened"};
prometheus::simpleapi::counter_metric_t tcp_closed
{"tcp_closed", "TCP closed"};

prometheus::simpleapi::counter_metric_t tcp_bytes_in
{"tcp_byes_in", "TCP bytes in"};
prometheus::simpleapi::counter_metric_t tcp_bytes_out
{"tcp_byes_out", "TCP bytes out"};

prometheus::simpleapi::counter_metric_t udp_bytes_in
{"udp_bytes_in", "UDP bytes in"};
prometheus::simpleapi::counter_metric_t udp_bytes_out
{"udp_bytes_out", "UDP bytes out"};
}
}
21 changes: 21 additions & 0 deletions tcp-proxy/Metrics.hpp
@@ -0,0 +1,21 @@
#ifndef _TCP_PROXY_METRICS_H_
#define _TCP_PROXY_METRICS_H_

#include "../node/Metrics.hpp"

namespace ZeroTier {
namespace Metrics {
extern prometheus::simpleapi::counter_metric_t udp_open_failed;

extern prometheus::simpleapi::counter_metric_t tcp_opened;
extern prometheus::simpleapi::counter_metric_t tcp_closed;

extern prometheus::simpleapi::counter_metric_t tcp_bytes_in;
extern prometheus::simpleapi::counter_metric_t tcp_bytes_out;

extern prometheus::simpleapi::counter_metric_t udp_bytes_in;
extern prometheus::simpleapi::counter_metric_t udp_bytes_out;
}
}

#endif // _TCP_PROXY_METRICS_H_
15 changes: 13 additions & 2 deletions tcp-proxy/tcp-proxy.cpp
Expand Up @@ -43,7 +43,7 @@

#include "../osdep/Phy.hpp"

#include "../node/Metrics.hpp"
#include "Metrics.hpp"

#define ZT_TCP_PROXY_CONNECTION_TIMEOUT_SECONDS 300
#define ZT_TCP_PROXY_TCP_PORT 443
Expand Down Expand Up @@ -127,6 +127,8 @@ struct TcpProxyService
if (!*uptr)
return;
if ((from->sa_family == AF_INET)&&(len >= 16)&&(len < 2048)) {
Metrics::udp_bytes_in += len;

Client &c = *((Client *)*uptr);
c.lastActivity = time((time_t *)0);

Expand Down Expand Up @@ -171,6 +173,7 @@ struct TcpProxyService
Client &c = clients[sockN];
PhySocket *udp = getUnusedUdp((void *)&c);
if (!udp) {
Metrics::udp_open_failed++;
phy->close(sockN);
clients.erase(sockN);
printf("** TCP rejected, no more UDP ports to assign\n");
Expand All @@ -184,6 +187,7 @@ struct TcpProxyService
c.newVersion = false;
*uptrN = (void *)&c;
printf("<< TCP from %s -> %.16llx\n",inet_ntoa(reinterpret_cast<const struct sockaddr_in *>(from)->sin_addr),(unsigned long long)&c);
Metrics::tcp_opened++;
}

void phyOnTcpClose(PhySocket *sock,void **uptr)
Expand All @@ -194,13 +198,16 @@ struct TcpProxyService
phy->close(c.udp);
clients.erase(sock);
printf("** TCP %.16llx closed\n",(unsigned long long)*uptr);
Metrics::tcp_closed++;
}

void phyOnTcpData(PhySocket *sock,void **uptr,void *data,unsigned long len)
{
Client &c = *((Client *)*uptr);
c.lastActivity = time((time_t *)0);

Metrics::tcp_bytes_in += len;

for(unsigned long i=0;i<len;++i) {
if (c.tcpReadPtr >= sizeof(c.tcpReadBuf)) {
phy->close(sock);
Expand Down Expand Up @@ -246,6 +253,7 @@ struct TcpProxyService
if ((ntohs(dest.sin_port) > 1024)&&(payloadLen >= 16)) {
phy->udpSend(c.udp,(const struct sockaddr *)&dest,payload,payloadLen);
printf(">> TCP %.16llx to %s:%d\n",(unsigned long long)*uptr,inet_ntoa(dest.sin_addr),(int)ntohs(dest.sin_port));
Metrics::udp_bytes_out += payloadLen;
}
}

Expand All @@ -260,6 +268,7 @@ struct TcpProxyService
Client &c = *((Client *)*uptr);
if (c.tcpWritePtr) {
long n = phy->streamSend(sock,c.tcpWriteBuf,c.tcpWritePtr);
Metrics::tcp_bytes_out += n;
if (n > 0) {
memmove(c.tcpWriteBuf,c.tcpWriteBuf + n,c.tcpWritePtr -= (unsigned long)n);
if (!c.tcpWritePtr)
Expand All @@ -278,8 +287,10 @@ struct TcpProxyService
toClose.push_back(c->second.udp);
}
}
for(std::vector<PhySocket *>::iterator s(toClose.begin());s!=toClose.end();++s)
for(std::vector<PhySocket *>::iterator s(toClose.begin());s!=toClose.end();++s) {
phy->close(*s);
Metrics::tcp_closed++;
}
}
};

Expand Down

0 comments on commit 342657e

Please sign in to comment.