Skip to content

Commit

Permalink
Refactor the output logic in Metrics extension
Browse files Browse the repository at this point in the history
Particularly if there are no available outputs we don't start any
metrics.
  • Loading branch information
davidegrohmann committed Dec 9, 2015
1 parent fdac7ca commit 83b49a7
Show file tree
Hide file tree
Showing 6 changed files with 207 additions and 152 deletions.
Expand Up @@ -21,7 +21,6 @@


import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.MetricRegistry;


import org.neo4j.cluster.ClusterSettings;
import org.neo4j.graphdb.DependencyResolver; import org.neo4j.graphdb.DependencyResolver;
import org.neo4j.io.pagecache.monitoring.PageCacheMonitor; import org.neo4j.io.pagecache.monitoring.PageCacheMonitor;
import org.neo4j.kernel.IdGeneratorFactory; import org.neo4j.kernel.IdGeneratorFactory;
Expand All @@ -36,14 +35,12 @@
import org.neo4j.kernel.lifecycle.Lifecycle; import org.neo4j.kernel.lifecycle.Lifecycle;
import org.neo4j.kernel.monitoring.Monitors; import org.neo4j.kernel.monitoring.Monitors;
import org.neo4j.logging.Log; import org.neo4j.logging.Log;
import org.neo4j.metrics.output.CsvOutput; import org.neo4j.metrics.output.OutputBuilder;
import org.neo4j.metrics.output.GangliaOutput;
import org.neo4j.metrics.output.GraphiteOutput;
import org.neo4j.metrics.source.Neo4jMetricsFactory; import org.neo4j.metrics.source.Neo4jMetricsFactory;


public class MetricsExtension implements Lifecycle public class MetricsExtension implements Lifecycle
{ {
private final LifeSupport life; private final LifeSupport life = new LifeSupport();
private final LogService logService; private final LogService logService;
private final Config configuration; private final Config configuration;
private final Monitors monitors; private final Monitors monitors;
Expand All @@ -58,7 +55,6 @@ public class MetricsExtension implements Lifecycle


public MetricsExtension( MetricsKernelExtensionFactory.Dependencies dependencies ) public MetricsExtension( MetricsKernelExtensionFactory.Dependencies dependencies )
{ {
life = new LifeSupport();
logService = dependencies.logService(); logService = dependencies.logService();
configuration = dependencies.configuration(); configuration = dependencies.configuration();
monitors = dependencies.monitors(); monitors = dependencies.monitors();
Expand All @@ -73,62 +69,45 @@ public MetricsExtension( MetricsKernelExtensionFactory.Dependencies dependencies
} }


@Override @Override
public void init() throws Throwable public void init()
{ {
Log logger = logService.getUserLog( getClass() ); Log logger = logService.getUserLog( getClass() );
logger.info( "Initiating metrics..." );


// Setup metrics // Setup metrics
final MetricRegistry registry = new MetricRegistry(); final MetricRegistry registry = new MetricRegistry();


logger.info( "Initiating metrics.." );

// Setup output // Setup output
String prefix = computePrefix( configuration ); boolean outputBuilt = new OutputBuilder( configuration, registry, logger, kernelContext, life ).build();

life.add( new CsvOutput( configuration, registry, logger, kernelContext ) );
life.add( new GraphiteOutput( configuration, registry, logger, prefix ) );
life.add( new GangliaOutput( configuration, registry, logger, prefix ) );


// Setup metric gathering // if there is any output available then start the metrics
Neo4jMetricsFactory factory = new Neo4jMetricsFactory( registry, configuration, monitors, dataSourceManager, if ( outputBuilt )
transactionCounters, pageCacheCounters, checkPointerMonitor, logRotationMonitor, idGeneratorFactory, {
dependencyResolver, logService) ; // Setup metric gathering
life.add( factory.newInstance() ); Neo4jMetricsFactory factory = new Neo4jMetricsFactory( registry, configuration, monitors, dataSourceManager,
transactionCounters, pageCacheCounters, checkPointerMonitor, logRotationMonitor, idGeneratorFactory,
dependencyResolver, logService );
life.add( factory.newInstance() );
}


life.init(); life.init();
} }


@Override @Override
public void start() throws Throwable public void start()
{ {
life.start(); life.start();
} }


@Override @Override
public void stop() throws Throwable public void stop()
{ {
life.stop(); life.stop();
} }


@Override @Override
public void shutdown() throws Throwable public void shutdown()
{ {
life.shutdown(); life.shutdown();
} }

private String computePrefix( Config config )
{
String prefix = config.get( MetricsSettings.metricsPrefix );

if ( prefix.equals( MetricsSettings.metricsPrefix.getDefaultValue() ) )
{
// If default name and in HA, try to figure out a nicer name
if ( config.getParams().containsKey( ClusterSettings.server_id.name() ) )
{
prefix += "." + config.get( ClusterSettings.cluster_name );
prefix += "." + config.get( ClusterSettings.server_id );
}
}
return prefix;
}
} }
Expand Up @@ -30,15 +30,15 @@


import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.impl.spi.KernelContext; import org.neo4j.kernel.impl.spi.KernelContext;
import org.neo4j.kernel.lifecycle.LifecycleAdapter; import org.neo4j.kernel.lifecycle.Lifecycle;
import org.neo4j.logging.Log; import org.neo4j.logging.Log;


import static org.neo4j.kernel.configuration.Config.absoluteFileOrRelativeTo; import static org.neo4j.kernel.configuration.Config.absoluteFileOrRelativeTo;
import static org.neo4j.metrics.MetricsSettings.csvEnabled; import static org.neo4j.metrics.MetricsSettings.csvEnabled;
import static org.neo4j.metrics.MetricsSettings.csvInterval; import static org.neo4j.metrics.MetricsSettings.csvInterval;
import static org.neo4j.metrics.MetricsSettings.csvPath; import static org.neo4j.metrics.MetricsSettings.csvPath;


public class CsvOutput extends LifecycleAdapter public class CsvOutput implements Lifecycle
{ {
private final Config config; private final Config config;
private final MetricRegistry registry; private final MetricRegistry registry;
Expand All @@ -58,22 +58,38 @@ public CsvOutput( Config config, MetricRegistry registry, Log logger, KernelCont
@Override @Override
public void init() public void init()
{ {
if ( config.get( csvEnabled ) ) // Setup CSV reporting
File configuredPath = config.get( csvPath );
if ( configuredPath == null )
{ {
// Setup CSV reporting throw new IllegalArgumentException( csvPath.name() + " configuration is required since " +
File configuredPath = config.get( csvPath ); csvEnabled.name() + " is enabled" );
if ( configuredPath == null )
{
throw new IllegalArgumentException( csvPath.name() + " configuration is required since " +
csvEnabled.name() + " is enabled" );
}
outputPath = absoluteFileOrRelativeTo( kernelContext.storeDir(), configuredPath );
csvReporter = CsvReporter.forRegistry( registry )
.convertRatesTo( TimeUnit.SECONDS )
.convertDurationsTo( TimeUnit.MILLISECONDS )
.filter( MetricFilter.ALL )
.build( ensureDirectoryExists( outputPath ) );
} }
outputPath = absoluteFileOrRelativeTo( kernelContext.storeDir(), configuredPath );
csvReporter = CsvReporter.forRegistry( registry )
.convertRatesTo( TimeUnit.SECONDS )
.convertDurationsTo( TimeUnit.MILLISECONDS )
.filter( MetricFilter.ALL )
.build( ensureDirectoryExists( outputPath ) );
}

@Override
public void start()
{
csvReporter.start( config.get( csvInterval ), TimeUnit.MILLISECONDS );
logger.info( "Sending metrics to CSV file at " + outputPath );
}

@Override
public void stop() throws IOException
{
csvReporter.stop();
}

@Override
public void shutdown()
{
csvReporter = null;
} }


private File ensureDirectoryExists( File dir ) private File ensureDirectoryExists( File dir )
Expand All @@ -94,24 +110,4 @@ private File ensureDirectoryExists( File dir )
} }
return dir; return dir;
} }

@Override
public void start()
{
if ( csvReporter != null )
{
csvReporter.start( config.get( csvInterval ), TimeUnit.MILLISECONDS );
logger.info( "Sending metrics to CSV file at " + outputPath );
}
}

@Override
public void stop() throws IOException
{
if ( csvReporter != null )
{
csvReporter.stop();
csvReporter = null;
}
}
} }
Expand Up @@ -28,32 +28,30 @@
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;


import org.neo4j.helpers.HostnamePort; import org.neo4j.helpers.HostnamePort;
import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.lifecycle.Lifecycle;
import org.neo4j.kernel.lifecycle.LifecycleAdapter;
import org.neo4j.logging.Log; import org.neo4j.logging.Log;


import static org.neo4j.metrics.MetricsSettings.gangliaEnabled; import static info.ganglia.gmetric4j.gmetric.GMetric.UDPAddressingMode.MULTICAST;
import static org.neo4j.metrics.MetricsSettings.gangliaInterval;
import static org.neo4j.metrics.MetricsSettings.gangliaServer;


/** /**
* @deprecated Ganglia support is experimental, and not guaranteed to work. * @deprecated Ganglia support is experimental, and not guaranteed to work.
* This built in support has been deprecated and will be removed from a subsequent version. * This built in support has been deprecated and will be removed from a subsequent version.
* Please use {@link GraphiteOutput} instead * Please use {@link GraphiteOutput} instead
*/ */
@Deprecated @Deprecated
public class GangliaOutput extends LifecycleAdapter public class GangliaOutput implements Lifecycle
{ {
private final Config config; private final HostnamePort hostnamePort;
private long period;
private final MetricRegistry registry; private final MetricRegistry registry;
private final Log logger; private final Log logger;
private final String prefix; private final String prefix;
private GangliaReporter gangliaReporter; private GangliaReporter gangliaReporter;
private HostnamePort hostnamePort;


public GangliaOutput( Config config, MetricRegistry registry, Log logger, String prefix ) public GangliaOutput( HostnamePort hostnamePort, long period, MetricRegistry registry, Log logger, String prefix )
{ {
this.config = config; this.hostnamePort = hostnamePort;
this.period = period;
this.registry = registry; this.registry = registry;
this.logger = logger; this.logger = logger;
this.prefix = prefix; this.prefix = prefix;
Expand All @@ -62,42 +60,32 @@ public GangliaOutput( Config config, MetricRegistry registry, Log logger, String
@Override @Override
public void init() throws IOException public void init() throws IOException
{ {
if ( config.get( gangliaEnabled ) ) // Setup Ganglia reporting
{ final GMetric ganglia = new GMetric( hostnamePort.getHost(), hostnamePort.getPort(), MULTICAST, 1 );
// Setup Ganglia reporting gangliaReporter = GangliaReporter.forRegistry( registry )
hostnamePort = config.get( gangliaServer ); .prefixedWith( prefix )
final GMetric ganglia = new GMetric( .convertRatesTo( TimeUnit.SECONDS )
hostnamePort.getHost(), .convertDurationsTo( TimeUnit.MILLISECONDS )
hostnamePort.getPort(), .filter( MetricFilter.ALL )
GMetric.UDPAddressingMode.MULTICAST, .build( ganglia );
1 );

gangliaReporter = GangliaReporter.forRegistry( registry )
.prefixedWith( prefix )
.convertRatesTo( TimeUnit.SECONDS )
.convertDurationsTo( TimeUnit.MILLISECONDS )
.filter( MetricFilter.ALL )
.build( ganglia );
}
} }


@Override @Override
public void start() public void start()
{ {
if ( gangliaReporter != null ) gangliaReporter.start( period, TimeUnit.MILLISECONDS );
{ logger.info( "Sending metrics to Ganglia server at " + hostnamePort );
gangliaReporter.start( config.get( gangliaInterval ), TimeUnit.MILLISECONDS );
logger.info( "Sending metrics to Ganglia server at " + hostnamePort );
}
} }


@Override @Override
public void stop() throws IOException public void stop() throws IOException
{ {
if ( gangliaReporter != null ) gangliaReporter.close();
{ }
gangliaReporter.close();
gangliaReporter = null; @Override
} public void shutdown()
{
gangliaReporter = null;
} }
} }

0 comments on commit 83b49a7

Please sign in to comment.