Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor metrics and sync with current Indy for features. #48

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 2 additions & 14 deletions metrics/core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -36,20 +36,8 @@
</dependency>

<dependency>
<groupId>io.dropwizard.metrics</groupId>
<artifactId>metrics-core</artifactId>
</dependency>
<dependency>
<groupId>io.dropwizard.metrics</groupId>
<artifactId>metrics-jvm</artifactId>
</dependency>
<dependency>
<groupId>io.dropwizard.metrics</groupId>
<artifactId>metrics-healthchecks</artifactId>
</dependency>
<dependency>
<groupId>org.commonjava.util</groupId>
<artifactId>http-testserver</artifactId>
<groupId>org.commonjava.cdi.util</groupId>
<artifactId>weft</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.health.HealthCheck;
import com.codahale.metrics.health.HealthCheckRegistry;
import org.commonjava.propulsor.metrics.conf.EnabledMetrics;
import org.commonjava.propulsor.metrics.conf.MetricSubsetConfig;

/**
* Utility methods to make initializing metrics in a registry simpler and more consistent.
Expand All @@ -30,7 +30,7 @@ private InitializerUtil()
{
}

public static void registerIfEnabled( String key, Metric metric, EnabledMetrics<?> enabledMetrics,
public static void registerIfEnabled( String key, Metric metric, MetricSubsetConfig<?> enabledMetrics,
MetricRegistry registry )
{
if ( enabledMetrics.isEnabled() && enabledMetrics.isEnabled( key ) )
Expand All @@ -39,7 +39,7 @@ public static void registerIfEnabled( String key, Metric metric, EnabledMetrics<
}
}

public static void registerIfEnabled( String key, HealthCheck healthCheck, EnabledMetrics<?> enabledMetrics,
public static void registerIfEnabled( String key, HealthCheck healthCheck, MetricSubsetConfig<?> enabledMetrics,
HealthCheckRegistry healthCheckRegistry )
{
if ( enabledMetrics.isEnabled() && enabledMetrics.isEnabled( key ) )
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package org.commonjava.propulsor.metrics;

import java.util.Set;

public class MeteringContext
{
private final Set<String> names;

private final MetricsManager metricsManager;

public MeteringContext( final Set<String> names, final MetricsManager metricsManager )
{
this.names = names;
this.metricsManager = metricsManager;
}

public void mark()
{
metricsManager.mark( names );
}

public void mark(long count)
{
metricsManager.mark( names, count );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,19 @@ public class MetricsConstants

public static final String TIMER = "timer";

public static final String DEFAULT = "default";

public static final String SKIP_METRIC = "skip-this-metric";

public static final String CUMULATIVELY_METERED = "cumulatively-metered";

public static final String CUMULATIVE_TIMINGS = "cumulative-timings";

public static final String CUMULATIVE_COUNTS = "cumulative-counts";

// for measuring transfer rates...
public static final double NANOS_PER_SEC = 1E9;

// for measuring timing in ms...
public static final double NANOS_PER_MILLISECOND = 1E6;
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,9 @@
*/
package org.commonjava.propulsor.metrics;

import com.codahale.metrics.Meter;
import com.codahale.metrics.Timer;
import org.commonjava.propulsor.metrics.annotation.Measure;
import org.commonjava.propulsor.metrics.annotation.MetricNamed;
import org.commonjava.propulsor.metrics.conf.MetricsConfig;
import org.commonjava.propulsor.metrics.spi.TimingContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -43,14 +41,9 @@
import javax.interceptor.Interceptor;
import javax.interceptor.InvocationContext;
import java.lang.reflect.Method;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static com.codahale.metrics.MetricRegistry.name;
import static org.apache.commons.lang3.ClassUtils.getAbbreviatedName;
import static org.apache.commons.lang3.StringUtils.isBlank;
import static org.commonjava.propulsor.metrics.annotation.MetricNamed.DEFAULT;
import static org.commonjava.propulsor.metrics.MetricsConstants.EXCEPTION;
import static org.commonjava.propulsor.metrics.MetricsConstants.METER;
import static org.commonjava.propulsor.metrics.MetricsConstants.TIMER;
Expand Down Expand Up @@ -91,77 +84,33 @@ public Object operation( InvocationContext context ) throws Exception
logger.trace( "Gathering metrics for: {}", context.getContextData() );
String nodePrefix = config.getInstancePrefix();

String defaultName = getDefaultName( context );
String defaultName = metricsManager.getDefaultName( context );

TimingContext timing = metricsManager.timeAll( Stream.of( measure.timers() )
.map( n -> metricsManager.getName( nodePrefix, n, defaultName, TIMER ) )
.collect( Collectors.toSet() ) );

List<Timer.Context> timers = Stream.of( measure.timers() ).map( named ->
{
String name = getName( nodePrefix, named, defaultName, TIMER );
Timer.Context tc = metricsManager.getTimer( name ).time();
logger.trace( "START: {} ({})", name, tc );
return tc;
} )
.collect( Collectors.toList() );

try
{
return context.proceed();
}
catch ( Exception e )
{
Stream.of( measure.exceptions() ).forEach( ( named ) ->
{
String name = getName( nodePrefix, named, defaultName, EXCEPTION );
Meter meter = metricsManager.getMeter( name );
logger.trace( "ERRORS++ {}", name );
meter.mark();
} );
metricsManager.mark( Stream.of( measure.exceptions() )
.map( n -> metricsManager.getName( nodePrefix, n, defaultName, EXCEPTION ) )
.collect( Collectors.toSet() ) );

throw e;
}
finally
{
if ( timers != null )
{
timers.forEach( timer->{
logger.trace( "STOP: {}", timer );
timer.stop();
} );

}
Stream.of( measure.meters() ).forEach( ( named ) ->
{
String name = getName( nodePrefix, named, defaultName, METER );
Meter meter = metricsManager.getMeter( name );
logger.trace( "CALLS++ {}", name );
meter.mark();
} );
}
}

/**
* Get default metric name. Use abbreviated package name, e.g., foo.bar.ClassA.methodB -> f.b.ClassA.methodB
*/
private String getDefaultName( InvocationContext context )
{
// minimum len 1 shortens the package name and keeps class name
String cls = getAbbreviatedName( context.getMethod().getDeclaringClass().getName(), 1 );
String method = context.getMethod().getName();
return name( cls, method );
}
timing.stop();

/**
* Get the metric fullname.
* @param named user specified name
* @param defaultName 'class name + method name', not null.
*/
private String getName( String instancePrefix, MetricNamed named, String defaultName, String suffix )
{
String name = named.value();
if ( isBlank( name ) || name.equals( DEFAULT ) )
{
name = defaultName;
metricsManager.mark( Stream.of( measure.meters() )
.map( n -> metricsManager.getName( nodePrefix, n, defaultName, METER ) )
.collect( Collectors.toSet() ) );
}
return name( instancePrefix, name, suffix );
}

}
Loading