Skip to content

Commit

Permalink
Refactor Neo4jMetricsBuilder to create Metrics only when they are ena…
Browse files Browse the repository at this point in the history
…bled
  • Loading branch information
davidegrohmann committed Dec 9, 2015
1 parent 83b49a7 commit 4307eab
Show file tree
Hide file tree
Showing 18 changed files with 921 additions and 813 deletions.
4 changes: 4 additions & 0 deletions enterprise/metrics/pom.xml
Expand Up @@ -54,13 +54,17 @@
<java classname="org.neo4j.metrics.docs.GenerateMetricsDocumentation"
classpathref="maven.test.classpath" failonerror="true">
<arg value="--output=${project.build.directory}/docs/ops/available-metrics.asciidoc" />

<arg value="org.neo4j.metrics.source.CheckPointingMetrics" />
<arg value="org.neo4j.metrics.source.EntityCountMetrics" />
<arg value="org.neo4j.metrics.source.PageCacheMetrics" />
<arg value="org.neo4j.metrics.source.TransactionMetrics" />
<arg value="org.neo4j.metrics.source.CypherMetrics" />
<arg value="org.neo4j.metrics.source.LogRotationMetrics" />

<arg value="org.neo4j.metrics.source.NetworkMetrics" />
<arg value="org.neo4j.metrics.source.ClusterMetrics" />

<arg value="org.neo4j.metrics.source.JvmMetrics" />
</java>
</target>
Expand Down
Expand Up @@ -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
{
Expand Down Expand Up @@ -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();
Expand Down
Expand Up @@ -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
{
Expand All @@ -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<Long>()
{
registry.register( CHECK_POINT_EVENTS, new Gauge<Long>()
{
@Override
public Long getValue()
{
return checkPointerMonitor.numberOfCheckPointEvents();
}
} );

registry.register( CHECK_POINT_TOTAL_TIME, new Gauge<Long>()
@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<Long>()
{
registry.register( LOG_ROTATION_EVENTS, new Gauge<Long>()
@Override
public Long getValue()
{
@Override
public Long getValue()
{
return logRotationMonitor.numberOfLogRotationEvents();
}
} );

registry.register( LOG_ROTATION_TOTAL_TIME, new Gauge<Long>()
{
@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 );
}
}
Expand Up @@ -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;
Expand All @@ -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<Long>()
{
@Override
public Long getValue()
{
return monitor.events.get();
}
} );

registry.register( SLAVE_PULL_UPDATE_UP_TO_TX, new Gauge<Long>()
registry.register( SLAVE_PULL_UPDATES, new Gauge<Long>()
{
@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<Long>()
{
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
Expand Down
Expand Up @@ -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;

Expand All @@ -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<Long>()
registry.register( REPLAN_EVENTS, new Gauge<Long>()
{
@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 );
}
}

0 comments on commit 4307eab

Please sign in to comment.