You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by jp...@apache.org on 2014/03/14 19:53:14 UTC

[1/2] TS-2637: add traffic_line records match option

Repository: trafficserver
Updated Branches:
  refs/heads/master 575469618 -> 0389be399


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/0389be39/mgmt/api/NetworkUtilsRemote.cc
----------------------------------------------------------------------
diff --git a/mgmt/api/NetworkUtilsRemote.cc b/mgmt/api/NetworkUtilsRemote.cc
index 3bf941a..da4c9ab 100644
--- a/mgmt/api/NetworkUtilsRemote.cc
+++ b/mgmt/api/NetworkUtilsRemote.cc
@@ -61,7 +61,6 @@ extern TSInitOptionT ts_init_options;
 /**********************************************************************
  * Socket Helper Functions
  **********************************************************************/
-
 void
 set_socket_paths(const char *path)
 {
@@ -773,32 +772,25 @@ send_file_write_request(int fd, TSFileNameT file, int ver, int size, char *text)
   return err;
 }
 
-/**********************************************************************
- * send_record_get_request
- *
- * purpose: sends request to get record value from Traffic Manager
- * input: fd       - file descriptor to use
- *        rec_name - name of record to retrieve value for
- * output: TS_ERR_xx
- * format: RECORD_GET <msg_len> <rec_name>
- **********************************************************************/
-TSError
-send_record_get_request(int fd, char *rec_name)
+static TSError
+send_record_get_x_request(OpType optype, int fd, const char *rec_name)
 {
   char *msg_buf;
   int msg_pos = 0, total_len;
-  int16_t op;
+  int16_t op = (int16_t)optype;
   int32_t msg_len;
   TSError err;
 
-  if (!rec_name)
+  ink_assert(op == RECORD_GET || op == RECORD_MATCH_GET);
+
+  if (!rec_name) {
     return TS_ERR_PARAMS;
+  }
 
   total_len = SIZE_OP_T + SIZE_LEN + strlen(rec_name);
   msg_buf = (char *)ats_malloc(sizeof(char) * total_len);
 
   // fill in op type
-  op = (int16_t) RECORD_GET;
   memcpy(msg_buf + msg_pos, (void *) &op, SIZE_OP_T);
   msg_pos += SIZE_OP_T;
 
@@ -816,6 +808,35 @@ send_record_get_request(int fd, char *rec_name)
   return err;
 }
 
+/**********************************************************************
+ * send_record_get_request
+ *
+ * purpose: sends request to get record value from Traffic Manager
+ * input: fd       - file descriptor to use
+ *        rec_name - name of record to retrieve value for
+ * output: TS_ERR_xx
+ * format: RECORD_GET <msg_len> <rec_name>
+ **********************************************************************/
+TSError
+send_record_get_request(int fd, const char *rec_name)
+{
+  return send_record_get_x_request(RECORD_GET, fd, rec_name);
+}
+
+/**********************************************************************
+ * send_record_match_request
+ *
+ * purpose: sends request to get a list of matching record values from Traffic Manager
+ * input: fd       - file descriptor to use
+ *        rec_name - regex to match against record names
+ * output: TS_ERR_xx
+ * format: sequence of RECORD_GET <msg_len> <rec_name>
+ **********************************************************************/
+TSError
+send_record_match_request(int fd, const char *rec_regex)
+{
+  return send_record_get_x_request(RECORD_MATCH_GET, fd, rec_regex);
+}
 
 /*------ control functions -------------------------------------------*/
 /**********************************************************************
@@ -1231,19 +1252,25 @@ parse_file_read_reply(int fd, int *ver, int *size, char **text)
  *        rec_value - the value of the record in string format
  * output: errors on error or fill up class with response &
  *         return SUCC
- * notes: reply format = <TSError> <val_size> <rec_type> <record_value>
+ * notes: reply format = <TSError> <val_size> <name_size> <rec_type> <record_value> <record_name>
+ * Zero-length values and names are supported. If the size field is 0, the corresponding
+ * value field is not transmitted.
  * It's the responsibility of the calling function to conver the rec_value
  * based on the rec_type!!
  **********************************************************************/
 TSError
-parse_record_get_reply(int fd, TSRecordT * rec_type, void **rec_val)
+parse_record_get_reply(int fd, TSRecordT * rec_type, void **rec_val, char **rec_name)
 {
   int16_t ret_val, rec_t;
-  int32_t rec_size;
+  int32_t val_size, name_size;
   TSError err_t;
 
-  if (!rec_type || !rec_val)
+  if (!rec_type || !rec_val) {
     return TS_ERR_PARAMS;
+  }
+
+  *rec_name = NULL;
+  *rec_val = NULL;
 
   // check to see if anything to read; wait for specified time
   if (socket_read_timeout(fd, MAX_TIME_WAIT, 0) <= 0) { //time expired before ready to read
@@ -1253,49 +1280,72 @@ parse_record_get_reply(int fd, TSRecordT * rec_type, void **rec_val)
   // get the return value (TSError type)
   err_t = socket_read_conn(fd, (uint8_t *)&ret_val, SIZE_ERR_T);
   if (err_t != TS_ERR_OKAY) {
-    return err_t;
+    goto fail;
   }
 
   // if !TS_ERR_OKAY, stop reading rest of msg
   err_t = (TSError) ret_val;
   if (err_t != TS_ERR_OKAY) {
-    return err_t;
+    goto fail;
   }
 
   // now get size of record_value
-  err_t = socket_read_conn(fd, (uint8_t *)&rec_size, SIZE_LEN);
+  err_t = socket_read_conn(fd, (uint8_t *)&val_size, SIZE_LEN);
   if (err_t != TS_ERR_OKAY) {
-    return err_t;
+    goto fail;
+  }
+
+  // now get size of record name
+  err_t = socket_read_conn(fd, (uint8_t *)&name_size, SIZE_LEN);
+  if (err_t != TS_ERR_OKAY) {
+    goto fail;
   }
 
   // get the record type
   err_t = socket_read_conn(fd, (uint8_t *)&rec_t, SIZE_REC_T);
   if (err_t != TS_ERR_OKAY) {
-    return err_t;
+    goto fail;
   }
 
   *rec_type = (TSRecordT) rec_t;
 
-  // get record value
-  // allocate correct amount of memory for record value
-  if (*rec_type == TS_REC_STRING) {
-    *rec_val = ats_malloc(sizeof(char) * (rec_size + 1));
-  } else {
-    *rec_val = ats_malloc(sizeof(char) * (rec_size));
-  }
+  // get record value (if there is one)
+  if (val_size) {
+    if (*rec_type == TS_REC_STRING) {
+      *rec_val = ats_malloc(sizeof(char) * (val_size + 1));
+    } else {
+      *rec_val = ats_malloc(sizeof(char) * (val_size));
+    }
 
-  err_t = socket_read_conn(fd, (uint8_t *)(*rec_val), rec_size);
-  if (err_t != TS_ERR_OKAY) {
-    ats_free(*rec_val);
-    *rec_val = NULL;
-    return err_t;
+    err_t = socket_read_conn(fd, (uint8_t *)(*rec_val), val_size);
+    if (err_t != TS_ERR_OKAY) {
+      goto fail;
+    }
+
+    // add end of string to end of the record value
+    if (*rec_type == TS_REC_STRING) {
+      ((char *) (*rec_val))[val_size] = '\0';
+    }
   }
 
-  // add end of string to end of the record value
-  if (*rec_type == TS_REC_STRING) {
-    ((char *) (*rec_val))[rec_size] = '\0';
+  // get the record name (if there is one)
+  if (name_size) {
+    *rec_name = (char *)ats_malloc(sizeof(char) * (name_size + 1));
+    err_t = socket_read_conn(fd, (uint8_t *)(*rec_name), name_size);
+    if (err_t != TS_ERR_OKAY) {
+      goto fail;
+    }
+
+    (*rec_name)[name_size] = '\0';
   }
 
+  return TS_ERR_OKAY;
+
+fail:
+  ats_free(*rec_val);
+  ats_free(*rec_name);
+  *rec_val = NULL;
+  *rec_name = NULL;
   return err_t;
 }
 

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/0389be39/mgmt/api/NetworkUtilsRemote.h
----------------------------------------------------------------------
diff --git a/mgmt/api/NetworkUtilsRemote.h b/mgmt/api/NetworkUtilsRemote.h
index b30ac14..f251dc0 100644
--- a/mgmt/api/NetworkUtilsRemote.h
+++ b/mgmt/api/NetworkUtilsRemote.h
@@ -76,7 +76,8 @@ TSError send_request_bool(int fd, OpType op, bool flag);
 
 TSError send_file_read_request(int fd, TSFileNameT file);
 TSError send_file_write_request(int fd, TSFileNameT file, int ver, int size, char *text);
-TSError send_record_get_request(int fd, char *rec_name);
+TSError send_record_get_request(int fd, const char *rec_name);
+TSError send_record_match_request(int fd, const char *rec_regex);
 
 TSError send_proxy_state_set_request(int fd, TSProxyStateT state, TSCacheClearT clear);
 
@@ -93,7 +94,7 @@ TSError parse_reply_list(int fd, char **list);
 
 TSError parse_file_read_reply(int fd, int *version, int *size, char **text);
 
-TSError parse_record_get_reply(int fd, TSRecordT * rec_type, void **rec_val);
+TSError parse_record_get_reply(int fd, TSRecordT * rec_type, void **rec_val, char **rec_name);
 TSError parse_record_set_reply(int fd, TSActionNeedT * action_need);
 
 TSError parse_proxy_state_get_reply(int fd, TSProxyStateT * state);

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/0389be39/mgmt/api/TSControlMain.cc
----------------------------------------------------------------------
diff --git a/mgmt/api/TSControlMain.cc b/mgmt/api/TSControlMain.cc
index c507f5b..950e3b5 100644
--- a/mgmt/api/TSControlMain.cc
+++ b/mgmt/api/TSControlMain.cc
@@ -210,198 +210,83 @@ ts_ctrl_main(void *arg)
               con_entry = ink_hash_table_iterator_next(accepted_con, &con_state);
               continue;
             }
+
             // determine which handler function to call based on operation
             switch (op_t) {
             case RECORD_GET:
               ret = handle_record_get(client_entry->sock_info, req);
-              ats_free(req);     // free memory for req
-              if (ret == TS_ERR_NET_WRITE || ret == TS_ERR_NET_EOF) {
-                Debug("ts_main", "[ts_ctrl_main] ERROR:handle_record_get\n");
-                remove_client(client_entry, accepted_con);
-                con_entry = ink_hash_table_iterator_next(accepted_con, &con_state);
-                continue;
-              }
+              break;
+
+            case RECORD_MATCH_GET:
+              ret = handle_record_match(client_entry->sock_info, req);
+              // XXX
               break;
 
             case RECORD_SET:
               ret = handle_record_set(client_entry->sock_info, req);
-              ats_free(req);
-              if (ret == TS_ERR_NET_WRITE || ret == TS_ERR_NET_EOF) {
-                Debug("ts_main", "[ts_ctrl_main] ERROR:handle_record_set\n");
-                remove_client(client_entry, accepted_con);
-                con_entry = ink_hash_table_iterator_next(accepted_con, &con_state);
-                continue;
-              }
-
               break;
 
             case FILE_READ:
               ret = handle_file_read(client_entry->sock_info, req);
-              ats_free(req);
-              if (ret == TS_ERR_NET_WRITE || ret == TS_ERR_NET_EOF) {
-                Debug("ts_main", "[ts_ctrl_main] ERROR:handle_file_read\n");
-                remove_client(client_entry, accepted_con);
-                con_entry = ink_hash_table_iterator_next(accepted_con, &con_state);
-                continue;
-              }
-
               break;
 
             case FILE_WRITE:
               ret = handle_file_write(client_entry->sock_info, req);
-              ats_free(req);
-              if (ret == TS_ERR_NET_WRITE || ret == TS_ERR_NET_EOF) {
-                Debug("ts_main", "[ts_ctrl_main] ERROR:handle_file_write\n");
-                remove_client(client_entry, accepted_con);
-                con_entry = ink_hash_table_iterator_next(accepted_con, &con_state);
-                continue;
-              }
-
               break;
 
             case PROXY_STATE_GET:
               ret = handle_proxy_state_get(client_entry->sock_info);
-              ats_free(req);     // free the request allocated by preprocess_msg
-              if (ret == TS_ERR_NET_WRITE || ret == TS_ERR_NET_EOF) {
-                Debug("ts_main", "[ts_ctrl_main] ERROR:handle_proxy_state_get\n");
-                remove_client(client_entry, accepted_con);
-                con_entry = ink_hash_table_iterator_next(accepted_con, &con_state);
-                continue;
-              }
-
               break;
 
             case PROXY_STATE_SET:
               ret = handle_proxy_state_set(client_entry->sock_info, req);
-              ats_free(req);     // free the request allocated by preprocess_msg
-              if (ret == TS_ERR_NET_WRITE || ret == TS_ERR_NET_EOF) {
-                Debug("ts_main", "[ts_ctrl_main] ERROR:handle_proxy_state_set\n");
-                remove_client(client_entry, accepted_con);
-                con_entry = ink_hash_table_iterator_next(accepted_con, &con_state);
-                continue;
-              }
-
               break;
 
             case RECONFIGURE:
               ret = handle_reconfigure(client_entry->sock_info);
-              ats_free(req);     // free the request allocated by preprocess_msg
-              if (ret == TS_ERR_NET_WRITE || ret == TS_ERR_NET_EOF) {
-                Debug("ts_main", "[ts_ctrl_main] ERROR:handle_reconfigure\n");
-                remove_client(client_entry, accepted_con);
-                con_entry = ink_hash_table_iterator_next(accepted_con, &con_state);
-                continue;
-              }
-
               break;
 
             case RESTART:
               ret = handle_restart(client_entry->sock_info, req, false);
-              ats_free(req);     // free the request allocated by preprocess_msg
-              if (ret == TS_ERR_NET_WRITE || ret == TS_ERR_NET_EOF) {
-                Debug("ts_main", "[ts_ctrl_main] ERROR:handle_restart\n");
-                remove_client(client_entry, accepted_con);
-                con_entry = ink_hash_table_iterator_next(accepted_con, &con_state);
-                continue;
-              }
               break;
 
             case BOUNCE:
               ret = handle_restart(client_entry->sock_info, req, true);
-              ats_free(req);     // free the request allocated by preprocess_msg
-              if (ret == TS_ERR_NET_WRITE || ret == TS_ERR_NET_EOF) {
-                Debug("ts_main", "[ts_ctrl_main] ERROR:handle_restart bounce\n");
-                remove_client(client_entry, accepted_con);
-                con_entry = ink_hash_table_iterator_next(accepted_con, &con_state);
-                continue;
-              }
               break;
 
             case STORAGE_DEVICE_CMD_OFFLINE:
               ret = handle_storage_device_cmd_offline(client_entry->sock_info, req);
-              ats_free(req);     // free the request allocated by preprocess_msg
-              if (ret == TS_ERR_NET_WRITE || ret == TS_ERR_NET_EOF) {
-                Debug("ts_main", "[ts_ctrl_main] ERROR:handle_storage_device_cmd_offline\n");
-                remove_client(client_entry, accepted_con);
-                con_entry = ink_hash_table_iterator_next(accepted_con, &con_state);
-                continue;
-              }
               break;
 
             case EVENT_RESOLVE:
               ret = handle_event_resolve(client_entry->sock_info, req);
-              ats_free(req);     // free the request allocated by preprocess_msg
-              if (ret == TS_ERR_NET_WRITE || ret == TS_ERR_NET_EOF) {
-                Debug("ts_main", "[ts_ctrl_main] ERROR:handle_event_resolve\n");
-                remove_client(client_entry, accepted_con);
-                con_entry = ink_hash_table_iterator_next(accepted_con, &con_state);
-                continue;
-              }
               break;
 
             case EVENT_GET_MLT:
               ret = handle_event_get_mlt(client_entry->sock_info);
-              ats_free(req);     // free the request allocated by preprocess_msg
-              if (ret == TS_ERR_NET_WRITE || ret == TS_ERR_NET_EOF) {
-                Debug("ts_main", "[ts_ctrl_main] ERROR:event_get_mlt\n");
-                remove_client(client_entry, accepted_con);
-                con_entry = ink_hash_table_iterator_next(accepted_con, &con_state);
-                continue;
-              }
               break;
 
             case EVENT_ACTIVE:
               ret = handle_event_active(client_entry->sock_info, req);
-              ats_free(req);     // free the request allocated by preprocess_msg
-              if (ret == TS_ERR_NET_WRITE || ret == TS_ERR_NET_EOF) {
-                Debug("ts_main", "[ts_ctrl_main] ERROR:event_active\n");
-                remove_client(client_entry, accepted_con);
-                con_entry = ink_hash_table_iterator_next(accepted_con, &con_state);
-                continue;
-              }
               break;
 
             case SNAPSHOT_TAKE:
             case SNAPSHOT_RESTORE:
             case SNAPSHOT_REMOVE:
               ret = handle_snapshot(client_entry->sock_info, req, op_t);
-              ats_free(req);
-              if (ret == TS_ERR_NET_WRITE || ret == TS_ERR_NET_EOF) {
-                Debug("ts_main", "[ts_ctrl_main] ERROR:handle_snapshot\n");
-                remove_client(client_entry, accepted_con);
-                con_entry = ink_hash_table_iterator_next(accepted_con, &con_state);
-                continue;
-              }
               break;
 
             case SNAPSHOT_GET_MLT:
               ret = handle_snapshot_get_mlt(client_entry->sock_info);
-              ats_free(req);
-              if (ret == TS_ERR_NET_WRITE || ret == TS_ERR_NET_EOF) {
-                Debug("ts_main", "[ts_ctrl_main] ERROR:snapshot_get_mlt\n");
-                remove_client(client_entry, accepted_con);
-                con_entry = ink_hash_table_iterator_next(accepted_con, &con_state);
-                continue;
-              }
               break;
 
             case DIAGS:
-              if (req) {
-                handle_diags(client_entry->sock_info, req);
-                ats_free(req);
-              }
+              ret = handle_diags(client_entry->sock_info, req);
               break;
 
             case STATS_RESET_CLUSTER:
             case STATS_RESET_NODE:
               ret = handle_stats_reset(client_entry->sock_info, req, op_t);
-              ats_free(req);
-              if (ret == TS_ERR_NET_WRITE || ret == TS_ERR_NET_EOF) {
-                Debug("ts_main", "[ts_ctrl_main] ERROR: stats_reset\n");
-                remove_client(client_entry, accepted_con);
-                con_entry = ink_hash_table_iterator_next(accepted_con, &con_state);
-                continue;
-              }
               break;
 
             case UNDEFINED_OP:
@@ -409,6 +294,16 @@ ts_ctrl_main(void *arg)
               break;
 
             }                   // end switch (op_t)
+
+            ats_free(req);
+
+            if (ret == TS_ERR_NET_WRITE || ret == TS_ERR_NET_EOF) {
+              Debug("ts_main", "[ts_ctrl_main] ERROR: sending response for message op %d\n", (int)op_t);
+              remove_client(client_entry, accepted_con);
+              con_entry = ink_hash_table_iterator_next(accepted_con, &con_state);
+              continue;
+            }
+
           }                     // end if(client_entry->sock_info.fd && FD_ISSET(client_entry->sock_info.fd, &selectFDs))
 
           con_entry = ink_hash_table_iterator_next(accepted_con, &con_state);
@@ -487,16 +382,16 @@ handle_record_get(struct SocketInfo sock_info, char *req)
   // create and send reply back to client
   switch (ele->rec_type) {
   case TS_REC_INT:
-    ret = send_record_get_reply(sock_info, ret, &(ele->int_val), sizeof(TSInt), ele->rec_type);
+    ret = send_record_get_reply(sock_info, ret, &(ele->int_val), sizeof(TSInt), ele->rec_type, ele->rec_name);
     break;
   case TS_REC_COUNTER:
-    ret = send_record_get_reply(sock_info, ret, &(ele->counter_val), sizeof(TSCounter), ele->rec_type);
+    ret = send_record_get_reply(sock_info, ret, &(ele->counter_val), sizeof(TSCounter), ele->rec_type, ele->rec_name);
     break;
   case TS_REC_FLOAT:
-    ret = send_record_get_reply(sock_info, ret, &(ele->float_val), sizeof(TSFloat), ele->rec_type);
+    ret = send_record_get_reply(sock_info, ret, &(ele->float_val), sizeof(TSFloat), ele->rec_type, ele->rec_name);
     break;
   case TS_REC_STRING:
-    ret = send_record_get_reply(sock_info, ret, ele->string_val, strlen(ele->string_val), ele->rec_type);
+    ret = send_record_get_reply(sock_info, ret, ele->string_val, strlen(ele->string_val), ele->rec_type, ele->rec_name);
     break;
   default:                     // invalid record type
     ret = send_reply(sock_info, TS_ERR_FAIL);
@@ -513,6 +408,70 @@ handle_record_get(struct SocketInfo sock_info, char *req)
   return ret;
 }
 
+struct record_match_state {
+  TSError     err;
+  SocketInfo  sock;
+  DFA         regex;
+};
+
+static void
+send_record_match(RecT /* rec_type */, void *edata, int /* registered */, const char *name, int data_type, RecData *rec_val)
+{
+  record_match_state *match = (record_match_state *)edata ;
+
+  if (match->err != TS_ERR_OKAY) {
+    return;
+  }
+
+  if (match->regex.match(name) >= 0) {
+    switch (data_type) {
+    case RECD_INT:
+      match->err = send_record_get_reply(match->sock, TS_ERR_OKAY, &(rec_val->rec_int), sizeof(TSInt), TS_REC_INT, name);
+      break;
+    case RECD_COUNTER:
+      match->err = send_record_get_reply(match->sock, TS_ERR_OKAY, &(rec_val->rec_counter), sizeof(TSCounter), TS_REC_COUNTER, name);
+      break;
+    case RECD_STRING:
+      match->err = send_record_get_reply(match->sock, TS_ERR_OKAY, rec_val->rec_string, rec_val->rec_string ? strlen(rec_val->rec_string): 0, TS_REC_STRING, name);
+      break;
+    case RECD_FLOAT:
+      match->err = send_record_get_reply(match->sock, TS_ERR_OKAY, &(rec_val->rec_float), sizeof(TSFloat), TS_REC_FLOAT, name);
+      break;
+    default:
+      break; // skip it
+    }
+  }
+}
+
+TSError
+handle_record_match(struct SocketInfo sock_info, char *req)
+{
+  TSError ret;
+  record_match_state match;
+
+  // parse msg - don't really need since the request itself is the regex itself
+  if (!req) {
+    ret = send_reply(sock_info, TS_ERR_FAIL);
+    return ret;
+  }
+
+  if (match.regex.compile(req, RE_CASE_INSENSITIVE) != 0) {
+    ret = send_reply(sock_info, TS_ERR_FAIL);
+    return ret;
+  }
+
+  match.err = TS_ERR_OKAY;
+  match.sock = sock_info;
+
+  RecDumpRecords(RECT_NULL, send_record_match, &match);
+
+  // If successful, send a list terminator.
+  if (match.err == TS_ERR_OKAY) {
+    return send_record_get_reply(sock_info, TS_ERR_OKAY, NULL, 0, TS_REC_UNDEFINED, NULL);
+  }
+
+  return match.err;
+}
 
 /**************************************************************************
  * handle_record_set
@@ -957,7 +916,7 @@ handle_snapshot_get_mlt(struct SocketInfo sock_info)
  *        req - the diag message (already formatted with arguments)
  * output: TS_ERR_xx
  *************************************************************************/
-void
+TSError
 handle_diags(struct SocketInfo /* sock_info ATS_UNUSED */, char *req)
 {
   TSError ret;
@@ -1008,12 +967,12 @@ handle_diags(struct SocketInfo /* sock_info ATS_UNUSED */, char *req)
   if (diags_init) {
     diags->print("TSMgmtAPI", DTA(level), "%s", diag_msg);
     ats_free(diag_msg);
-    return;
+    return TS_ERR_OKAY;
   }
 
 Lerror:
   ats_free(diag_msg);
-  return;
+  return TS_ERR_FAIL;
 }
 
 /**************************************************************************

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/0389be39/mgmt/api/TSControlMain.h
----------------------------------------------------------------------
diff --git a/mgmt/api/TSControlMain.h b/mgmt/api/TSControlMain.h
index 397b8bb..b53603e 100644
--- a/mgmt/api/TSControlMain.h
+++ b/mgmt/api/TSControlMain.h
@@ -49,6 +49,7 @@ void delete_client(ClientT * client);
 void *ts_ctrl_main(void *arg);
 
 TSError handle_record_get(struct SocketInfo sock_info, char *req);
+TSError handle_record_match(struct SocketInfo sock_info, char *req);
 TSError handle_record_set(struct SocketInfo sock_info, char *req);
 
 TSError handle_file_read(struct SocketInfo sock_info, char *req);
@@ -67,7 +68,7 @@ TSError handle_event_active(struct SocketInfo sock_info, char *req);
 TSError handle_snapshot(struct SocketInfo sock_info, char *req, OpType op);
 TSError handle_snapshot_get_mlt(struct SocketInfo sock_info);
 
-void handle_diags(struct SocketInfo sock_info, char *req);
+TSError handle_diags(struct SocketInfo sock_info, char *req);
 
 TSError handle_stats_reset(struct SocketInfo sock_info, char *req, OpType op);
 

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/0389be39/mgmt/api/include/mgmtapi.h
----------------------------------------------------------------------
diff --git a/mgmt/api/include/mgmtapi.h b/mgmt/api/include/mgmtapi.h
index 7b88d92..786db7f 100644
--- a/mgmt/api/include/mgmtapi.h
+++ b/mgmt/api/include/mgmtapi.h
@@ -1174,6 +1174,12 @@ extern "C"
  */
   tsapi TSError TSRecordGetMlt(TSStringList rec_names, TSList rec_vals);
 
+/* TSRecordGetMatchMlt: gets a set of records
+ * Input:  rec_regex - regular expression to match against record names
+ * Output: TSError, TSList of TSRecordEle
+ */
+  tsapi TSError TSRecordGetMatchMlt(const char *rec_regex, TSList list);
+
 /* TSRecordSet*: sets a record w/ a known type
  * Input:  rec_name     - the name of the record (proxy.config.record_name)
  *         *_val        - the value to set the record to


[2/2] git commit: TS-2637: add traffic_line records match option

Posted by jp...@apache.org.
TS-2637: add traffic_line records match option

Add the -m option to traffic_line. This matches the given regular
expression against all the records, allowing users to discover new
statistics and configuration options.


Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/0389be39
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/0389be39
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/0389be39

Branch: refs/heads/master
Commit: 0389be399cf888679b75a569345f4ff8e03569e3
Parents: 5754696
Author: James Peach <jp...@apache.org>
Authored: Wed Mar 12 15:32:04 2014 -0700
Committer: James Peach <jp...@apache.org>
Committed: Fri Mar 14 11:50:07 2014 -0700

----------------------------------------------------------------------
 CHANGES                                    |    2 +
 cmd/traffic_line/traffic_line.cc           |   43 +
 doc/reference/commands/traffic_line.en.rst | 1482 ++++++++++++-----------
 mgmt/api/CoreAPI.cc                        |    9 +
 mgmt/api/CoreAPI.h                         |    1 +
 mgmt/api/CoreAPIRemote.cc                  |  111 +-
 mgmt/api/INKMgmtAPI.cc                     |    9 +
 mgmt/api/NetworkUtilsDefs.h                |    1 +
 mgmt/api/NetworkUtilsLocal.cc              |   30 +-
 mgmt/api/NetworkUtilsLocal.h               |    2 +-
 mgmt/api/NetworkUtilsRemote.cc             |  128 +-
 mgmt/api/NetworkUtilsRemote.h              |    5 +-
 mgmt/api/TSControlMain.cc                  |  217 ++--
 mgmt/api/TSControlMain.h                   |    3 +-
 mgmt/api/include/mgmtapi.h                 |    6 +
 15 files changed, 1138 insertions(+), 911 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/0389be39/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 7ee10c5..1afbde4 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,8 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache Traffic Server 5.0.0
 
+  *) [TS-2637] Add traffic_line records match option.
+
   *) [TS-2630] Add lib/ts/apidefs.h to place common types.
 
   *) [TS-2610] Add "client_protocol_stack"(%<cps>) field into LogFormat.

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/0389be39/cmd/traffic_line/traffic_line.cc
----------------------------------------------------------------------
diff --git a/cmd/traffic_line/traffic_line.cc b/cmd/traffic_line/traffic_line.cc
index 7169ce9..65df8db 100644
--- a/cmd/traffic_line/traffic_line.cc
+++ b/cmd/traffic_line/traffic_line.cc
@@ -32,6 +32,7 @@
 static const char *programName;
 
 static char ReadVar[1024];
+static char MatchVar[1024];
 static char SetVar[1024];
 static char VarValue[1024];
 static int ReRead;
@@ -205,6 +206,46 @@ handleArgInvocation()
       TSRecordEleDestroy(rec_ele);
       return err;
     }
+  } else if (*MatchVar != '\0') {        // Handle a value read
+    if (*SetVar != '\0' || *VarValue != '\0') {
+      fprintf(stderr, "%s: Invalid Argument Combination: Can not read and set values at the same time\n", programName);
+      return TS_ERR_FAIL;
+    } else {
+      TSError err;
+      TSList list = TSListCreate();
+
+      if ((err = TSRecordGetMatchMlt(MatchVar, list)) != TS_ERR_OKAY) {
+        fprintf(stderr, "%s: %s\n", programName, TSGetErrorMessage(err));
+      }
+
+      // If the RPC call failed, the list will be empty, so we won't print anything. Otherwise,
+      // print all the results, freeing them as we go.
+      for (TSRecordEle * rec_ele = (TSRecordEle *) TSListDequeue(list); rec_ele;
+          rec_ele = (TSRecordEle *) TSListDequeue(list)) {
+        switch (rec_ele->rec_type) {
+        case TS_REC_INT:
+          printf("%s %" PRId64 "\n", rec_ele->rec_name, rec_ele->int_val);
+          break;
+        case TS_REC_COUNTER:
+          printf("%s %" PRId64 "\n", rec_ele->rec_name, rec_ele->counter_val);
+          break;
+        case TS_REC_FLOAT:
+          printf("%s %f\n", rec_ele->rec_name, rec_ele->float_val);
+          break;
+        case TS_REC_STRING:
+          printf("%s %s\n", rec_ele->rec_name, rec_ele->string_val);
+          break;
+        default:
+          // just skip it ...
+          break;
+        }
+
+        TSRecordEleDestroy(rec_ele);
+      }
+
+      TSListDestroy(list);
+      return err;
+    }
   } else if (*SetVar != '\0') { // Setting a variable
     if (*VarValue == '\0') {
       fprintf(stderr, "%s: Set requires a -v argument\n", programName);
@@ -254,6 +295,7 @@ main(int /* argc ATS_UNUSED */, char **argv)
   programName = argv[0];
 
   ReadVar[0] = '\0';
+  MatchVar[0] = '\0';
   SetVar[0] = '\0';
   VarValue[0] = '\0';
   ReRead = 0;
@@ -282,6 +324,7 @@ main(int /* argc ATS_UNUSED */, char **argv)
   ArgumentDescription argument_descriptions[] = {
     {"query_deadhosts", 'q', "Query congested sites", "F", &QueryDeadhosts, NULL, NULL},
     {"read_var", 'r', "Read Variable", "S1024", &ReadVar, NULL, NULL},
+    {"match_var", 'm', "Match Variable", "S1024", &MatchVar, NULL, NULL},
     {"set_var", 's', "Set Variable (requires -v option)", "S1024", &SetVar, NULL, NULL},
     {"value", 'v', "Set Value (used with -s option)", "S1024", &VarValue, NULL, NULL},
     {"help", 'h', "Help", NULL, NULL, NULL, usage},

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/0389be39/doc/reference/commands/traffic_line.en.rst
----------------------------------------------------------------------
diff --git a/doc/reference/commands/traffic_line.en.rst b/doc/reference/commands/traffic_line.en.rst
index 70cfdd5..b99be29 100644
--- a/doc/reference/commands/traffic_line.en.rst
+++ b/doc/reference/commands/traffic_line.en.rst
@@ -71,6 +71,11 @@ Options
     Restart the :program:`traffic_manager` process and the
     :program:`traffic_server` process on all the nodes in a cluster.
 
+.. option:: -m REGEX, --match_var REGEX
+
+    Display the current values of all performance statistics or configuration
+    variables whose names match the given regular expression.
+
 .. option:: -r VAR, --read_var VAR
 
     Display specific performance statistics or a current configuration
@@ -144,677 +149,766 @@ Performance Statistics
 
 The :option:`traffic_line -r` option accepts the following variable names::
 
-    proxy.node.num_processes
-    proxy.node.hostname_FQ
-    proxy.node.hostname
-    proxy.node.restarts.manager.start_time
-    proxy.node.restarts.proxy.start_time
-    proxy.node.restarts.proxy.stop_time
-    proxy.node.restarts.proxy.restart_count
-    proxy.node.version.manager.short
-    proxy.node.version.manager.long
-    proxy.node.version.manager.build_number
-    proxy.node.version.manager.build_time
-    proxy.node.version.manager.build_date
-    proxy.node.version.manager.build_machine
-    proxy.node.version.manager.build_person
-    proxy.node.bandwidth_hit_ratio
-    proxy.node.bandwidth_hit_ratio_int_pct
-    proxy.node.hostdb.hit_ratio
-    proxy.node.hostdb.hit_ratio_int_pct
-    proxy.node.proxy_running
-    proxy.node.cache.percent_free
-    proxy.node.cache_hit_ratio
-    proxy.node.cache_hit_ratio_int_pct
-    proxy.node.cache_hit_ratio_avg_10s_int_pct
-    proxy.node.bandwidth_hit_ratio_avg_10s_int_pct
-    proxy.node.bandwidth_hit_ratio_avg_10s
-    proxy.node.http.cache_hit_fresh_avg_10s
-    proxy.node.http.cache_hit_revalidated_avg_10s
-    proxy.node.http.cache_hit_ims_avg_10s
-    proxy.node.http.cache_hit_stale_served_avg_10s
-    proxy.node.http.cache_miss_cold_avg_10s
-    proxy.node.http.cache_miss_changed_avg_10s
-    proxy.node.http.cache_miss_not_cacheable_avg_10s
-    proxy.node.http.cache_miss_client_no_cache_avg_10s
-    proxy.node.http.cache_miss_ims_avg_10s
-    proxy.node.http.cache_read_error_avg_10s
-    proxy.node.cache_total_hits_avg_10s
-    proxy.node.cache_total_misses_avg_10s
-    proxy.node.cache_hit_ratio_avg_10s
-    proxy.node.hostdb.total_lookups_avg_10s
-    proxy.node.hostdb.total_hits_avg_10s
-    proxy.node.hostdb.hit_ratio_avg_10s
-    proxy.node.http.transaction_counts_avg_10s.hit_fresh
-    proxy.node.http.transaction_counts_avg_10s.hit_revalidated
-    proxy.node.http.transaction_counts_avg_10s.miss_cold
-    proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable
-    proxy.node.http.transaction_counts_avg_10s.miss_changed
-    proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache
-    proxy.node.http.transaction_counts_avg_10s.errors.connect_failed
-    proxy.node.http.transaction_counts_avg_10s.errors.aborts
-    proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts
-    proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups
-    proxy.node.http.transaction_counts_avg_10s.errors.early_hangups
-    proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups
-    proxy.node.http.transaction_counts_avg_10s.errors.other
-    proxy.node.http.transaction_counts_avg_10s.other.unclassified
-    proxy.node.http.transaction_frac_avg_10s.hit_fresh
-    proxy.node.http.transaction_frac_avg_10s.hit_revalidated
-    proxy.node.http.transaction_frac_avg_10s.miss_cold
-    proxy.node.http.transaction_frac_avg_10s.miss_not_cacheable
-    proxy.node.http.transaction_frac_avg_10s.miss_changed
-    proxy.node.http.transaction_frac_avg_10s.miss_client_no_cache
-    proxy.node.http.transaction_frac_avg_10s.errors.connect_failed
-    proxy.node.http.transaction_frac_avg_10s.errors.aborts
-    proxy.node.http.transaction_frac_avg_10s.errors.possible_aborts
-    proxy.node.http.transaction_frac_avg_10s.errors.pre_accept_hangups
-    proxy.node.http.transaction_frac_avg_10s.errors.early_hangups
-    proxy.node.http.transaction_frac_avg_10s.errors.empty_hangups
-    proxy.node.http.transaction_frac_avg_10s.errors.other
-    proxy.node.http.transaction_frac_avg_10s.other.unclassified
-    proxy.node.http.transaction_frac_avg_10s.hit_fresh_int_pct
-    proxy.node.http.transaction_frac_avg_10s.hit_revalidated_int_pct
-    proxy.node.http.transaction_frac_avg_10s.miss_cold_int_pct
-    proxy.node.http.transaction_frac_avg_10s.miss_not_cacheable_int_pct
-    proxy.node.http.transaction_frac_avg_10s.miss_changed_int_pct
-    proxy.node.http.transaction_frac_avg_10s.miss_client_no_cache_int_pct
-    proxy.node.http.transaction_frac_avg_10s.errors.connect_failed_int_pct
-    proxy.node.http.transaction_frac_avg_10s.errors.aborts_int_pct
-    proxy.node.http.transaction_frac_avg_10s.errors.possible_aborts_int_pct
-    proxy.node.http.transaction_frac_avg_10s.errors.pre_accept_hangups_int_pct
-    proxy.node.http.transaction_frac_avg_10s.errors.early_hangups_int_pct
-    proxy.node.http.transaction_frac_avg_10s.errors.empty_hangups_int_pct
-    proxy.node.http.transaction_frac_avg_10s.errors.other_int_pct
-    proxy.node.http.transaction_frac_avg_10s.other.unclassified_int_pct
-    proxy.node.http.transaction_msec_avg_10s.hit_fresh
-    proxy.node.http.transaction_msec_avg_10s.hit_revalidated
-    proxy.node.http.transaction_msec_avg_10s.miss_cold
-    proxy.node.http.transaction_msec_avg_10s.miss_not_cacheable
-    proxy.node.http.transaction_msec_avg_10s.miss_changed
-    proxy.node.http.transaction_msec_avg_10s.miss_client_no_cache
-    proxy.node.http.transaction_msec_avg_10s.errors.connect_failed
-    proxy.node.http.transaction_msec_avg_10s.errors.aborts
-    proxy.node.http.transaction_msec_avg_10s.errors.possible_aborts
-    proxy.node.http.transaction_msec_avg_10s.errors.pre_accept_hangups
-    proxy.node.http.transaction_msec_avg_10s.errors.early_hangups
-    proxy.node.http.transaction_msec_avg_10s.errors.empty_hangups
-    proxy.node.http.transaction_msec_avg_10s.errors.other
-    proxy.node.http.transaction_msec_avg_10s.other.unclassified
-    proxy.node.http.throughput
-    proxy.node.http.user_agent_xacts_per_second
-    proxy.node.http.user_agent_current_connections_count
-    proxy.node.http.user_agent_total_request_bytes
-    proxy.node.http.user_agent_total_response_bytes
-    proxy.node.http.user_agents_total_transactions_count
-    proxy.node.http.user_agents_total_documents_served
-    proxy.node.http.origin_server_current_connections_count
-    proxy.node.http.origin_server_total_request_bytes
-    proxy.node.http.origin_server_total_response_bytes
-    proxy.node.http.parent_proxy_total_request_bytes
-    proxy.node.http.parent_proxy_total_response_bytes
-    proxy.node.http.origin_server_total_transactions_count
-    proxy.node.http.cache_current_connections_count
-    proxy.node.http.current_parent_proxy_connections
-    proxy.node.cache.contents.num_docs
-    proxy.node.cache.bytes_total
-    proxy.node.cache.bytes_total_mb
-    proxy.node.cache.bytes_free
-    proxy.node.cache.bytes_free_mb
-    proxy.node.cache.percent_free_int_pct
-    proxy.node.cache_total_hits
-    proxy.node.cache_total_misses
-    proxy.node.current_cache_connections
-    proxy.node.dns.lookups_per_second
-    proxy.node.dns.lookup_avg_time_ms
-    proxy.node.dns.total_dns_lookups
-    proxy.node.hostdb.total_lookups
-    proxy.node.hostdb.total_hits
-    proxy.node.cluster.nodes
-    proxy.node.client_throughput_out
-    proxy.node.client_throughput_out_kbit
-    proxy.node.current_client_connections
-    proxy.node.current_server_connections
-    proxy.node.user_agent_total_bytes
-    proxy.node.origin_server_total_bytes
-    proxy.node.user_agent_total_bytes_avg_10s
-    proxy.node.origin_server_total_bytes_avg_10s
-    proxy.node.user_agent_xacts_per_second
-    proxy.node.user_agents_total_documents_served
-    proxy.cluster.user_agent_total_bytes_avg_10s
-    proxy.cluster.origin_server_total_bytes_avg_10s
-    proxy.cluster.bandwidth_hit_ratio
-    proxy.cluster.bandwidth_hit_ratio_int_pct
-    proxy.cluster.bandwidth_hit_ratio_avg_10s
-    proxy.cluster.http.throughput
-    proxy.cluster.http.user_agent_xacts_per_second
-    proxy.cluster.http.user_agent_current_connections_count
-    proxy.cluster.http.user_agent_total_request_bytes
-    proxy.cluster.http.user_agent_total_response_bytes
-    proxy.cluster.http.user_agents_total_transactions_count
-    proxy.cluster.http.user_agents_total_documents_served
-    proxy.cluster.http.origin_server_current_connections_count
-    proxy.cluster.http.origin_server_total_request_bytes
-    proxy.cluster.http.origin_server_total_response_bytes
-    proxy.cluster.http.origin_server_total_transactions_count
-    proxy.cluster.http.cache_current_connections_count
-    proxy.cluster.http.current_parent_proxy_connections
-    proxy.cluster.http.parent_proxy_total_request_bytes
-    proxy.cluster.http.parent_proxy_total_response_bytes
-    proxy.cluster.cache.contents.num_docs
-    proxy.cluster.cache.bytes_free
-    proxy.cluster.cache.bytes_free_mb
-    proxy.cluster.cache.percent_free
-    proxy.cluster.cache.percent_free_int_pct
-    proxy.cluster.cache_hit_ratio
-    proxy.cluster.cache_hit_ratio_int_pct
-    proxy.cluster.cache_total_hits
-    proxy.cluster.cache_total_misses
-    proxy.cluster.current_cache_connections
-    proxy.cluster.cache_total_hits_avg_10s
-    proxy.cluster.cache_total_misses_avg_10s
-    proxy.cluster.cache_hit_ratio_avg_10s
-    proxy.cluster.dns.lookups_per_second
-    proxy.cluster.dns.total_dns_lookups
-    proxy.cluster.hostdb.hit_ratio
-    proxy.cluster.hostdb.hit_ratio_int_pct
-    proxy.cluster.hostdb.total_lookups_avg_10s
-    proxy.cluster.hostdb.total_hits_avg_10s
-    proxy.cluster.hostdb.hit_ratio_avg_10s
-    proxy.cluster.user_agent_xacts_per_second
-    proxy.cluster.client_throughput_out
-    proxy.cluster.client_throughput_out_kbit
-    proxy.cluster.current_client_connections
-    proxy.cluster.current_server_connections
-    proxy.process.version.server.short
-    proxy.process.version.server.long
-    proxy.process.version.server.build_number
-    proxy.process.version.server.build_time
-    proxy.process.version.server.build_date
-    proxy.process.version.server.build_machine
-    proxy.process.version.server.build_person
-    proxy.process.net.net_handler_run
-    proxy.process.net.read_bytes
-    proxy.process.net.write_bytes
-    proxy.process.net.calls_to_readfromnet
-    proxy.process.net.calls_to_readfromnet_afterpoll
-    proxy.process.net.calls_to_read
-    proxy.process.net.calls_to_read_nodata
-    proxy.process.net.calls_to_writetonet
-    proxy.process.net.calls_to_writetonet_afterpoll
-    proxy.process.net.calls_to_write
-    proxy.process.net.calls_to_write_nodata
-    proxy.process.socks.connections_successful
-    proxy.process.socks.connections_unsuccessful
-    proxy.process.cache.read_per_sec
-    proxy.process.cache.write_per_sec
-    proxy.process.cache.KB_read_per_sec
-    proxy.process.cache.KB_write_per_sec
-    proxy.process.cache.ram_cache.total_bytes
-    proxy.process.hostdb.total_entries
-    proxy.process.hostdb.total_lookups
-    proxy.process.hostdb.ttl
-    proxy.process.hostdb.ttl_expires
-    proxy.process.hostdb.re_dns_on_reload
-    proxy.process.hostdb.bytes
-    proxy.process.dns.total_dns_lookups
-    proxy.process.dns.lookup_avg_time
-    proxy.process.dns.lookup_successes
-    proxy.process.dns.fail_avg_time
-    proxy.process.dns.lookup_failures
-    proxy.process.dns.retries
-    proxy.process.dns.max_retries_exceeded
-    proxy.process.log.bytes_buffered
-    proxy.process.log.bytes_written_to_disk
-    proxy.process.log.bytes_sent_to_network
-    proxy.process.log.bytes_received_from_network
-    proxy.process.log.event_log_error
-    proxy.process.log.event_log_access
-    proxy.process.log.event_log_access_fail
-    proxy.process.log.event_log_access_skip
-    proxy.process.cache.volume_0.ram_cache.total_bytes
-    proxy.process.http.completed_requests
-    proxy.process.http.total_incoming_connections
-    proxy.process.http.total_client_connections
-    proxy.process.http.total_client_connections_ipv4
-    proxy.process.http.total_client_connections_ipv6
-    proxy.process.http.total_server_connections
-    proxy.process.http.total_parent_proxy_connections
-    proxy.process.http.avg_transactions_per_client_connection
-    proxy.process.http.avg_transactions_per_server_connection
-    proxy.process.http.avg_transactions_per_parent_connection
-    proxy.process.http.client_connection_time
-    proxy.process.http.parent_proxy_connection_time
-    proxy.process.http.server_connection_time
-    proxy.process.http.cache_connection_time
-    proxy.process.http.transaction_counts.errors.pre_accept_hangups
-    proxy.process.http.transaction_totaltime.errors.pre_accept_hangups
-    proxy.process.http.transaction_counts.errors.empty_hangups
-    proxy.process.http.transaction_totaltime.errors.empty_hangups
-    proxy.process.http.transaction_counts.errors.early_hangups
-    proxy.process.http.transaction_totaltime.errors.early_hangups
-    proxy.process.http.incoming_requests
-    proxy.process.http.outgoing_requests
-    proxy.process.http.incoming_responses
-    proxy.process.http.invalid_client_requests
-    proxy.process.http.missing_host_hdr
-    proxy.process.http.get_requests
-    proxy.process.http.head_requests
-    proxy.process.http.trace_requests
-    proxy.process.http.options_requests
-    proxy.process.http.post_requests
-    proxy.process.http.put_requests
-    proxy.process.http.push_requests
-    proxy.process.http.delete_requests
-    proxy.process.http.purge_requests
-    proxy.process.http.connect_requests
-    proxy.process.http.extension_method_requests
-    proxy.process.http.client_no_cache_requests
-    proxy.process.http.broken_server_connections
-    proxy.process.http.cache_lookups
-    proxy.process.http.cache_writes
-    proxy.process.http.cache_updates
-    proxy.process.http.cache_deletes
-    proxy.process.http.tunnels
-    proxy.process.http.throttled_proxy_only
-    proxy.process.http.request_taxonomy.i0_n0_m0
-    proxy.process.http.request_taxonomy.i1_n0_m0
-    proxy.process.http.request_taxonomy.i0_n1_m0
-    proxy.process.http.request_taxonomy.i1_n1_m0
-    proxy.process.http.request_taxonomy.i0_n0_m1
-    proxy.process.http.request_taxonomy.i1_n0_m1
-    proxy.process.http.request_taxonomy.i0_n1_m1
-    proxy.process.http.request_taxonomy.i1_n1_m1
-    proxy.process.http.icp_suggested_lookups
-    proxy.process.http.client_transaction_time
-    proxy.process.http.client_write_time
-    proxy.process.http.server_read_time
-    proxy.process.http.icp_transaction_time
-    proxy.process.http.icp_raw_transaction_time
-    proxy.process.http.parent_proxy_transaction_time
-    proxy.process.http.parent_proxy_raw_transaction_time
-    proxy.process.http.server_transaction_time
-    proxy.process.http.server_raw_transaction_time
-    proxy.process.http.user_agent_request_header_total_size
-    proxy.process.http.user_agent_response_header_total_size
-    proxy.process.http.user_agent_request_document_total_size
-    proxy.process.http.user_agent_response_document_total_size
-    proxy.process.http.origin_server_request_header_total_size
-    proxy.process.http.origin_server_response_header_total_size
-    proxy.process.http.origin_server_request_document_total_size
-    proxy.process.http.origin_server_response_document_total_size
-    proxy.process.http.parent_proxy_request_total_bytes
-    proxy.process.http.parent_proxy_response_total_bytes
-    proxy.process.http.pushed_response_header_total_size
-    proxy.process.http.pushed_document_total_size
-    proxy.process.http.response_document_size_100
-    proxy.process.http.response_document_size_1K
-    proxy.process.http.response_document_size_3K
-    proxy.process.http.response_document_size_5K
-    proxy.process.http.response_document_size_10K
-    proxy.process.http.response_document_size_1M
-    proxy.process.http.response_document_size_inf
-    proxy.process.http.request_document_size_100
-    proxy.process.http.request_document_size_1K
-    proxy.process.http.request_document_size_3K
-    proxy.process.http.request_document_size_5K
-    proxy.process.http.request_document_size_10K
-    proxy.process.http.request_document_size_1M
-    proxy.process.http.request_document_size_inf
-    proxy.process.http.user_agent_speed_bytes_per_sec_100
-    proxy.process.http.user_agent_speed_bytes_per_sec_1K
-    proxy.process.http.user_agent_speed_bytes_per_sec_10K
-    proxy.process.http.user_agent_speed_bytes_per_sec_100K
-    proxy.process.http.user_agent_speed_bytes_per_sec_1M
-    proxy.process.http.user_agent_speed_bytes_per_sec_10M
-    proxy.process.http.user_agent_speed_bytes_per_sec_100M
-    proxy.process.http.origin_server_speed_bytes_per_sec_100
-    proxy.process.http.origin_server_speed_bytes_per_sec_1K
-    proxy.process.http.origin_server_speed_bytes_per_sec_10K
-    proxy.process.http.origin_server_speed_bytes_per_sec_100K
-    proxy.process.http.origin_server_speed_bytes_per_sec_1M
-    proxy.process.http.origin_server_speed_bytes_per_sec_10M
-    proxy.process.http.origin_server_speed_bytes_per_sec_100M
-    proxy.process.http.total_transactions_time
-    proxy.process.http.total_transactions_think_time
-    proxy.process.http.cache_hit_fresh
-    proxy.process.http.cache_hit_revalidated
-    proxy.process.http.cache_hit_ims
-    proxy.process.http.cache_hit_stale_served
-    proxy.process.http.cache_miss_cold
-    proxy.process.http.cache_miss_changed
-    proxy.process.http.cache_miss_client_no_cache
-    proxy.process.http.cache_miss_client_not_cacheable
-    proxy.process.http.cache_miss_ims
-    proxy.process.http.cache_read_error
-    proxy.process.http.tcp_hit_count_stat
-    proxy.process.http.tcp_hit_user_agent_bytes_stat
-    proxy.process.http.tcp_hit_origin_server_bytes_stat
-    proxy.process.http.tcp_miss_count_stat
-    proxy.process.http.tcp_miss_user_agent_bytes_stat
-    proxy.process.http.tcp_miss_origin_server_bytes_stat
-    proxy.process.http.tcp_expired_miss_count_stat
-    proxy.process.http.tcp_expired_miss_user_agent_bytes_stat
-    proxy.process.http.tcp_expired_miss_origin_server_bytes_stat
-    proxy.process.http.tcp_refresh_hit_count_stat
-    proxy.process.http.tcp_refresh_hit_user_agent_bytes_stat
-    proxy.process.http.tcp_refresh_hit_origin_server_bytes_stat
-    proxy.process.http.tcp_refresh_miss_count_stat
-    proxy.process.http.tcp_refresh_miss_user_agent_bytes_stat
-    proxy.process.http.tcp_refresh_miss_origin_server_bytes_stat
-    proxy.process.http.tcp_client_refresh_count_stat
-    proxy.process.http.tcp_client_refresh_user_agent_bytes_stat
-    proxy.process.http.tcp_client_refresh_origin_server_bytes_stat
-    proxy.process.http.tcp_ims_hit_count_stat
-    proxy.process.http.tcp_ims_hit_user_agent_bytes_stat
-    proxy.process.http.tcp_ims_hit_origin_server_bytes_stat
-    proxy.process.http.tcp_ims_miss_count_stat
-    proxy.process.http.tcp_ims_miss_user_agent_bytes_stat
-    proxy.process.http.tcp_ims_miss_origin_server_bytes_stat
-    proxy.process.http.err_client_abort_count_stat
-    proxy.process.http.err_client_abort_user_agent_bytes_stat
-    proxy.process.http.err_client_abort_origin_server_bytes_stat
-    proxy.process.http.err_connect_fail_count_stat
-    proxy.process.http.err_connect_fail_user_agent_bytes_stat
-    proxy.process.http.err_connect_fail_origin_server_bytes_stat
-    proxy.process.http.misc_count_stat
-    proxy.process.http.misc_user_agent_bytes_stat
-    proxy.process.http.background_fill_bytes_aborted_stat
-    proxy.process.http.background_fill_bytes_completed_stat
-    proxy.process.http.cache_write_errors
-    proxy.process.http.cache_read_errors
-    proxy.process.http.100_responses
-    proxy.process.http.101_responses
-    proxy.process.http.1xx_responses
-    proxy.process.http.200_responses
-    proxy.process.http.201_responses
-    proxy.process.http.202_responses
-    proxy.process.http.203_responses
-    proxy.process.http.204_responses
-    proxy.process.http.205_responses
-    proxy.process.http.206_responses
-    proxy.process.http.2xx_responses
-    proxy.process.http.300_responses
-    proxy.process.http.301_responses
-    proxy.process.http.302_responses
-    proxy.process.http.303_responses
-    proxy.process.http.304_responses
-    proxy.process.http.305_responses
-    proxy.process.http.307_responses
-    proxy.process.http.3xx_responses
-    proxy.process.http.400_responses
-    proxy.process.http.401_responses
-    proxy.process.http.402_responses
-    proxy.process.http.403_responses
-    proxy.process.http.404_responses
-    proxy.process.http.405_responses
-    proxy.process.http.406_responses
-    proxy.process.http.407_responses
-    proxy.process.http.408_responses
-    proxy.process.http.409_responses
-    proxy.process.http.410_responses
-    proxy.process.http.411_responses
-    proxy.process.http.412_responses
-    proxy.process.http.413_responses
-    proxy.process.http.414_responses
-    proxy.process.http.415_responses
-    proxy.process.http.416_responses
-    proxy.process.http.4xx_responses
-    proxy.process.http.500_responses
-    proxy.process.http.501_responses
-    proxy.process.http.502_responses
-    proxy.process.http.503_responses
-    proxy.process.http.504_responses
-    proxy.process.http.505_responses
-    proxy.process.http.5xx_responses
-    proxy.process.http.transaction_counts.hit_fresh
-    proxy.process.http.transaction_totaltime.hit_fresh
-    proxy.process.http.transaction_counts.hit_fresh.process
-    proxy.process.http.transaction_totaltime.hit_fresh.process
-    proxy.process.http.transaction_counts.hit_revalidated
-    proxy.process.http.transaction_totaltime.hit_revalidated
-    proxy.process.http.transaction_counts.miss_cold
-    proxy.process.http.transaction_totaltime.miss_cold
-    proxy.process.http.transaction_counts.miss_not_cacheable
-    proxy.process.http.transaction_totaltime.miss_not_cacheable
-    proxy.process.http.transaction_counts.miss_changed
-    proxy.process.http.transaction_totaltime.miss_changed
-    proxy.process.http.transaction_counts.miss_client_no_cache
-    proxy.process.http.transaction_totaltime.miss_client_no_cache
-    proxy.process.http.transaction_counts.errors.aborts
-    proxy.process.http.transaction_totaltime.errors.aborts
-    proxy.process.http.transaction_counts.errors.possible_aborts
-    proxy.process.http.transaction_totaltime.errors.possible_aborts
-    proxy.process.http.transaction_counts.errors.connect_failed
-    proxy.process.http.transaction_totaltime.errors.connect_failed
-    proxy.process.http.transaction_counts.errors.other
-    proxy.process.http.transaction_totaltime.errors.other
-    proxy.process.http.transaction_counts.other.unclassified
-    proxy.process.http.transaction_totaltime.other.unclassified
-    proxy.process.http.total_x_redirect_count
-    proxy.process.icp.config_mgmt_callouts
-    proxy.process.icp.reconfig_polls
-    proxy.process.icp.reconfig_events
-    proxy.process.icp.invalid_poll_data
-    proxy.process.icp.no_data_read
-    proxy.process.icp.short_read
-    proxy.process.icp.invalid_sender
-    proxy.process.icp.read_not_v2_icp
-    proxy.process.icp.icp_remote_query_requests
-    proxy.process.icp.icp_remote_responses
-    proxy.process.icp.cache_lookup_success
-    proxy.process.icp.cache_lookup_fail
-    proxy.process.icp.query_response_write
-    proxy.process.icp.query_response_partial_write
-    proxy.process.icp.no_icp_request_for_response
-    proxy.process.icp.icp_response_request_nolock
-    proxy.process.icp.icp_start_icpoff
-    proxy.process.icp.send_query_partial_write
-    proxy.process.icp.icp_queries_no_expected_replies
-    proxy.process.icp.icp_query_hits
-    proxy.process.icp.icp_query_misses
-    proxy.process.icp.invalid_icp_query_response
-    proxy.process.icp.icp_query_requests
-    proxy.process.icp.total_icp_response_time
-    proxy.process.icp.total_udp_send_queries
-    proxy.process.icp.total_icp_request_time
-    proxy.process.net.connections_currently_open
-    proxy.process.net.accepts_currently_open
-    proxy.process.socks.connections_currently_open
-    proxy.process.cache.bytes_used
-    proxy.process.cache.bytes_total
-    proxy.process.cache.ram_cache.bytes_used
-    proxy.process.cache.ram_cache.hits
-    proxy.process.cache.pread_count
-    proxy.process.cache.percent_full
-    proxy.process.cache.lookup.active
-    proxy.process.cache.lookup.success
-    proxy.process.cache.lookup.failure
-    proxy.process.cache.read.active
-    proxy.process.cache.read.success
-    proxy.process.cache.read.failure
-    proxy.process.cache.write.active
-    proxy.process.cache.write.success
-    proxy.process.cache.write.failure
-    proxy.process.cache.write.backlog.failure
-    proxy.process.cache.update.active
-    proxy.process.cache.update.success
-    proxy.process.cache.update.failure
-    proxy.process.cache.remove.active
-    proxy.process.cache.remove.success
-    proxy.process.cache.remove.failure
-    proxy.process.cache.evacuate.active
-    proxy.process.cache.evacuate.success
-    proxy.process.cache.evacuate.failure
-    proxy.process.cache.scan.active
-    proxy.process.cache.scan.success
-    proxy.process.cache.scan.failure
-    proxy.process.cache.direntries.total
-    proxy.process.cache.direntries.used
-    proxy.process.cache.directory_collision
-    proxy.process.cache.frags_per_doc.1
-    proxy.process.cache.frags_per_doc.2
-    proxy.process.cache.frags_per_doc.3+
-    proxy.process.cache.read_busy.success
-    proxy.process.cache.read_busy.failure
-    proxy.process.cache.write_bytes_stat
-    proxy.process.cache.vector_marshals
-    proxy.process.cache.hdr_marshals
-    proxy.process.cache.hdr_marshal_bytes
-    proxy.process.cache.gc_bytes_evacuated
-    proxy.process.cache.gc_frags_evacuated
-    proxy.process.hostdb.total_hits
-    proxy.process.dns.success_avg_time
-    proxy.process.dns.in_flight
-    proxy.process.congestion.congested_on_conn_failures
-    proxy.process.congestion.congested_on_max_connection
-    proxy.process.cluster.connections_open
-    proxy.process.cluster.connections_opened
-    proxy.process.cluster.connections_closed
-    proxy.process.cluster.slow_ctrl_msgs_sent
-    proxy.process.cluster.connections_locked
-    proxy.process.cluster.reads
-    proxy.process.cluster.read_bytes
-    proxy.process.cluster.writes
-    proxy.process.cluster.write_bytes
-    proxy.process.cluster.control_messages_sent
-    proxy.process.cluster.control_messages_received
-    proxy.process.cluster.op_delayed_for_lock
-    proxy.process.cluster.connections_bumped
-    proxy.process.cluster.net_backup
-    proxy.process.cluster.nodes
-    proxy.process.cluster.machines_allocated
-    proxy.process.cluster.machines_freed
-    proxy.process.cluster.configuration_changes
-    proxy.process.cluster.delayed_reads
-    proxy.process.cluster.byte_bank_used
-    proxy.process.cluster.alloc_data_news
-    proxy.process.cluster.write_bb_mallocs
-    proxy.process.cluster.partial_reads
-    proxy.process.cluster.partial_writes
-    proxy.process.cluster.cache_outstanding
-    proxy.process.cluster.remote_op_timeouts
-    proxy.process.cluster.remote_op_reply_timeouts
-    proxy.process.cluster.chan_inuse
-    proxy.process.cluster.open_delays
-    proxy.process.cluster.connections_avg_time
-    proxy.process.cluster.control_messages_avg_send_time
-    proxy.process.cluster.control_messages_avg_receive_time
-    proxy.process.cluster.open_delay_time
-    proxy.process.cluster.cache_callback_time
-    proxy.process.cluster.rmt_cache_callback_time
-    proxy.process.cluster.lkrmt_cache_callback_time
-    proxy.process.cluster.local_connection_time
-    proxy.process.cluster.remote_connection_time
-    proxy.process.cluster.rdmsg_assemble_time
-    proxy.process.cluster.cluster_ping_time
-    proxy.process.cluster.cache_callbacks
-    proxy.process.cluster.rmt_cache_callbacks
-    proxy.process.cluster.lkrmt_cache_callbacks
-    proxy.process.cluster.local_connections_closed
-    proxy.process.cluster.remote_connections_closed
-    proxy.process.cluster.setdata_no_clustervc
-    proxy.process.cluster.setdata_no_tunnel
-    proxy.process.cluster.setdata_no_cachevc
-    proxy.process.cluster.setdata_no_cluster
-    proxy.process.cluster.vc_write_stall
-    proxy.process.cluster.no_remote_space
-    proxy.process.cluster.level1_bank
-    proxy.process.cluster.multilevel_bank
-    proxy.process.cluster.vc_cache_insert_lock_misses
-    proxy.process.cluster.vc_cache_inserts
-    proxy.process.cluster.vc_cache_lookup_lock_misses
-    proxy.process.cluster.vc_cache_lookup_hits
-    proxy.process.cluster.vc_cache_lookup_misses
-    proxy.process.cluster.vc_cache_scans
-    proxy.process.cluster.vc_cache_scan_lock_misses
-    proxy.process.cluster.vc_cache_purges
-    proxy.process.cluster.write_lock_misses
-    proxy.process.log.log_files_open
-    proxy.process.log.log_files_space_used
-    proxy.process.http.background_fill_current_count
-    proxy.process.http.current_client_connections
-    proxy.process.http.current_active_client_connections
-    proxy.process.http.current_client_transactions
-    proxy.process.http.current_parent_proxy_transactions
-    proxy.process.http.current_icp_transactions
-    proxy.process.http.current_server_transactions
-    proxy.process.http.current_parent_proxy_raw_transactions
-    proxy.process.http.current_icp_raw_transactions
-    proxy.process.http.current_server_raw_transactions
-    proxy.process.http.current_parent_proxy_connections
-    proxy.process.http.current_server_connections
-    proxy.process.http.current_cache_connections
-    proxy.process.update.successes
-    proxy.process.update.no_actions
-    proxy.process.update.fails
-    proxy.process.update.unknown_status
-    proxy.process.update.state_machines
-    proxy.process.cache.volume_0.bytes_used
-    proxy.process.cache.volume_0.bytes_total
-    proxy.process.cache.volume_0.ram_cache.bytes_used
-    proxy.process.cache.volume_0.ram_cache.hits
-    proxy.process.cache.volume_0.pread_count
-    proxy.process.cache.volume_0.percent_full
-    proxy.process.cache.volume_0.lookup.active
-    proxy.process.cache.volume_0.lookup.success
-    proxy.process.cache.volume_0.lookup.failure
-    proxy.process.cache.volume_0.read.active
-    proxy.process.cache.volume_0.read.success
-    proxy.process.cache.volume_0.read.failure
-    proxy.process.cache.volume_0.write.active
-    proxy.process.cache.volume_0.write.success
-    proxy.process.cache.volume_0.write.failure
-    proxy.process.cache.volume_0.write.backlog.failure
-    proxy.process.cache.volume_0.update.active
-    proxy.process.cache.volume_0.update.success
-    proxy.process.cache.volume_0.update.failure
-    proxy.process.cache.volume_0.remove.active
-    proxy.process.cache.volume_0.remove.success
-    proxy.process.cache.volume_0.remove.failure
-    proxy.process.cache.volume_0.evacuate.active
-    proxy.process.cache.volume_0.evacuate.success
-    proxy.process.cache.volume_0.evacuate.failure
-    proxy.process.cache.volume_0.scan.active
-    proxy.process.cache.volume_0.scan.success
-    proxy.process.cache.volume_0.scan.failure
-    proxy.process.cache.volume_0.direntries.total
-    proxy.process.cache.volume_0.direntries.used
-    proxy.process.cache.volume_0.directory_collision
-    proxy.process.cache.volume_0.frags_per_doc.1
-    proxy.process.cache.volume_0.frags_per_doc.2
-    proxy.process.cache.volume_0.frags_per_doc.3+
-    proxy.process.cache.volume_0.read_busy.success
-    proxy.process.cache.volume_0.read_busy.failure
-    proxy.process.cache.volume_0.write_bytes_stat
-    proxy.process.cache.volume_0.vector_marshals
-    proxy.process.cache.volume_0.hdr_marshals
-    proxy.process.cache.volume_0.hdr_marshal_bytes
-    proxy.process.cache.volume_0.gc_bytes_evacuated
-    proxy.process.cache.volume_0.gc_frags_evacuated
-    proxy.process.ssl.user_agent_other_errors
-    proxy.process.ssl.user_agent_expired_cert
-    proxy.process.ssl.user_agent_revoked_cert
-    proxy.process.ssl.user_agent_unknown_cert
-    proxy.process.ssl.user_agent_cert_verify_failed
-    proxy.process.ssl.user_agent_bad_cert
-    proxy.process.ssl.user_agent_decryption_failed
-    proxy.process.ssl.user_agent_wrong_version
-    proxy.process.ssl.user_agent_unknown_ca
-    proxy.process.ssl.origin_server_other_errors
-    proxy.process.ssl.origin_server_expired_cert
-    proxy.process.ssl.origin_server_revoked_cert
-    proxy.process.ssl.origin_server_unknown_cert
-    proxy.process.ssl.origin_server_cert_verify_failed
-    proxy.process.ssl.origin_server_bad_cert
-    proxy.process.ssl.origin_server_decryption_failed
-    proxy.process.ssl.origin_server_wrong_version
-    proxy.process.ssl.origin_server_unknown_ca
-    proxy.process.ssl.user_agent_sessions
-    proxy.process.ssl.user_agent_session_hit
-    proxy.process.ssl.user_agent_session_miss
-    proxy.process.ssl.user_agent_session_timeout
-    proxy.process.ssl.cipher.user_agent.{cipherName}
+  proxy.cluster.bandwidth_hit_ratio
+  proxy.cluster.bandwidth_hit_ratio_avg_10s
+  proxy.cluster.bandwidth_hit_ratio_int_pct
+  proxy.cluster.cache.bytes_free
+  proxy.cluster.cache.bytes_free_mb
+  proxy.cluster.cache.contents.num_docs
+  proxy.cluster.cache.percent_free
+  proxy.cluster.cache.percent_free_int_pct
+  proxy.cluster.cache_hit_mem_ratio
+  proxy.cluster.cache_hit_mem_ratio_avg_10s
+  proxy.cluster.cache_hit_mem_ratio_int_pct
+  proxy.cluster.cache_hit_ratio
+  proxy.cluster.cache_hit_ratio_avg_10s
+  proxy.cluster.cache_hit_ratio_int_pct
+  proxy.cluster.cache_total_hits
+  proxy.cluster.cache_total_hits_avg_10s
+  proxy.cluster.cache_total_hits_mem
+  proxy.cluster.cache_total_hits_mem_avg_10s
+  proxy.cluster.cache_total_misses
+  proxy.cluster.cache_total_misses_avg_10s
+  proxy.cluster.client_throughput_out
+  proxy.cluster.client_throughput_out_kbit
+  proxy.cluster.current_cache_connections
+  proxy.cluster.current_client_connections
+  proxy.cluster.current_server_connections
+  proxy.cluster.dns.lookups_per_second
+  proxy.cluster.dns.total_dns_lookups
+  proxy.cluster.hostdb.hit_ratio
+  proxy.cluster.hostdb.hit_ratio_avg_10s
+  proxy.cluster.hostdb.hit_ratio_int_pct
+  proxy.cluster.hostdb.total_hits_avg_10s
+  proxy.cluster.hostdb.total_lookups_avg_10s
+  proxy.cluster.http.cache_current_connections_count
+  proxy.cluster.http.current_parent_proxy_connections
+  proxy.cluster.http.origin_server_current_connections_count
+  proxy.cluster.http.origin_server_total_request_bytes
+  proxy.cluster.http.origin_server_total_response_bytes
+  proxy.cluster.http.origin_server_total_transactions_count
+  proxy.cluster.http.parent_proxy_total_request_bytes
+  proxy.cluster.http.parent_proxy_total_response_bytes
+  proxy.cluster.http.throughput
+  proxy.cluster.http.user_agent_current_connections_count
+  proxy.cluster.http.user_agent_total_request_bytes
+  proxy.cluster.http.user_agent_total_response_bytes
+  proxy.cluster.http.user_agent_xacts_per_second
+  proxy.cluster.http.user_agents_total_documents_served
+  proxy.cluster.http.user_agents_total_transactions_count
+
+  proxy.cluster.log.bytes_flush_to_disk
+  proxy.cluster.log.bytes_lost_before_flush_to_disk
+  proxy.cluster.log.bytes_lost_before_preproc
+  proxy.cluster.log.bytes_lost_before_sent_to_network
+  proxy.cluster.log.bytes_lost_before_written_to_disk
+  proxy.cluster.log.bytes_received_from_network
+  proxy.cluster.log.bytes_received_from_network_avg_10s
+  proxy.cluster.log.bytes_sent_to_network
+  proxy.cluster.log.bytes_sent_to_network_avg_10s
+  proxy.cluster.log.bytes_written_to_disk
+  proxy.cluster.log.event_log_access_aggr
+  proxy.cluster.log.event_log_access_fail
+  proxy.cluster.log.event_log_access_full
+  proxy.cluster.log.event_log_access_ok
+  proxy.cluster.log.event_log_access_skip
+  proxy.cluster.log.event_log_error_aggr
+  proxy.cluster.log.event_log_error_fail
+  proxy.cluster.log.event_log_error_full
+  proxy.cluster.log.event_log_error_ok
+  proxy.cluster.log.event_log_error_skip
+  proxy.cluster.log.num_flush_to_disk
+  proxy.cluster.log.num_lost_before_flush_to_disk
+  proxy.cluster.log.num_lost_before_sent_to_network
+  proxy.cluster.log.num_received_from_network
+  proxy.cluster.log.num_sent_to_network
+
+  proxy.cluster.origin_server_total_bytes_avg_10s
+  proxy.cluster.user_agent_total_bytes_avg_10s
+  proxy.cluster.user_agent_xacts_per_second
+
+  proxy.node.bandwidth_hit_ratio
+  proxy.node.bandwidth_hit_ratio_avg_10s
+  proxy.node.bandwidth_hit_ratio_avg_10s_int_pct
+  proxy.node.bandwidth_hit_ratio_int_pct
+
+  proxy.node.cache.bytes_free
+  proxy.node.cache.bytes_free_mb
+  proxy.node.cache.bytes_total
+  proxy.node.cache.bytes_total_mb
+  proxy.node.cache.contents.num_docs
+  proxy.node.cache.percent_free
+  proxy.node.cache.percent_free_int_pct
+  proxy.node.cache_hit_mem_ratio
+  proxy.node.cache_hit_mem_ratio_avg_10s
+  proxy.node.cache_hit_mem_ratio_avg_10s_int_pct
+  proxy.node.cache_hit_mem_ratio_int_pct
+  proxy.node.cache_hit_ratio
+  proxy.node.cache_hit_ratio_avg_10s
+  proxy.node.cache_hit_ratio_avg_10s_int_pct
+  proxy.node.cache_hit_ratio_int_pct
+  proxy.node.cache_total_hits
+  proxy.node.cache_total_hits_avg_10s
+  proxy.node.cache_total_hits_mem
+  proxy.node.cache_total_hits_mem_avg_10s
+  proxy.node.cache_total_misses
+  proxy.node.cache_total_misses_avg_10s
+
+  proxy.node.client_throughput_out
+  proxy.node.client_throughput_out_kbit
+  proxy.node.cluster.nodes
+
+  proxy.node.current_cache_connections
+  proxy.node.current_client_connections
+  proxy.node.current_server_connections
+
+  proxy.node.dns.lookup_avg_time_ms
+  proxy.node.dns.lookups_per_second
+  proxy.node.dns.total_dns_lookups
+
+  proxy.node.hostdb.hit_ratio
+  proxy.node.hostdb.hit_ratio_avg_10s
+  proxy.node.hostdb.hit_ratio_int_pct
+  proxy.node.hostdb.total_hits
+  proxy.node.hostdb.total_hits_avg_10s
+  proxy.node.hostdb.total_lookups
+  proxy.node.hostdb.total_lookups_avg_10s
+
+  proxy.node.hostname
+  proxy.node.hostname_FQ
+
+  proxy.node.http.cache_current_connections_count
+  proxy.node.http.cache_hit_fresh_avg_10s
+  proxy.node.http.cache_hit_ims_avg_10s
+  proxy.node.http.cache_hit_mem_fresh_avg_10s
+  proxy.node.http.cache_hit_revalidated_avg_10s
+  proxy.node.http.cache_hit_stale_served_avg_10s
+  proxy.node.http.cache_miss_changed_avg_10s
+  proxy.node.http.cache_miss_client_no_cache_avg_10s
+  proxy.node.http.cache_miss_cold_avg_10s
+  proxy.node.http.cache_miss_ims_avg_10s
+  proxy.node.http.cache_miss_not_cacheable_avg_10s
+  proxy.node.http.cache_read_error_avg_10s
+  proxy.node.http.current_parent_proxy_connections
+  proxy.node.http.origin_server_current_connections_count
+  proxy.node.http.origin_server_total_request_bytes
+  proxy.node.http.origin_server_total_response_bytes
+  proxy.node.http.origin_server_total_transactions_count
+  proxy.node.http.parent_proxy_total_request_bytes
+  proxy.node.http.parent_proxy_total_response_bytes
+  proxy.node.http.throughput
+  proxy.node.http.transaction_counts_avg_10s.errors.aborts
+  proxy.node.http.transaction_counts_avg_10s.errors.connect_failed
+  proxy.node.http.transaction_counts_avg_10s.errors.early_hangups
+  proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups
+  proxy.node.http.transaction_counts_avg_10s.errors.other
+  proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts
+  proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups
+  proxy.node.http.transaction_counts_avg_10s.hit_fresh
+  proxy.node.http.transaction_counts_avg_10s.hit_revalidated
+  proxy.node.http.transaction_counts_avg_10s.miss_changed
+  proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache
+  proxy.node.http.transaction_counts_avg_10s.miss_cold
+  proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable
+  proxy.node.http.transaction_counts_avg_10s.other.unclassified
+  proxy.node.http.transaction_frac_avg_10s.errors.aborts
+  proxy.node.http.transaction_frac_avg_10s.errors.aborts_int_pct
+  proxy.node.http.transaction_frac_avg_10s.errors.connect_failed
+  proxy.node.http.transaction_frac_avg_10s.errors.connect_failed_int_pct
+  proxy.node.http.transaction_frac_avg_10s.errors.early_hangups
+  proxy.node.http.transaction_frac_avg_10s.errors.early_hangups_int_pct
+  proxy.node.http.transaction_frac_avg_10s.errors.empty_hangups
+  proxy.node.http.transaction_frac_avg_10s.errors.empty_hangups_int_pct
+  proxy.node.http.transaction_frac_avg_10s.errors.other
+  proxy.node.http.transaction_frac_avg_10s.errors.other_int_pct
+  proxy.node.http.transaction_frac_avg_10s.errors.possible_aborts
+  proxy.node.http.transaction_frac_avg_10s.errors.possible_aborts_int_pct
+  proxy.node.http.transaction_frac_avg_10s.errors.pre_accept_hangups
+  proxy.node.http.transaction_frac_avg_10s.errors.pre_accept_hangups_int_pct
+  proxy.node.http.transaction_frac_avg_10s.hit_fresh
+  proxy.node.http.transaction_frac_avg_10s.hit_fresh_int_pct
+  proxy.node.http.transaction_frac_avg_10s.hit_revalidated
+  proxy.node.http.transaction_frac_avg_10s.hit_revalidated_int_pct
+  proxy.node.http.transaction_frac_avg_10s.miss_changed
+  proxy.node.http.transaction_frac_avg_10s.miss_changed_int_pct
+  proxy.node.http.transaction_frac_avg_10s.miss_client_no_cache
+  proxy.node.http.transaction_frac_avg_10s.miss_client_no_cache_int_pct
+  proxy.node.http.transaction_frac_avg_10s.miss_cold
+  proxy.node.http.transaction_frac_avg_10s.miss_cold_int_pct
+  proxy.node.http.transaction_frac_avg_10s.miss_not_cacheable
+  proxy.node.http.transaction_frac_avg_10s.miss_not_cacheable_int_pct
+  proxy.node.http.transaction_frac_avg_10s.other.unclassified
+  proxy.node.http.transaction_frac_avg_10s.other.unclassified_int_pct
+  proxy.node.http.transaction_msec_avg_10s.errors.aborts
+  proxy.node.http.transaction_msec_avg_10s.errors.connect_failed
+  proxy.node.http.transaction_msec_avg_10s.errors.early_hangups
+  proxy.node.http.transaction_msec_avg_10s.errors.empty_hangups
+  proxy.node.http.transaction_msec_avg_10s.errors.other
+  proxy.node.http.transaction_msec_avg_10s.errors.possible_aborts
+  proxy.node.http.transaction_msec_avg_10s.errors.pre_accept_hangups
+  proxy.node.http.transaction_msec_avg_10s.hit_fresh
+  proxy.node.http.transaction_msec_avg_10s.hit_revalidated
+  proxy.node.http.transaction_msec_avg_10s.miss_changed
+  proxy.node.http.transaction_msec_avg_10s.miss_client_no_cache
+  proxy.node.http.transaction_msec_avg_10s.miss_cold
+  proxy.node.http.transaction_msec_avg_10s.miss_not_cacheable
+  proxy.node.http.transaction_msec_avg_10s.other.unclassified
+  proxy.node.http.user_agent_current_connections_count
+  proxy.node.http.user_agent_total_request_bytes
+  proxy.node.http.user_agent_total_response_bytes
+  proxy.node.http.user_agent_xacts_per_second
+  proxy.node.http.user_agents_total_documents_served
+  proxy.node.http.user_agents_total_transactions_count
+
+  proxy.node.log.bytes_flush_to_disk
+  proxy.node.log.bytes_lost_before_flush_to_disk
+  proxy.node.log.bytes_lost_before_preproc
+  proxy.node.log.bytes_lost_before_sent_to_network
+  proxy.node.log.bytes_lost_before_written_to_disk
+  proxy.node.log.bytes_received_from_network
+  proxy.node.log.bytes_received_from_network_avg_10s
+  proxy.node.log.bytes_sent_to_network
+  proxy.node.log.bytes_sent_to_network_avg_10s
+  proxy.node.log.bytes_written_to_disk
+  proxy.node.log.event_log_access_aggr
+  proxy.node.log.event_log_access_fail
+  proxy.node.log.event_log_access_full
+  proxy.node.log.event_log_access_ok
+  proxy.node.log.event_log_access_skip
+  proxy.node.log.event_log_error_aggr
+  proxy.node.log.event_log_error_fail
+  proxy.node.log.event_log_error_full
+  proxy.node.log.event_log_error_ok
+  proxy.node.log.event_log_error_skip
+  proxy.node.log.num_flush_to_disk
+  proxy.node.log.num_lost_before_flush_to_disk
+  proxy.node.log.num_lost_before_sent_to_network
+  proxy.node.log.num_received_from_network
+  proxy.node.log.num_sent_to_network
+
+  proxy.node.num_processes
+
+  proxy.node.origin_server_total_bytes
+  proxy.node.origin_server_total_bytes_avg_10s
+
+  proxy.node.proxy_running
+
+  proxy.node.restarts.manager.start_time
+  proxy.node.restarts.proxy.cache_ready_time
+  proxy.node.restarts.proxy.restart_count
+  proxy.node.restarts.proxy.start_time
+  proxy.node.restarts.proxy.stop_time
+
+  proxy.node.user_agent_total_bytes
+  proxy.node.user_agent_total_bytes_avg_10s
+  proxy.node.user_agent_xacts_per_second
+  proxy.node.user_agents_total_documents_served
+
+  proxy.node.version.manager.build_date
+  proxy.node.version.manager.build_machine
+  proxy.node.version.manager.build_number
+  proxy.node.version.manager.build_person
+  proxy.node.version.manager.build_time
+  proxy.node.version.manager.long
+  proxy.node.version.manager.short
+
+  proxy.process.cache.KB_read_per_sec
+  proxy.process.cache.KB_write_per_sec
+  proxy.process.cache.bytes_total
+  proxy.process.cache.bytes_used
+  proxy.process.cache.directory_collision
+  proxy.process.cache.direntries.total
+  proxy.process.cache.direntries.used
+  proxy.process.cache.evacuate.active
+  proxy.process.cache.evacuate.failure
+  proxy.process.cache.evacuate.success
+  proxy.process.cache.frags_per_doc.1
+  proxy.process.cache.frags_per_doc.2
+  proxy.process.cache.frags_per_doc.3+
+  proxy.process.cache.gc_bytes_evacuated
+  proxy.process.cache.gc_frags_evacuated
+  proxy.process.cache.hdr_marshal_bytes
+  proxy.process.cache.hdr_marshals
+  proxy.process.cache.lookup.active
+  proxy.process.cache.lookup.failure
+  proxy.process.cache.lookup.success
+  proxy.process.cache.percent_full
+  proxy.process.cache.pread_count
+  proxy.process.cache.ram_cache.bytes_used
+  proxy.process.cache.ram_cache.hits
+  proxy.process.cache.ram_cache.misses
+  proxy.process.cache.ram_cache.total_bytes
+  proxy.process.cache.read.active
+  proxy.process.cache.read.failure
+  proxy.process.cache.read.success
+  proxy.process.cache.read_busy.failure
+  proxy.process.cache.read_busy.success
+  proxy.process.cache.read_per_sec
+  proxy.process.cache.remove.active
+  proxy.process.cache.remove.failure
+  proxy.process.cache.remove.success
+  proxy.process.cache.scan.active
+  proxy.process.cache.scan.failure
+  proxy.process.cache.scan.success
+  proxy.process.cache.update.active
+  proxy.process.cache.update.failure
+  proxy.process.cache.update.success
+  proxy.process.cache.vector_marshals
+  proxy.process.cache.volume_{N}.bytes_total
+  proxy.process.cache.volume_{N}.bytes_used
+  proxy.process.cache.volume_{N}.directory_collision
+  proxy.process.cache.volume_{N}.direntries.total
+  proxy.process.cache.volume_{N}.direntries.used
+  proxy.process.cache.volume_{N}.evacuate.active
+  proxy.process.cache.volume_{N}.evacuate.failure
+  proxy.process.cache.volume_{N}.evacuate.success
+  proxy.process.cache.volume_{N}.frags_per_doc.1
+  proxy.process.cache.volume_{N}.frags_per_doc.2
+  proxy.process.cache.volume_{N}.frags_per_doc.3+
+  proxy.process.cache.volume_{N}.gc_bytes_evacuated
+  proxy.process.cache.volume_{N}.gc_frags_evacuated
+  proxy.process.cache.volume_{N}.hdr_marshal_bytes
+  proxy.process.cache.volume_{N}.hdr_marshals
+  proxy.process.cache.volume_{N}.lookup.active
+  proxy.process.cache.volume_{N}.lookup.failure
+  proxy.process.cache.volume_{N}.lookup.success
+  proxy.process.cache.volume_{N}.percent_full
+  proxy.process.cache.volume_{N}.pread_count
+  proxy.process.cache.volume_{N}.ram_cache.bytes_used
+  proxy.process.cache.volume_{N}.ram_cache.hits
+  proxy.process.cache.volume_{N}.ram_cache.misses
+  proxy.process.cache.volume_{N}.ram_cache.total_bytes
+  proxy.process.cache.volume_{N}.read.active
+  proxy.process.cache.volume_{N}.read.failure
+  proxy.process.cache.volume_{N}.read.success
+  proxy.process.cache.volume_{N}.read_busy.failure
+  proxy.process.cache.volume_{N}.read_busy.success
+  proxy.process.cache.volume_{N}.remove.active
+  proxy.process.cache.volume_{N}.remove.failure
+  proxy.process.cache.volume_{N}.remove.success
+  proxy.process.cache.volume_{N}.scan.active
+  proxy.process.cache.volume_{N}.scan.failure
+  proxy.process.cache.volume_{N}.scan.success
+  proxy.process.cache.volume_{N}.update.active
+  proxy.process.cache.volume_{N}.update.failure
+  proxy.process.cache.volume_{N}.update.success
+  proxy.process.cache.volume_{N}.vector_marshals
+  proxy.process.cache.volume_{N}.write.active
+  proxy.process.cache.volume_{N}.write.backlog.failure
+  proxy.process.cache.volume_{N}.write.failure
+  proxy.process.cache.volume_{N}.write.success
+  proxy.process.cache.volume_{N}.write_bytes_stat
+  proxy.process.cache.write.active
+  proxy.process.cache.write.backlog.failure
+  proxy.process.cache.write.failure
+  proxy.process.cache.write.success
+  proxy.process.cache.write_bytes_stat
+  proxy.process.cache.write_per_sec
+
+  proxy.process.cluster.alloc_data_news
+  proxy.process.cluster.byte_bank_used
+  proxy.process.cluster.cache_callback_time
+  proxy.process.cluster.cache_callbacks
+  proxy.process.cluster.cache_outstanding
+  proxy.process.cluster.chan_inuse
+  proxy.process.cluster.cluster_ping_time
+  proxy.process.cluster.configuration_changes
+  proxy.process.cluster.connections_avg_time
+  proxy.process.cluster.connections_bumped
+  proxy.process.cluster.connections_closed
+  proxy.process.cluster.connections_open
+  proxy.process.cluster.connections_opened
+  proxy.process.cluster.connections_read_locked
+  proxy.process.cluster.connections_write_locked
+  proxy.process.cluster.control_messages_avg_receive_time
+  proxy.process.cluster.control_messages_avg_send_time
+  proxy.process.cluster.control_messages_received
+  proxy.process.cluster.control_messages_sent
+  proxy.process.cluster.delayed_reads
+  proxy.process.cluster.level1_bank
+  proxy.process.cluster.lkrmt_cache_callback_time
+  proxy.process.cluster.lkrmt_cache_callbacks
+  proxy.process.cluster.local_connection_time
+  proxy.process.cluster.local_connections_closed
+  proxy.process.cluster.machines_allocated
+  proxy.process.cluster.machines_freed
+  proxy.process.cluster.multilevel_bank
+  proxy.process.cluster.net_backup
+  proxy.process.cluster.no_remote_space
+  proxy.process.cluster.nodes
+  proxy.process.cluster.op_delayed_for_lock
+  proxy.process.cluster.open_delay_time
+  proxy.process.cluster.open_delays
+  proxy.process.cluster.partial_reads
+  proxy.process.cluster.partial_writes
+  proxy.process.cluster.rdmsg_assemble_time
+  proxy.process.cluster.read_bytes
+  proxy.process.cluster.reads
+  proxy.process.cluster.remote_connection_time
+  proxy.process.cluster.remote_connections_closed
+  proxy.process.cluster.remote_op_reply_timeouts
+  proxy.process.cluster.remote_op_timeouts
+  proxy.process.cluster.rmt_cache_callback_time
+  proxy.process.cluster.rmt_cache_callbacks
+  proxy.process.cluster.setdata_no_cachevc
+  proxy.process.cluster.setdata_no_cluster
+  proxy.process.cluster.setdata_no_clustervc
+  proxy.process.cluster.setdata_no_tunnel
+  proxy.process.cluster.slow_ctrl_msgs_sent
+  proxy.process.cluster.vc_cache_insert_lock_misses
+  proxy.process.cluster.vc_cache_inserts
+  proxy.process.cluster.vc_cache_lookup_hits
+  proxy.process.cluster.vc_cache_lookup_lock_misses
+  proxy.process.cluster.vc_cache_lookup_misses
+  proxy.process.cluster.vc_cache_purges
+  proxy.process.cluster.vc_cache_scan_lock_misses
+  proxy.process.cluster.vc_cache_scans
+  proxy.process.cluster.vc_read_list_len
+  proxy.process.cluster.vc_write_list_len
+  proxy.process.cluster.vc_write_stall
+  proxy.process.cluster.write_bb_mallocs
+  proxy.process.cluster.write_bytes
+  proxy.process.cluster.write_lock_misses
+  proxy.process.cluster.writes
+
+  proxy.process.congestion.congested_on_conn_failures
+  proxy.process.congestion.congested_on_max_connection
+
+  proxy.process.dns.fail_avg_time
+  proxy.process.dns.in_flight
+  proxy.process.dns.lookup_avg_time
+  proxy.process.dns.lookup_failures
+  proxy.process.dns.lookup_successes
+  proxy.process.dns.max_retries_exceeded
+  proxy.process.dns.retries
+  proxy.process.dns.success_avg_time
+  proxy.process.dns.total_dns_lookups
+
+  proxy.process.hostdb.bytes
+  proxy.process.hostdb.re_dns_on_reload
+  proxy.process.hostdb.total_entries
+  proxy.process.hostdb.total_hits
+  proxy.process.hostdb.total_lookups
+  proxy.process.hostdb.ttl
+  proxy.process.hostdb.ttl_expires
+
+  proxy.process.http.100_responses
+  proxy.process.http.101_responses
+  proxy.process.http.1xx_responses
+  proxy.process.http.200_responses
+  proxy.process.http.201_responses
+  proxy.process.http.202_responses
+  proxy.process.http.203_responses
+  proxy.process.http.204_responses
+  proxy.process.http.205_responses
+  proxy.process.http.206_responses
+  proxy.process.http.2xx_responses
+  proxy.process.http.300_responses
+  proxy.process.http.301_responses
+  proxy.process.http.302_responses
+  proxy.process.http.303_responses
+  proxy.process.http.304_responses
+  proxy.process.http.305_responses
+  proxy.process.http.307_responses
+  proxy.process.http.3xx_responses
+  proxy.process.http.400_responses
+  proxy.process.http.401_responses
+  proxy.process.http.402_responses
+  proxy.process.http.403_responses
+  proxy.process.http.404_responses
+  proxy.process.http.405_responses
+  proxy.process.http.406_responses
+  proxy.process.http.407_responses
+  proxy.process.http.408_responses
+  proxy.process.http.409_responses
+  proxy.process.http.410_responses
+  proxy.process.http.411_responses
+  proxy.process.http.412_responses
+  proxy.process.http.413_responses
+  proxy.process.http.414_responses
+  proxy.process.http.415_responses
+  proxy.process.http.416_responses
+  proxy.process.http.4xx_responses
+  proxy.process.http.500_responses
+  proxy.process.http.501_responses
+  proxy.process.http.502_responses
+  proxy.process.http.503_responses
+  proxy.process.http.504_responses
+  proxy.process.http.505_responses
+  proxy.process.http.5xx_responses
+  proxy.process.http.avg_transactions_per_client_connection
+  proxy.process.http.avg_transactions_per_parent_connection
+  proxy.process.http.avg_transactions_per_server_connection
+  proxy.process.http.background_fill_bytes_aborted_stat
+  proxy.process.http.background_fill_bytes_completed_stat
+  proxy.process.http.background_fill_current_count
+  proxy.process.http.broken_server_connections
+  proxy.process.http.cache_connection_time
+  proxy.process.http.cache_deletes
+  proxy.process.http.cache_hit_fresh
+  proxy.process.http.cache_hit_ims
+  proxy.process.http.cache_hit_mem_fresh
+  proxy.process.http.cache_hit_revalidated
+  proxy.process.http.cache_hit_stale_served
+  proxy.process.http.cache_lookups
+  proxy.process.http.cache_miss_changed
+  proxy.process.http.cache_miss_client_no_cache
+  proxy.process.http.cache_miss_client_not_cacheable
+  proxy.process.http.cache_miss_cold
+  proxy.process.http.cache_miss_ims
+  proxy.process.http.cache_read_error
+  proxy.process.http.cache_read_errors
+  proxy.process.http.cache_updates
+  proxy.process.http.cache_write_errors
+  proxy.process.http.cache_writes
+  proxy.process.http.client_connection_time
+  proxy.process.http.client_no_cache_requests
+  proxy.process.http.client_transaction_time
+  proxy.process.http.client_write_time
+  proxy.process.http.completed_requests
+  proxy.process.http.connect_requests
+  proxy.process.http.current_active_client_connections
+  proxy.process.http.current_cache_connections
+  proxy.process.http.current_client_connections
+  proxy.process.http.current_client_transactions
+  proxy.process.http.current_icp_raw_transactions
+  proxy.process.http.current_icp_transactions
+  proxy.process.http.current_parent_proxy_connections
+  proxy.process.http.current_parent_proxy_raw_transactions
+  proxy.process.http.current_parent_proxy_transactions
+  proxy.process.http.current_server_connections
+  proxy.process.http.current_server_raw_transactions
+  proxy.process.http.current_server_transactions
+  proxy.process.http.delete_requests
+  proxy.process.http.err_client_abort_count_stat
+  proxy.process.http.err_client_abort_origin_server_bytes_stat
+  proxy.process.http.err_client_abort_user_agent_bytes_stat
+  proxy.process.http.err_connect_fail_count_stat
+  proxy.process.http.err_connect_fail_origin_server_bytes_stat
+  proxy.process.http.err_connect_fail_user_agent_bytes_stat
+  proxy.process.http.extension_method_requests
+  proxy.process.http.get_requests
+  proxy.process.http.head_requests
+  proxy.process.http.icp_raw_transaction_time
+  proxy.process.http.icp_suggested_lookups
+  proxy.process.http.icp_transaction_time
+  proxy.process.http.incoming_requests
+  proxy.process.http.incoming_responses
+  proxy.process.http.invalid_client_requests
+  proxy.process.http.misc_count_stat
+  proxy.process.http.misc_user_agent_bytes_stat
+  proxy.process.http.missing_host_hdr
+  proxy.process.http.options_requests
+  proxy.process.http.origin_server_request_document_total_size
+  proxy.process.http.origin_server_request_header_total_size
+  proxy.process.http.origin_server_response_document_total_size
+  proxy.process.http.origin_server_response_header_total_size
+  proxy.process.http.origin_server_speed_bytes_per_sec_100
+  proxy.process.http.origin_server_speed_bytes_per_sec_100K
+  proxy.process.http.origin_server_speed_bytes_per_sec_100M
+  proxy.process.http.origin_server_speed_bytes_per_sec_10K
+  proxy.process.http.origin_server_speed_bytes_per_sec_10M
+  proxy.process.http.origin_server_speed_bytes_per_sec_1K
+  proxy.process.http.origin_server_speed_bytes_per_sec_1M
+  proxy.process.http.outgoing_requests
+  proxy.process.http.parent_proxy_connection_time
+  proxy.process.http.parent_proxy_raw_transaction_time
+  proxy.process.http.parent_proxy_request_total_bytes
+  proxy.process.http.parent_proxy_response_total_bytes
+  proxy.process.http.parent_proxy_transaction_time
+  proxy.process.http.post_requests
+  proxy.process.http.purge_requests
+  proxy.process.http.push_requests
+  proxy.process.http.pushed_document_total_size
+  proxy.process.http.pushed_response_header_total_size
+  proxy.process.http.put_requests
+  proxy.process.http.request_document_size_100
+  proxy.process.http.request_document_size_10K
+  proxy.process.http.request_document_size_1K
+  proxy.process.http.request_document_size_1M
+  proxy.process.http.request_document_size_3K
+  proxy.process.http.request_document_size_5K
+  proxy.process.http.request_document_size_inf
+  proxy.process.http.request_taxonomy.i0_n0_m0
+  proxy.process.http.request_taxonomy.i0_n0_m1
+  proxy.process.http.request_taxonomy.i0_n1_m0
+  proxy.process.http.request_taxonomy.i0_n1_m1
+  proxy.process.http.request_taxonomy.i1_n0_m0
+  proxy.process.http.request_taxonomy.i1_n0_m1
+  proxy.process.http.request_taxonomy.i1_n1_m0
+  proxy.process.http.request_taxonomy.i1_n1_m1
+  proxy.process.http.response_document_size_100
+  proxy.process.http.response_document_size_10K
+  proxy.process.http.response_document_size_1K
+  proxy.process.http.response_document_size_1M
+  proxy.process.http.response_document_size_3K
+  proxy.process.http.response_document_size_5K
+  proxy.process.http.response_document_size_inf
+  proxy.process.http.server_connection_time
+  proxy.process.http.server_raw_transaction_time
+  proxy.process.http.server_read_time
+  proxy.process.http.server_transaction_time
+  proxy.process.http.tcp_client_refresh_count_stat
+  proxy.process.http.tcp_client_refresh_origin_server_bytes_stat
+  proxy.process.http.tcp_client_refresh_user_agent_bytes_stat
+  proxy.process.http.tcp_expired_miss_count_stat
+  proxy.process.http.tcp_expired_miss_origin_server_bytes_stat
+  proxy.process.http.tcp_expired_miss_user_agent_bytes_stat
+  proxy.process.http.tcp_hit_count_stat
+  proxy.process.http.tcp_hit_origin_server_bytes_stat
+  proxy.process.http.tcp_hit_user_agent_bytes_stat
+  proxy.process.http.tcp_ims_hit_count_stat
+  proxy.process.http.tcp_ims_hit_origin_server_bytes_stat
+  proxy.process.http.tcp_ims_hit_user_agent_bytes_stat
+  proxy.process.http.tcp_ims_miss_count_stat
+  proxy.process.http.tcp_ims_miss_origin_server_bytes_stat
+  proxy.process.http.tcp_ims_miss_user_agent_bytes_stat
+  proxy.process.http.tcp_miss_count_stat
+  proxy.process.http.tcp_miss_origin_server_bytes_stat
+  proxy.process.http.tcp_miss_user_agent_bytes_stat
+  proxy.process.http.tcp_refresh_hit_count_stat
+  proxy.process.http.tcp_refresh_hit_origin_server_bytes_stat
+  proxy.process.http.tcp_refresh_hit_user_agent_bytes_stat
+  proxy.process.http.tcp_refresh_miss_count_stat
+  proxy.process.http.tcp_refresh_miss_origin_server_bytes_stat
+  proxy.process.http.tcp_refresh_miss_user_agent_bytes_stat
+  proxy.process.http.throttled_proxy_only
+  proxy.process.http.total_client_connections
+  proxy.process.http.total_client_connections_ipv4
+  proxy.process.http.total_client_connections_ipv6
+  proxy.process.http.total_incoming_connections
+  proxy.process.http.total_parent_proxy_connections
+  proxy.process.http.total_server_connections
+  proxy.process.http.total_transactions_think_time
+  proxy.process.http.total_transactions_time
+  proxy.process.http.total_x_redirect_count
+  proxy.process.http.trace_requests
+  proxy.process.http.transaction_counts.errors.aborts
+  proxy.process.http.transaction_counts.errors.connect_failed
+  proxy.process.http.transaction_counts.errors.early_hangups
+  proxy.process.http.transaction_counts.errors.empty_hangups
+  proxy.process.http.transaction_counts.errors.other
+  proxy.process.http.transaction_counts.errors.possible_aborts
+  proxy.process.http.transaction_counts.errors.pre_accept_hangups
+  proxy.process.http.transaction_counts.hit_fresh
+  proxy.process.http.transaction_counts.hit_fresh.process
+  proxy.process.http.transaction_counts.hit_revalidated
+  proxy.process.http.transaction_counts.miss_changed
+  proxy.process.http.transaction_counts.miss_client_no_cache
+  proxy.process.http.transaction_counts.miss_cold
+  proxy.process.http.transaction_counts.miss_not_cacheable
+  proxy.process.http.transaction_counts.other.unclassified
+  proxy.process.http.transaction_totaltime.errors.aborts
+  proxy.process.http.transaction_totaltime.errors.connect_failed
+  proxy.process.http.transaction_totaltime.errors.early_hangups
+  proxy.process.http.transaction_totaltime.errors.empty_hangups
+  proxy.process.http.transaction_totaltime.errors.other
+  proxy.process.http.transaction_totaltime.errors.possible_aborts
+  proxy.process.http.transaction_totaltime.errors.pre_accept_hangups
+  proxy.process.http.transaction_totaltime.hit_fresh
+  proxy.process.http.transaction_totaltime.hit_fresh.process
+  proxy.process.http.transaction_totaltime.hit_revalidated
+  proxy.process.http.transaction_totaltime.miss_changed
+  proxy.process.http.transaction_totaltime.miss_client_no_cache
+  proxy.process.http.transaction_totaltime.miss_cold
+  proxy.process.http.transaction_totaltime.miss_not_cacheable
+  proxy.process.http.transaction_totaltime.other.unclassified
+  proxy.process.http.tunnels
+  proxy.process.http.user_agent_request_document_total_size
+  proxy.process.http.user_agent_request_header_total_size
+  proxy.process.http.user_agent_response_document_total_size
+  proxy.process.http.user_agent_response_header_total_size
+  proxy.process.http.user_agent_speed_bytes_per_sec_100
+  proxy.process.http.user_agent_speed_bytes_per_sec_100K
+  proxy.process.http.user_agent_speed_bytes_per_sec_100M
+  proxy.process.http.user_agent_speed_bytes_per_sec_10K
+  proxy.process.http.user_agent_speed_bytes_per_sec_10M
+  proxy.process.http.user_agent_speed_bytes_per_sec_1K
+  proxy.process.http.user_agent_speed_bytes_per_sec_1M
+  proxy.process.http.websocket.current_active_client_connections
+
+  proxy.process.log.bytes_flush_to_disk
+  proxy.process.log.bytes_lost_before_flush_to_disk
+  proxy.process.log.bytes_lost_before_preproc
+  proxy.process.log.bytes_lost_before_sent_to_network
+  proxy.process.log.bytes_lost_before_written_to_disk
+  proxy.process.log.bytes_received_from_network
+  proxy.process.log.bytes_sent_to_network
+  proxy.process.log.bytes_written_to_disk
+  proxy.process.log.event_log_access_aggr
+  proxy.process.log.event_log_access_fail
+  proxy.process.log.event_log_access_full
+  proxy.process.log.event_log_access_ok
+  proxy.process.log.event_log_access_skip
+  proxy.process.log.event_log_error_aggr
+  proxy.process.log.event_log_error_fail
+  proxy.process.log.event_log_error_full
+  proxy.process.log.event_log_error_ok
+  proxy.process.log.event_log_error_skip
+  proxy.process.log.log_files_open
+  proxy.process.log.log_files_space_used
+  proxy.process.log.num_flush_to_disk
+  proxy.process.log.num_lost_before_flush_to_disk
+  proxy.process.log.num_lost_before_sent_to_network
+  proxy.process.log.num_received_from_network
+  proxy.process.log.num_sent_to_network
+
+  proxy.process.net.accepts_currently_open
+  proxy.process.net.calls_to_read
+  proxy.process.net.calls_to_read_nodata
+  proxy.process.net.calls_to_readfromnet
+  proxy.process.net.calls_to_readfromnet_afterpoll
+  proxy.process.net.calls_to_write
+  proxy.process.net.calls_to_write_nodata
+  proxy.process.net.calls_to_writetonet
+  proxy.process.net.calls_to_writetonet_afterpoll
+  proxy.process.net.connections_currently_open
+  proxy.process.net.inactivity_cop_lock_acquire_failure
+  proxy.process.net.net_handler_run
+  proxy.process.net.read_bytes
+  proxy.process.net.write_bytes
+
+  proxy.process.socks.connections_currently_open
+  proxy.process.socks.connections_successful
+  proxy.process.socks.connections_unsuccessful
+
+  proxy.process.ssl.cipher.user_agent.{CIPHER}
+  proxy.process.ssl.origin_server_bad_cert
+  proxy.process.ssl.origin_server_cert_verify_failed
+  proxy.process.ssl.origin_server_decryption_failed
+  proxy.process.ssl.origin_server_expired_cert
+  proxy.process.ssl.origin_server_other_errors
+  proxy.process.ssl.origin_server_revoked_cert
+  proxy.process.ssl.origin_server_unknown_ca
+  proxy.process.ssl.origin_server_unknown_cert
+  proxy.process.ssl.origin_server_wrong_version
+  proxy.process.ssl.user_agent_bad_cert
+  proxy.process.ssl.user_agent_cert_verify_failed
+  proxy.process.ssl.user_agent_decryption_failed
+  proxy.process.ssl.user_agent_expired_cert
+  proxy.process.ssl.user_agent_other_errors
+  proxy.process.ssl.user_agent_revoked_cert
+  proxy.process.ssl.user_agent_session_hit
+  proxy.process.ssl.user_agent_session_miss
+  proxy.process.ssl.user_agent_session_timeout
+  proxy.process.ssl.user_agent_sessions
+  proxy.process.ssl.user_agent_unknown_ca
+  proxy.process.ssl.user_agent_unknown_cert
+  proxy.process.ssl.user_agent_wrong_version
+
+  proxy.process.update.fails
+  proxy.process.update.no_actions
+  proxy.process.update.state_machines
+  proxy.process.update.successes
+  proxy.process.update.unknown_status
+
+  proxy.process.version.server.build_date
+  proxy.process.version.server.build_machine
+  proxy.process.version.server.build_number
+  proxy.process.version.server.build_person
+  proxy.process.version.server.build_time
+  proxy.process.version.server.long
+  proxy.process.version.server.short
 
 Statistics Descriptions
 =======================
@@ -904,33 +998,19 @@ proxy.process.ssl.user_agent_session_timeout
   Total number of session timeouts.  The ssl client provided a session, but
   it could not be used because it was past the session timeout.
 
-proxy.process.ssl.cipher.user_agent.{cipherName}
-  Total number of ssl client connections that used cipherName.  The list of
-  cipher stats is dynamic and depends upon the installed ciphers and the
-  cipher configuration of ats (proxy.config.ssl.server.cipher_suite).
-  Some common cipher stats are::
-
-    proxy.process.ssl.cipher.user_agent.ECDHE-RSA-RC4-SHA
-    proxy.process.ssl.cipher.user_agent.ECDHE-RSA-AES128-SHA256
-    proxy.process.ssl.cipher.user_agent.ECDHE-RSA-AES128-GCM-SHA256
-    proxy.process.ssl.cipher.user_agent.ECDHE-RSA-AES128-SHA
-    proxy.process.ssl.cipher.user_agent.RC4-SHA
-    proxy.process.ssl.cipher.user_agent.RC4-MD5
-    proxy.process.ssl.cipher.user_agent.AES128-GCM-SHA256
-    proxy.process.ssl.cipher.user_agent.AES128-SHA
-
-There are two ways to get the list of cipher stats:
-
-1.  Run ATS with debug logging and show ssl diags::
+proxy.process.ssl.cipher.user_agent.{CIPHERNAME}
+  Total number of ssl client connections that used cipherName.  The
+  list of cipher statistics is dynamic and depends upon the installed
+  ciphers and the :ts:cv:`proxy.config.ssl.server.cipher_suite`
+  configuration. The set of cipher statistics can be discovered
+  with :option:`traffic_line -m`. For example::
 
-      CONFIG proxy.config.diags.debug.enabled INT 1
-      CONFIG proxy.config.diags.debug.tags STRING ssl.*
-      View output of traffic.out looking for lines like:
-         (ssl) Registering ssl cipher stat 'proxy.process.ssl.cipher.user_agent.ECDHE-RSA-AES256-GCM-SHA384'
-
-2.  Run this (asks openssl to tell us) to get a list of all possible ciphers on the system (not all may be available as stats)::
-
-         openssl ciphers | sed 's/\([^:]\+\)/proxy.process.ssl.cipher.user_agent.\1/g; s/:/\n/g'
+    $ traffic_line -m proxy.process.ssl.cipher.user_agent.
+    proxy.process.ssl.cipher.user_agent.ECDHE-RSA-AES256-GCM-SHA384 0
+    proxy.process.ssl.cipher.user_agent.ECDHE-ECDSA-AES256-GCM-SHA384 0
+    proxy.process.ssl.cipher.user_agent.ECDHE-RSA-AES256-SHA384 0
+    proxy.process.ssl.cipher.user_agent.ECDHE-ECDSA-AES256-SHA384 0
+    ...
 
 Examples
 ========
@@ -941,12 +1021,8 @@ Configure Traffic Server to log in Squid format::
     $ traffic_line -s proxy.config.log.squid_log_is_ascii -v 1
     $ traffic_line -x
 
-Files
-=====
-
-:file:`records.config`, :file:`ssl_multicert.config`
-
 See also
 ========
 
-:manpage:`records.config(5)`
+:manpage:`records.config(5)`,
+:manpage:`storage.config(5)`

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/0389be39/mgmt/api/CoreAPI.cc
----------------------------------------------------------------------
diff --git a/mgmt/api/CoreAPI.cc b/mgmt/api/CoreAPI.cc
index b99d616..592d782 100644
--- a/mgmt/api/CoreAPI.cc
+++ b/mgmt/api/CoreAPI.cc
@@ -383,6 +383,15 @@ MgmtRecordGet(const char *rec_name, TSRecordEle * rec_ele)
   return TS_ERR_OKAY;
 }
 
+// This is not implemented in the Core side of the API because we don't want
+// to buffer up all the matching records in memory. We stream the records
+// directory onto the management socket in handle_record_match(). This stub
+// is just here for link time dependencies.
+TSError
+MgmtRecordGetMatching(const char * /* regex */, TSList /* rec_vals */)
+{
+  return TS_ERR_FAIL;
+}
 
 /*-------------------------------------------------------------------------
  * reads the RecordsConfig info to determine which type of action is needed

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/0389be39/mgmt/api/CoreAPI.h
----------------------------------------------------------------------
diff --git a/mgmt/api/CoreAPI.h b/mgmt/api/CoreAPI.h
index 87dd84e..21d9da6 100644
--- a/mgmt/api/CoreAPI.h
+++ b/mgmt/api/CoreAPI.h
@@ -69,6 +69,7 @@ TSError MgmtRecordSetInt(const char *rec_name, MgmtInt int_val, TSActionNeedT *
 TSError MgmtRecordSetCounter(const char *rec_name, MgmtIntCounter counter_val, TSActionNeedT *action_need);
 TSError MgmtRecordSetFloat(const char *rec_name, MgmtFloat float_val, TSActionNeedT * action_need);
 TSError MgmtRecordSetString(const char *rec_name, const char*string_val, TSActionNeedT * action_need);
+TSError MgmtRecordGetMatching(const char * regex, TSList rec_vals);
 
 
 /***************************************************************************

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/0389be39/mgmt/api/CoreAPIRemote.cc
----------------------------------------------------------------------
diff --git a/mgmt/api/CoreAPIRemote.cc b/mgmt/api/CoreAPIRemote.cc
index 8ccdac0..0dc360a 100644
--- a/mgmt/api/CoreAPIRemote.cc
+++ b/mgmt/api/CoreAPIRemote.cc
@@ -476,54 +476,113 @@ StorageDeviceCmdOffline(char const* dev)
   ret = send_request_name(main_socket_fd, STORAGE_DEVICE_CMD_OFFLINE, dev);
   return TS_ERR_OKAY != ret ? ret : parse_reply(main_socket_fd);
 }
+
 /***************************************************************************
  * Record Operations
  ***************************************************************************/
+static TSError
+mgmt_record_get_reply(TSRecordEle * rec_ele)
+{
+  TSError ret;
+  void *val;
+  char *name;
+
+  rec_ele->rec_name = NULL;
+  rec_ele->rec_type = TS_REC_UNDEFINED;
+
+  // parse the reply to get record value and type
+  ret = parse_record_get_reply(main_socket_fd, &(rec_ele->rec_type), &val, &name);
+  if (ret != TS_ERR_OKAY) {
+    return ret;
+  }
+
+  // convert the record value to appropriate type
+  if (val) {
+    switch (rec_ele->rec_type) {
+    case TS_REC_INT:
+      rec_ele->int_val = *(TSInt *) val;
+      break;
+    case TS_REC_COUNTER:
+      rec_ele->counter_val = *(TSCounter *) val;
+      break;
+    case TS_REC_FLOAT:
+      rec_ele->float_val = *(TSFloat *) val;
+      break;
+    case TS_REC_STRING:
+      rec_ele->string_val = ats_strdup((char *) val);
+      break;
+    default:
+      ; // nothing ... shut up compiler!
+    }
+  }
+
+  if (name) {
+    rec_ele->rec_name = name;
+  }
+
+  ats_free(val);
+  return TS_ERR_OKAY;
+}
+
 // note that the record value is being sent as chunk of memory, regardless of
 // record type; it's not being converted to a string!!
 TSError
 MgmtRecordGet(const char *rec_name, TSRecordEle * rec_ele)
 {
   TSError ret;
-  void *val;
 
-  if (!rec_name || !rec_ele)
+  if (!rec_name || !rec_ele) {
     return TS_ERR_PARAMS;
-
-  rec_ele->rec_name = ats_strdup(rec_name);
+  }
 
   // create and send request
   ret = send_record_get_request(main_socket_fd, rec_ele->rec_name);
-  if (ret != TS_ERR_OKAY)
+  if (ret != TS_ERR_OKAY) {
     return ret;
+  }
 
-  // parse the reply to get record value and type
-  ret = parse_record_get_reply(main_socket_fd, &(rec_ele->rec_type), &val);
-  if (ret != TS_ERR_OKAY)
+  return mgmt_record_get_reply(rec_ele);
+}
+
+TSError
+MgmtRecordGetMatching(const char * regex, TSList rec_vals)
+{
+  TSError       ret;
+  TSRecordEle * rec_ele;
+
+  ret = send_record_match_request(main_socket_fd, regex);
+  if (ret != TS_ERR_OKAY) {
     return ret;
+  }
 
-  // convert the record value to appropriate type
-  switch (rec_ele->rec_type) {
-  case TS_REC_INT:
-    rec_ele->int_val = *(TSInt *) val;
-    break;
-  case TS_REC_COUNTER:
-    rec_ele->counter_val = *(TSCounter *) val;
-    break;
-  case TS_REC_FLOAT:
-    rec_ele->float_val = *(TSFloat *) val;
-    break;
-  case TS_REC_STRING:
-    rec_ele->string_val = ats_strdup((char *) val);
-    break;
-  default:                     // ERROR - invalid record type
-    return TS_ERR_FAIL;
+  for (;;) {
+    rec_ele = TSRecordEleCreate();
+
+    // parse the reply to get record value and type
+    ret = mgmt_record_get_reply(rec_ele);
+    if (ret != TS_ERR_OKAY) {
+      goto fail;
+    }
+
+    // A NULL record ends the list.
+    if (rec_ele->rec_type == TS_REC_UNDEFINED) {
+      break;
+    }
+
+    enqueue((LLQ *) rec_vals, rec_ele);
   }
 
-  ats_free(val);
   return TS_ERR_OKAY;
-}
 
+fail:
+
+  TSRecordEleDestroy(rec_ele);
+  for (rec_ele = (TSRecordEle *) dequeue((LLQ *) rec_vals); rec_ele; rec_ele = (TSRecordEle *) dequeue((LLQ *) rec_vals)) {
+      TSRecordEleDestroy(rec_ele);
+  }
+
+  return ret;
+}
 
 TSError
 MgmtRecordSet(const char *rec_name, const char *val, TSActionNeedT * action_need)

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/0389be39/mgmt/api/INKMgmtAPI.cc
----------------------------------------------------------------------
diff --git a/mgmt/api/INKMgmtAPI.cc b/mgmt/api/INKMgmtAPI.cc
index 709debc..a466fbd 100644
--- a/mgmt/api/INKMgmtAPI.cc
+++ b/mgmt/api/INKMgmtAPI.cc
@@ -1581,6 +1581,15 @@ TSRecordGetMlt(TSStringList rec_names, TSList rec_vals)
   return TS_ERR_OKAY;
 }
 
+tsapi TSError
+TSRecordGetMatchMlt(const char * regex, TSList rec_vals)
+{
+  if (!regex || !rec_vals) {
+    return TS_ERR_PARAMS;
+  }
+
+  return MgmtRecordGetMatching(regex, rec_vals);
+}
 
 tsapi TSError
 TSRecordSet(const char *rec_name, const char *val, TSActionNeedT * action_need)

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/0389be39/mgmt/api/NetworkUtilsDefs.h
----------------------------------------------------------------------
diff --git a/mgmt/api/NetworkUtilsDefs.h b/mgmt/api/NetworkUtilsDefs.h
index 6f0127b..bd94fdc 100644
--- a/mgmt/api/NetworkUtilsDefs.h
+++ b/mgmt/api/NetworkUtilsDefs.h
@@ -80,6 +80,7 @@ typedef enum
   STATS_RESET_NODE,
   STATS_RESET_CLUSTER,
   STORAGE_DEVICE_CMD_OFFLINE,
+  RECORD_MATCH_GET,
   UNDEFINED_OP /* This must be last */
 } OpType;
 

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/0389be39/mgmt/api/NetworkUtilsLocal.cc
----------------------------------------------------------------------
diff --git a/mgmt/api/NetworkUtilsLocal.cc b/mgmt/api/NetworkUtilsLocal.cc
index 03b4666..3f05d18 100644
--- a/mgmt/api/NetworkUtilsLocal.cc
+++ b/mgmt/api/NetworkUtilsLocal.cc
@@ -513,22 +513,20 @@ send_reply_list(struct SocketInfo sock_info, TSError retval, char *list)
  * output: TS_ERR_*
  * notes: this function does not need to go through the internal structure
  *        so no cleaning up is done.
- *        format = <TSError> <rec_val_len> <rec_type> <rec_val>
+ *        format = <TSError> <rec_val_len> <name_size> <rec_type> <rec_val> <rec_name>
  **********************************************************************/
 TSError
-send_record_get_reply(struct SocketInfo sock_info, TSError retval, void *val, int val_size, TSRecordT rec_type)
+send_record_get_reply(struct SocketInfo sock_info, TSError retval, void *val, int val_size,
+    TSRecordT rec_type, const char *rec_name)
 {
   TSError ret;
   int msg_pos = 0, total_len;
   char *msg;
   int16_t record_t, ret_val;
-  int32_t v_size;                 // to be safe, typecast
+  int32_t v_size = (int32_t) val_size; // to be safe, typecast
+  int32_t n_size = rec_name ? (int32_t)strlen(rec_name) : 0;
 
-  if (!val) {
-    return TS_ERR_PARAMS;
-  }
-
-  total_len = SIZE_ERR_T + SIZE_LEN + SIZE_REC_T + val_size;
+  total_len = SIZE_ERR_T + SIZE_LEN + SIZE_LEN + SIZE_REC_T + v_size + n_size;
   msg = (char *)ats_malloc(sizeof(char) * total_len);
 
   // write the return value
@@ -537,17 +535,29 @@ send_record_get_reply(struct SocketInfo sock_info, TSError retval, void *val, in
   msg_pos += SIZE_ERR_T;
 
   // write the size of the record value
-  v_size = (int32_t) val_size;
   memcpy(msg + msg_pos, (void *) &v_size, SIZE_LEN);
   msg_pos += SIZE_LEN;
 
+  // write the size of the record name
+  memcpy(msg + msg_pos, (void *) &n_size, SIZE_LEN);
+  msg_pos += SIZE_LEN;
+
   // write the record type
   record_t = (int16_t) rec_type;
   memcpy(msg + msg_pos, (void *) &record_t, SIZE_REC_T);
   msg_pos += SIZE_REC_T;
 
   // write the record value
-  memcpy(msg + msg_pos, val, val_size);
+  if (v_size) {
+    memcpy(msg + msg_pos, val, v_size);
+    msg_pos += v_size;
+  }
+
+  // write the record name
+  if (n_size) {
+    memcpy(msg + msg_pos, rec_name, n_size);
+    msg_pos += n_size;
+  }
 
   // now push it to the socket
   ret = socket_write_n(sock_info, msg, total_len);

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/0389be39/mgmt/api/NetworkUtilsLocal.h
----------------------------------------------------------------------
diff --git a/mgmt/api/NetworkUtilsLocal.h b/mgmt/api/NetworkUtilsLocal.h
index 8773bda..805beef 100644
--- a/mgmt/api/NetworkUtilsLocal.h
+++ b/mgmt/api/NetworkUtilsLocal.h
@@ -69,7 +69,7 @@ TSError send_reply(struct SocketInfo sock_info, TSError retval);
 TSError send_reply_list(struct SocketInfo sock_info, TSError retval, char *list);
 
 TSError send_record_get_reply(struct SocketInfo sock_info, TSError retval, void *val, int val_size,
-                               TSRecordT rec_type);
+                               TSRecordT rec_type, const char *rec_name);
 TSError send_record_set_reply(struct SocketInfo sock_info, TSError retval, TSActionNeedT action_need);
 TSError send_file_read_reply(struct SocketInfo sock_info, TSError retval, int ver, int size, char *text);
 TSError send_proxy_state_get_reply(struct SocketInfo sock_info, TSProxyStateT state);