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 +![Englsh](https://img.shields.io/badge/language-English-red.svg) [![Korean](https://img.shields.io/badge/language-Korean-blue.svg)](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 + +![login](../img/main/live-demo-client-login.png) + 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 +[![Englsh](https://img.shields.io/badge/language-English-red.svg)](Live-Demo.md) ![Korean](https://img.shields.io/badge/language-Korean-blue.svg) + +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 + +![login](../img/main/live-demo-client-login.png) + 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