def _listenhandler(self):
        try:
            sock = self.listen
            # client_socket
            client_socket, address = sock.accept()
            client_socket.setblocking(False)
            # sock = gsocket(_socket = client_socket)
        except asy_socket.error as error:
            TCLogger.warning("accept:%s", error)
            return

        TCLogger.info("new connect fd:%s ", client_socket.fileno())
        client_in_event = self.loop.io(client_socket.fileno(), 1)
        client_out_event = self.loop.io(client_socket.fileno(), 2)

        client = self.Client(client_socket, client_in_event, client_out_event)

        client_in_event.start(self.handleClientRead, client)

        ## say hello

        if self.say_hello_cb is not None:
            self.say_hello_cb(client)

        ## (socket,read_cv,write_cb)
        self.clients[client_socket.fileno()] = client
예제 #2
0
 def sendData(self, data):
     try:
         self.__socket.send(data)
     except  asy_socket.error as e:
         if e.errno in (errno.EINPROGRESS, errno.EWOULDBLOCK):
             pass
         else:
             TCLogger.warning("connect:%s error:%s" % (self.remote, str(e)))
 def start(self):
     try:
         ## start
         self._connectPeerWithHello(self.remote)
     except Timeout as t:
         TCLogger.warning("remote:%s time out state:%d", str(self.remote),
                          self.state)
         self.close()
예제 #4
0
 def _generator_PstatMessage(self):
     try:
         while self.task_running:
             ps = PStatMessage(agentStat=self._generAgentStat())
             TCLogger.debug(ps)
             yield ps
             time.sleep(STAT_INTERVAL)
     except Exception as e:
         TCLogger.warning("_generator_PstatMessage catch %s", e)
예제 #5
0
 def run(self):
     while True:
         try:
             gevent.sleep(10)
         except:
             break
     # break by a signal
     self.app_management.stopAll()
     self.php_agent.stop()
     TCLogger.warning("collector agent exit with SIGNAL")
예제 #6
0
 def _pingPPing(self):
     while self.task_running:
         ping = PPing()
         TCLogger.debug("%s send ping", self)
         yield ping
         with self.exit_cv:
             if not self.task_running or self.exit_cv.wait(
                     self.timeout * 10):
                 TCLogger.warning("generate ping exit")
                 break
예제 #7
0
 def _stat_thread_main(self):
     self.task_running = True
     while self.task_running:
         try:
             self.meta_stub.SendAgentStat(self._generator_PstatMessage())
         except Exception as e:
             TCLogger.warning("SendAgentStat met:%s", e)
         with self.exit_cv:
             if self.exit_cv.wait(self.timeout):
                 break
예제 #8
0
 def start(self):
     self.__socket = asy_socket.socket(asy_socket.AF_INET,asy_socket.SOCK_DGRAM)
     self.__socket.setblocking(False)
     try:
         self.state = E_CONNECTED
         self.__socket.connect(self.remote)
     except  asy_socket.error as e:
         if not (e.errno in (errno.EINPROGRESS, errno.EWOULDBLOCK)):
             TCLogger.warning("connect:%s error:%s" % (self.remote, str(e)))
             self.__socket.close()
             raise Exception("create DgramLayer failed")
 def close(self):
     TCLogger.warning("close connection (%s)", str(self.remote))
     self._read_watcher.stop()
     self._write_watcher.stop()
     self.timer.stop()
     self.socket.close()
     self.state = E_CLOSED
     ## reset send buffer
     self.send_buf = b''
     self.timer = self.loop.timer(self.timeout)
     self.timer.start(self._connectPeerWithHello, self.remote)
예제 #10
0
        def sendSpan(self, spanMesg):

            try:
                self.span_queue.put(spanMesg, False)
            except Full as e:
                self.dropped_span_count += 1
                TCLogger.warning("span send queue is full")
                return False
            except Exception as e:
                TCLogger.error("send span failed: %s", e)
                return False
            return True
예제 #11
0
    def findApp(self, app_id, app_name, service_type):
        if app_id in self.app_map:
            app = self.app_map[app_id]
            ## check app_name
            if app.app_name != app_name:
                TCLogger.warning(" app_name can't change when using ")
                app = self.default_app
            ## check service_type

        else:
            TCLogger.info("collector-agent try to create a new application agent.[%s@%s@%d]",app_id,app_name,service_type)
            app = self.collector_conf.collector_implement(self.collector_conf, app_id, app_name,service_type)
            app.start()
            self.app_map[app_id] = app
        return app
예제 #12
0
 def _recvFromPeer(self):
     recv_buf = self.pRBufStart[self.rest_data_sz:]
     recv_total = self.rest_data_sz
     assert recv_total < self.RECV_BUF_SIZE
     try:
         recv_total = self.socket.recv_into(
             recv_buf, self.RECV_BUF_SIZE - recv_total)
         if recv_total == 0:
             TCLogger.warning("peer close socket")
             return -1
     except asy_socket.error as error:
         if error.errno in [asy_socket.EAGAIN, asy_socket.EWOULDBLOCK]:
             return 0
         TCLogger.warning("peer error:%s ", error)
         return -1
     return recv_total + self.rest_data_sz
예제 #13
0
 def _recvFromPeer(self):
     recv_buf = self.pRBufStart[self.rest_data_sz:]
     recv_total = self.rest_data_sz
     assert recv_total < self.RECV_BUF_SIZE
     try:
         recv_total = self.socket.recv_into(recv_buf,
                                            self.RECV_BUF_SIZE - recv_total)
         if recv_total == 0:
             TCLogger.warning("peer: [%s:%d] closed", self.peer[0],
                              self.peer[1])
             return -1
     except asy_socket.error as error:
         if error.errno in [errno.EAGAIN]:
             return 0
         TCLogger.warning("peer error:%s ", error)
         return -1
     return recv_total
예제 #14
0
    def handleClientRead(self, client):
        '''

        :param self.Client client:
        :return:
        '''
        while True:
            len = client.recv(self.in_msg_cb)
            if len > 0:  ## read again
                continue
            if len < 0:
                TCLogger.warning(" client:%d disconnected",
                                 client.socket.fileno())
                fd = client.socket.fileno()
                client.close()
                del self.clients[fd]
            break
예제 #15
0
        def recv(self, in_msg_cb):
            '''

            :param self.Client client:
            :return: if rLen < 0 error happens
            '''
            rLen = self._recvFromPeer()
            if rLen > 0:
                self.rest_data_sz = in_msg_cb(self, self.pRBufStart, rLen)
                if self.rest_data_sz >= self.RECV_BUF_SIZE:
                    TCLogger.warning("data from peer is overflow size=%d",
                                     self.rest_data_sz)
                    return -1
                if self.rest_data_sz > 0:
                    self.pRBufStart[0:self.rest_data_sz] = self.pRBufStart[
                        rLen - self.rest_data_sz:rLen]
            return rLen
예제 #16
0
 def _connectPeerAsy(self, addr, time):
     self.socket = asy_socket.socket(asy_socket.AF_INET,
                                     asy_socket.SOCK_STREAM)
     self.socket.setblocking(False)
     self._read_watcher = self.loop.io(self.socket.fileno(), 1)
     self._write_watcher = self.loop.io(self.socket.fileno(), 2)
     try:
         self.state = E_CONNETING
         self.socket.connect(addr)
     except asy_socket.error as e:
         if not (e.errno in (errno.EINPROGRESS, errno.EWOULDBLOCK)):
             TCLogger.warning("connect:%s error:%s" % (addr, str(e)))
             self.close()
             return False
     self.timer = self.loop.timer(self.timeout)
     self.timer.start(self._actionTimeOut, time)
     self._write_watcher.start(self._connected, addr)
     return True
예제 #17
0
 def generator_cmd():
     i = 0
     while self.task_running:
         try:
             cmd_response = PCmdStreamResponse(responseId=requestId,
                                               sequenceId=i)
             cmd_response.message.value = 'hello'
             threadCountRes = PCmdActiveThreadCountRes(
                 commonStreamResponse=cmd_response)
             threadCountRes.histogramSchemaType = 2
             for stat in self.get_req_stat():
                 threadCountRes.activeThreadCount.append(stat)
             threadCountRes.timeStamp = int(time.time())
             i += 1
             yield threadCountRes
             ## it's a templated task, don't use exit_cv
             time.sleep(1)
         except Exception as e:
             TCLogger.warning("catch exception %s", e)
             break
예제 #18
0
    def handleFrontAgentData(self, client, type, body):
        content = body.decode('utf-8')
        try:
            TCLogger.debug(content)
            stack = json.loads(content)
        except Exception as e:
            TCLogger.error("json is crash")
            return
        if 'appid' not in stack:
            TCLogger.warning(" drop %s, as no appid", content)
            return
        else:
            appid = stack['appid']

        if 'appname' not in stack:
            TCLogger.warning(" drop %s, as no appname", content)
            return
        else:
            appname = stack['appname']

        if 'FT' not in stack:
            TCLogger.warning(" drop %s, as no FT", content)
            return
        else:
            ft = stack['FT']

        app = self.findApp(appid, appname, ft)
        app.asynSendSpan(stack, body)
        self.recv_count += 1
예제 #19
0
        def generator_cmd():
            i = 0
            while True:
                try:
                    cmd_response = PCmdStreamResponse(responseId=requestId,
                                                      sequenceId=i)
                    cmd_response.message.value = 'hello'
                    threadCountRes = PCmdActiveThreadCountRes(
                        commonStreamResponse=cmd_response)
                    threadCountRes.histogramSchemaType = 2
                    for stat in self.get_req_stat():
                        threadCountRes.activeThreadCount.append(stat)
                    threadCountRes.timeStamp = int(time.time())
                    i += 1
                    yield threadCountRes

                    with self.exit_cv:
                        if self.exit_cv.wait(1):
                            break
                except Exception as e:
                    TCLogger.warning("catch exception %s", e)
                    break
예제 #20
0
    def _registerAllMeta(self, sec):
        TCLogger.info("register all meta data")

        while self.snd_task_is_running:
            try:
                for key, value in self.sql_table.items():
                    self.meta_stub.RequestSqlMetaData(value[1])
                # api
                for key, value in self.api_table.items():
                    self.meta_stub.RequestApiMetaData(value[1])

                # string
                for key, value in self.string_table.items():
                    self.meta_stub.RequestStringMetaData(value[1])
                self.snd_task_is_running = False
                TCLogger.info("send all meta data is done")
                break
            except Exception as e:
                TCLogger.warning("re-send all meta data, met exception:%s", e)
                with self.exit_cv:
                    if not self.snd_task_is_running or self.exit_cv.wait(sec):
                        break
예제 #21
0
    def findApp(self, app_id, app_name, service_type):
        if app_id in self.app_map:
            app = self.app_map[app_id]
            ## check app_name
            if app.app_name != app_name:
                TCLogger.warning(" app_name can't change when using ")
                app = self.default_app
            ## check service_type

        else:
            if service_type == PHP:
                TCLogger.info(
                    "collector-agent try to create a new application agent.[%s@%s]",
                    app_id, app_name)
                app = self.collector_conf.collector_implement(
                    self.collector_conf, app_id, app_name)
                app.start()
                self.app_map[app_id] = app
            else:
                raise NotImplementedError("service_type:%d not support",
                                          service_type)

        return app
예제 #22
0
 def _response(self, future):
     if future.exception():
         TCLogger.warning("register meta failed %s", future.exception)
         return
     self.must_snd_meta_now = False