This is an automated email from the ASF dual-hosted git repository. jbarrett pushed a commit to branch wip/oshi-multios-stats-module in repository https://gitbox.apache.org/repos/asf/geode.git
commit dd3d111f9ed72d0dc68ee97ac65595f19eb7dde5 Author: Jacob Barrett <[email protected]> AuthorDate: Wed Nov 17 11:19:45 2021 -0800 Make service loadable. --- .../internal/statistics/OsStatisticsBenchmark.java | 3 +- .../internal/statistics/GemFireStatSampler.java | 62 +++++++++++++++++----- .../internal/statistics/StatisticsRegistry.java | 3 +- .../legacy/LegacyOsStatisticsProvider.java | 2 - ....geode.internal.statistics.OsStatisticsProvider | 17 ++++++ .../statistics/StatisticsRegistryTest.java | 3 +- 6 files changed, 72 insertions(+), 18 deletions(-) diff --git a/geode-core/src/jmh/java/org/apache/geode/internal/statistics/OsStatisticsBenchmark.java b/geode-core/src/jmh/java/org/apache/geode/internal/statistics/OsStatisticsBenchmark.java index 9ec47f1..cf91437 100644 --- a/geode-core/src/jmh/java/org/apache/geode/internal/statistics/OsStatisticsBenchmark.java +++ b/geode-core/src/jmh/java/org/apache/geode/internal/statistics/OsStatisticsBenchmark.java @@ -330,7 +330,8 @@ public class OsStatisticsBenchmark { public static class NoopStatisticsProvider implements OsStatisticsFactory { @Override - public Statistics createOsStatistics(final StatisticsType type, final String textId, final long numericId) { + public Statistics createOsStatistics(final StatisticsType type, final String textId, + final long numericId) { return new NoopStatistics(); } } diff --git a/geode-core/src/main/java/org/apache/geode/internal/statistics/GemFireStatSampler.java b/geode-core/src/main/java/org/apache/geode/internal/statistics/GemFireStatSampler.java index 6ceb510..2a1c79d 100644 --- a/geode-core/src/main/java/org/apache/geode/internal/statistics/GemFireStatSampler.java +++ b/geode-core/src/main/java/org/apache/geode/internal/statistics/GemFireStatSampler.java @@ -20,10 +20,12 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.ServiceLoader; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.NotNull; import org.apache.geode.CancelCriterion; import org.apache.geode.Statistics; @@ -35,7 +37,6 @@ import org.apache.geode.internal.GemFireVersion; import org.apache.geode.internal.admin.ListenerIdMap; import org.apache.geode.internal.admin.remote.StatListenerMessage; import org.apache.geode.internal.logging.log4j.LogMarker; -import org.apache.geode.internal.statistics.oshi.OshiStatisticsProvider; import org.apache.geode.internal.statistics.platform.ProcessStats; import org.apache.geode.logging.internal.log4j.api.LogService; import org.apache.geode.logging.internal.spi.LogFile; @@ -66,13 +67,14 @@ public class GemFireStatSampler extends HostStatSampler { private int nextListenerId = 1; private ProcessStats processStats; - private OsStatisticsProvider osStatisticsProvider = new OshiStatisticsProvider(); + private final OsStatisticsProvider[] osStatisticsProviders; public GemFireStatSampler(InternalDistributedSystem internalDistributedSystem) { this(internalDistributedSystem, null); } - public GemFireStatSampler(InternalDistributedSystem internalDistributedSystem, LogFile logFile) { + public GemFireStatSampler(final @NotNull InternalDistributedSystem internalDistributedSystem, + final @NotNull LogFile logFile) { this(internalDistributedSystem.getCancelCriterion(), new StatSamplerStats(internalDistributedSystem, internalDistributedSystem.getStatisticsManager().getPid()), @@ -84,18 +86,41 @@ public class GemFireStatSampler extends HostStatSampler { } @VisibleForTesting - public GemFireStatSampler(CancelCriterion cancelCriterion, - StatSamplerStats statSamplerStats, - LogFile logFile, - StatisticsConfig statisticsConfig, - StatisticsManager statisticsManager, - DistributionManager distributionManager, + public GemFireStatSampler(final @NotNull CancelCriterion cancelCriterion, + final @NotNull StatSamplerStats statSamplerStats, + final @NotNull LogFile logFile, + final @NotNull StatisticsConfig statisticsConfig, + final @NotNull StatisticsManager statisticsManager, + final @NotNull DistributionManager distributionManager, long systemId) { + this(cancelCriterion, statSamplerStats, logFile, statisticsConfig, statisticsManager, + distributionManager, systemId, loadOsStatisticsProviders()); + } + + private static OsStatisticsProvider[] loadOsStatisticsProviders() { + final ServiceLoader<OsStatisticsProvider> loader = + ServiceLoader.load(OsStatisticsProvider.class); + final List<OsStatisticsProvider> osStatisticsProviders = new ArrayList<>(); + for (OsStatisticsProvider osStatisticsProvider : loader) { + osStatisticsProviders.add(osStatisticsProvider); + } + return osStatisticsProviders.toArray(new OsStatisticsProvider[0]); + } + + private GemFireStatSampler(final @NotNull CancelCriterion cancelCriterion, + final @NotNull StatSamplerStats statSamplerStats, + final @NotNull LogFile logFile, + final @NotNull StatisticsConfig statisticsConfig, + final @NotNull StatisticsManager statisticsManager, + final @NotNull DistributionManager distributionManager, + final long systemId, + final @NotNull OsStatisticsProvider[] osStatisticsProviders) { super(cancelCriterion, statSamplerStats, logFile); this.systemId = systemId; this.statisticsConfig = statisticsConfig; this.statisticsManager = statisticsManager; this.distributionManager = distributionManager; + this.osStatisticsProviders = osStatisticsProviders; } /** @@ -274,13 +299,20 @@ public class GemFireStatSampler extends HostStatSampler { return; } + if (osStatisticsProviders.length == 0) { + logger.warn(LogMarker.STATISTICS_MARKER, "No OS statistics providers available."); + } + + final OsStatisticsFactory osStatisticsFactory = getOsStatisticsFactory(); try { - osStatisticsProvider.init(getOsStatisticsFactory(), pid); + for (final OsStatisticsProvider osStatisticsProvider : osStatisticsProviders) { + osStatisticsProvider.init(osStatisticsFactory, pid); + } } catch (OsStatisticsProviderException e) { logger.error(LogMarker.STATISTICS_MARKER, "Failed to initialize OS statistics.", e); } - processStats = null; // osStatisticsProvider.newProcessStats(stats); + processStats = null; // TODO jbarrett osStatisticsProvider.newProcessStats(stats); } @Override @@ -288,12 +320,16 @@ public class GemFireStatSampler extends HostStatSampler { if (prepareOnly || osStatsDisabled() || stopRequested()) { return; } - osStatisticsProvider.sample(); + for (final OsStatisticsProvider osStatisticsProvider : osStatisticsProviders) { + osStatisticsProvider.sample(); + } } @Override protected void closeProcessStats() { - osStatisticsProvider.destroy(); + for (final OsStatisticsProvider osStatisticsProvider : osStatisticsProviders) { + osStatisticsProvider.destroy(); + } } private void checkLocalListeners() { diff --git a/geode-core/src/main/java/org/apache/geode/internal/statistics/StatisticsRegistry.java b/geode-core/src/main/java/org/apache/geode/internal/statistics/StatisticsRegistry.java index 04db506..53f9c26 100644 --- a/geode-core/src/main/java/org/apache/geode/internal/statistics/StatisticsRegistry.java +++ b/geode-core/src/main/java/org/apache/geode/internal/statistics/StatisticsRegistry.java @@ -51,7 +51,8 @@ public class StatisticsRegistry implements StatisticsManager { * Creates an instance of OS Statistics for this registry. */ public interface OsStatisticsFactory { - Statistics create(StatisticsType type, String textId, long numericId, long uniqueId, StatisticsManager manager); + Statistics create(StatisticsType type, String textId, long numericId, long uniqueId, + StatisticsManager manager); } /** diff --git a/geode-core/src/main/java/org/apache/geode/internal/statistics/legacy/LegacyOsStatisticsProvider.java b/geode-core/src/main/java/org/apache/geode/internal/statistics/legacy/LegacyOsStatisticsProvider.java index 1578178..a40fadf 100644 --- a/geode-core/src/main/java/org/apache/geode/internal/statistics/legacy/LegacyOsStatisticsProvider.java +++ b/geode-core/src/main/java/org/apache/geode/internal/statistics/legacy/LegacyOsStatisticsProvider.java @@ -33,8 +33,6 @@ import org.apache.geode.internal.statistics.platform.ProcessStats; * Only Linux OS is currently allowed. */ public class LegacyOsStatisticsProvider implements OsStatisticsProvider { - private static final int PROCESS_STAT_FLAG = 1; - private static final int SYSTEM_STAT_FLAG = 2; private final boolean osStatsSupported; private Statistics systemStatistics; private Statistics processStatistics; diff --git a/geode-core/src/main/resources/META-INF/services/org.apache.geode.internal.statistics.OsStatisticsProvider b/geode-core/src/main/resources/META-INF/services/org.apache.geode.internal.statistics.OsStatisticsProvider new file mode 100644 index 0000000..64fc550 --- /dev/null +++ b/geode-core/src/main/resources/META-INF/services/org.apache.geode.internal.statistics.OsStatisticsProvider @@ -0,0 +1,17 @@ +# +# 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. +# + +org.apache.geode.internal.statistics.legacy.LegacyOsStatisticsProvider +org.apache.geode.internal.statistics.oshi.OshiStatisticsProvider diff --git a/geode-core/src/test/java/org/apache/geode/internal/statistics/StatisticsRegistryTest.java b/geode-core/src/test/java/org/apache/geode/internal/statistics/StatisticsRegistryTest.java index 0f8932a..9370966 100644 --- a/geode-core/src/test/java/org/apache/geode/internal/statistics/StatisticsRegistryTest.java +++ b/geode-core/src/test/java/org/apache/geode/internal/statistics/StatisticsRegistryTest.java @@ -314,7 +314,8 @@ public class StatisticsRegistryTest { when(osStatisticsFactory.create(any(), any(), anyLong(), anyLong(), any())) .thenReturn(statisticsCreatedByFactory); - Statistics result = registry.createOsStatistics(type, STATISTICS_TEXT_ID, STATISTICS_NUMERIC_ID); + Statistics result = + registry.createOsStatistics(type, STATISTICS_TEXT_ID, STATISTICS_NUMERIC_ID); assertThat(result) .isSameAs(statisticsCreatedByFactory);
