Jsp独立实现聚合监控接口

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

 

监控结果示例

业务正常

业务异常

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值