package com.highway2urhell.service; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.highway2urhell.CoreEngine; import com.highway2urhell.domain.EntryPathData; import com.highway2urhell.domain.MessageBreaker; import com.highway2urhell.domain.MessageMetrics; import com.highway2urhell.domain.MessageThunderApp; import com.sun.management.OperatingSystemMXBean; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.io.Reader; import java.lang.management.ManagementFactory; import java.net.HttpURLConnection; import java.net.URL; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.*; public class ThunderExporterService { private static ThunderExporterService instance; private BlockingQueue<MessageBreaker> queueRemoteBreaker = new LinkedBlockingQueue<MessageBreaker>(10000); private BlockingQueue<MessageMetrics> queueRemotePerformance = new LinkedBlockingQueue<MessageMetrics>(10000); private final static int MSG_SIZE = 50; private ThunderExporterService() { ScheduledExecutorService schExService = Executors.newScheduledThreadPool(1); schExService.scheduleAtFixedRate(new Runnable() { public void run() { System.out.println("Drain the queue Remote"); List<MessageBreaker> listBreaker = new ArrayList<MessageBreaker>(); int result = queueRemoteBreaker.drainTo(listBreaker, MSG_SIZE); System.out.println("Drain Remote size " + result); if (result > 0) { System.out.println("Send the Data "); sendDataHTTPOldSchool("/addBreaker", listBreaker); } if (CoreEngine.getInstance().getConfig().getPerformance()) { System.out.println("Drain the queue Performance"); List<MessageMetrics> listPerformance = new ArrayList<MessageMetrics>(); int resultPerf = queueRemotePerformance.drainTo(listPerformance, MSG_SIZE); System.out.println("Drain Performance size " + resultPerf); if (resultPerf > 0) { System.out.println("Send the Data "); sendDataHTTPOldSchool("/addPerformance", listPerformance); } } } }, 5, 30, TimeUnit.SECONDS); } public static ThunderExporterService getInstance() { if (instance == null) { synchronized (ThunderExporterService.class) { if (instance == null) { instance = new ThunderExporterService(); } } } return instance; } public void registerAppInThunder() { String token = sendDataHTTPOldSchool("/createThunderApp/", CoreEngine.getInstance().getConfig()); CoreEngine.getInstance().getConfig().setToken(token); System.out.println("application registred with token" + token + "for application" + CoreEngine.getInstance().getConfig().getNameApplication()); } public void initPathsRemoteApp() { TransformerService ts = new TransformerService(); List<EntryPathData> res = ts.collectBreakerDataFromLeechPlugin(CoreEngine.getInstance().getLeechServiceRegistered()); System.out.println("List EntryPathData for init Path"); for (EntryPathData en : res) { System.out.println(en.toString()); } MessageThunderApp msg = new MessageThunderApp(); msg.setListentryPathData(res); msg.setToken(CoreEngine.getInstance().getConfig().getToken()); sendDataHTTPOldSchool("/initThunderApp", msg); } public void sendRemotePerformance(String fullMethodName, int timeExec, String parameters) { MessageMetrics msg = new MessageMetrics(); msg.setPathClassMethodName(fullMethodName); msg.setToken(CoreEngine.getInstance().getConfig().getToken()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); Date date = new Date(); msg.setDateIncoming(sdf.format(date)); msg.setTimeExec(timeExec); msg.setParameters(parameters); getCpuInformation(msg); queueRemotePerformance.add(msg); } public void sendRemoteBreaker(String pathClassMethodName, String parameters) { MessageBreaker msg = new MessageBreaker(); msg.setPathClassMethodName(pathClassMethodName); msg.setToken(CoreEngine.getInstance().getConfig().getToken()); SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy:hh-mm-ss"); Date date = new Date(); msg.setDateIncoming(sdf.format(date)); msg.setParameters(parameters); queueRemoteBreaker.add(msg); } public String sendDataHTTPOldSchool(String uri, Object message) { Gson gson = new GsonBuilder().setExclusionStrategies(new StrategyGsonH2H()).create(); String data = gson.toJson(message); String urlServer = CoreEngine.getInstance().getConfig().getUrlH2hWeb() + uri; String response = null; try { URL url = new URL(urlServer); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput( true ); conn.setInstanceFollowRedirects( false ); conn.setRequestMethod( "POST" ); conn.setRequestProperty( "Content-Type", "application/json"); conn.setRequestProperty( "charset", "utf-8"); conn.setUseCaches( false ); byte[] postDataBytes = data.toString().getBytes("UTF-8"); conn.setRequestProperty( "Content-Length", String.valueOf(postDataBytes.length)); DataOutputStream writer = new DataOutputStream(conn.getOutputStream()); writer.write(postDataBytes); writer.flush(); //read the response Reader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); StringBuilder sb = new StringBuilder(); for (int c; (c = in.read()) >= 0;) sb.append((char)c); response = sb.toString(); in.close(); } catch (Exception e) { System.err.println("Error during the call http for request "+uri+e); } return response; } /*public String sendDataHTTP(String uri, Object message) { Gson gson = new Gson(); String data = gson.toJson(message); String urlServer = CoreEngine.getInstance().getConfig().getUrlH2hWeb() + uri; System.out.println("Send Request to Server with uri" + urlServer + " and data" + data); HttpClient client = HttpClientBuilder.create().build(); HttpPost httpPost = new HttpPost(urlServer); if (data != null) { httpPost.setEntity(new StringEntity(data, "UTF8")); } httpPost.setHeader("Content-type", "application/json"); String result = null; try { HttpResponse response = client.execute(httpPost); if (response != null) { int statusCode = response.getStatusLine().getStatusCode(); if (statusCode == HttpURLConnection.HTTP_CREATED || statusCode == HttpURLConnection.HTTP_OK || statusCode == HttpURLConnection.HTTP_ACCEPTED || statusCode == HttpURLConnection.HTTP_NO_CONTENT) { result = EntityUtils.toString(response.getEntity()); System.out.println("Message from H2H server" + result); } else { System.err.println("Failed : HTTP error code : " + statusCode + " for urlServer " + urlServer + "msg " + EntityUtils.toString(response.getEntity())); } } else { System.err.println("Failed : Response Null from urlServer : " + urlServer); } } catch (IOException e) { System.err.println("Error while sending dataHttp to " + urlServer + " : " + e); } return result; }*/ private void getCpuInformation(MessageMetrics mb) { OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); Double cpuLoadProcess = Double.valueOf(operatingSystemMXBean.getProcessCpuLoad() * 100); Double cpuLoadSystem = Double.valueOf(operatingSystemMXBean.getSystemCpuLoad() * 100); mb.setCpuLoadProcess(cpuLoadProcess); mb.setCpuLoadSystem(cpuLoadSystem); } }