Skip to content
Merged

Dev #157

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@ public static void regist(String klass, String method) {
}

public JDBCConnectionOpenASM() {
// Tomcat7
AsmUtil.add(reserved, "org/apache/tomcat/dbcp/dbcp/BasicDataSource", "getConnection");
AsmUtil.add(reserved, "org/apache/tomcat/jdbc/pool/DataSourceProxy", "getConnection");
AsmUtil.add(reserved, "org/apache/commons/dbcp2/BasicDataSource", "getConnection");

for(int i = JDBCTargetRegister.klassMethod.size() - 1; i >= 0; i--) {
AsmUtil.add(reserved, JDBCTargetRegister.klassMethod.get(i).getLeft(), JDBCTargetRegister.klassMethod.get(i).getRight());
Expand Down
14 changes: 14 additions & 0 deletions scouter.agent.java/src/scouter/agent/trace/TraceMain.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,16 @@
import scouter.agent.proxy.HttpTraceFactory;
import scouter.agent.proxy.IHttpTrace;
import scouter.agent.summary.ServiceSummary;
import scouter.lang.AlertLevel;
import scouter.lang.TextTypes;
import scouter.lang.pack.AlertPack;
import scouter.lang.pack.XLogPack;
import scouter.lang.pack.XLogTypes;
import scouter.lang.step.HashedMessageStep;
import scouter.lang.step.MessageStep;
import scouter.lang.step.MethodStep;
import scouter.lang.step.MethodStep2;
import scouter.lang.value.MapValue;
import scouter.util.*;

import javax.sql.DataSource;
Expand Down Expand Up @@ -253,6 +257,9 @@ public static void endHttpService(Object stat, Throwable thr) {

//profile rs
if(conf.trace_rs_leak_enabled && ctx.unclosedRsMap.size() > 0) {
MapValue mv = new MapValue();
mv.put(AlertPack.HASH_FLAG + TextTypes.SERVICE + "_service-name", ctx.serviceHash);

if(conf.profile_fullstack_rs_leak_enabled) {
String message = ctx.unclosedRsMap.values().nextElement();
if(message != null) {
Expand All @@ -261,12 +268,17 @@ public static void endHttpService(Object stat, Throwable thr) {
step.hash = DataProxy.sendHashedMessage(message);
step.start_time = (int) (System.currentTimeMillis() - ctx.startTime);
ctx.profile.add(step);
mv.put(AlertPack.HASH_FLAG + TextTypes.HASH_MSG + "_full-stack", step.hash);
}
}
DataProxy.sendAlert(AlertLevel.WARN, "RESULTSET_LEAK_SUSPECT", "ResultSet Leak suspected!", mv);
}

//profile stmt
if(conf.trace_stmt_leak_enabled && ctx.unclosedStmtMap.size() > 0) {
MapValue mv = new MapValue();
mv.put(AlertPack.HASH_FLAG + TextTypes.SERVICE + "_service-name", ctx.serviceHash);

if(conf.profile_fullstack_stmt_leak_enabled) {
String message = ctx.unclosedStmtMap.values().nextElement();
if(message != null) {
Expand All @@ -275,8 +287,10 @@ public static void endHttpService(Object stat, Throwable thr) {
step.hash = DataProxy.sendHashedMessage(message);
step.start_time = (int) (System.currentTimeMillis() - ctx.startTime);
ctx.profile.add(step);
mv.put(AlertPack.HASH_FLAG + TextTypes.HASH_MSG + "_full-stack", step.hash);
}
}
DataProxy.sendAlert(AlertLevel.WARN, "STATEMENT_LEAK_SUSPECT", "Statement Leak suspected!", mv);
}

// profile close
Expand Down
25 changes: 24 additions & 1 deletion scouter.agent.java/src/scouter/agent/util/AsyncRunner.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,18 @@
import scouter.agent.netio.data.DataProxy;
import scouter.agent.summary.ErrorData;
import scouter.agent.summary.ServiceSummary;
import scouter.lang.AlertLevel;
import scouter.lang.TextTypes;
import scouter.lang.pack.AlertPack;
import scouter.lang.value.MapValue;
import scouter.util.RequestQueue;
import scouter.util.SystemUtil;
import scouter.util.ThreadUtil;

import java.lang.instrument.ClassDefinition;

import static scouter.agent.util.DumpUtil.conf;

public class AsyncRunner extends Thread {

private static AsyncRunner instance = null;
Expand Down Expand Up @@ -96,6 +102,9 @@ private void process(Runnable r) {
private void alert(LeakInfo leakInfo) {
ServiceSummary summary = ServiceSummary.getInstance();

MapValue mv = new MapValue();
mv.put(AlertPack.HASH_FLAG + TextTypes.SERVICE + "_service-name", leakInfo.serviceHash);

if (leakInfo.fullstack) {
ErrorData d = summary.process(leakInfo.error, 0, leakInfo.serviceHash, leakInfo.txid, 0, 0);
Logger.println("A156", leakInfo.error + " " + leakInfo.inner);
Expand All @@ -104,15 +113,23 @@ private void alert(LeakInfo leakInfo) {
d.fullstack = DataProxy.sendError(fullstack);
Logger.println("A157", fullstack);
}

mv.put(AlertPack.HASH_FLAG + TextTypes.ERROR + "_full-stack", d.fullstack);

} else {
summary.process(leakInfo.error, 0, leakInfo.serviceHash, leakInfo.txid, 0, 0);
Logger.println("A179", leakInfo.error + " " + leakInfo.inner);
}

DataProxy.sendAlert(AlertLevel.WARN, "CONNECTION_NOT_CLOSE", "Connection may not closed", mv);
}

private void alert(LeakInfo2 leakInfo2) {
ServiceSummary summary = ServiceSummary.getInstance();

MapValue mv = new MapValue();
mv.put(AlertPack.HASH_FLAG + TextTypes.SERVICE + "_service-name", leakInfo2.serviceHash);

if (leakInfo2.fullstack) {
ErrorData d = summary.process(leakInfo2.error, 0, leakInfo2.serviceHash, leakInfo2.txid, 0, 0);
Logger.println("A156", leakInfo2.error + " " + leakInfo2.innerObject);
Expand All @@ -121,12 +138,18 @@ private void alert(LeakInfo2 leakInfo2) {
d.fullstack = DataProxy.sendError(fullstack);
Logger.println("A157", fullstack);
}
mv.put(AlertPack.HASH_FLAG + TextTypes.ERROR + "_full-stack", d.fullstack);

} else {
summary.process(leakInfo2.error, 0, leakInfo2.serviceHash, leakInfo2.txid, 0, 0);
Logger.println("A179", leakInfo2.error + " " + leakInfo2.innerObject);
}
DataProxy.sendAlert(AlertLevel.WARN, "CONNECTION_NOT_CLOSE", "Connection may not closed", mv);

if(conf._log_trace_enabled) Logger.trace("[Force-Close-InnerObject]" + System.identityHashCode(leakInfo2.innerObject));

boolean closeResult = leakInfo2.closeManager.close(leakInfo2.innerObject);
Logger.println("G003", "connection auto closed:" + closeResult);
//Logger.println("G003", "connection auto closed:" + closeResult);
}

private void hooking(Hook m) {
Expand Down
2 changes: 2 additions & 0 deletions scouter.agent.java/src/scouter/jdbc/DetectConnection.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ public DetectConnection(java.sql.Connection inner) {
int serviceHash = 0;
long txid = 0;

//if(conf._log_trace_enabled) Logger.trace("[DetectConn-InnerObject]" + System.identityHashCode(inner));

TraceContext ctx = TraceContextManager.getContext();
if (ctx != null) {
serviceHash = ctx.serviceHash;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,6 @@
import org.eclipse.core.runtime.Platform;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IPerspectiveListener;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.WorkbenchException;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IActionBarConfigurer;
Expand All @@ -45,7 +42,6 @@
import scouter.client.server.ServerManager;
import scouter.client.threads.AlertProxyThread;
import scouter.client.threads.SessionObserver;
import scouter.client.util.RCPUtil;

/*
* ApplicationWorkbenchWindowAdvisor.preWindowOpen()
Expand All @@ -65,58 +61,6 @@ public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor im
Display display;
boolean finish = false;

private static final String[] hideActions = {
"com.kyrsoft.stmemmon.actionSet",
"org.eclipse.debug.ui.breakpointActionSet",
"org.eclipse.debug.ui.debugActionSet",
"org.eclipse.debug.ui.launchActionSet",
"org.eclipse.debug.ui.profileActionSet",
"org.eclipse.jdt.ui.A_OpenActionSet",
"org.eclipse.jdt.ui.CodingActionSet",
"org.eclipse.jdt.ui.JavaActionSet",
"org.eclipse.jdt.ui.JavaElementCreationActionSet",
"org.eclipse.jdt.ui.SearchActionSet",
"org.eclipse.jdt.ui.text.java.actionSet.presentation",
"org.eclipse.search.searchActionSet",
"org.eclipse.team.ui.actionSet",
"org.eclipse.ui.NavigateActionSet",
"org.eclipse.ui.WorkingSetActionSet",
"org.eclipse.ui.WorkingSetActionSet.toolbar",
"org.eclipse.ui.WorkingSetModificationActionSet",
"org.eclipse.ui.edit.text.actionSet.annotationNavigation",
"org.eclipse.ui.edit.text.actionSet.convertLineDelimitersTo",
"org.eclipse.ui.edit.text.actionSet.navigation",
"org.eclipse.ui.edit.text.actionSet.presentation",
"org.eclipse.update.ui.softwareUpdates",
"org.eclipse.ui.actionSet.openFiles",
"org.eclipse.ui.actionSet.keyBindings",
"org.eclipse.ui.edit.text.actionSet.openExternalFile",
"org.eclipse.ui.externaltools.ExternalToolsSet" };

private static final String[] removePreferences = {
"org.eclipse.ant.ui.AntPreferencePage",
"org.eclipse.datatools.connectivity.ui.preferences.dataNode",
"org.eclipse.debug.ui.DebugPreferencePage",
"org.eclipse.help.ui.browsersPreferencePage",
"org.eclipse.jdt.ui.preferences.JavaBasePreferencePage",
"org.eclipse.pde.ui.MainPreferencePage",
"org.eclipse.team.ui.TeamPreferences",
"org.eclipse.ui.preferencePages.Workbench",
"org.eclipse.equinox.security.ui.category"
};

private static final String[] removePerspectives = {
"org.eclipse.debug.ui.DebugPerspective",
"org.eclipse.jdt.ui.JavaPerspective",
"org.eclipse.jdt.ui.JavaHierarchyPerspective",
"org.eclipse.jdt.ui.JavaBrowsingPerspective",
"org.eclipse.team.ui.TeamSynchronizingPerspective"
};

private static final String[] preLoadingPerspectives = {
PerspectiveService.ID
};

public ApplicationWorkbenchWindowAdvisor(
IWorkbenchWindowConfigurer configurer) {
super(configurer);
Expand Down Expand Up @@ -233,25 +177,6 @@ public void postWindowCreate() {

if (isrcp) {
IWorkbenchWindowConfigurer configurer = getWindowConfigurer();

configurer.getWindow().addPerspectiveListener(
new IPerspectiveListener() {

public void perspectiveActivated(IWorkbenchPage page,
IPerspectiveDescriptor perspective) {
RCPUtil.hideActions(hideActions);
}

public void perspectiveChanged(IWorkbenchPage page,
IPerspectiveDescriptor perspective,
String changeId) {
}
});

RCPUtil.hideActions(hideActions);
RCPUtil.hidePreference(removePreferences);
RCPUtil.hidePerspectives(removePerspectives);
//RCPUtil.preLoadingPerspective(preLoadingPerspectives);
configurer.getWindow().getShell().setMaximized(true);
startBackgroundJob();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,8 @@ public void setInput(long stime, long etime, String objType, String counter, int

MenuUtil.createCounterContextMenu(ID, canvas, serverId, objType, counter);

traceDataProvider.setBufferSize((int) ((etime - stime) / TimeTypeEnum.getTime(TimeTypeEnum.REALTIME) + 10));

ExUtil.asyncRun(new Runnable() {
public void run() {
load();
Expand Down Expand Up @@ -264,7 +266,6 @@ public void controlMoved(ControlEvent e) {
// xyGraph.primaryYAxis.setTitle("");

traceDataProvider = new CircularBufferDataProvider(true);
traceDataProvider.setBufferSize(1800);
traceDataProvider.setCurrentXDataArray(new double[] {});
traceDataProvider.setCurrentYDataArray(new double[] {});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ public void getRealtimePrevPerf(int objHash, String objType, String counter) {
param.put("objType", objType);
param.put("counter", counter);

long etime = System.currentTimeMillis();
long etime = TimeUtil.getCurrentTime(serverId);
long stime = etime - DateUtil.MILLIS_PER_MINUTE * 5;
param.put("stime", stime);
param.put("etime", etime);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -167,13 +167,12 @@ public void refresh() {
public void run() {
if (isActive == true) {
setActive();
traceDataProvider.clearTrace();
for (int i = 0; i < values.length; i++) {
traceDataProvider.addSample(new Sample(CastUtil.cdouble(i) + 0.5d, CastUtil.cdouble(values[i])));
}
} else {
setInactive();
return;
}
traceDataProvider.clearTrace();
for (int i = 0; i < values.length; i++) {
traceDataProvider.addSample(new Sample(CastUtil.cdouble(i) + 0.5d, CastUtil.cdouble(values[i])));
}
if (CounterUtil.isPercentValue(objType, counter)) {
xyGraph.primaryYAxis.setRange(0, 100);
Expand Down
27 changes: 27 additions & 0 deletions scouter.client/src/scouter/client/model/TextProxy.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@
*/
package scouter.client.model;

import java.util.HashMap;
import java.util.Map;

import scouter.lang.TextTypes;

public class TextProxy {
Expand All @@ -42,4 +45,28 @@ public TextProxy() {
final public static TextModel desc = new TextModel(TextTypes.DESC, 1024);
final public static TextModel hashMessage = new TextModel(TextTypes.HASH_MSG, 1024);

private static Map<String, TextModel> textModelMap = new HashMap<String, TextModel>();

static {
textModelMap.put(TextTypes.SERVICE, service);
textModelMap.put(TextTypes.SQL, sql);
textModelMap.put(TextTypes.METHOD, method);
textModelMap.put(TextTypes.ERROR, error);
textModelMap.put(TextTypes.APICALL, apicall);
textModelMap.put(TextTypes.OBJECT, object);
textModelMap.put(TextTypes.REFERER, referer);
textModelMap.put(TextTypes.USER_AGENT, userAgent);
textModelMap.put(TextTypes.GROUP, group);
textModelMap.put(TextTypes.SQL_TABLES, sql_tables);
textModelMap.put(TextTypes.CITY, city);
textModelMap.put(TextTypes.MARIA, maria);
textModelMap.put(TextTypes.WEB, web);
textModelMap.put(TextTypes.LOGIN, login);
textModelMap.put(TextTypes.DESC, desc);
textModelMap.put(TextTypes.HASH_MSG, hashMessage);
}

public static TextModel getTextModel(String textType) {
return textModelMap.get(textType);
}
}
4 changes: 3 additions & 1 deletion scouter.client/src/scouter/client/net/ClientTCP.java
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,9 @@ public void open(int serverId) {
} catch (Throwable t) {
System.out.println(t.getMessage());
close();
server.setConnected(false);
if (server.getConnectionPool().size() < 1) {
server.setConnected(false);
}
}
}

Expand Down
Loading