cmetrics 0.1.4

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.
@@ -0,0 +1,253 @@
1
+ /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
+
3
+ /* CMetrics-Ruby
4
+ * =============
5
+ * Copyright 2021 Hiroshi Hatake <hatake@calyptia.com>
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ */
19
+
20
+ #include "cmetrics_c.h"
21
+
22
+ VALUE rb_cSerde;
23
+
24
+ static void serde_free(void* ptr);
25
+
26
+ static const rb_data_type_t rb_cmetrics_serde_type = { "cmetrics/serde",
27
+ {
28
+ 0,
29
+ serde_free,
30
+ 0,
31
+ },
32
+ NULL,
33
+ NULL,
34
+ RUBY_TYPED_FREE_IMMEDIATELY };
35
+
36
+
37
+ static void
38
+ serde_free(void* ptr)
39
+ {
40
+ struct CMetricsSerde* cmetricsSerde = (struct CMetricsSerde*)ptr;
41
+
42
+ if (!cmetricsSerde) {
43
+ if (!cmetricsSerde->instance) {
44
+ cmt_destroy(cmetricsSerde->instance);
45
+ }
46
+ }
47
+
48
+ xfree(ptr);
49
+ }
50
+
51
+ static VALUE
52
+ rb_cmetrics_serde_alloc(VALUE klass)
53
+ {
54
+ VALUE obj;
55
+ struct CMetricsSerde* cmetricsSerde;
56
+ obj = TypedData_Make_Struct(
57
+ klass, struct CMetricsSerde, &rb_cmetrics_serde_type, cmetricsSerde);
58
+ return obj;
59
+ }
60
+
61
+ /*
62
+ * Initailize Serde class.
63
+ *
64
+ * @return [Serde]
65
+ *
66
+ */
67
+ static VALUE
68
+ rb_cmetrics_serde_initialize(VALUE self)
69
+ {
70
+ struct CMetricsSerde* cmetricsSerde;
71
+
72
+ TypedData_Get_Struct(
73
+ self, struct CMetricsSerde, &rb_cmetrics_serde_type, cmetricsSerde);
74
+
75
+ cmt_initialize();
76
+
77
+ cmetricsSerde->instance = NULL;
78
+ cmetricsSerde->unpack_msgpack_offset = 0;
79
+
80
+ return Qnil;
81
+ }
82
+
83
+ static VALUE
84
+ rb_cmetrics_serde_from_msgpack(int argc, VALUE *argv, VALUE self)
85
+ {
86
+ VALUE rb_msgpack_buffer, rb_msgpack_length, rb_offset;
87
+ struct CMetricsSerde* cmetricsSerde;
88
+ int ret = 0;
89
+ struct cmt *cmt = NULL;
90
+ size_t offset = 0;
91
+ size_t msgpack_length = 0;
92
+
93
+ TypedData_Get_Struct(
94
+ self, struct CMetricsSerde, &rb_cmetrics_serde_type, cmetricsSerde);
95
+
96
+ rb_scan_args(argc, argv, "12", &rb_msgpack_buffer, &rb_msgpack_length, &rb_offset);
97
+ if (!NIL_P(rb_msgpack_length)) {
98
+ Check_Type(rb_msgpack_length, T_FIXNUM);
99
+ msgpack_length = INT2NUM(rb_msgpack_length);
100
+ } else {
101
+ msgpack_length = RSTRING_LEN(rb_msgpack_buffer);
102
+ }
103
+ if (!NIL_P(rb_offset)) {
104
+ Check_Type(rb_offset, T_FIXNUM);
105
+ offset = NUM2INT(rb_offset);
106
+ } else {
107
+ offset = cmetricsSerde->unpack_msgpack_offset;
108
+ }
109
+
110
+ if (offset >= msgpack_length) {
111
+ rb_raise(rb_eRuntimeError, "offset should be smaller than msgpack buffer size.");
112
+ }
113
+
114
+ ret = cmt_decode_msgpack_create(&cmt, StringValuePtr(rb_msgpack_buffer), msgpack_length, &offset);
115
+
116
+ if (ret == 0) {
117
+ cmetricsSerde->instance = cmt;
118
+ cmetricsSerde->unpack_msgpack_offset = offset;
119
+
120
+ return Qtrue;
121
+ } else {
122
+ return Qnil;
123
+ }
124
+ }
125
+
126
+ static VALUE
127
+ rb_cmetrics_serde_from_msgpack_feed_each_impl(VALUE self, VALUE rb_msgpack_buffer, size_t msgpack_length)
128
+ {
129
+ struct CMetricsSerde* cmetricsSerde;
130
+ struct cmt *cmt = NULL;
131
+ int ret = 0;
132
+
133
+ RETURN_ENUMERATOR(self, 0, 0);
134
+
135
+ TypedData_Get_Struct(
136
+ self, struct CMetricsSerde, &rb_cmetrics_serde_type, cmetricsSerde);
137
+
138
+ for (size_t offset = 0; offset <= msgpack_length; ) {
139
+ ret = cmt_decode_msgpack_create(&cmt, StringValuePtr(rb_msgpack_buffer), msgpack_length, &offset);
140
+ if (ret == 0) {
141
+ cmetricsSerde->instance = cmt;
142
+ cmetricsSerde->unpack_msgpack_offset = offset;
143
+
144
+ rb_yield(self);
145
+ } else {
146
+ return Qnil;
147
+ }
148
+ }
149
+
150
+ return Qnil;
151
+ }
152
+
153
+ static VALUE
154
+ rb_cmetrics_serde_from_msgpack_feed_each(VALUE self, VALUE rb_data)
155
+ {
156
+ RETURN_ENUMERATOR(self, 0, 0);
157
+
158
+ return rb_cmetrics_serde_from_msgpack_feed_each_impl(self, rb_data, RSTRING_LEN(rb_data));
159
+ }
160
+
161
+ static VALUE
162
+ rb_cmetrics_serde_to_prometheus(VALUE self)
163
+ {
164
+ struct CMetricsSerde* cmetricsSerde;
165
+ cmt_sds_t prom;
166
+ VALUE str;
167
+
168
+ TypedData_Get_Struct(
169
+ self, struct CMetricsSerde, &rb_cmetrics_serde_type, cmetricsSerde);
170
+
171
+ prom = cmt_encode_prometheus_create(cmetricsSerde->instance, CMT_TRUE);
172
+
173
+ str = rb_str_new2(prom);
174
+
175
+ cmt_encode_prometheus_destroy(prom);
176
+
177
+ return str;
178
+ }
179
+
180
+ static VALUE
181
+ rb_cmetrics_serde_to_influx(VALUE self)
182
+ {
183
+ struct CMetricsSerde* cmetricsSerde;
184
+ cmt_sds_t prom;
185
+ VALUE str;
186
+
187
+ TypedData_Get_Struct(
188
+ self, struct CMetricsSerde, &rb_cmetrics_serde_type, cmetricsSerde);
189
+
190
+ prom = cmt_encode_influx_create(cmetricsSerde->instance);
191
+
192
+ str = rb_str_new2(prom);
193
+
194
+ cmt_encode_influx_destroy(prom);
195
+
196
+ return str;
197
+ }
198
+ static VALUE
199
+ rb_cmetrics_serde_to_msgpack(VALUE self)
200
+ {
201
+ struct CMetricsSerde* cmetricsSerde;
202
+ char *buffer;
203
+ size_t buffer_size;
204
+ int ret = 0;
205
+
206
+ TypedData_Get_Struct(
207
+ self, struct CMetricsSerde, &rb_cmetrics_serde_type, cmetricsSerde);
208
+
209
+ ret = cmt_encode_msgpack_create(cmetricsSerde->instance, &buffer, &buffer_size);
210
+
211
+ if (ret == 0) {
212
+ return rb_str_new(buffer, buffer_size);
213
+ } else {
214
+ return Qnil;
215
+ }
216
+ }
217
+
218
+ static VALUE
219
+ rb_cmetrics_serde_to_text(VALUE self)
220
+ {
221
+ struct CMetricsSerde* cmetricsSerde;
222
+ cmt_sds_t buffer;
223
+ VALUE text;
224
+
225
+ TypedData_Get_Struct(
226
+ self, struct CMetricsSerde, &rb_cmetrics_serde_type, cmetricsSerde);
227
+
228
+ buffer = cmt_encode_text_create(cmetricsSerde->instance);
229
+ if (buffer == NULL) {
230
+ return Qnil;
231
+ }
232
+
233
+ text = rb_str_new2(buffer);
234
+
235
+ cmt_sds_destroy(buffer);
236
+
237
+ return text;
238
+ }
239
+
240
+ void Init_cmetrics_serde(VALUE rb_mCMetrics)
241
+ {
242
+ rb_cSerde = rb_define_class_under(rb_mCMetrics, "Serde", rb_cObject);
243
+
244
+ rb_define_alloc_func(rb_cSerde, rb_cmetrics_serde_alloc);
245
+
246
+ rb_define_method(rb_cSerde, "initialize", rb_cmetrics_serde_initialize, 0);
247
+ rb_define_method(rb_cSerde, "from_msgpack", rb_cmetrics_serde_from_msgpack, -1);
248
+ rb_define_method(rb_cSerde, "to_prometheus", rb_cmetrics_serde_to_prometheus, 0);
249
+ rb_define_method(rb_cSerde, "to_influx", rb_cmetrics_serde_to_influx, 0);
250
+ rb_define_method(rb_cSerde, "to_msgpack", rb_cmetrics_serde_to_msgpack, 0);
251
+ rb_define_method(rb_cSerde, "feed_each", rb_cmetrics_serde_from_msgpack_feed_each, 1);
252
+ rb_define_method(rb_cSerde, "to_s", rb_cmetrics_serde_to_text, 0);
253
+ }
@@ -0,0 +1,68 @@
1
+ require "mkmf"
2
+ require "rbconfig"
3
+ require "mini_portile2"
4
+ require "fileutils"
5
+
6
+ ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
7
+
8
+ def linux?
9
+ RUBY_PLATFORM =~ /linux/
10
+ end
11
+
12
+ def windows?
13
+ RUBY_PLATFORM =~ /mingw|mswin/
14
+ end
15
+
16
+ class BuildCMetrics
17
+
18
+ attr_reader :recipe
19
+
20
+ def initialize(version=nil)
21
+ @version = if version
22
+ version
23
+ else
24
+ "master".freeze
25
+ end
26
+ @recipe = MiniPortileCMake.new("cmetrics", @version)
27
+ @checkpoint = ".#{@recipe.name}-#{@recipe.version}.installed"
28
+ @recipe.target = File.join(ROOT, "ports")
29
+ @recipe.files << {
30
+ url: "file://#{ROOT}/ext/#{@recipe.name}-#{@recipe.version}.tar.gz",
31
+ sha256sum: "34df0842ee23e4c9440e787722fb79cf7204ebb3fed2dc3fb5e02f4c9c4807dc",
32
+ }
33
+ end
34
+
35
+ def build
36
+ unless File.exist?(@checkpoint)
37
+ @recipe.cook
38
+ libcmetrics_path = File.join(ROOT, "ports/#{@recipe.host}/cmetrics/#{@version}/lib/libcmetrics.a")
39
+ FileUtils.cp(libcmetrics_path, File.join(ROOT, "ext", "cmetrics", "libcmetrics.a"))
40
+ libmpack_path = File.join(ROOT, "ports/#{@recipe.host}/cmetrics/#{@version}/lib/libmpack.a")
41
+ FileUtils.cp(libmpack_path, File.join(ROOT, "ext", "cmetrics", "libmpack.a"))
42
+ libxxhash_path = File.join(ROOT, "ports/#{@recipe.host}/cmetrics/#{@version}/lib/libxxhash.a")
43
+ FileUtils.cp(libxxhash_path, File.join(ROOT, "ext", "cmetrics", "libxxhash.a"))
44
+ include_path = File.join(ROOT, "ports/#{@recipe.host}/cmetrics/#{@version}/include/")
45
+ FileUtils.cp_r(Dir.glob(File.join(include_path, "*")), File.join(ROOT, "ext", "cmetrics"))
46
+ FileUtils.touch(@checkpoint)
47
+ end
48
+ end
49
+
50
+ def activate
51
+ @recipe.activate
52
+ end
53
+ end
54
+
55
+ cmetrics = BuildCMetrics.new
56
+ cmetrics.build
57
+
58
+ libdir = RbConfig::CONFIG["libdir"]
59
+ includedir = RbConfig::CONFIG["includedir"]
60
+
61
+ dir_config("cmetrics", includedir, libdir)
62
+ find_library("xxhash", nil, __dir__)
63
+ find_library("mpack", nil, __dir__)
64
+ find_library("cmetrics", nil, __dir__)
65
+
66
+ have_func("gmtime_s", "time.h")
67
+
68
+ create_makefile("cmetrics/cmetrics")
Binary file
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CMetrics
4
+ VERSION = "0.1.4"
5
+ end
data/lib/cmetrics.rb ADDED
@@ -0,0 +1,5 @@
1
+ require "cmetrics/cmetrics"
2
+ require "cmetrics/version"
3
+ module CMetrics
4
+ # Your code goes here...
5
+ end
metadata ADDED
@@ -0,0 +1,136 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cmetrics
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.4
5
+ platform: ruby
6
+ authors:
7
+ - Hiroshi Hatake
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2021-07-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake-compiler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake-compiler-dock
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: mini_portile2
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '2.1'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '2.1'
83
+ description: C binding for cmetric library.
84
+ email:
85
+ - cosmo0920.oucc@gmail.com
86
+ executables: []
87
+ extensions:
88
+ - ext/cmetrics/extconf.rb
89
+ extra_rdoc_files: []
90
+ files:
91
+ - ".github/workflows/linux.yml"
92
+ - ".github/workflows/macos.yml"
93
+ - ".github/workflows/windows.yml"
94
+ - ".gitignore"
95
+ - Gemfile
96
+ - LICENSE
97
+ - README.md
98
+ - Rakefile
99
+ - bin/console
100
+ - bin/setup
101
+ - cmetrics-ruby.gemspec
102
+ - ext/cmetrics-master.tar.gz
103
+ - ext/cmetrics/cmetrics.c
104
+ - ext/cmetrics/cmetrics_c.h
105
+ - ext/cmetrics/cmetrics_counter.c
106
+ - ext/cmetrics/cmetrics_gauge.c
107
+ - ext/cmetrics/cmetrics_serde.c
108
+ - ext/cmetrics/extconf.rb
109
+ - lib/cmetrics.rb
110
+ - lib/cmetrics/version.rb
111
+ homepage: https://github.com/calyptia/cmetrics-ruby
112
+ licenses:
113
+ - Apache-2.0
114
+ metadata:
115
+ homepage_uri: https://github.com/calyptia/cmetrics-ruby
116
+ changelog_uri: https://github.com/calyptia/cmetrics-ruby/blob/master/CHANGELOG.md
117
+ post_install_message:
118
+ rdoc_options: []
119
+ require_paths:
120
+ - lib
121
+ required_ruby_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: 2.4.0
126
+ required_rubygems_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ requirements: []
132
+ rubygems_version: 3.0.3
133
+ signing_key:
134
+ specification_version: 4
135
+ summary: C binding for cmetric library.
136
+ test_files: []