/**
* Tencent is pleased to support the open source community by making MSEC available.
*
* Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the GNU General Public 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
*
* https://opensource.org/licenses/GPL-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.
*/
package beans.service;
import beans.dbaccess.OddSecondLevelServiceIPInfo;
import beans.request.Alarm;
import beans.response.AlarmResponse;
import beans.response.OneAlarm;
import ngse.monitor.Monitor;
import ngse.org.DBUtil;
import ngse.org.JsonRPCHandler;
import ngse.org.Tools;
import org.apache.log4j.Logger;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.ArrayList;
/**
* Created by Administrator on 2016/4/27.
*/
public class QueryAlarmSetting extends JsonRPCHandler {
static private String monitor_server_ip = "192.168.40.41";
static private int monitor_server_port = 3344;
static public void initMonitorIPAndPort() throws Exception
{
DBUtil util = new DBUtil();
Logger logger = Logger.getLogger(MonitorBySvcOrIP.class);
try
{
if (util.getConnection() == null)
{
Exception e = new Exception("connect db failed.");
throw e ;
}
String sql =sql = "select ip,port from t_second_level_service_ipinfo where second_level_service_name='monitor' and first_level_service_name='RESERVED'";
ArrayList<OddSecondLevelServiceIPInfo> list = util.findMoreRefResult(sql, null, OddSecondLevelServiceIPInfo.class);
if (list == null || list.size() < 1)
{
throw new Exception( "no db record exists.");
}
monitor_server_ip = list.get(0).getIp();
monitor_server_port = list.get(0).getPort().intValue()+1;//为什么加1,是个很长的故事,源于monitor的开发者将读写分离成两个端口
logger.info(String.format("monitor server:%s:%d", monitor_server_ip, monitor_server_port) );
}
finally {
util.releaseConn();
}
}
static public ArrayList<OneAlarm> getAlarmSettingList(String svc) throws Exception
{
Logger logger = Logger.getLogger(QueryAlarmSetting.class);
Socket sock = new Socket();
ArrayList<String> ret = new ArrayList<String>();
try {
sock.setSoTimeout(2000);
sock.connect(new InetSocketAddress(monitor_server_ip, monitor_server_port), 3000);
OutputStream out = sock.getOutputStream();
//发送请求
//获取指定svc下的所有ip
//组包
Monitor.ReqService.Builder b = Monitor.ReqService.newBuilder();
b.setServicename(svc);
Monitor.ReqService reqService = b.build();
Monitor.ReqMonitor.Builder bb = Monitor.ReqMonitor.newBuilder();
bb.setService(reqService);
Monitor.ReqMonitor req = bb.build();
//发送长度信息
byte[] lenB = Tools.int2Bytes(req.getSerializedSize()+4);
out.write(lenB);
//发送实际的pb请求
req.writeTo(out);
logger.info("send request to monitor.");
//接收应答
InputStream in = sock.getInputStream();
byte[] buf = new byte[1024*1024];
int totalLen = 4;
int totalReceived = 0;
while (totalReceived < totalLen) {
int len = in.read(buf, totalReceived, totalLen - totalReceived);
if (len <= 0) {
throw new Exception("monitor server应答无效.");
}
totalReceived += len;
}
totalLen = Tools.bytes2int(buf);
logger.info("monitor server response length:"+totalLen);
if (totalLen < 4 || totalLen > buf.length) {
throw new Exception("monitor server应答无效.");
}
totalLen -= 4;
totalReceived = 0;
buf = new byte[totalLen];
while (totalReceived < totalLen) {
int len = in.read(buf, totalReceived, totalLen - totalReceived);
if (len <= 0) {
throw new Exception("monitor server应答无效.");
}
totalReceived += len;
}
logger.info("received monitor server response successfully.");
Monitor.RespMonitor monitor = Monitor.RespMonitor.parseFrom(buf);
if (monitor.getResult() != 0) {
logger.error("monitor server returns errcode:"+monitor.getResult());
throw new Exception("monitor server应答失败.");
}
Monitor.RespService resp = monitor.getService();
ArrayList<OneAlarm> alarmList = new ArrayList<OneAlarm>();
logger.info("monitor returns alarm number:"+resp.getAlarmattrsCount());
for (int i = 0; i < resp.getAlarmattrsCount(); ++i) {
if (resp.getAlarmattrs(i).getMax() > 0) {
OneAlarm alarm = new OneAlarm();
alarm.setAttribute_name(resp.getAlarmattrs(i).getAttrname());
alarm.setService_name(svc);
alarm.setAlarm_type(Monitor.AlarmType.ALARM_MAX.getNumber());
alarm.setThreshold(resp.getAlarmattrs(i).getMax());
alarmList.add(alarm);
}
if (resp.getAlarmattrs(i).getMin() > 0) {
OneAlarm alarm = new OneAlarm();
alarm.setAttribute_name(resp.getAlarmattrs(i).getAttrname());
alarm.setService_name(svc);
alarm.setAlarm_type(Monitor.AlarmType.ALARM_MIN.getNumber());
alarm.setThreshold(resp.getAlarmattrs(i).getMin());
alarmList.add(alarm);
}
if (resp.getAlarmattrs(i).getDiff() > 0) {
OneAlarm alarm = new OneAlarm();
alarm.setAttribute_name(resp.getAlarmattrs(i).getAttrname());
alarm.setService_name(svc);
alarm.setAlarm_type(Monitor.AlarmType.ALARM_DIFF.getNumber());
alarm.setThreshold(resp.getAlarmattrs(i).getDiff());
alarmList.add(alarm);
}
if (resp.getAlarmattrs(i).getDiffPercent() > 0) {
OneAlarm alarm = new OneAlarm();
alarm.setAttribute_name(resp.getAlarmattrs(i).getAttrname());
alarm.setService_name(svc);
alarm.setAlarm_type(Monitor.AlarmType.ALARM_DIFF_PERCENT.getNumber());
alarm.setThreshold(resp.getAlarmattrs(i).getDiffPercent());
alarmList.add(alarm);
}
}
return alarmList;
} finally {
if (sock != null && sock.isConnected()) {
try {
sock.close();
} catch (Exception e) {
}
}
}
}
public AlarmResponse exec(Alarm request)
{
AlarmResponse response = new AlarmResponse();
Logger logger = Logger.getLogger(QueryAlarmSetting.class);
String svc = "";
String date = "";
String result;
svc = request.getService_name();
date = request.getDate();
if ( svc == null || svc.length() == 0)
{
response.setMessage("service name should NOT be empty!");
response.setStatus(100);
return response;
}
try {
initMonitorIPAndPort();
ArrayList<OneAlarm> alarmList = getAlarmSettingList(svc);
response.setAlarm_list(alarmList);
}
catch (Exception e)
{
response.setMessage(e.getMessage());
response.setStatus(100);
return response;
}
response.setMessage("success");
response.setStatus(0);
return response;
}
}