72 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  *  ws_cobra_publish.cpp
 | |
|  *  Author: Benjamin Sergeant
 | |
|  *  Copyright (c) 2019 Machine Zone, Inc. All rights reserved.
 | |
|  */
 | |
| 
 | |
| #include <iostream>
 | |
| #include <fstream>
 | |
| #include <sstream>
 | |
| #include <chrono>
 | |
| #include <thread>
 | |
| #include <atomic>
 | |
| #include <jsoncpp/json/json.h>
 | |
| #include <ixcobra/IXCobraMetricsPublisher.h>
 | |
| 
 | |
| namespace ix
 | |
| {
 | |
|     int ws_cobra_publish_main(const std::string& appkey,
 | |
|                               const std::string& endpoint,
 | |
|                               const std::string& rolename,
 | |
|                               const std::string& rolesecret,
 | |
|                               const std::string& channel,
 | |
|                               const std::string& path,
 | |
|                               bool stress)
 | |
|     {
 | |
|         CobraMetricsPublisher cobraMetricsPublisher;
 | |
|         cobraMetricsPublisher.enable(true);
 | |
| 
 | |
|         bool enablePerMessageDeflate = true;
 | |
|         cobraMetricsPublisher.configure(appkey, endpoint, channel,
 | |
|                                         rolename, rolesecret, enablePerMessageDeflate);
 | |
| 
 | |
|         while (!cobraMetricsPublisher.isAuthenticated()) ;
 | |
| 
 | |
|         std::ifstream f(path);
 | |
|         std::string str((std::istreambuf_iterator<char>(f)),
 | |
|                          std::istreambuf_iterator<char>());
 | |
| 
 | |
|         Json::Value data;
 | |
|         Json::Reader reader;
 | |
|         if (!reader.parse(str, data)) return 1;
 | |
| 
 | |
|         if (!stress)
 | |
|         {
 | |
|             cobraMetricsPublisher.push(channel, data);
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             // Stress mode to try to trigger server and client bugs
 | |
|             while (true)
 | |
|             {
 | |
|                 for (int i = 0 ; i < 1000; ++i)
 | |
|                 {
 | |
|                     cobraMetricsPublisher.push(channel, data);
 | |
|                 }
 | |
| 
 | |
|                 cobraMetricsPublisher.suspend();
 | |
|                 cobraMetricsPublisher.resume();
 | |
| 
 | |
|                 // FIXME: investigate why without this check we trigger a lock
 | |
|                 while (!cobraMetricsPublisher.isAuthenticated()) ;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // Wait a bit for the message to get a chance to be sent
 | |
|         // there isn't any ack on publish right now so it's the best we can do
 | |
|         std::this_thread::sleep_for(std::chrono::milliseconds(100));
 | |
| 
 | |
|         return 0;
 | |
|     }
 | |
| }
 |