docs: private Map<ServerGroup, EVCacheServerGroupConfig> bootstrapFromEureka(String appName) throws IOException {
          
          if(env == null || region == null) return Collections.<ServerGroup, EVCacheServerGroupConfig> emptyMap();
          
          final String url = "http://discoveryreadonly." + region + ".dyn" + env + ".netflix.net:7001/v2/apps/" + appName;
          final CloseableHttpClient httpclient = HttpClients.createDefault();
          final long start = System.currentTimeMillis();
          CloseableHttpResponse httpResponse = null;
          try {
              final RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(timeout).setConnectTimeout(timeout).build();
              HttpGet httpGet = new HttpGet(url);
              httpGet.addHeader("Accept", "application/json");
              httpGet.setConfig(requestConfig);
              httpResponse = httpclient.execute(httpGet);
              final int statusCode = httpResponse.getStatusLine().getStatusCode();
              if (!(statusCode >= 200 && statusCode < 300)) {
                  log.error("Status Code : " + statusCode + " for url " + url);
                  return Collections.<ServerGroup, EVCacheServerGroupConfig> emptyMap();
              }
              
              final InputStreamReader in = new InputStreamReader(httpResponse.getEntity().getContent(), Charset.defaultCharset());
              final JSONTokener js = new JSONTokener(in);
              final JSONObject jsonObj = new JSONObject(js);
              final JSONObject application = jsonObj.getJSONObject("application");
              final JSONArray instances = application.getJSONArray("instance");
              final Map<ServerGroup, EVCacheServerGroupConfig> serverGroupMap = new HashMap<ServerGroup, EVCacheServerGroupConfig>();
              final ChainedDynamicProperty.BooleanProperty useBatchPort = EVCacheConfig.getInstance().getChainedBooleanProperty(appName + ".use.batch.port", "evcache.use.batch.port", Boolean.FALSE, null);
              for(int i = 0; i < instances.length(); i++) {
                  final JSONObject instanceObj = instances.getJSONObject(i);
                  final JSONObject metadataObj = instanceObj.getJSONObject("dataCenterInfo").getJSONObject("metadata");
  
                  final String asgName = instanceObj.getString("asgName");
                  final DynamicBooleanProperty asgEnabled = EVCacheConfig.getInstance().getDynamicBooleanProperty(asgName + ".enabled", true);
                  if (!asgEnabled.get()) {
                      if(log.isDebugEnabled()) log.debug("ASG " + asgName + " is disabled so ignoring it");
                      continue;
                  }
                  
                  final String zone = metadataObj.getString("availability-zone");
                  final ServerGroup rSet = new ServerGroup(zone, asgName);
                  final String localIp = metadataObj.getString("local-ipv4");
                  final JSONObject instanceMetadataObj = instanceObj.getJSONObject("metadata");
                  final String evcachePortString = instanceMetadataObj.optString("evcache.port", "11211");
                  final String rendPortString = instanceMetadataObj.optString("rend.port", "0");
                  final String rendBatchPortString = instanceMetadataObj.optString("rend.batch.port", "0");
                  final int rendPort = Integer.parseInt(rendPortString);
                  final int rendBatchPort = Integer.parseInt(rendBatchPortString);
                  final String rendMemcachedPortString = instanceMetadataObj.optString("rend.memcached.port", "0");
                  final String rendMementoPortString = instanceMetadataObj.optString("rend.memento.port", "0");
                  final int evcachePort = Integer.parseInt(evcachePortString);
                  final int port = rendPort == 0 ? evcachePort : ((useBatchPort.get().booleanValue()) ? rendBatchPort : rendPort);
  
                  EVCacheServerGroupConfig config = serverGroupMap.get(rSet);
                  if(config == null) {
                      config = new EVCacheServerGroupConfig(rSet, new HashSet<InetSocketAddress>(), Integer.parseInt(rendPortString), 
                              Integer.parseInt(rendMemcachedPortString), Integer.parseInt(rendMementoPortString));
                      serverGroupMap.put(rSet, config);
  //                    final ArrayList<Tag> tags = new ArrayList<Tag>(2);
  //                    tags.add(new BasicTag(EVCacheMetricsFactory.CACHE, appName));
  //                    tags.add(new BasicTag(EVCacheMetricsFactory.SERVERGROUP, rSet.getName()));
  //                    EVCacheMetricsFactory.getInstance().getLongGauge(EVCacheMetricsFactory.CONFIG, tags).set(Long.valueOf(port));
                  }
  
                  final InetAddress add = InetAddresses.forString(localIp);
                  final InetAddress inetAddress = InetAddress.getByAddress(localIp, add.getAddress());
                  final InetSocketAddress address = new InetSocketAddress(inetAddress, port);
                  config.getInetSocketAddress().add(address);
              }
              if (log.isDebugEnabled()) log.debug("Returning : " + serverGroupMap);
              return serverGroupMap;
          } catch (Exception e) {
              if (log.isDebugEnabled()) log.debug("URL : " + url + "; Timeout " + timeout, e);
          } finally {
              if (httpResponse != null) {
                  try {
                      httpResponse.close();
                  } catch (IOException e) {
  
                  }
              }
              if (log.isDebugEnabled()) log.debug("Total Time to execute " + url + " " + (System.currentTimeMillis() - start) + " msec.");
          }
          return Collections.<ServerGroup, EVCacheServerGroupConfig> emptyMap();
      }