/**
* 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.response.OneAttrChart;
import msec.monitor.Monitor;
import msec.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.*;
/**
* Created by Administrator on 2016/7/11.
*/
public class ServiceList {
static public void getServiceList(List<String> flsn, Map<String, List<String>> slsn) throws Exception
{
Socket sock = new Socket();
Logger logger = Logger.getLogger(ServiceList.class);
logger.info("begin to get attr value...");
try {
TreeMap<String, OneAttrChart> ret = new TreeMap<String, OneAttrChart>();
sock.setSoTimeout(5000);
sock.connect(new InetSocketAddress(MonitorBySvcOrIP.monitor_server_ip, MonitorBySvcOrIP.monitor_server_port), 3000);
OutputStream out = sock.getOutputStream();
Monitor.ReqTreeList.Builder b = Monitor.ReqTreeList.newBuilder();
Monitor.ReqMonitor.Builder bb = Monitor.ReqMonitor.newBuilder();
bb.setTreelist(b.build());
Monitor.ReqMonitor req = bb.build();
//���ͳ�����Ϣ
byte[] lenField = Tools.int2Bytes(req.getSerializedSize() + 4);
out.write(lenField);
//����ʵ�ʵ�pb����
req.writeTo(out);
//����Ӧ��
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) {
logger.error(String.format("read len field failed:%d", len));
throw new Exception("reading len field failed");
}
totalReceived += len;
}
totalLen = Tools.bytes2int(buf);
logger.info("monitor server response size:" + totalLen);
if (totalLen < 4 || totalLen > buf.length) {
logger.error(String.format("totalLen invalid:%d", totalLen));
throw new Exception("response totalLen is invalid");
}
totalLen -= 4;
totalReceived = 0;
buf = new byte[totalLen];
while (totalReceived < totalLen) {
int len = in.read(buf, totalReceived, totalLen - totalReceived);
if (len <= 0) {
logger.error(String.format("read response body failed:%d", len));
throw new Exception("reading response body failed!");
}
totalReceived += len;
}
Monitor.RespMonitor monitor = Monitor.RespMonitor.parseFrom(buf);
if (monitor.getResult() != 0) {
logger.error("monitor returns error code:" + monitor.getResult());
throw new Exception("monitor returns error code " + monitor.getResult());
}
Monitor.RespTreeList treeList = monitor.getTreelist();
for (int i = 0; i < treeList.getInfosCount(); i++) {
Monitor.TreeListInfo info = treeList.getInfos(i);
String svcname = info.getServicename();
int pos = svcname.indexOf(".");
String first_level = ".unnamed";
String second_level = svcname;
if (pos > 0 && pos < (svcname.length() - 1)) {
first_level = svcname.substring(0, pos);
second_level = svcname.substring(pos + 1);
}
if (slsn.get(first_level) == null) {
slsn.put(first_level, new ArrayList<String>());
slsn.get(first_level).add(second_level);
flsn.add(first_level);
}
else
{
slsn.get(first_level).add(second_level);
}
}
Collections.sort(flsn);
for (int i = 0; i < flsn.size() ; i++) {
List<String> second_level = slsn.get(flsn.get(i));
Collections.sort(second_level);
}
}
finally {
sock.close();
}
}
}