provider/monitor/AppMonitor.php (83 lines of code) (raw):

<?php /** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ namespace com\fenqile\fsof\provider\monitor; use com\fenqile\fsof\common\protocol\fsof\DubboRequest; class AppMonitor { const APP_START_TIME = 'app_start_time'; const APP_RELOAD_TIME = 'app_reload_time'; const CUR_CONNECT_NUM = 'cur_connect_num'; const CUR_HANDLE_NUM = 'cur_handle_num'; const CUR_WAIT_NUM = 'cur_wait_num'; protected $appMonitorTable; protected $appName; protected $appConfig; protected $curEnv; protected $swooleServer; protected $serviceMonitor; public function __construct($appName, $appConfig) { $this->appName = $appName; $this->appConfig = $appConfig; $this->curEnv = $appConfig['fsof_setting']['environment']; $this->serviceMonitor = new ServiceMonitor($this->appName, $this->appConfig); $this->appMonitorTable = new \swoole_table(8); $this->appMonitorTable->column(self::APP_START_TIME, \swoole_table::TYPE_STRING, 32); $this->appMonitorTable->column(self::APP_RELOAD_TIME, \swoole_table::TYPE_STRING, 32); $this->appMonitorTable->column(self::CUR_HANDLE_NUM, \swoole_table::TYPE_INT, 8); $this->appMonitorTable->create(); $this->reset(); } public function setServer($swooleServer) { $this->serviceMonitor->setServer($swooleServer); $this->swooleServer = $swooleServer; } public function reset() { $this->appMonitorTable->set($this->appName, array(self::CUR_HANDLE_NUM => 0)); } public function uploadMonitorData() { $data = $this->appMonitorTable->get($this->appName); $stats = $this->swooleServer->stats(); // 增加当前排队的任务数,更改当前连接的数目,今天连接的总数更新为服务启动以前连接的总数 $msg = sprintf("%s|%s|%s|%d|%s|%s|%d|%d|%d", date('Y-m-d H:i:s'), $this->appName, $this->curEnv, $this->appConfig['server']['listen'][0], $data[self::APP_START_TIME], $data[self::APP_RELOAD_TIME], $stats['connection_num'], $data[self::CUR_HANDLE_NUM], $stats['tasking_num']); \Logger::getLogger(__CLASS__)->info($msg); $this->reset(); $this->serviceMonitor->uploadMonitorData(); } public function onAppStart() { $startTime = date('Y-m-d H:i:s'); $this->appMonitorTable->set($this->appName, array(self::APP_START_TIME => $startTime)); } public function onAppReload() { $reloadTime = date('Y-m-d H:i:s'); $this->appMonitorTable->set($this->appName, array(self::APP_RELOAD_TIME => $reloadTime)); } public function onRequest(DubboRequest $request) { $this->appMonitorTable->incr($this->appName,self::CUR_HANDLE_NUM); $this->serviceMonitor->onRequest($request); } public function onResponse(DubboRequest $request) { $this->appMonitorTable->decr($this->appName,self::CUR_HANDLE_NUM); $this->serviceMonitor->onResponse($request); } public function onError(DubboRequest $request) { $this->appMonitorTable->decr($this->appName,self::CUR_HANDLE_NUM); $this->serviceMonitor->onResponse($request); $this->serviceMonitor->onError($request); } }