static {
   pluginServices.registerConfigListener(
       new ConfigListener() {
         @Override
         public void onChange() {
           pluginEnabled = pluginServices.isEnabled();
           metricEnabled =
               pluginEnabled && pluginServices.getBooleanProperty("captureResultSetNext");
         }
       });
   pluginEnabled = pluginServices.isEnabled();
   metricEnabled = pluginEnabled && pluginServices.getBooleanProperty("captureResultSetNext");
 }
 @OnBefore
 @Nullable
 public static MetricTimer onBefore() {
   if (metricEnabled) {
     return pluginServices.startMetricTimer(metricName);
   } else {
     return null;
   }
 }
  @Pointcut(
      typeName = "java.sql.ResultSet",
      methodName = "get*",
      methodArgs = {"java.lang.String", ".."},
      metricName = "jdbc resultset value")
  public static class ValueAdvice2 {
    private static final MetricName metricName = pluginServices.getMetricName(ValueAdvice2.class);
    // plugin configuration property captureResultSetGet is cached to limit map lookups
    private static volatile boolean metricEnabled;

    static {
      pluginServices.registerConfigListener(
          new ConfigListener() {
            @Override
            public void onChange() {
              metricEnabled =
                  pluginServices.isEnabled()
                      && pluginServices.getBooleanProperty("captureResultSetGet");
            }
          });
      metricEnabled =
          pluginServices.isEnabled() && pluginServices.getBooleanProperty("captureResultSetGet");
    }

    @IsEnabled
    public static boolean isEnabled() {
      // don't capture if implementation detail of a DatabaseMetaData method
      return metricEnabled && !DatabaseMetaDataAspect.isCurrentlyExecuting();
    }

    @OnBefore
    public static MetricTimer onBefore() {
      return pluginServices.startMetricTimer(metricName);
    }

    @OnAfter
    public static void onAfter(@BindTraveler MetricTimer metricTimer) {
      metricTimer.stop();
    }
  }
  @Pointcut(
      typeName = "java.sql.ResultSet",
      methodName = "next|previous|relative|absolute|first|last",
      methodArgs = "..",
      captureNested = false,
      metricName = "jdbc resultset navigate")
  public static class NavigateAdvice {
    private static final MetricName metricName = pluginServices.getMetricName(NavigateAdvice.class);
    private static volatile boolean pluginEnabled;
    // plugin configuration property captureResultSetNext is cached to limit map lookups
    private static volatile boolean metricEnabled;

    static {
      pluginServices.registerConfigListener(
          new ConfigListener() {
            @Override
            public void onChange() {
              pluginEnabled = pluginServices.isEnabled();
              metricEnabled =
                  pluginEnabled && pluginServices.getBooleanProperty("captureResultSetNext");
            }
          });
      pluginEnabled = pluginServices.isEnabled();
      metricEnabled = pluginEnabled && pluginServices.getBooleanProperty("captureResultSetNext");
    }

    @IsEnabled
    public static boolean isEnabled() {
      // don't capture if implementation detail of a DatabaseMetaData method
      return pluginEnabled && !DatabaseMetaDataAspect.isCurrentlyExecuting();
    }

    @OnBefore
    @Nullable
    public static MetricTimer onBefore() {
      if (metricEnabled) {
        return pluginServices.startMetricTimer(metricName);
      } else {
        return null;
      }
    }

    @OnReturn
    public static void onReturn(
        @BindReturn boolean currentRowValid, @BindTarget ResultSet resultSet) {
      try {
        Statement statement = resultSet.getStatement();
        if (statement == null) {
          // this is not a statement execution, it is some other execution of
          // ResultSet.next(), e.g. Connection.getMetaData().getTables().next()
          return;
        }
        StatementMirror mirror = getStatementMirror(statement);
        JdbcMessageSupplier lastJdbcMessageSupplier = mirror.getLastJdbcMessageSupplier();
        if (lastJdbcMessageSupplier == null) {
          // tracing must be disabled (e.g. exceeded span limit per trace)
          return;
        }
        if (currentRowValid) {
          lastJdbcMessageSupplier.updateNumRows(resultSet.getRow());
        } else {
          lastJdbcMessageSupplier.setHasPerformedNavigation();
        }
      } catch (SQLException e) {
        logger.warn(e.getMessage(), e);
      }
    }

    @OnAfter
    public static void onAfter(@BindTraveler @Nullable MetricTimer metricTimer) {
      if (metricTimer != null) {
        metricTimer.stop();
      }
    }
  }
 @OnBefore
 public static MetricTimer onBefore() {
   return pluginServices.startMetricTimer(metricName);
 }