You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2010/09/22 22:29:47 UTC

svn commit: r1000191 - in /trafficserver/traffic/trunk: iocore/eventsystem/I_EThread.h librecords/P_RecDefs.h librecords/RecCore.cc proxy/InkAPI.cc proxy/api/ts/ts.h proxy/mgmt2/RecordsConfig.cc

Author: zwoop
Date: Wed Sep 22 20:29:46 2010
New Revision: 1000191

URL: http://svn.apache.org/viewvc?rev=1000191&view=rev
Log:
TS-390: Implement "new" stats APIs, based on librecords.

Tested: FC13 64-bit.

Modified:
    trafficserver/traffic/trunk/iocore/eventsystem/I_EThread.h
    trafficserver/traffic/trunk/librecords/P_RecDefs.h
    trafficserver/traffic/trunk/librecords/RecCore.cc
    trafficserver/traffic/trunk/proxy/InkAPI.cc
    trafficserver/traffic/trunk/proxy/api/ts/ts.h
    trafficserver/traffic/trunk/proxy/mgmt2/RecordsConfig.cc

Modified: trafficserver/traffic/trunk/iocore/eventsystem/I_EThread.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/eventsystem/I_EThread.h?rev=1000191&r1=1000190&r2=1000191&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/eventsystem/I_EThread.h (original)
+++ trafficserver/traffic/trunk/iocore/eventsystem/I_EThread.h Wed Sep 22 20:29:46 2010
@@ -32,6 +32,8 @@
 #include "I_ProtectedQueue.h"
 #include <vector>
 
+// TODO: This would be much nicer to have "run-time" configurable (or something),
+// perhaps based on proxy.config.stat_api.max_stats_allowed or other configs. XXX
 #define PER_THREAD_DATA (1024*1024)
 
 #define MUTEX_RETRY_DELAY HRTIME_MSECONDS(20)

Modified: trafficserver/traffic/trunk/librecords/P_RecDefs.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/librecords/P_RecDefs.h?rev=1000191&r1=1000190&r2=1000191&view=diff
==============================================================================
--- trafficserver/traffic/trunk/librecords/P_RecDefs.h (original)
+++ trafficserver/traffic/trunk/librecords/P_RecDefs.h Wed Sep 22 20:29:46 2010
@@ -35,7 +35,11 @@
 
 #define REC_MESSAGE_ELE_MAGIC           0xF00DF00D
 
-#define REC_MAX_RECORDS                 3000
+// TODO: We really need to try to make this setting dynamic, based
+// on proxy.config.stat_api.max_stats_allowed (since it's the only
+// variable piece). XXX
+// This allocates 10k for InkAPI stats, 3k for "core" (2x what we use)
+#define REC_MAX_RECORDS                 13000
 
 #define REC_CONFIG_UPDATE_INTERVAL_SEC  3
 #define REC_REMOTE_SYNC_INTERVAL_SEC    5

Modified: trafficserver/traffic/trunk/librecords/RecCore.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/librecords/RecCore.cc?rev=1000191&r1=1000190&r2=1000191&view=diff
==============================================================================
--- trafficserver/traffic/trunk/librecords/RecCore.cc (original)
+++ trafficserver/traffic/trunk/librecords/RecCore.cc Wed Sep 22 20:29:46 2010
@@ -48,6 +48,8 @@ int g_num_update[RECT_MAX];
 
 RecTree *g_records_tree = NULL;
 
+// TODO: This is hugely wasteful, since we most likely don't need all
+// REC_MAX_RECORDS_SLOT for every RECT_MAX "type". XXX
 int g_type_records[RECT_MAX][REC_MAX_RECORDS];
 int g_type_num_records[RECT_MAX];
 

Modified: trafficserver/traffic/trunk/proxy/InkAPI.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/InkAPI.cc?rev=1000191&r1=1000190&r2=1000191&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/InkAPI.cc (original)
+++ trafficserver/traffic/trunk/proxy/InkAPI.cc Wed Sep 22 20:29:46 2010
@@ -118,6 +118,11 @@ static ink_mutex big_mux;
     _HDR.m_http = (HTTPHdrImpl*) _OBJ_PTR; \
     _HDR.m_mime = _HDR.m_http->m_fields_impl;
 
+// Globals for new librecords stats
+volatile int top_stat = 0;
+RecRawStatBlock *api_rsb;
+
+
 /* URL schemes */
 inkapi const char *INK_URL_SCHEME_FILE;
 inkapi const char *INK_URL_SCHEME_FTP;
@@ -1551,6 +1556,8 @@ api_init()
   static int init = 1;
 
   if (init) {
+    int api_stats_size = 0;
+
     init = 0;
 
 #ifndef UNSAFE_FORCE_MUTEX
@@ -1803,6 +1810,12 @@ api_init()
     cache_global_hooks = NEW(new CacheAPIHooks);
     global_config_cbs = NEW(new ConfigUpdateCbTable);
 
+    TS_ReadConfigInteger(api_stats_size, "proxy.config.stat_api.max_stats_allowed");
+    api_rsb = RecAllocateRawStatBlock(api_stats_size);
+    if (NULL == api_rsb) {
+      Warning("Can't allocate API stats block");
+    }
+
     // Setup the version string for returning to plugins
     ink_strncpy(traffic_server_version, appVersionInfo.VersionStr, sizeof(traffic_server_version));
   }
@@ -7172,7 +7185,83 @@ INKMCOPreload(void *context,    // opaqu
 }MCOPreload_fp
 */
 
+/************************   REC Stats API    **************************/
+int
+TSRegisterStat(const char *the_name, TSStatDataType the_type, TSStatPersistence persist, TSStatSync sync)
+{
+  int volatile ix = ink_atomic_increment(&top_stat, 1);
+  RecRawStatSyncCb syncer = RecRawStatSyncCount;
+
+  switch (sync) {
+  case TS_STAT_SYNC_SUM:
+    syncer = RecRawStatSyncSum;
+    break;
+  case TS_STAT_SYNC_AVG:
+    syncer = RecRawStatSyncAvg;
+    break;
+  case TS_STAT_SYNC_TIMEAVG:
+    syncer = RecRawStatSyncHrTimeAvg;
+    break;
+  case TS_STAT_SYNC_MSECS_TO_SECONDS:
+    syncer = RecRawStatSyncIntMsecsToFloatSeconds;
+    break;
+  case TS_STAT_SYNC_MHR_TIMEAVG:
+    syncer = RecRawStatSyncMHrTimeAvg;
+    break;
+  default:
+    syncer = RecRawStatSyncCount;
+    break;
+  }
+  RecRegisterRawStat(api_rsb, RECT_PROCESS, the_name, (RecDataT)the_type, RecPersistT(persist), ix, syncer);
+
+  return ix;
+}
+
+INKReturnCode
+TSStatIntIncrement(int the_stat, INK64 amount)
+{
+  RecIncrRawStat(api_rsb, NULL, the_stat, amount);
+  return INK_SUCCESS;
+}
+
+INKReturnCode
+TSStatIntDecrement(int the_stat, INK64 amount)
+{
+  RecDecrRawStat(api_rsb, NULL, the_stat, amount);
+  return INK_SUCCESS;
+}
+
+INKReturnCode
+TSStatIntGet(int the_stat, INK64* value)
+{
+  RecGetGlobalRawStatSum(api_rsb, the_stat, value);
+  return INK_SUCCESS;
+}
+
+INKReturnCode
+TSStatIntSet(int the_stat, INK64 value)
+{
+  RecSetGlobalRawStatSum(api_rsb, the_stat, value);
+  return INK_SUCCESS;
+}
+
+INKReturnCode
+TSStatCountGet(int the_stat, INK64* value)
+{
+    RecGetGlobalRawStatCount(api_rsb, the_stat, value);
+    return INK_SUCCESS;
+}
+
+INKReturnCode
+TSStatCountSet(int the_stat, INK64 value)
+{
+  RecSetGlobalRawStatCount(api_rsb, the_stat, value);
+  return INK_SUCCESS;
+}
+
+
 /**************************    Stats API    ****************************/
+// THESE APIS ARE ALL DEPRECATED, USE THE REC APIs INSTEAD
 // #define ink_sanity_check_stat_structure(_x) INK_SUCCESS
 
 inline INKReturnCode

Modified: trafficserver/traffic/trunk/proxy/api/ts/ts.h
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/api/ts/ts.h?rev=1000191&r1=1000190&r2=1000191&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/api/ts/ts.h (original)
+++ trafficserver/traffic/trunk/proxy/api/ts/ts.h Wed Sep 22 20:29:46 2010
@@ -2358,55 +2358,125 @@ extern "C"
   inkapi INKReturnCode INKIOBufferReaderConsume(INKIOBufferReader readerp, int nbytes);
   inkapi int INKIOBufferReaderAvail(INKIOBufferReader readerp);
 
+
   /* --------------------------------------------------------------------------
-     stats */
+     Stats based on librecords (this is prefered API until we rewrite stats).
+     This system has a limitation of up to 10,000 stats max, controlled via
+     proxy.config.stat_api.max_stats_allowed (default is 512).
+
+     This is available as of Apache TS v2.2.*/
   typedef enum
-  {
-    INKSTAT_TYPE_INT64,
-    INKSTAT_TYPE_FLOAT
-  } INKStatTypes;
+    {
+      TS_STAT_TYPE_NULL = 0,
+      TS_STAT_TYPE_INT,
+      TS_STAT_TYPE_FLOAT,
+      TS_STAT_TYPE_STRING,
+      TS_STAT_TYPE_COUNTER,
+    } TSStatDataType;
+
+  typedef enum
+    {
+      TS_STAT_PERSISTENT_NULL = 0,
+      TS_STAT_PERSISTENT,
+      TS_STAT_NON_PERSISTENT
+    } TSStatPersistence;
+
+  typedef enum
+    {
+      TS_STAT_SYNC_SUM = 0,
+      TS_STAT_SYNC_COUNT,
+      TS_STAT_SYNC_AVG,
+      TS_STAT_SYNC_TIMEAVG,
+      TS_STAT_SYNC_MSECS_TO_SECONDS,
+      TS_STAT_SYNC_MHR_TIMEAVG
+    } TSStatSync;
+
+  inkapi int TSRegisterStat(const char *the_name, TSStatDataType the_type, TSStatPersistence persist, TSStatSync sync);
+
+  inkapi INKReturnCode TSStatIntIncrement(int the_stat, INK64 amount);
+  inkapi INKReturnCode TSStatIntDecrement(int the_stat, INK64 amount);
+  inkapi INKReturnCode TSStatFloatIncrement(int the_stat, float amount);
+  inkapi INKReturnCode TSStatFloatDecrement(int the_stat, float amount);
+
+  inkapi INKReturnCode TSStatIntGet(int the_stat, INK64* value);
+  inkapi INKReturnCode TSStatIntSet(int the_stat, INK64 value);
+  inkapi INKReturnCode TSStatFloatGet(int the_stat, float* value);
+  inkapi INKReturnCode TSStatFloatSet(int the_stat, float value);
+
+  inkapi INKReturnCode TSStatCountGet(int the_stat, INK64* count);
+  inkapi INKReturnCode TSStatCountSet(int the_stat, INK64 count);
+
+
+  /* --------------------------------------------------------------------------
+     This is an experimental stat system, which is not compatible with standard
+     TS stats. It is disabled by default, enable it with --with_v2_stats at
+     configure time. */
+  inkapi INKReturnCode     INKStatCreateV2(const char *name, uint32_t *stat_num);
+  inkapi INKReturnCode     INKStatIncrementV2(uint32_t stat_num, INK64 inc_by);
+  inkapi INKReturnCode     INKStatIncrementByNameV2(const char *stat_name, INK64 inc_by);
+  inkapi INKReturnCode     INKStatDecrementV2(uint32_t stat_num, INK64 dec_by);
+  inkapi INKReturnCode     INKStatDecrementByNameV2(const char *stat_name, INK64 dec_by);
+  inkapi INKReturnCode     INKStatGetCurrentV2(uint32_t stat_num, INK64 *stat_val);
+  inkapi INKReturnCode     INKStatGetCurrentByNameV2(const char *stat_name, INK64 *stat_val);
+  inkapi INKReturnCode     INKStatGetV2(uint32_t stat_num, INK64 *stat_val);
+  inkapi INKReturnCode     INKStatGetByNameV2(const char *stat_name, INK64 *stat_val);
+
+
+  /* --------------------------------------------------------------------------
+     This is the old stats system, it's completely deprecated, and should not
+     be used. It has serious limitations both in scalability and performance. */
+  typedef enum
+    {
+      INKSTAT_TYPE_INT64,
+      INKSTAT_TYPE_FLOAT
+    } INKStatTypes;
 
   typedef void *INKStat;
   typedef void *INKCoupledStat;
 
   /* --------------------------------------------------------------------------
      uncoupled stats */
+  /** @deprecated */
   inkapi INKStat INKStatCreate(const char *the_name, INKStatTypes the_type);
+  /** @deprecated */
   inkapi INKReturnCode INKStatIntAddTo(INKStat the_stat, INK64 amount);
+  /** @deprecated */
   inkapi INKReturnCode INKStatFloatAddTo(INKStat the_stat, float amount);
+  /** @deprecated */
   inkapi INKReturnCode INKStatDecrement(INKStat the_stat);
+  /** @deprecated */
   inkapi INKReturnCode INKStatIncrement(INKStat the_stat);
+  /** @deprecated */
   inkapi INKReturnCode INKStatIntGet(INKStat the_stat, INK64 * value);
+  /** @deprecated */
   inkapi INKReturnCode INKStatFloatGet(INKStat the_stat, float *value);
+  /** @deprecated */
+  inkapi INKReturnCode INKStatIntSet(INKStat the_stat, INK64 value);
+  /** @deprecated */
+  inkapi INKReturnCode INKStatFloatSet(INKStat the_stat, float value);
 
+  /** These were removed with the old version of TS */
   /** @deprecated */
   inkapi INK_DEPRECATED INK64 INKStatIntRead(INKStat the_stat);
 
   /** @deprecated */
   inkapi INK_DEPRECATED float INKStatFloatRead(INKStat the_stat);
 
-  inkapi INKReturnCode INKStatIntSet(INKStat the_stat, INK64 value);
-  inkapi INKReturnCode INKStatFloatSet(INKStat the_stat, float value);
-
   /* --------------------------------------------------------------------------
      coupled stats */
+  /** @deprecated */
   inkapi INKCoupledStat INKStatCoupledGlobalCategoryCreate(const char *the_name);
+  /** @deprecated */
   inkapi INKCoupledStat INKStatCoupledLocalCopyCreate(const char *the_name, INKCoupledStat global_copy);
+  /** @deprecated */
   inkapi INKReturnCode INKStatCoupledLocalCopyDestroy(INKCoupledStat local_copy);
+  /** @deprecated */
   inkapi INKStat INKStatCoupledGlobalAdd(INKCoupledStat global_copy, const char *the_name, INKStatTypes the_type);
+  /** @deprecated */
   inkapi INKStat INKStatCoupledLocalAdd(INKCoupledStat local_copy, const char *the_name, INKStatTypes the_type);
+  /** @deprecated */
   inkapi INKReturnCode INKStatsCoupledUpdate(INKCoupledStat local_copy);
 
-  /* new stat system */
-  inkapi INKReturnCode     INKStatCreateV2(const char *name, uint32_t *stat_num);
-  inkapi INKReturnCode     INKStatIncrementV2(uint32_t stat_num, INK64 inc_by);
-  inkapi INKReturnCode     INKStatIncrementByNameV2(const char *stat_name, INK64 inc_by);
-  inkapi INKReturnCode     INKStatDecrementV2(uint32_t stat_num, INK64 dec_by);
-  inkapi INKReturnCode     INKStatDecrementByNameV2(const char *stat_name, INK64 dec_by);
-  inkapi INKReturnCode     INKStatGetCurrentV2(uint32_t stat_num, INK64 *stat_val);
-  inkapi INKReturnCode     INKStatGetCurrentByNameV2(const char *stat_name, INK64 *stat_val);
-  inkapi INKReturnCode     INKStatGetV2(uint32_t stat_num, INK64 *stat_val);
-  inkapi INKReturnCode     INKStatGetByNameV2(const char *stat_name, INK64 *stat_val);
 
   /* --------------------------------------------------------------------------
      tracing api */

Modified: trafficserver/traffic/trunk/proxy/mgmt2/RecordsConfig.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/proxy/mgmt2/RecordsConfig.cc?rev=1000191&r1=1000190&r2=1000191&view=diff
==============================================================================
--- trafficserver/traffic/trunk/proxy/mgmt2/RecordsConfig.cc (original)
+++ trafficserver/traffic/trunk/proxy/mgmt2/RecordsConfig.cc Wed Sep 22 20:29:46 2010
@@ -2986,11 +2986,19 @@ RecordElement RecordsConfig[] = {
   {CONFIG, "proxy.config.prefetch.redirection", "", INK_INT, "0", RU_NULL, RR_NULL, RC_NULL, NULL, RA_NULL}
   ,
 
+  // librecords based stats system
+  {CONFIG, "proxy.config.stat_api.max_stats_allowed", "", INK_INT, "512", RU_RESTART_TS, RR_NULL, RC_NULL, "[256-10000]", RA_NULL}
+  ,
+
   // StatSystemV2 config
-  {CONFIG, "proxy.config.stat_collector.interval", "", INK_INT, "600", RU_NULL, RR_NULL, RC_NULL, NULL, RA_NULL},
-  {CONFIG, "proxy.config.stat_collector.port", "", INK_INT, "8091", RU_NULL, RR_NULL, RC_NULL, NULL, RA_NULL},
-  {CONFIG, "proxy.config.stat_systemV2.max_stats_allowed", "", INK_INT, "0", RU_NULL, RR_NULL, RC_NULL, NULL, RA_NULL},
-  {CONFIG, "proxy.config.stat_systemV2.num_stats_estimate", "", INK_INT, "0", RU_NULL, RR_NULL, RC_NULL, NULL, RA_NULL},
+  {CONFIG, "proxy.config.stat_collector.interval", "", INK_INT, "600", RU_NULL, RR_NULL, RC_NULL, NULL, RA_NULL}
+  ,
+  {CONFIG, "proxy.config.stat_collector.port", "", INK_INT, "8091", RU_NULL, RR_NULL, RC_NULL, NULL, RA_NULL}
+  ,
+  {CONFIG, "proxy.config.stat_systemV2.max_stats_allowed", "", INK_INT, "0", RU_NULL, RR_NULL, RC_NULL, NULL, RA_NULL}
+  ,
+  {CONFIG, "proxy.config.stat_systemV2.num_stats_estimate", "", INK_INT, "0", RU_NULL, RR_NULL, RC_NULL, NULL, RA_NULL}
+  ,
 
   //############
   //#