Jsp独立实现聚合监控接口
Jsp封装各个业务运行项目的监控接口,独立提供一个聚合的监控服务
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.nio.charset.*"%>
<%@ page import="java.util.*"%>
<%@ page import="java.text.*"%>
<%@ page import="java.net.*"%>
<%@ page import="java.io.*"%>
<%!
/**
* get或者post,整个工具类调用的都是这个方法,之所以设置成private是因为参数太多,不推荐直接使用
*
* @param type 请求方式,只能是GET或者POST
* @param url 请求URL
* @param encoding 编码,默认utf-8
* @param contentType 内容类型,post时才生效
* @param params post时的参数,格式形如:a=1&b=2
* @param request 仅仅是获取基路径时用到
* @return 服务器响应的数据
*/
private String getOrPost(String type, String url, String encoding, String contentType, String params,
HttpServletRequest request) throws Exception {
encoding = encoding == null ? "utf-8" : encoding; // 默认utf-8编码
contentType = contentType == null ? "application/x-www-form-urlencoded" : contentType;
// 如果不是以http等开头,说明是相对路径,url只需要从项目名称之后开始,并且不需要前面的“/”
if (!url.startsWith("http://") && !url.startsWith("https://") && request != null) {
return "failed";
}
// 如果是GET方式,并且参数不为空,拼接URL
if ("GET".equals(type) && (params != null && !"".equals(params))) {
if (!url.contains("?"))
url = url + "?" + params;
else
url = url + "&" + params;
}
HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
con.setRequestMethod(type);
con.setUseCaches(false);
con.setInstanceFollowRedirects(true);
// 设置UA,这个可以不设置
con.setRequestProperty("user-agent",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31");
con.setRequestProperty("accept", "*/*"); // 这个可以不设置
if ("POST".equals(type)) {
con.setDoOutput(true);
con.setDoInput(true);
con.setRequestProperty("Content-Type", contentType); // 设置ContentType
}
con.connect(); // 连接
if ("POST".equals(type)) {
OutputStreamWriter out = new OutputStreamWriter(con.getOutputStream(), encoding); // 这个地方编码设置好像不重要
out.write(params);
out.flush();
out.close();
}
int responseCode = con.getResponseCode();
// 读取响应
BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), Charset.forName(encoding)));
String str;
StringBuffer sb = new StringBuffer("");
while ((str = br.readLine()) != null) {
sb.append(str);
}
br.close();
con.disconnect(); // 断开连接
return sb.toString();
}
/**
* 不依赖任何第三方jar包的模拟post方法
*
* @param url 请求的地址
* @param params 参数
* @param request 仅仅是获取基路径时用到
* @return 响应字符串
*/
public String post(String url, String encoding, String contentType, String params, HttpServletRequest request) {
try {
return getOrPost("POST", url, encoding, contentType, params, request);
} catch (Exception e) {
System.out.println("请求错误:" + e.toString());
return "";
}
}
/**
* 不依赖任何第三方jar包的模拟post方法
*
* @param url 请求的地址
* @param params 参数
* @return 响应字符串
*/
public String post(String url, String params) {
return post(url, null, null, params, null);
}
/**
* 不依赖任何第三方jar包的模拟get方法
*
* @param url 请求的地址
* @param params 参数
* @param request 仅仅是获取基路径时用到
* @return 响应字符串
*/
public String get(String url, String encoding, String contentType, String params, HttpServletRequest request) {
try {
return getOrPost("GET", url, encoding, contentType, params, request);
} catch (Exception e) {
System.out.println("请求错误:" + e.toString());
return "";
}
}
/**
* 不依赖任何第三方jar包的模拟get方法
*
* @param url 请求的地址
* @param params 参数
* @return 响应字符串
*/
public String get(String url, String params) {
return get(url, null, null, params, null);
}
/**
* 获取get请求响应码
*
* @param url 请求的地址
* @return 响应码
*/
public int getResponseCode(String url, HttpServletRequest request) throws Exception {
// 如果不是以http等开头,说明是相对路径,url只需要从项目名称之后开始,并且不需要前面的“/”
if (!url.startsWith("http://") && !url.startsWith("https://") && request != null) {
return -1;
}
HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
con.setRequestMethod("GET");
con.setUseCaches(false);
con.setInstanceFollowRedirects(true);
// 设置UA,这个可以不设置
con.setRequestProperty("user-agent",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31");
con.setRequestProperty("accept", "*/*"); // 这个可以不设置
con.connect(); // 连接
int responseCode = con.getResponseCode();
con.disconnect(); // 断开连接
return responseCode;
}
public int getResponseCode(String url) {
try {
return getResponseCode(url, null);
} catch (Exception e) {
System.out.println("请求错误:" + e.toString());
return -1;
}
}
/**
* 使用 Map按key进行排序得到key=value的字符串
* @param plain
* @param eqaulsType K与V之间的拼接字符串 = 或者其他...
* @param spliceType K-V与K-V之间的拼接字符串 & 或者|...
* @return
*/
/**
*
* String转Map
* @param str 字符串
* @return map Map
*/
public static Map<String, String> getStringToMap(String str){
str = str.replace("{", "");
str = str.replace("}", "");
// 根据逗号截取字符串数组
String[] str1 = str.split(",");
// 创建Map对象
Map<String, String> map = new HashMap<String, String>();
// 循环加入Map集合
for (int i = 0; i < str1.length; i++) {
// 根据":"截取字符串数组
String[] str2 = str1[i].split(":");
// str2[0]为key, str2[1]为值
map.put(str2[0].replace("\"", ""), str2[1].replace("\"", ""));
}
return map;
}
%>
<%
// 业务API地址映射关系集合,新接入时注意添加
Map<String, String> apiUrlMap = new HashMap<String, String>();
apiUrlMap.put("scyd600", "https://xxx.xxx.xxx.xxx/xxx-api/isg/");
// 业务API地址映射关系集合,新接入时注意添加
Map<String, String> epgUrlMap = new HashMap<String, String>();
epgUrlMap.put("xxx600", "https://xxx.xxx.xxx/xxx-res/column/order/home.html");
// 获取产品编码
String product = request.getParameter("product");
SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(System.currentTimeMillis());
// 1、监控API、缓存、数据库服务是否正常(正常是result为1)
String apiUrl = apiUrlMap.get(product);
String result = "-1";
if (apiUrl != null) {
String rspStr = post(apiUrl + "monitor/status", "");
System.out.println("[monitor][" + product + "] 触发时间: " + formatter.format(date) + " | API响应参数: " + rspStr);
try {
if (apiUrl.contains("/isg/")) {
result = rspStr;
} else {
Map<String, String> rspMap = getStringToMap(rspStr);
result = rspMap.get("result") ;
}
System.out.println("[monitor][" + product + "] 触发时间: " + formatter.format(date) + " | API请求结果: " + result);
} catch(Exception e) {
System.out.println("数据转换异常!");
}
}
// 2、在1正常的情况下,监控EPG是否正常(不正常时将result更新为-1)
if ("1".equals(result)) {
String epgUrl = epgUrlMap.get(product);
int responseCode = getResponseCode(epgUrl);
System.out.println("[monitor][" + product + "] 触发时间: " + formatter.format(date) + " | EPG请求响应码: " + responseCode);
if (responseCode != 200) {
result = "-1";
}
}
out.print(result);
out.flush();
%>
各业务监控接口实例
产品xxx,1.0.0版本监控接口 http://xxx.xxx.xxx.xxx/monitor/home.jsp?product=xxx100
产品xxx,2.0.0版本监控接口 http://xxx.xxx.xxx.xxx/monitor/home.jsp?product=xxx200
产品yyy,2.0.0版本监控接口 http://xxx.xxx.xxx.xxx/monitor/home.jsp?product=xxx200
监控结果示例
业务正常
业务异常