UniSet  2.6.0
LogSession.h
00001 /*
00002  * Copyright (c) 2015 Pavel Vainerman.
00003  *
00004  * This program is free software: you can redistribute it and/or modify
00005  * it under the terms of the GNU Lesser General Public License as
00006  * published by the Free Software Foundation, version 2.1.
00007  *
00008  * This program is distributed in the hope that it will be useful, but
00009  * WITHOUT ANY WARRANTY; without even the implied warranty of
00010  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
00011  * Lesser General Lesser Public License for more details.
00012  *
00013  * You should have received a copy of the GNU Lesser General Public License
00014  * along with this program. If not, see <http://www.gnu.org/licenses/>.
00015  */
00016 // -------------------------------------------------------------------------
00017 #ifndef LogSession_H_
00018 #define LogSession_H_
00019 // -------------------------------------------------------------------------
00020 #include <string>
00021 #include <memory>
00022 #include <queue>
00023 #include <ev++.h>
00024 #include "Poco/Net/StreamSocket.h"
00025 #include "Mutex.h"
00026 #include "DebugStream.h"
00027 #include "UTCPCore.h"
00028 #include "UTCPStream.h"
00029 #include "LogAgregator.h"
00030 #ifndef DISABLE_REST_API
00031 #include <Poco/JSON/Object.h>
00032 #endif
00033 // -------------------------------------------------------------------------
00034 namespace uniset
00035 {
00036 
00038 class LogSession
00039 {
00040     public:
00041 
00042         LogSession( const Poco::Net::StreamSocket& s, std::shared_ptr<DebugStream>& log, timeout_t cmdTimeout = 2000, timeout_t checkConnectionTime = 10000 );
00043         ~LogSession();
00044 
00045         typedef sigc::slot<void, LogSession*> FinalSlot;
00046         void connectFinalSession( FinalSlot sl ) noexcept;
00047 
00048         // сигнал о приходе команды: std::string func( LogSession*, command, logname );
00049         // \return какую-то информацию, которая будет послана client-у. Если return.empty(), то ничего послано не будет.
00050         typedef sigc::signal<std::string, LogSession*, LogServerTypes::Command, const std::string& > LogSessionCommand_Signal;
00051         LogSessionCommand_Signal signal_logsession_command();
00052 
00053         // прервать работу
00054         void cancel() noexcept;
00055 
00056         inline std::string getClientAddress() const noexcept
00057         {
00058             return caddr;
00059         }
00060 
00061         inline void setSessionLogLevel( Debug::type t ) noexcept
00062         {
00063             mylog.level(t);
00064         }
00065         inline void addSessionLogLevel( Debug::type t ) noexcept
00066         {
00067             mylog.addLevel(t);
00068         }
00069         inline void delSessionLogLevel( Debug::type t ) noexcept
00070         {
00071             mylog.delLevel(t);
00072         }
00073 
00075         void setMaxBufSize( size_t num );
00076         size_t getMaxBufSize() const noexcept;
00077 
00078         // запуск обработки входящих запросов
00079         void run( const ev::loop_ref& loop ) noexcept;
00080         void terminate();
00081 
00082         bool isAcive() const noexcept;
00083 
00084         std::string name() const noexcept;
00085 
00086         std::string getShortInfo() noexcept;
00087 
00088 #ifndef DISABLE_REST_API
00089         Poco::JSON::Object::Ptr httpGetShortInfo();
00090 #endif
00091 
00092     protected:
00093         //      LogSession( ost::TCPSocket& server );
00094 
00095         void event( ev::async& watcher, int revents ) noexcept;
00096         void callback( ev::io& watcher, int revents ) noexcept;
00097         void readEvent( ev::io& watcher ) noexcept;
00098         void writeEvent( ev::io& watcher );
00099         size_t readData( unsigned char* buf, int len );
00100         void cmdProcessing( const std::string& cmdLogName, const LogServerTypes::lsMessage& msg );
00101         void onCmdTimeout( ev::timer& watcher, int revents ) noexcept;
00102         void onCheckConnectionTimer( ev::timer& watcher, int revents ) noexcept;
00103         void final() noexcept;
00104 
00105         void logOnEvent( const std::string& s ) noexcept;
00106 
00107         timeout_t cmdTimeout = { 2000 };
00108         float checkConnectionTime = { 10. }; // время на проверку живости соединения..(сек)
00109 
00110         // Т.к. сообщений может быть ОЧЕНЬ МНОГО.. сеть медленная
00111         // очередь будет не успевать рассасываться,
00112         // то потенциально может "скушаться" вся память.
00113         // Поэтому приходиться ограничить доступное количество записей.
00114         // Рассчитываем, что средний размер одного сообщения 150 символов (байт)
00115         // тогда выделяем буфер на 200 сообщений (~ 30кB)
00116         // На самом деле сообщения могут быть совершенно разные..
00117         size_t maxRecordsNum = { 30000 }; // максимальное количество сообщение в очереди
00118 
00119     private:
00120         std::queue<UTCPCore::Buffer*> logbuf;
00121         std::mutex logbuf_mutex;
00122         bool lostMsg = { false };
00123 
00124         // статистика по использованию буфера
00125         size_t maxCount = { 0 }; // максимальное количество побывавшее в очереди
00126         size_t minSizeMsg = { 0 }; // минимальная встретившаяся длинна сообщения
00127         size_t maxSizeMsg = { 0 }; // максимальная встретившаяся длинна сообщения
00128         size_t numLostMsg = { 0 }; // количество потерянных сообщений
00129 
00130         std::string peername = { "" };
00131         std::string caddr = { "" };
00132         std::shared_ptr<DebugStream> log;
00133         std::shared_ptr<LogAgregator> alog;
00134         sigc::connection conn;
00135 
00136         std::shared_ptr<UTCPStream> sock;
00137 
00138         ev::io  io;
00139         ev::timer  cmdTimer;
00140         ev::async  asyncEvent;
00141         ev::timer  checkConnectionTimer;
00142 
00143         FinalSlot slFin;
00144         std::atomic_bool cancelled = { false };
00145 
00146         LogSessionCommand_Signal m_command_sig;
00147 
00148         DebugStream mylog;
00149 };
00150 // -------------------------------------------------------------------------
00151 } // end of uniset namespace
00152 // -------------------------------------------------------------------------
00153 #endif // LogSession_H_
00154 // -------------------------------------------------------------------------