This is an automated email from the ASF dual-hosted git repository. udo pushed a commit to branch feature/Micrometer in repository https://gitbox.apache.org/repos/asf/geode.git
commit 4fc468e19c917e68e188509c8bca548716017b6f Author: Udo Kohlmeyer <[email protected]> AuthorDate: Mon Sep 10 15:42:14 2018 -0700 Further refactor Metrics to have cleaner abstraction of current metrics + micrometer --- .../distributed/internal/InternalLocator.java | 7 +- .../distributed/internal/LocatorStatsImpl.java | 5 +- ...temStats.java => GFSStatisticsFactoryImpl.java} | 312 +++++++-------------- .../statistics/InternalDistributedSystemStats.java | 306 ++------------------ geode-core/src/main/kotlin/Locator.kt | 1 + ...geode.stats.common.statistics.StatisticsFactory | 1 + .../micrometer/impl/MicrometerMeterGroup.kt | 5 + .../micrometer/MicrometerStatisticsFactoryImpl.kt | 3 + ...geode.stats.common.statistics.StatisticsFactory | 1 + geode-old-versions/build.gradle | 16 +- .../internal/statistics/StatisticsManager.java | 0 .../stats/common/statistics/StatisticsFactory.java | 4 + .../common/statistics/factory/StatsFactory.java | 149 +++++----- 13 files changed, 214 insertions(+), 596 deletions(-) diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalLocator.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalLocator.java index 982129f..cc84b67 100644 --- a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalLocator.java +++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalLocator.java @@ -311,10 +311,6 @@ public class InternalLocator extends Locator implements ConnectListener { newLocator = createLocator(port, logFile, logger, securityLogger, bindAddress, hostnameForClients, dsProperties, startDistributedSystem); - // newLocator.stats = - // StatsFactory.createLocatorStatsImpl(null, - // (newLocator.getHostnameForClients() + newLocator.getPort())); - try { newLocator.startPeerLocation(); @@ -348,6 +344,8 @@ public class InternalLocator extends Locator implements ConnectListener { newLocator.endStartLocator(null); startedLocator = true; + + return newLocator; } finally { @@ -1314,7 +1312,6 @@ public class InternalLocator extends Locator implements ConnectListener { @Override public void startJob() { stats.incRequestInProgress(1); - } @Override diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/LocatorStatsImpl.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/LocatorStatsImpl.java index de47b50..8039d3f 100755 --- a/geode-core/src/main/java/org/apache/geode/distributed/internal/LocatorStatsImpl.java +++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/LocatorStatsImpl.java @@ -20,6 +20,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import org.apache.geode.stats.common.distributed.internal.LocatorStats; +import org.apache.geode.stats.common.statistics.GFSStatsImplementer; import org.apache.geode.stats.common.statistics.StatisticDescriptor; import org.apache.geode.stats.common.statistics.Statistics; import org.apache.geode.stats.common.statistics.StatisticsFactory; @@ -30,7 +31,7 @@ import org.apache.geode.stats.common.statistics.StatisticsType; * * @since GemFire 5.7 */ -public class LocatorStatsImpl implements LocatorStats { +public class LocatorStatsImpl implements LocatorStats, GFSStatsImplementer { private static StatisticsType type; private static final String KNOWN_LOCATORS = LOCATORS; // gauge @@ -100,7 +101,7 @@ public class LocatorStatsImpl implements LocatorStats { /** * Creates a new <code>LocatorStats</code> and registers itself with the given statistics factory. */ - public LocatorStatsImpl(StatisticsFactory factory) { + public LocatorStatsImpl(StatisticsFactory factory, String identifier) { initializeStats(factory); } diff --git a/geode-core/src/main/java/org/apache/geode/internal/statistics/InternalDistributedSystemStats.java b/geode-core/src/main/java/org/apache/geode/internal/statistics/GFSStatisticsFactoryImpl.java similarity index 60% copy from geode-core/src/main/java/org/apache/geode/internal/statistics/InternalDistributedSystemStats.java copy to geode-core/src/main/java/org/apache/geode/internal/statistics/GFSStatisticsFactoryImpl.java index a3b578d..fcfaaf4 100644 --- a/geode-core/src/main/java/org/apache/geode/internal/statistics/InternalDistributedSystemStats.java +++ b/geode-core/src/main/java/org/apache/geode/internal/statistics/GFSStatisticsFactoryImpl.java @@ -1,110 +1,28 @@ -/* - * 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.io.IOException; import java.io.Reader; import java.util.ArrayList; import java.util.List; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.LongAdder; -import org.apache.geode.distributed.internal.DistributionConfig; import org.apache.geode.distributed.internal.InternalDistributedSystem; -import org.apache.geode.internal.cache.execute.FunctionServiceStats; import org.apache.geode.internal.i18n.LocalizedStrings; -import org.apache.geode.internal.statistics.platform.OsStatisticsFactory; -import org.apache.geode.statistics.micrometer.MicrometerStatisticsFactoryImpl; -import org.apache.geode.stats.common.internal.cache.execute.FunctionStats; import org.apache.geode.stats.common.statistics.StatisticDescriptor; import org.apache.geode.stats.common.statistics.Statistics; import org.apache.geode.stats.common.statistics.StatisticsFactory; import org.apache.geode.stats.common.statistics.StatisticsType; import org.apache.geode.stats.common.statistics.StatisticsTypeFactory; -import org.apache.geode.stats.common.statistics.factory.StatsFactory; -public class InternalDistributedSystemStats - implements StatisticsFactory, StatisticsManager, OsStatisticsFactory { - - /** - * The sampler for this DistributedSystem. - */ - private GemFireStatSampler sampler = null; +public class GFSStatisticsFactoryImpl implements StatisticsFactory, StatisticsManager { private final CopyOnWriteArrayList<Statistics> statsList = new CopyOnWriteArrayList<>(); private int statsListModCount = 0; private LongAdder statsListUniqueId = new LongAdder(); - // As the function execution stats can be lot in number, its better to put - // them in a map so that it will be accessible immediately - private final ConcurrentHashMap<String, FunctionStats> functionExecutionStatsMap = - new ConcurrentHashMap<>(); - private FunctionServiceStats functionServiceStats; - - private boolean statsDisabled; - // StatisticsTypeFactory methods - private StatisticsFactory statisticsTypeFactory; - - // TODO, sorry another singleton... BLECH!! - private static final InternalDistributedSystemStats singleton = - new InternalDistributedSystemStats(); - - private InternalDistributedSystemStats() {} - - // TODO Udo: We need to fix the bootstrapping to have DS's and DM's created in order to get the - // statsfactory created - public InternalDistributedSystemStats(boolean statsDisabled, - DistributionConfig distributionConfig, - InternalDistributedSystem internalDistributedSystem, - StatisticsTypeFactory statisticsTypeFactory) { - this.statisticsTypeFactory = (StatisticsFactory) statisticsTypeFactory; - this.statsDisabled = statsDisabled; - this.functionServiceStats = new FunctionServiceStats(this, "FunctionExecution"); - if (!statsDisabled && !(statisticsTypeFactory instanceof MicrometerStatisticsFactoryImpl)) { - this.sampler = new GemFireStatSampler(internalDistributedSystem.getId(), distributionConfig, - internalDistributedSystem.getCancelCriterion(), this, - internalDistributedSystem.getDistributionManager()); - this.sampler.start(); - - } - } - - public static InternalDistributedSystemStats createInstance(boolean statsDisabled, - DistributionConfig distributionConfig, - InternalDistributedSystem distributedSystem, - MicrometerStatisticsFactoryImpl statisticsTypeFactory) { - - singleton.statisticsTypeFactory = statisticsTypeFactory; - singleton.statsDisabled = statsDisabled; - singleton.functionServiceStats = new FunctionServiceStats(singleton, "FunctionExecution"); - if (!statsDisabled && !(statisticsTypeFactory instanceof MicrometerStatisticsFactoryImpl)) { - singleton.sampler = new GemFireStatSampler(distributedSystem.getId(), distributionConfig, - distributedSystem.getCancelCriterion(), singleton, - distributedSystem.getDistributionManager()); - singleton.sampler.start(); - - } - return singleton; - } - - public static InternalDistributedSystemStats getSingleton() { - return singleton; - } + private StatisticsTypeFactory statisticsTypeFactory = new StatisticsTypeFactoryImpl(); @Override public int getStatListModCount() { @@ -165,84 +83,6 @@ public class InternalDistributedSystemStats return statsList.toArray(new Statistics[0]); } - // StatisticsFactory methods - public Statistics createStatistics(StatisticsType type) { - return createOsStatistics(type, null, 0, 0); - } - - public Statistics createStatistics(StatisticsType type, String textId) { - return statisticsTypeFactory.createOsStatistics(type, textId, 0, 0); - } - - public Statistics createStatistics(StatisticsType type, String textId, long numericId) { - return createOsStatistics(type, textId, numericId, 0); - } - - public Statistics[] findStatisticsByType(final StatisticsType type) { - final ArrayList<Statistics> hits = new ArrayList<>(); - visitStatistics(vistorStatistic -> { - if (type == vistorStatistic.getType()) { - hits.add(vistorStatistic); - } - }); - Statistics[] result = new Statistics[hits.size()]; - return hits.toArray(result); - } - - public Statistics[] findStatisticsByTextId(final String textId) { - final ArrayList<Statistics> hits = new ArrayList<>(); - visitStatistics(vistorStatistic -> { - if (vistorStatistic.getTextId().equals(textId)) { - hits.add(vistorStatistic); - } - }); - Statistics[] result = new Statistics[hits.size()]; - return hits.toArray(result); - } - - public Statistics[] findStatisticsByNumericId(final long numericId) { - final ArrayList<Statistics> hits = new ArrayList<>(); - visitStatistics(vistorStatistic -> { - if (numericId == vistorStatistic.getNumericId()) { - hits.add(vistorStatistic); - } - }); - Statistics[] result = new Statistics[hits.size()]; - return hits.toArray(result); - } - - public Statistics findStatisticsByUniqueId(final long uniqueId) { - for (Statistics statistics : this.statsList) { - if (uniqueId == statistics.getUniqueId()) { - return statistics; - } - } - return null; - } - - /** - * for internal use only. Its called by {@link LocalStatisticsImpl#close}. - */ - public void destroyStatistics(Statistics stats) { - synchronized (statsList) { - if (statsList.remove(stats)) { - statsListModCount++; - } - } - } - - public Statistics createAtomicStatistics(StatisticsType type) { - return createAtomicStatistics(type, null, 0); - } - - public Statistics createAtomicStatistics(StatisticsType type, String textId) { - return createAtomicStatistics(type, textId, 0); - } - - public Statistics createAtomicStatistics(StatisticsType type, String textId, long numericId) { - return statisticsTypeFactory.createAtomicStatistics(type, textId, numericId); - } - /** * Creates or finds a StatisticType for the given shared class. */ @@ -262,23 +102,6 @@ public class InternalDistributedSystemStats } @Override - public Statistics createOsStatistics(StatisticsType type, String textId, long numericId, - int osStatFlags) { - if (this.statsDisabled) { - return new DummyStatisticsImpl(type, textId, numericId); - } - statsListUniqueId.increment(); - Statistics result = - new LocalStatisticsImpl(type, textId, numericId, statsListUniqueId.longValue(), false, - osStatFlags, this); - synchronized (statsList) { - statsList.add(result); - statsListModCount++; - } - return result; - } - - @Override public StatisticDescriptor createIntCounter(String name, String description, String units) { return statisticsTypeFactory.createIntCounter(name, description, units); } @@ -310,56 +133,125 @@ public class InternalDistributedSystemStats @Override public StatisticDescriptor createIntCounter(String name, String description, String units, - boolean largerBetter) { + boolean largerBetter) { return statisticsTypeFactory.createIntCounter(name, description, units, largerBetter); } @Override public StatisticDescriptor createLongCounter(String name, String description, String units, - boolean largerBetter) { + boolean largerBetter) { return statisticsTypeFactory.createLongCounter(name, description, units, largerBetter); } @Override public StatisticDescriptor createDoubleCounter(String name, String description, String units, - boolean largerBetter) { + boolean largerBetter) { return statisticsTypeFactory.createDoubleCounter(name, description, units, largerBetter); } @Override public StatisticDescriptor createIntGauge(String name, String description, String units, - boolean largerBetter) { + boolean largerBetter) { return statisticsTypeFactory.createIntGauge(name, description, units, largerBetter); } @Override public StatisticDescriptor createLongGauge(String name, String description, String units, - boolean largerBetter) { + boolean largerBetter) { return statisticsTypeFactory.createLongGauge(name, description, units, largerBetter); } @Override public StatisticDescriptor createDoubleGauge(String name, String description, String units, - boolean largerBetter) { + boolean largerBetter) { return statisticsTypeFactory.createDoubleGauge(name, description, units, largerBetter); } - public FunctionStats getFunctionStats(String textId) { - FunctionStats stats = functionExecutionStatsMap.get(textId); - if (stats == null) { - stats = StatsFactory.createStatsImpl(FunctionStats.class, this, textId); - FunctionStats oldStats = functionExecutionStatsMap.putIfAbsent(textId, stats); - if (oldStats != null) { - stats.close(); - stats = oldStats; + // StatisticsFactory methods + @Override + public Statistics createStatistics(StatisticsType type) { + return createOsStatistics(type, null, 0, 0); + } + + @Override + public Statistics createStatistics(StatisticsType type, String textId) { + return statisticsTypeFactory.createOsStatistics(type, textId, 0, 0); + } + + @Override + public Statistics createStatistics(StatisticsType type, String textId, long numericId) { + return createOsStatistics(type, textId, numericId, 0); + } + + @Override + public Statistics[] findStatisticsByType(final StatisticsType type) { + final ArrayList<Statistics> hits = new ArrayList<>(); + visitStatistics(vistorStatistic -> { + if (type == vistorStatistic.getType()) { + hits.add(vistorStatistic); + } + }); + Statistics[] result = new Statistics[hits.size()]; + return hits.toArray(result); + } + + @Override + public Statistics[] findStatisticsByTextId(final String textId) { + final ArrayList<Statistics> hits = new ArrayList<>(); + visitStatistics(vistorStatistic -> { + if (vistorStatistic.getTextId().equals(textId)) { + hits.add(vistorStatistic); + } + }); + Statistics[] result = new Statistics[hits.size()]; + return hits.toArray(result); + } + + @Override + public Statistics[] findStatisticsByNumericId(final long numericId) { + final ArrayList<Statistics> hits = new ArrayList<>(); + visitStatistics(vistorStatistic -> { + if (numericId == vistorStatistic.getNumericId()) { + hits.add(vistorStatistic); + } + }); + Statistics[] result = new Statistics[hits.size()]; + return hits.toArray(result); + } + + public Statistics findStatisticsByUniqueId(final long uniqueId) { + for (Statistics statistics : this.statsList) { + if (uniqueId == statistics.getUniqueId()) { + return statistics; } } - return stats; + return null; } + /** + * for internal use only. Its called by {@link LocalStatisticsImpl#close}. + */ + @Override + public void destroyStatistics(Statistics stats) { + synchronized (statsList) { + if (statsList.remove(stats)) { + statsListModCount++; + } + } + } - public FunctionServiceStats getFunctionServiceStats() { - return functionServiceStats; + @Override + public Statistics createOsStatistics(StatisticsType type, String textId, long numericId, + int osStatFlags) { + statsListUniqueId.increment(); + Statistics result = + new LocalStatisticsImpl(type, textId, numericId, statsListUniqueId.longValue(), false, + osStatFlags, this); + synchronized (statsList) { + statsList.add(result); + statsListModCount++; + } + return result; } /** @@ -372,26 +264,20 @@ public class InternalDistributedSystemStats } } - public Set<String> getAllFunctionExecutionIds() { - return functionExecutionStatsMap.keySet(); + @Override + public Statistics createAtomicStatistics(StatisticsType type) { + return createAtomicStatistics(type, null, 0); } - public void closeStats() { - // closing the Aggregate stats - if (functionServiceStats != null) { - functionServiceStats.close(); - } - // closing individual function stats - for (FunctionStats functionstats : functionExecutionStatsMap.values()) { - functionstats.close(); - } - - if (sampler != null) { - this.sampler.stop(); - } + @Override + public Statistics createAtomicStatistics(StatisticsType type, String textId) { + return createAtomicStatistics(type, textId, 0); } - public GemFireStatSampler getStatSampler() { - return this.sampler; + @Override + public Statistics createAtomicStatistics(StatisticsType type, String textId, long numericId) { + statsListUniqueId.increment(); + return StatisticsImpl + .createAtomicNoOS(type, textId, numericId, statsListUniqueId.longValue(), this); } } diff --git a/geode-core/src/main/java/org/apache/geode/internal/statistics/InternalDistributedSystemStats.java b/geode-core/src/main/java/org/apache/geode/internal/statistics/InternalDistributedSystemStats.java index a3b578d..9452512 100644 --- a/geode-core/src/main/java/org/apache/geode/internal/statistics/InternalDistributedSystemStats.java +++ b/geode-core/src/main/java/org/apache/geode/internal/statistics/InternalDistributedSystemStats.java @@ -14,67 +14,43 @@ */ package org.apache.geode.internal.statistics; -import java.io.IOException; -import java.io.Reader; -import java.util.ArrayList; -import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.atomic.LongAdder; import org.apache.geode.distributed.internal.DistributionConfig; import org.apache.geode.distributed.internal.InternalDistributedSystem; import org.apache.geode.internal.cache.execute.FunctionServiceStats; -import org.apache.geode.internal.i18n.LocalizedStrings; -import org.apache.geode.internal.statistics.platform.OsStatisticsFactory; import org.apache.geode.statistics.micrometer.MicrometerStatisticsFactoryImpl; import org.apache.geode.stats.common.internal.cache.execute.FunctionStats; -import org.apache.geode.stats.common.statistics.StatisticDescriptor; -import org.apache.geode.stats.common.statistics.Statistics; -import org.apache.geode.stats.common.statistics.StatisticsFactory; -import org.apache.geode.stats.common.statistics.StatisticsType; -import org.apache.geode.stats.common.statistics.StatisticsTypeFactory; import org.apache.geode.stats.common.statistics.factory.StatsFactory; -public class InternalDistributedSystemStats - implements StatisticsFactory, StatisticsManager, OsStatisticsFactory { - - /** - * The sampler for this DistributedSystem. - */ - private GemFireStatSampler sampler = null; - - private final CopyOnWriteArrayList<Statistics> statsList = new CopyOnWriteArrayList<>(); - private int statsListModCount = 0; - private LongAdder statsListUniqueId = new LongAdder(); +public class InternalDistributedSystemStats { + // implements OsStatisticsFactory { + // TODO, sorry another singleton... BLECH!! + private static final InternalDistributedSystemStats singleton = + new InternalDistributedSystemStats(); // As the function execution stats can be lot in number, its better to put // them in a map so that it will be accessible immediately private final ConcurrentHashMap<String, FunctionStats> functionExecutionStatsMap = new ConcurrentHashMap<>(); + /** + * The sampler for this DistributedSystem. + */ + private GemFireStatSampler sampler = null; private FunctionServiceStats functionServiceStats; - private boolean statsDisabled; - // StatisticsTypeFactory methods - private StatisticsFactory statisticsTypeFactory; - - // TODO, sorry another singleton... BLECH!! - private static final InternalDistributedSystemStats singleton = - new InternalDistributedSystemStats(); - private InternalDistributedSystemStats() {} // TODO Udo: We need to fix the bootstrapping to have DS's and DM's created in order to get the // statsfactory created public InternalDistributedSystemStats(boolean statsDisabled, DistributionConfig distributionConfig, - InternalDistributedSystem internalDistributedSystem, - StatisticsTypeFactory statisticsTypeFactory) { - this.statisticsTypeFactory = (StatisticsFactory) statisticsTypeFactory; + InternalDistributedSystem internalDistributedSystem) { this.statsDisabled = statsDisabled; - this.functionServiceStats = new FunctionServiceStats(this, "FunctionExecution"); + this.functionServiceStats = + StatsFactory.createStatsImpl(FunctionServiceStats.class, "FunctionExecution"); if (!statsDisabled && !(statisticsTypeFactory instanceof MicrometerStatisticsFactoryImpl)) { this.sampler = new GemFireStatSampler(internalDistributedSystem.getId(), distributionConfig, internalDistributedSystem.getCancelCriterion(), this, @@ -86,12 +62,11 @@ public class InternalDistributedSystemStats public static InternalDistributedSystemStats createInstance(boolean statsDisabled, DistributionConfig distributionConfig, - InternalDistributedSystem distributedSystem, - MicrometerStatisticsFactoryImpl statisticsTypeFactory) { + InternalDistributedSystem distributedSystem) { - singleton.statisticsTypeFactory = statisticsTypeFactory; singleton.statsDisabled = statsDisabled; - singleton.functionServiceStats = new FunctionServiceStats(singleton, "FunctionExecution"); + singleton.functionServiceStats = + StatsFactory.createStatsImpl(FunctionServiceStats.class, "FunctionExecution"); if (!statsDisabled && !(statisticsTypeFactory instanceof MicrometerStatisticsFactoryImpl)) { singleton.sampler = new GemFireStatSampler(distributedSystem.getId(), distributionConfig, distributedSystem.getCancelCriterion(), singleton, @@ -106,248 +81,10 @@ public class InternalDistributedSystemStats return singleton; } - @Override - public int getStatListModCount() { - return this.statsListModCount; - } - - @Override - public List<Statistics> getStatsList() { - return this.statsList; - } - - @Override - public String getName() { - return null; - } - - @Override - public long getId() { - return 0; - } - - @Override - public long getStartTime() { - return 0; - } - - @Override - public int getStatisticsCount() { - return ((List<Statistics>) this.statsList).size(); - } - - @Override - public Statistics findStatistics(long id) { - List<Statistics> statsList = this.statsList; - for (Statistics statistics : statsList) { - if (statistics.getUniqueId() == id) { - return statistics; - } - } - throw new RuntimeException( - LocalizedStrings.PureStatSampler_COULD_NOT_FIND_STATISTICS_INSTANCE.toLocalizedString()); - } - - @Override - public boolean statisticsExists(long id) { - List<Statistics> statsList = this.statsList; - for (Statistics statistics : statsList) { - if (statistics.getUniqueId() == id) { - return true; - } - } - return false; - } - - @Override - public Statistics[] getStatistics() { - List<Statistics> statsList = this.statsList; - return statsList.toArray(new Statistics[0]); - } - - // StatisticsFactory methods - public Statistics createStatistics(StatisticsType type) { - return createOsStatistics(type, null, 0, 0); - } - - public Statistics createStatistics(StatisticsType type, String textId) { - return statisticsTypeFactory.createOsStatistics(type, textId, 0, 0); - } - - public Statistics createStatistics(StatisticsType type, String textId, long numericId) { - return createOsStatistics(type, textId, numericId, 0); - } - - public Statistics[] findStatisticsByType(final StatisticsType type) { - final ArrayList<Statistics> hits = new ArrayList<>(); - visitStatistics(vistorStatistic -> { - if (type == vistorStatistic.getType()) { - hits.add(vistorStatistic); - } - }); - Statistics[] result = new Statistics[hits.size()]; - return hits.toArray(result); - } - - public Statistics[] findStatisticsByTextId(final String textId) { - final ArrayList<Statistics> hits = new ArrayList<>(); - visitStatistics(vistorStatistic -> { - if (vistorStatistic.getTextId().equals(textId)) { - hits.add(vistorStatistic); - } - }); - Statistics[] result = new Statistics[hits.size()]; - return hits.toArray(result); - } - - public Statistics[] findStatisticsByNumericId(final long numericId) { - final ArrayList<Statistics> hits = new ArrayList<>(); - visitStatistics(vistorStatistic -> { - if (numericId == vistorStatistic.getNumericId()) { - hits.add(vistorStatistic); - } - }); - Statistics[] result = new Statistics[hits.size()]; - return hits.toArray(result); - } - - public Statistics findStatisticsByUniqueId(final long uniqueId) { - for (Statistics statistics : this.statsList) { - if (uniqueId == statistics.getUniqueId()) { - return statistics; - } - } - return null; - } - - /** - * for internal use only. Its called by {@link LocalStatisticsImpl#close}. - */ - public void destroyStatistics(Statistics stats) { - synchronized (statsList) { - if (statsList.remove(stats)) { - statsListModCount++; - } - } - } - - public Statistics createAtomicStatistics(StatisticsType type) { - return createAtomicStatistics(type, null, 0); - } - - public Statistics createAtomicStatistics(StatisticsType type, String textId) { - return createAtomicStatistics(type, textId, 0); - } - - public Statistics createAtomicStatistics(StatisticsType type, String textId, long numericId) { - return statisticsTypeFactory.createAtomicStatistics(type, textId, numericId); - } - - /** - * Creates or finds a StatisticType for the given shared class. - */ - @Override - public StatisticsType createType(String name, String description, StatisticDescriptor[] stats) { - return statisticsTypeFactory.createType(name, description, stats); - } - - @Override - public StatisticsType findType(String name) { - return statisticsTypeFactory.findType(name); - } - - @Override - public StatisticsType[] createTypesFromXml(Reader reader) throws IOException { - return statisticsTypeFactory.createTypesFromXml(reader); - } - - @Override - public Statistics createOsStatistics(StatisticsType type, String textId, long numericId, - int osStatFlags) { - if (this.statsDisabled) { - return new DummyStatisticsImpl(type, textId, numericId); - } - statsListUniqueId.increment(); - Statistics result = - new LocalStatisticsImpl(type, textId, numericId, statsListUniqueId.longValue(), false, - osStatFlags, this); - synchronized (statsList) { - statsList.add(result); - statsListModCount++; - } - return result; - } - - @Override - public StatisticDescriptor createIntCounter(String name, String description, String units) { - return statisticsTypeFactory.createIntCounter(name, description, units); - } - - @Override - public StatisticDescriptor createLongCounter(String name, String description, String units) { - return statisticsTypeFactory.createLongCounter(name, description, units); - } - - @Override - public StatisticDescriptor createDoubleCounter(String name, String description, String units) { - return statisticsTypeFactory.createDoubleCounter(name, description, units); - } - - @Override - public StatisticDescriptor createIntGauge(String name, String description, String units) { - return statisticsTypeFactory.createIntGauge(name, description, units); - } - - @Override - public StatisticDescriptor createLongGauge(String name, String description, String units) { - return statisticsTypeFactory.createLongGauge(name, description, units); - } - - @Override - public StatisticDescriptor createDoubleGauge(String name, String description, String units) { - return statisticsTypeFactory.createDoubleGauge(name, description, units); - } - - @Override - public StatisticDescriptor createIntCounter(String name, String description, String units, - boolean largerBetter) { - return statisticsTypeFactory.createIntCounter(name, description, units, largerBetter); - } - - @Override - public StatisticDescriptor createLongCounter(String name, String description, String units, - boolean largerBetter) { - return statisticsTypeFactory.createLongCounter(name, description, units, largerBetter); - } - - @Override - public StatisticDescriptor createDoubleCounter(String name, String description, String units, - boolean largerBetter) { - return statisticsTypeFactory.createDoubleCounter(name, description, units, largerBetter); - } - - @Override - public StatisticDescriptor createIntGauge(String name, String description, String units, - boolean largerBetter) { - return statisticsTypeFactory.createIntGauge(name, description, units, largerBetter); - } - - @Override - public StatisticDescriptor createLongGauge(String name, String description, String units, - boolean largerBetter) { - return statisticsTypeFactory.createLongGauge(name, description, units, largerBetter); - } - - @Override - public StatisticDescriptor createDoubleGauge(String name, String description, String units, - boolean largerBetter) { - return statisticsTypeFactory.createDoubleGauge(name, description, units, largerBetter); - } - public FunctionStats getFunctionStats(String textId) { FunctionStats stats = functionExecutionStatsMap.get(textId); if (stats == null) { - stats = StatsFactory.createStatsImpl(FunctionStats.class, this, textId); + stats = StatsFactory.createStatsImpl(FunctionStats.class, textId); FunctionStats oldStats = functionExecutionStatsMap.putIfAbsent(textId, stats); if (oldStats != null) { stats.close(); @@ -357,21 +94,10 @@ public class InternalDistributedSystemStats return stats; } - public FunctionServiceStats getFunctionServiceStats() { return functionServiceStats; } - /** - * For every registered statistic instance call the specified visitor. This method was added to - * fix bug 40358 - */ - public void visitStatistics(InternalDistributedSystem.StatisticsVisitor visitor) { - for (Statistics s : this.statsList) { - visitor.visit(s); - } - } - public Set<String> getAllFunctionExecutionIds() { return functionExecutionStatsMap.keySet(); } diff --git a/geode-core/src/main/kotlin/Locator.kt b/geode-core/src/main/kotlin/Locator.kt index d1da1ff..665cbed 100644 --- a/geode-core/src/main/kotlin/Locator.kt +++ b/geode-core/src/main/kotlin/Locator.kt @@ -5,6 +5,7 @@ fun main(args: Array<String>) { val build = LocatorLauncher.Builder().apply { port = 44550 set("statistic-sampling-enabled", "true") + set(ConfigurationProperties.ENABLE_TIME_STATISTICS, "true") set(ConfigurationProperties.JMX_MANAGER, "false") set(ConfigurationProperties.JMX_MANAGER_START, "false") set(ConfigurationProperties.ENABLE_CLUSTER_CONFIGURATION, "false") diff --git a/geode-core/src/main/resources/META-INF/services/org.apache.geode.stats.common.statistics.StatisticsFactory b/geode-core/src/main/resources/META-INF/services/org.apache.geode.stats.common.statistics.StatisticsFactory new file mode 100644 index 0000000..db19fd9 --- /dev/null +++ b/geode-core/src/main/resources/META-INF/services/org.apache.geode.stats.common.statistics.StatisticsFactory @@ -0,0 +1 @@ +org.apache.geode.internal.statistics.GFSStatisticFactoryImpl \ No newline at end of file diff --git a/geode-micrometer-stats/src/main/kotlin/org/apache/geode/statistics/internal/micrometer/impl/MicrometerMeterGroup.kt b/geode-micrometer-stats/src/main/kotlin/org/apache/geode/statistics/internal/micrometer/impl/MicrometerMeterGroup.kt index 9cf1499..44d2c28 100644 --- a/geode-micrometer-stats/src/main/kotlin/org/apache/geode/statistics/internal/micrometer/impl/MicrometerMeterGroup.kt +++ b/geode-micrometer-stats/src/main/kotlin/org/apache/geode/statistics/internal/micrometer/impl/MicrometerMeterGroup.kt @@ -22,6 +22,10 @@ import org.apache.geode.statistics.micrometer.MicrometerStatsImplementer abstract class MicrometerMeterGroup(private val statisticsFactory: StatisticsFactory?, private val groupName: String) : StatisticsMeterGroup, MeterBinder, MicrometerStatsImplementer { + init{ + initializeImplementer(statisticsFactory) + registerStatsImplementer(statisticsFactory) + } private val registeredMeters = mutableListOf<MicrometerStatisticMeter>() private val registeredMeterGroups = mutableListOf<MicrometerMeterGroup>() @@ -40,6 +44,7 @@ abstract class MicrometerMeterGroup(private val statisticsFactory: StatisticsFac } override fun getMeterGroupName(): String = groupName + override fun bindTo(registry: MeterRegistry) { registeredMeters.forEach {it.register(registry, commonGroupTags) } registeredMeterGroups.forEach { micrometerMeterGroup -> micrometerMeterGroup.registeredMeters.forEach { it.register(registry, commonGroupTags) } } diff --git a/geode-micrometer-stats/src/main/kotlin/org/apache/geode/statistics/micrometer/MicrometerStatisticsFactoryImpl.kt b/geode-micrometer-stats/src/main/kotlin/org/apache/geode/statistics/micrometer/MicrometerStatisticsFactoryImpl.kt index 5bbfa79..5c44415 100644 --- a/geode-micrometer-stats/src/main/kotlin/org/apache/geode/statistics/micrometer/MicrometerStatisticsFactoryImpl.kt +++ b/geode-micrometer-stats/src/main/kotlin/org/apache/geode/statistics/micrometer/MicrometerStatisticsFactoryImpl.kt @@ -30,6 +30,9 @@ class MicrometerStatisticsFactoryImpl(vararg meterRegistries: MeterRegistry = ar private val micrometerStatisticsManager = MicrometerStatisticsManager.createWithRegistries(meterRegistries) private val meterGroupMap = hashMapOf<String, StatisticsType>() + override fun getType(): String = "Micrometer" + + override fun createOsStatistics(type: StatisticsType?, textId: String, numericId: Long, osStatFlags: Int): Statistics = MicrometerStatisticsImpl(0, type as MicrometerStatisticsType, textId, numericId) diff --git a/geode-micrometer-stats/src/main/resources/META-INF/services/org.apache.geode.stats.common.statistics.StatisticsFactory b/geode-micrometer-stats/src/main/resources/META-INF/services/org.apache.geode.stats.common.statistics.StatisticsFactory new file mode 100644 index 0000000..1830ba1 --- /dev/null +++ b/geode-micrometer-stats/src/main/resources/META-INF/services/org.apache.geode.stats.common.statistics.StatisticsFactory @@ -0,0 +1 @@ +org.apache.geode.statistics.micrometer.MicrometerStatisticsFactoryImpl \ No newline at end of file diff --git a/geode-old-versions/build.gradle b/geode-old-versions/build.gradle index 06de76f..791909d 100644 --- a/geode-old-versions/build.gradle +++ b/geode-old-versions/build.gradle @@ -28,14 +28,14 @@ task createGeodeClasspathsFile { // Add sourceSets for backwards compatibility, rolling upgrade, and // pdx testing. - addOldVersion('test100', '1.0.0-incubating', false) - addOldVersion('test110', '1.1.0', false) - addOldVersion('test111', '1.1.1', false) - addOldVersion('test120', '1.2.0', true) - addOldVersion('test130', '1.3.0', true) - addOldVersion('test140', '1.4.0', true) - addOldVersion('test150', '1.5.0', true) - addOldVersion('test160', '1.6.0', true) +// addOldVersion('test100', '1.0.0-incubating', false) +// addOldVersion('test110', '1.1.0', false) +// addOldVersion('test111', '1.1.1', false) +// addOldVersion('test120', '1.2.0', true) +// addOldVersion('test130', '1.3.0', true) +// addOldVersion('test140', '1.4.0', true) +// addOldVersion('test150', '1.5.0', true) +// addOldVersion('test160', '1.6.0', true) doLast { Properties versions = new Properties(); diff --git a/geode-core/src/main/java/org/apache/geode/internal/statistics/StatisticsManager.java b/geode-stats-common/src/main/java/org/apache/geode/internal/statistics/StatisticsManager.java similarity index 100% rename from geode-core/src/main/java/org/apache/geode/internal/statistics/StatisticsManager.java rename to geode-stats-common/src/main/java/org/apache/geode/internal/statistics/StatisticsManager.java diff --git a/geode-stats-common/src/main/java/org/apache/geode/stats/common/statistics/StatisticsFactory.java b/geode-stats-common/src/main/java/org/apache/geode/stats/common/statistics/StatisticsFactory.java index c8452d2..f037c5b 100644 --- a/geode-stats-common/src/main/java/org/apache/geode/stats/common/statistics/StatisticsFactory.java +++ b/geode-stats-common/src/main/java/org/apache/geode/stats/common/statistics/StatisticsFactory.java @@ -158,4 +158,8 @@ public interface StatisticsFactory extends StatisticsTypeFactory { * Returns an array of all the existing statistics with the given numericId. */ Statistics[] findStatisticsByNumericId(long numericId); + + default String getType() { + return "GeodeStats"; + } } diff --git a/geode-stats-common/src/main/java/org/apache/geode/stats/common/statistics/factory/StatsFactory.java b/geode-stats-common/src/main/java/org/apache/geode/stats/common/statistics/factory/StatsFactory.java index 582a720..04aa928 100644 --- a/geode-stats-common/src/main/java/org/apache/geode/stats/common/statistics/factory/StatsFactory.java +++ b/geode-stats-common/src/main/java/org/apache/geode/stats/common/statistics/factory/StatsFactory.java @@ -19,6 +19,7 @@ import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.ServiceLoader; import org.reflections.Reflections; import org.reflections.scanners.ResourcesScanner; @@ -38,51 +39,36 @@ import org.apache.geode.stats.common.statistics.StatsImplementer; public class StatsFactory { - private static final StatsFactory statsFactory = new StatsFactory(getStatsImplementor()); - - + private static final boolean isExperimentalEnabled = + Boolean.getBoolean("geode.experimental.stats.micrometer"); + private static final StatsFactory statsFactory = + new StatsFactory(getStatsImplementor(), getStatisticsTypeFactory()); private final Class<? extends StatsImplementer> selectedStatsImplementor; private final Map<Class<?>, Class<? extends StatsImplementer>> resolvedStatsImplForClass = new HashMap<>(); - private final Reflections reflections; + private final StatisticsFactory statisticsFactory; - private StatsFactory(Class<? extends StatsImplementer> selectedStatsImplementor) { + private StatsFactory(Class<? extends StatsImplementer> selectedStatsImplementor, + StatisticsFactory statisticsFactory) { List<ClassLoader> classLoadersList = new LinkedList<>(); classLoadersList.add(ClasspathHelper.contextClassLoader()); classLoadersList.add(ClasspathHelper.staticClassLoader()); - reflections = new Reflections(new ConfigurationBuilder() + /* don't exclude Object.class */ + Reflections reflections = new Reflections(new ConfigurationBuilder() .setScanners(new SubTypesScanner(false /* don't exclude Object.class */), new ResourcesScanner()) .setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0]))) .filterInputsBy(new FilterBuilder() .includePackage("org.apache.geode..*").excludePackage("org.springframework..*"))); this.selectedStatsImplementor = selectedStatsImplementor; + this.statisticsFactory = statisticsFactory; initializeStatsImplementations(reflections); - System.out.println("StatsFactory.StatsFactory"); - } - - private void initializeStatsImplementations(Reflections reflections) { - reflections.getSubTypesOf(Stats.class) - .stream().filter(Class::isInterface) - .forEach(interfaze -> reflections.getSubTypesOf(interfaze).stream() - .filter(selectedStatsImplementor::isAssignableFrom) - .forEach(aClass -> resolvedStatsImplForClass - .put(interfaze, (Class<? extends StatsImplementer>) aClass))); - // The loading of CachePerfStats implementations needs to be special cased, - // as RegionPerfStats is also of type CachePerfStats, which causes problems when you - // want to find the direct implementation of CachePerfStats - reflections.getSubTypesOf(CachePerfStats.class).stream() - .filter(clazz -> selectedStatsImplementor.isAssignableFrom(clazz) - && !RegionPerfStats.class.isAssignableFrom(clazz) && !clazz.getName() - .contains("DummyCachePerfStats")) - .forEach(aClass -> resolvedStatsImplForClass - .put(CachePerfStats.class, (Class<? extends StatsImplementer>) aClass)); } private static Class<? extends StatsImplementer> getStatsImplementor() { try { - return Boolean.getBoolean("geode.experimental.stats.micrometer") + return isExperimentalEnabled ? (Class<? extends StatsImplementer>) Class .forName("org.apache.geode.statistics.micrometer.MicrometerStatsImplementer") : GFSStatsImplementer.class; @@ -92,58 +78,54 @@ public class StatsFactory { } } + private static StatisticsFactory getStatisticsTypeFactory() { + final ServiceLoader<StatisticsFactory> services = ServiceLoader.load(StatisticsFactory.class); + for (StatisticsFactory statisticsFactory : services) { + if (isExperimentalEnabled && statisticsFactory.getType().equals("Micrometer")) { + return statisticsFactory; + } else if (statisticsFactory.getType().equals("GeodeStats")) { + return statisticsFactory; + } + } + throw new IllegalStateException( + "There should have been a statsfactory found. Please check your settings"); + } + public static <V extends StatsImplementer> V createStatsImpl(Class<?> interfaceClazz, - StatisticsFactory statisticsFactory, String identifier) { - return (V) resolveInstanceFromClass(interfaceClazz, statisticsFactory, identifier); + return (V) resolveInstanceFromClass(interfaceClazz, identifier); } - public static ConnectionStats createConnectionStatsImpl(StatisticsFactory dummyStatisticsFactory, + public static ConnectionStats createConnectionStatsImpl( String statName, PoolStats poolStats) { - return (ConnectionStats) resolveConnectionStatInstanceFromClass(ConnectionStats.class, - dummyStatisticsFactory, - statName, poolStats); + return (ConnectionStats) resolveConnectionStatInstanceFromClass(statName, poolStats); } - public static CachePerfStats createCachePerfStatsImpl(StatisticsFactory statisticsFactory, - String name) { - return (CachePerfStats) resolveCachePerfInstanceFromClass( - statisticsFactory, name); + public static CachePerfStats createCachePerfStatsImpl(String name) { + return (CachePerfStats) resolveCachePerfInstanceFromClass(name); } - - private static StatsImplementer resolveInstanceFromClass(Class<?> interfaceClazz, - StatisticsFactory statisticsFactory, - String name) { - return statsFactory.createInstanceFromClass(interfaceClazz, statisticsFactory, name); + private static StatsImplementer resolveInstanceFromClass(Class<?> interfaceClazz, String name) { + return statsFactory.createInstanceFromClass(interfaceClazz, name); } - private static StatsImplementer resolveCachePerfInstanceFromClass( - StatisticsFactory statisticsFactory, - String name) { - return statsFactory.createInstanceFromClass(CachePerfStats.class, statisticsFactory, name); + private static StatsImplementer resolveCachePerfInstanceFromClass(String name) { + return statsFactory.createInstanceFromClass(CachePerfStats.class, name); } - private static StatsImplementer resolveConnectionStatInstanceFromClass(Class<?> interfaceClazz, - StatisticsFactory statisticsFactory, - String name, + private static StatsImplementer resolveConnectionStatInstanceFromClass(String name, PoolStats poolStats) { - return statsFactory.createConnectionStatInstanceFromClass(statisticsFactory, name, poolStats); + return statsFactory.createConnectionStatInstanceFromClass(name, poolStats); } public static RegionPerfStats createRegionPerfStatsImplFromClass(Class<?> interfaceClazz, - StatisticsFactory statisticsFactory, - CachePerfStats cachePerfStats, - String regionName) { - Class<? extends StatsImplementer> resolvedLocatorClassImpl; + CachePerfStats cachePerfStats, String regionName) { try { - resolvedLocatorClassImpl = statsFactory.resolvedStatsImplForClass.get(interfaceClazz); - StatsImplementer statsImplementor = resolvedLocatorClassImpl + Class<? extends StatsImplementer> resolvedLocatorClassImpl = + statsFactory.resolvedStatsImplForClass.get(interfaceClazz); + return (RegionPerfStats) resolvedLocatorClassImpl .getDeclaredConstructor(StatisticsFactory.class, CachePerfStats.class, String.class) - .newInstance(statisticsFactory, cachePerfStats, regionName); - statsImplementor.initializeImplementer(statisticsFactory); - statsImplementor.registerStatsImplementer(statisticsFactory); - return (RegionPerfStats) statsImplementor; + .newInstance(statsFactory.getStatisticsFactory(), cachePerfStats, regionName); } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { e.printStackTrace(); @@ -151,19 +133,35 @@ public class StatsFactory { return null; } - private StatsImplementer createConnectionStatInstanceFromClass( - StatisticsFactory statisticsFactory, - String locatorName, PoolStats poolStats) { - Class<? extends StatsImplementer> resolvedLocatorClassImpl; + private StatisticsFactory getStatisticsFactory() { + return statisticsFactory; + } + + private void initializeStatsImplementations(Reflections reflections) { + reflections.getSubTypesOf(Stats.class) + .stream().filter(Class::isInterface) + .forEach(interfaze -> reflections.getSubTypesOf(interfaze).stream() + .filter(selectedStatsImplementor::isAssignableFrom) + .forEach(aClass -> resolvedStatsImplForClass + .put(interfaze, (Class<? extends StatsImplementer>) aClass))); + // The loading of CachePerfStats implementations needs to be special cased, + // as RegionPerfStats is also of type CachePerfStats, which causes problems when you + // want to find the direct implementation of CachePerfStats + reflections.getSubTypesOf(CachePerfStats.class).stream() + .filter(clazz -> selectedStatsImplementor.isAssignableFrom(clazz) + && !RegionPerfStats.class.isAssignableFrom(clazz) && !clazz.getName() + .contains("DummyCachePerfStats")) + .forEach(aClass -> resolvedStatsImplForClass + .put(CachePerfStats.class, (Class<? extends StatsImplementer>) aClass)); + } + + private StatsImplementer createConnectionStatInstanceFromClass(String locatorName, PoolStats poolStats) { try { - resolvedLocatorClassImpl = resolveImplementationForClass(ConnectionStats.class); - StatsImplementer statsImplementor = - resolvedLocatorClassImpl - .getDeclaredConstructor(StatisticsFactory.class, String.class, PoolStats.class) - .newInstance(statisticsFactory, locatorName, poolStats); - statsImplementor.initializeImplementer(statisticsFactory); - statsImplementor.registerStatsImplementer(statisticsFactory); - return statsImplementor; + Class<? extends StatsImplementer> resolvedLocatorClassImpl = + resolveImplementationForClass(ConnectionStats.class); + return resolvedLocatorClassImpl + .getDeclaredConstructor(StatisticsFactory.class, String.class, PoolStats.class) + .newInstance(statisticsFactory, locatorName, poolStats); } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { e.printStackTrace(); @@ -181,18 +179,13 @@ public class StatsFactory { return resolvedLocatorClassImpl; } - private StatsImplementer createInstanceFromClass(Class<?> interfaceClazz, - StatisticsFactory statisticsFactory, - String name) { + private StatsImplementer createInstanceFromClass(Class<?> interfaceClazz, String name) { try { Class<? extends StatsImplementer> resolvedLocatorClassImpl = resolveImplementationForClass(interfaceClazz); - StatsImplementer statsImplementor = resolvedLocatorClassImpl + return resolvedLocatorClassImpl .getDeclaredConstructor(StatisticsFactory.class, String.class) .newInstance(statisticsFactory, name); - statsImplementor.initializeImplementer(statisticsFactory); - statsImplementor.registerStatsImplementer(statisticsFactory); - return statsImplementor; } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { e.printStackTrace();
