blob: 1efb5906f347268f1654e45f4c118f34f41701ca [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.ignite.internal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.UUID;
import org.apache.ignite.cluster.BaselineNode;
import org.apache.ignite.cluster.ClusterGroup;
import org.apache.ignite.cluster.ClusterMetrics;
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.mxbean.ClusterMetricsMXBean;
/**
* Cluster metrics MBean.
*/
public class ClusterMetricsMXBeanImpl implements ClusterMetricsMXBean {
/** Grid cluster. */
private final ClusterGroup cluster;
/** Cached value of cluster metrics. */
private volatile ClusterMetrics clusterMetricsSnapshot;
/** Cluster metrics expire time. */
private volatile long clusterMetricsExpireTime;
/** Cluster metrics update mutex. */
private final Object clusterMetricsMux = new Object();
/**
* @param cluster Cluster group to manage.
*/
public ClusterMetricsMXBeanImpl(ClusterGroup cluster) {
assert cluster != null;
this.cluster = cluster;
}
/**
* Gets a metrics snapshot for this cluster group.
*
* @return Metrics snapshot.
*/
private ClusterMetrics metrics() {
if (clusterMetricsExpireTime < System.currentTimeMillis()) {
synchronized (clusterMetricsMux) {
if (clusterMetricsExpireTime < System.currentTimeMillis()) {
clusterMetricsSnapshot = cluster.metrics();
clusterMetricsExpireTime = System.currentTimeMillis()
+ cluster.ignite().configuration().getMetricsUpdateFrequency();
}
}
}
return clusterMetricsSnapshot;
}
/** {@inheritDoc} */
@Override public int getTotalCpus() {
return metrics().getTotalCpus();
}
/** {@inheritDoc} */
@Override public float getAverageActiveJobs() {
return metrics().getAverageActiveJobs();
}
/** {@inheritDoc} */
@Override public float getAverageCancelledJobs() {
return metrics().getAverageCancelledJobs();
}
/** {@inheritDoc} */
@Override public double getAverageJobExecuteTime() {
return metrics().getAverageJobExecuteTime();
}
/** {@inheritDoc} */
@Override public double getAverageJobWaitTime() {
return metrics().getAverageJobWaitTime();
}
/** {@inheritDoc} */
@Override public float getAverageRejectedJobs() {
return metrics().getAverageRejectedJobs();
}
/** {@inheritDoc} */
@Override public float getAverageWaitingJobs() {
return metrics().getAverageWaitingJobs();
}
/** {@inheritDoc} */
@Override public float getBusyTimePercentage() {
return metrics().getBusyTimePercentage() * 100;
}
/** {@inheritDoc} */
@Override public int getCurrentActiveJobs() {
return metrics().getCurrentActiveJobs();
}
/** {@inheritDoc} */
@Override public int getCurrentCancelledJobs() {
return metrics().getCurrentCancelledJobs();
}
/** {@inheritDoc} */
@Override public long getCurrentIdleTime() {
return metrics().getCurrentIdleTime();
}
/** {@inheritDoc} */
@Override public long getCurrentJobExecuteTime() {
return metrics().getCurrentJobExecuteTime();
}
/** {@inheritDoc} */
@Override public long getCurrentJobWaitTime() {
return metrics().getCurrentJobWaitTime();
}
/** {@inheritDoc} */
@Override public int getCurrentRejectedJobs() {
return metrics().getCurrentRejectedJobs();
}
/** {@inheritDoc} */
@Override public int getCurrentWaitingJobs() {
return metrics().getCurrentWaitingJobs();
}
/** {@inheritDoc} */
@Override public int getTotalExecutedTasks() {
return metrics().getTotalExecutedTasks();
}
/** {@inheritDoc} */
@Override public int getCurrentDaemonThreadCount() {
return metrics().getCurrentDaemonThreadCount();
}
/** {@inheritDoc} */
@Override public long getHeapMemoryCommitted() {
return metrics().getHeapMemoryCommitted();
}
/** {@inheritDoc} */
@Override public long getHeapMemoryInitialized() {
return metrics().getHeapMemoryInitialized();
}
/** {@inheritDoc} */
@Override public long getHeapMemoryMaximum() {
return metrics().getHeapMemoryMaximum();
}
/** {@inheritDoc} */
@Override public long getHeapMemoryTotal() {
return metrics().getHeapMemoryTotal();
}
/** {@inheritDoc} */
@Override public long getHeapMemoryUsed() {
return metrics().getHeapMemoryUsed();
}
/** {@inheritDoc} */
@Override public float getIdleTimePercentage() {
return metrics().getIdleTimePercentage() * 100;
}
/** {@inheritDoc} */
@Override public long getLastUpdateTime() {
return metrics().getLastUpdateTime();
}
/** {@inheritDoc} */
@Override public int getMaximumActiveJobs() {
return metrics().getMaximumActiveJobs();
}
/** {@inheritDoc} */
@Override public int getMaximumCancelledJobs() {
return metrics().getMaximumCancelledJobs();
}
/** {@inheritDoc} */
@Override public long getMaximumJobExecuteTime() {
return metrics().getMaximumJobExecuteTime();
}
/** {@inheritDoc} */
@Override public long getMaximumJobWaitTime() {
return metrics().getMaximumJobWaitTime();
}
/** {@inheritDoc} */
@Override public int getMaximumRejectedJobs() {
return metrics().getMaximumRejectedJobs();
}
/** {@inheritDoc} */
@Override public int getMaximumWaitingJobs() {
return metrics().getMaximumWaitingJobs();
}
/** {@inheritDoc} */
@Override public long getNonHeapMemoryCommitted() {
return metrics().getNonHeapMemoryCommitted();
}
/** {@inheritDoc} */
@Override public long getNonHeapMemoryInitialized() {
return metrics().getNonHeapMemoryInitialized();
}
/** {@inheritDoc} */
@Override public long getNonHeapMemoryMaximum() {
return metrics().getNonHeapMemoryMaximum();
}
/** {@inheritDoc} */
@Override public long getNonHeapMemoryTotal() {
return metrics().getNonHeapMemoryTotal();
}
/** {@inheritDoc} */
@Override public long getNonHeapMemoryUsed() {
return metrics().getNonHeapMemoryUsed();
}
/** {@inheritDoc} */
@Override public int getMaximumThreadCount() {
return metrics().getMaximumThreadCount();
}
/** {@inheritDoc} */
@Override public long getStartTime() {
return metrics().getStartTime();
}
/** {@inheritDoc} */
@Override public long getNodeStartTime() {
return metrics().getNodeStartTime();
}
/** {@inheritDoc} */
@Override public double getCurrentCpuLoad() {
return metrics().getCurrentCpuLoad() * 100;
}
/** {@inheritDoc} */
@Override public double getAverageCpuLoad() {
return metrics().getAverageCpuLoad() * 100;
}
/** {@inheritDoc} */
@Override public double getCurrentGcCpuLoad() {
return metrics().getCurrentGcCpuLoad() * 100;
}
/** {@inheritDoc} */
@Override public int getCurrentThreadCount() {
return metrics().getCurrentThreadCount();
}
/** {@inheritDoc} */
@Override public long getTotalBusyTime() {
return metrics().getTotalBusyTime();
}
/** {@inheritDoc} */
@Override public int getTotalCancelledJobs() {
return metrics().getTotalCancelledJobs();
}
/** {@inheritDoc} */
@Override public int getTotalExecutedJobs() {
return metrics().getTotalExecutedJobs();
}
/** {@inheritDoc} */
@Override public long getTotalJobsExecutionTime() {
return metrics().getTotalJobsExecutionTime();
}
/** {@inheritDoc} */
@Override public long getTotalIdleTime() {
return metrics().getTotalIdleTime();
}
/** {@inheritDoc} */
@Override public int getTotalRejectedJobs() {
return metrics().getTotalRejectedJobs();
}
/** {@inheritDoc} */
@Override public long getTotalStartedThreadCount() {
return metrics().getTotalStartedThreadCount();
}
/** {@inheritDoc} */
@Override public long getUpTime() {
return metrics().getUpTime();
}
/** {@inheritDoc} */
@Override public long getLastDataVersion() {
return metrics().getLastDataVersion();
}
/** {@inheritDoc} */
@Override public int getSentMessagesCount() {
return metrics().getSentMessagesCount();
}
/** {@inheritDoc} */
@Override public long getSentBytesCount() {
return metrics().getSentBytesCount();
}
/** {@inheritDoc} */
@Override public int getReceivedMessagesCount() {
return metrics().getReceivedMessagesCount();
}
/** {@inheritDoc} */
@Override public long getReceivedBytesCount() {
return metrics().getReceivedBytesCount();
}
/** {@inheritDoc} */
@Override public int getOutboundMessagesQueueSize() {
return metrics().getOutboundMessagesQueueSize();
}
/** {@inheritDoc} */
@Override public int getTotalNodes() {
return metrics().getTotalNodes();
}
/** {@inheritDoc} */
@Override public int getTotalBaselineNodes() {
Collection<BaselineNode> baselineNodes = cluster.ignite().cluster().currentBaselineTopology();
return baselineNodes != null ? baselineNodes.size() : 0;
}
/** {@inheritDoc} */
@Override public int getActiveBaselineNodes() {
Collection<BaselineNode> baselineNodes = cluster.ignite().cluster().currentBaselineTopology();
if (baselineNodes != null && !baselineNodes.isEmpty()) {
Set<Object> bltIds = new HashSet<>(baselineNodes.size());
for (BaselineNode baselineNode : baselineNodes)
bltIds.add(baselineNode.consistentId());
int count = 0;
for (ClusterNode node : cluster.forServers().nodes())
if (bltIds.contains(node.consistentId()))
count++;
return count;
}
return 0;
}
/** {@inheritDoc} */
@Override public int getTotalServerNodes() {
return cluster.forServers().nodes().size();
}
/** {@inheritDoc} */
@Override public int getTotalClientNodes() {
return cluster.forClients().nodes().size();
}
/** {@inheritDoc} */
@Override public long getTopologyVersion() {
return cluster.ignite().cluster().topologyVersion();
}
/** {@inheritDoc} */
@Override public Set<String> attributeNames() {
Set<String> attrs = new TreeSet<>();
for (ClusterNode node : cluster.nodes())
attrs.addAll(node.attributes().keySet());
return attrs;
}
/** {@inheritDoc} */
@Override public Set<String> attributeValues(String attrName) {
Set<String> values = new TreeSet<>();
for (ClusterNode node : cluster.nodes()) {
Object val = node.attribute(attrName);
if (val != null)
values.add(val.toString());
}
return values;
}
/** {@inheritDoc} */
@Override public Set<UUID> nodeIdsForAttribute(String attrName, String attrVal, boolean includeSrvs,
boolean includeClients) {
Set<UUID> nodes = new TreeSet<>();
for (ClusterNode node : nodesList(includeSrvs, includeClients)) {
Object val = node.attribute(attrName);
if (val != null && val.toString().equals(attrVal))
nodes.add(node.id());
}
return nodes;
}
/**
* Get list with the specified node types.
*
* @param srv {@code True} to include server nodes.
* @param client {@code True} to include client nodes.
* @return List with the specified node types.
*/
private List<ClusterNode> nodesList(boolean srv, boolean client) {
List<ClusterNode> nodes = new ArrayList<>();
if (srv)
nodes.addAll(cluster.forServers().nodes());
if (client)
nodes.addAll(cluster.forClients().nodes());
return nodes;
}
/** {@inheritDoc} */
@Override public String toString() {
return S.toString(ClusterMetricsMXBeanImpl.class, this);
}
}