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}
+ ,
//############
//#