From 4307eab6b94fda80bd73de4dc2025840e1b951f1 Mon Sep 17 00:00:00 2001 From: Davide Grohmann Date: Wed, 11 Nov 2015 16:33:43 +0100 Subject: [PATCH] Refactor Neo4jMetricsBuilder to create Metrics only when they are enabled --- enterprise/metrics/pom.xml | 4 + .../org/neo4j/metrics/MetricsExtension.java | 10 +- .../metrics/source/CheckPointingMetrics.java | 89 +---- .../neo4j/metrics/source/ClusterMetrics.java | 88 ++--- .../neo4j/metrics/source/CypherMetrics.java | 38 +-- .../metrics/source/EntityCountMetrics.java | 82 ++--- .../org/neo4j/metrics/source/GCMetrics.java | 87 +++++ .../org/neo4j/metrics/source/JvmMetrics.java | 143 +------- .../metrics/source/LogRotationMetrics.java | 82 +++++ .../metrics/source/MemoryBuffersMetrics.java | 93 ++++++ .../metrics/source/MemoryPoolMetrics.java | 74 +++++ .../metrics/source/Neo4jMetricsBuilder.java | 168 ++++++++++ .../metrics/source/Neo4jMetricsFactory.java | 117 ------- .../neo4j/metrics/source/NetworkMetrics.java | 93 +++--- .../metrics/source/PageCacheMetrics.java | 112 +++---- .../neo4j/metrics/source/ThreadMetrics.java | 61 ++++ .../metrics/source/TransactionMetrics.java | 309 +++++++++--------- .../metrics/source/ClusterMetricsTest.java | 84 +---- 18 files changed, 921 insertions(+), 813 deletions(-) create mode 100644 enterprise/metrics/src/main/java/org/neo4j/metrics/source/GCMetrics.java create mode 100644 enterprise/metrics/src/main/java/org/neo4j/metrics/source/LogRotationMetrics.java create mode 100644 enterprise/metrics/src/main/java/org/neo4j/metrics/source/MemoryBuffersMetrics.java create mode 100644 enterprise/metrics/src/main/java/org/neo4j/metrics/source/MemoryPoolMetrics.java create mode 100644 enterprise/metrics/src/main/java/org/neo4j/metrics/source/Neo4jMetricsBuilder.java delete mode 100644 enterprise/metrics/src/main/java/org/neo4j/metrics/source/Neo4jMetricsFactory.java create mode 100644 enterprise/metrics/src/main/java/org/neo4j/metrics/source/ThreadMetrics.java diff --git a/enterprise/metrics/pom.xml b/enterprise/metrics/pom.xml index f5d64c0a15347..a7233ffcfd546 100644 --- a/enterprise/metrics/pom.xml +++ b/enterprise/metrics/pom.xml @@ -54,13 +54,17 @@ + + + + diff --git a/enterprise/metrics/src/main/java/org/neo4j/metrics/MetricsExtension.java b/enterprise/metrics/src/main/java/org/neo4j/metrics/MetricsExtension.java index 5176df0f04e88..67bd2d7653687 100644 --- a/enterprise/metrics/src/main/java/org/neo4j/metrics/MetricsExtension.java +++ b/enterprise/metrics/src/main/java/org/neo4j/metrics/MetricsExtension.java @@ -36,7 +36,7 @@ import org.neo4j.kernel.monitoring.Monitors; import org.neo4j.logging.Log; import org.neo4j.metrics.output.OutputBuilder; -import org.neo4j.metrics.source.Neo4jMetricsFactory; +import org.neo4j.metrics.source.Neo4jMetricsBuilder; public class MetricsExtension implements Lifecycle { @@ -80,14 +80,12 @@ public void init() // Setup output boolean outputBuilt = new OutputBuilder( configuration, registry, logger, kernelContext, life ).build(); - // if there is any output available then start the metrics if ( outputBuilt ) { // Setup metric gathering - Neo4jMetricsFactory factory = new Neo4jMetricsFactory( registry, configuration, monitors, dataSourceManager, - transactionCounters, pageCacheCounters, checkPointerMonitor, logRotationMonitor, idGeneratorFactory, - dependencyResolver, logService ); - life.add( factory.newInstance() ); + boolean metricsBuilt = new Neo4jMetricsBuilder( registry, configuration, monitors, + dataSourceManager, transactionCounters, pageCacheCounters, checkPointerMonitor, logRotationMonitor, + idGeneratorFactory, dependencyResolver, logService, life ).build(); } life.init(); diff --git a/enterprise/metrics/src/main/java/org/neo4j/metrics/source/CheckPointingMetrics.java b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/CheckPointingMetrics.java index 42324bd582a7b..963975b0b7649 100644 --- a/enterprise/metrics/src/main/java/org/neo4j/metrics/source/CheckPointingMetrics.java +++ b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/CheckPointingMetrics.java @@ -22,17 +22,13 @@ import com.codahale.metrics.Gauge; import com.codahale.metrics.MetricRegistry; -import java.io.IOException; - -import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.annotations.Documented; -import org.neo4j.kernel.impl.api.LogRotationMonitor; import org.neo4j.kernel.impl.transaction.log.checkpoint.CheckPointerMonitor; import org.neo4j.kernel.lifecycle.LifecycleAdapter; -import org.neo4j.metrics.MetricsSettings; import static com.codahale.metrics.MetricRegistry.name; + @Documented( ".Database CheckPointing Metrics" ) public class CheckPointingMetrics extends LifecycleAdapter { @@ -43,90 +39,41 @@ public class CheckPointingMetrics extends LifecycleAdapter @Documented( "The total time spent in check pointing so far" ) public static final String CHECK_POINT_TOTAL_TIME = name( CHECK_POINT_PREFIX, "total_time" ); - private static final String LOG_ROTATION_PREFIX = "neo4j.log_rotation"; - - @Documented( "The total number of transaction log rotations executed so far" ) - public static final String LOG_ROTATION_EVENTS = name( LOG_ROTATION_PREFIX, "events" ); - @Documented( "The total time spent in rotating transaction logs so far" ) - public static final String LOG_ROTATION_TOTAL_TIME = name( LOG_ROTATION_PREFIX, "total_time" ); - private final MetricRegistry registry; - private final Config config; private final CheckPointerMonitor checkPointerMonitor; - private final LogRotationMonitor logRotationMonitor; - public CheckPointingMetrics( MetricRegistry registry, Config config, CheckPointerMonitor checkPointerMonitor, - LogRotationMonitor logRotationMonitor ) + public CheckPointingMetrics( MetricRegistry registry, CheckPointerMonitor checkPointerMonitor ) { this.registry = registry; - this.config = config; this.checkPointerMonitor = checkPointerMonitor; - this.logRotationMonitor = logRotationMonitor; } @Override - public void start() throws Throwable + public void start() { - // check pointing - if ( config.get( MetricsSettings.neoCheckPointingEnabled ) ) + registry.register( CHECK_POINT_EVENTS, new Gauge() { - registry.register( CHECK_POINT_EVENTS, new Gauge() - { - @Override - public Long getValue() - { - return checkPointerMonitor.numberOfCheckPointEvents(); - } - } ); - - registry.register( CHECK_POINT_TOTAL_TIME, new Gauge() + @Override + public Long getValue() { - @Override - public Long getValue() - { - return checkPointerMonitor.checkPointAccumulatedTotalTimeMillis(); - } - } ); - } + return checkPointerMonitor.numberOfCheckPointEvents(); + } + } ); - // log rotation - if ( config.get( MetricsSettings.neoLogRotationEnabled ) ) + registry.register( CHECK_POINT_TOTAL_TIME, new Gauge() { - registry.register( LOG_ROTATION_EVENTS, new Gauge() + @Override + public Long getValue() { - @Override - public Long getValue() - { - return logRotationMonitor.numberOfLogRotationEvents(); - } - } ); - - registry.register( LOG_ROTATION_TOTAL_TIME, new Gauge() - { - @Override - public Long getValue() - { - return logRotationMonitor.logRotationAccumulatedTotalTimeMillis(); - } - } ); - } + return checkPointerMonitor.checkPointAccumulatedTotalTimeMillis(); + } + } ); } @Override - public void stop() throws IOException + public void stop() { - // check pointing - if ( config.get( MetricsSettings.neoCheckPointingEnabled ) ) - { - registry.remove( CHECK_POINT_EVENTS ); - registry.remove( CHECK_POINT_TOTAL_TIME ); - } - - // log rotation - if ( config.get( MetricsSettings.neoLogRotationEnabled ) ) - { - registry.remove( LOG_ROTATION_EVENTS ); - registry.remove( LOG_ROTATION_TOTAL_TIME ); - } + registry.remove( CHECK_POINT_EVENTS ); + registry.remove( CHECK_POINT_TOTAL_TIME ); } } diff --git a/enterprise/metrics/src/main/java/org/neo4j/metrics/source/ClusterMetrics.java b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/ClusterMetrics.java index 92aa8cbe1cb9b..5aaa478b7197f 100644 --- a/enterprise/metrics/src/main/java/org/neo4j/metrics/source/ClusterMetrics.java +++ b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/ClusterMetrics.java @@ -22,20 +22,16 @@ import com.codahale.metrics.Gauge; import com.codahale.metrics.MetricRegistry; -import java.io.IOException; import java.util.concurrent.atomic.AtomicLong; import org.neo4j.function.Predicate; import org.neo4j.function.Predicates; -import org.neo4j.graphdb.DependencyResolver; -import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.ha.SlaveUpdatePuller; import org.neo4j.kernel.impl.annotations.Documented; import org.neo4j.kernel.ha.cluster.member.ClusterMembers; -import org.neo4j.kernel.impl.logging.LogService; +import org.neo4j.kernel.lifecycle.Lifecycle; import org.neo4j.kernel.lifecycle.LifecycleAdapter; import org.neo4j.kernel.monitoring.Monitors; -import org.neo4j.metrics.MetricsSettings; import static com.codahale.metrics.MetricRegistry.name; import static org.neo4j.kernel.ha.cluster.modeswitch.HighAvailabilityModeSwitcher.MASTER; @@ -55,83 +51,55 @@ public class ClusterMetrics extends LifecycleAdapter @Documented( "Whether or not this instance is available in the cluster" ) public static final String IS_AVAILABLE = name( NAME_PREFIX, "is_available" ); - private final Config config; private final Monitors monitors; private final MetricRegistry registry; - private final DependencyResolver dependencyResolver; - private final LogService logService; private final SlaveUpdatePullerMonitor monitor = new SlaveUpdatePullerMonitor(); - private ClusterMembers clusterMembers = null; + private final ClusterMembers clusterMembers; - public ClusterMetrics( Config config, Monitors monitors, MetricRegistry registry, - DependencyResolver dependencyResolver, LogService logService ) + public ClusterMetrics( Monitors monitors, MetricRegistry registry, ClusterMembers clusterMembers ) { - this.config = config; this.monitors = monitors; this.registry = registry; - this.dependencyResolver = dependencyResolver; - this.logService = logService; + this.clusterMembers = clusterMembers; } @Override - public void start() throws Throwable + public void start() { - if ( config.get( MetricsSettings.neoClusterEnabled ) && resolveClusterMembersDependencyOrLogWarning() ) - { - monitors.addMonitorListener( monitor ); + monitors.addMonitorListener( monitor ); - registry.register( IS_MASTER, new RoleGauge( Predicates.equalTo( MASTER ) ) ); - registry.register( IS_AVAILABLE, new RoleGauge( Predicates.not( Predicates.equalTo( UNKNOWN ) ) ) ); + registry.register( IS_MASTER, new RoleGauge( Predicates.equalTo( MASTER ) ) ); + registry.register( IS_AVAILABLE, new RoleGauge( Predicates.not( Predicates.equalTo( UNKNOWN ) ) ) ); - registry.register( SLAVE_PULL_UPDATES, new Gauge() - { - @Override - public Long getValue() - { - return monitor.events.get(); - } - } ); - - registry.register( SLAVE_PULL_UPDATE_UP_TO_TX, new Gauge() + registry.register( SLAVE_PULL_UPDATES, new Gauge() + { + @Override + public Long getValue() { - @Override - public Long getValue() - { - return monitor.lastAppliedTxId; - } - } ); - - } - } + return monitor.events.get(); + } + } ); - private boolean resolveClusterMembersDependencyOrLogWarning() - { - try + registry.register( SLAVE_PULL_UPDATE_UP_TO_TX, new Gauge() { - clusterMembers = dependencyResolver.resolveDependency( ClusterMembers.class ); - return true; - } - catch ( IllegalArgumentException e ) - { - logService.getUserLog( getClass() ).warn( "Cluster metrics was enabled but the graph database" + - "is not in HA mode." ); - return false; - } + @Override + public Long getValue() + { + return monitor.lastAppliedTxId; + } + } ); } @Override - public void stop() throws IOException + public void stop() { - if ( config.get( MetricsSettings.neoClusterEnabled ) && (clusterMembers != null) ) - { - registry.remove( SLAVE_PULL_UPDATES ); - registry.remove( SLAVE_PULL_UPDATE_UP_TO_TX ); + registry.remove( SLAVE_PULL_UPDATES ); + registry.remove( SLAVE_PULL_UPDATE_UP_TO_TX ); - registry.remove( IS_MASTER ); - registry.remove( IS_AVAILABLE ); + registry.remove( IS_MASTER ); + registry.remove( IS_AVAILABLE ); - monitors.removeMonitorListener( monitor ); - } + monitors.removeMonitorListener( monitor ); } private static class SlaveUpdatePullerMonitor implements SlaveUpdatePuller.Monitor diff --git a/enterprise/metrics/src/main/java/org/neo4j/metrics/source/CypherMetrics.java b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/CypherMetrics.java index 094f463b56fed..9b336cbbb2752 100644 --- a/enterprise/metrics/src/main/java/org/neo4j/metrics/source/CypherMetrics.java +++ b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/CypherMetrics.java @@ -22,14 +22,10 @@ import com.codahale.metrics.Gauge; import com.codahale.metrics.MetricRegistry; -import java.io.IOException; - import org.neo4j.cypher.PlanCacheMetricsMonitor; -import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.annotations.Documented; import org.neo4j.kernel.lifecycle.LifecycleAdapter; import org.neo4j.kernel.monitoring.Monitors; -import org.neo4j.metrics.MetricsSettings; import static com.codahale.metrics.MetricRegistry.name; @@ -41,45 +37,37 @@ public class CypherMetrics extends LifecycleAdapter @Documented( "The total number of times Cypher has decided to re-plan a query" ) public static final String REPLAN_EVENTS = name( NAME_PREFIX, "replan_events" ); - private final Config config; private final Monitors monitors; private final MetricRegistry registry; private final PlanCacheMetricsMonitor cacheMonitor = new PlanCacheMetricsMonitor(); - public CypherMetrics( Config config, Monitors monitors, MetricRegistry registry ) + public CypherMetrics( Monitors monitors, MetricRegistry registry ) { - this.config = config; this.monitors = monitors; this.registry = registry; } @Override - public void start() throws Throwable + public void start() { - if ( config.get( MetricsSettings.cypherPlanningEnabled ) ) - { - monitors.addMonitorListener( cacheMonitor ); + monitors.addMonitorListener( cacheMonitor ); - registry.register( REPLAN_EVENTS, new Gauge() + registry.register( REPLAN_EVENTS, new Gauge() + { + @Override + public Long getValue() { - @Override - public Long getValue() - { - return cacheMonitor.numberOfReplans(); - } - } ); - } + return cacheMonitor.numberOfReplans(); + } + } ); } @Override - public void stop() throws IOException + public void stop() { - if ( config.get( MetricsSettings.cypherPlanningEnabled ) ) - { - registry.remove( REPLAN_EVENTS ); + registry.remove( REPLAN_EVENTS ); - monitors.removeMonitorListener( cacheMonitor ); - } + monitors.removeMonitorListener( cacheMonitor ); } } diff --git a/enterprise/metrics/src/main/java/org/neo4j/metrics/source/EntityCountMetrics.java b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/EntityCountMetrics.java index 82573670e9bc1..d2e09ba62fc5f 100644 --- a/enterprise/metrics/src/main/java/org/neo4j/metrics/source/EntityCountMetrics.java +++ b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/EntityCountMetrics.java @@ -22,14 +22,10 @@ import com.codahale.metrics.Gauge; import com.codahale.metrics.MetricRegistry; -import java.io.IOException; - import org.neo4j.kernel.IdGeneratorFactory; import org.neo4j.kernel.IdType; -import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.annotations.Documented; import org.neo4j.kernel.lifecycle.LifecycleAdapter; -import org.neo4j.metrics.MetricsSettings; import static com.codahale.metrics.MetricRegistry.name; @@ -48,68 +44,62 @@ public class EntityCountMetrics extends LifecycleAdapter public static final String COUNTS_NODE = name( COUNTS_PREFIX, "node" ); private final MetricRegistry registry; - private final Config config; + @SuppressWarnings( "deprecation" ) private final IdGeneratorFactory idGeneratorFactory; - public EntityCountMetrics( MetricRegistry registry, Config config, IdGeneratorFactory idGeneratorFactory ) + public EntityCountMetrics( MetricRegistry registry, + @SuppressWarnings( "deprecation" ) IdGeneratorFactory idGeneratorFactory ) { this.registry = registry; - this.config = config; this.idGeneratorFactory = idGeneratorFactory; } @Override - public void start() throws Throwable + public void start() { - if ( config.get( MetricsSettings.neoCountsEnabled ) ) + registry.register( COUNTS_NODE, new Gauge() { - registry.register( COUNTS_NODE, new Gauge() + @Override + public Long getValue() { - @Override - public Long getValue() - { - return idGeneratorFactory.get( IdType.NODE ).getNumberOfIdsInUse(); - } - } ); + return idGeneratorFactory.get( IdType.NODE ).getNumberOfIdsInUse(); + } + } ); - registry.register( COUNTS_RELATIONSHIP, new Gauge() + registry.register( COUNTS_RELATIONSHIP, new Gauge() + { + @Override + public Long getValue() { - @Override - public Long getValue() - { - return idGeneratorFactory.get( IdType.RELATIONSHIP ).getNumberOfIdsInUse(); - } - } ); + return idGeneratorFactory.get( IdType.RELATIONSHIP ).getNumberOfIdsInUse(); + } + } ); - registry.register( COUNTS_PROPERTY, new Gauge() + registry.register( COUNTS_PROPERTY, new Gauge() + { + @Override + public Long getValue() { - @Override - public Long getValue() - { - return idGeneratorFactory.get( IdType.PROPERTY ).getNumberOfIdsInUse(); - } - } ); + return idGeneratorFactory.get( IdType.PROPERTY ).getNumberOfIdsInUse(); + } + } ); - registry.register( COUNTS_RELATIONSHIP_TYPE, new Gauge() + registry.register( COUNTS_RELATIONSHIP_TYPE, new Gauge() + { + @Override + public Long getValue() { - @Override - public Long getValue() - { - return idGeneratorFactory.get( IdType.RELATIONSHIP_TYPE_TOKEN ).getNumberOfIdsInUse(); - } - } ); - } + return idGeneratorFactory.get( IdType.RELATIONSHIP_TYPE_TOKEN ).getNumberOfIdsInUse(); + } + } ); } @Override - public void stop() throws IOException + public void stop() { - if ( config.get( MetricsSettings.neoCountsEnabled ) ) - { - registry.remove( COUNTS_NODE ); - registry.remove( COUNTS_RELATIONSHIP ); - registry.remove( COUNTS_PROPERTY ); - registry.remove( COUNTS_RELATIONSHIP_TYPE ); - } + registry.remove( COUNTS_NODE ); + registry.remove( COUNTS_RELATIONSHIP ); + registry.remove( COUNTS_PROPERTY ); + registry.remove( COUNTS_RELATIONSHIP_TYPE ); } } diff --git a/enterprise/metrics/src/main/java/org/neo4j/metrics/source/GCMetrics.java b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/GCMetrics.java new file mode 100644 index 0000000000000..366953db0e86a --- /dev/null +++ b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/GCMetrics.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2002-2015 "Neo Technology," + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.neo4j.metrics.source; + +import com.codahale.metrics.Gauge; +import com.codahale.metrics.Metric; +import com.codahale.metrics.MetricFilter; +import com.codahale.metrics.MetricRegistry; + +import java.lang.management.GarbageCollectorMXBean; +import java.lang.management.ManagementFactory; + +import org.neo4j.kernel.lifecycle.Lifecycle; +import org.neo4j.kernel.lifecycle.LifecycleAdapter; + +import static com.codahale.metrics.MetricRegistry.name; +import static org.neo4j.metrics.source.JvmMetrics.NAME_PREFIX; +import static org.neo4j.metrics.source.JvmMetrics.prettifyName; + +public class GCMetrics extends LifecycleAdapter implements Lifecycle +{ + public static final String GC_PREFIX = name( NAME_PREFIX, "gc" ); + public static final String GC_TIME = name( GC_PREFIX, "time" ); + public static final String GC_COUNT = name( GC_PREFIX, "count" ); + + private final MetricRegistry registry; + + public GCMetrics( MetricRegistry registry ) + { + this.registry = registry; + } + + @Override + public void start() + { + for ( final GarbageCollectorMXBean gcBean : ManagementFactory.getGarbageCollectorMXBeans() ) + { + registry.register( name( GC_TIME, prettifyName( gcBean.getName() ) ), new Gauge() + { + @Override + public Long getValue() + { + return gcBean.getCollectionTime(); + } + } ); + + registry.register( name( GC_COUNT, prettifyName( gcBean.getName() ) ), new Gauge() + { + @Override + public Long getValue() + { + return gcBean.getCollectionCount(); + } + } ); + } + } + + @Override + public void stop() + { + registry.removeMatching( new MetricFilter() + { + @Override + public boolean matches( String name, Metric metric ) + { + return name.startsWith( GC_PREFIX ); + } + } ); + } +} diff --git a/enterprise/metrics/src/main/java/org/neo4j/metrics/source/JvmMetrics.java b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/JvmMetrics.java index a380a2b14764d..7ad47d55530d1 100644 --- a/enterprise/metrics/src/main/java/org/neo4j/metrics/source/JvmMetrics.java +++ b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/JvmMetrics.java @@ -19,156 +19,23 @@ */ package org.neo4j.metrics.source; -import com.codahale.metrics.Gauge; -import com.codahale.metrics.Metric; -import com.codahale.metrics.MetricFilter; -import com.codahale.metrics.MetricRegistry; - -import java.io.IOException; -import java.lang.management.BufferPoolMXBean; -import java.lang.management.GarbageCollectorMXBean; -import java.lang.management.ManagementFactory; -import java.lang.management.MemoryPoolMXBean; - -import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.annotations.Documented; -import org.neo4j.kernel.lifecycle.LifecycleAdapter; -import org.neo4j.metrics.MetricsSettings; - -import static com.codahale.metrics.MetricRegistry.name; @Documented( "=== Java Virtual Machine Metrics\n\n" + "These metrics are environment dependent and they may vary on different hardware and with JVM configurations.\n" + "Typically these metrics will show information about garbage collections " + "(for example the number of events and time spent collecting), memory pools and buffers, and " + "finally the number of active threads running." ) -public class JvmMetrics extends LifecycleAdapter +public abstract class JvmMetrics { - private static final String NAME_PREFIX = "vm"; - public static final String GC_PREFIX = name( NAME_PREFIX, "gc" ); - public static final String GC_TIME = name( GC_PREFIX, "time" ); - public static final String GC_COUNT = name( GC_PREFIX, "count" ); - public static final String MEMORY_POOL = name( NAME_PREFIX, "memory.pool" ); - public static final String MEMORY_BUFFER = name( NAME_PREFIX, "memory.buffer" ); - public static final String THREAD = name( NAME_PREFIX, "thread" ); - - private final Config config; - private final MetricRegistry registry; - - public JvmMetrics( Config config, MetricRegistry registry ) - { - this.config = config; - this.registry = registry; - } - - @Override - public void start() throws Throwable - { - // VM stats - // Garbage collection - if ( config.get( MetricsSettings.jvmGcEnabled ) ) - { - for ( final GarbageCollectorMXBean gcBean : ManagementFactory.getGarbageCollectorMXBeans() ) - { - registry.register( name( GC_TIME, prettifyName( gcBean.getName() ) ), new Gauge() - { - @Override - public Long getValue() - { - return gcBean.getCollectionTime(); - } - } ); + public static final String NAME_PREFIX = "vm"; - registry.register( name( GC_COUNT, prettifyName( gcBean.getName() ) ), new Gauge() - { - @Override - public Long getValue() - { - return gcBean.getCollectionCount(); - } - } ); - } - } - - // Memory metrics - if ( config.get( MetricsSettings.jvmMemoryEnabled ) ) - { - for ( final MemoryPoolMXBean memPool : ManagementFactory.getMemoryPoolMXBeans() ) - { - registry.register( name( MEMORY_POOL, prettifyName( memPool.getName() ) ), new Gauge() - { - @Override - public Long getValue() - { - return memPool.getUsage().getUsed(); - } - } ); - } - } - - // Buffer pools - if ( config.get( MetricsSettings.jvmBuffersEnabled ) ) - { - for ( final BufferPoolMXBean pool : ManagementFactory.getPlatformMXBeans( BufferPoolMXBean.class ) ) - { - registry.register( name( MEMORY_BUFFER, prettifyName( pool.getName() ), "count" ), new Gauge() - { - @Override - public Long getValue() - { - return pool.getCount(); - } - } ); - - registry.register( name( MEMORY_BUFFER, prettifyName( pool.getName() ), "used" ), new Gauge() - { - @Override - public Long getValue() - { - return pool.getMemoryUsed(); - } - } ); - - registry.register( name( MEMORY_BUFFER, prettifyName( pool.getName() ), "capacity" ), new Gauge() - { - @Override - public Long getValue() - { - return pool.getTotalCapacity(); - } - } ); - } - } - - // Threads - if ( config.get( MetricsSettings.jvmThreadsEnabled ) ) - { - registry.register( name( THREAD, "count" ), new Gauge() - { - @Override - public Integer getValue() - { - return Thread.activeCount(); - } - } ); - } - } - - @Override - public void stop() throws IOException + public static String prettifyName( String name ) { - registry.removeMatching( new MetricFilter() - { - @Override - public boolean matches( String name, Metric metric ) - { - return name.startsWith( NAME_PREFIX ); - } - } ); + return name.toLowerCase().replace( ' ', '_' ); } - private static String prettifyName( String name ) + private JvmMetrics() { - return name.toLowerCase().replace( ' ', '_' ); } } diff --git a/enterprise/metrics/src/main/java/org/neo4j/metrics/source/LogRotationMetrics.java b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/LogRotationMetrics.java new file mode 100644 index 0000000000000..06dd1c8a8b3a7 --- /dev/null +++ b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/LogRotationMetrics.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2002-2015 "Neo Technology," + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.neo4j.metrics.source; + +import com.codahale.metrics.Gauge; +import com.codahale.metrics.MetricRegistry; + +import java.io.IOException; + +import org.neo4j.kernel.impl.annotations.Documented; +import org.neo4j.kernel.impl.api.LogRotationMonitor; +import org.neo4j.kernel.lifecycle.Lifecycle; +import org.neo4j.kernel.lifecycle.LifecycleAdapter; + +import static com.codahale.metrics.MetricRegistry.name; + +@Documented( ".Database LogRotation Metrics" ) +public class LogRotationMetrics extends LifecycleAdapter implements Lifecycle +{ + private static final String LOG_ROTATION_PREFIX = "neo4j.log_rotation"; + + @Documented( "The total number of transaction log rotations executed so far" ) + public static final String LOG_ROTATION_EVENTS = name( LOG_ROTATION_PREFIX, "events" ); + @Documented( "The total time spent in rotating transaction logs so far" ) + public static final String LOG_ROTATION_TOTAL_TIME = name( LOG_ROTATION_PREFIX, "total_time" ); + + + private final MetricRegistry registry; + private final LogRotationMonitor logRotationMonitor; + + public LogRotationMetrics( MetricRegistry registry, LogRotationMonitor logRotationMonitor ) + { + this.registry = registry; + this.logRotationMonitor = logRotationMonitor; + } + + @Override + public void start() throws Throwable + { + registry.register( LOG_ROTATION_EVENTS, new Gauge() + { + @Override + public Long getValue() + { + return logRotationMonitor.numberOfLogRotationEvents(); + } + } ); + + registry.register( LOG_ROTATION_TOTAL_TIME, new Gauge() + { + @Override + public Long getValue() + { + return logRotationMonitor.logRotationAccumulatedTotalTimeMillis(); + } + } ); + } + + @Override + public void stop() throws IOException + { + registry.remove( LOG_ROTATION_EVENTS ); + registry.remove( LOG_ROTATION_TOTAL_TIME ); + } +} diff --git a/enterprise/metrics/src/main/java/org/neo4j/metrics/source/MemoryBuffersMetrics.java b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/MemoryBuffersMetrics.java new file mode 100644 index 0000000000000..f7a4af3dc4245 --- /dev/null +++ b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/MemoryBuffersMetrics.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2002-2015 "Neo Technology," + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.neo4j.metrics.source; + +import com.codahale.metrics.Gauge; +import com.codahale.metrics.Metric; +import com.codahale.metrics.MetricFilter; +import com.codahale.metrics.MetricRegistry; + +import java.lang.management.BufferPoolMXBean; +import java.lang.management.ManagementFactory; + +import org.neo4j.kernel.lifecycle.Lifecycle; +import org.neo4j.kernel.lifecycle.LifecycleAdapter; + +import static com.codahale.metrics.MetricRegistry.name; +import static org.neo4j.metrics.source.JvmMetrics.prettifyName; + +public class MemoryBuffersMetrics extends LifecycleAdapter implements Lifecycle +{ + public static final String MEMORY_BUFFER = name( JvmMetrics.NAME_PREFIX, "memory.buffer" ); + + private final MetricRegistry registry; + + public MemoryBuffersMetrics( MetricRegistry registry ) + { + this.registry = registry; + } + + @Override + public void start() + { + for ( final BufferPoolMXBean pool : ManagementFactory.getPlatformMXBeans( BufferPoolMXBean.class ) ) + { + registry.register( name( MEMORY_BUFFER, prettifyName( pool.getName() ), "count" ), new Gauge() + { + @Override + public Long getValue() + { + return pool.getCount(); + } + } ); + + registry.register( name( MEMORY_BUFFER, prettifyName( pool.getName() ), "used" ), new Gauge() + { + @Override + public Long getValue() + { + return pool.getMemoryUsed(); + } + } ); + + registry.register( name( MEMORY_BUFFER, prettifyName( pool.getName() ), "capacity" ), new Gauge() + { + @Override + public Long getValue() + { + return pool.getTotalCapacity(); + } + } ); + } + } + + @Override + public void stop() + { + registry.removeMatching( new MetricFilter() + { + @Override + public boolean matches( String name, Metric metric ) + { + return name.startsWith( MEMORY_BUFFER ); + } + } ); + } +} diff --git a/enterprise/metrics/src/main/java/org/neo4j/metrics/source/MemoryPoolMetrics.java b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/MemoryPoolMetrics.java new file mode 100644 index 0000000000000..a17bf55ba3834 --- /dev/null +++ b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/MemoryPoolMetrics.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2002-2015 "Neo Technology," + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.neo4j.metrics.source; + +import com.codahale.metrics.Gauge; +import com.codahale.metrics.Metric; +import com.codahale.metrics.MetricFilter; +import com.codahale.metrics.MetricRegistry; + +import java.lang.management.ManagementFactory; +import java.lang.management.MemoryPoolMXBean; + +import org.neo4j.kernel.lifecycle.Lifecycle; +import org.neo4j.kernel.lifecycle.LifecycleAdapter; + +import static com.codahale.metrics.MetricRegistry.name; +import static org.neo4j.metrics.source.JvmMetrics.prettifyName; + +public class MemoryPoolMetrics extends LifecycleAdapter implements Lifecycle +{ + public static final String MEMORY_POOL = name( JvmMetrics.NAME_PREFIX, "memory.pool" ); + private final MetricRegistry registry; + + public MemoryPoolMetrics( MetricRegistry registry ) + { + this.registry = registry; + } + + @Override + public void start() + { + for ( final MemoryPoolMXBean memPool : ManagementFactory.getMemoryPoolMXBeans() ) + { + registry.register( name( MEMORY_POOL, prettifyName( memPool.getName() ) ), new Gauge() + { + @Override + public Long getValue() + { + return memPool.getUsage().getUsed(); + } + } ); + } + } + + @Override + public void stop() + { + registry.removeMatching( new MetricFilter() + { + @Override + public boolean matches( String name, Metric metric ) + { + return name.startsWith( MEMORY_POOL ); + } + } ); + } +} diff --git a/enterprise/metrics/src/main/java/org/neo4j/metrics/source/Neo4jMetricsBuilder.java b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/Neo4jMetricsBuilder.java new file mode 100644 index 0000000000000..f15b5abc5c60e --- /dev/null +++ b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/Neo4jMetricsBuilder.java @@ -0,0 +1,168 @@ +/* + * Copyright (c) 2002-2015 "Neo Technology," + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.neo4j.metrics.source; + +import com.codahale.metrics.MetricRegistry; + +import org.neo4j.graphdb.DependencyResolver; +import org.neo4j.io.pagecache.monitoring.PageCacheMonitor; +import org.neo4j.kernel.IdGeneratorFactory; +import org.neo4j.kernel.configuration.Config; +import org.neo4j.kernel.ha.cluster.member.ClusterMembers; +import org.neo4j.kernel.impl.api.LogRotationMonitor; +import org.neo4j.kernel.impl.logging.LogService; +import org.neo4j.kernel.impl.transaction.TransactionCounters; +import org.neo4j.kernel.impl.transaction.log.checkpoint.CheckPointerMonitor; +import org.neo4j.kernel.impl.transaction.state.DataSourceManager; +import org.neo4j.kernel.lifecycle.LifeSupport; +import org.neo4j.kernel.monitoring.Monitors; +import org.neo4j.metrics.MetricsSettings; + +public class Neo4jMetricsBuilder +{ + private final MetricRegistry registry; + private final Config config; + private final Monitors monitors; + private final DataSourceManager dataSourceManager; + private final TransactionCounters transactionCounters; + private final PageCacheMonitor pageCacheCounters; + private final CheckPointerMonitor checkPointerMonitor; + private final LogRotationMonitor logRotationMonitor; + private final IdGeneratorFactory idGeneratorFactory; + private final DependencyResolver dependencyResolver; + private final LogService logService; + private LifeSupport life; + + public Neo4jMetricsBuilder( MetricRegistry registry, Config config, Monitors monitors, + DataSourceManager dataSourceManager, TransactionCounters transactionCounters, + PageCacheMonitor pageCacheCounters, CheckPointerMonitor checkPointerMonitor, + LogRotationMonitor logRotationMonitor, IdGeneratorFactory idGeneratorFactory, + DependencyResolver dependencyResolver, LogService logService, LifeSupport life ) + { + this.registry = registry; + this.config = config; + this.monitors = monitors; + this.dataSourceManager = dataSourceManager; + this.transactionCounters = transactionCounters; + this.pageCacheCounters = pageCacheCounters; + this.checkPointerMonitor = checkPointerMonitor; + this.logRotationMonitor = logRotationMonitor; + this.idGeneratorFactory = idGeneratorFactory; + this.dependencyResolver = dependencyResolver; + this.logService = logService; + this.life = life; + } + + public boolean build() + { + boolean result = false; + if ( config.get( MetricsSettings.neoTxEnabled ) ) + { + life.add( new TransactionMetrics( registry, dataSourceManager, transactionCounters ) ); + result = true; + } + + if ( config.get( MetricsSettings.neoPageCacheEnabled ) ) + { + life.add( new PageCacheMetrics( registry, pageCacheCounters ) ); + result = true; + } + + if ( config.get( MetricsSettings.neoCheckPointingEnabled ) ) + { + life.add( new CheckPointingMetrics( registry, checkPointerMonitor ) ); + result = true; + } + + if ( config.get( MetricsSettings.neoLogRotationEnabled ) ) + { + life.add( new LogRotationMetrics( registry, logRotationMonitor ) ); + result = true; + } + + if ( config.get( MetricsSettings.neoCountsEnabled ) ) + { + life.add( new EntityCountMetrics( registry, idGeneratorFactory ) ); + result = true; + } + + if ( config.get( MetricsSettings.neoNetworkEnabled ) ) + { + life.add( new NetworkMetrics( monitors, registry ) ); + result = true; + } + + if ( config.get( MetricsSettings.neoClusterEnabled ) ) + { + final ClusterMembers clusterMembers = resolveClusterMembersOrNull(); + if ( clusterMembers != null ) + { + life.add( new ClusterMetrics( monitors, registry, clusterMembers ) ); + result = true; + } + } + + if ( config.get( MetricsSettings.cypherPlanningEnabled ) ) + { + life.add( new CypherMetrics( monitors, registry ) ); + result = true; + } + + if ( config.get( MetricsSettings.jvmGcEnabled ) ) + { + life.add( new GCMetrics( registry ) ); + result = true; + } + + if ( config.get( MetricsSettings.jvmThreadsEnabled ) ) + { + life.add( new ThreadMetrics( registry ) ); + result = true; + } + + if ( config.get( MetricsSettings.jvmMemoryEnabled ) ) + { + life.add( new MemoryPoolMetrics( registry ) ); + result = true; + } + + if ( config.get( MetricsSettings.jvmBuffersEnabled ) ) + { + life.add( new MemoryBuffersMetrics( registry ) ); + result = true; + } + + return result; + } + + private ClusterMembers resolveClusterMembersOrNull() + { + try + { + return dependencyResolver.resolveDependency( ClusterMembers.class ); + } + catch ( IllegalArgumentException e ) + { + logService.getUserLog( getClass() ) + .warn( "Cluster metrics was enabled but the graph database is not in HA mode." ); + return null; + } + } +} diff --git a/enterprise/metrics/src/main/java/org/neo4j/metrics/source/Neo4jMetricsFactory.java b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/Neo4jMetricsFactory.java deleted file mode 100644 index 33819637668c7..0000000000000 --- a/enterprise/metrics/src/main/java/org/neo4j/metrics/source/Neo4jMetricsFactory.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (c) 2002-2015 "Neo Technology," - * Network Engine for Objects in Lund AB [http://neotechnology.com] - * - * This file is part of Neo4j. - * - * Neo4j is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ -package org.neo4j.metrics.source; - -import com.codahale.metrics.MetricRegistry; - -import java.io.IOException; - -import org.neo4j.function.Factory; -import org.neo4j.graphdb.DependencyResolver; -import org.neo4j.io.pagecache.monitoring.PageCacheMonitor; -import org.neo4j.kernel.IdGeneratorFactory; -import org.neo4j.kernel.configuration.Config; -import org.neo4j.kernel.impl.api.LogRotationMonitor; -import org.neo4j.kernel.impl.logging.LogService; -import org.neo4j.kernel.impl.transaction.TransactionCounters; -import org.neo4j.kernel.impl.transaction.log.checkpoint.CheckPointerMonitor; -import org.neo4j.kernel.impl.transaction.state.DataSourceManager; -import org.neo4j.kernel.lifecycle.Lifecycle; -import org.neo4j.kernel.lifecycle.LifecycleAdapter; -import org.neo4j.kernel.monitoring.Monitors; - -public class Neo4jMetricsFactory implements Factory -{ - private final MetricRegistry registry; - private final Config config; - private final Monitors monitors; - private final DataSourceManager dataSourceManager; - private final TransactionCounters transactionCounters; - private final PageCacheMonitor pageCacheCounters; - private final CheckPointerMonitor checkPointerMonitor; - private final LogRotationMonitor logRotationMonitor; - private final IdGeneratorFactory idGeneratorFactory; - private final DependencyResolver dependencyResolver; - private final LogService logService; - - public Neo4jMetricsFactory( MetricRegistry registry, Config config, Monitors monitors, - DataSourceManager dataSourceManager, TransactionCounters transactionCounters, - PageCacheMonitor pageCacheCounters, CheckPointerMonitor checkPointerMonitor, - LogRotationMonitor logRotationMonitor, IdGeneratorFactory idGeneratorFactory, - DependencyResolver dependencyResolver, LogService logService ) - { - this.registry = registry; - this.config = config; - this.monitors = monitors; - this.dataSourceManager = dataSourceManager; - this.transactionCounters = transactionCounters; - this.pageCacheCounters = pageCacheCounters; - this.checkPointerMonitor = checkPointerMonitor; - this.logRotationMonitor = logRotationMonitor; - this.idGeneratorFactory = idGeneratorFactory; - this.dependencyResolver = dependencyResolver; - this.logService = logService; - } - - @Override - public Lifecycle newInstance() - { - final TransactionMetrics transactionMetrics = - new TransactionMetrics( registry, config, dataSourceManager, transactionCounters ); - final PageCacheMetrics pageCacheMetrics = new PageCacheMetrics( registry, config, pageCacheCounters ); - final CheckPointingMetrics checkPointingMetrics = - new CheckPointingMetrics( registry, config, checkPointerMonitor, logRotationMonitor ); - final EntityCountMetrics entityCountMetrics = new EntityCountMetrics( registry, config, idGeneratorFactory ); - - final NetworkMetrics networkMetrics = new NetworkMetrics( config, monitors, registry ); - final ClusterMetrics clusterMetrics = new ClusterMetrics( config, monitors, registry, dependencyResolver, - logService ); - final CypherMetrics cypherMetrics = new CypherMetrics( config, monitors, registry ); - final JvmMetrics jvmMetrics = new JvmMetrics( config, registry ); - return new LifecycleAdapter() - { - @Override - public void start() throws Throwable - { - transactionMetrics.start(); - pageCacheMetrics.start(); - checkPointingMetrics.start(); - entityCountMetrics.start(); - networkMetrics.start(); - clusterMetrics.start(); - jvmMetrics.start(); - cypherMetrics.start(); - } - - @Override - public void stop() throws IOException - { - transactionMetrics.stop(); - pageCacheMetrics.stop(); - checkPointingMetrics.stop(); - entityCountMetrics.stop(); - networkMetrics.stop(); - clusterMetrics.stop(); - jvmMetrics.stop(); - cypherMetrics.stop(); - } - }; - } -} diff --git a/enterprise/metrics/src/main/java/org/neo4j/metrics/source/NetworkMetrics.java b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/NetworkMetrics.java index aceca3e74c256..0d4e218a5a4a9 100644 --- a/enterprise/metrics/src/main/java/org/neo4j/metrics/source/NetworkMetrics.java +++ b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/NetworkMetrics.java @@ -22,16 +22,15 @@ import com.codahale.metrics.Gauge; import com.codahale.metrics.MetricRegistry; -import java.io.IOException; - import org.neo4j.com.storecopy.ToNetworkStoreWriter; -import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.ha.MasterClient210; import org.neo4j.kernel.ha.com.master.MasterServer; import org.neo4j.kernel.impl.annotations.Documented; + +import org.neo4j.kernel.lifecycle.Lifecycle; + import org.neo4j.kernel.lifecycle.LifecycleAdapter; import org.neo4j.kernel.monitoring.Monitors; -import org.neo4j.metrics.MetricsSettings; import static com.codahale.metrics.MetricRegistry.name; @@ -49,74 +48,66 @@ public class NetworkMetrics extends LifecycleAdapter "to the slaves in order to propagate committed transactions" ) public static final String MASTER_NETWORK_TX_WRITES = name( NAME_PREFIX, "master_network_tx_writes" ); - private Config config; - private Monitors monitors; - private MetricRegistry registry; + private final Monitors monitors; + private final MetricRegistry registry; private final ByteCountsMetric masterNetworkTransactionWrites = new ByteCountsMetric(); private final ByteCountsMetric masterNetworkStoreWrites = new ByteCountsMetric(); private final ByteCountsMetric slaveNetworkTransactionWrites = new ByteCountsMetric(); - public NetworkMetrics( Config config, Monitors monitors, MetricRegistry registry ) + public NetworkMetrics( Monitors monitors, MetricRegistry registry ) { - this.config = config; this.monitors = monitors; this.registry = registry; } @Override - public void start() throws Throwable + public void start() { - if ( config.get( MetricsSettings.neoNetworkEnabled ) ) - { - /* - * COM: MasterServer.class -> Writes transaction streams (writes) - * ToNetworkStoreWriter.class, "storeCopier -> Storage files write to network (writes) - * - * HA: MasterClientXXX.class -> Transactions written to network for commit (writes) - */ - monitors.addMonitorListener( masterNetworkTransactionWrites, MasterServer.class.getName() ); - monitors.addMonitorListener( masterNetworkStoreWrites, ToNetworkStoreWriter.class.getName(), - ToNetworkStoreWriter.STORE_COPIER_MONITOR_TAG ); - monitors.addMonitorListener( slaveNetworkTransactionWrites, MasterClient210.class.getName() ); + /* + * COM: MasterServer.class -> Writes transaction streams (writes) + * ToNetworkStoreWriter.class, "storeCopier -> Storage files write to network (writes) + * + * HA: MasterClientXXX.class -> Transactions written to network for commit (writes) + */ + monitors.addMonitorListener( masterNetworkTransactionWrites, MasterServer.class.getName() ); + monitors.addMonitorListener( masterNetworkStoreWrites, ToNetworkStoreWriter.class.getName(), + ToNetworkStoreWriter.STORE_COPIER_MONITOR_TAG ); + monitors.addMonitorListener( slaveNetworkTransactionWrites, MasterClient210.class.getName() ); - registry.register( MASTER_NETWORK_TX_WRITES, new Gauge() + registry.register( MASTER_NETWORK_TX_WRITES, new Gauge() + { + public Long getValue() { - public Long getValue() - { - return masterNetworkTransactionWrites.getBytesWritten(); - } - } ); + return masterNetworkTransactionWrites.getBytesWritten(); + } + } ); - registry.register( MASTER_NETWORK_STORE_WRITES, new Gauge() + registry.register( MASTER_NETWORK_STORE_WRITES, new Gauge() + { + public Long getValue() { - public Long getValue() - { - return masterNetworkStoreWrites.getBytesWritten(); - } - } ); + return masterNetworkStoreWrites.getBytesWritten(); + } + } ); - registry.register( SLAVE_NETWORK_TX_WRITES, new Gauge() + registry.register( SLAVE_NETWORK_TX_WRITES, new Gauge() + { + public Long getValue() { - public Long getValue() - { - return slaveNetworkTransactionWrites.getBytesWritten(); - } - } ); - } + return slaveNetworkTransactionWrites.getBytesWritten(); + } + } ); } @Override - public void stop() throws IOException + public void stop() { - if ( config.get( MetricsSettings.neoNetworkEnabled ) ) - { - registry.remove( MASTER_NETWORK_TX_WRITES ); - registry.remove( MASTER_NETWORK_STORE_WRITES ); - registry.remove( SLAVE_NETWORK_TX_WRITES ); + registry.remove( MASTER_NETWORK_TX_WRITES ); + registry.remove( MASTER_NETWORK_STORE_WRITES ); + registry.remove( SLAVE_NETWORK_TX_WRITES ); - monitors.removeMonitorListener( masterNetworkTransactionWrites ); - monitors.removeMonitorListener( masterNetworkStoreWrites ); - monitors.removeMonitorListener( slaveNetworkTransactionWrites ); - } + monitors.removeMonitorListener( masterNetworkTransactionWrites ); + monitors.removeMonitorListener( masterNetworkStoreWrites ); + monitors.removeMonitorListener( slaveNetworkTransactionWrites ); } } diff --git a/enterprise/metrics/src/main/java/org/neo4j/metrics/source/PageCacheMetrics.java b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/PageCacheMetrics.java index b5d5e6cb8786a..22252d2e26946 100644 --- a/enterprise/metrics/src/main/java/org/neo4j/metrics/source/PageCacheMetrics.java +++ b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/PageCacheMetrics.java @@ -22,13 +22,9 @@ import com.codahale.metrics.Gauge; import com.codahale.metrics.MetricRegistry; -import java.io.IOException; - import org.neo4j.io.pagecache.monitoring.PageCacheMonitor; -import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.annotations.Documented; import org.neo4j.kernel.lifecycle.LifecycleAdapter; -import org.neo4j.metrics.MetricsSettings; import static com.codahale.metrics.MetricRegistry.name; @@ -51,88 +47,80 @@ public class PageCacheMetrics extends LifecycleAdapter public static final String PC_PAGE_FAULTS = name( PAGE_CACHE_PREFIX, "page_faults" ); private final MetricRegistry registry; - private final Config config; private final PageCacheMonitor pageCacheCounters; - public PageCacheMetrics( MetricRegistry registry, Config config, PageCacheMonitor pageCacheCounters ) + public PageCacheMetrics( MetricRegistry registry, PageCacheMonitor pageCacheCounters ) { this.registry = registry; - this.config = config; this.pageCacheCounters = pageCacheCounters; } @Override - public void start() throws Throwable + public void start() { - if ( config.get( MetricsSettings.neoPageCacheEnabled ) ) + registry.register( PC_PAGE_FAULTS, new Gauge() { - registry.register( PC_PAGE_FAULTS, new Gauge() + @Override + public Long getValue() { - @Override - public Long getValue() - { - return pageCacheCounters.countFaults(); - } - } ); + return pageCacheCounters.countFaults(); + } + } ); - registry.register( PC_EVICTIONS, new Gauge() + registry.register( PC_EVICTIONS, new Gauge() + { + @Override + public Long getValue() { - @Override - public Long getValue() - { - return pageCacheCounters.countEvictions(); - } - } ); + return pageCacheCounters.countEvictions(); + } + } ); - registry.register( PC_PINS, new Gauge() + registry.register( PC_PINS, new Gauge() + { + @Override + public Long getValue() { - @Override - public Long getValue() - { - return pageCacheCounters.countPins(); - } - } ); + return pageCacheCounters.countPins(); + } + } ); - registry.register( PC_UNPINS, new Gauge() + registry.register( PC_UNPINS, new Gauge() + { + @Override + public Long getValue() { - @Override - public Long getValue() - { - return pageCacheCounters.countUnpins(); - } - } ); + return pageCacheCounters.countUnpins(); + } + } ); - registry.register( PC_FLUSHES, new Gauge() + registry.register( PC_FLUSHES, new Gauge() + { + @Override + public Long getValue() { - @Override - public Long getValue() - { - return pageCacheCounters.countFlushes(); - } - } ); + return pageCacheCounters.countFlushes(); + } + } ); - registry.register( PC_EVICTION_EXCEPTIONS, new Gauge() + registry.register( PC_EVICTION_EXCEPTIONS, new Gauge() + { + @Override + public Long getValue() { - @Override - public Long getValue() - { - return pageCacheCounters.countEvictionExceptions(); - } - } ); - } + return pageCacheCounters.countEvictionExceptions(); + } + } ); } @Override - public void stop() throws IOException + public void stop() { - if ( config.get( MetricsSettings.neoPageCacheEnabled ) ) - { - registry.remove( PC_PAGE_FAULTS ); - registry.remove( PC_EVICTIONS ); - registry.remove( PC_PINS ); - registry.remove( PC_UNPINS ); - registry.remove( PC_FLUSHES ); - registry.remove( PC_EVICTION_EXCEPTIONS ); - } + registry.remove( PC_PAGE_FAULTS ); + registry.remove( PC_EVICTIONS ); + registry.remove( PC_PINS ); + registry.remove( PC_UNPINS ); + registry.remove( PC_FLUSHES ); + registry.remove( PC_EVICTION_EXCEPTIONS ); } } diff --git a/enterprise/metrics/src/main/java/org/neo4j/metrics/source/ThreadMetrics.java b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/ThreadMetrics.java new file mode 100644 index 0000000000000..3a60c25ff022f --- /dev/null +++ b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/ThreadMetrics.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2002-2015 "Neo Technology," + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.neo4j.metrics.source; + +import com.codahale.metrics.Gauge; +import com.codahale.metrics.MetricRegistry; + +import org.neo4j.kernel.lifecycle.Lifecycle; +import org.neo4j.kernel.lifecycle.LifecycleAdapter; + +import static com.codahale.metrics.MetricRegistry.name; + +public class ThreadMetrics extends LifecycleAdapter implements Lifecycle +{ + public static final String THREAD_COUNT = name( JvmMetrics.NAME_PREFIX, "thread.count" ); + + private final MetricRegistry registry; + + public ThreadMetrics( MetricRegistry registry ) + { + this.registry = registry; + } + + @Override + public void start() + { + registry.register( THREAD_COUNT, new Gauge() + { + @Override + public Integer getValue() + { + return Thread.activeCount(); + } + } ); + } + + @Override + public void stop() + { + registry.remove( THREAD_COUNT ); + } +} + + diff --git a/enterprise/metrics/src/main/java/org/neo4j/metrics/source/TransactionMetrics.java b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/TransactionMetrics.java index d5fbb9336c850..8c00e923d2632 100644 --- a/enterprise/metrics/src/main/java/org/neo4j/metrics/source/TransactionMetrics.java +++ b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/TransactionMetrics.java @@ -22,14 +22,10 @@ import com.codahale.metrics.Gauge; import com.codahale.metrics.MetricRegistry; -import java.io.IOException; - -import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.annotations.Documented; import org.neo4j.kernel.impl.transaction.TransactionCounters; import org.neo4j.kernel.impl.transaction.state.DataSourceManager; import org.neo4j.kernel.lifecycle.LifecycleAdapter; -import org.neo4j.metrics.MetricsSettings; import static com.codahale.metrics.MetricRegistry.name; @@ -77,199 +73,190 @@ public class TransactionMetrics extends LifecycleAdapter public static final String LAST_CLOSED_TX_ID = name( TRANSACTION_PREFIX, "last_closed_tx_id" ); private final MetricRegistry registry; - private final Config config; private final DataSourceManager dataSourceManager; private final TransactionCounters transactionCounters; - public TransactionMetrics( MetricRegistry registry, Config config, DataSourceManager dataSourceManager, - TransactionCounters transactionCounters ) + public TransactionMetrics( MetricRegistry registry, + DataSourceManager dataSourceManager, TransactionCounters transactionCounters ) { this.registry = registry; - this.config = config; - this.dataSourceManager = dataSourceManager; this.transactionCounters = transactionCounters; } @Override - public void start() throws Throwable + public void start() { - if ( config.get( MetricsSettings.neoTxEnabled ) ) + registry.register( TX_STARTED, new Gauge() { - registry.register( TX_STARTED, new Gauge() + @Override + public Long getValue() { - @Override - public Long getValue() - { - return transactionCounters.getNumberOfStartedTransactions(); - } - } ); - - registry.register( TX_PEAK_CONCURRENT, new Gauge() + return transactionCounters.getNumberOfStartedTransactions(); + } + } ); + + registry.register( TX_PEAK_CONCURRENT, new Gauge() + { + @Override + public Long getValue() { - @Override - public Long getValue() - { - return transactionCounters.getPeakConcurrentNumberOfTransactions(); - } - } ); - - registry.register( TX_ACTIVE, new Gauge() + return transactionCounters.getPeakConcurrentNumberOfTransactions(); + } + } ); + + registry.register( TX_ACTIVE, new Gauge() + { + @Override + public Long getValue() { - @Override - public Long getValue() - { - return transactionCounters.getNumberOfActiveTransactions(); - } - } ); - - registry.register( READ_TX_ACTIVE, new Gauge() + return transactionCounters.getNumberOfActiveTransactions(); + } + } ); + + registry.register( READ_TX_ACTIVE, new Gauge() + { + @Override + public Long getValue() { - @Override - public Long getValue() - { - return transactionCounters.getNumberOfActiveReadTransactions(); - } - } ); - - registry.register( WRITE_TX_ACTIVE, new Gauge() + return transactionCounters.getNumberOfActiveReadTransactions(); + } + } ); + + registry.register( WRITE_TX_ACTIVE, new Gauge() + { + @Override + public Long getValue() { - @Override - public Long getValue() - { - return transactionCounters.getNumberOfActiveWriteTransactions(); - } - } ); - - registry.register( TX_COMMITTED, new Gauge() + return transactionCounters.getNumberOfActiveWriteTransactions(); + } + } ); + + registry.register( TX_COMMITTED, new Gauge() + { + @Override + public Long getValue() { - @Override - public Long getValue() - { - return transactionCounters.getNumberOfCommittedTransactions(); - } - } ); - - registry.register( READ_TX_COMMITTED, new Gauge() + return transactionCounters.getNumberOfCommittedTransactions(); + } + } ); + + registry.register( READ_TX_COMMITTED, new Gauge() + { + @Override + public Long getValue() { - @Override - public Long getValue() - { - return transactionCounters.getNumberOfCommittedReadTransactions(); - } - } ); - - registry.register( WRITE_TX_COMMITTED, new Gauge() + return transactionCounters.getNumberOfCommittedReadTransactions(); + } + } ); + + registry.register( WRITE_TX_COMMITTED, new Gauge() + { + @Override + public Long getValue() { - @Override - public Long getValue() - { - return transactionCounters.getNumberOfCommittedWriteTransactions(); - } - } ); - - registry.register( TX_ROLLBACKS, new Gauge() + return transactionCounters.getNumberOfCommittedWriteTransactions(); + } + } ); + + registry.register( TX_ROLLBACKS, new Gauge() + { + @Override + public Long getValue() { - @Override - public Long getValue() - { - return transactionCounters.getNumberOfRolledBackTransactions(); - } - } ); - - registry.register( READ_TX_ROLLBACKS, new Gauge() + return transactionCounters.getNumberOfRolledBackTransactions(); + } + } ); + + registry.register( READ_TX_ROLLBACKS, new Gauge() + { + @Override + public Long getValue() { - @Override - public Long getValue() - { - return transactionCounters.getNumberOfRolledBackReadTransactions(); - } - } ); - - registry.register( WRITE_TX_ROLLBACKS, new Gauge() + return transactionCounters.getNumberOfRolledBackReadTransactions(); + } + } ); + + registry.register( WRITE_TX_ROLLBACKS, new Gauge() + { + @Override + public Long getValue() { - @Override - public Long getValue() - { - return transactionCounters.getNumberOfRolledBackWriteTransactions(); - } - } ); - - registry.register( TX_TERMINATED, new Gauge() + return transactionCounters.getNumberOfRolledBackWriteTransactions(); + } + } ); + + registry.register( TX_TERMINATED, new Gauge() + { + @Override + public Long getValue() { - @Override - public Long getValue() - { - return transactionCounters.getNumberOfTerminatedTransactions(); - } - } ); - - registry.register( READ_TX_TERMINATED, new Gauge() + return transactionCounters.getNumberOfTerminatedTransactions(); + } + } ); + + registry.register( READ_TX_TERMINATED, new Gauge() + { + @Override + public Long getValue() { - @Override - public Long getValue() - { - return transactionCounters.getNumberOfTerminatedReadTransactions(); - } - } ); - - registry.register( WRITE_TX_TERMINATED, new Gauge() + return transactionCounters.getNumberOfTerminatedReadTransactions(); + } + } ); + + registry.register( WRITE_TX_TERMINATED, new Gauge() + { + @Override + public Long getValue() { - @Override - public Long getValue() - { - return transactionCounters.getNumberOfTerminatedWriteTransactions(); - } - } ); - - registry.register( LAST_COMMITTED_TX_ID, new Gauge() + return transactionCounters.getNumberOfTerminatedWriteTransactions(); + } + } ); + + registry.register( LAST_COMMITTED_TX_ID, new Gauge() + { + @Override + public Long getValue() { - @Override - public Long getValue() - { - return dataSourceManager.getDataSource(). - getNeoStores().getMetaDataStore().getLastCommittedTransactionId(); - } - } ); - - registry.register( LAST_CLOSED_TX_ID, new Gauge() + return dataSourceManager.getDataSource(). + getNeoStores().getMetaDataStore().getLastCommittedTransactionId(); + } + } ); + + registry.register( LAST_CLOSED_TX_ID, new Gauge() + { + @Override + public Long getValue() { - @Override - public Long getValue() - { - return dataSourceManager.getDataSource(). - getNeoStores().getMetaDataStore().getLastClosedTransactionId(); - } - } ); - } + return dataSourceManager.getDataSource(). + getNeoStores().getMetaDataStore().getLastClosedTransactionId(); + } + } ); } @Override - public void stop() throws IOException + public void stop() { - if ( config.get( MetricsSettings.neoTxEnabled ) ) - { - registry.remove( TX_STARTED ); - registry.remove( TX_PEAK_CONCURRENT ); + registry.remove( TX_STARTED ); + registry.remove( TX_PEAK_CONCURRENT ); - registry.remove( TX_ACTIVE ); - registry.remove( READ_TX_ACTIVE ); - registry.remove( WRITE_TX_ACTIVE ); + registry.remove( TX_ACTIVE ); + registry.remove( READ_TX_ACTIVE ); + registry.remove( WRITE_TX_ACTIVE ); - registry.remove( TX_COMMITTED ); - registry.remove( READ_TX_COMMITTED ); - registry.remove( WRITE_TX_COMMITTED ); + registry.remove( TX_COMMITTED ); + registry.remove( READ_TX_COMMITTED ); + registry.remove( WRITE_TX_COMMITTED ); - registry.remove( TX_ROLLBACKS ); - registry.remove( READ_TX_ROLLBACKS ); - registry.remove( WRITE_TX_ROLLBACKS ); + registry.remove( TX_ROLLBACKS ); + registry.remove( READ_TX_ROLLBACKS ); + registry.remove( WRITE_TX_ROLLBACKS ); - registry.remove( TX_TERMINATED ); - registry.remove( READ_TX_TERMINATED ); - registry.remove( WRITE_TX_TERMINATED ); + registry.remove( TX_TERMINATED ); + registry.remove( READ_TX_TERMINATED ); + registry.remove( WRITE_TX_TERMINATED ); - registry.remove( LAST_COMMITTED_TX_ID ); - registry.remove( LAST_CLOSED_TX_ID ); - } + registry.remove( LAST_COMMITTED_TX_ID ); + registry.remove( LAST_CLOSED_TX_ID ); } } diff --git a/enterprise/metrics/src/test/java/org/neo4j/metrics/source/ClusterMetricsTest.java b/enterprise/metrics/src/test/java/org/neo4j/metrics/source/ClusterMetricsTest.java index 2e8e7fceae9af..afc4652c36580 100644 --- a/enterprise/metrics/src/test/java/org/neo4j/metrics/source/ClusterMetricsTest.java +++ b/enterprise/metrics/src/test/java/org/neo4j/metrics/source/ClusterMetricsTest.java @@ -35,29 +35,27 @@ import java.util.concurrent.TimeUnit; import org.neo4j.cluster.InstanceId; -import org.neo4j.graphdb.DependencyResolver; -import org.neo4j.helpers.Settings; -import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.ha.cluster.HighAvailabilityMemberState; import org.neo4j.kernel.ha.cluster.HighAvailabilityMemberStateMachine; import org.neo4j.kernel.ha.cluster.member.ClusterMember; import org.neo4j.kernel.ha.cluster.member.ClusterMembers; import org.neo4j.kernel.ha.cluster.member.ObservedClusterMembers; import org.neo4j.kernel.ha.cluster.modeswitch.HighAvailabilityModeSwitcher; -import org.neo4j.kernel.impl.logging.LogService; import org.neo4j.kernel.lifecycle.LifeSupport; import org.neo4j.kernel.monitoring.Monitors; -import org.neo4j.metrics.MetricsSettings; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; -import static org.neo4j.helpers.collection.MapUtil.stringMap; public class ClusterMetricsTest { + private final MetricRegistry metricRegistry = new MetricRegistry(); + private final Monitors monitors = new Monitors(); + private final LifeSupport life = new LifeSupport(); + @Rule public ExpectedException thrown = ExpectedException.none(); @@ -65,17 +63,10 @@ public class ClusterMetricsTest public void clusterMetricsReportMasterAvailable() { // given - MetricRegistry metricRegistry = new MetricRegistry(); - Config config = new Config( stringMap( MetricsSettings.neoClusterEnabled.name(), Settings.TRUE ) ); - Monitors monitors = new Monitors(); - LifeSupport life = new LifeSupport(); ClusterMembers clusterMembers = getClusterMembers( HighAvailabilityModeSwitcher.MASTER, HighAvailabilityMemberState.MASTER ); - DependencyResolver dependencyResolver = mock( DependencyResolver.class ); - when( dependencyResolver.resolveDependency( ClusterMembers.class ) ).thenReturn( clusterMembers ); - LogService logService = mock( LogService.class ); - life.add( new ClusterMetrics( config, monitors, metricRegistry, dependencyResolver, logService ) ); + life.add( new ClusterMetrics( monitors, metricRegistry, clusterMembers ) ); life.start(); // when @@ -92,17 +83,10 @@ public void clusterMetricsReportMasterAvailable() public void clusterMetricsReportSlaveAvailable() { // given - MetricRegistry metricRegistry = new MetricRegistry(); - Config config = new Config( stringMap( MetricsSettings.neoClusterEnabled.name(), Settings.TRUE ) ); ClusterMembers clusterMembers = getClusterMembers( HighAvailabilityModeSwitcher.SLAVE, HighAvailabilityMemberState.SLAVE ); - DependencyResolver dependencyResolver = mock( DependencyResolver.class ); - when( dependencyResolver.resolveDependency( ClusterMembers.class ) ).thenReturn( clusterMembers ); - LogService logService = mock( LogService.class ); - Monitors monitors = new Monitors(); - LifeSupport life = new LifeSupport(); - life.add( new ClusterMetrics( config, monitors, metricRegistry, dependencyResolver, logService ) ); + life.add( new ClusterMetrics( monitors, metricRegistry, clusterMembers ) ); life.start(); // when @@ -115,59 +99,7 @@ public void clusterMetricsReportSlaveAvailable() assertEquals( 1, reporter.isAvailableValue ); } - @Test - public void testClusterMemberNotEnabled() - { - // given - MetricRegistry metricRegistry = new MetricRegistry(); - Config config = new Config( stringMap( MetricsSettings.neoClusterEnabled.name(), Settings.FALSE ) ); - ClusterMembers clusterMembers = - getClusterMembers( HighAvailabilityModeSwitcher.SLAVE, HighAvailabilityMemberState.SLAVE ); - DependencyResolver dependencyResolver = mock( DependencyResolver.class ); - when( dependencyResolver.resolveDependency( ClusterMembers.class ) ).thenReturn( clusterMembers ); - LogService logService = mock( LogService.class ); - - Monitors monitors = new Monitors(); - LifeSupport life = new LifeSupport(); - life.add( new ClusterMetrics( config, monitors, metricRegistry, dependencyResolver, logService ) ); - life.start(); - - // when - TestReporter reporter = new TestReporter( metricRegistry ); - reporter.start( 10, TimeUnit.MILLISECONDS ); - - //then the reporter should fail - thrown.expect( NullPointerException.class ); - reporter.report(); - } - - @Test - public void testClusterMembersNull() - { - // given - MetricRegistry metricRegistry = new MetricRegistry(); - Config config = new Config( stringMap( MetricsSettings.neoClusterEnabled.name(), Settings.TRUE ) ); - ClusterMembers clusterMembers = null; - DependencyResolver dependencyResolver = mock( DependencyResolver.class ); - when( dependencyResolver.resolveDependency( ClusterMembers.class ) ).thenReturn( clusterMembers ); - LogService logService = mock( LogService.class ); - - Monitors monitors = new Monitors(); - LifeSupport life = new LifeSupport(); - life.add( new ClusterMetrics( config, monitors, metricRegistry, dependencyResolver, logService ) ); - life.start(); - - // when - TestReporter reporter = new TestReporter( metricRegistry ); - reporter.start( 10, TimeUnit.MILLISECONDS ); - - //then the reporter should fail - reporter.report(); - assertEquals( 0, reporter.isMasterValue ); - assertEquals( 0, reporter.isAvailableValue ); - } - - ClusterMembers getClusterMembers( String memberRole, HighAvailabilityMemberState memberState ) + private static ClusterMembers getClusterMembers( String memberRole, HighAvailabilityMemberState memberState ) { HighAvailabilityMemberStateMachine stateMachine = mock( HighAvailabilityMemberStateMachine.class ); when( stateMachine.getCurrentState() ).thenReturn( memberState ); @@ -178,7 +110,7 @@ ClusterMembers getClusterMembers( String memberRole, HighAvailabilityMemberState return new ClusterMembers( observedClusterMembers, stateMachine ); } - class TestReporter extends ScheduledReporter + private class TestReporter extends ScheduledReporter { private int isMasterValue, isAvailableValue;