@Override
 public GetMetricsTagsResponse doRequest() throws Exception {
   if (reqdata == null) {
     String uri = httpRequest.getUri();
     reqdata = CommonUtil.getParam(uri, "reqdata", "UTF-8");
     jsonpCallback = CommonUtil.getParam(uri, "callback", "UTF-8");
     isJsonp = true;
   }
   if (reqdata == null) {
     int resultCode = InterfaceConst.ResultCode.INVALID_COMMAND;
     String resultInfo = "Can parse reqdata from request.";
     return generateFailedResponse(resultCode, resultInfo);
   }
   request = GetMetricsTagsRequest.parse(new JSONTokener(reqdata));
   if (!InterfaceConst.commandIsSupported(InterfaceConst.Commands.GET_DATA_POINTS)) {
     int resultCode = InterfaceConst.ResultCode.INVALID_COMMAND;
     String resultInfo = "The command is not supported.";
     return generateFailedResponse(resultCode, resultInfo);
   } else if (!InterfaceConst.commandVersionIsSupported(
       InterfaceConst.Commands.GET_DATA_POINTS, request.getVersion())) {
     int resultCode = InterfaceConst.ResultCode.INVALID_COMMAND_VERSION;
     String resultInfo = "The command version " + request.getVersion() + " is not supported.";
     return generateFailedResponse(resultCode, resultInfo);
   }
   if (isLongTimeRequest()) {
     this.isLongTimeRequest = true;
     return null;
   } else {
     return doRun();
   }
 }
 @Override
 public GetMetricsTagsResponse doRun() throws Exception {
   GetMetricsTagsResponse rt = new GetMetricsTagsResponse();
   MetricsTags.getInstance()
       .findMetricsTags(request.getMetricsQuery(), rt.getTimeSeriesTagsList());
   String remoteIp = CommonUtil.getRemoteIP(httpRequest);
   if (remoteIp == null || remoteIp.isEmpty()) {
     remoteIp = CommonUtil.getRemoteIP(channel);
   }
   rt.setResultCode(InterfaceConst.ResultCode.SUCCESS);
   rt.setResultInfo("success");
   return rt;
 }