diff --git a/README.md b/README.md
index 63f4ea02f..256777f03 100644
--- a/README.md
+++ b/README.md
@@ -35,6 +35,7 @@ SCOUTER can help you.
## Documents
- [Document Home](./scouter.document/index.md)
- [Quick Start Guide (Quick Installation and Demo)](./scouter.document/main/Quick-Start.md)
+ - [Live Demo(Try to use scouter by connecting on live demo system)](./scouter.document/main/Live-Demo.md)
- [Client Screen Help](./scouter.document/client/How-To-Use-Client.md)
## Download
@@ -67,12 +68,16 @@ Scouter has three modules:
- **SWT & GEF4** : Charts and Diagrams
+## Facebook
+ - [Scouter APM : Facebook Scouter user group](https://www.facebook.com/groups/scouterapm/)
+
+## How to contribute
+ - TBD
+
+
## Q&A
- [Google Groups](https://groups.google.com/forum/#!forum/scouter-project)
-## Facebook
- - [Facebook Scouter user group](https://www.facebook.com/groups/1525329794448529/)
-
## License
Licensed under the Apache License, Version 2.0
diff --git a/README_kr.md b/README_kr.md
index 543d81033..22733723e 100644
--- a/README_kr.md
+++ b/README_kr.md
@@ -30,6 +30,7 @@ APM은 Application performance montoring 또는 application performance manageme
## Documents
- [Document Home](./scouter.document/index_kr.md)
- [Quick Start(Scouter Demo 설치)](./scouter.document/main/Quick-Start_kr.md)
+ - [Live Demo(제공되는 Demo 시스템 바로 접속해 보기)](./scouter.document/main/Live-Demo_kr.md)
- [Client 화면 설명](./scouter.document/client/How-To-Use-Client_kr.md)
## Download
@@ -62,12 +63,15 @@ APM은 Application performance montoring 또는 application performance manageme
- **SWT & GEF4** : Charts and Diagrams
+## Facebook
+ - [Scouter APM 사용자 모임 - Facebook 그룹](https://www.facebook.com/groups/scouterapm/)
+
+## Scouter에 기여하기
+ - TBD
+
## Q&A
- [Google Groups](https://groups.google.com/forum/#!forum/scouter-project)
-## Facebook
- - [Facebook Scouter user group](https://www.facebook.com/groups/1525329794448529/)
-
## License
Licensed under the Apache License, Version 2.0
diff --git a/scouter.agent.host/src/scouter/agent/counter/meter/MeterResource.java b/scouter.agent.host/src/scouter/agent/counter/meter/MeterResource.java
new file mode 100644
index 000000000..09b9c5edb
--- /dev/null
+++ b/scouter.agent.host/src/scouter/agent/counter/meter/MeterResource.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2015 the original author or authors.
+ * @https://github.com/scouter-project/scouter
+ *
+ * Licensed under the Apache 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
+ *
+ * http://www.apache.org/licenses/LICENSE-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 scouter.agent.counter.meter;
+
+import scouter.lang.ref.DOUBLE;
+import scouter.lang.ref.INT;
+import scouter.util.MeteringUtil;
+import scouter.util.MeteringUtil.Handler;
+
+public class MeterResource {
+
+ static class Bucket {
+ double value;
+ int count;
+ }
+ private MeteringUtil meter = new MeteringUtil() {
+ protected Bucket create() {
+ return new Bucket();
+ };
+
+ protected void clear(Bucket o) {
+ o.value=0;
+ o.count = 0;
+ }
+ };
+
+ public synchronized void add(double value) {
+ Bucket b = meter.getCurrentBucket();
+ b.value += value;
+ b.count++;
+ }
+
+ public double getAvg(int period) {
+ final INT count = new INT();
+ final DOUBLE sum = new DOUBLE();
+ meter.search(period, new Handler() {
+ public void process(Bucket u) {
+ sum.value += u.value;
+ count.value += u.count;
+ }
+ });
+ return count.value == 0 ? 0 : sum.value / count.value;
+ }
+
+ public double getSum(int period) {
+ final DOUBLE sum = new DOUBLE();
+ meter.search(period, new Handler() {
+ public void process(Bucket u) {
+ sum.value += u.value;
+ }
+ });
+ return sum.value;
+ }
+
+}
\ No newline at end of file
diff --git a/scouter.agent.host/src/scouter/agent/counter/task/HostPerf.java b/scouter.agent.host/src/scouter/agent/counter/task/HostPerf.java
index c022b151c..da17b6a0a 100644
--- a/scouter.agent.host/src/scouter/agent/counter/task/HostPerf.java
+++ b/scouter.agent.host/src/scouter/agent/counter/task/HostPerf.java
@@ -16,6 +16,7 @@
import scouter.agent.Logger;
import scouter.agent.counter.CounterBasket;
import scouter.agent.counter.anotation.Counter;
+import scouter.agent.counter.meter.MeterResource;
import scouter.agent.netio.data.DataProxy;
import scouter.lang.AlertLevel;
import scouter.lang.TimeTypeEnum;
@@ -31,7 +32,11 @@ public class HostPerf {
static int SLEEP_TIME = 2000;
static Sigar sigarImpl = new Sigar();
static SigarProxy sigar = SigarProxyCache.newInstance(sigarImpl, SLEEP_TIME);
-
+
+ MeterResource cpuMeter = new MeterResource();
+ MeterResource sysCpuMeter = new MeterResource();
+ MeterResource userCpuMeter = new MeterResource();
+
@Counter
public void process(CounterBasket pw) {
try {
@@ -48,10 +53,18 @@ void domain(CounterBasket pw) throws SigarException {
CpuPerc cpuPerc = sigar.getCpuPerc();
float cpu = (float) ((1.0D - cpuPerc.getIdle()) * 100);
- alertCpu(cpu);
+ cpuMeter.add(cpu);
float sysCpu = (float) cpuPerc.getSys() * 100;
+ sysCpuMeter.add(sysCpu);
float userCpu = (float) cpuPerc.getUser() * 100;
+ userCpuMeter.add(userCpu);
+
+ cpu = (float) cpuMeter.getAvg(10);
+ sysCpu = (float) sysCpuMeter.getAvg(10);
+ userCpu = (float) userCpuMeter.getAvg(10);
+ alertCpu(cpu);
+
Mem m = sigar.getMem();
alertMem(m);
diff --git a/scouter.agent.java/src/scouter/agent/AgentTransformer.java b/scouter.agent.java/src/scouter/agent/AgentTransformer.java
index 19cdf3a8a..90fa42827 100644
--- a/scouter.agent.java/src/scouter/agent/AgentTransformer.java
+++ b/scouter.agent.java/src/scouter/agent/AgentTransformer.java
@@ -109,8 +109,10 @@ public byte[] transform(ClassLoader loader, String className, Class classBeingRe
AsyncRunner.getInstance().add(loader, className, classfileBuffer);
return null;
}
- if (loader == null) {
- return null;
+ if (loader == null ) {
+ if(conf._hook_boot_prefix==null || conf._hook_boot_prefix.length()==0 || false == className.startsWith(conf._hook_boot_prefix)){
+ return null;
+ }
}
}
if (className.startsWith("scouter/")) {
diff --git a/scouter.agent.java/src/scouter/agent/Configure.java b/scouter.agent.java/src/scouter/agent/Configure.java
index c3d737185..2f82473e9 100644
--- a/scouter.agent.java/src/scouter/agent/Configure.java
+++ b/scouter.agent.java/src/scouter/agent/Configure.java
@@ -31,6 +31,7 @@
public class Configure extends Thread {
public static boolean JDBC_REDEFINED = false;
private static Configure instance = null;
+
public final static synchronized Configure getInstance() {
if (instance == null) {
instance = new Configure();
@@ -182,6 +183,7 @@ public final static synchronized Configure getInstance() {
public boolean _hook_usertx_enabled = true;
public String _hook_direct_patch_classes = "";
public boolean _hook_spring_rest_enabled = false;
+ public String _hook_boot_prefix=null;
//Control
public boolean control_reject_service_enabled = false;
@@ -443,6 +445,7 @@ private void apply() {
this.trace_db2_enabled = getBoolean("trace_db2_enabled", true);
this._hook_usertx_enabled = getBoolean("_hook_usertx_enabled", true);
this._hook_direct_patch_classes = getValue("_hook_direct_patch_classes", "");
+ this._hook_boot_prefix = getValue("_hook_boot_prefix");
this.counter_recentuser_valid_ms = getLong("counter_recentuser_valid_ms", DateUtil.MILLIS_PER_FIVE_MINUTE);
this.counter_object_registry_path = getValue("counter_object_registry_path", "/tmp/scouter");
this.sfa_dump_enabled = getBoolean("sfa_dump_enabled", false);
diff --git a/scouter.agent.java/src/scouter/agent/netio/request/handle/AgentThread.java b/scouter.agent.java/src/scouter/agent/netio/request/handle/AgentThread.java
index c79554fb5..d6f41b3d0 100644
--- a/scouter.agent.java/src/scouter/agent/netio/request/handle/AgentThread.java
+++ b/scouter.agent.java/src/scouter/agent/netio/request/handle/AgentThread.java
@@ -131,6 +131,8 @@ public Pack activeThreadList(Pack param) {
ListValue ip = rPack.newList("ip");
ListValue sql = rPack.newList("sql");
ListValue subcall = rPack.newList("subcall");
+ ListValue login = rPack.newList("login");
+ ListValue desc = rPack.newList("desc");
Enumeration en = TraceContextManager.getContextEnumeration();
while (en.hasMoreElements()) {
TraceContext ctx = en.nextElement();
@@ -154,6 +156,8 @@ public Pack activeThreadList(Pack param) {
Logger.println("A128", th);
cpu.add(0L);
}
+ login.add(ctx.login);
+ desc.add(ctx.desc);
}
rPack.put("complete", new BooleanValue(true));
return rPack;
diff --git a/scouter.client/plugin.xml b/scouter.client/plugin.xml
index 526a6e107..73818462c 100644
--- a/scouter.client/plugin.xml
+++ b/scouter.client/plugin.xml
@@ -455,14 +455,6 @@
name="Data File Management"
restorable="false">
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/scouter.client/src/scouter/client/actions/OpenServiceGroupElapsedAction.java b/scouter.client/src/scouter/client/actions/OpenServiceGroupElapsedAction.java
new file mode 100644
index 000000000..867398ad8
--- /dev/null
+++ b/scouter.client/src/scouter/client/actions/OpenServiceGroupElapsedAction.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2015 the original author or authors.
+ * @https://github.com/scouter-project/scouter
+ *
+ * Licensed under the Apache 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
+ *
+ * http://www.apache.org/licenses/LICENSE-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 scouter.client.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+
+import scouter.client.Images;
+import scouter.client.views.ServiceGroupElapsedView;
+import scouter.lang.counters.CounterConstants;
+
+public class OpenServiceGroupElapsedAction extends Action {
+ public final static String ID = OpenServiceGroupElapsedAction.class.getName();
+
+ private final IWorkbenchWindow window;
+ int serverId;
+ String objType;
+
+ public OpenServiceGroupElapsedAction(IWorkbenchWindow window, int serverId, String objType) {
+ this.window = window;
+ this.serverId = serverId;
+ this.objType = objType;
+ setText("Elapsed");
+ setId(ID);
+ setImageDescriptor(Images.getCounterImageDescriptor(objType, CounterConstants.WAS_ELAPSED_TIME, serverId));
+ }
+
+ public void run() {
+ if (window != null) {
+ try {
+ window.getActivePage().showView(ServiceGroupElapsedView.ID, serverId + "&" + objType, IWorkbenchPage.VIEW_ACTIVATE);
+ } catch (PartInitException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/scouter.client/src/scouter/client/actions/OpenServiceGroupElapsedGroupAction.java b/scouter.client/src/scouter/client/actions/OpenServiceGroupElapsedGroupAction.java
new file mode 100644
index 000000000..97d242ec4
--- /dev/null
+++ b/scouter.client/src/scouter/client/actions/OpenServiceGroupElapsedGroupAction.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2015 the original author or authors.
+ * @https://github.com/scouter-project/scouter
+ *
+ * Licensed under the Apache 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
+ *
+ * http://www.apache.org/licenses/LICENSE-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 scouter.client.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+
+import scouter.client.group.view.ServiceGroupElapsedGroupView;
+
+public class OpenServiceGroupElapsedGroupAction extends Action {
+ public final static String ID = OpenServiceGroupElapsedGroupAction.class.getName();
+
+ private final IWorkbenchWindow window;
+ String grpName;
+
+ public OpenServiceGroupElapsedGroupAction(IWorkbenchWindow window, String grpName) {
+ this.window = window;
+ this.grpName = grpName;
+ setText("Elapsed");
+ setId(ID);
+ }
+
+ public void run() {
+ if (window != null) {
+ try {
+ window.getActivePage().showView(ServiceGroupElapsedGroupView.ID, grpName, IWorkbenchPage.VIEW_ACTIVATE);
+ } catch (PartInitException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/scouter.client/src/scouter/client/actions/OpenServiceGroupAction.java b/scouter.client/src/scouter/client/actions/OpenServiceGroupTPSAction.java
similarity index 68%
rename from scouter.client/src/scouter/client/actions/OpenServiceGroupAction.java
rename to scouter.client/src/scouter/client/actions/OpenServiceGroupTPSAction.java
index 274a154b8..43a2c8628 100644
--- a/scouter.client/src/scouter/client/actions/OpenServiceGroupAction.java
+++ b/scouter.client/src/scouter/client/actions/OpenServiceGroupTPSAction.java
@@ -1,54 +1,54 @@
-/*
+/*
* Copyright 2015 the original author or authors.
- * @https://github.com/scouter-project/scouter
- *
- * Licensed under the Apache 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
- *
- * http://www.apache.org/licenses/LICENSE-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 scouter.client.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-
-import scouter.client.Images;
-import scouter.client.util.ImageUtil;
-import scouter.client.views.ServiceGroupView;
-
-public class OpenServiceGroupAction extends Action {
- public final static String ID = OpenServiceGroupAction.class.getName();
-
- private final IWorkbenchWindow window;
- int serverId;
- String objType;
-
- public OpenServiceGroupAction(IWorkbenchWindow window, int serverId, String objType) {
- this.window = window;
- this.serverId = serverId;
- this.objType = objType;
- setText("Serivce Group");
- setId(ID);
- setImageDescriptor(ImageUtil.getImageDescriptor(Images.sum));
- }
-
- public void run() {
- if (window != null) {
- try {
- window.getActivePage().showView(ServiceGroupView.ID, serverId + "&" + objType, IWorkbenchPage.VIEW_ACTIVATE);
- } catch (PartInitException e) {
- e.printStackTrace();
- }
- }
- }
-}
+ * @https://github.com/scouter-project/scouter
+ *
+ * Licensed under the Apache 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
+ *
+ * http://www.apache.org/licenses/LICENSE-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 scouter.client.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+
+import scouter.client.Images;
+import scouter.client.views.ServiceGroupTPSView;
+import scouter.lang.counters.CounterConstants;
+
+public class OpenServiceGroupTPSAction extends Action {
+ public final static String ID = OpenServiceGroupTPSAction.class.getName();
+
+ private final IWorkbenchWindow window;
+ int serverId;
+ String objType;
+
+ public OpenServiceGroupTPSAction(IWorkbenchWindow window, int serverId, String objType) {
+ this.window = window;
+ this.serverId = serverId;
+ this.objType = objType;
+ setText("Throughput");
+ setId(ID);
+ setImageDescriptor(Images.getCounterImageDescriptor(objType, CounterConstants.WAS_TPS, serverId));
+ }
+
+ public void run() {
+ if (window != null) {
+ try {
+ window.getActivePage().showView(ServiceGroupTPSView.ID, serverId + "&" + objType, IWorkbenchPage.VIEW_ACTIVATE);
+ } catch (PartInitException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/scouter.client/src/scouter/client/actions/OpenServiceGroupGroupAction.java b/scouter.client/src/scouter/client/actions/OpenServiceGroupTPSGroupAction.java
similarity index 69%
rename from scouter.client/src/scouter/client/actions/OpenServiceGroupGroupAction.java
rename to scouter.client/src/scouter/client/actions/OpenServiceGroupTPSGroupAction.java
index 2b0317aea..ebde25a69 100644
--- a/scouter.client/src/scouter/client/actions/OpenServiceGroupGroupAction.java
+++ b/scouter.client/src/scouter/client/actions/OpenServiceGroupTPSGroupAction.java
@@ -1,52 +1,51 @@
-/*
+/*
* Copyright 2015 the original author or authors.
- * @https://github.com/scouter-project/scouter
- *
- * Licensed under the Apache 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
- *
- * http://www.apache.org/licenses/LICENSE-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 scouter.client.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-
-import scouter.client.Images;
-import scouter.client.group.view.ServiceGroupGroupView;
-import scouter.client.util.ImageUtil;
-
-public class OpenServiceGroupGroupAction extends Action {
- public final static String ID = OpenServiceGroupGroupAction.class.getName();
-
- private final IWorkbenchWindow window;
- String grpName;
-
- public OpenServiceGroupGroupAction(IWorkbenchWindow window, String grpName) {
- this.window = window;
- this.grpName = grpName;
- setText("Service Group");
- setId(ID);
- setImageDescriptor(ImageUtil.getImageDescriptor(Images.sum));
- }
-
- public void run() {
- if (window != null) {
- try {
- window.getActivePage().showView(ServiceGroupGroupView.ID, grpName, IWorkbenchPage.VIEW_ACTIVATE);
- } catch (PartInitException e) {
- e.printStackTrace();
- }
- }
- }
-}
+ * @https://github.com/scouter-project/scouter
+ *
+ * Licensed under the Apache 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
+ *
+ * http://www.apache.org/licenses/LICENSE-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 scouter.client.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+
+import scouter.client.Images;
+import scouter.client.group.view.ServiceGroupTPSGroupView;
+import scouter.client.util.ImageUtil;
+
+public class OpenServiceGroupTPSGroupAction extends Action {
+ public final static String ID = OpenServiceGroupTPSGroupAction.class.getName();
+
+ private final IWorkbenchWindow window;
+ String grpName;
+
+ public OpenServiceGroupTPSGroupAction(IWorkbenchWindow window, String grpName) {
+ this.window = window;
+ this.grpName = grpName;
+ setText("Throughput");
+ setId(ID);
+ }
+
+ public void run() {
+ if (window != null) {
+ try {
+ window.getActivePage().showView(ServiceGroupTPSGroupView.ID, grpName, IWorkbenchPage.VIEW_ACTIVATE);
+ } catch (PartInitException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/scouter.client/src/scouter/client/counter/actions/OpenPTPairAllAction.java b/scouter.client/src/scouter/client/counter/actions/OpenPTPairAllAction.java
new file mode 100644
index 000000000..80df9057f
--- /dev/null
+++ b/scouter.client/src/scouter/client/counter/actions/OpenPTPairAllAction.java
@@ -0,0 +1,60 @@
+package scouter.client.counter.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+
+import scouter.client.Images;
+import scouter.client.counter.views.CounterPTAllPairChart;
+import scouter.client.popup.CalendarDialog;
+import scouter.client.popup.CalendarDialog.ILoadCalendarDialog;
+import scouter.client.util.ConsoleProxy;
+import scouter.client.util.ImageUtil;
+import scouter.client.util.TimeUtil;
+import scouter.util.DateUtil;
+
+public class OpenPTPairAllAction extends Action implements ILoadCalendarDialog {
+
+ IWorkbenchWindow window;
+ int serverId;
+ String objType;
+ String counter;
+
+ public OpenPTPairAllAction(IWorkbenchWindow window, String name, int serverId, String objType, String counter) {
+ this.window = window;
+ this.serverId = serverId;
+ this.objType = objType;
+ this.counter = counter;
+ setImageDescriptor(ImageUtil.getImageDescriptor(Images.calendar));
+ setText(name);
+ }
+
+ public void run() {
+ CalendarDialog dialog = new CalendarDialog(window.getShell().getDisplay(), this);
+ dialog.showWithTime(-1, -1, TimeUtil.getCurrentTime(serverId) - DateUtil.MILLIS_PER_FIVE_MINUTE);
+ }
+
+ public void onPressedOk(long startTime, long endTime) {
+ if (window != null) {
+ try {
+ CounterPTAllPairChart chart = (CounterPTAllPairChart) window.getActivePage().showView(
+ CounterPTAllPairChart.ID, serverId + "&" + objType + "&" + counter ,
+ IWorkbenchPage.VIEW_ACTIVATE);
+ if (chart != null) {
+ chart.setInput(startTime, endTime);
+ }
+ } catch (PartInitException e) {
+ ConsoleProxy.errorSafe("Error opening view:" + e.getMessage());
+ }
+ }
+ }
+
+ public void onPressedOk(String date) {
+
+ }
+
+ public void onPressedCancel() {
+
+ }
+}
diff --git a/scouter.client/src/scouter/client/counter/actions/OpenRTPairAllAction.java b/scouter.client/src/scouter/client/counter/actions/OpenRTPairAllAction.java
new file mode 100644
index 000000000..8fb9facee
--- /dev/null
+++ b/scouter.client/src/scouter/client/counter/actions/OpenRTPairAllAction.java
@@ -0,0 +1,39 @@
+package scouter.client.counter.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+
+import scouter.client.Images;
+import scouter.client.counter.views.CounterRTAllPairChart;
+import scouter.client.util.ConsoleProxy;
+
+public class OpenRTPairAllAction extends Action {
+
+ IWorkbenchWindow window;
+ int serverId;
+ String objType;
+ String counter;
+
+ public OpenRTPairAllAction(IWorkbenchWindow window, String name, int serverId, String objType, String counter) {
+ this.window = window;
+ this.serverId = serverId;
+ this.objType = objType;
+ this.counter = counter;
+ setImageDescriptor(Images.getCounterImageDescriptor(objType, counter, serverId));
+ setText(name);
+ }
+
+ public void run() {
+ if (window != null) {
+ try {
+ window.getActivePage().showView(
+ CounterRTAllPairChart.ID, serverId + "&" + objType + "&" + counter ,
+ IWorkbenchPage.VIEW_ACTIVATE);
+ } catch (PartInitException e) {
+ ConsoleProxy.errorSafe("Error opening view:" + e.getMessage());
+ }
+ }
+ }
+}
diff --git a/scouter.client/src/scouter/client/counter/views/CounterPTAllPairChart.java b/scouter.client/src/scouter/client/counter/views/CounterPTAllPairChart.java
new file mode 100644
index 000000000..9daaa2618
--- /dev/null
+++ b/scouter.client/src/scouter/client/counter/views/CounterPTAllPairChart.java
@@ -0,0 +1,386 @@
+package scouter.client.counter.views;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.csstudio.swt.xygraph.dataprovider.CircularBufferDataProvider;
+import org.csstudio.swt.xygraph.dataprovider.ISample;
+import org.csstudio.swt.xygraph.dataprovider.Sample;
+import org.csstudio.swt.xygraph.figures.Trace;
+import org.csstudio.swt.xygraph.figures.Trace.PointStyle;
+import org.csstudio.swt.xygraph.figures.Trace.TraceType;
+import org.csstudio.swt.xygraph.figures.XYGraph;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.draw2d.FigureCanvas;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.window.DefaultToolTip;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ControlListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IViewSite;
+import org.eclipse.ui.PartInitException;
+
+import scouter.client.counter.actions.OpenPTPairAllAction;
+import scouter.client.listeners.RangeMouseListener;
+import scouter.client.model.AgentColorManager;
+import scouter.client.model.TextProxy;
+import scouter.client.net.INetReader;
+import scouter.client.net.TcpProxy;
+import scouter.client.preferences.PManager;
+import scouter.client.preferences.PreferenceConstants;
+import scouter.client.server.Server;
+import scouter.client.server.ServerManager;
+import scouter.client.threads.ObjectSelectManager;
+import scouter.client.threads.ObjectSelectManager.IObjectCheckListener;
+import scouter.client.util.ChartUtil;
+import scouter.client.util.ColorUtil;
+import scouter.client.util.ConsoleProxy;
+import scouter.client.util.CounterUtil;
+import scouter.client.util.ExUtil;
+import scouter.client.util.ScouterUtil;
+import scouter.client.views.ScouterViewPart;
+import scouter.io.DataInputX;
+import scouter.lang.counters.CounterEngine;
+import scouter.lang.pack.MapPack;
+import scouter.lang.value.ListValue;
+import scouter.lang.value.Value;
+import scouter.lang.value.ValueEnum;
+import scouter.net.RequestCmd;
+import scouter.util.CastUtil;
+import scouter.util.DateUtil;
+import scouter.util.FormatUtil;
+import scouter.util.StringUtil;
+
+public class CounterPTAllPairChart extends ScouterViewPart implements IObjectCheckListener {
+
+ public final static String ID = CounterPTAllPairChart.class.getName();
+
+ private int serverId;
+ private String objType;
+ private String counter;
+ private long stime;
+ private long etime;
+
+ protected XYGraph xyGraph;
+ protected Map dataMap = new HashMap();
+ TracePair nearestTracePair;
+ protected FigureCanvas canvas;
+
+ public void init(IViewSite site) throws PartInitException {
+ super.init(site);
+ String secId = site.getSecondaryId();
+ String[] ids = StringUtil.split(secId, "&");
+ this.serverId = CastUtil.cint(ids[0]);
+ this.objType = ids[1];
+ this.counter = ids[2];
+ }
+
+ public void createPartControl(Composite parent) {
+ GridLayout layout = new GridLayout(1, true);
+ layout.marginHeight = 5;
+ layout.marginWidth = 5;
+ parent.setLayout(layout);
+ parent.setBackground(ColorUtil.getInstance().getColor(SWT.COLOR_WHITE));
+ parent.setBackgroundMode(SWT.INHERIT_FORCE);
+
+ canvas = new FigureCanvas(parent);
+ canvas.setLayoutData(new GridData(GridData.FILL_BOTH));
+ canvas.setScrollBarVisibility(FigureCanvas.NEVER);
+ canvas.addControlListener(new ControlListener() {
+ boolean lock = false;
+
+ public void controlResized(ControlEvent e) {
+ org.eclipse.swt.graphics.Rectangle r = canvas.getClientArea();
+ if (!lock) {
+ lock = true;
+ if (ChartUtil.isShowDescriptionAllowSize(r.height)) {
+ CounterPTAllPairChart.this.setContentDescription(desc);
+ } else {
+ CounterPTAllPairChart.this.setContentDescription("");
+ }
+ r = canvas.getClientArea();
+ xyGraph.setSize(r.width, r.height);
+ lock = false;
+ }
+ }
+
+ public void controlMoved(ControlEvent e) {
+ }
+ });
+
+ xyGraph = new XYGraph();
+ xyGraph.setShowLegend(false);
+ xyGraph.setShowTitle(false);
+ canvas.setContents(xyGraph);
+
+ xyGraph.primaryXAxis.setDateEnabled(true);
+ xyGraph.primaryXAxis.setShowMajorGrid(true);
+
+ xyGraph.primaryYAxis.setAutoScale(true);
+ xyGraph.primaryYAxis.setShowMajorGrid(true);
+
+ xyGraph.primaryXAxis.setTitle("");
+ xyGraph.primaryYAxis.setTitle("");
+
+ xyGraph.primaryXAxis.setFormatPattern("HH:mm:ss");
+ xyGraph.primaryYAxis.setFormatPattern("#,##0");
+
+ xyGraph.primaryYAxis.addMouseListener(new RangeMouseListener(getViewSite().getShell(), xyGraph.primaryYAxis));
+
+ final DefaultToolTip toolTip = new DefaultToolTip(canvas, DefaultToolTip.RECREATE, true);
+ toolTip.setFont(new Font(null, "Arial", 10, SWT.BOLD));
+ toolTip.setBackgroundColor(Display.getCurrent().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+
+ canvas.addMouseListener(new MouseListener() {
+ public void mouseUp(MouseEvent e) {
+ if (nearestTracePair != null) {
+ int width = PManager.getInstance().getInt(PreferenceConstants.P_CHART_LINE_WIDTH);
+ nearestTracePair.setLineWidth(width);
+ nearestTracePair = null;
+ }
+ toolTip.hide();
+ }
+ public void mouseDown(MouseEvent e) {
+ double x = xyGraph.primaryXAxis.getPositionValue(e.x, false);
+ double y = xyGraph.primaryYAxis.getPositionValue(e.y, false);
+ if (x < 0 || y < 0) {
+ return;
+ }
+ double minDistance = 30.0d;
+ long time = 0;
+ double max = 0;
+ double value = 0;
+ Iterator keys = dataMap.keySet().iterator();
+ while (keys.hasNext()) {
+ int objHash = keys.next();
+ TracePair tp = dataMap.get(objHash);
+ Trace t1 = tp.t1;
+ ISample s1 = ScouterUtil.getNearestPoint(t1.getDataProvider(), x);
+ Trace t2 = tp.t2;
+ ISample s2 = ScouterUtil.getNearestPoint(t2.getDataProvider(), x);
+ if (s1 != null && s2 != null) {
+ int x1 = xyGraph.primaryXAxis.getValuePosition(s1.getXValue(), false);
+ int y1 = xyGraph.primaryYAxis.getValuePosition(s1.getYValue(), false);
+ int x2 = xyGraph.primaryXAxis.getValuePosition(s2.getXValue(), false);
+ int y2 = xyGraph.primaryYAxis.getValuePosition(s2.getYValue(), false);
+ double distance1 = ScouterUtil.getPointDistance(e.x, e.y, x1, y1);
+ double distance2 = ScouterUtil.getPointDistance(e.x, e.y, x2, y2);
+ double distance = distance1 > distance2 ? distance2 : distance1;
+ if (minDistance > distance) {
+ minDistance = distance;
+ nearestTracePair = tp;
+ time = (long) s1.getXValue();
+ max = s1.getYValue();
+ value = s2.getYValue();
+ }
+ }
+
+ }
+ if (nearestTracePair != null) {
+ int width = PManager.getInstance().getInt(PreferenceConstants.P_CHART_LINE_WIDTH);
+ nearestTracePair.setLineWidth(width + 2);
+ toolTip.setText(TextProxy.object.getText(nearestTracePair.objHash)
+ + "\nTime : " + DateUtil.format(time, "HH:mm:ss")
+ + "\nMax : " + FormatUtil.print(max, "#,###.##")
+ + "\nValue : " + FormatUtil.print(value, "#,###.##"));
+ toolTip.show(new Point(e.x, e.y));
+ }
+ }
+ public void mouseDoubleClick(MouseEvent e) {}
+ });
+
+ IToolBarManager man = getViewSite().getActionBars().getToolBarManager();
+ man.add(new OpenPTPairAllAction(getViewSite().getWorkbenchWindow(), "Load", serverId, objType, counter));
+
+ ObjectSelectManager.getInstance().addObjectCheckStateListener(this);
+ }
+
+ public void setInput(long stime, long etime) {
+ this.stime = stime;
+ this.etime = etime;
+ try {
+ setViewTab(objType, counter, serverId);
+ Server server = ServerManager.getInstance().getServer(serverId);
+ CounterEngine ce = server.getCounterEngine();
+ String counterName = ce.getCounterDisplayName(objType, counter);
+ desc = "ⓢ" + server.getName() + " | (Past All) " + counterName + "(" + ce.getCounterUnit(objType, counter) + ") "
+ + DateUtil.format(stime, "yyyyMMdd HH:mm:ss") + " ~ " + DateUtil.format(etime, "HH:mm:ss");
+ this.xyGraph.primaryXAxis.setRange(stime, etime);
+ } catch (Exception e1) {
+ e1.printStackTrace();
+ }
+ Set keySet = dataMap.keySet();
+ for (Integer key : keySet) {
+ TracePair tp = dataMap.get(key);
+ xyGraph.removeTrace(tp.t1);
+ xyGraph.removeTrace(tp.t2);
+ }
+ dataMap.clear();
+ load();
+ }
+
+ private void load() {
+ CounterEngine counterEngine = ServerManager.getInstance().getServer(serverId).getCounterEngine();
+ new Job("Load " + counterEngine.getCounterDisplayName(objType, counter)) {
+ protected IStatus run(IProgressMonitor monitor) {
+ final List values = new ArrayList();
+ TcpProxy tcp = TcpProxy.getTcpProxy(serverId);
+ try {
+ MapPack param = new MapPack();
+ param.put("stime", stime);
+ param.put("etime", etime);
+ param.put("objType", objType);
+ param.put("counter", counter);
+
+ tcp.process(RequestCmd.COUNTER_PAST_TIME_ALL, param, new INetReader() {
+ public void process(DataInputX in) throws IOException {
+ MapPack mpack = (MapPack) in.readPack();
+ values.add(mpack);
+ };
+ });
+ } catch (Throwable t) {
+ ConsoleProxy.errorSafe(t.toString());
+ } finally {
+ TcpProxy.putTcpProxy(tcp);
+ }
+
+ ExUtil.exec(canvas, new Runnable() {
+ public void run() {
+ double max = 0;
+ for (MapPack mpack : values) {
+ int objHash = mpack.getInt("objHash");
+ ListValue time = mpack.getList("time");
+ ListValue value = mpack.getList("value");
+ TracePair tp = getTracePair(objHash);
+ CircularBufferDataProvider maxProvider = (CircularBufferDataProvider) tp.t1.getDataProvider();
+ CircularBufferDataProvider valueProvider = (CircularBufferDataProvider) tp.t2.getDataProvider();
+ maxProvider.clearTrace();
+ valueProvider.clearTrace();
+ for (int i = 0; time != null && i < time.size(); i++) {
+ long x = time.getLong(i);
+ Value v = value.get(i);
+ if (v != null && v.getValueType() == ValueEnum.LIST) {
+ ListValue lv = (ListValue) v;
+ maxProvider.addSample(new Sample(x, lv.getDouble(0)));
+ valueProvider.addSample(new Sample(x, lv.getDouble(1)));
+ }
+ }
+ max = Math.max(ChartUtil.getMax(maxProvider.iterator()), max);
+ }
+ if (CounterUtil.isPercentValue(objType, counter)) {
+ xyGraph.primaryYAxis.setRange(0, 100);
+ } else {
+ xyGraph.primaryYAxis.setRange(0, max);
+ }
+ redraw();
+ }
+ });
+
+ return Status.OK_STATUS;
+ }
+
+ }.schedule();
+ }
+
+ public void notifyChangeState() {
+ ExUtil.asyncRun(new Runnable() {
+ public void run() {
+ for (TracePair tp : dataMap.values()) {
+ if (ObjectSelectManager.getInstance().isUnselectedObject(tp.objHash)) {
+ tp.setVisible(false);
+ } else {
+ tp.setVisible(true);
+ }
+ }
+ ExUtil.exec(canvas, new Runnable() {
+ public void run() {
+ redraw();
+ }
+ });
+ }
+ });
+ }
+
+ private TracePair getTracePair(int objHash) {
+ TracePair tp = dataMap.get(objHash);
+ if (tp == null) {
+ tp = new TracePair();
+ tp.objHash = objHash;
+
+ CircularBufferDataProvider data1 = new CircularBufferDataProvider(true);
+ data1.setBufferSize((int) ((etime - stime) / (DateUtil.MILLIS_PER_SECOND * 2)));
+ data1.setCurrentXDataArray(new double[] {});
+ data1.setCurrentYDataArray(new double[] {});
+ String name = StringUtil.trimToEmpty(TextProxy.object.getLoadText(
+ DateUtil.yyyymmdd(stime), objHash,
+ serverId));
+ Trace trace1 = new Trace(name+"(Max)", xyGraph.primaryXAxis, xyGraph.primaryYAxis, data1);
+ trace1.setPointStyle(PointStyle.NONE);
+ trace1.setLineWidth(PManager.getInstance().getInt(PreferenceConstants.P_CHART_LINE_WIDTH));
+ trace1.setTraceType(TraceType.SOLID_LINE);
+ trace1.setTraceColor(AgentColorManager.getInstance().assignColor(objType, objHash));
+ xyGraph.addTrace(trace1);
+ tp.t1 = trace1;
+
+ CircularBufferDataProvider data2 = new CircularBufferDataProvider(true);
+ data2.setBufferSize((int) ((etime - stime) / (DateUtil.MILLIS_PER_SECOND * 2)));
+ data2.setCurrentXDataArray(new double[] {});
+ data2.setCurrentYDataArray(new double[] {});
+ Trace trace2 = new Trace(name+"(Value)", xyGraph.primaryXAxis, xyGraph.primaryYAxis, data2);
+ trace2.setPointStyle(PointStyle.NONE);
+ trace2.setLineWidth(PManager.getInstance().getInt(PreferenceConstants.P_CHART_LINE_WIDTH));
+ trace2.setTraceType(TraceType.SOLID_LINE);
+ trace2.setTraceColor(AgentColorManager.getInstance().assignColor(objType, objHash));
+ xyGraph.addTrace(trace2);
+ tp.t2 = trace2;
+
+ dataMap.put(objHash, tp);
+ }
+ return tp;
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ ObjectSelectManager.getInstance().removeObjectCheckStateListener(this);
+ }
+
+ public void redraw() {
+ if (canvas != null && canvas.isDisposed() == false) {
+ canvas.redraw();
+ xyGraph.repaint();
+ }
+ }
+
+ private static class TracePair {
+ int objHash;
+ Trace t1;
+ Trace t2;
+
+ public void setLineWidth(int width) {
+ if (t1 != null) t1.setLineWidth(width);
+ if (t2 != null) t2.setLineWidth(width);
+ }
+
+ public void setVisible(boolean visible) {
+ if (t1 != null) t1.setVisible(visible);
+ if (t2 != null) t2.setVisible(visible);
+ }
+ }
+}
diff --git a/scouter.client/src/scouter/client/counter/views/CounterRTAllPairChart.java b/scouter.client/src/scouter/client/counter/views/CounterRTAllPairChart.java
new file mode 100644
index 000000000..50053b7ff
--- /dev/null
+++ b/scouter.client/src/scouter/client/counter/views/CounterRTAllPairChart.java
@@ -0,0 +1,397 @@
+package scouter.client.counter.views;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.csstudio.swt.xygraph.dataprovider.CircularBufferDataProvider;
+import org.csstudio.swt.xygraph.dataprovider.ISample;
+import org.csstudio.swt.xygraph.dataprovider.Sample;
+import org.csstudio.swt.xygraph.figures.Trace;
+import org.csstudio.swt.xygraph.figures.Trace.PointStyle;
+import org.csstudio.swt.xygraph.figures.Trace.TraceType;
+import org.csstudio.swt.xygraph.figures.XYGraph;
+import org.csstudio.swt.xygraph.linearscale.Range;
+import org.eclipse.draw2d.FigureCanvas;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.window.DefaultToolTip;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ControlListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IViewSite;
+import org.eclipse.ui.PartInitException;
+
+import scouter.client.counter.actions.OpenPTPairAllAction;
+import scouter.client.listeners.RangeMouseListener;
+import scouter.client.maria.actions.OpenDbDailyConnView;
+import scouter.client.model.AgentColorManager;
+import scouter.client.model.RefreshThread;
+import scouter.client.model.RefreshThread.Refreshable;
+import scouter.client.model.TextProxy;
+import scouter.client.net.TcpProxy;
+import scouter.client.preferences.PManager;
+import scouter.client.preferences.PreferenceConstants;
+import scouter.client.server.Server;
+import scouter.client.server.ServerManager;
+import scouter.client.threads.ObjectSelectManager;
+import scouter.client.threads.ObjectSelectManager.IObjectCheckListener;
+import scouter.client.util.ChartUtil;
+import scouter.client.util.ColorUtil;
+import scouter.client.util.ConsoleProxy;
+import scouter.client.util.CounterUtil;
+import scouter.client.util.ExUtil;
+import scouter.client.util.ScouterUtil;
+import scouter.client.util.TimeUtil;
+import scouter.client.views.ScouterViewPart;
+import scouter.lang.counters.CounterEngine;
+import scouter.lang.pack.MapPack;
+import scouter.lang.value.ListValue;
+import scouter.lang.value.Value;
+import scouter.lang.value.ValueEnum;
+import scouter.net.RequestCmd;
+import scouter.util.CastUtil;
+import scouter.util.DateUtil;
+import scouter.util.FormatUtil;
+import scouter.util.StringUtil;
+
+public class CounterRTAllPairChart extends ScouterViewPart implements Refreshable, IObjectCheckListener {
+
+ public final static String ID = CounterRTAllPairChart.class.getName();
+
+ protected RefreshThread thread = null;
+
+ private int serverId;
+ private String objType;
+ private String counter;
+
+ protected XYGraph xyGraph;
+ protected Map dataMap = new HashMap();
+ TracePair nearestTracePair;
+ protected FigureCanvas canvas;
+ boolean isActive = false;
+
+ public void init(IViewSite site) throws PartInitException {
+ super.init(site);
+ String secId = site.getSecondaryId();
+ String[] ids = StringUtil.split(secId, "&");
+ this.serverId = CastUtil.cint(ids[0]);
+ this.objType = ids[1];
+ this.counter = ids[2];
+ }
+
+ public void createPartControl(Composite parent) {
+ GridLayout layout = new GridLayout(1, true);
+ layout.marginHeight = 5;
+ layout.marginWidth = 5;
+ parent.setLayout(layout);
+ parent.setBackground(ColorUtil.getInstance().getColor(SWT.COLOR_WHITE));
+ parent.setBackgroundMode(SWT.INHERIT_FORCE);
+
+ canvas = new FigureCanvas(parent);
+ canvas.setLayoutData(new GridData(GridData.FILL_BOTH));
+ canvas.setScrollBarVisibility(FigureCanvas.NEVER);
+ canvas.addControlListener(new ControlListener() {
+ boolean lock = false;
+
+ public void controlResized(ControlEvent e) {
+ org.eclipse.swt.graphics.Rectangle r = canvas.getClientArea();
+ if (!lock) {
+ lock = true;
+ if (ChartUtil.isShowDescriptionAllowSize(r.height)) {
+ CounterRTAllPairChart.this.setContentDescription(desc);
+ } else {
+ CounterRTAllPairChart.this.setContentDescription("");
+ }
+ r = canvas.getClientArea();
+ xyGraph.setSize(r.width, r.height);
+ lock = false;
+ }
+ }
+
+ public void controlMoved(ControlEvent e) {
+ }
+ });
+
+ xyGraph = new XYGraph();
+ xyGraph.setShowLegend(false);
+ xyGraph.setShowTitle(false);
+ canvas.setContents(xyGraph);
+
+ xyGraph.primaryXAxis.setDateEnabled(true);
+ xyGraph.primaryXAxis.setShowMajorGrid(true);
+
+ xyGraph.primaryYAxis.setAutoScale(true);
+ xyGraph.primaryYAxis.setShowMajorGrid(true);
+
+ xyGraph.primaryXAxis.setTitle("");
+ xyGraph.primaryYAxis.setTitle("");
+
+ xyGraph.primaryXAxis.setFormatPattern("HH:mm:ss");
+ xyGraph.primaryYAxis.setFormatPattern("#,##0");
+
+ xyGraph.primaryYAxis.addMouseListener(new RangeMouseListener(getViewSite().getShell(), xyGraph.primaryYAxis));
+
+ final DefaultToolTip toolTip = new DefaultToolTip(canvas, DefaultToolTip.RECREATE, true);
+ toolTip.setFont(new Font(null, "Arial", 10, SWT.BOLD));
+ toolTip.setBackgroundColor(Display.getCurrent().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+
+ canvas.addMouseListener(new MouseListener() {
+ public void mouseUp(MouseEvent e) {
+ if (nearestTracePair != null) {
+ int width = PManager.getInstance().getInt(PreferenceConstants.P_CHART_LINE_WIDTH);
+ nearestTracePair.setLineWidth(width);
+ nearestTracePair = null;
+ }
+ toolTip.hide();
+ }
+ public void mouseDown(MouseEvent e) {
+ double x = xyGraph.primaryXAxis.getPositionValue(e.x, false);
+ double y = xyGraph.primaryYAxis.getPositionValue(e.y, false);
+ if (x < 0 || y < 0) {
+ return;
+ }
+ double minDistance = 30.0d;
+ long time = 0;
+ double max = 0;
+ double value = 0;
+ Iterator keys = dataMap.keySet().iterator();
+ while (keys.hasNext()) {
+ int objHash = keys.next();
+ TracePair tp = dataMap.get(objHash);
+ Trace t1 = tp.t1;
+ ISample s1 = ScouterUtil.getNearestPoint(t1.getDataProvider(), x);
+ Trace t2 = tp.t2;
+ ISample s2 = ScouterUtil.getNearestPoint(t2.getDataProvider(), x);
+ if (s1 != null && s2 != null) {
+ int x1 = xyGraph.primaryXAxis.getValuePosition(s1.getXValue(), false);
+ int y1 = xyGraph.primaryYAxis.getValuePosition(s1.getYValue(), false);
+ int x2 = xyGraph.primaryXAxis.getValuePosition(s2.getXValue(), false);
+ int y2 = xyGraph.primaryYAxis.getValuePosition(s2.getYValue(), false);
+ double distance1 = ScouterUtil.getPointDistance(e.x, e.y, x1, y1);
+ double distance2 = ScouterUtil.getPointDistance(e.x, e.y, x2, y2);
+ double distance = distance1 > distance2 ? distance2 : distance1;
+ if (minDistance > distance) {
+ minDistance = distance;
+ nearestTracePair = tp;
+ time = (long) s1.getXValue();
+ max = s1.getYValue();
+ value = s2.getYValue();
+ }
+ }
+
+ }
+ if (nearestTracePair != null) {
+ int width = PManager.getInstance().getInt(PreferenceConstants.P_CHART_LINE_WIDTH);
+ nearestTracePair.setLineWidth(width + 2);
+ toolTip.setText(TextProxy.object.getText(nearestTracePair.objHash)
+ + "\nTime : " + DateUtil.format(time, "HH:mm:ss")
+ + "\nMax : " + FormatUtil.print(max, "#,###.##")
+ + "\nValue : " + FormatUtil.print(value, "#,###.##"));
+ toolTip.show(new Point(e.x, e.y));
+ }
+ }
+ public void mouseDoubleClick(MouseEvent e) {}
+ });
+
+ ObjectSelectManager.getInstance().addObjectCheckStateListener(this);
+ try {
+ setViewTab(objType, counter, serverId);
+ Server server = ServerManager.getInstance().getServer(serverId);
+ CounterEngine ce = server.getCounterEngine();
+ String counterName = ce.getCounterDisplayName(objType, counter);
+ desc = "ⓢ" + server.getName() + " | (Current All) " + counterName + "(" + ce.getCounterUnit(objType, counter) + ")";
+ } catch (Exception e1) {
+ e1.printStackTrace();
+ }
+
+ IToolBarManager man = getViewSite().getActionBars().getToolBarManager();
+ man.add(new OpenPTPairAllAction(getViewSite().getWorkbenchWindow(), "Load", serverId, objType, counter));
+
+ thread = new RefreshThread(this, 2000);
+ thread.setName(this.toString() + " - " + "objType:" + objType + ", counter:" + counter + ", serverId:" + serverId);
+ thread.start();
+ }
+
+ public void notifyChangeState() {
+ ExUtil.asyncRun(new Runnable() {
+ public void run() {
+ for (TracePair tp : dataMap.values()) {
+ if (ObjectSelectManager.getInstance().isUnselectedObject(tp.objHash)) {
+ tp.setVisible(false);
+ } else {
+ tp.setVisible(true);
+ }
+ }
+ ExUtil.exec(canvas, new Runnable() {
+ public void run() {
+ redraw();
+ }
+ });
+ }
+ });
+ }
+
+ private TracePair getTracePair(int objHash) {
+ TracePair tp = dataMap.get(objHash);
+ if (tp == null) {
+ tp = new TracePair();
+ tp.objHash = objHash;
+
+ CircularBufferDataProvider data1 = new CircularBufferDataProvider(true);
+ data1.setBufferSize(155);
+ data1.setCurrentXDataArray(new double[] {});
+ data1.setCurrentYDataArray(new double[] {});
+ String name = StringUtil.trimToEmpty(TextProxy.object.getLoadText(
+ DateUtil.yyyymmdd(TimeUtil.getCurrentTime(serverId)), objHash,
+ serverId));
+ Trace trace1 = new Trace(name+"(Max)", xyGraph.primaryXAxis, xyGraph.primaryYAxis, data1);
+ trace1.setPointStyle(PointStyle.NONE);
+ trace1.setLineWidth(PManager.getInstance().getInt(PreferenceConstants.P_CHART_LINE_WIDTH));
+ trace1.setTraceType(TraceType.SOLID_LINE);
+ trace1.setTraceColor(AgentColorManager.getInstance().assignColor(objType, objHash));
+ xyGraph.addTrace(trace1);
+ tp.t1 = trace1;
+
+ CircularBufferDataProvider data2 = new CircularBufferDataProvider(true);
+ data2.setBufferSize(155);
+ data2.setCurrentXDataArray(new double[] {});
+ data2.setCurrentYDataArray(new double[] {});
+ Trace trace2 = new Trace(name+"(Value)", xyGraph.primaryXAxis, xyGraph.primaryYAxis, data2);
+ trace2.setPointStyle(PointStyle.NONE);
+ trace2.setLineWidth(PManager.getInstance().getInt(PreferenceConstants.P_CHART_LINE_WIDTH));
+ trace2.setTraceType(TraceType.SOLID_LINE);
+ trace2.setTraceColor(AgentColorManager.getInstance().assignColor(objType, objHash));
+ xyGraph.addTrace(trace2);
+ tp.t2 = trace2;
+
+ dataMap.put(objHash, tp);
+ }
+ return tp;
+ }
+
+ private double getMaxValue() {
+ Iterator objHashs = dataMap.keySet().iterator();
+ double max = 0.0;
+ Range xRange = xyGraph.primaryXAxis.getRange();
+ double lower = xRange.getLower();
+ double upper = xRange.getUpper();
+ while (objHashs.hasNext()) {
+ int objHash = objHashs.next();
+ CircularBufferDataProvider data = (CircularBufferDataProvider) dataMap.get(objHash).t1.getDataProvider();
+ if (data != null) {
+ for (int inx = 0; inx < data.getSize(); inx++) {
+ Sample sample = (Sample) data.getSample(inx);
+ double x = sample.getXValue();
+ if(x < lower || x > upper) {
+ continue;
+ }
+ double y = sample.getYValue();
+ if (y > max) {
+ max = y;
+ }
+ }
+ }
+ }
+ return ChartUtil.getMaxValue(max);
+ }
+
+ public void refresh() {
+ final HashMap values = new HashMap();
+ TcpProxy tcp = TcpProxy.getTcpProxy(serverId);
+ try {
+ MapPack param = new MapPack();
+
+ param.put("objType", objType);
+ param.put("counter", counter);
+
+ MapPack out = (MapPack) tcp.getSingle(RequestCmd.COUNTER_REAL_TIME_ALL, param);
+ isActive = false;
+ if (out != null) {
+ ListValue objHash = out.getList("objHash");
+ ListValue v = out.getList("value");
+ for (int i = 0; i < objHash.size(); i++) {
+ values.put(CastUtil.cint(objHash.get(i)), v.get(i));
+ isActive = true;
+ }
+ }
+ } catch (Throwable t) {
+ ConsoleProxy.errorSafe(t.toString());
+ } finally {
+ TcpProxy.putTcpProxy(tcp);
+ }
+
+ ExUtil.exec(canvas, new Runnable() {
+ public void run() {
+ if (isActive) {
+ setActive();
+ } else {
+ setInactive();
+ }
+
+ long now = TimeUtil.getCurrentTime(serverId);
+ xyGraph.primaryXAxis.setRange(now - DateUtil.MILLIS_PER_MINUTE * 5, now + 1);
+ Iterator itr = values.keySet().iterator();
+ while (itr.hasNext()) {
+ int objHash = itr.next();
+ Value value = values.get(objHash);
+ if (value != null && value.getValueType() == ValueEnum.LIST) {
+ ListValue lv = (ListValue) value;
+ TracePair tp = getTracePair(objHash);
+ CircularBufferDataProvider provider1 = (CircularBufferDataProvider) tp.t1.getDataProvider();
+ CircularBufferDataProvider provider2 = (CircularBufferDataProvider) tp.t2.getDataProvider();
+ provider1.addSample(new Sample(now, CastUtil.cdouble(lv.get(0))));
+ provider2.addSample(new Sample(now, CastUtil.cdouble(lv.get(1))));
+ }
+
+ }
+ if (CounterUtil.isPercentValue(objType, counter)) {
+ xyGraph.primaryYAxis.setRange(0, 100);
+ } else {
+ double max = getMaxValue();
+ xyGraph.primaryYAxis.setRange(0, max);
+ }
+ redraw();
+ }
+ });
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ if (this.thread != null) {
+ this.thread.shutdown();
+ }
+ ObjectSelectManager.getInstance().removeObjectCheckStateListener(this);
+ }
+
+ public void redraw() {
+ if (canvas != null && canvas.isDisposed() == false) {
+ canvas.redraw();
+ xyGraph.repaint();
+ }
+ }
+
+ private static class TracePair {
+ int objHash;
+ Trace t1;
+ Trace t2;
+
+ public void setLineWidth(int width) {
+ if (t1 != null) t1.setLineWidth(width);
+ if (t2 != null) t2.setLineWidth(width);
+ }
+
+ public void setVisible(boolean visible) {
+ if (t1 != null) t1.setVisible(visible);
+ if (t2 != null) t2.setVisible(visible);
+ }
+ }
+}
diff --git a/scouter.client/src/scouter/client/group/view/GroupNavigationView.java b/scouter.client/src/scouter/client/group/view/GroupNavigationView.java
index a3015b199..f1d56fba9 100644
--- a/scouter.client/src/scouter/client/group/view/GroupNavigationView.java
+++ b/scouter.client/src/scouter/client/group/view/GroupNavigationView.java
@@ -59,7 +59,8 @@
import scouter.client.actions.OpenAddGroupAction;
import scouter.client.actions.OpenEQGroupViewAction;
import scouter.client.actions.OpenManageGroupAction;
-import scouter.client.actions.OpenServiceGroupGroupAction;
+import scouter.client.actions.OpenServiceGroupElapsedGroupAction;
+import scouter.client.actions.OpenServiceGroupTPSGroupAction;
import scouter.client.constants.MenuStr;
import scouter.client.context.actions.OpenCxtmenuAssginGroupAction;
import scouter.client.counter.actions.OpenActiveSpeedGroupViewAction;
@@ -215,7 +216,10 @@ public void menuAboutToShow(IMenuManager manager){
manager.add(scMenu);
scMenu.add(new OpenPastDateGroupCountViewAction(win, MenuStr.LOAD_SERVICE_COUNT, CounterConstants.WAS_SERVICE_COUNT, grpObj));
scMenu.add(new OpenTodayGroupCountViewAction(win, MenuStr.TODAY_SERVICE_COUNT, CounterConstants.WAS_SERVICE_COUNT, grpObj));
- manager.add(new OpenServiceGroupGroupAction(win, grpName));
+ MenuManager serviceGroupMgr = new MenuManager("Serivce Group", ImageUtil.getImageDescriptor(Images.sum), "scouter.menu.id.group.javee.servicegroup");
+ manager.add(serviceGroupMgr);
+ serviceGroupMgr.add(new OpenServiceGroupTPSGroupAction(win, grpName));
+ serviceGroupMgr.add(new OpenServiceGroupElapsedGroupAction(win, grpName));
}
}
} else if (selObject instanceof AgentObject) {
diff --git a/scouter.client/src/scouter/client/group/view/ServiceGroupElapsedGroupView.java b/scouter.client/src/scouter/client/group/view/ServiceGroupElapsedGroupView.java
new file mode 100644
index 000000000..c9c293a0e
--- /dev/null
+++ b/scouter.client/src/scouter/client/group/view/ServiceGroupElapsedGroupView.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2015 the original author or authors.
+ * @https://github.com/scouter-project/scouter
+ *
+ * Licensed under the Apache 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
+ *
+ * http://www.apache.org/licenses/LICENSE-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 scouter.client.group.view;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IViewSite;
+import org.eclipse.ui.PartInitException;
+
+import scouter.client.net.TcpProxy;
+import scouter.client.util.ScouterUtil;
+import scouter.client.util.TimeUtil;
+import scouter.client.views.AbstractServiceGroupElapsedView;
+import scouter.lang.pack.MapPack;
+import scouter.lang.value.ListValue;
+import scouter.net.RequestCmd;
+import scouter.util.CastUtil;
+
+public class ServiceGroupElapsedGroupView extends AbstractServiceGroupElapsedView {
+
+ public final static String ID = ServiceGroupElapsedGroupView.class.getName();
+
+ String grpName;
+ private Map serverObjMap = new HashMap();
+
+ public void init(IViewSite site) throws PartInitException {
+ super.init(site);
+ String secId = site.getSecondaryId();
+ grpName = secId;
+ }
+
+ public void createPartControl(Composite parent) {
+ this.setPartName("Service[Elapsed] - " + grpName);
+ super.createPartControl(parent);
+ }
+
+ @Override
+ public MapPack fetch() {
+ ScouterUtil.collectGroupObjcts(grpName, serverObjMap);
+ HashMap valueMap = new HashMap();
+ Iterator itr = serverObjMap.keySet().iterator();
+ while (itr.hasNext()) {
+ int serverId = itr.next();
+ TcpProxy tcp = TcpProxy.getTcpProxy(serverId);
+ try {
+ MapPack param = new MapPack();
+ param.put("objHash", serverObjMap.get(serverId));
+ MapPack p = (MapPack) tcp.getSingle(RequestCmd.REALTIME_SERVICE_GROUP, param);
+ if (p != null) {
+ ListValue nameLv = p.getList("name");
+ ListValue countLv = p.getList("count");
+ ListValue elapsedLv = p.getList("elapsed");
+ ListValue errorLv = p.getList("error");
+ for (int i = 0, max = (nameLv == null ? 0 : nameLv.size()) ; i < max; i++) {
+ String name = nameLv.getString(i);
+ PerfStat perf = valueMap.get(name);
+ if (perf == null) {
+ perf = new PerfStat();
+ valueMap.put(name, perf);
+ }
+ perf.count += CastUtil.cint(countLv.get(i));
+ perf.elapsed += CastUtil.clong(elapsedLv.get(i));
+ perf.error += CastUtil.cint(errorLv.get(i));
+ }
+ }
+ } catch (Throwable th) {
+ th.printStackTrace();
+ } finally {
+ TcpProxy.putTcpProxy(tcp);
+ }
+ }
+ MapPack m = null;
+ if (valueMap.size() > 0) {
+ m = new MapPack();
+ ListValue nameLv = m.newList("name");
+ ListValue countLv = m.newList("count");
+ ListValue elapsedLv = m.newList("elapsed");
+ ListValue errorLv = m.newList("error");
+ Iterator itrr = valueMap.keySet().iterator();
+ while (itrr.hasNext()) {
+ String name = itrr.next();
+ PerfStat perf = valueMap.get(name);
+ nameLv.add(name);
+ countLv.add(perf.count);
+ elapsedLv.add(perf.elapsed);
+ errorLv.add(perf.error);
+ }
+ long time = TimeUtil.getCurrentTime();
+ m.put("time", time);
+ }
+ return m;
+ }
+
+ public static class PerfStat {
+ public int count;
+ public int error;
+ public long elapsed;
+
+ public void add(PerfStat o) {
+ this.count += o.count;
+ this.error += o.error;
+ this.elapsed += o.elapsed;
+ }
+ }
+}
diff --git a/scouter.client/src/scouter/client/group/view/ServiceGroupGroupView.java b/scouter.client/src/scouter/client/group/view/ServiceGroupTPSGroupView.java
similarity index 85%
rename from scouter.client/src/scouter/client/group/view/ServiceGroupGroupView.java
rename to scouter.client/src/scouter/client/group/view/ServiceGroupTPSGroupView.java
index 6fb1ce20b..3e96802db 100644
--- a/scouter.client/src/scouter/client/group/view/ServiceGroupGroupView.java
+++ b/scouter.client/src/scouter/client/group/view/ServiceGroupTPSGroupView.java
@@ -1,136 +1,123 @@
-/*
+/*
* Copyright 2015 the original author or authors.
- * @https://github.com/scouter-project/scouter
- *
- * Licensed under the Apache 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
- *
- * http://www.apache.org/licenses/LICENSE-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 scouter.client.group.view;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.PartInitException;
-
-import scouter.client.net.TcpProxy;
-import scouter.client.util.TimeUtil;
-import scouter.client.util.ScouterUtil;
-import scouter.client.views.ServiceGroupCommonView;
-import scouter.lang.pack.MapPack;
-import scouter.lang.value.ListValue;
-import scouter.net.RequestCmd;
-import scouter.util.CastUtil;
-
-public class ServiceGroupGroupView extends ServiceGroupCommonView {
-
- public final static String ID = ServiceGroupGroupView.class.getName();
-
- String grpName;
- private Map serverObjMap = new HashMap();
-
- public void init(IViewSite site) throws PartInitException {
- super.init(site);
- String secId = site.getSecondaryId();
- grpName = secId;
- }
-
- public void createPartControl(Composite parent) {
- this.setPartName("Service[Throughput] - " + grpName);
- super.createPartControl(parent);
- }
-
- @Override
- public MapPack fetch() {
- ScouterUtil.collectGroupObjcts(grpName, serverObjMap);
- HashMap valueMap = new HashMap();
- Iterator itr = serverObjMap.keySet().iterator();
- while (itr.hasNext()) {
- int serverId = itr.next();
- TcpProxy tcp = TcpProxy.getTcpProxy(serverId);
- try {
- MapPack param = new MapPack();
- param.put("objHash", serverObjMap.get(serverId));
- MapPack p = (MapPack) tcp.getSingle(RequestCmd.REALTIME_SERVICE_GROUP, param);
- if (p != null) {
- ListValue nameLv = p.getList("name");
- ListValue countLv = p.getList("count");
- ListValue elapsedLv = p.getList("elapsed");
- ListValue errorLv = p.getList("error");
- for (int i = 0, max = (nameLv == null ? 0 : nameLv.size()) ; i < max; i++) {
- String name = nameLv.getString(i);
- PerfStat perf = valueMap.get(name);
- if (perf == null) {
- perf = new PerfStat();
- valueMap.put(name, perf);
- }
- perf.count += CastUtil.cint(countLv.get(i));
- perf.elapsed += CastUtil.clong(elapsedLv.get(i));
- perf.error += CastUtil.cint(errorLv.get(i));
- }
- }
- } catch (Throwable th) {
- th.printStackTrace();
- } finally {
- TcpProxy.putTcpProxy(tcp);
- }
- }
- MapPack m = null;
- if (valueMap.size() > 0) {
- m = new MapPack();
- ListValue nameLv = m.newList("name");
- ListValue countLv = m.newList("count");
- ListValue elapsedLv = m.newList("elapsed");
- ListValue errorLv = m.newList("error");
- Iterator itrr = valueMap.keySet().iterator();
- while (itrr.hasNext()) {
- String name = itrr.next();
- PerfStat perf = valueMap.get(name);
- nameLv.add(name);
- countLv.add(perf.count);
- elapsedLv.add(perf.elapsed);
- errorLv.add(perf.error);
- }
- long time = TimeUtil.getCurrentTime();
- m.put("time", time);
- fiveMinMap.put(time, m);
- }
- return m;
- }
-
- public static class PerfStat {
- public int count;
- public int error;
- public long elapsed;
-
- public void add(PerfStat o) {
- this.count += o.count;
- this.error += o.error;
- this.elapsed += o.elapsed;
- }
- }
-
- @Override
- public void setTitleName(MODE mode) {
- switch (mode) {
- case THROUGHPUT:
- this.setPartName("Service[Throughput] - " + grpName);
- break;
- case ELASPED:
- this.setPartName("Service[Elapsed Time] - " + grpName);
- break;
- }
- }
-}
+ * @https://github.com/scouter-project/scouter
+ *
+ * Licensed under the Apache 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
+ *
+ * http://www.apache.org/licenses/LICENSE-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 scouter.client.group.view;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IViewSite;
+import org.eclipse.ui.PartInitException;
+
+import scouter.client.net.TcpProxy;
+import scouter.client.util.TimeUtil;
+import scouter.client.util.ScouterUtil;
+import scouter.client.views.AbstractServiceGroupTPSView;
+import scouter.lang.pack.MapPack;
+import scouter.lang.value.ListValue;
+import scouter.net.RequestCmd;
+import scouter.util.CastUtil;
+
+public class ServiceGroupTPSGroupView extends AbstractServiceGroupTPSView {
+
+ public final static String ID = ServiceGroupTPSGroupView.class.getName();
+
+ String grpName;
+ private Map serverObjMap = new HashMap();
+
+ public void init(IViewSite site) throws PartInitException {
+ super.init(site);
+ String secId = site.getSecondaryId();
+ grpName = secId;
+ }
+
+ public void createPartControl(Composite parent) {
+ this.setPartName("Service[Throughput] - " + grpName);
+ super.createPartControl(parent);
+ }
+
+ @Override
+ public MapPack fetch() {
+ ScouterUtil.collectGroupObjcts(grpName, serverObjMap);
+ HashMap valueMap = new HashMap();
+ Iterator itr = serverObjMap.keySet().iterator();
+ while (itr.hasNext()) {
+ int serverId = itr.next();
+ TcpProxy tcp = TcpProxy.getTcpProxy(serverId);
+ try {
+ MapPack param = new MapPack();
+ param.put("objHash", serverObjMap.get(serverId));
+ MapPack p = (MapPack) tcp.getSingle(RequestCmd.REALTIME_SERVICE_GROUP, param);
+ if (p != null) {
+ ListValue nameLv = p.getList("name");
+ ListValue countLv = p.getList("count");
+ ListValue elapsedLv = p.getList("elapsed");
+ ListValue errorLv = p.getList("error");
+ for (int i = 0, max = (nameLv == null ? 0 : nameLv.size()) ; i < max; i++) {
+ String name = nameLv.getString(i);
+ PerfStat perf = valueMap.get(name);
+ if (perf == null) {
+ perf = new PerfStat();
+ valueMap.put(name, perf);
+ }
+ perf.count += CastUtil.cint(countLv.get(i));
+ perf.elapsed += CastUtil.clong(elapsedLv.get(i));
+ perf.error += CastUtil.cint(errorLv.get(i));
+ }
+ }
+ } catch (Throwable th) {
+ th.printStackTrace();
+ } finally {
+ TcpProxy.putTcpProxy(tcp);
+ }
+ }
+ MapPack m = null;
+ if (valueMap.size() > 0) {
+ m = new MapPack();
+ ListValue nameLv = m.newList("name");
+ ListValue countLv = m.newList("count");
+ ListValue elapsedLv = m.newList("elapsed");
+ ListValue errorLv = m.newList("error");
+ Iterator itrr = valueMap.keySet().iterator();
+ while (itrr.hasNext()) {
+ String name = itrr.next();
+ PerfStat perf = valueMap.get(name);
+ nameLv.add(name);
+ countLv.add(perf.count);
+ elapsedLv.add(perf.elapsed);
+ errorLv.add(perf.error);
+ }
+ long time = TimeUtil.getCurrentTime();
+ m.put("time", time);
+ }
+ return m;
+ }
+
+ public static class PerfStat {
+ public int count;
+ public int error;
+ public long elapsed;
+
+ public void add(PerfStat o) {
+ this.count += o.count;
+ this.error += o.error;
+ this.elapsed += o.elapsed;
+ }
+ }
+}
diff --git a/scouter.client/src/scouter/client/net/ClientTCP.java b/scouter.client/src/scouter/client/net/ClientTCP.java
index e3bc7245f..20d470072 100644
--- a/scouter.client/src/scouter/client/net/ClientTCP.java
+++ b/scouter.client/src/scouter/client/net/ClientTCP.java
@@ -60,8 +60,8 @@ public void open(int serverId) {
//*************//
if (server.isConnected() == false) {
System.out.println("Success to connect " + server.getIp() + ":" + server.getPort());
- server.setConnected(true);
}
+ server.setConnected(true);
} catch (Throwable t) {
System.out.println(t.getMessage());
close();
diff --git a/scouter.client/src/scouter/client/util/MenuUtil.java b/scouter.client/src/scouter/client/util/MenuUtil.java
index 1d32c160f..796696523 100644
--- a/scouter.client/src/scouter/client/util/MenuUtil.java
+++ b/scouter.client/src/scouter/client/util/MenuUtil.java
@@ -41,7 +41,8 @@
import scouter.client.actions.OpenActiveServiceListAction;
import scouter.client.actions.OpenActiveSpeedAction;
import scouter.client.actions.OpenEQViewAction;
-import scouter.client.actions.OpenServiceGroupAction;
+import scouter.client.actions.OpenServiceGroupElapsedAction;
+import scouter.client.actions.OpenServiceGroupTPSAction;
import scouter.client.actions.SetColorAction;
import scouter.client.configuration.actions.DefineObjectTypeAction;
import scouter.client.configuration.actions.OpenAgentConfigureAction;
@@ -69,6 +70,7 @@
import scouter.client.counter.actions.OpenPastTimeAllAction;
import scouter.client.counter.actions.OpenPastTimeTotalAction;
import scouter.client.counter.actions.OpenPastTimeViewAction;
+import scouter.client.counter.actions.OpenRTPairAllAction;
import scouter.client.counter.actions.OpenRealTimeAllAction;
import scouter.client.counter.actions.OpenRealTimeMultiAction;
import scouter.client.counter.actions.OpenRealTimeStackAction;
@@ -489,12 +491,16 @@ public void menuAboutToShow(IMenuManager mgr) {
public static void addObjTypeSpecialMenu(IWorkbenchWindow win, IMenuManager mgr, int serverId, String objType, CounterEngine counterEngine) {
if (counterEngine.isChildOf(objType, CounterConstants.FAMILY_JAVAEE)) {
mgr.add(new Separator());
+ mgr.add(new OpenRTPairAllAction(win, "Heap Memory", serverId, objType, CounterConstants.JAVA_HEAP_TOT_USAGE));
mgr.add(new OpenEQViewAction(win, serverId, objType));
mgr.add(new OpenActiveServiceListAction(win, objType, Images.thread, serverId));
mgr.add(new OpenActiveSpeedAction(win,objType, Images.TYPE_ACTSPEED, serverId));
mgr.add(new OpenXLogRealTimeAction(win, MenuStr.XLOG, objType, Images.star, serverId));
mgr.add(new OpenTodayServiceCountAction(win, MenuStr.SERVICE_COUNT, objType, CounterConstants.WAS_SERVICE_COUNT, Images.bar, serverId));
- mgr.add(new OpenServiceGroupAction(win, serverId, objType));
+ MenuManager serviceGroupMgr = new MenuManager("Serivce Group", ImageUtil.getImageDescriptor(Images.sum), "scouter.menu.id.javee.servicegroup");
+ mgr.add(serviceGroupMgr);
+ serviceGroupMgr.add(new OpenServiceGroupTPSAction(win, serverId, objType));
+ serviceGroupMgr.add(new OpenServiceGroupElapsedAction(win, serverId, objType));
mgr.add(new OpenUniqueTotalVisitorAction(win, serverId, objType));
mgr.add(new OpenTypeSummaryAction(win, serverId, objType));
}
diff --git a/scouter.client/src/scouter/client/views/AbstractServiceGroupElapsedView.java b/scouter.client/src/scouter/client/views/AbstractServiceGroupElapsedView.java
new file mode 100644
index 000000000..1c4c658af
--- /dev/null
+++ b/scouter.client/src/scouter/client/views/AbstractServiceGroupElapsedView.java
@@ -0,0 +1,327 @@
+/*
+ * Copyright 2015 the original author or authors.
+ * @https://github.com/scouter-project/scouter
+ *
+ * Licensed under the Apache 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
+ *
+ * http://www.apache.org/licenses/LICENSE-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 scouter.client.views;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.csstudio.swt.xygraph.dataprovider.CircularBufferDataProvider;
+import org.csstudio.swt.xygraph.dataprovider.ISample;
+import org.csstudio.swt.xygraph.dataprovider.Sample;
+import org.csstudio.swt.xygraph.figures.Trace;
+import org.csstudio.swt.xygraph.figures.Trace.PointStyle;
+import org.csstudio.swt.xygraph.figures.Trace.TraceType;
+import org.csstudio.swt.xygraph.figures.XYGraph;
+import org.csstudio.swt.xygraph.linearscale.Range;
+import org.eclipse.draw2d.FigureCanvas;
+import org.eclipse.jface.window.DefaultToolTip;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ControlListener;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.part.ViewPart;
+
+import scouter.client.Images;
+import scouter.client.listeners.RangeMouseListener;
+import scouter.client.model.RefreshThread;
+import scouter.client.model.RefreshThread.Refreshable;
+import scouter.client.model.ServiceGroupColorManager;
+import scouter.client.preferences.PManager;
+import scouter.client.preferences.PreferenceConstants;
+import scouter.client.util.ChartUtil;
+import scouter.client.util.ColorUtil;
+import scouter.client.util.ExUtil;
+import scouter.client.util.ScouterUtil;
+import scouter.client.util.TimeUtil;
+import scouter.client.util.UIUtil;
+import scouter.lang.pack.MapPack;
+import scouter.lang.value.ListValue;
+import scouter.util.CastUtil;
+import scouter.util.DateUtil;
+import scouter.util.FormatUtil;
+
+public abstract class AbstractServiceGroupElapsedView extends ViewPart implements Refreshable {
+
+ public final static String ID = AbstractServiceGroupElapsedView.class.getName();
+
+ private final static int BUFFER_SIZE = 200;
+ protected RefreshThread thread;
+
+ protected XYGraph xyGraph;
+ protected FigureCanvas canvas;
+
+ protected Map traces = new HashMap();
+ Trace nearestTrace = null;
+
+ private int manualRangeCount;
+ private double manualY;
+
+ public void createPartControl(Composite parent) {
+ parent.setLayout(UIUtil.formLayout(0, 0));
+ canvas = new FigureCanvas(parent);
+ canvas.setScrollBarVisibility(FigureCanvas.NEVER);
+ canvas.setLayoutData(UIUtil.formData(0, 0, 0, 0, 100, 0, 100, 0));
+ canvas.setBackground(ColorUtil.getInstance().getColor(SWT.COLOR_WHITE));
+ canvas.addControlListener(new ControlListener() {
+ boolean lock = false;
+ public void controlResized(ControlEvent e) {
+ org.eclipse.swt.graphics.Rectangle r = canvas.getClientArea();
+ if (!lock) {
+ lock = true;
+ xyGraph.setSize(r.width, r.height);
+ lock = false;
+ }
+ }
+ public void controlMoved(ControlEvent e) {
+ }
+ });
+ final DefaultToolTip toolTip = new DefaultToolTip(canvas, DefaultToolTip.RECREATE, true);
+ toolTip.setFont(new Font(null, "Arial", 10, SWT.BOLD));
+ toolTip.setBackgroundColor(Display.getCurrent().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+ canvas.addMouseListener(new MouseListener() {
+ public void mouseUp(MouseEvent e) {
+ if (nearestTrace != null) {
+ nearestTrace.setLineWidth(PManager.getInstance().getInt(PreferenceConstants.P_CHART_LINE_WIDTH));
+ nearestTrace = null;
+ }
+ toolTip.hide();
+ }
+
+ public void mouseDown(MouseEvent e) {
+ double x = xyGraph.primaryXAxis.getPositionValue(e.x, false);
+ double y = xyGraph.primaryYAxis.getPositionValue(e.y, false);
+ if (x < 0 || y < 0) {
+ return;
+ }
+ double minDistance = 30.0d;
+ long time = 0;
+ double value = 0;
+ for (Trace t : traces.values()) {
+ ISample s = ScouterUtil.getNearestPoint(t.getDataProvider(), x);
+ if (s != null) {
+ int x2 = xyGraph.primaryXAxis.getValuePosition(s.getXValue(), false);
+ int y2 = xyGraph.primaryYAxis.getValuePosition(s.getYValue(), false);
+ double distance = ScouterUtil.getPointDistance(e.x, e.y, x2, y2);
+ if (minDistance > distance) {
+ minDistance = distance;
+ nearestTrace = t;
+ time = (long) s.getXValue();
+ value = s.getYValue();
+ }
+ }
+ }
+ if (nearestTrace != null) {
+ int width = PManager.getInstance().getInt(PreferenceConstants.P_CHART_LINE_WIDTH);
+ nearestTrace.setLineWidth(width + 2);
+ toolTip.setText(nearestTrace.getName()
+ + "\nTime : " + DateUtil.format(time, "HH:mm:ss")
+ + "\nValue : " + FormatUtil.print(value, "#,###.##"));
+ toolTip.show(new Point(e.x, e.y));
+ }
+ }
+ public void mouseDoubleClick(MouseEvent e) {}
+ });
+ canvas.addKeyListener(new KeyListener() {
+ public void keyReleased(KeyEvent e) {
+ }
+
+ public void keyPressed(KeyEvent e) {
+ switch (e.keyCode) {
+ case 16777217:// UP Key
+ double max = xyGraph.primaryYAxis.getRange().getUpper();
+ if (max > 10000) {
+ manualY = max + 1000;
+ } else if (max > 1000) {
+ manualY = max + 100;
+ } else if (max > 100) {
+ manualY = max + 10;
+ } else if (max == 3) {
+ manualY = 5;
+ } else {
+ manualY = max + 5;
+ }
+ manualRangeCount = 5;
+ xyGraph.primaryYAxis.setRange(0, manualY);
+ break;
+ case 16777218: // DOWN Key
+ max = xyGraph.primaryYAxis.getRange().getUpper();
+ if (max > 10000) {
+ manualY = max - 1000;
+ } else if (max > 1000) {
+ manualY =max - 100;
+ } else if (max > 100) {
+ manualY =max - 10;
+ } else {
+ manualY = (max - 5) > 3 ? max -5 : 3;
+ }
+ manualRangeCount = 5;
+ xyGraph.primaryYAxis.setRange(0, manualY);
+ break;
+ }
+ }
+ });
+ xyGraph = new XYGraph();
+ xyGraph.setShowLegend(true);
+ xyGraph.setShowTitle(false);
+ canvas.setContents(xyGraph);
+ xyGraph.primaryXAxis.setDateEnabled(true);
+ xyGraph.primaryXAxis.setShowMajorGrid(true);
+ xyGraph.primaryYAxis.setAutoScale(true);
+ xyGraph.primaryYAxis.setShowMajorGrid(true);
+ xyGraph.primaryXAxis.setTitle("");
+ xyGraph.primaryYAxis.setTitle("");
+
+ xyGraph.primaryYAxis.addMouseListener(new RangeMouseListener(getViewSite().getShell(), xyGraph.primaryYAxis));
+ thread = new RefreshThread(this, 2000);
+ thread.start();
+ }
+
+ public void setFocus() {}
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ if (this.thread != null) {
+ this.thread.shutdown();
+ }
+ }
+
+ boolean stopRefresh = false;
+
+ public void refresh() {
+ if (stopRefresh) {
+ return;
+ }
+ MapPack m = fetch();
+ if (m == null) {
+ ExUtil.exec(canvas, new Runnable() {
+ public void run() {
+ setTitleImage(Images.inactive);
+ long now = TimeUtil.getCurrentTime();
+ xyGraph.primaryXAxis.setRange(now - DateUtil.MILLIS_PER_FIVE_MINUTE, now + 1);
+ }
+ });
+ return;
+ }
+ removeDeadGroup(m);
+ processElapsedData(m);
+ }
+
+ public abstract MapPack fetch();
+
+ private void removeDeadGroup(MapPack m) {
+ ListValue nameLv = m.getList("name");
+
+ ArrayList grpSet = new ArrayList();
+ Iterator enu = traces.keySet().iterator();
+ while(enu.hasNext()){
+ grpSet.add(enu.next());
+ }
+ for (int i = 0; i < nameLv.size(); i++) {
+ String name = nameLv.getString(i);
+ grpSet.remove(name);
+ }
+ for (String dead : grpSet) {
+ final Trace t = traces.get(dead);
+ if (t == null) continue;
+ ExUtil.exec(canvas, new Runnable() {
+ public void run() {
+ xyGraph.removeTrace(t);
+ }
+ });
+ traces.remove(dead);
+ }
+ }
+
+ private void processElapsedData(final MapPack m) {
+ final ListValue nameLv = m.getList("name");
+ final ListValue elapsedLv = m.getList("elapsed");
+ ExUtil.exec(canvas, new Runnable() {
+ public void run() {
+ setTitleImage(Images.active);
+ long now = m.getLong("time");
+ long stime = now - DateUtil.MILLIS_PER_FIVE_MINUTE;
+ xyGraph.primaryXAxis.setRange(stime, now + 1);
+ for (int i = 0; i < nameLv.size(); i++) {
+ String name = nameLv.getString(i);
+ double value = CastUtil.cdouble(elapsedLv.get(i)) / 30.0d;
+ CircularBufferDataProvider provider = (CircularBufferDataProvider) getTrace(name).getDataProvider();
+ provider.addSample(new Sample(now, value));
+ }
+ xyGraph.primaryYAxis.setRange(0, getMaxValue());
+ }
+ });
+ }
+
+ private Trace getTrace(String name) {
+ Trace trace = traces.get(name);
+ if (trace == null) {
+ CircularBufferDataProvider provider = new CircularBufferDataProvider(true);
+ provider.setBufferSize(BUFFER_SIZE);
+ trace = new Trace(name, xyGraph.primaryXAxis, xyGraph.primaryYAxis, provider);
+ trace.setPointStyle(PointStyle.NONE);
+ trace.getXAxis().setFormatPattern("HH:mm:ss");
+ trace.getYAxis().setFormatPattern("#,##0");
+ trace.setLineWidth(PManager.getInstance().getInt(PreferenceConstants.P_CHART_LINE_WIDTH));
+ trace.setTraceType(TraceType.SOLID_LINE);
+ trace.setTraceColor(ServiceGroupColorManager.getInstance().assignColor(name));
+ xyGraph.addTrace(trace);
+ traces.put(name, trace);
+ }
+ return trace;
+ }
+
+ private double getMaxValue() {
+ Range xRange = xyGraph.primaryXAxis.getRange();
+ double lower = xRange.getLower();
+ double upper = xRange.getUpper();
+ if (manualRangeCount > 0 && manualY > 0) {
+ manualRangeCount--;
+ return manualY;
+ }
+ double max = 0.0;
+ Iterator itr = traces.keySet().iterator();
+ while (itr.hasNext()) {
+ String name = itr.next();
+ CircularBufferDataProvider data = (CircularBufferDataProvider) traces.get(name).getDataProvider();
+ if (data != null) {
+ for (int inx = 0; inx < data.getSize(); inx++) {
+ Sample sample = (Sample) data.getSample(inx);
+ double x = sample.getXValue();
+ if(x < lower || x > upper) {
+ continue;
+ }
+ double y = sample.getYValue();
+ if (y > max) {
+ max = y;
+ }
+ }
+ }
+ }
+ return ChartUtil.getGroupMaxValue(max);
+ }
+}
diff --git a/scouter.client/src/scouter/client/views/ServiceGroupCommonView.java b/scouter.client/src/scouter/client/views/AbstractServiceGroupTPSView.java
similarity index 65%
rename from scouter.client/src/scouter/client/views/ServiceGroupCommonView.java
rename to scouter.client/src/scouter/client/views/AbstractServiceGroupTPSView.java
index e1620abe9..fa33b433e 100644
--- a/scouter.client/src/scouter/client/views/ServiceGroupCommonView.java
+++ b/scouter.client/src/scouter/client/views/AbstractServiceGroupTPSView.java
@@ -1,518 +1,353 @@
-/*
+/*
* Copyright 2015 the original author or authors.
- * @https://github.com/scouter-project/scouter
- *
- * Licensed under the Apache 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
- *
- * http://www.apache.org/licenses/LICENSE-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 scouter.client.views;
-
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.csstudio.swt.xygraph.dataprovider.CircularBufferDataProvider;
-import org.csstudio.swt.xygraph.dataprovider.Sample;
-import org.csstudio.swt.xygraph.figures.Trace;
-import org.csstudio.swt.xygraph.figures.Trace.PointStyle;
-import org.csstudio.swt.xygraph.figures.Trace.TraceType;
-import org.csstudio.swt.xygraph.figures.XYGraph;
-import org.csstudio.swt.xygraph.linearscale.Range;
-import org.eclipse.draw2d.FigureCanvas;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.window.DefaultToolTip;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ControlListener;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.ImageData;
-import org.eclipse.swt.graphics.PaletteData;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.part.ViewPart;
-
-import scouter.client.Activator;
-import scouter.client.Images;
-import scouter.client.model.RefreshThread;
-import scouter.client.model.ServiceGroupColorManager;
-import scouter.client.model.RefreshThread.Refreshable;
-import scouter.client.preferences.PManager;
-import scouter.client.preferences.PreferenceConstants;
-import scouter.client.util.ChartUtil;
-import scouter.client.util.ColorUtil;
-import scouter.client.util.ExUtil;
-import scouter.client.util.MenuUtil;
-import scouter.client.util.TimeUtil;
-import scouter.client.util.UIUtil;
-import scouter.lang.pack.MapPack;
-import scouter.lang.value.ListValue;
-import scouter.util.CastUtil;
-import scouter.util.DateUtil;
-import scouter.util.LinkedMap;
-import scouter.util.LongEnumer;
-import scouter.util.LongKeyLinkedMap;
-
-public abstract class ServiceGroupCommonView extends ViewPart implements Refreshable {
-
- public final static String ID = ServiceGroupCommonView.class.getName();
-
- private final static int BUFFER_SIZE = 200;
- protected RefreshThread thread;
-
- protected XYGraph xyGraph;
- protected FigureCanvas canvas;
-
- public MODE mode = MODE.THROUGHPUT;
-
- protected Map traces = new HashMap();
- protected LongKeyLinkedMap< MapPack> fiveMinMap = new LongKeyLinkedMap< MapPack>().setMax(BUFFER_SIZE);
- private LinkedMap stackValueMap = new LinkedMap();
-
- private int manualRangeCount;
- private double manualY;
-
- public void createPartControl(Composite parent) {
- parent.setLayout(UIUtil.formLayout(0, 0));
- canvas = new FigureCanvas(parent);
- canvas.setScrollBarVisibility(FigureCanvas.NEVER);
- canvas.setLayoutData(UIUtil.formData(0, 0, 0, 0, 100, 0, 100, 0));
- canvas.setBackground(ColorUtil.getInstance().getColor(SWT.COLOR_WHITE));
- canvas.addControlListener(new ControlListener() {
- boolean lock = false;
- public void controlResized(ControlEvent e) {
- org.eclipse.swt.graphics.Rectangle r = canvas.getClientArea();
- if (!lock) {
- lock = true;
- xyGraph.setSize(r.width, r.height);
- lock = false;
- }
- }
- public void controlMoved(ControlEvent e) {
- }
- });
- final DefaultToolTip toolTip = new DefaultToolTip(canvas, DefaultToolTip.RECREATE, true);
- toolTip.setFont(new Font(null, "Arial", 10, SWT.BOLD));
- toolTip.setBackgroundColor(Display.getCurrent().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
- canvas.addMouseListener(new MouseListener() {
-
- String selectedName;
-
- public void mouseUp(MouseEvent e) {
- if (selectedName == null) {
- return;
- }
- Trace trace = traces.get(selectedName);
- trace.setTraceColor(ServiceGroupColorManager.getInstance().assignColor(selectedName));
- toolTip.hide();
- selectedName = null;
- }
- public void mouseDown(MouseEvent e) {
- Image image = new Image(e.display, 1, 1);
- GC gc = new GC((FigureCanvas)e.widget);
- gc.copyArea(image, e.x, e.y);
- ImageData imageData = image.getImageData();
- PaletteData palette = imageData.palette;
- int pixelValue = imageData.getPixel(0, 0);
- RGB rgb = palette.getRGB(pixelValue);
- selectedName = ServiceGroupColorManager.getInstance().getServiceGroup(rgb);
- if (selectedName != null) {
- Trace trace = traces.get(selectedName);
- trace.setTraceColor(ColorUtil.getInstance().getColor("dark magenta"));
- toolTip.setText(selectedName);
- toolTip.show(new Point(e.x, e.y));
- }
- gc.dispose();
- image.dispose();
- }
- public void mouseDoubleClick(MouseEvent e) {}
- });
- canvas.addKeyListener(new KeyListener() {
- public void keyReleased(KeyEvent e) {
- }
-
- public void keyPressed(KeyEvent e) {
- switch (e.keyCode) {
- case 16777217:// UP Key
- double max = xyGraph.primaryYAxis.getRange().getUpper();
- if (max > 10000) {
- manualY = max + 1000;
- } else if (max > 1000) {
- manualY = max + 100;
- } else if (max > 100) {
- manualY = max + 10;
- } else if (max == 3) {
- manualY = 5;
- } else {
- manualY = max + 5;
- }
- manualRangeCount = 5;
- xyGraph.primaryYAxis.setRange(0, manualY);
- break;
- case 16777218: // DOWN Key
- max = xyGraph.primaryYAxis.getRange().getUpper();
- if (max > 10000) {
- manualY = max - 1000;
- } else if (max > 1000) {
- manualY =max - 100;
- } else if (max > 100) {
- manualY =max - 10;
- } else {
- manualY = (max - 5) > 3 ? max -5 : 3;
- }
- manualRangeCount = 5;
- xyGraph.primaryYAxis.setRange(0, manualY);
- break;
- }
- }
- });
- IToolBarManager man = getViewSite().getActionBars().getToolBarManager();
- ArrayList menus = new ArrayList();
- menus.add(new ChangeThroughput());
- menus.add(new ChangeElasped());
- MenuUtil.createMenu(getSite().getWorkbenchWindow(), man, menus, Images.arrow_rotate);
- xyGraph = new XYGraph();
- xyGraph.setShowLegend(true);
- xyGraph.setShowTitle(false);
- canvas.setContents(xyGraph);
- xyGraph.primaryXAxis.setDateEnabled(true);
- xyGraph.primaryXAxis.setShowMajorGrid(true);
- xyGraph.primaryYAxis.setAutoScale(true);
- xyGraph.primaryYAxis.setShowMajorGrid(true);
- xyGraph.primaryXAxis.setTitle("");
- xyGraph.primaryYAxis.setTitle("");
- thread = new RefreshThread(this, 2000);
- thread.start();
- }
-
- public void setFocus() {}
-
- @Override
- public void dispose() {
- super.dispose();
- if (this.thread != null) {
- this.thread.shutdown();
- }
- }
-
- private void changeMode(MODE mode) {
- if (this.mode == mode) {
- return;
- }
- for (Trace trace : traces.values()) {
- xyGraph.removeTrace(trace);
- }
- traces.clear();
- manualRangeCount = 0;
- this.mode = mode;
- setTitleName(mode);
- try {
- stopRefresh = true;
- applyPrevData();
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- stopRefresh = false;
- }
- }
-
- boolean stopRefresh = false;
-
- private void applyPrevData() {
- final LinkedMap> tempMap = new LinkedMap>();
- LongEnumer keys = fiveMinMap.keys();
- while (keys.hasMoreElements()) {
- long time = keys.nextLong();
- MapPack m = fiveMinMap.get(time);
- ListValue nameLv = m.getList("name");
- ListValue countLv = m.getList("count");
- ListValue elapsedLv = m.getList("elapsed");
- switch (mode) {
- case THROUGHPUT :
- for (int i = 0; i < nameLv.size(); i++) {
- String name = nameLv.getString(i);
- double count = CastUtil.cdouble(countLv.get(i)) / 30.0d;
- StackValue sv = stackValueMap.get(name);
- if (sv == null) {
- continue;
- }
- sv.actualValue = count;
- sv.lastUpdateTime = time;
- }
- Enumeration itr = stackValueMap.keys();
- double stackValue = 0.0;
- while (itr.hasMoreElements()) {
- String name = itr.nextElement();
- StackValue sv = stackValueMap.get(name);
- if (sv != null) {
- if (tempMap.containsKey(name) == false) {
- tempMap.putFirst(name, new ArrayList());
- }
- if (sv.lastUpdateTime == time) {
- stackValue += sv.actualValue;
- List list = tempMap.get(name);
- list.add(new Sample(time, stackValue));
- }
- }
- }
- break;
- case ELASPED:
- for (int i = 0; i < nameLv.size(); i++) {
- String name = nameLv.getString(i);
- if (stackValueMap.containsKey(name) == false) {
- continue;
- }
- double value = CastUtil.cdouble(elapsedLv.get(i)) / 30.0d;
- List list = tempMap.get(name);
- if (list == null) {
- list = new ArrayList();
- tempMap.put(name, list);
- }
- list.add(new Sample(time, value));
- }
- break;
- }
- }
-
- ExUtil.exec(canvas, new Runnable() {
- public void run() {
- Enumeration itr = tempMap.keys();
- while (itr.hasMoreElements()) {
- String name = itr.nextElement();
- List list = tempMap.get(name);
- CircularBufferDataProvider provider = (CircularBufferDataProvider) getTrace(name).getDataProvider();
- for (int i = 0; i < list.size(); i++) {
- provider.addSample(list.get(i));
- }
- }
- }
- });
- }
-
- public void refresh() {
- if (stopRefresh) {
- return;
- }
- MapPack m = fetch();
- if (m == null) {
- ExUtil.exec(canvas, new Runnable() {
- public void run() {
- setTitleImage(Images.inactive);
- long now = TimeUtil.getCurrentTime();
- xyGraph.primaryXAxis.setRange(now - DateUtil.MILLIS_PER_FIVE_MINUTE, now + 1);
- }
- });
- return;
- }
- removeDeadGroup(m);
- switch (mode) {
- case THROUGHPUT :
- processThroughputData(m);
- break;
- case ELASPED:
- processElapsedData(m);
- break;
- }
- }
-
- public abstract void setTitleName(MODE mode);
- public abstract MapPack fetch();
-
- private void removeDeadGroup(MapPack m) {
- ListValue nameLv = m.getList("name");
-
- ArrayList grpSet = new ArrayList();
- Enumeration enu =stackValueMap.keys();
- while(enu.hasMoreElements()){
- grpSet.add(enu.nextElement());
- }
- for (int i = 0; i < nameLv.size(); i++) {
- String name = nameLv.getString(i);
- grpSet.remove(name);
- }
- for (String dead : grpSet) {
- stackValueMap.remove(dead);
- final Trace t = traces.get(dead);
- if (t == null) continue;
- ExUtil.exec(canvas, new Runnable() {
- public void run() {
- xyGraph.removeTrace(t);
- }
- });
- traces.remove(dead);
- }
- }
-
- private void processThroughputData(MapPack m) {
- ListValue nameLv = m.getList("name");
- ListValue countLv = m.getList("count");
- final long now = m.getLong("time");
- final long stime = now - DateUtil.MILLIS_PER_FIVE_MINUTE;
- for (int i = 0; i < nameLv.size(); i++) {
- String name = nameLv.getString(i);
- double value = CastUtil.cdouble(countLv.get(i)) / 30.0d;
- if (stackValueMap.containsKey(name)) {
- StackValue sv = stackValueMap.get(name);
- sv.actualValue = value;
- sv.lastUpdateTime = now;
- } else {
- StackValue sv = new StackValue();
- sv.actualValue = value;
- sv.lastUpdateTime = now;
- stackValueMap.putFirst(name, sv);
- }
- }
- Enumeration itr = stackValueMap.keys();
- final LinkedMap tempMap = new LinkedMap();
- double stackValue = 0.0;
- while (itr.hasMoreElements()) {
- String name = itr.nextElement();
- StackValue sv = stackValueMap.get(name);
- if (sv.lastUpdateTime == now) {
- stackValue += sv.actualValue;
- sv.stackedValue = stackValue;
- tempMap.putFirst(name, sv);
- }
- }
- ExUtil.exec(canvas, new Runnable() {
- public void run() {
- setTitleImage(Images.active);
- xyGraph.primaryXAxis.setRange(stime, now + 1);
- Enumeration itr = tempMap.keys();
- while (itr.hasMoreElements()) {
- String name = itr.nextElement();
- StackValue sv = tempMap.get(name);
- CircularBufferDataProvider provider = (CircularBufferDataProvider) getTrace(name).getDataProvider();
- provider.addSample(new Sample(now, sv.stackedValue));
- }
- xyGraph.primaryYAxis.setRange(0, getMaxValue());
- }
- });
- }
-
- private void processElapsedData(final MapPack m) {
- final ListValue nameLv = m.getList("name");
- final ListValue elapsedLv = m.getList("elapsed");
- ExUtil.exec(canvas, new Runnable() {
- public void run() {
- setTitleImage(Images.active);
- long now = m.getLong("time");
- long stime = now - DateUtil.MILLIS_PER_FIVE_MINUTE;
- xyGraph.primaryXAxis.setRange(stime, now + 1);
- for (int i = 0; i < nameLv.size(); i++) {
- String name = nameLv.getString(i);
- double value = CastUtil.cdouble(elapsedLv.get(i)) / 30.0d;
- CircularBufferDataProvider provider = (CircularBufferDataProvider) getTrace(name).getDataProvider();
- provider.addSample(new Sample(now, value));
- }
- xyGraph.primaryYAxis.setRange(0, getMaxValue());
- }
- });
- }
-
- private Trace getTrace(String name) {
- Trace trace = traces.get(name);
- if (trace == null) {
- CircularBufferDataProvider provider = new CircularBufferDataProvider(true);
- provider.setBufferSize(BUFFER_SIZE);
- trace = new Trace(name, xyGraph.primaryXAxis, xyGraph.primaryYAxis, provider);
- trace.setPointStyle(PointStyle.NONE);
- trace.getXAxis().setFormatPattern("HH:mm:ss");
- trace.getYAxis().setFormatPattern("#,##0");
- if (this.mode == MODE.ELASPED) {
- trace.setLineWidth(PManager.getInstance().getInt(PreferenceConstants.P_CHART_LINE_WIDTH));
- trace.setTraceType(TraceType.SOLID_LINE);
- } else if (this.mode == MODE.THROUGHPUT) {
- trace.setTraceType(TraceType.AREA);
- trace.setAreaAlpha(255);
- }
- trace.setTraceColor(ServiceGroupColorManager.getInstance().assignColor(name));
- xyGraph.addTrace(trace);
- traces.put(name, trace);
- }
- return trace;
- }
-
- private double getMaxValue() {
- Range xRange = xyGraph.primaryXAxis.getRange();
- double lower = xRange.getLower();
- double upper = xRange.getUpper();
- if (manualRangeCount > 0 && manualY > 0) {
- manualRangeCount--;
- return manualY;
- }
- double max = 0.0;
- Iterator itr = traces.keySet().iterator();
- while (itr.hasNext()) {
- String name = itr.next();
- CircularBufferDataProvider data = (CircularBufferDataProvider) traces.get(name).getDataProvider();
- if (data != null) {
- for (int inx = 0; inx < data.getSize(); inx++) {
- Sample sample = (Sample) data.getSample(inx);
- double x = sample.getXValue();
- if(x < lower || x > upper) {
- continue;
- }
- double y = sample.getYValue();
- if (y > max) {
- max = y;
- }
- }
- }
- }
- return ChartUtil.getGroupMaxValue(max);
- }
-
- static class StackValue {
- double actualValue;
- double stackedValue;
- long lastUpdateTime;
- }
-
- public enum MODE {
- THROUGHPUT,
- ELASPED
- }
-
- class ChangeThroughput extends Action {
- ChangeThroughput () {
- setText("Throughput");
- setImageDescriptor(Activator.getImageDescriptor("/icons/counter/transaction.png"));
- }
-
- public void run() {
- changeMode(MODE.THROUGHPUT);
- }
- }
-
- class ChangeElasped extends Action {
- ChangeElasped () {
- setText("Elapsed Time");
- setImageDescriptor(Activator.getImageDescriptor("/icons/counter/time.png"));
- }
- public void run() {
- changeMode(MODE.ELASPED);
- }
- }
-}
+ * @https://github.com/scouter-project/scouter
+ *
+ * Licensed under the Apache 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
+ *
+ * http://www.apache.org/licenses/LICENSE-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 scouter.client.views;
+
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.csstudio.swt.xygraph.dataprovider.CircularBufferDataProvider;
+import org.csstudio.swt.xygraph.dataprovider.Sample;
+import org.csstudio.swt.xygraph.figures.Trace;
+import org.csstudio.swt.xygraph.figures.Trace.PointStyle;
+import org.csstudio.swt.xygraph.figures.Trace.TraceType;
+import org.csstudio.swt.xygraph.figures.XYGraph;
+import org.csstudio.swt.xygraph.linearscale.Range;
+import org.eclipse.draw2d.FigureCanvas;
+import org.eclipse.jface.window.DefaultToolTip;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ControlListener;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.PaletteData;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.part.ViewPart;
+
+import scouter.client.Images;
+import scouter.client.listeners.RangeMouseListener;
+import scouter.client.model.RefreshThread;
+import scouter.client.model.RefreshThread.Refreshable;
+import scouter.client.model.ServiceGroupColorManager;
+import scouter.client.util.ChartUtil;
+import scouter.client.util.ColorUtil;
+import scouter.client.util.ExUtil;
+import scouter.client.util.TimeUtil;
+import scouter.client.util.UIUtil;
+import scouter.lang.pack.MapPack;
+import scouter.lang.value.ListValue;
+import scouter.util.CastUtil;
+import scouter.util.DateUtil;
+import scouter.util.LinkedMap;
+
+public abstract class AbstractServiceGroupTPSView extends ViewPart implements Refreshable {
+
+ public final static String ID = AbstractServiceGroupTPSView.class.getName();
+
+ private final static int BUFFER_SIZE = 200;
+ protected RefreshThread thread;
+
+ protected XYGraph xyGraph;
+ protected FigureCanvas canvas;
+
+ protected Map traces = new HashMap();
+ private LinkedMap stackValueMap = new LinkedMap();
+
+ private int manualRangeCount;
+ private double manualY;
+
+ public void createPartControl(Composite parent) {
+ parent.setLayout(UIUtil.formLayout(0, 0));
+ canvas = new FigureCanvas(parent);
+ canvas.setScrollBarVisibility(FigureCanvas.NEVER);
+ canvas.setLayoutData(UIUtil.formData(0, 0, 0, 0, 100, 0, 100, 0));
+ canvas.setBackground(ColorUtil.getInstance().getColor(SWT.COLOR_WHITE));
+ canvas.addControlListener(new ControlListener() {
+ boolean lock = false;
+ public void controlResized(ControlEvent e) {
+ org.eclipse.swt.graphics.Rectangle r = canvas.getClientArea();
+ if (!lock) {
+ lock = true;
+ xyGraph.setSize(r.width, r.height);
+ lock = false;
+ }
+ }
+ public void controlMoved(ControlEvent e) {
+ }
+ });
+ final DefaultToolTip toolTip = new DefaultToolTip(canvas, DefaultToolTip.RECREATE, true);
+ toolTip.setFont(new Font(null, "Arial", 10, SWT.BOLD));
+ toolTip.setBackgroundColor(Display.getCurrent().getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+ canvas.addMouseListener(new MouseListener() {
+
+ String selectedName;
+
+ public void mouseUp(MouseEvent e) {
+ if (selectedName == null) {
+ return;
+ }
+ Trace trace = traces.get(selectedName);
+ trace.setTraceColor(ServiceGroupColorManager.getInstance().assignColor(selectedName));
+ toolTip.hide();
+ selectedName = null;
+ }
+ public void mouseDown(MouseEvent e) {
+ Image image = new Image(e.display, 1, 1);
+ GC gc = new GC((FigureCanvas)e.widget);
+ gc.copyArea(image, e.x, e.y);
+ ImageData imageData = image.getImageData();
+ PaletteData palette = imageData.palette;
+ int pixelValue = imageData.getPixel(0, 0);
+ RGB rgb = palette.getRGB(pixelValue);
+ selectedName = ServiceGroupColorManager.getInstance().getServiceGroup(rgb);
+ if (selectedName != null) {
+ Trace trace = traces.get(selectedName);
+ trace.setTraceColor(ColorUtil.getInstance().getColor("dark magenta"));
+ toolTip.setText(selectedName);
+ toolTip.show(new Point(e.x, e.y));
+ }
+ gc.dispose();
+ image.dispose();
+ }
+ public void mouseDoubleClick(MouseEvent e) {}
+ });
+ canvas.addKeyListener(new KeyListener() {
+ public void keyReleased(KeyEvent e) {
+ }
+
+ public void keyPressed(KeyEvent e) {
+ switch (e.keyCode) {
+ case 16777217:// UP Key
+ double max = xyGraph.primaryYAxis.getRange().getUpper();
+ if (max > 10000) {
+ manualY = max + 1000;
+ } else if (max > 1000) {
+ manualY = max + 100;
+ } else if (max > 100) {
+ manualY = max + 10;
+ } else if (max == 3) {
+ manualY = 5;
+ } else {
+ manualY = max + 5;
+ }
+ manualRangeCount = 5;
+ xyGraph.primaryYAxis.setRange(0, manualY);
+ break;
+ case 16777218: // DOWN Key
+ max = xyGraph.primaryYAxis.getRange().getUpper();
+ if (max > 10000) {
+ manualY = max - 1000;
+ } else if (max > 1000) {
+ manualY =max - 100;
+ } else if (max > 100) {
+ manualY =max - 10;
+ } else {
+ manualY = (max - 5) > 3 ? max -5 : 3;
+ }
+ manualRangeCount = 5;
+ xyGraph.primaryYAxis.setRange(0, manualY);
+ break;
+ }
+ }
+ });
+ xyGraph = new XYGraph();
+ xyGraph.setShowLegend(true);
+ xyGraph.setShowTitle(false);
+ canvas.setContents(xyGraph);
+ xyGraph.primaryXAxis.setDateEnabled(true);
+ xyGraph.primaryXAxis.setShowMajorGrid(true);
+ xyGraph.primaryYAxis.setAutoScale(true);
+ xyGraph.primaryYAxis.setShowMajorGrid(true);
+ xyGraph.primaryXAxis.setTitle("");
+ xyGraph.primaryYAxis.setTitle("");
+
+ xyGraph.primaryYAxis.addMouseListener(new RangeMouseListener(getViewSite().getShell(), xyGraph.primaryYAxis));
+ thread = new RefreshThread(this, 2000);
+ thread.start();
+ }
+
+ public void setFocus() {}
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ if (this.thread != null) {
+ this.thread.shutdown();
+ }
+ }
+
+ boolean stopRefresh = false;
+
+ public void refresh() {
+ if (stopRefresh) {
+ return;
+ }
+ MapPack m = fetch();
+ if (m == null) {
+ ExUtil.exec(canvas, new Runnable() {
+ public void run() {
+ setTitleImage(Images.inactive);
+ long now = TimeUtil.getCurrentTime();
+ xyGraph.primaryXAxis.setRange(now - DateUtil.MILLIS_PER_FIVE_MINUTE, now + 1);
+ }
+ });
+ return;
+ }
+ removeDeadGroup(m);
+ processThroughputData(m);
+ }
+
+ public abstract MapPack fetch();
+
+ private void removeDeadGroup(MapPack m) {
+ ListValue nameLv = m.getList("name");
+
+ ArrayList grpSet = new ArrayList();
+ Enumeration enu =stackValueMap.keys();
+ while(enu.hasMoreElements()){
+ grpSet.add(enu.nextElement());
+ }
+ for (int i = 0; i < nameLv.size(); i++) {
+ String name = nameLv.getString(i);
+ grpSet.remove(name);
+ }
+ for (String dead : grpSet) {
+ stackValueMap.remove(dead);
+ final Trace t = traces.get(dead);
+ if (t == null) continue;
+ ExUtil.exec(canvas, new Runnable() {
+ public void run() {
+ xyGraph.removeTrace(t);
+ }
+ });
+ traces.remove(dead);
+ }
+ }
+
+ private void processThroughputData(MapPack m) {
+ ListValue nameLv = m.getList("name");
+ ListValue countLv = m.getList("count");
+ final long now = m.getLong("time");
+ final long stime = now - DateUtil.MILLIS_PER_FIVE_MINUTE;
+ for (int i = 0; i < nameLv.size(); i++) {
+ String name = nameLv.getString(i);
+ double value = CastUtil.cdouble(countLv.get(i)) / 30.0d;
+ if (stackValueMap.containsKey(name)) {
+ StackValue sv = stackValueMap.get(name);
+ sv.actualValue = value;
+ sv.lastUpdateTime = now;
+ } else {
+ StackValue sv = new StackValue();
+ sv.actualValue = value;
+ sv.lastUpdateTime = now;
+ stackValueMap.putFirst(name, sv);
+ }
+ }
+ Enumeration itr = stackValueMap.keys();
+ final LinkedMap tempMap = new LinkedMap();
+ double stackValue = 0.0;
+ while (itr.hasMoreElements()) {
+ String name = itr.nextElement();
+ StackValue sv = stackValueMap.get(name);
+ if (sv.lastUpdateTime == now) {
+ stackValue += sv.actualValue;
+ sv.stackedValue = stackValue;
+ tempMap.putFirst(name, sv);
+ }
+ }
+ ExUtil.exec(canvas, new Runnable() {
+ public void run() {
+ setTitleImage(Images.active);
+ xyGraph.primaryXAxis.setRange(stime, now + 1);
+ Enumeration itr = tempMap.keys();
+ while (itr.hasMoreElements()) {
+ String name = itr.nextElement();
+ StackValue sv = tempMap.get(name);
+ CircularBufferDataProvider provider = (CircularBufferDataProvider) getTrace(name).getDataProvider();
+ provider.addSample(new Sample(now, sv.stackedValue));
+ }
+ xyGraph.primaryYAxis.setRange(0, getMaxValue());
+ }
+ });
+ }
+
+ private Trace getTrace(String name) {
+ Trace trace = traces.get(name);
+ if (trace == null) {
+ CircularBufferDataProvider provider = new CircularBufferDataProvider(true);
+ provider.setBufferSize(BUFFER_SIZE);
+ trace = new Trace(name, xyGraph.primaryXAxis, xyGraph.primaryYAxis, provider);
+ trace.setPointStyle(PointStyle.NONE);
+ trace.getXAxis().setFormatPattern("HH:mm:ss");
+ trace.getYAxis().setFormatPattern("#,##0");
+ trace.setTraceType(TraceType.AREA);
+ trace.setAreaAlpha(255);
+ trace.setTraceColor(ServiceGroupColorManager.getInstance().assignColor(name));
+ xyGraph.addTrace(trace);
+ traces.put(name, trace);
+ }
+ return trace;
+ }
+
+ private double getMaxValue() {
+ Range xRange = xyGraph.primaryXAxis.getRange();
+ double lower = xRange.getLower();
+ double upper = xRange.getUpper();
+ if (manualRangeCount > 0 && manualY > 0) {
+ manualRangeCount--;
+ return manualY;
+ }
+ double max = 0.0;
+ Iterator itr = traces.keySet().iterator();
+ while (itr.hasNext()) {
+ String name = itr.next();
+ CircularBufferDataProvider data = (CircularBufferDataProvider) traces.get(name).getDataProvider();
+ if (data != null) {
+ for (int inx = 0; inx < data.getSize(); inx++) {
+ Sample sample = (Sample) data.getSample(inx);
+ double x = sample.getXValue();
+ if(x < lower || x > upper) {
+ continue;
+ }
+ double y = sample.getYValue();
+ if (y > max) {
+ max = y;
+ }
+ }
+ }
+ }
+ return ChartUtil.getGroupMaxValue(max);
+ }
+
+ static class StackValue {
+ double actualValue;
+ double stackedValue;
+ long lastUpdateTime;
+ }
+}
diff --git a/scouter.client/src/scouter/client/views/CounterStackCommonView.java b/scouter.client/src/scouter/client/views/CounterStackCommonView.java
index beca1059f..57a0e421b 100644
--- a/scouter.client/src/scouter/client/views/CounterStackCommonView.java
+++ b/scouter.client/src/scouter/client/views/CounterStackCommonView.java
@@ -56,7 +56,7 @@
import scouter.client.util.ExUtil;
import scouter.client.util.TimeUtil;
import scouter.client.util.UIUtil;
-import scouter.client.views.ServiceGroupCommonView.StackValue;
+import scouter.client.views.AbstractServiceGroupTPSView.StackValue;
import scouter.lang.value.MapValue;
import scouter.util.CastUtil;
import scouter.util.DateUtil;
diff --git a/scouter.client/src/scouter/client/views/ServiceGroupElapsedView.java b/scouter.client/src/scouter/client/views/ServiceGroupElapsedView.java
new file mode 100644
index 000000000..a93b3a0c7
--- /dev/null
+++ b/scouter.client/src/scouter/client/views/ServiceGroupElapsedView.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2015 the original author or authors.
+ * @https://github.com/scouter-project/scouter
+ *
+ * Licensed under the Apache 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
+ *
+ * http://www.apache.org/licenses/LICENSE-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 scouter.client.views;
+
+import java.util.Map;
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IViewSite;
+import org.eclipse.ui.PartInitException;
+
+import scouter.client.model.AgentModelThread;
+import scouter.client.model.AgentObject;
+import scouter.client.net.TcpProxy;
+import scouter.client.server.Server;
+import scouter.client.server.ServerManager;
+import scouter.client.util.TimeUtil;
+import scouter.lang.pack.MapPack;
+import scouter.lang.pack.Pack;
+import scouter.lang.value.ListValue;
+import scouter.net.RequestCmd;
+
+public class ServiceGroupElapsedView extends AbstractServiceGroupElapsedView {
+
+ public final static String ID = ServiceGroupElapsedView.class.getName();
+
+ int serverId;
+ String objType;
+ String displayObjType;
+
+ public void init(IViewSite site) throws PartInitException {
+ super.init(site);
+ String secId = site.getSecondaryId();
+ String ids[] = secId.split("&");
+ serverId = Integer.valueOf(ids[0]);
+ objType = ids[1];
+ }
+
+ public void createPartControl(Composite parent) {
+ Server server = ServerManager.getInstance().getServer(serverId);
+ if (server != null ) displayObjType = server.getCounterEngine().getDisplayNameObjectType(objType);
+ this.setPartName("Service[Elapsed] - " + displayObjType);
+ super.createPartControl(parent);
+ }
+
+ public MapPack fetch() {
+ TcpProxy tcp = TcpProxy.getTcpProxy(serverId);
+ Pack pack = null;
+ try {
+ MapPack param = new MapPack();
+ ListValue objLv = param.newList("objHash");
+ Map agentMap = AgentModelThread.getInstance().getAgentObjectMap();
+ for (AgentObject p : agentMap.values()) {
+ if (p.getObjType().equals(objType)) {
+ objLv.add(p.getObjHash());
+ }
+ }
+ pack = tcp.getSingle(RequestCmd.REALTIME_SERVICE_GROUP, param);
+ } catch (Throwable th) {
+ th.printStackTrace();
+ } finally {
+ TcpProxy.putTcpProxy(tcp);
+ }
+ MapPack m = null;
+ if (pack != null) {
+ m = (MapPack) pack;
+ long time = TimeUtil.getCurrentTime(serverId);
+ m.put("time", time);
+ }
+ return m;
+ }
+}
diff --git a/scouter.client/src/scouter/client/views/ServiceGroupView.java b/scouter.client/src/scouter/client/views/ServiceGroupTPSView.java
similarity index 82%
rename from scouter.client/src/scouter/client/views/ServiceGroupView.java
rename to scouter.client/src/scouter/client/views/ServiceGroupTPSView.java
index 7b9d2f158..9d81d08d3 100644
--- a/scouter.client/src/scouter/client/views/ServiceGroupView.java
+++ b/scouter.client/src/scouter/client/views/ServiceGroupTPSView.java
@@ -1,99 +1,86 @@
-/*
+/*
* Copyright 2015 the original author or authors.
- * @https://github.com/scouter-project/scouter
- *
- * Licensed under the Apache 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
- *
- * http://www.apache.org/licenses/LICENSE-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 scouter.client.views;
-
-import java.util.Map;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.PartInitException;
-
-import scouter.client.model.AgentModelThread;
-import scouter.client.model.AgentObject;
-import scouter.client.net.TcpProxy;
-import scouter.client.server.Server;
-import scouter.client.server.ServerManager;
-import scouter.client.util.TimeUtil;
-import scouter.lang.pack.MapPack;
-import scouter.lang.pack.Pack;
-import scouter.lang.value.ListValue;
-import scouter.net.RequestCmd;
-
-public class ServiceGroupView extends ServiceGroupCommonView {
-
- public final static String ID = ServiceGroupView.class.getName();
-
- int serverId;
- String objType;
- String displayObjType;
-
- public void init(IViewSite site) throws PartInitException {
- super.init(site);
- String secId = site.getSecondaryId();
- String ids[] = secId.split("&");
- serverId = Integer.valueOf(ids[0]);
- objType = ids[1];
- }
-
- public void createPartControl(Composite parent) {
- Server server = ServerManager.getInstance().getServer(serverId);
- if (server != null ) displayObjType = server.getCounterEngine().getDisplayNameObjectType(objType);
- this.setPartName("Service[Throughput] - " + displayObjType);
- super.createPartControl(parent);
- }
-
- public MapPack fetch() {
- TcpProxy tcp = TcpProxy.getTcpProxy(serverId);
- Pack pack = null;
- try {
- MapPack param = new MapPack();
- ListValue objLv = param.newList("objHash");
- Map agentMap = AgentModelThread.getInstance().getAgentObjectMap();
- for (AgentObject p : agentMap.values()) {
- if (p.getObjType().equals(objType)) {
- objLv.add(p.getObjHash());
- }
- }
- pack = tcp.getSingle(RequestCmd.REALTIME_SERVICE_GROUP, param);
- } catch (Throwable th) {
- th.printStackTrace();
- } finally {
- TcpProxy.putTcpProxy(tcp);
- }
- MapPack m = null;
- if (pack != null) {
- m = (MapPack) pack;
- long time = TimeUtil.getCurrentTime(serverId);
- m.put("time", time);
- fiveMinMap.put(time, m);
- }
- return m;
- }
-
- @Override
- public void setTitleName(MODE mode) {
- switch (mode) {
- case THROUGHPUT:
- this.setPartName("Service[Throughput] - " + displayObjType);
- break;
- case ELASPED:
- this.setPartName("Service[Elapsed Time] - " + displayObjType);
- break;
- }
- }
-}
+ * @https://github.com/scouter-project/scouter
+ *
+ * Licensed under the Apache 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
+ *
+ * http://www.apache.org/licenses/LICENSE-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 scouter.client.views;
+
+import java.util.Map;
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IViewSite;
+import org.eclipse.ui.PartInitException;
+
+import scouter.client.model.AgentModelThread;
+import scouter.client.model.AgentObject;
+import scouter.client.net.TcpProxy;
+import scouter.client.server.Server;
+import scouter.client.server.ServerManager;
+import scouter.client.util.TimeUtil;
+import scouter.lang.pack.MapPack;
+import scouter.lang.pack.Pack;
+import scouter.lang.value.ListValue;
+import scouter.net.RequestCmd;
+
+public class ServiceGroupTPSView extends AbstractServiceGroupTPSView {
+
+ public final static String ID = ServiceGroupTPSView.class.getName();
+
+ int serverId;
+ String objType;
+ String displayObjType;
+
+ public void init(IViewSite site) throws PartInitException {
+ super.init(site);
+ String secId = site.getSecondaryId();
+ String ids[] = secId.split("&");
+ serverId = Integer.valueOf(ids[0]);
+ objType = ids[1];
+ }
+
+ public void createPartControl(Composite parent) {
+ Server server = ServerManager.getInstance().getServer(serverId);
+ if (server != null ) displayObjType = server.getCounterEngine().getDisplayNameObjectType(objType);
+ this.setPartName("Service[Throughput] - " + displayObjType);
+ super.createPartControl(parent);
+ }
+
+ public MapPack fetch() {
+ TcpProxy tcp = TcpProxy.getTcpProxy(serverId);
+ Pack pack = null;
+ try {
+ MapPack param = new MapPack();
+ ListValue objLv = param.newList("objHash");
+ Map agentMap = AgentModelThread.getInstance().getAgentObjectMap();
+ for (AgentObject p : agentMap.values()) {
+ if (p.getObjType().equals(objType)) {
+ objLv.add(p.getObjHash());
+ }
+ }
+ pack = tcp.getSingle(RequestCmd.REALTIME_SERVICE_GROUP, param);
+ } catch (Throwable th) {
+ th.printStackTrace();
+ } finally {
+ TcpProxy.putTcpProxy(tcp);
+ }
+ MapPack m = null;
+ if (pack != null) {
+ m = (MapPack) pack;
+ long time = TimeUtil.getCurrentTime(serverId);
+ m.put("time", time);
+ }
+ return m;
+ }
+}
diff --git a/scouter.common/pom.xml b/scouter.common/pom.xml
new file mode 100644
index 000000000..e28dd93d2
--- /dev/null
+++ b/scouter.common/pom.xml
@@ -0,0 +1,29 @@
+
+ 4.0.0
+
+ scouter
+ common
+ 1.0
+ jar
+ scouter-common
+
+
+ UTF-8
+
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+ org.assertj
+ assertj-core
+ 2.3.0
+ test
+
+
+
diff --git a/scouter.deploy/build-agent.host.xml b/scouter.deploy/build-agent.host.xml
index 18bca9d57..ce082f4ba 100644
--- a/scouter.deploy/build-agent.host.xml
+++ b/scouter.deploy/build-agent.host.xml
@@ -1,6 +1,6 @@
-
+
diff --git a/scouter.deploy/build-agent.java.xml b/scouter.deploy/build-agent.java.xml
index 0eb313d04..0282e0e69 100644
--- a/scouter.deploy/build-agent.java.xml
+++ b/scouter.deploy/build-agent.java.xml
@@ -1,6 +1,6 @@
-
+
diff --git a/scouter.deploy/build-common.xml b/scouter.deploy/build-common.xml
index 4654853de..c9b3e810c 100644
--- a/scouter.deploy/build-common.xml
+++ b/scouter.deploy/build-common.xml
@@ -1,6 +1,6 @@
-
+
diff --git a/scouter.document/img/main/live-demo-client-login.png b/scouter.document/img/main/live-demo-client-login.png
new file mode 100644
index 000000000..d133c30c8
Binary files /dev/null and b/scouter.document/img/main/live-demo-client-login.png differ
diff --git a/scouter.document/main/Live-Demo.md b/scouter.document/main/Live-Demo.md
new file mode 100644
index 000000000..6cb6053da
--- /dev/null
+++ b/scouter.document/main/Live-Demo.md
@@ -0,0 +1,14 @@
+# Quick Start
+ [](Live-Demo_kr.md)
+
+There is pre-built scouter live demo system that you can connect to.
+Try to do via scouter client v0.4.6 and you can download the client by the link below.
+
+1. [Download Client(Viewer)](https://github.com/scouter-project/scouter/releases/tag/v0.4.6)
+2. Extract the compressed file you downloaded, run the client and connect to the live demo server by the given information.
+ - Server server address : demo.scouterapm.com:6100
+ - ID : scouter
+ - Password : scouter
+
+
+
diff --git a/scouter.document/main/Live-Demo_kr.md b/scouter.document/main/Live-Demo_kr.md
new file mode 100644
index 000000000..4db7ad3f7
--- /dev/null
+++ b/scouter.document/main/Live-Demo_kr.md
@@ -0,0 +1,16 @@
+# Quick Start
+[](Live-Demo.md) 
+
+Scouter를 바로 사용해 볼 수 있도록 Live 데모 시스템이 구성되어 있으며
+클라이언트만 다운로드 하여 접속해 볼 수 있다
+
+현재 Live 데모 시스템은 v0.4.6으로 구성되어 있으므로 v0.4.6 클라이언트로 접속하여 볼 수 있다
+
+1. [Client(Viewer) 다운로드](https://github.com/scouter-project/scouter/releases/tag/v0.4.6)
+2. Client 실행하고 아래 정보를 입력하여 Scouter 데모 서버로 접속한다.
+ - Server 주소 : demo.scouterapm.com:6100
+ - ID : scouter
+ - Password : scouter
+
+
+
diff --git a/scouter.server/src/scouter/server/core/AgentManager.scala b/scouter.server/src/scouter/server/core/AgentManager.scala
index 4d8f8bcd1..8447a134f 100644
--- a/scouter.server/src/scouter/server/core/AgentManager.scala
+++ b/scouter.server/src/scouter/server/core/AgentManager.scala
@@ -81,15 +81,12 @@ object AgentManager {
objPack.wakeup();
objPack.tags = p.tags;
if (CompareUtil.equals(p.address, objPack.address) == false) {
- objPack.address = p.address;
save = true;
}
if (CompareUtil.equals(p.objType, objPack.objType) == false) {
- objPack.objType = p.objType;
save = true;
}
if (CompareUtil.equals(p.version, objPack.version) == false) {
- objPack.version = p.version;
save = true;
}
if (save) {
@@ -97,11 +94,12 @@ object AgentManager {
if (objPack.updated % 20 == 0) {
alertTooManyChange(objPack);
}
-
- objMap.put(objPack);
- procObjName(objPack);
- ObjectWR.add(objPack);
- Logger.println("S105", "Update " + objPack);
+ p.updated = objPack.updated;
+ p.wakeup();
+ objMap.put(p);
+ procObjName(p);
+ ObjectWR.add(p);
+ Logger.println("S105", "Update " + p);
}
}
}
diff --git a/scouter.server/src/scouter/server/core/AutoDeleteScheduler.java b/scouter.server/src/scouter/server/core/AutoDeleteScheduler.java
index 24360edb2..260d7cf5c 100644
--- a/scouter.server/src/scouter/server/core/AutoDeleteScheduler.java
+++ b/scouter.server/src/scouter/server/core/AutoDeleteScheduler.java
@@ -119,7 +119,7 @@ private void deleteData(String yyyymmdd) {
f = new File(dbDir, yyyymmdd);
}
deleteFiles(f);
- Logger.println("S206", yyyymmdd);
+ Logger.println("S206", "Auto deletion... " + yyyymmdd);
} catch (Throwable th) {
Logger.println("S207", "Failed auto deletion... " + yyyymmdd + " " + th.toString());
}
diff --git a/scouter.server/src/scouter/server/db/RealtimeCounterWR.scala b/scouter.server/src/scouter/server/db/RealtimeCounterWR.scala
index 80fc8c40a..65580255e 100644
--- a/scouter.server/src/scouter/server/db/RealtimeCounterWR.scala
+++ b/scouter.server/src/scouter/server/db/RealtimeCounterWR.scala
@@ -43,7 +43,6 @@ object RealtimeCounterWR {
}
wdb.activeTime = System.currentTimeMillis();
wdb.counterDbHeader.intern(m.data.keySet());
- PlugInManager.counter(m);
val tagbytes = RealtimeCounterDBHelper.getTagBytes(wdb.counterDbHeader.getTagStrInt(), m.data)
val posTags = wdb.counterData.write(tagbytes);
wdb.counterIndex.write(HashUtil.hash(m.objName), m.time, posTags);
diff --git a/touchfile b/touchfile
new file mode 100644
index 000000000..e69de29bb