From b1da84bad6ff4c1e3c785f4f92ba2186171af6cb Mon Sep 17 00:00:00 2001 From: Tim Middleton Date: Tue, 12 Mar 2024 14:31:27 +0800 Subject: [PATCH 1/2] Finalize tracer probes --- README.md | 39 +---- assets/probes-caches.png | Bin 17010 -> 0 bytes assets/probes-cluster-overview.png | Bin 41369 -> 0 bytes assets/probes-elastic-data.png | Bin 28003 -> 0 bytes assets/probes-federation.png | Bin 32062 -> 0 bytes assets/probes-persistence.png | Bin 25159 -> 0 bytes assets/probes-proxies.png | Bin 17330 -> 0 bytes assets/probes-services.png | Bin 27372 -> 0 bytes .../plugin/visualvm/VisualVMInstaller.java | 2 + .../visualvm/panel/CoherenceServicePanel.java | 3 +- .../tracer/AbstractCoherenceMonitorProbe.java | 93 ++++++++++ .../tracer/cluster/ClusterSizeProbe.java | 2 +- .../SelectedServiceMonitorPackage.java | 164 ++++++++++++++++++ .../SelectedServicePartitionsProbe.java | 110 ++++++++++++ .../SelectedServiceRequestAverageProbe.java | 88 ++++++++++ .../SelectedServiceTaskAverageProbe.java | 88 ++++++++++ .../SelectedServiceTaskBackLogProbe.java | 82 +++++++++ .../SelectedServiceThreadCountProbe.java | 86 +++++++++ ...SelectedServiceThreadUtilizationProbe.java | 82 +++++++++ .../tracer/service/ServiceMonitorPackage.java | 2 +- .../plugin/visualvm/Bundle.properties | 30 +++- 21 files changed, 821 insertions(+), 50 deletions(-) delete mode 100644 assets/probes-caches.png delete mode 100644 assets/probes-cluster-overview.png delete mode 100644 assets/probes-elastic-data.png delete mode 100644 assets/probes-federation.png delete mode 100644 assets/probes-persistence.png delete mode 100644 assets/probes-proxies.png delete mode 100644 assets/probes-services.png create mode 100644 coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceMonitorPackage.java create mode 100644 coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServicePartitionsProbe.java create mode 100644 coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceRequestAverageProbe.java create mode 100644 coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceTaskAverageProbe.java create mode 100644 coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceTaskBackLogProbe.java create mode 100644 coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceThreadCountProbe.java create mode 100644 coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceThreadUtilizationProbe.java diff --git a/README.md b/README.md index 02380ab..0b0ba46 100644 --- a/README.md +++ b/README.md @@ -206,44 +206,7 @@ From the VisualVM website When you connect to a cluster via JMX, you will see the `Tracer` tab as shown below: -   ![Coherence VisualVM Probes](assets/probes.png) - -Each of the probes areas can be expanded to reveal the individual probes. You can select the probes and then -click `Start` to display the information. - -The supported Coherence probes are: - -*Cluster Overview* - -    ![Cluster Overview](assets/probes-cluster-overview.png) - -*Services* - -    ![Cluster Overview](assets/probes-services.png) - -*Caches* - -    ![Caches](assets/probes-caches.png) - -*Proxy Servers* - -    ![Proxy Servers](assets/probes-proxies.png) - -*Persistence* - -    ![Persistence](assets/probes-persistence.png) - -*Federation* - -    ![Federation](assets/probes-federation.png) - -*Elastic Data* - -    ![elastic Data](assets/probes-elastic-data.png) - -> Note: In the initial release of this integration, only summary information can to be plotted. We may include -> additional functionality in future releases to allow for specific services or caches to be monitored. -> There are no timelines for these releases. If you would like specific information included, please raise an issue. +TBC. ## Building the Plugin diff --git a/assets/probes-caches.png b/assets/probes-caches.png deleted file mode 100644 index 586069ecfb3476425960d3564be453e64c8e6eb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17010 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 N<)oFRN+gW^{trJ#NRj{m diff --git a/assets/probes-persistence.png b/assets/probes-persistence.png deleted file mode 100644 index 6b0022f41039be488ad46fee631330107dd287ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25159 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 z 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 diff --git a/assets/probes-services.png b/assets/probes-services.png deleted file mode 100644 index 40dd014c95b6861b41ad2c8c102a856f056efa44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27372 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 diff --git a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/VisualVMInstaller.java b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/VisualVMInstaller.java index a4315c3..b6484bd 100644 --- a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/VisualVMInstaller.java +++ b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/VisualVMInstaller.java @@ -36,6 +36,7 @@ import com.oracle.coherence.plugin.visualvm.tracer.federation.FederationMonitorPackage; import com.oracle.coherence.plugin.visualvm.tracer.persistence.PersistenceMonitorPackage; import com.oracle.coherence.plugin.visualvm.tracer.proxy.ProxyMonitorPackage; +import com.oracle.coherence.plugin.visualvm.tracer.service.SelectedServiceMonitorPackage; import com.oracle.coherence.plugin.visualvm.tracer.service.ServiceMonitorPackage; import org.graalvm.visualvm.application.Application; @@ -120,6 +121,7 @@ public TracerPackage[] getPackages(Application application) new ClusterMonitorPackage(application), new ProxyMonitorPackage(application), new ServiceMonitorPackage(application), + new SelectedServiceMonitorPackage(application), new CacheMonitorPackage(application), new FederationMonitorPackage(application), new ElasticDataMonitorPackage(application), diff --git a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/panel/CoherenceServicePanel.java b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/panel/CoherenceServicePanel.java index 25ab066..36ea07e 100755 --- a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/panel/CoherenceServicePanel.java +++ b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/panel/CoherenceServicePanel.java @@ -288,11 +288,10 @@ public void updateData() // only include task averages where there is a thread count if (cThread > 0) { - // update values for taks average duration + // update values for task average duration cTotalTaskAverage++; cAverage = (Float) entry.getValue().getColumn(ServiceMemberData.TASK_AVERAGE_DURATION); - nTotalTaskAverage += cAverage; if (cAverage > nMaxTaskAverage) diff --git a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/AbstractCoherenceMonitorProbe.java b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/AbstractCoherenceMonitorProbe.java index d7b997c..1440cc8 100644 --- a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/AbstractCoherenceMonitorProbe.java +++ b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/AbstractCoherenceMonitorProbe.java @@ -27,6 +27,7 @@ import com.oracle.coherence.plugin.visualvm.Localization; import com.oracle.coherence.plugin.visualvm.VisualVMModel; import com.oracle.coherence.plugin.visualvm.tablemodel.model.Data; +import com.oracle.coherence.plugin.visualvm.tablemodel.model.ServiceMemberData; import javax.swing.Icon; import javax.swing.ImageIcon; import org.graalvm.visualvm.application.Application; @@ -176,6 +177,98 @@ protected long[] getSingValueMax(VisualVMModel model, VisualVMModel.DataType dat return new long[] {nMax}; } + /** + * Returns the total and idle threads for the selected service. + * @param model the {@link VisualVMModel} to use + * + * @return the tracer result + * 0: Integer - total thread count + * 1: Integer - total idle threads + */ + protected Object[] getSelectedServiceThreadValues(VisualVMModel model) + { + List> data = model.getData(VisualVMModel.DataType.SERVICE_DETAIL); + int nTotalThreadCount = 0; + int nTotalIdleThreads = 0; + + if (data != null && !data.isEmpty()) + { + for (Map.Entry entry : data) + { + nTotalThreadCount += (Integer) entry.getValue().getColumn(ServiceMemberData.THREAD_COUNT); + nTotalIdleThreads += (Integer) entry.getValue().getColumn(ServiceMemberData.THREAD_IDLE_COUNT); + } + } + + return new Object[] {nTotalThreadCount, nTotalIdleThreads}; + } + + /** + * Returns the max and average value for a selected service. + * + * @param model the {@link VisualVMModel} to use + * @param nColumn the column to extract + * + * @return the tracer result (multiplied byt 1000) + * 0: Long - Max + * 1: Long - Average + */ + protected Long[] getSelectedServiceMaxAndAverage(VisualVMModel model, int nColumn) + { + List> data = model.getData(VisualVMModel.DataType.SERVICE_DETAIL); + + long nTotal = 0L; + long nMax = 0L; + long nCount = 0L; + long nCurrent = 0L; + + if (data != null && !data.isEmpty()) + { + for (Map.Entry entry : data) + { + nCurrent = (long) ((Float) entry.getValue().getColumn(nColumn) * 1000L); + if (nCurrent <= 0) + { + // exclude negative values + continue; + } + nCount++; + nTotal += nCurrent; + if (nCurrent > nMax) + { + nMax = nCurrent; + } + } + } + + return nCount == 0L ? new Long[] {0L,0L} : new Long[] {nMax, nTotal / nCount}; + } + + /** + * Returns the mtotal value for a selected service. + * + * @param model the {@link VisualVMModel} to use + * @param nColumn the column to extract + * + * @return the tracer result + */ + protected long getSelectedServiceTotalInteger(VisualVMModel model, int nColumn) + { + List> data = model.getData(VisualVMModel.DataType.SERVICE_DETAIL); + + int nTotal = 0; + + if (data != null && !data.isEmpty()) + { + for (Map.Entry entry : data) + { + nTotal += (Integer) entry.getValue().getColumn(nColumn); + } + } + + return nTotal; + } + // ----- data members --------------------------------------------------- private final MonitoredDataResolver f_resolver; diff --git a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/cluster/ClusterSizeProbe.java b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/cluster/ClusterSizeProbe.java index 3ad7aea..ba250b7 100644 --- a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/cluster/ClusterSizeProbe.java +++ b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/cluster/ClusterSizeProbe.java @@ -53,7 +53,7 @@ public class ClusterSizeProbe public ClusterSizeProbe(MonitoredDataResolver resolver) { - super(12, createItemDescriptors(), resolver); + super(2, createItemDescriptors(), resolver); } // ---- TracerProbe methods --------------------------------------------- diff --git a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceMonitorPackage.java b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceMonitorPackage.java new file mode 100644 index 0000000..3d5570a --- /dev/null +++ b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceMonitorPackage.java @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.oracle.coherence.plugin.visualvm.tracer.service; + +import static com.oracle.coherence.plugin.visualvm.tracer.AbstractCoherenceMonitorProbe.ICON; + +import com.oracle.coherence.plugin.visualvm.Localization; +import com.oracle.coherence.plugin.visualvm.VisualVMModel; +import com.oracle.coherence.plugin.visualvm.VisualVMView; + +import com.oracle.coherence.plugin.visualvm.tracer.AbstractCoherenceMonitorProbe; + +import org.graalvm.visualvm.application.Application; + +import org.graalvm.visualvm.modules.tracer.TracerPackage; +import org.graalvm.visualvm.modules.tracer.TracerProbe; +import org.graalvm.visualvm.modules.tracer.TracerProbeDescriptor; + + +/** + * A {@link TracerPackage} to show service related probes for the currently selected service. + * + * @author tam 2024.03.12 + */ +public class SelectedServiceMonitorPackage + extends TracerPackage implements AbstractCoherenceMonitorProbe.MonitoredDataResolver { + + public SelectedServiceMonitorPackage(Application application) + { + super(NAME, DESCR, ICON, POSITION); + this.f_model = VisualVMView.getModelForApplication(application); + } + + // ---- TracerPackage methods ------------------------------------------- + + @Override + public TracerProbeDescriptor[] getProbeDescriptors() { + m_threadCountProbeDescriptor = SelectedServiceThreadCountProbe.createDescriptor(f_model != null); + m_threadUtilProbeDescriptor = SelectedServiceThreadUtilizationProbe.createDescriptor(f_model != null); + m_taskAverageProbeDescriptor = SelectedServiceTaskAverageProbe.createDescriptor(f_model != null); + m_requestAverageProbeDescriptor = SelectedServiceRequestAverageProbe.createDescriptor(f_model != null); + m_taskBacklogProbeDescriptor = SelectedServiceTaskBackLogProbe.createDescriptor(f_model != null); + m_partitionsProbeDescriptor = SelectedServicePartitionsProbe.createDescriptor(f_model != null); + + return new TracerProbeDescriptor[] { + m_threadCountProbeDescriptor, + m_threadUtilProbeDescriptor, + m_taskAverageProbeDescriptor, + m_requestAverageProbeDescriptor, + m_taskBacklogProbeDescriptor, + m_partitionsProbeDescriptor + }; + } + + @Override + public TracerProbe getProbe(TracerProbeDescriptor descriptor) + { + if (descriptor == m_threadCountProbeDescriptor) + { + if (m_threadCountProbe == null) + { + m_threadCountProbe = new SelectedServiceThreadCountProbe(this); + } + return m_threadCountProbe; + } + else if (descriptor == m_threadUtilProbeDescriptor) + { + if (m_threadUtilProbe == null) + { + m_threadUtilProbe = new SelectedServiceThreadUtilizationProbe(this); + } + return m_threadUtilProbe; + } + else if (descriptor == m_taskAverageProbeDescriptor) + { + if (m_taskAverageProbe == null) + { + m_taskAverageProbe = new SelectedServiceTaskAverageProbe(this); + } + return m_taskAverageProbe; + } + else if (descriptor == m_requestAverageProbeDescriptor) + { + if (m_requestAverageProbe == null) + { + m_requestAverageProbe = new SelectedServiceRequestAverageProbe(this); + } + return m_requestAverageProbe; + } + else if (descriptor == m_taskBacklogProbeDescriptor) + { + if (m_taskBacklogProbe == null) + { + m_taskBacklogProbe = new SelectedServiceTaskBackLogProbe(this); + } + return m_taskBacklogProbe; + } + else if (descriptor == m_partitionsProbeDescriptor) + { + if (m_partitionsProbe == null) + { + m_partitionsProbe = new SelectedServicePartitionsProbe(this); + } + return m_partitionsProbe; + } + else + { + return null; + } + } + + // ---- AbstractCoherenceMonitorProbe.MonitoredDataResolver interface --- + + @Override + public VisualVMModel getMonitoredData() + { + return f_model; + } + + // ----- constants ------------------------------------------------------ + + private static final String NAME = Localization.getLocalText("LBL_selected_service_probe"); + private static final String DESCR = Localization.getLocalText("LBL_selected_service_probe_description"); + private static final int POSITION = 20506; + + private TracerProbeDescriptor m_threadCountProbeDescriptor; + private TracerProbeDescriptor m_threadUtilProbeDescriptor; + private TracerProbeDescriptor m_taskAverageProbeDescriptor; + private TracerProbeDescriptor m_requestAverageProbeDescriptor; + private TracerProbeDescriptor m_taskBacklogProbeDescriptor; + private TracerProbeDescriptor m_partitionsProbeDescriptor; + + private AbstractCoherenceMonitorProbe m_threadCountProbe; + private AbstractCoherenceMonitorProbe m_threadUtilProbe; + private AbstractCoherenceMonitorProbe m_taskAverageProbe; + private AbstractCoherenceMonitorProbe m_requestAverageProbe; + private AbstractCoherenceMonitorProbe m_taskBacklogProbe; + private AbstractCoherenceMonitorProbe m_partitionsProbe; + + private final VisualVMModel f_model; + } diff --git a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServicePartitionsProbe.java b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServicePartitionsProbe.java new file mode 100644 index 0000000..2bba28d --- /dev/null +++ b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServicePartitionsProbe.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.oracle.coherence.plugin.visualvm.tracer.service; + +import com.oracle.coherence.plugin.visualvm.Localization; +import com.oracle.coherence.plugin.visualvm.VisualVMModel; + +import com.oracle.coherence.plugin.visualvm.tablemodel.model.Data; +import com.oracle.coherence.plugin.visualvm.tablemodel.model.ServiceData; + +import com.oracle.coherence.plugin.visualvm.tracer.AbstractCoherenceMonitorProbe; + +import org.graalvm.visualvm.modules.tracer.ItemValueFormatter; +import org.graalvm.visualvm.modules.tracer.ProbeItemDescriptor; +import org.graalvm.visualvm.modules.tracer.TracerProbeDescriptor; +import java.util.Map; + +/** + * Tracer probe to return the partition information for the currently selected service. + * + * @author tam 2024.03.12 + */ +public class SelectedServicePartitionsProbe + extends AbstractCoherenceMonitorProbe + { + // ----- constructors --------------------------------------------------- + + public SelectedServicePartitionsProbe(MonitoredDataResolver resolver) + { + super(4, createItemDescriptors(), resolver); + } + + // ---- TracerProbe methods --------------------------------------------- + + @Override + public long[] getValues(VisualVMModel model) + { + String sSelectedService = model.getSelectedService(); + + for (Map.Entry entry : model.getData(VisualVMModel.DataType.SERVICE)) + { + // get the service details for the selected service + if (entry.getKey().equals(sSelectedService)) + { + return new long[]{ + (Integer) entry.getValue().getColumn(ServiceData.PARTITIONS_ENDANGERED), + (Integer) entry.getValue().getColumn(ServiceData.PARTITIONS_VULNERABLE), + (Integer) entry.getValue().getColumn(ServiceData.PARTITIONS_UNBALANCED), + (Integer) entry.getValue().getColumn(ServiceData.REQUESTS_PENDING) + }; + } + } + return new long[] {0L, 0L, 0L, 0L}; + } + + public static TracerProbeDescriptor createDescriptor(boolean available) + { + return new TracerProbeDescriptor(Localization.getLocalText("LBL_selected_service_partitions"), + Localization.getLocalText("LBL_selected_service_partitions_desc"), ICON, 30, available); + } + + private static ProbeItemDescriptor[] createItemDescriptors() + { + return new ProbeItemDescriptor[] + { + ProbeItemDescriptor.continuousLineFillItem(Localization.getLocalText(LBL1), + getMonitorsString(LBL1), ItemValueFormatter.DEFAULT_DECIMAL, + 1d, 0, 1), + ProbeItemDescriptor.continuousLineFillItem(Localization.getLocalText(LBL2), + getMonitorsString(LBL2), ItemValueFormatter.DEFAULT_DECIMAL, + 1d, 0, 1), + ProbeItemDescriptor.continuousLineFillItem(Localization.getLocalText(LBL3), + getMonitorsString(LBL3), ItemValueFormatter.DEFAULT_DECIMAL, + 1d, 0, 1), + ProbeItemDescriptor.continuousLineFillItem(Localization.getLocalText(LBL4), + getMonitorsString(LBL4), ItemValueFormatter.DEFAULT_DECIMAL, + 1d, 0, 1) + }; + } + + // ----- constants ------------------------------------------------------ + + private static final String LBL1 = "LBL_endangered"; + private static final String LBL2 = "LBL_vulnerable"; + private static final String LBL3 = "LBL_unbalanced"; + private static final String LBL4 = "LBL_pending"; + } diff --git a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceRequestAverageProbe.java b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceRequestAverageProbe.java new file mode 100644 index 0000000..248614a --- /dev/null +++ b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceRequestAverageProbe.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.oracle.coherence.plugin.visualvm.tracer.service; + +import com.oracle.coherence.plugin.visualvm.Localization; +import com.oracle.coherence.plugin.visualvm.VisualVMModel; + +import com.oracle.coherence.plugin.visualvm.tablemodel.model.ServiceMemberData; + +import com.oracle.coherence.plugin.visualvm.tracer.AbstractCoherenceMonitorProbe; + +import com.oracle.coherence.plugin.visualvm.tracer.CustomFormatter; + +import org.graalvm.visualvm.modules.tracer.ProbeItemDescriptor; +import org.graalvm.visualvm.modules.tracer.TracerProbeDescriptor; + +/** + * Tracer probe to return the maximum and average request average for the currently selected service. + * + * @author tam 2024.03.12 + */ +public class SelectedServiceRequestAverageProbe + extends AbstractCoherenceMonitorProbe + { + // ----- constructors --------------------------------------------------- + + public SelectedServiceRequestAverageProbe(MonitoredDataResolver resolver) + { + super(2, createItemDescriptors(), resolver); + } + + // ---- TracerProbe methods --------------------------------------------- + + @Override + public long[] getValues(VisualVMModel model) + { + Long[] aoResults = getSelectedServiceMaxAndAverage(model, ServiceMemberData.REQUEST_AVERAGE_DURATION); + + return new long[]{aoResults[0], aoResults[1]}; + } + + public static TracerProbeDescriptor createDescriptor(boolean available) + { + return new TracerProbeDescriptor(Localization.getLocalText("LBL_selected_service_request_avg"), + Localization.getLocalText("LBL_selected_service_request_avg_desc"), ICON, 20, available); + } + + private static ProbeItemDescriptor[] createItemDescriptors() + { + return new ProbeItemDescriptor[] + { + ProbeItemDescriptor.continuousLineFillItem(Localization.getLocalText(LBL), + getMonitorsString(LBL), new CustomFormatter(1000, "ms"), + 1000d, 0, 1), + ProbeItemDescriptor.continuousLineFillItem(Localization.getLocalText(LBL2), + getMonitorsString(LBL2), new CustomFormatter(1000, "ms"), + 1000d, 0, 1), + }; + } + + // ----- constants ------------------------------------------------------ + + private static final String LBL = "GRPH_current_maximum"; + private static final String LBL2 = "GRPH_current_average"; + } diff --git a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceTaskAverageProbe.java b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceTaskAverageProbe.java new file mode 100644 index 0000000..9b8813b --- /dev/null +++ b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceTaskAverageProbe.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.oracle.coherence.plugin.visualvm.tracer.service; + +import com.oracle.coherence.plugin.visualvm.Localization; +import com.oracle.coherence.plugin.visualvm.VisualVMModel; + +import com.oracle.coherence.plugin.visualvm.tablemodel.model.ServiceMemberData; + +import com.oracle.coherence.plugin.visualvm.tracer.AbstractCoherenceMonitorProbe; + +import com.oracle.coherence.plugin.visualvm.tracer.CustomFormatter; + +import org.graalvm.visualvm.modules.tracer.ProbeItemDescriptor; +import org.graalvm.visualvm.modules.tracer.TracerProbeDescriptor; + +/** + * Tracer probe to return the maximum and average task average for the currently selected service. + * + * @author tam 2024.03.12 + */ +public class SelectedServiceTaskAverageProbe + extends AbstractCoherenceMonitorProbe + { + // ----- constructors --------------------------------------------------- + + public SelectedServiceTaskAverageProbe(MonitoredDataResolver resolver) + { + super(2, createItemDescriptors(), resolver); + } + + // ---- TracerProbe methods --------------------------------------------- + + @Override + public long[] getValues(VisualVMModel model) + { + Long[] aoResults = getSelectedServiceMaxAndAverage(model, ServiceMemberData.TASK_AVERAGE_DURATION); + + return new long[]{aoResults[0], aoResults[1]}; + } + + public static TracerProbeDescriptor createDescriptor(boolean available) + { + return new TracerProbeDescriptor(Localization.getLocalText("LBL_selected_service_task_avg"), + Localization.getLocalText("LBL_selected_service_task_avg_desc"), ICON, 15, available); + } + + private static ProbeItemDescriptor[] createItemDescriptors() + { + return new ProbeItemDescriptor[] + { + ProbeItemDescriptor.continuousLineFillItem(Localization.getLocalText(LBL), + getMonitorsString(LBL), new CustomFormatter(1000, "ms"), + 1000d, 0, 1), + ProbeItemDescriptor.continuousLineFillItem(Localization.getLocalText(LBL2), + getMonitorsString(LBL2), new CustomFormatter(1000, "ms"), + 1000d, 0, 1), + }; + } + + // ----- constants ------------------------------------------------------ + + private static final String LBL = "GRPH_current_maximum"; + private static final String LBL2 = "GRPH_current_average"; + } diff --git a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceTaskBackLogProbe.java b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceTaskBackLogProbe.java new file mode 100644 index 0000000..2aaf5a7 --- /dev/null +++ b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceTaskBackLogProbe.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.oracle.coherence.plugin.visualvm.tracer.service; + +import com.oracle.coherence.plugin.visualvm.Localization; +import com.oracle.coherence.plugin.visualvm.VisualVMModel; + +import com.oracle.coherence.plugin.visualvm.tablemodel.model.ServiceMemberData; + +import com.oracle.coherence.plugin.visualvm.tracer.AbstractCoherenceMonitorProbe; + +import org.graalvm.visualvm.modules.tracer.ItemValueFormatter; + +import org.graalvm.visualvm.modules.tracer.ProbeItemDescriptor; +import org.graalvm.visualvm.modules.tracer.TracerProbeDescriptor; + +/** + * Tracer probe to return the total task backlog for the currently selected service. + * + * @author tam 2024.03.12 + */ +public class SelectedServiceTaskBackLogProbe + extends AbstractCoherenceMonitorProbe + { + // ----- constructors --------------------------------------------------- + + public SelectedServiceTaskBackLogProbe(MonitoredDataResolver resolver) + { + super(1, createItemDescriptors(), resolver); + } + + // ---- TracerProbe methods --------------------------------------------- + + @Override + public long[] getValues(VisualVMModel model) + { + return new long[] {getSelectedServiceTotalInteger(model, ServiceMemberData.TASK_BACKLOG)}; + } + + public static TracerProbeDescriptor createDescriptor(boolean available) + { + return new TracerProbeDescriptor(Localization.getLocalText("LBL_selected_service_task_backlog"), + Localization.getLocalText("LBL_selected_service_task_backlog_desc"), ICON, 25, available); + } + + private static ProbeItemDescriptor[] createItemDescriptors() + { + return new ProbeItemDescriptor[] + { + ProbeItemDescriptor.continuousLineFillItem(Localization.getLocalText(LBL), + getMonitorsString(LBL), ItemValueFormatter.DEFAULT_DECIMAL, + 1d, 0, 1) + }; + } + + // ----- constants ------------------------------------------------------ + + private static final String LBL = "LBL_task_backlog"; + } diff --git a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceThreadCountProbe.java b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceThreadCountProbe.java new file mode 100644 index 0000000..6800916 --- /dev/null +++ b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceThreadCountProbe.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.oracle.coherence.plugin.visualvm.tracer.service; + +import com.oracle.coherence.plugin.visualvm.Localization; +import com.oracle.coherence.plugin.visualvm.VisualVMModel; + +import com.oracle.coherence.plugin.visualvm.tracer.AbstractCoherenceMonitorProbe; + +import org.graalvm.visualvm.modules.tracer.ItemValueFormatter; + +import org.graalvm.visualvm.modules.tracer.ProbeItemDescriptor; +import org.graalvm.visualvm.modules.tracer.TracerProbeDescriptor; + +/** + * Tracer probe to return the total and idle threads for the selected service. + * + * @author tam 2024.03.12 + */ +public class SelectedServiceThreadCountProbe + extends AbstractCoherenceMonitorProbe + { + // ----- constructors --------------------------------------------------- + + public SelectedServiceThreadCountProbe(MonitoredDataResolver resolver) + { + super(2, createItemDescriptors(), resolver); + } + + // ---- TracerProbe methods --------------------------------------------- + + @Override + public long[] getValues(VisualVMModel model) + { + Object[] aoResults = getSelectedServiceThreadValues(model); + + return new long[]{(Integer) aoResults[0], (Integer) aoResults[1]}; + } + + public static TracerProbeDescriptor createDescriptor(boolean available) + { + return new TracerProbeDescriptor(Localization.getLocalText("LBL_selected_service_thread_count"), + Localization.getLocalText("LBL_selected_service_desc"), ICON, 5, available); + } + + private static ProbeItemDescriptor[] createItemDescriptors() + { + return new ProbeItemDescriptor[] + { + ProbeItemDescriptor.continuousLineFillItem(Localization.getLocalText(LBL), + getMonitorsString(LBL), ItemValueFormatter.DEFAULT_DECIMAL, + 1d, 0, 1), + ProbeItemDescriptor.continuousLineFillItem(Localization.getLocalText(LBL2), + getMonitorsString(LBL2), ItemValueFormatter.DEFAULT_DECIMAL, + 1d, 0, 1), + }; + } + + // ----- constants ------------------------------------------------------ + + private static final String LBL = "LBL_total_threads"; + private static final String LBL2 = "LBL_total_idle"; + } diff --git a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceThreadUtilizationProbe.java b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceThreadUtilizationProbe.java new file mode 100644 index 0000000..ecb65b5 --- /dev/null +++ b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceThreadUtilizationProbe.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.oracle.coherence.plugin.visualvm.tracer.service; + +import com.oracle.coherence.plugin.visualvm.Localization; +import com.oracle.coherence.plugin.visualvm.VisualVMModel; +import com.oracle.coherence.plugin.visualvm.tracer.AbstractCoherenceMonitorProbe; +import org.graalvm.visualvm.modules.tracer.ItemValueFormatter; +import org.graalvm.visualvm.modules.tracer.ProbeItemDescriptor; +import org.graalvm.visualvm.modules.tracer.TracerProbeDescriptor; + +/** + * Tracer probe to return the cluster size. + * + * @author tam 2024.03.12 + */ +public class SelectedServiceThreadUtilizationProbe + extends AbstractCoherenceMonitorProbe + { + // ----- constructors --------------------------------------------------- + + public SelectedServiceThreadUtilizationProbe(MonitoredDataResolver resolver) + { + super(1, createItemDescriptors(), resolver); + } + + // ---- TracerProbe methods --------------------------------------------- + + @Override + public long[] getValues(VisualVMModel model) + { + Object[] aoResults = getSelectedServiceThreadValues(model); + int nTotalThreads = (Integer) aoResults[0]; + int nTotalIdleThreads = (Integer) aoResults[1]; + + float nThreadUtil = nTotalThreads == 0 ? 0f : (float) (nTotalThreads - nTotalIdleThreads) / nTotalThreads; + return new long[]{(long) (nThreadUtil * 1000.0f)}; + } + + public static TracerProbeDescriptor createDescriptor(boolean available) + { + return new TracerProbeDescriptor(Localization.getLocalText("LBL_selected_service_utilization"), + Localization.getLocalText("LBL_selected_service_utilization_desc"), ICON, 10, available); + } + + private static ProbeItemDescriptor[] createItemDescriptors() + { + return new ProbeItemDescriptor[] + { + ProbeItemDescriptor.continuousLineFillItem(Localization.getLocalText(LBL), + getMonitorsString(LBL), ItemValueFormatter.DEFAULT_PERCENT, + 1d, 0, 1000) + }; + } + + // ----- constants ------------------------------------------------------ + + private static final String LBL = "LBL_total_utilization"; + } diff --git a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/ServiceMonitorPackage.java b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/ServiceMonitorPackage.java index 320403d..a4267da 100644 --- a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/ServiceMonitorPackage.java +++ b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/ServiceMonitorPackage.java @@ -41,7 +41,7 @@ /** - * A {@link TracerPackage} to show servier related probes. + * A {@link TracerPackage} to show service related probes. * * @author tam 2024.03.06 */ diff --git a/coherence-visualvm-plugin/src/main/resources/com/oracle/coherence/plugin/visualvm/Bundle.properties b/coherence-visualvm-plugin/src/main/resources/com/oracle/coherence/plugin/visualvm/Bundle.properties index d9f6204..319b7d2 100644 --- a/coherence-visualvm-plugin/src/main/resources/com/oracle/coherence/plugin/visualvm/Bundle.properties +++ b/coherence-visualvm-plugin/src/main/resources/com/oracle/coherence/plugin/visualvm/Bundle.properties @@ -710,20 +710,22 @@ LBL_enter_cluster_port=Enter cluster port LBL_invalid_cluster_port=Invalid cluster port {0}. # Monitor Probes -LBL_cluster_probe=Coherence - Cluster Overview +LBL_cluster_probe=Coherence Cluster Overview LBL_cluster_probe_description=Provides cluster based metrics. -LBL_proxy_probe=Coherence - Proxy Servers -LBL_cache_probe=Coherence - Caches -LBL_persistence_probe=Coherence - Persistence -LBL_federation_probe=Coherence - Federation -LBL_elasticdata_probe=Coherence - Elastic Data -LBL_service_probe=Coherence - Services +LBL_proxy_probe=Coherence Proxy Servers +LBL_cache_probe=Coherence Caches +LBL_persistence_probe=Coherence Persistence +LBL_federation_probe=Coherence Federation +LBL_elasticdata_probe=Coherence Elastic Data +LBL_service_probe=Coherence Services - Total +LBL_selected_service_probe=Coherence Services - Selected LBL_proxy_probe_description=Provides proxy server based metrics. LBL_cache_probe_description=Provides cache based metrics. LBL_persistence_description=Provides persistence based metrics. LBL_federation_probe_description=Provides federation based metrics. LBL_elasticdata_probe_description=Provides elastic data based metrics. LBL_service_probe_description=Provides service based metrics. +LBL_selected_service_probe_description=Provides service based metrics for the currently selected service. LBL_proxy_desc=Monitors the total number of proxy server connections across all proxy servers. LBL_service_pending_desc=Monitors the total number of pending requests across all partitioned services. LBL_service_endangered_desc=Monitors the total number of endangered partitions across all partitioned services. @@ -753,4 +755,16 @@ LBL_backup_space=Backup Space Used on disk LBL_departure_count=Monitors the number of cluster members that have left. LBL_monitors=Monitors LBL_cluster_members=Cluster Members -LBL_total_cache=Total Primary Cache Data Memory \ No newline at end of file +LBL_total_cache=Total Primary Cache Data Memory +LBL_selected_service_thread_count=Selected Service - Thread Count +LBL_selected_service_desc=Monitors the total number and total idle threads for the currently selected service. +LBL_selected_service_utilization=Selected Service - Thread Utilization +LBL_selected_service_utilization_desc=Monitors the total thread utilization for the currently selected service +LBL_selected_service_task_avg=Selected Service - Task Average +LBL_selected_service_task_avg_desc=Monitors the current and maximum task average duration for the currently selected service. +LBL_selected_service_request_avg=Selected Service - Request Average +LBL_selected_service_request_avg_desc=Monitors the current and maximum request average duration for the currently selected service. +LBL_selected_service_task_backlog=Selected Service - Task Backlog +LBL_selected_service_task_backlog_desc=Monitors the total task backlog for the currently selected service. +LBL_selected_service_partitions=Selected Service - Partitions +LBL_selected_service_partitions_desc=Monitors the partition information for the currently selected service. \ No newline at end of file From 0ed6fa7f0258660644b8442bb7a16c184b1fedcd Mon Sep 17 00:00:00 2001 From: Tim Middleton Date: Wed, 13 Mar 2024 08:51:28 +0800 Subject: [PATCH 2/2] more tracer probes --- .../plugin/visualvm/VisualVMInstaller.java | 2 + .../tracer/AbstractCoherenceMonitorProbe.java | 105 ++++++++++++- .../cache/SelectedCacheListenersProbe.java | 88 +++++++++++ .../cache/SelectedCacheMemoryProbe.java | 89 +++++++++++ .../cache/SelectedCacheMonitorPackage.java | 140 ++++++++++++++++++ .../tracer/cache/SelectedCacheQueryProbe.java | 91 ++++++++++++ .../tracer/cache/SelectedCacheSizeProbe.java | 79 ++++++++++ .../SelectedServiceTaskBackLogProbe.java | 2 +- .../plugin/visualvm/Bundle.properties | 18 ++- 9 files changed, 604 insertions(+), 10 deletions(-) create mode 100644 coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/cache/SelectedCacheListenersProbe.java create mode 100644 coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/cache/SelectedCacheMemoryProbe.java create mode 100644 coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/cache/SelectedCacheMonitorPackage.java create mode 100644 coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/cache/SelectedCacheQueryProbe.java create mode 100644 coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/cache/SelectedCacheSizeProbe.java diff --git a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/VisualVMInstaller.java b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/VisualVMInstaller.java index b6484bd..2fa786d 100644 --- a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/VisualVMInstaller.java +++ b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/VisualVMInstaller.java @@ -31,6 +31,7 @@ import com.oracle.coherence.plugin.visualvm.impl.CoherenceClusterProvider; import com.oracle.coherence.plugin.visualvm.tracer.cache.CacheMonitorPackage; +import com.oracle.coherence.plugin.visualvm.tracer.cache.SelectedCacheMonitorPackage; import com.oracle.coherence.plugin.visualvm.tracer.cluster.ClusterMonitorPackage; import com.oracle.coherence.plugin.visualvm.tracer.elasticdata.ElasticDataMonitorPackage; import com.oracle.coherence.plugin.visualvm.tracer.federation.FederationMonitorPackage; @@ -123,6 +124,7 @@ public TracerPackage[] getPackages(Application application) new ServiceMonitorPackage(application), new SelectedServiceMonitorPackage(application), new CacheMonitorPackage(application), + new SelectedCacheMonitorPackage(application), new FederationMonitorPackage(application), new ElasticDataMonitorPackage(application), new PersistenceMonitorPackage(application) diff --git a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/AbstractCoherenceMonitorProbe.java b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/AbstractCoherenceMonitorProbe.java index 1440cc8..dc405bf 100644 --- a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/AbstractCoherenceMonitorProbe.java +++ b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/AbstractCoherenceMonitorProbe.java @@ -26,15 +26,21 @@ import com.oracle.coherence.plugin.visualvm.Localization; import com.oracle.coherence.plugin.visualvm.VisualVMModel; + import com.oracle.coherence.plugin.visualvm.tablemodel.model.Data; import com.oracle.coherence.plugin.visualvm.tablemodel.model.ServiceMemberData; + import javax.swing.Icon; import javax.swing.ImageIcon; + import org.graalvm.visualvm.application.Application; + import org.graalvm.visualvm.modules.tracer.ItemValueFormatter; import org.graalvm.visualvm.modules.tracer.ProbeItemDescriptor; import org.graalvm.visualvm.modules.tracer.TracerProbe; + import org.openide.util.ImageUtilities; + import java.util.Arrays; import java.util.List; import java.util.Map; @@ -88,16 +94,20 @@ protected long getValueAsLong(Object oValue) { if (oValue instanceof Long) { - return (Long)oValue; + return (Long) oValue; } if (oValue instanceof Integer) { - return ((Integer)oValue); + return ((Integer) oValue); } if (oValue instanceof String) { return Long.parseLong((String) oValue); } + if (oValue instanceof Float) + { + return ((Float) oValue).longValue(); + } return 0L; } @@ -244,15 +254,15 @@ protected Long[] getSelectedServiceMaxAndAverage(VisualVMModel model, int nColum return nCount == 0L ? new Long[] {0L,0L} : new Long[] {nMax, nTotal / nCount}; } - /** - * Returns the mtotal value for a selected service. + /** + * Returns the total value for a selected service. * * @param model the {@link VisualVMModel} to use * @param nColumn the column to extract * * @return the tracer result */ - protected long getSelectedServiceTotalInteger(VisualVMModel model, int nColumn) + protected long getSelectedServiceSumInteger(VisualVMModel model, int nColumn) { List> data = model.getData(VisualVMModel.DataType.SERVICE_DETAIL); @@ -269,6 +279,90 @@ protected long getSelectedServiceTotalInteger(VisualVMModel model, int nColumn) return nTotal; } + /** + * Returns the total value for a selected cache and datatype. + * + * @param model the {@link VisualVMModel} to use + * @param dataType the {@link VisualVMModel.DataType} to extract from + * @param nColumn the column to extract + * + * @return the tracer result + */ + protected long getSelectedCacheSum(VisualVMModel model, VisualVMModel.DataType dataType, int nColumn) + { + List> data = model.getData(dataType); + + long nTotal = 0L; + + if (data != null && !data.isEmpty()) + { + for (Map.Entry entry : data) + { + nTotal += getValueAsLong(entry.getValue().getColumn(nColumn)); + } + } + + return nTotal; + } + + /** + * Returns the max value for a selected cache and datatype. + * + * @param model the {@link VisualVMModel} to use + * @param dataType the {@link VisualVMModel.DataType} to extract from + * @param nColumn the column to extract + * + * @return the tracer result + */ + protected long getSelectedCacheMax(VisualVMModel model, VisualVMModel.DataType dataType, int nColumn) + { + List> data = model.getData(dataType); + + long nMax = 0L; + + if (data != null && !data.isEmpty()) + { + for (Map.Entry entry : data) + { + long nValue = getValueAsLong(entry.getValue().getColumn(nColumn)); + if (nValue > nMax) + { + nMax = nValue; + } + } + } + + return nMax; + } + + /** + * Returns the max value for a selected cache and datatype. + * + * @param model the {@link VisualVMModel} to use + * @param dataType the {@link VisualVMModel.DataType} to extract from + * @param nColumn the column to extract + * + * @return the tracer result multiplied by 1000L + */ + protected long getSelectedCacheAverage(VisualVMModel model, VisualVMModel.DataType dataType, int nColumn) + { + List> data = model.getData(dataType); + + long nTotal = 0L; + long nCount = 0L; + + if (data != null && !data.isEmpty()) + { + for (Map.Entry entry : data) + { + nTotal += getValueAsLong(entry.getValue().getColumn(nColumn)) * 1000L; + nCount++; + } + } + + return nCount == 0 ? 0L : nTotal / nCount; + } + // ----- data members --------------------------------------------------- private final MonitoredDataResolver f_resolver; @@ -283,5 +377,4 @@ protected long getSelectedServiceTotalInteger(VisualVMModel model, int nColumn) public static final Icon ICON = new ImageIcon(ImageUtilities.loadImage(IMAGE_PATH, true)); // NOI18N public static final ItemValueFormatter CUSTOM_FORMATTER = new CustomFormatter(1000, ""); - } diff --git a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/cache/SelectedCacheListenersProbe.java b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/cache/SelectedCacheListenersProbe.java new file mode 100644 index 0000000..f90fa04 --- /dev/null +++ b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/cache/SelectedCacheListenersProbe.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.oracle.coherence.plugin.visualvm.tracer.cache; + +import com.oracle.coherence.plugin.visualvm.Localization; +import com.oracle.coherence.plugin.visualvm.VisualVMModel; + +import com.oracle.coherence.plugin.visualvm.tablemodel.model.CacheStorageManagerData; + +import com.oracle.coherence.plugin.visualvm.tracer.AbstractCoherenceMonitorProbe; + +import org.graalvm.visualvm.modules.tracer.ItemValueFormatter; + +import org.graalvm.visualvm.modules.tracer.ProbeItemDescriptor; +import org.graalvm.visualvm.modules.tracer.TracerProbeDescriptor; + +/** + * Tracer probe to return the total key and filter listeners across all services. + * + * @author tam 2024.03.13 + */ +public class SelectedCacheListenersProbe + extends AbstractCoherenceMonitorProbe + { + // ----- constructors --------------------------------------------------- + + public SelectedCacheListenersProbe(MonitoredDataResolver resolver) + { + super(2, createItemDescriptors(), resolver); + } + + // ---- TracerProbe methods --------------------------------------------- + + @Override + public long[] getValues(VisualVMModel model) + { + return new long[]{ + getSelectedCacheSum(model, VisualVMModel.DataType.CACHE_STORAGE_MANAGER, CacheStorageManagerData.LISTENER_KEY_COUNT), + getSelectedCacheSum(model, VisualVMModel.DataType.CACHE_STORAGE_MANAGER, CacheStorageManagerData.LISTENER_FILTER_COUNT)}; + } + + public static TracerProbeDescriptor createDescriptor(boolean available) + { + return new TracerProbeDescriptor(Localization.getLocalText("LBL_selected_cache_listeners"), + Localization.getLocalText("LBL_selected_cache_listeners_desc"), ICON, 10, available); + } + + private static ProbeItemDescriptor[] createItemDescriptors() + { + return new ProbeItemDescriptor[] + { + ProbeItemDescriptor.continuousLineFillItem(Localization.getLocalText(LBL1), + getMonitorsString(LBL1), ItemValueFormatter.DEFAULT_DECIMAL, + 1d, 0, 1), + ProbeItemDescriptor.continuousLineFillItem(Localization.getLocalText(LBL2), + getMonitorsString(LBL2), ItemValueFormatter.DEFAULT_DECIMAL, + 1d, 0, 1), + }; + } + + // ----- constants ------------------------------------------------------ + + private static final String LBL1 = "LBL_listener_key_count"; + private static final String LBL2 = "LBL_listener_filter_count"; + } diff --git a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/cache/SelectedCacheMemoryProbe.java b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/cache/SelectedCacheMemoryProbe.java new file mode 100644 index 0000000..548dccb --- /dev/null +++ b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/cache/SelectedCacheMemoryProbe.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.oracle.coherence.plugin.visualvm.tracer.cache; + +import com.oracle.coherence.plugin.visualvm.Localization; +import com.oracle.coherence.plugin.visualvm.VisualVMModel; + +import com.oracle.coherence.plugin.visualvm.tablemodel.model.CacheDetailData; +import com.oracle.coherence.plugin.visualvm.tablemodel.model.CacheStorageManagerData; + +import com.oracle.coherence.plugin.visualvm.tracer.AbstractCoherenceMonitorProbe; + +import org.graalvm.visualvm.modules.tracer.ItemValueFormatter; + +import org.graalvm.visualvm.modules.tracer.ProbeItemDescriptor; +import org.graalvm.visualvm.modules.tracer.TracerProbeDescriptor; + +/** + * Tracer probe to return the total memory and index memory across all services. + * + * @author tam 2024.03.13 + */ +public class SelectedCacheMemoryProbe + extends AbstractCoherenceMonitorProbe + { + // ----- constructors --------------------------------------------------- + + public SelectedCacheMemoryProbe(MonitoredDataResolver resolver) + { + super(2, createItemDescriptors(), resolver); + } + + // ---- TracerProbe methods --------------------------------------------- + + @Override + public long[] getValues(VisualVMModel model) + { + return new long[]{ + getSelectedCacheSum(model, VisualVMModel.DataType.CACHE_DETAIL, CacheDetailData.MEMORY_BYTES), + getSelectedCacheSum(model, VisualVMModel.DataType.CACHE_STORAGE_MANAGER, CacheStorageManagerData.INDEX_TOTAL_UNITS)}; + } + + public static TracerProbeDescriptor createDescriptor(boolean available) + { + return new TracerProbeDescriptor(Localization.getLocalText("LBL_selected_cache_memory"), + Localization.getLocalText("LBL_selected_cache_size_desc"), ICON, 10, available); + } + + private static ProbeItemDescriptor[] createItemDescriptors() + { + return new ProbeItemDescriptor[] + { + ProbeItemDescriptor.continuousLineFillItem(Localization.getLocalText(LBL1), + getMonitorsString(LBL1), ItemValueFormatter.DEFAULT_BYTES, + 1d, 0, 1), + ProbeItemDescriptor.continuousLineFillItem(Localization.getLocalText(LBL2), + getMonitorsString(LBL2), ItemValueFormatter.DEFAULT_BYTES, + 1d, 0, 1), + }; + } + + // ----- constants ------------------------------------------------------ + + private static final String LBL1 = "LBL_total_cache"; + private static final String LBL2 = "LBL_index_memory"; + } diff --git a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/cache/SelectedCacheMonitorPackage.java b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/cache/SelectedCacheMonitorPackage.java new file mode 100644 index 0000000..a119334 --- /dev/null +++ b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/cache/SelectedCacheMonitorPackage.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.oracle.coherence.plugin.visualvm.tracer.cache; + +import static com.oracle.coherence.plugin.visualvm.tracer.AbstractCoherenceMonitorProbe.ICON; + +import com.oracle.coherence.plugin.visualvm.Localization; +import com.oracle.coherence.plugin.visualvm.VisualVMModel; +import com.oracle.coherence.plugin.visualvm.VisualVMView; + +import com.oracle.coherence.plugin.visualvm.tracer.AbstractCoherenceMonitorProbe; + +import org.graalvm.visualvm.application.Application; + +import org.graalvm.visualvm.modules.tracer.TracerPackage; +import org.graalvm.visualvm.modules.tracer.TracerProbe; +import org.graalvm.visualvm.modules.tracer.TracerProbeDescriptor; + + +/** + * A {@link TracerPackage} to show cache related probes for the currently selected cache. + * + * @author tam 2024.03.12 + */ +public class SelectedCacheMonitorPackage + extends TracerPackage implements AbstractCoherenceMonitorProbe.MonitoredDataResolver { + + public SelectedCacheMonitorPackage(Application application) + { + super(NAME, DESCR, ICON, POSITION); + this.f_model = VisualVMView.getModelForApplication(application); + } + + // ---- TracerPackage methods ------------------------------------------- + + @Override + public TracerProbeDescriptor[] getProbeDescriptors() { + m_sizeProbeDescriptor = SelectedCacheSizeProbe.createDescriptor(f_model != null); + m_memoryProbeDescriptor = SelectedCacheMemoryProbe.createDescriptor(f_model != null); + m_listenersProbeDescriptor = SelectedCacheListenersProbe.createDescriptor(f_model != null); + m_queryProbeDescriptor = SelectedCacheQueryProbe.createDescriptor(f_model != null); + + return new TracerProbeDescriptor[] { + m_sizeProbeDescriptor, + m_memoryProbeDescriptor, + m_listenersProbeDescriptor, + m_queryProbeDescriptor + }; + } + + @Override + public TracerProbe getProbe(TracerProbeDescriptor descriptor) + { + if (descriptor == m_sizeProbeDescriptor) + { + if (m_sizeProbe == null) + { + m_sizeProbe = new SelectedCacheSizeProbe(this); + } + return m_sizeProbe; + } + else if (descriptor == m_memoryProbeDescriptor) + { + if (m_memoryProbe == null) + { + m_memoryProbe = new SelectedCacheMemoryProbe(this); + } + return m_memoryProbe; + } + else if (descriptor == m_listenersProbeDescriptor) + { + if (m_listenersProbe == null) + { + m_listenersProbe = new SelectedCacheListenersProbe(this); + } + return m_listenersProbe; + } + else if (descriptor == m_queryProbeDescriptor) + { + if (m_queryProbe == null) + { + m_queryProbe = new SelectedCacheQueryProbe(this); + } + return m_queryProbe; + } + else + { + return null; + } + } + + // ---- AbstractCoherenceMonitorProbe.MonitoredDataResolver interface --- + + @Override + public VisualVMModel getMonitoredData() + { + return f_model; + } + + // ----- constants ------------------------------------------------------ + + private static final String NAME = Localization.getLocalText("LBL_selected_cache_probe"); + private static final String DESCR = Localization.getLocalText("LBL_selected_cache_probe_description"); + private static final int POSITION = 20511; + + private TracerProbeDescriptor m_sizeProbeDescriptor; + private TracerProbeDescriptor m_memoryProbeDescriptor; + private TracerProbeDescriptor m_listenersProbeDescriptor; + private TracerProbeDescriptor m_queryProbeDescriptor; + + private AbstractCoherenceMonitorProbe m_sizeProbe; + private AbstractCoherenceMonitorProbe m_memoryProbe; + private AbstractCoherenceMonitorProbe m_listenersProbe; + private AbstractCoherenceMonitorProbe m_queryProbe; + + private final VisualVMModel f_model; + } diff --git a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/cache/SelectedCacheQueryProbe.java b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/cache/SelectedCacheQueryProbe.java new file mode 100644 index 0000000..50b4971 --- /dev/null +++ b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/cache/SelectedCacheQueryProbe.java @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.oracle.coherence.plugin.visualvm.tracer.cache; + +import com.oracle.coherence.plugin.visualvm.Localization; +import com.oracle.coherence.plugin.visualvm.VisualVMModel; +import com.oracle.coherence.plugin.visualvm.tablemodel.model.CacheStorageManagerData; +import com.oracle.coherence.plugin.visualvm.tablemodel.model.ServiceMemberData; +import com.oracle.coherence.plugin.visualvm.tracer.AbstractCoherenceMonitorProbe; +import com.oracle.coherence.plugin.visualvm.tracer.CustomFormatter; +import org.graalvm.visualvm.modules.tracer.ProbeItemDescriptor; +import org.graalvm.visualvm.modules.tracer.TracerProbeDescriptor; + +/** + * Tracer probe to return the query information for the currently selected cache. + * + * @author tam 2024.03.12 + */ +public class SelectedCacheQueryProbe + extends AbstractCoherenceMonitorProbe + { + // ----- constructors --------------------------------------------------- + + public SelectedCacheQueryProbe(MonitoredDataResolver resolver) + { + super(3, createItemDescriptors(), resolver); + } + + // ---- TracerProbe methods --------------------------------------------- + + @Override + public long[] getValues(VisualVMModel model) + { + return new long[]{ + getSelectedCacheMax(model, VisualVMModel.DataType.CACHE_STORAGE_MANAGER, CacheStorageManagerData.MAX_QUERY_DURATION), + getSelectedCacheAverage(model, VisualVMModel.DataType.CACHE_STORAGE_MANAGER, CacheStorageManagerData.NON_OPTIMIZED_QUERY_AVG), + getSelectedCacheAverage(model, VisualVMModel.DataType.CACHE_STORAGE_MANAGER, CacheStorageManagerData.OPTIMIZED_QUERY_AVG), + }; + } + + public static TracerProbeDescriptor createDescriptor(boolean available) + { + return new TracerProbeDescriptor(Localization.getLocalText("LBL_selected_cache_query"), + Localization.getLocalText("LBL_selected_cache_query_desc"), ICON, 20, available); + } + + private static ProbeItemDescriptor[] createItemDescriptors() + { + return new ProbeItemDescriptor[] + { + ProbeItemDescriptor.continuousLineFillItem(Localization.getLocalText(LBL), + getMonitorsString(LBL), new CustomFormatter(1, "ms"), + 1, 0, 1), + ProbeItemDescriptor.continuousLineFillItem(Localization.getLocalText(LBL2), + getMonitorsString(LBL2), new CustomFormatter(1000, "ms"), + 1000d, 0, 1), + ProbeItemDescriptor.continuousLineFillItem(Localization.getLocalText(LBL3), + getMonitorsString(LBL3), new CustomFormatter(1000, "ms"), + 1000d, 0, 1), + }; + } + + // ----- constants ------------------------------------------------------ + + private static final String LBL = "LBL_max_query_millis"; + private static final String LBL2 = "LBL_non_opt_avge"; + private static final String LBL3 = "LBL_opt_avge"; + } diff --git a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/cache/SelectedCacheSizeProbe.java b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/cache/SelectedCacheSizeProbe.java new file mode 100644 index 0000000..4e6bf4a --- /dev/null +++ b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/cache/SelectedCacheSizeProbe.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.oracle.coherence.plugin.visualvm.tracer.cache; + +import com.oracle.coherence.plugin.visualvm.Localization; +import com.oracle.coherence.plugin.visualvm.VisualVMModel; +import com.oracle.coherence.plugin.visualvm.tablemodel.model.CacheData; +import com.oracle.coherence.plugin.visualvm.tablemodel.model.CacheDetailData; +import com.oracle.coherence.plugin.visualvm.tracer.AbstractCoherenceMonitorProbe; +import org.graalvm.visualvm.modules.tracer.ItemValueFormatter; +import org.graalvm.visualvm.modules.tracer.ProbeItemDescriptor; +import org.graalvm.visualvm.modules.tracer.TracerProbeDescriptor; + +/** + * Tracer probe to return the total number of cache entries across all services. + * + * @author tam 2024.03.13 + */ +public class SelectedCacheSizeProbe + extends AbstractCoherenceMonitorProbe + { + // ----- constructors --------------------------------------------------- + + public SelectedCacheSizeProbe(MonitoredDataResolver resolver) + { + super(1, createItemDescriptors(), resolver); + } + + // ---- TracerProbe methods --------------------------------------------- + + @Override + public long[] getValues(VisualVMModel model) + { + return new long[]{getSelectedCacheSum(model, VisualVMModel.DataType.CACHE_DETAIL, CacheDetailData.SIZE)}; + } + + public static TracerProbeDescriptor createDescriptor(boolean available) + { + return new TracerProbeDescriptor(Localization.getLocalText("LBL_selected_cache_size"), + Localization.getLocalText("LBL_selected_cache_size_desc"), ICON, 10, available); + } + + private static ProbeItemDescriptor[] createItemDescriptors() + { + return new ProbeItemDescriptor[] + { + ProbeItemDescriptor.continuousLineFillItem(Localization.getLocalText(LBL), + getMonitorsString(LBL), ItemValueFormatter.DEFAULT_DECIMAL, + 1d, 0, 1), + }; + } + + // ----- constants ------------------------------------------------------ + + private static final String LBL = "LBL_size"; + } diff --git a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceTaskBackLogProbe.java b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceTaskBackLogProbe.java index 2aaf5a7..0166955 100644 --- a/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceTaskBackLogProbe.java +++ b/coherence-visualvm-plugin/src/main/java/com/oracle/coherence/plugin/visualvm/tracer/service/SelectedServiceTaskBackLogProbe.java @@ -57,7 +57,7 @@ public SelectedServiceTaskBackLogProbe(MonitoredDataResolver resolver) @Override public long[] getValues(VisualVMModel model) { - return new long[] {getSelectedServiceTotalInteger(model, ServiceMemberData.TASK_BACKLOG)}; + return new long[] {getSelectedServiceSumInteger(model, ServiceMemberData.TASK_BACKLOG)}; } public static TracerProbeDescriptor createDescriptor(boolean available) diff --git a/coherence-visualvm-plugin/src/main/resources/com/oracle/coherence/plugin/visualvm/Bundle.properties b/coherence-visualvm-plugin/src/main/resources/com/oracle/coherence/plugin/visualvm/Bundle.properties index 319b7d2..c5bfde3 100644 --- a/coherence-visualvm-plugin/src/main/resources/com/oracle/coherence/plugin/visualvm/Bundle.properties +++ b/coherence-visualvm-plugin/src/main/resources/com/oracle/coherence/plugin/visualvm/Bundle.properties @@ -713,12 +713,13 @@ LBL_invalid_cluster_port=Invalid cluster port {0}. LBL_cluster_probe=Coherence Cluster Overview LBL_cluster_probe_description=Provides cluster based metrics. LBL_proxy_probe=Coherence Proxy Servers -LBL_cache_probe=Coherence Caches +LBL_cache_probe=Coherence Caches - Overall LBL_persistence_probe=Coherence Persistence LBL_federation_probe=Coherence Federation LBL_elasticdata_probe=Coherence Elastic Data -LBL_service_probe=Coherence Services - Total +LBL_service_probe=Coherence Services - Overall LBL_selected_service_probe=Coherence Services - Selected +LBL_selected_cache_probe=Coherence Caches - Selected LBL_proxy_probe_description=Provides proxy server based metrics. LBL_cache_probe_description=Provides cache based metrics. LBL_persistence_description=Provides persistence based metrics. @@ -726,6 +727,7 @@ LBL_federation_probe_description=Provides federation based metrics. LBL_elasticdata_probe_description=Provides elastic data based metrics. LBL_service_probe_description=Provides service based metrics. LBL_selected_service_probe_description=Provides service based metrics for the currently selected service. +LBL_selected_cache_probe_description=Provides caches based metrics for the currently selected cache. LBL_proxy_desc=Monitors the total number of proxy server connections across all proxy servers. LBL_service_pending_desc=Monitors the total number of pending requests across all partitioned services. LBL_service_endangered_desc=Monitors the total number of endangered partitions across all partitioned services. @@ -767,4 +769,14 @@ LBL_selected_service_request_avg_desc=Monitors the current and maximum request a LBL_selected_service_task_backlog=Selected Service - Task Backlog LBL_selected_service_task_backlog_desc=Monitors the total task backlog for the currently selected service. LBL_selected_service_partitions=Selected Service - Partitions -LBL_selected_service_partitions_desc=Monitors the partition information for the currently selected service. \ No newline at end of file +LBL_selected_service_partitions_desc=Monitors the partition information for the currently selected service. +LBL_selected_cache_size=Selected Cache - Size +LBL_selected_cache_size_desc=Monitors the cache size for the currently selected cache. +LBL_selected_cache_memory=Selected Cache - Memory +LBL_selected_cache_memory_desc=Monitors the total cache memory and index memory for the currently selected cache for all members. +LBL_selected_cache_index=Selected Cache - Index +LBL_index_memory=Total Index Memory +LBL_selected_cache_listeners=Selected Cache - Listeners +LBL_selected_cache_listeners_desc=Monitors the total key and filter listeners for the currently selected cache for all members. +LBL_selected_cache_query=Selected Cache - Queries +LBL_selected_cache_query_desc=Monitors the max query duration, optimized and non-optimized queries for the currently selected cache for all members. \ No newline at end of file