(cobra to statsd bot) add ability to extract a numerical value and send a gauge event to statsd
This commit is contained in:
		@@ -1,6 +1,10 @@
 | 
				
			|||||||
# Changelog
 | 
					# Changelog
 | 
				
			||||||
All changes to this project will be documented in this file.
 | 
					All changes to this project will be documented in this file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [9.1.7] - 2020-03-29
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(cobra to statsd bot) add ability to extract a numerical value and send a gauge event to statsd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## [9.1.6] - 2020-03-29
 | 
					## [9.1.6] - 2020-03-29
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(ws cobra subscriber) use a Json::StreamWriter to write to std::cout, and save one std::string allocation for each message printed
 | 
					(ws cobra subscriber) use a Json::StreamWriter to write to std::cout, and save one std::string allocation for each message printed
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -40,7 +40,7 @@ namespace ix
 | 
				
			|||||||
    // Extract an attribute from a Json Value.
 | 
					    // Extract an attribute from a Json Value.
 | 
				
			||||||
    // extractAttr("foo.bar", {"foo": {"bar": "baz"}}) => baz
 | 
					    // extractAttr("foo.bar", {"foo": {"bar": "baz"}}) => baz
 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
    std::string extractAttr(const std::string& attr, const Json::Value& jsonValue)
 | 
					    Json::Value extractAttr(const std::string& attr, const Json::Value& jsonValue)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        // Split by .
 | 
					        // Split by .
 | 
				
			||||||
        std::string token;
 | 
					        std::string token;
 | 
				
			||||||
@@ -53,7 +53,7 @@ namespace ix
 | 
				
			|||||||
            val = val[token];
 | 
					            val = val[token];
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return val.asString();
 | 
					        return val;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int cobra_to_statsd_bot(const ix::CobraConfig& config,
 | 
					    int cobra_to_statsd_bot(const ix::CobraConfig& config,
 | 
				
			||||||
@@ -62,6 +62,7 @@ namespace ix
 | 
				
			|||||||
                            const std::string& position,
 | 
					                            const std::string& position,
 | 
				
			||||||
                            StatsdClient& statsdClient,
 | 
					                            StatsdClient& statsdClient,
 | 
				
			||||||
                            const std::string& fields,
 | 
					                            const std::string& fields,
 | 
				
			||||||
 | 
					                            const std::string& gauge,
 | 
				
			||||||
                            bool verbose,
 | 
					                            bool verbose,
 | 
				
			||||||
                            size_t maxQueueSize,
 | 
					                            size_t maxQueueSize,
 | 
				
			||||||
                            bool enableHeartbeat,
 | 
					                            bool enableHeartbeat,
 | 
				
			||||||
@@ -124,7 +125,7 @@ namespace ix
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        std::thread t2(heartbeat);
 | 
					        std::thread t2(heartbeat);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        auto statsdSender = [&statsdClient, &queueManager, &sentCount, &tokens, &stop] {
 | 
					        auto statsdSender = [&statsdClient, &queueManager, &sentCount, &tokens, &stop, &gauge, &fatalCobraError] {
 | 
				
			||||||
            while (true)
 | 
					            while (true)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Json::Value msg = queueManager.pop();
 | 
					                Json::Value msg = queueManager.pop();
 | 
				
			||||||
@@ -136,10 +137,51 @@ namespace ix
 | 
				
			|||||||
                for (auto&& attr : tokens)
 | 
					                for (auto&& attr : tokens)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    id += ".";
 | 
					                    id += ".";
 | 
				
			||||||
                    id += extractAttr(attr, msg);
 | 
					                    auto val = extractAttr(attr, msg);
 | 
				
			||||||
 | 
					                    id += val.asString();
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (gauge.empty())
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
                    statsdClient.count(id, 1);
 | 
					                    statsdClient.count(id, 1);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    // spdlog::info("{} - {} -> {}", id, gauge, x);
 | 
				
			||||||
 | 
					                    auto val = extractAttr(gauge, msg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (val.isInt())
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        auto x = val.asInt();
 | 
				
			||||||
 | 
					                        statsdClient.gauge(id, (size_t) x);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else if (val.isInt64())
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        auto x = val.asInt64();
 | 
				
			||||||
 | 
					                        statsdClient.gauge(id, (size_t) x);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else if (val.isUInt())
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        auto x = val.asUInt();
 | 
				
			||||||
 | 
					                        statsdClient.gauge(id, (size_t) x);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else if (val.isUInt64())
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        auto x = val.asUInt64();
 | 
				
			||||||
 | 
					                        statsdClient.gauge(id, (size_t) x);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else if (val.isDouble())
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        auto x = val.asUInt64();
 | 
				
			||||||
 | 
					                        statsdClient.gauge(id, (size_t) x);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        spdlog::error("Gauge {} is not a numberic type", gauge);
 | 
				
			||||||
 | 
					                        fatalCobraError = true;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                sentCount += 1;
 | 
					                sentCount += 1;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,6 +18,7 @@ namespace ix
 | 
				
			|||||||
                            const std::string& position,
 | 
					                            const std::string& position,
 | 
				
			||||||
                            StatsdClient& statsdClient,
 | 
					                            StatsdClient& statsdClient,
 | 
				
			||||||
                            const std::string& fields,
 | 
					                            const std::string& fields,
 | 
				
			||||||
 | 
					                            const std::string& gauge,
 | 
				
			||||||
                            bool verbose,
 | 
					                            bool verbose,
 | 
				
			||||||
                            size_t maxQueueSize,
 | 
					                            size_t maxQueueSize,
 | 
				
			||||||
                            bool enableHeartbeat,
 | 
					                            bool enableHeartbeat,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,4 +6,4 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define IX_WEBSOCKET_VERSION "9.1.6"
 | 
					#define IX_WEBSOCKET_VERSION "9.1.7"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -111,6 +111,7 @@ TEST_CASE("Cobra_to_statsd_bot", "[cobra_bots]")
 | 
				
			|||||||
        REQUIRE(initialized);
 | 
					        REQUIRE(initialized);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        std::string fields("device.game\ndevice.os_name");
 | 
					        std::string fields("device.game\ndevice.os_name");
 | 
				
			||||||
 | 
					        std::string gauge;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        int sentCount = ix::cobra_to_statsd_bot(config,
 | 
					        int sentCount = ix::cobra_to_statsd_bot(config,
 | 
				
			||||||
                                                channel,
 | 
					                                                channel,
 | 
				
			||||||
@@ -118,6 +119,7 @@ TEST_CASE("Cobra_to_statsd_bot", "[cobra_bots]")
 | 
				
			|||||||
                                                position,
 | 
					                                                position,
 | 
				
			||||||
                                                statsdClient,
 | 
					                                                statsdClient,
 | 
				
			||||||
                                                fields,
 | 
					                                                fields,
 | 
				
			||||||
 | 
					                                                gauge,
 | 
				
			||||||
                                                verbose,
 | 
					                                                verbose,
 | 
				
			||||||
                                                maxQueueSize,
 | 
					                                                maxQueueSize,
 | 
				
			||||||
                                                enableHeartbeat,
 | 
					                                                enableHeartbeat,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -70,6 +70,7 @@ int main(int argc, char** argv)
 | 
				
			|||||||
    std::string password;
 | 
					    std::string password;
 | 
				
			||||||
    std::string prefix("ws.test.v0");
 | 
					    std::string prefix("ws.test.v0");
 | 
				
			||||||
    std::string fields;
 | 
					    std::string fields;
 | 
				
			||||||
 | 
					    std::string gauge;
 | 
				
			||||||
    std::string dsn;
 | 
					    std::string dsn;
 | 
				
			||||||
    std::string redisHosts("127.0.0.1");
 | 
					    std::string redisHosts("127.0.0.1");
 | 
				
			||||||
    std::string redisPassword;
 | 
					    std::string redisPassword;
 | 
				
			||||||
@@ -264,6 +265,7 @@ int main(int argc, char** argv)
 | 
				
			|||||||
    cobra2statsd->add_option("--port", statsdPort, "Statsd port");
 | 
					    cobra2statsd->add_option("--port", statsdPort, "Statsd port");
 | 
				
			||||||
    cobra2statsd->add_option("--prefix", prefix, "Statsd prefix");
 | 
					    cobra2statsd->add_option("--prefix", prefix, "Statsd prefix");
 | 
				
			||||||
    cobra2statsd->add_option("--fields", fields, "Extract fields for naming the event")->join();
 | 
					    cobra2statsd->add_option("--fields", fields, "Extract fields for naming the event")->join();
 | 
				
			||||||
 | 
					    cobra2statsd->add_option("--gauge", gauge, "Value to extract, and use as a statsd gauge")->join();
 | 
				
			||||||
    cobra2statsd->add_option("channel", channel, "Channel")->required();
 | 
					    cobra2statsd->add_option("channel", channel, "Channel")->required();
 | 
				
			||||||
    cobra2statsd->add_flag("-v", verbose, "Verbose");
 | 
					    cobra2statsd->add_flag("-v", verbose, "Verbose");
 | 
				
			||||||
    cobra2statsd->add_option("--pidfile", pidfile, "Pid file");
 | 
					    cobra2statsd->add_option("--pidfile", pidfile, "Pid file");
 | 
				
			||||||
@@ -463,6 +465,7 @@ int main(int argc, char** argv)
 | 
				
			|||||||
                                      position,
 | 
					                                      position,
 | 
				
			||||||
                                      statsdClient,
 | 
					                                      statsdClient,
 | 
				
			||||||
                                      fields,
 | 
					                                      fields,
 | 
				
			||||||
 | 
					                                      gauge,
 | 
				
			||||||
                                      verbose,
 | 
					                                      verbose,
 | 
				
			||||||
                                      maxQueueSize,
 | 
					                                      maxQueueSize,
 | 
				
			||||||
                                      enableHeartbeat,
 | 
					                                      enableHeartbeat,
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user