journalist 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.consolerc +12 -1
- data/ext/journalist/allocations.c +12 -11
- data/ext/journalist/calls.c +23 -28
- data/ext/journalist/calls.h +2 -0
- data/ext/journalist/extconf.rb +2 -0
- data/ext/journalist/garbage_collection.c +5 -16
- data/ext/journalist/journalist.c +8 -0
- data/ext/journalist/journalist.h +2 -1
- data/ext/journalist/socket.c +75 -2
- data/ext/journalist/socket.h +3 -1
- data/lib/journalist/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 95517034abf866395da885dd6c76b4dc4f247dc9
|
4
|
+
data.tar.gz: 05e3d8fc5475524bd32a85d2d44c30bdfd565b8e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f3675511414ae3db9d0b011e9c89c4c36279137bd76d636b186a8db5fbc63e66477c62fd3922f255fa8d8c9b24cb5f401a45eb708b6f3e71881d1394504aae80
|
7
|
+
data.tar.gz: 67ceccb11555c8e7bacdb5a398fafeb05fbf57a0c7208c5e2e53aba77452648f7ddb363e76cb77983b1a7cd02655f1731fd70c8ea21b83db7e98befca5b3696b
|
data/.consolerc
CHANGED
@@ -1,10 +1,21 @@
|
|
1
1
|
def start
|
2
2
|
Journalist.start
|
3
|
-
stress_gc
|
4
3
|
end
|
5
4
|
|
6
5
|
def stress_gc
|
7
6
|
100_000.times { "foo" }
|
8
7
|
end
|
9
8
|
|
9
|
+
def fibo(num)
|
10
|
+
if num < 2
|
11
|
+
num
|
12
|
+
else
|
13
|
+
fibo(num-1) + fibo(num-2)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def slow
|
18
|
+
fibo(34) # Slow enough on my computer
|
19
|
+
end
|
20
|
+
|
10
21
|
puts "Fixtures loaded"
|
@@ -76,7 +76,7 @@ journalist_on_newobj(VALUE tpval, void *data) {
|
|
76
76
|
|
77
77
|
static void
|
78
78
|
journalist_on_freeobj(VALUE tpval, void *data) {
|
79
|
-
//
|
79
|
+
// TODO: Keep track of how many objects were freed and aggregate that info.
|
80
80
|
}
|
81
81
|
|
82
82
|
static int
|
@@ -85,11 +85,12 @@ journalist_allocations_send_locations(st_data_t key, st_data_t value, st_data_t
|
|
85
85
|
char *location = (char *)key;
|
86
86
|
int total = (int)value;
|
87
87
|
|
88
|
-
|
89
|
-
|
90
|
-
type,
|
91
|
-
|
92
|
-
|
88
|
+
rb_journalist_socket_send(3,
|
89
|
+
"newobj_loc",
|
90
|
+
"type", 's', type,
|
91
|
+
"location", 's', location,
|
92
|
+
"count", 'i', total
|
93
|
+
);
|
93
94
|
|
94
95
|
return ST_CONTINUE;
|
95
96
|
}
|
@@ -99,11 +100,11 @@ journalist_allocations_send_types(st_data_t key, st_data_t value, st_data_t _) {
|
|
99
100
|
char *type = (char *)key;
|
100
101
|
aggregation_entry_t *entry = (aggregation_entry_t *)value;
|
101
102
|
|
102
|
-
|
103
|
-
|
104
|
-
type,
|
105
|
-
|
106
|
-
|
103
|
+
rb_journalist_socket_send(2,
|
104
|
+
"newobj",
|
105
|
+
"type", 's', type,
|
106
|
+
"total", 'i', entry->total
|
107
|
+
);
|
107
108
|
|
108
109
|
st_foreach(entry->locations, journalist_allocations_send_locations, key);
|
109
110
|
st_free_table(entry->locations);
|
data/ext/journalist/calls.c
CHANGED
@@ -5,17 +5,23 @@ static struct {
|
|
5
5
|
VALUE c_return;
|
6
6
|
} calls_tp_hook;
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
// even benchmark how long calls take and only output the info on return.)
|
11
|
-
static int stack_size = 0;
|
12
|
-
|
13
|
-
const char c_call_fmt[] = "c_call: "
|
14
|
-
"class %s method %s class_method %d stack_depth %d "
|
15
|
-
"path %s line %d\n";
|
8
|
+
static uint64_t call_times[MAX_CALLS] = {0};
|
9
|
+
static int call_count = 0;
|
16
10
|
|
17
11
|
static void
|
18
12
|
journalist_on_call_c_call(VALUE tpval, void *data) {
|
13
|
+
call_times[call_count] = ru_utime_usec();
|
14
|
+
call_count++;
|
15
|
+
}
|
16
|
+
|
17
|
+
static void
|
18
|
+
journalist_on_call_c_return(VALUE tpval, void *data) {
|
19
|
+
if(call_count == 0) return;
|
20
|
+
call_count--;
|
21
|
+
|
22
|
+
uint64_t diff = ru_utime_usec() - call_times[call_count];
|
23
|
+
if(diff < 250000) return;
|
24
|
+
|
19
25
|
rb_trace_arg_t *tparg = rb_tracearg_from_tracepoint(tpval);
|
20
26
|
|
21
27
|
VALUE self = rb_tracearg_self(tparg);
|
@@ -24,27 +30,16 @@ journalist_on_call_c_call(VALUE tpval, void *data) {
|
|
24
30
|
VALUE lineno = rb_tracearg_lineno(tparg);
|
25
31
|
bool singleton = TYPE(self) == T_CLASS || TYPE(self) == T_MODULE;
|
26
32
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
33
|
+
rb_journalist_socket_send(7,
|
34
|
+
"slow_cpu",
|
35
|
+
"class", 's', rb_obj_classname(self),
|
36
|
+
"method", 's', rb_id2name(SYM2ID(method_id)),
|
37
|
+
"class_method", 'b', singleton,
|
38
|
+
"stack_depth", 'i', call_count,
|
39
|
+
"path", 's', RSTRING_PTR(path),
|
40
|
+
"line", 'i', NUM2INT(lineno),
|
41
|
+
"diff", 't', diff
|
36
42
|
);
|
37
|
-
|
38
|
-
rb_journalist_socket_send(buffer);
|
39
|
-
stack_size++;
|
40
|
-
}
|
41
|
-
|
42
|
-
static void
|
43
|
-
journalist_on_call_c_return(VALUE tpval, void *data) {
|
44
|
-
if(stack_size == 0) return;
|
45
|
-
|
46
|
-
rb_journalist_socket_send("c_return\n");
|
47
|
-
stack_size--;
|
48
43
|
}
|
49
44
|
|
50
45
|
void
|
data/ext/journalist/calls.h
CHANGED
data/ext/journalist/extconf.rb
CHANGED
@@ -31,32 +31,23 @@ static VALUE sym_count,
|
|
31
31
|
sym_oldmalloc_increase,
|
32
32
|
sym_oldmalloc_limit;
|
33
33
|
|
34
|
-
const char gc_end_sweep_fmt[] = "gc_end_sweep: "
|
35
|
-
"count %d heap_used %d heap_length %d heap_live_slot %d heap_free_slot %d "
|
36
|
-
"heap_final_slot %d heap_swept_slot %d total_allocated_object %d "
|
37
|
-
"total_freed_object %d malloc_increase %d malloc_limit %d "
|
38
|
-
"minor_gc_count %d major_gc_count %d remembered_shady_object %d "
|
39
|
-
"remembered_shady_object_limit %d old_object %d old_object_limit %d "
|
40
|
-
"oldmalloc_increase %d oldmalloc_limit %d\n";
|
41
|
-
|
42
34
|
static void
|
43
35
|
journalist_on_gc_start(VALUE tpval, void *data) {
|
44
|
-
rb_journalist_socket_send("gc_start
|
36
|
+
rb_journalist_socket_send(0, "gc_start");
|
45
37
|
}
|
46
38
|
|
47
39
|
static void
|
48
40
|
journalist_on_gc_end_mark(VALUE tpval, void *data) {
|
49
|
-
rb_journalist_socket_send("gc_mark
|
41
|
+
rb_journalist_socket_send(0, "gc_mark");
|
50
42
|
}
|
51
43
|
|
52
44
|
static void
|
53
45
|
journalist_on_gc_end_sweep(VALUE tpval, void *data) {
|
54
|
-
char buffer[4096];
|
55
46
|
rb_gc_stat(cookie.gc);
|
56
47
|
|
57
|
-
#define STAT(name) NUM2INT(rb_hash_aref(cookie.gc, sym_##name))
|
58
|
-
|
59
|
-
|
48
|
+
#define STAT(name) #name, 'i', NUM2INT(rb_hash_aref(cookie.gc, sym_##name))
|
49
|
+
rb_journalist_socket_send(19,
|
50
|
+
"gc_end_sweep",
|
60
51
|
STAT(count),
|
61
52
|
STAT(heap_used),
|
62
53
|
STAT(heap_length),
|
@@ -78,8 +69,6 @@ journalist_on_gc_end_sweep(VALUE tpval, void *data) {
|
|
78
69
|
STAT(oldmalloc_limit)
|
79
70
|
);
|
80
71
|
#undef STAT
|
81
|
-
|
82
|
-
rb_journalist_socket_send(buffer);
|
83
72
|
}
|
84
73
|
|
85
74
|
void
|
data/ext/journalist/journalist.c
CHANGED
@@ -47,3 +47,11 @@ timeofday_usec() {
|
|
47
47
|
return (uint64_t)tv.tv_sec*1e6 +
|
48
48
|
(uint64_t)tv.tv_usec;
|
49
49
|
}
|
50
|
+
|
51
|
+
uint64_t
|
52
|
+
ru_utime_usec() {
|
53
|
+
struct rusage r_usage;
|
54
|
+
getrusage(RUSAGE_SELF, &r_usage);
|
55
|
+
return (uint64_t)r_usage.ru_utime.tv_sec*1e6 +
|
56
|
+
(uint64_t)r_usage.ru_utime.tv_usec;
|
57
|
+
}
|
data/ext/journalist/journalist.h
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
#ifndef JOURNALIST_H
|
2
2
|
#define JOURNALIST_H 1
|
3
3
|
|
4
|
+
#include <inttypes.h>
|
4
5
|
#include <pthread.h>
|
5
6
|
#include <stdbool.h>
|
6
7
|
#include <stdio.h>
|
@@ -16,5 +17,5 @@
|
|
16
17
|
#include "socket.h"
|
17
18
|
|
18
19
|
uint64_t timeofday_usec();
|
19
|
-
|
20
|
+
uint64_t ru_utime_usec();
|
20
21
|
#endif /* JOURNALIST_H */
|
data/ext/journalist/socket.c
CHANGED
@@ -5,8 +5,14 @@ static pthread_mutex_t sock_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
5
5
|
FILE *journalist_file;
|
6
6
|
static char journalist_file_path_fmt[] = "/tmp/journalist-%d";
|
7
7
|
|
8
|
+
yajl_gen gen;
|
9
|
+
|
8
10
|
void
|
9
11
|
rb_journalist_socket_init() {
|
12
|
+
|
13
|
+
gen = yajl_gen_alloc(NULL);
|
14
|
+
yajl_gen_config(gen, yajl_gen_beautify, 0);
|
15
|
+
|
10
16
|
pid_t pid = getpid();
|
11
17
|
|
12
18
|
char path[1024];
|
@@ -21,11 +27,78 @@ rb_journalist_socket_init() {
|
|
21
27
|
}
|
22
28
|
|
23
29
|
void
|
24
|
-
rb_journalist_socket_send(char *
|
30
|
+
rb_journalist_socket_send(int count, char *event, ...)
|
31
|
+
{
|
25
32
|
pthread_mutex_lock(&sock_mutex);
|
26
33
|
|
27
|
-
|
34
|
+
yajl_gen_map_open(gen);
|
35
|
+
|
36
|
+
yajl_gen_string(gen, (const unsigned char *)"event", 5);
|
37
|
+
yajl_gen_string(gen, (const unsigned char *)event, strlen(event));
|
38
|
+
|
39
|
+
if(count > 0) {
|
40
|
+
va_list arguments;
|
41
|
+
va_start(arguments, event);
|
42
|
+
|
43
|
+
char buf[32];
|
44
|
+
char *key;
|
45
|
+
int type;
|
46
|
+
size_t length;
|
47
|
+
|
48
|
+
char *string;
|
49
|
+
int integer;
|
50
|
+
uint64_t uint64;
|
51
|
+
|
52
|
+
int i;
|
53
|
+
|
54
|
+
for(i = 0; i < count; i++) {
|
55
|
+
key = va_arg(arguments, char *);
|
56
|
+
type = va_arg(arguments, int);
|
57
|
+
|
58
|
+
yajl_gen_string(gen, (const unsigned char *)key, strlen(key));
|
59
|
+
|
60
|
+
switch(type) {
|
61
|
+
case 's':
|
62
|
+
string = va_arg(arguments, char *);
|
63
|
+
length = strlen(string);
|
64
|
+
|
65
|
+
yajl_gen_string(gen, (const unsigned char *)string, length);
|
66
|
+
break;
|
67
|
+
|
68
|
+
case 'i':
|
69
|
+
integer = va_arg(arguments, int);
|
70
|
+
sprintf(buf, "%d", integer);
|
71
|
+
length = strlen(buf);
|
72
|
+
|
73
|
+
yajl_gen_number(gen, buf, length);
|
74
|
+
break;
|
75
|
+
|
76
|
+
case 'b':
|
77
|
+
yajl_gen_bool(gen, va_arg(arguments, int));
|
78
|
+
break;
|
79
|
+
|
80
|
+
case 't':
|
81
|
+
uint64 = va_arg(arguments, uint64_t);
|
82
|
+
sprintf(buf, "%" PRIu64, uint64);
|
83
|
+
length = strlen(buf);
|
84
|
+
|
85
|
+
yajl_gen_number(gen, buf, length);
|
86
|
+
break;
|
87
|
+
}
|
88
|
+
}
|
89
|
+
}
|
90
|
+
|
91
|
+
yajl_gen_map_close(gen);
|
92
|
+
|
93
|
+
const unsigned char *buffer;
|
94
|
+
size_t length;
|
95
|
+
|
96
|
+
yajl_gen_get_buf(gen, &buffer, &length);
|
97
|
+
|
98
|
+
fprintf(journalist_file, "%s\n", buffer);
|
28
99
|
fflush(journalist_file);
|
29
100
|
|
101
|
+
yajl_gen_clear(gen);
|
102
|
+
yajl_gen_reset(gen, "");
|
30
103
|
pthread_mutex_unlock(&sock_mutex);
|
31
104
|
}
|
data/ext/journalist/socket.h
CHANGED
@@ -5,9 +5,11 @@
|
|
5
5
|
#include <string.h>
|
6
6
|
#include <unistd.h>
|
7
7
|
|
8
|
+
#include "yajl_gen.h"
|
9
|
+
|
8
10
|
#include "journalist.h"
|
9
11
|
|
10
12
|
void rb_journalist_socket_init();
|
11
|
-
void rb_journalist_socket_send(char *
|
13
|
+
void rb_journalist_socket_send(int count, char *event, ...);
|
12
14
|
|
13
15
|
#endif /* SOCKET_H */
|
data/lib/journalist/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: journalist
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andre Medeiros
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-09-
|
11
|
+
date: 2014-09-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|