blob: 6fe356a7707dd920fd17b2393079f308697de921 [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.geode.internal.statistics;
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.apache.geode.Statistics;
import org.apache.geode.internal.lang.SystemUtils;
import org.apache.geode.internal.net.SocketCreator;
import org.apache.geode.internal.statistics.platform.LinuxProcFsStatistics;
import org.apache.geode.internal.statistics.platform.LinuxProcessStats;
import org.apache.geode.internal.statistics.platform.LinuxSystemStats;
import org.apache.geode.internal.statistics.platform.OsStatisticsFactory;
import org.apache.geode.internal.statistics.platform.ProcessStats;
/**
* Provides methods which fetch operating system statistics.
* Only Linux OS is currently allowed.
*/
public class OsStatisticsProvider {
private static final int PROCESS_STAT_FLAG = 1;
private static final int SYSTEM_STAT_FLAG = 2;
private final boolean osStatsSupported;
public boolean osStatsSupported() {
return osStatsSupported;
}
private OsStatisticsProvider() {
osStatsSupported = SystemUtils.isLinux();
}
public static OsStatisticsProvider build() {
return new OsStatisticsProvider();
}
int initOSStats() {
return LinuxProcFsStatistics.init();
}
void closeOSStats() {
LinuxProcFsStatistics.close();
}
void readyRefreshOSStats() {
LinuxProcFsStatistics.readyRefresh();
}
/**
* Refreshes the specified process stats instance by fetching the current OS values for the given
* stats and storing them in the instance.
*/
private void refreshProcess(LocalStatisticsImpl statistics) {
int pid = (int) statistics.getNumericId();
LinuxProcFsStatistics.refreshProcess(pid, statistics);
}
/**
* Refreshes the specified system stats instance by fetching the current OS values for the local
* machine and storing them in the instance.
*/
private void refreshSystem(LocalStatisticsImpl statistics) {
LinuxProcFsStatistics.refreshSystem(statistics);
}
/**
* The call should have already checked to make sure usesSystemCalls returns true.
*/
public void refresh(LocalStatisticsImpl statistics) {
int flags = statistics.getOsStatFlags();
if ((flags & PROCESS_STAT_FLAG) != 0) {
refreshProcess(statistics);
} else if ((flags & SYSTEM_STAT_FLAG) != 0) {
refreshSystem(statistics);
} else {
throw new RuntimeException(String.format("Unexpected os stats flags %s", flags));
}
}
/**
* Creates and returns a {@link Statistics} with the given pid and name. The resource's stats will
* contain a snapshot of the current statistic values for the specified process.
*/
Statistics newProcess(OsStatisticsFactory osStatisticsFactory, long pid, String name) {
Statistics statistics;
statistics = osStatisticsFactory.createOsStatistics(LinuxProcessStats.getType(), name, pid,
PROCESS_STAT_FLAG);
// Note we don't call refreshProcess since we only want the manager to do that
return statistics;
}
/**
* Creates a new <code>ProcessStats</code> instance that wraps the given <code>Statistics</code>.
*
* @see #newProcess
* @since GemFire 3.5
*/
ProcessStats newProcessStats(Statistics statistics) {
if (statistics instanceof LocalStatisticsImpl) {
refresh((LocalStatisticsImpl) statistics);
} // otherwise its a Dummy implementation so do nothing
return LinuxProcessStats.createProcessStats(statistics);
}
/**
* Creates a {@link Statistics} with the current machine's stats. The resource's stats
* will contain a snapshot of the current statistic values for the local machine.
*/
void newSystem(OsStatisticsFactory osStatisticsFactory, long id) {
Statistics statistics;
statistics = osStatisticsFactory.createOsStatistics(LinuxSystemStats.getType(),
getHostSystemName(), id, SYSTEM_STAT_FLAG);
if (statistics instanceof LocalStatisticsImpl) {
refreshSystem((LocalStatisticsImpl) statistics);
} // otherwise its a Dummy implementation so do nothing
}
/**
* @return this machine's fully qualified hostname or "unknownHostName" if one cannot be found.
*/
private String getHostSystemName() {
String hostname = "unknownHostName";
try {
InetAddress inetAddress = SocketCreator.getLocalHost();
hostname = inetAddress.getCanonicalHostName();
} catch (UnknownHostException ignored) {
}
return hostname;
}
}