Skip to content

Commit

Permalink
trace memcache sets
Browse files Browse the repository at this point in the history
  • Loading branch information
tmm1 committed Apr 24, 2010
1 parent c71bc53 commit c2815e2
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 20 deletions.
70 changes: 50 additions & 20 deletions ext/tracers/memcache.c
Expand Up @@ -15,12 +15,16 @@
struct memprof_memcache_stats { struct memprof_memcache_stats {
size_t get_calls; size_t get_calls;
size_t get_responses[45]; size_t get_responses[45];

size_t set_calls;
size_t set_responses[45];
}; };


static struct tracer tracer; static struct tracer tracer;
static struct memprof_memcache_stats stats; static struct memprof_memcache_stats stats;
static const char* (*_memcached_lib_version)(void); static const char* (*_memcached_lib_version)(void);
static char* (*_memcached_get)(void *ptr, const char *key, size_t key_length, size_t *value_length, uint32_t *flags, void *error); static char* (*_memcached_get)(void *ptr, const char *key, size_t key_length, size_t *value_length, uint32_t *flags, void *error);
static int (*_memcached_set)(void *ptr, const char *key, size_t key_length, const char *value, size_t value_length, time_t expiration, uint32_t flags);


static char* static char*
memcached_get_tramp(void *ptr, const char *key, size_t key_length, size_t *value_length, uint32_t *flags, void *error) memcached_get_tramp(void *ptr, const char *key, size_t key_length, size_t *value_length, uint32_t *flags, void *error)
Expand All @@ -32,6 +36,15 @@ memcached_get_tramp(void *ptr, const char *key, size_t key_length, size_t *value
return ret; return ret;
} }


static int
memcached_set_tramp(void *ptr, const char *key, size_t key_length, const char *value, size_t value_length, time_t expiration, uint32_t flags)
{
int ret = _memcached_set(ptr, key, key_length, value, value_length, expiration, flags);
stats.set_calls++;
stats.set_responses[ret > 42 ? 44 : ret]++;
return ret;
}

static void static void
memcache_trace_start() { memcache_trace_start() {
static int inserted = 0; static int inserted = 0;
Expand All @@ -47,6 +60,9 @@ memcache_trace_start() {
if (strcmp(version, "0.32") == 0) { if (strcmp(version, "0.32") == 0) {
_memcached_get = bin_find_symbol("memcached_get", NULL, 1); _memcached_get = bin_find_symbol("memcached_get", NULL, 1);
insert_tramp("memcached_get", memcached_get_tramp); insert_tramp("memcached_get", memcached_get_tramp);

_memcached_set = bin_find_symbol("memcached_set", NULL, 1);
insert_tramp("memcached_set", memcached_set_tramp);
} }
} }
} }
Expand All @@ -61,35 +77,49 @@ memcache_trace_reset() {
} }


static void static void
memcache_trace_dump(yajl_gen gen) { memcache_trace_dump_results(yajl_gen gen, size_t responses[])
{
int i; int i;
yajl_gen_cstr(gen, "responses");
yajl_gen_map_open(gen);
for (i=0; i < 45; i++) {
if (responses[i]) {
switch (i) {
case 0:
yajl_gen_cstr(gen, "success");
break;
case 16:
yajl_gen_cstr(gen, "notfound");
break;
case 44:
yajl_gen_cstr(gen, "unknown");
break;
default:
yajl_gen_format(gen, "%d", i);
}
yajl_gen_integer(gen, responses[i]);
}
}
yajl_gen_map_close(gen);
}


static void
memcache_trace_dump(yajl_gen gen) {
if (stats.get_calls > 0) { if (stats.get_calls > 0) {
yajl_gen_cstr(gen, "get"); yajl_gen_cstr(gen, "get");

yajl_gen_map_open(gen); yajl_gen_map_open(gen);
yajl_gen_cstr(gen, "calls"); yajl_gen_cstr(gen, "calls");
yajl_gen_integer(gen, stats.get_calls); yajl_gen_integer(gen, stats.get_calls);

memcache_trace_dump_results(gen, stats.get_responses);
yajl_gen_cstr(gen, "responses");
yajl_gen_map_open(gen);
for (i=0; i < 45; i++) {
if (stats.get_responses[i]) {
switch (i) {
case 0:
yajl_gen_cstr(gen, "success");
break;
case 16:
yajl_gen_cstr(gen, "notfound");
break;
default:
yajl_gen_format(gen, "%d", i);
}
yajl_gen_integer(gen, stats.get_responses[i]);
}
}
yajl_gen_map_close(gen); yajl_gen_map_close(gen);
}


if (stats.set_calls > 0) {
yajl_gen_cstr(gen, "set");
yajl_gen_map_open(gen);
yajl_gen_cstr(gen, "calls");
yajl_gen_integer(gen, stats.set_calls);
memcache_trace_dump_results(gen, stats.set_responses);
yajl_gen_map_close(gen); yajl_gen_map_close(gen);
} }
} }
Expand Down
1 change: 1 addition & 0 deletions spec/tracing_spec.rb
Expand Up @@ -88,6 +88,7 @@ def filedata
end end


filedata.should =~ /"memcache":\{"get":\{"calls":2,"responses":\{"success":1,"notfound":1/ filedata.should =~ /"memcache":\{"get":\{"calls":2,"responses":\{"success":1,"notfound":1/
filedata.should =~ /"set":\{"calls":1,"responses":\{"success":1/
end end
rescue Memcached::SomeErrorsWereReported rescue Memcached::SomeErrorsWereReported
end end
Expand Down

0 comments on commit c2815e2

Please sign in to comment.