All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.codahale.metrics.jdbi.strategies.ShortNameStrategy Maven / Gradle / Ivy

Go to download

A JDBI wrapper providing Metrics instrumentation of query durations and rates.

The newest version!
package com.codahale.metrics.jdbi.strategies;

import org.skife.jdbi.v2.StatementContext;

import java.lang.reflect.Method;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

import static com.codahale.metrics.MetricRegistry.name;

/**
 * Assembles all JDBI stats under a common prefix (passed in at constructor time). Stats are grouped
 * by class name and method; a shortening strategy is applied to make the JMX output nicer.
 */
public final class ShortNameStrategy extends DelegatingStatementNameStrategy {
    private final ConcurrentMap shortClassNames = new ConcurrentHashMap<>();

    private final String baseJmxName;

    public ShortNameStrategy(String baseJmxName) {
        this.baseJmxName = baseJmxName;

        // Java does not allow super (..., new ShortContextClassStrategy(), new ShortSqlObjectStrategy(), ...);
        // ==> No enclosing instance of type  is available due to some intermediate constructor invocation. Lame.
        registerStrategies(NameStrategies.CHECK_EMPTY,
                new ShortContextClassStrategy(),
                new ShortSqlObjectStrategy(),
                NameStrategies.CHECK_RAW,
                NameStrategies.NAIVE_NAME);
    }

    private final class ShortContextClassStrategy implements StatementNameStrategy {
        @Override
        public String getStatementName(StatementContext statementContext) {
            final Object classObj = statementContext.getAttribute(NameStrategies.STATEMENT_CLASS);
            final Object nameObj = statementContext.getAttribute(NameStrategies.STATEMENT_NAME);

            if (classObj == null || nameObj == null) {
                return null;
            }

            final String className = (String) classObj;
            final String statementName = (String) nameObj;

            final int dotPos = className.lastIndexOf('.');
            if (dotPos == -1) {
                return null;
            }

            final String shortName = className.substring(dotPos + 1);

            final String oldClassName = shortClassNames.putIfAbsent(shortName, className);
            if (oldClassName == null || oldClassName.equals(className)) {
                return name(baseJmxName, shortName, statementName);
            } else {
                return name(baseJmxName, className, statementName);
            }
        }
    }

    private final class ShortSqlObjectStrategy implements StatementNameStrategy {
        @Override
        public String getStatementName(StatementContext statementContext) {
            final Class clazz = statementContext.getSqlObjectType();
            final Method method = statementContext.getSqlObjectMethod();
            if (clazz != null && method != null) {
                final String className = clazz.getName();
                final String statementName = method.getName();

                final int dotPos = className.lastIndexOf('.');
                if (dotPos == -1) {
                    return null;
                }

                final String shortName = className.substring(dotPos + 1);

                final String oldClassName = shortClassNames.putIfAbsent(shortName, className);
                if (oldClassName == null || oldClassName.equals(className)) {
                    return name(baseJmxName, shortName, statementName);
                } else {
                    return name(baseJmxName, className, statementName);
                }
            }
            return null;
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy