@@ -33,18 +33,19 @@ Writer::~Writer() {
3333 }
3434}
3535
36- void Writer::writeCounter (const std::string& name, uint64_t increment) {
37- std::string message (fmt::format (" envoy.{}:{}|c" , name, increment));
36+ void Writer::writeCounter (const std::string& name, const std::string& tag_str, uint64_t increment) {
37+ std::string message (fmt::format (" envoy.{}:{}|c{} \n " , name, increment, tag_str ));
3838 send (message);
3939}
4040
41- void Writer::writeGauge (const std::string& name, uint64_t value) {
42- std::string message (fmt::format (" envoy.{}:{}|g" , name, value));
41+ void Writer::writeGauge (const std::string& name, const std::string& tag_str, uint64_t value) {
42+ std::string message (fmt::format (" envoy.{}:{}|g{} \n " , name, value, tag_str ));
4343 send (message);
4444}
4545
46- void Writer::writeTimer (const std::string& name, const std::chrono::milliseconds& ms) {
47- std::string message (fmt::format (" envoy.{}:{}|ms" , name, ms.count ()));
46+ void Writer::writeTimer (const std::string& name, const std::string& tag_str,
47+ const std::chrono::milliseconds& ms) {
48+ std::string message (fmt::format (" envoy.{}:{}|ms{}\n " , name, ms.count (), tag_str));
4849 send (message);
4950}
5051
@@ -53,22 +54,51 @@ void Writer::send(const std::string& message) {
5354}
5455
5556UdpStatsdSink::UdpStatsdSink (ThreadLocal::SlotAllocator& tls,
56- Network::Address::InstanceConstSharedPtr address)
57- : tls_(tls.allocateSlot()), server_address_(address) {
58- setWriter<Writer>();
57+ Network::Address::InstanceConstSharedPtr address, bool useTag)
58+ : tls_(tls.allocateSlot()), server_address_(address), useTag_(useTag) {
59+ tls_->set ([this ](Event::Dispatcher&) -> ThreadLocal::ThreadLocalObjectSharedPtr {
60+ return std::make_shared<Writer>(this ->server_address_ );
61+ });
5962}
6063
6164void UdpStatsdSink::flushCounter (const Counter& counter, uint64_t delta) {
62- tls_->getTyped <Writer>().writeCounter (counter. name ( ), delta);
65+ tls_->getTyped <Writer>().writeCounter (getName ( counter), buildTagStr (counter. tags () ), delta);
6366}
6467
6568void UdpStatsdSink::flushGauge (const Gauge& gauge, uint64_t value) {
66- tls_->getTyped <Writer>().writeGauge (gauge. name ( ), value);
69+ tls_->getTyped <Writer>().writeGauge (getName ( gauge), buildTagStr (gauge. tags () ), value);
6770}
6871
6972void UdpStatsdSink::onHistogramComplete (const Histogram& histogram, uint64_t value) {
7073 // For statsd histograms are all timers.
71- tls_->getTyped <Writer>().writeTimer (histogram.name (), std::chrono::milliseconds (value));
74+ tls_->getTyped <Writer>().writeTimer (getName (histogram), buildTagStr (histogram.tags ()),
75+ std::chrono::milliseconds (value));
76+ }
77+
78+ std::string UdpStatsdSink::getName (const Metric& metric) {
79+ if (useTag_) {
80+ return metric.tagExtractedName ();
81+ } else {
82+ return metric.name ();
83+ }
84+ }
85+
86+ const std::string buildTagStr (const std::vector<Tag>& tags) {
87+ if (tags.empty ()) {
88+ return {};
89+ }
90+
91+ std::string tagStr = " |#" ;
92+ int i = 0 ;
93+ for (const Tag& tag : tags) {
94+ if (i == 0 ) {
95+ tagStr.append (fmt::format (" {}:{}" , tag.name_ , tag.value_ ));
96+ } else {
97+ tagStr.append (fmt::format (" ,{}:{}" , tag.name_ , tag.value_ ));
98+ }
99+ i++;
100+ }
101+ return tagStr;
72102}
73103
74104char TcpStatsdSink::STAT_PREFIX[] = " envoy." ;
0 commit comments