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.
- checksums.yaml +7 -0
- data/.github/workflows/linux.yml +18 -0
- data/.github/workflows/macos.yml +18 -0
- data/.github/workflows/windows.yml +18 -0
- data/.gitignore +18 -0
- data/Gemfile +10 -0
- data/LICENSE +201 -0
- data/README.md +173 -0
- data/Rakefile +37 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/cmetrics-ruby.gemspec +34 -0
- data/ext/cmetrics/cmetrics.c +39 -0
- data/ext/cmetrics/cmetrics_c.h +62 -0
- data/ext/cmetrics/cmetrics_counter.c +664 -0
- data/ext/cmetrics/cmetrics_gauge.c +841 -0
- data/ext/cmetrics/cmetrics_serde.c +253 -0
- data/ext/cmetrics/extconf.rb +68 -0
- data/ext/cmetrics-master.tar.gz +0 -0
- data/lib/cmetrics/version.rb +5 -0
- data/lib/cmetrics.rb +5 -0
- metadata +136 -0
@@ -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
|
data/lib/cmetrics.rb
ADDED
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: []
|