fast-stats 1.7 → 1.9

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2333c25bd11e2269552ec7a993f4669e7678a46e
4
- data.tar.gz: 24b6f8bfcb9394f491696f0db9a8c821b5fce972
3
+ metadata.gz: d927911272d5a002dc8c65081daf6ef427a45eeb
4
+ data.tar.gz: ea6b385bb0459ea4c0e298d873b06f6dc106e241
5
5
  SHA512:
6
- metadata.gz: bb6441cdf70869f5520ae8c27ff87df3d7b9c3c662186ee48e870ee8532f2dac9fbb32b9ede05c5d7c8d385893775c66af0b552211acfc3d9e845f235d601132
7
- data.tar.gz: d1d9c73c37d20620009fa0db0ece7039757c41c5096916c5eb1bf106ba2f2c7cef16f6912735d6f4d6e838b154bf26368b38f3fb8dccb299036b42ff987b60fa
6
+ metadata.gz: 2072ef0aede7cb79bc0bb90b82954782bf7cd44ec572aa29cc4526e11c4767924b09082a8571052a0b81f632d608c2f47c80c0bca853cbf2e2e6464501fa66af
7
+ data.tar.gz: 24bde670ea0a91aae2df662800bdf154a60856fc15eb0adaef234582683feded041669a8ac9427ef06b397781e0c4a4c6adb81bde3056e21de53f75541949e74
data/Makefile CHANGED
@@ -6,6 +6,7 @@ $(info gem version is $(GEMVERSION))
6
6
  all: build test
7
7
 
8
8
  build: copy-lib-files
9
+ -gem uninstall fast-stats -v $(GEMVERSION)
9
10
  gem build fast-stats.gemspec
10
11
  gem install fast-stats-$(GEMVERSION).gem
11
12
 
@@ -10,6 +10,7 @@
10
10
  static VALUE stats_class = Qnil;
11
11
  static VALUE ctr_class = Qnil;
12
12
  static VALUE tmr_class = Qnil;
13
+ static VALUE sample_class = Qnil;
13
14
 
14
15
  #define STATS_MAGIC 'stat'
15
16
  #define CTR_MAGIC 'ctr '
@@ -37,6 +38,9 @@ static void rbctr_free(void *p);
37
38
  static VALUE rbtmr_alloc(struct stats_counter *counter);
38
39
  static void rbtmr_free(void *p);
39
40
 
41
+ static VALUE rbsample_alloc(struct stats_counter_list *cl, struct stats_sample *sample);
42
+ static void rbsample_free(void *p);
43
+
40
44
 
41
45
  static int hash_probe(struct rbstats *stats, const char *key, long len)
42
46
  {
@@ -395,6 +399,52 @@ static VALUE rbstats_clr(VALUE self, VALUE rbkey)
395
399
  }
396
400
 
397
401
 
402
+ static VALUE rbstats_sample(VALUE self)
403
+ {
404
+ struct rbstats *stats;
405
+ struct stats_counter_list *cl = NULL;
406
+ struct stats_sample *sample = NULL;
407
+ VALUE ret = Qnil;
408
+
409
+ stats = rbstats_get_wrapped_stats(self);
410
+ if (!stats)
411
+ goto exit;
412
+
413
+ if (stats_cl_create(&cl) != S_OK)
414
+ goto exit;
415
+
416
+ if (stats_get_counter_list(stats->stats, cl) != S_OK)
417
+ goto exit;
418
+
419
+ if (stats_sample_create(&sample) != S_OK)
420
+ goto exit;
421
+
422
+ if (stats_get_sample(stats->stats, cl, sample) != S_OK)
423
+ goto exit;
424
+
425
+ ret = rbsample_alloc(cl, sample);
426
+ if (ret != Qnil)
427
+ {
428
+ cl = NULL;
429
+ sample = NULL;
430
+ }
431
+
432
+ exit:
433
+ if (cl != NULL)
434
+ {
435
+ stats_cl_free(cl);
436
+ }
437
+
438
+ if (sample != NULL)
439
+ {
440
+ stats_sample_free(sample);
441
+ }
442
+
443
+ return ret;
444
+ }
445
+
446
+
447
+
398
448
  /******************************************************************
399
449
  *
400
450
  * Ruby Counter
@@ -439,6 +489,16 @@ VALUE rbctr_clr(VALUE self)
439
489
  return self;
440
490
  }
441
491
 
492
+ VALUE rbctr_get(VALUE self)
493
+ {
494
+ struct stats_counter *counter = NULL;
495
+ long long val;
496
+
497
+ Data_Get_Struct(self, struct stats_counter, counter);
498
+ val = counter_get_value(counter);
499
+ return LONG2FIX(val);
500
+ }
501
+
442
502
  VALUE rbctr_set(VALUE self, VALUE amt)
443
503
  {
444
504
  struct stats_counter *counter = NULL;
@@ -472,15 +532,18 @@ struct timer_data
472
532
 
473
533
  static VALUE rbtmr_alloc(struct stats_counter *counter)
474
534
  {
475
- VALUE tdata;
535
+ VALUE tdata = Qnil;
476
536
  struct timer_data *td;
477
537
 
478
538
  td = (struct timer_data *)malloc(sizeof(struct timer_data));
479
- td->counter = counter;
480
- td->start_time = 0;
481
- td->depth = 0;
539
+ if (td)
540
+ {
541
+ td->counter = counter;
542
+ td->start_time = 0;
543
+ td->depth = 0;
482
544
 
483
- tdata = Data_Wrap_Struct(tmr_class, 0, rbtmr_free, td);
545
+ tdata = Data_Wrap_Struct(tmr_class, 0, rbtmr_free, td);
546
+ }
484
547
 
485
548
  return tdata;
486
549
  }
@@ -531,11 +594,144 @@ static void rbtmr_free(void *p)
531
594
  free(p);
532
595
  }
533
596
 
597
+
598
+ /******************************************************************
599
+ *
600
+ * Ruby Sample
601
+ *
602
+ */
603
+
604
+ struct rb_sample_data
605
+ {
606
+ struct stats_counter_list *cl;
607
+ struct stats_sample *sample;
608
+ };
609
+
610
+
611
+ static VALUE rbsample_alloc(struct stats_counter_list *cl, struct stats_sample *sample)
612
+ {
613
+ VALUE tdata = Qnil;
614
+ struct rb_sample_data *sd;
615
+
616
+ sd = (struct rb_sample_data *) malloc(sizeof(struct rb_sample_data));
617
+ if (sd)
618
+ {
619
+ sd->cl = cl;
620
+ sd->sample = sample;
621
+ tdata = Data_Wrap_Struct(sample_class, 0, rbsample_free, sd);
622
+ }
623
+
624
+ return tdata;
625
+ }
626
+
627
+ static void rbsample_free(void *p)
628
+ {
629
+ struct rb_sample_data *d = (struct rb_sample_data *)p;
630
+ stats_cl_free(d->cl);
631
+ stats_sample_free(d->sample);
632
+ free(d);
633
+ }
634
+
635
+ static VALUE rbsample_keys(VALUE self)
636
+ {
637
+ struct rb_sample_data *sd = NULL;
638
+ VALUE keys;
639
+ int i;
640
+ char counter_name[MAX_COUNTER_KEY_LENGTH+1];
641
+
642
+ Data_Get_Struct(self, struct rb_sample_data, sd);
643
+
644
+ keys = rb_ary_new();
645
+ if (keys != Qnil)
646
+ {
647
+ for (i = 0; i < sd->cl->cl_count; i++)
648
+ {
649
+ counter_get_key(sd->cl->cl_ctr[i],counter_name,MAX_COUNTER_KEY_LENGTH+1);
650
+ rb_ary_push(keys, rb_str_new_cstr(counter_name));
651
+ }
652
+ }
653
+
654
+ return keys;
655
+ }
656
+
657
+ static VALUE rbsample_time(VALUE self)
658
+ {
659
+ struct rb_sample_data *sd = NULL;
660
+
661
+ Data_Get_Struct(self, struct rb_sample_data, sd);
662
+
663
+ return LONG2FIX(sd->sample->sample_time);
664
+ }
665
+
666
+ static VALUE rbsample_count(VALUE self)
667
+ {
668
+ struct rb_sample_data *sd = NULL;
669
+
670
+ Data_Get_Struct(self, struct rb_sample_data, sd);
671
+
672
+ return LONG2FIX(sd->cl->cl_count);
673
+ }
674
+
675
+ static VALUE rbsample_get(VALUE self, VALUE key_arg)
676
+ {
677
+ struct rb_sample_data *sd = NULL;
678
+ int i;
679
+ char counter_name[MAX_COUNTER_KEY_LENGTH+1], *key;
680
+ long long val;
681
+
682
+ Check_Type(key_arg,T_STRING);
683
+
684
+ Data_Get_Struct(self, struct rb_sample_data, sd);
685
+ key = StringValueCStr(key_arg);
686
+
687
+ for (i = 0; i < sd->cl->cl_count; i++)
688
+ {
689
+ counter_get_key(sd->cl->cl_ctr[i],counter_name,MAX_COUNTER_KEY_LENGTH+1);
690
+ if (strcmp(key, counter_name) == 0)
691
+ {
692
+ val = stats_sample_get_value(sd->sample, i);
693
+ return LONG2FIX(val);
694
+ }
695
+ }
696
+
697
+ return Qnil;
698
+ }
699
+
700
+ static VALUE rbsample_each(VALUE self)
701
+ {
702
+ struct rb_sample_data *sd = NULL;
703
+ int i;
704
+ char counter_name[MAX_COUNTER_KEY_LENGTH+1];
705
+ long long val;
706
+ VALUE key;
707
+
708
+ Data_Get_Struct(self, struct rb_sample_data, sd);
709
+
710
+ for (i = 0; i < sd->cl->cl_count; i++)
711
+ {
712
+ counter_get_key(sd->cl->cl_ctr[i],counter_name,MAX_COUNTER_KEY_LENGTH+1);
713
+ key = rb_str_new_cstr(counter_name);
714
+ val = stats_sample_get_value(sd->sample, i);
715
+ rb_yield_values(2, key, LONG2FIX(val));
716
+ }
717
+
718
+ return self;
719
+ }
720
+
721
+
722
+
723
+ /******************************************************************
724
+ *
725
+ * Module initialization
726
+ *
727
+ */
728
+
534
729
  void Init_stats()
535
730
  {
536
731
  stats_class = rb_define_class("Stats", rb_cObject);
537
732
  rb_define_singleton_method(stats_class, "new", rbstats_new, 1);
538
733
  rb_define_method(stats_class, "initialize", rbstats_init, 1);
734
+ rb_define_method(stats_class, "sample", rbstats_sample, 0);
539
735
  rb_define_method(stats_class, "get", rbstats_get, 1);
540
736
  rb_define_method(stats_class, "timer", rbstats_get_tmr, 1);
541
737
  rb_define_method(stats_class, "inc", rbstats_inc, 1);
@@ -548,10 +744,18 @@ void Init_stats()
548
744
  rb_define_method(ctr_class, "add", rbctr_add, 1);
549
745
  rb_define_method(ctr_class, "set", rbctr_set, 1);
550
746
  rb_define_method(ctr_class, "clr", rbctr_clr, 0);
747
+ rb_define_method(ctr_class, "get", rbctr_get, 0);
551
748
 
552
749
  tmr_class = rb_define_class("Timer", rb_cObject);
553
750
  rb_define_method(tmr_class, "enter", rbtmr_enter, 0);
554
751
  rb_define_method(tmr_class, "exit", rbtmr_exit, 0);
555
752
  rb_define_method(tmr_class, "time", rbtmr_time, 0);
753
+
754
+ sample_class = rb_define_class("Sample", rb_cObject);
755
+ rb_define_method(sample_class, "keys", rbsample_keys, 0);
756
+ rb_define_method(sample_class, "time", rbsample_time, 0);
757
+ rb_define_method(sample_class, "count", rbsample_count, 0);
758
+ rb_define_method(sample_class, "each", rbsample_each, 0);
759
+ rb_define_method(sample_class, "[]", rbsample_get, 1);
556
760
  }
557
761
 
@@ -2,8 +2,10 @@ require './lib/stats/version'
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "fast-stats"
5
+ s.licenses = ["BSD-3"]
5
6
  s.version = StatsGem::VERSION
6
7
  s.authors = ["Alan Pearson"]
8
+ s.homepage = "https://github.com/pearsonalan/stats"
7
9
  s.date = Time.now.utc.strftime("%Y-%m-%d")
8
10
  s.extensions = ["ext/stats/extconf.rb"]
9
11
  s.files = `git ls-files .`.split("\n")
@@ -13,5 +15,6 @@ Gem::Specification.new do |s|
13
15
  s.test_files = `git ls-files spec examples`.split("\n")
14
16
  s.required_ruby_version = ">= 1.9.3"
15
17
  s.summary = "stats monitoring"
18
+ s.description = "fast-stats is a SysV IPC based stats tracking tool. Counters are stored in shared memory, so updating or reading the counter is quite fast"
16
19
  end
17
20
 
@@ -1,3 +1,3 @@
1
1
  module StatsGem
2
- VERSION = '1.7'
2
+ VERSION = '1.9'
3
3
  end
@@ -6,6 +6,24 @@ puts "TEST STATS: version is #{Stats.version}"
6
6
 
7
7
  s = Stats.new("rubytest")
8
8
  ctr = s.get("ctr")
9
+ ctr.clr
9
10
  ctr.inc
10
11
 
12
+ raise "unexpected value" unless ctr.get == 1
13
+
14
+ d = s.sample
15
+
16
+ # puts "Sample is #{d.inspect}"
17
+
18
+ raise "unexpected sample count" unless d.count == 1
19
+ raise "unexpected sample keys" unless d.keys == ['ctr']
20
+ raise "unexpected sample value" unless d['ctr'] == 1
21
+
22
+ h = Hash.new
23
+ d.each do |k,v|
24
+ h[k] = v
25
+ end
26
+
27
+ raise "unexpected sample data" unless h == {"ctr" => 1}
28
+
11
29
  puts "TEST STATS: OK"
metadata CHANGED
@@ -1,16 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fast-stats
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.7'
4
+ version: '1.9'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alan Pearson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-06 00:00:00.000000000 Z
11
+ date: 2014-10-17 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description:
13
+ description: fast-stats is a SysV IPC based stats tracking tool. Counters are stored
14
+ in shared memory, so updating or reading the counter is quite fast
14
15
  email:
15
16
  executables: []
16
17
  extensions:
@@ -19,23 +20,16 @@ extra_rdoc_files: []
19
20
  files:
20
21
  - Makefile
21
22
  - ext/stats/.gitignore
22
- - ext/stats/extconf.rb
23
- - ext/stats/stats-ruby.c
24
- - fast-stats.gemspec
25
- - lib/stats.rb
26
- - lib/stats/version.rb
27
- - test/benchmark_stats.rb
28
- - test/test_stats.rb
29
23
  - ext/stats/error.c
24
+ - ext/stats/extconf.rb
30
25
  - ext/stats/hash.c
31
26
  - ext/stats/lock.c
32
27
  - ext/stats/mt19937.c
28
+ - ext/stats/mt19937.h
33
29
  - ext/stats/semaphore.c
34
30
  - ext/stats/shared_mem.c
31
+ - ext/stats/stats-ruby.c
35
32
  - ext/stats/stats.c
36
- - ext/stats/strlcat.c
37
- - ext/stats/strlcpy.c
38
- - ext/stats/mt19937.h
39
33
  - ext/stats/stats/debug.h
40
34
  - ext/stats/stats/error.h
41
35
  - ext/stats/stats/hash.h
@@ -44,8 +38,16 @@ files:
44
38
  - ext/stats/stats/semaphore.h
45
39
  - ext/stats/stats/shared_mem.h
46
40
  - ext/stats/stats/stats.h
47
- homepage:
48
- licenses: []
41
+ - ext/stats/strlcat.c
42
+ - ext/stats/strlcpy.c
43
+ - fast-stats.gemspec
44
+ - lib/stats.rb
45
+ - lib/stats/version.rb
46
+ - test/benchmark_stats.rb
47
+ - test/test_stats.rb
48
+ homepage: https://github.com/pearsonalan/stats
49
+ licenses:
50
+ - BSD-3
49
51
  metadata: {}
50
52
  post_install_message:
51
53
  rdoc_options: []
@@ -53,17 +55,17 @@ require_paths:
53
55
  - lib
54
56
  required_ruby_version: !ruby/object:Gem::Requirement
55
57
  requirements:
56
- - - '>='
58
+ - - ">="
57
59
  - !ruby/object:Gem::Version
58
60
  version: 1.9.3
59
61
  required_rubygems_version: !ruby/object:Gem::Requirement
60
62
  requirements:
61
- - - '>='
63
+ - - ">="
62
64
  - !ruby/object:Gem::Version
63
65
  version: '0'
64
66
  requirements: []
65
67
  rubyforge_project:
66
- rubygems_version: 2.0.3
68
+ rubygems_version: 2.2.2
67
69
  signing_key:
68
70
  specification_version: 4
69
71
  summary: stats monitoring