cmetrics 0.1.8 → 0.2.2
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/.github/workflows/apt.yml +39 -0
- data/.github/workflows/linux.yml +2 -2
- data/.github/workflows/macos.yml +2 -2
- data/.github/workflows/windows.yml +2 -2
- data/.github/workflows/yum.yml +39 -0
- data/Gemfile +7 -1
- data/ci/apt-test.sh +40 -0
- data/ci/yum-test.sh +77 -0
- data/cmetrics-ruby.gemspec +2 -1
- data/ext/cmetrics/cmetrics_c.h +3 -0
- data/ext/cmetrics/cmetrics_counter.c +16 -0
- data/ext/cmetrics/cmetrics_gauge.c +16 -0
- data/ext/cmetrics/cmetrics_serde.c +201 -3
- data/ext/cmetrics/cmetrics_untyped.c +16 -0
- data/ext/cmetrics/extconf.rb +23 -7
- data/lib/cmetrics/version.rb +1 -1
- metadata +26 -9
- data/ext/cmetrics-master.tar.gz +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '0861b3f6da8c48f905bfda1d4ab062153ac3afcca89daa7d4b74395758fa07ac'
|
4
|
+
data.tar.gz: 605435619199540b2637832786af4c8edaac0d18a702891047c8b28b7a62744f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b0a3bf5de417bca85837acb7ca2c0eaa935402cbe8e38bafea45c87d9e9f81963cf46d27978374cd82532bc23a4403a66e454fdec30c6baf025cdc6e172675c0
|
7
|
+
data.tar.gz: cb41b8752fa5688f9856fbf57365851a9902d6a99453d2b3488e9ef6bef9c859e3b597ef3ffeb387d35032518270735153f3ac6e9bba2effad87c2fa987ae896
|
@@ -0,0 +1,39 @@
|
|
1
|
+
name: Apt based Linux
|
2
|
+
on:
|
3
|
+
push:
|
4
|
+
pull_request:
|
5
|
+
jobs:
|
6
|
+
build:
|
7
|
+
name: Build
|
8
|
+
strategy:
|
9
|
+
fail-fast: false
|
10
|
+
matrix:
|
11
|
+
label:
|
12
|
+
- Debian GNU/Linux Bullseye amd64
|
13
|
+
- Debian GNU/Linux Buster amd64
|
14
|
+
- Ubuntu Bionic amd64
|
15
|
+
- Ubuntu Focal amd64
|
16
|
+
include:
|
17
|
+
- label: Debian GNU/Linux Bullseye amd64
|
18
|
+
test-docker-image: debian:bullseye
|
19
|
+
test-script: ci/apt-test.sh
|
20
|
+
- label: Debian GNU/Linux Buster amd64
|
21
|
+
test-docker-image: debian:buster
|
22
|
+
test-script: ci/apt-test.sh
|
23
|
+
- label: Ubuntu Bionic amd64
|
24
|
+
test-docker-image: ubuntu:bionic
|
25
|
+
test-script: ci/apt-test.sh
|
26
|
+
- label: Ubuntu Focal amd64
|
27
|
+
test-docker-image: ubuntu:focal
|
28
|
+
test-script: ci/apt-test.sh
|
29
|
+
runs-on: ubuntu-latest
|
30
|
+
steps:
|
31
|
+
- uses: actions/checkout@master
|
32
|
+
- name: rake compile & rake test
|
33
|
+
run: |
|
34
|
+
docker run \
|
35
|
+
--rm \
|
36
|
+
--tty \
|
37
|
+
--volume ${PWD}:/cmetrics-ruby \
|
38
|
+
${{ matrix.test-docker-image }} \
|
39
|
+
/cmetrics-ruby/${{ matrix.test-script }}
|
data/.github/workflows/linux.yml
CHANGED
@@ -10,9 +10,9 @@ jobs:
|
|
10
10
|
- name: Set up Ruby
|
11
11
|
uses: ruby/setup-ruby@v1
|
12
12
|
with:
|
13
|
-
ruby-version: 3.0
|
13
|
+
ruby-version: '3.0'
|
14
14
|
- name: Run the default task
|
15
15
|
run: |
|
16
|
-
gem install bundler -v 2.2.
|
16
|
+
gem install bundler -v 2.2.26
|
17
17
|
bundle install
|
18
18
|
bundle exec rake
|
data/.github/workflows/macos.yml
CHANGED
@@ -10,9 +10,9 @@ jobs:
|
|
10
10
|
- name: Set up Ruby
|
11
11
|
uses: ruby/setup-ruby@v1
|
12
12
|
with:
|
13
|
-
ruby-version: 3.0
|
13
|
+
ruby-version: '3.0'
|
14
14
|
- name: Run the default task
|
15
15
|
run: |
|
16
|
-
gem install bundler -v 2.2.
|
16
|
+
gem install bundler -v 2.2.26
|
17
17
|
bundle install
|
18
18
|
bundle exec rake
|
@@ -10,9 +10,9 @@ jobs:
|
|
10
10
|
- name: Set up Ruby
|
11
11
|
uses: ruby/setup-ruby@v1
|
12
12
|
with:
|
13
|
-
ruby-version: 3.0
|
13
|
+
ruby-version: '3.0'
|
14
14
|
- name: Run the default task
|
15
15
|
run: |
|
16
|
-
gem install bundler -v 2.2.
|
16
|
+
gem install bundler -v 2.2.26
|
17
17
|
ridk exec bundle install
|
18
18
|
ridk exec bundle exec rake
|
@@ -0,0 +1,39 @@
|
|
1
|
+
name: Yum based Linux
|
2
|
+
on:
|
3
|
+
push:
|
4
|
+
pull_request:
|
5
|
+
jobs:
|
6
|
+
build:
|
7
|
+
name: Build
|
8
|
+
strategy:
|
9
|
+
fail-fast: false
|
10
|
+
matrix:
|
11
|
+
label:
|
12
|
+
- CentOS 7 x86_64
|
13
|
+
- CentOS 8 x86_64
|
14
|
+
- Fedora 34 x86_64
|
15
|
+
- AmazonLinux 2 x86_64
|
16
|
+
include:
|
17
|
+
- label: CentOS 7 x86_64
|
18
|
+
test-docker-image: centos:7
|
19
|
+
test-script: ci/yum-test.sh
|
20
|
+
- label: CentOS 8 x86_64
|
21
|
+
test-docker-image: centos:8
|
22
|
+
test-script: ci/yum-test.sh
|
23
|
+
- label: Fedora 34 x86_64
|
24
|
+
test-docker-image: fedora:34
|
25
|
+
test-script: ci/yum-test.sh
|
26
|
+
- label: AmazonLinux 2 x86_64
|
27
|
+
test-docker-image: amazonlinux:2
|
28
|
+
test-script: ci/yum-test.sh
|
29
|
+
runs-on: ubuntu-latest
|
30
|
+
steps:
|
31
|
+
- uses: actions/checkout@master
|
32
|
+
- name: rake compile & rake test
|
33
|
+
run: |
|
34
|
+
docker run \
|
35
|
+
--rm \
|
36
|
+
--tty \
|
37
|
+
--volume ${PWD}:/cmetrics-ruby \
|
38
|
+
${{ matrix.test-docker-image }} \
|
39
|
+
/cmetrics-ruby/${{ matrix.test-script }}
|
data/Gemfile
CHANGED
@@ -7,4 +7,10 @@ gemspec
|
|
7
7
|
|
8
8
|
gem "rake", "~> 13.0"
|
9
9
|
|
10
|
-
gem "test-unit", "~> 3.
|
10
|
+
gem "test-unit", "~> 3.4"
|
11
|
+
|
12
|
+
local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local")
|
13
|
+
if File.exist?(local_gemfile)
|
14
|
+
puts "Loading Gemfile.local ..." if $DEBUG # `ruby -d` or `bundle -v`
|
15
|
+
instance_eval File.read(local_gemfile)
|
16
|
+
end
|
data/ci/apt-test.sh
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
set -exu
|
4
|
+
|
5
|
+
export DEBIAN_FRONTEND=noninteractive
|
6
|
+
|
7
|
+
if [ -f /etc/lsb-release ]; then
|
8
|
+
. /etc/lsb-release
|
9
|
+
distribution=$DISTRIB_ID
|
10
|
+
version=${DISTRIB_RELEASE%%.*}
|
11
|
+
codename=${DISTRIB_CODENAME%%.*}
|
12
|
+
else
|
13
|
+
distribution="Debian"
|
14
|
+
version=$(cat /etc/debian_version | cut -d'.' -f1)
|
15
|
+
fi
|
16
|
+
|
17
|
+
apt update
|
18
|
+
|
19
|
+
case "$distribution" in
|
20
|
+
"Ubuntu")
|
21
|
+
case "$codename" in
|
22
|
+
"bionic")
|
23
|
+
apt install -V -y wget gpg
|
24
|
+
wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null && \
|
25
|
+
echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ bionic main' | tee /etc/apt/sources.list.d/kitware.list >/dev/null && \
|
26
|
+
apt update
|
27
|
+
;;
|
28
|
+
*)
|
29
|
+
;;
|
30
|
+
esac
|
31
|
+
;;
|
32
|
+
esac
|
33
|
+
|
34
|
+
apt install -V -y lsb-release
|
35
|
+
|
36
|
+
apt install -V -y ruby-dev git build-essential pkg-config cmake
|
37
|
+
cd /cmetrics-ruby && \
|
38
|
+
gem install bundler --no-document && \
|
39
|
+
bundle install && \
|
40
|
+
bundle exec rake
|
data/ci/yum-test.sh
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
set -exu
|
4
|
+
|
5
|
+
USE_SCL=0
|
6
|
+
USE_AMZN_EXT=0
|
7
|
+
|
8
|
+
distribution=$(cat /etc/system-release-cpe | awk '{print substr($0, index($1, "o"))}' | cut -d: -f2)
|
9
|
+
version=$(cat /etc/system-release-cpe | awk '{print substr($0, index($1, "o"))}' | cut -d: -f4)
|
10
|
+
USE_SCL=0
|
11
|
+
USE_AMZN_EXT=0
|
12
|
+
|
13
|
+
case ${distribution} in
|
14
|
+
amazon)
|
15
|
+
case ${version} in
|
16
|
+
2)
|
17
|
+
DNF=yum
|
18
|
+
USE_AMZN_EXT=1
|
19
|
+
;;
|
20
|
+
esac
|
21
|
+
;;
|
22
|
+
centos)
|
23
|
+
case ${version} in
|
24
|
+
7)
|
25
|
+
DNF=yum
|
26
|
+
USE_SCL=1
|
27
|
+
;;
|
28
|
+
*)
|
29
|
+
DNF="dnf --enablerepo=powertools"
|
30
|
+
;;
|
31
|
+
esac
|
32
|
+
;;
|
33
|
+
fedoraproject)
|
34
|
+
case ${version} in
|
35
|
+
33|34)
|
36
|
+
DNF=yum
|
37
|
+
;;
|
38
|
+
esac
|
39
|
+
;;
|
40
|
+
esac
|
41
|
+
|
42
|
+
${DNF} groupinstall -y "Development Tools"
|
43
|
+
|
44
|
+
if [ $USE_SCL -eq 1 ]; then
|
45
|
+
${DNF} install -y centos-release-scl && \
|
46
|
+
${DNF} install -y epel-release && \
|
47
|
+
${DNF} install -y \
|
48
|
+
rh-ruby26-ruby-devel \
|
49
|
+
rh-ruby26-rubygems \
|
50
|
+
rh-ruby26-rubygem-rake \
|
51
|
+
rpm-build \
|
52
|
+
cmake3
|
53
|
+
elif [ $USE_AMZN_EXT -eq 1 ]; then
|
54
|
+
yum update -y && \
|
55
|
+
yum install -y yum-utils && \
|
56
|
+
yum-config-manager --enable epel && \
|
57
|
+
amazon-linux-extras install -y ruby2.6 && \
|
58
|
+
${DNF} install -y ruby-devel \
|
59
|
+
cmake3
|
60
|
+
else
|
61
|
+
${DNF} install -y ruby-devel \
|
62
|
+
rubygems \
|
63
|
+
rpm-build \
|
64
|
+
cmake \
|
65
|
+
libarchive
|
66
|
+
fi
|
67
|
+
|
68
|
+
if [ $USE_SCL -eq 1 ]; then
|
69
|
+
# For unbound variable error
|
70
|
+
export MANPATH=
|
71
|
+
cd /cmetrics-ruby && source /opt/rh/rh-ruby26/enable && gem install bundler --no-document && bundle install && bundle exec rake
|
72
|
+
else
|
73
|
+
if [ $USE_AMZN_EXT -eq 1 ]; then
|
74
|
+
echo 'gem "io-console"' > /cmetrics-ruby/Gemfile.local
|
75
|
+
fi
|
76
|
+
cd /cmetrics-ruby && gem install bundler --no-document && bundle install && bundle exec rake
|
77
|
+
fi
|
data/cmetrics-ruby.gemspec
CHANGED
@@ -29,6 +29,7 @@ Gem::Specification.new do |spec|
|
|
29
29
|
spec.add_development_dependency "rake", ">= 0"
|
30
30
|
spec.add_development_dependency "rake-compiler", "~> 1.0"
|
31
31
|
spec.add_development_dependency "rake-compiler-dock", "~> 1.0"
|
32
|
+
spec.add_development_dependency "msgpack", "~> 1.4.2"
|
32
33
|
|
33
|
-
spec.add_dependency 'mini_portile2', '~> 2.
|
34
|
+
spec.add_dependency 'mini_portile2', '~> 2.7'
|
34
35
|
end
|
data/ext/cmetrics/cmetrics_c.h
CHANGED
@@ -65,5 +65,8 @@ void Init_cmetrics_counter(VALUE rb_mCMetrics);
|
|
65
65
|
void Init_cmetrics_gauge(VALUE rb_mCMetrics);
|
66
66
|
void Init_cmetrics_serde(VALUE rb_mCMetrics);
|
67
67
|
void Init_cmetrics_untyped(VALUE rb_mCMetrics);
|
68
|
+
const struct CMetricsCounter *cmetrics_counter_get_ptr(VALUE rb_mCMetrics);
|
69
|
+
const struct CMetricsGauge *cmetrics_gauge_get_ptr(VALUE rb_mCMetrics);
|
70
|
+
const struct CMetricsUntyped *cmetrics_untyped_get_ptr(VALUE rb_mCMetrics);
|
68
71
|
|
69
72
|
#endif // _CMETRICS_C_H
|
@@ -34,6 +34,22 @@ static const rb_data_type_t rb_cmetrics_counter_type = { "cmetrics/counter",
|
|
34
34
|
RUBY_TYPED_FREE_IMMEDIATELY };
|
35
35
|
|
36
36
|
|
37
|
+
const struct CMetricsCounter *cmetrics_counter_get_ptr(VALUE self)
|
38
|
+
{
|
39
|
+
struct CMetricsCounter *cmetricsCounter = NULL;
|
40
|
+
|
41
|
+
TypedData_Get_Struct(
|
42
|
+
self, struct CMetricsCounter, &rb_cmetrics_counter_type, cmetricsCounter);
|
43
|
+
|
44
|
+
if (NIL_P(self)) {
|
45
|
+
rb_raise(rb_eRuntimeError, "Given CMetrics argument must not be nil");
|
46
|
+
}
|
47
|
+
if (!cmetricsCounter->counter) {
|
48
|
+
rb_raise(rb_eRuntimeError, "Create counter with CMetrics::Counter#create first.");
|
49
|
+
}
|
50
|
+
return cmetricsCounter;
|
51
|
+
}
|
52
|
+
|
37
53
|
static void
|
38
54
|
counter_free(void* ptr)
|
39
55
|
{
|
@@ -34,6 +34,22 @@ static const rb_data_type_t rb_cmetrics_gauge_type = { "cmetrics/gauge",
|
|
34
34
|
RUBY_TYPED_FREE_IMMEDIATELY };
|
35
35
|
|
36
36
|
|
37
|
+
const struct CMetricsGauge *cmetrics_gauge_get_ptr(VALUE self)
|
38
|
+
{
|
39
|
+
struct CMetricsGauge *cmetricsGauge = NULL;
|
40
|
+
|
41
|
+
TypedData_Get_Struct(
|
42
|
+
self, struct CMetricsGauge, &rb_cmetrics_gauge_type, cmetricsGauge);
|
43
|
+
|
44
|
+
if (NIL_P(self)) {
|
45
|
+
rb_raise(rb_eRuntimeError, "Given CMetrics argument must not be nil");
|
46
|
+
}
|
47
|
+
if (!cmetricsGauge->gauge) {
|
48
|
+
rb_raise(rb_eRuntimeError, "Create gauge with CMetrics::Gauge#create first.");
|
49
|
+
}
|
50
|
+
return cmetricsGauge;
|
51
|
+
}
|
52
|
+
|
37
53
|
static void
|
38
54
|
gauge_free(void* ptr)
|
39
55
|
{
|
@@ -18,9 +18,16 @@
|
|
18
18
|
*/
|
19
19
|
|
20
20
|
#include "cmetrics_c.h"
|
21
|
+
#include <cmetrics/cmt_map.h>
|
22
|
+
#include <cmetrics/cmt_metric.h>
|
23
|
+
#include <cmetrics/cmt_cat.h>
|
21
24
|
|
22
25
|
VALUE rb_cSerde;
|
23
26
|
|
27
|
+
extern VALUE rb_cCounter;
|
28
|
+
extern VALUE rb_cGauge;
|
29
|
+
extern VALUE rb_cUntyped;
|
30
|
+
|
24
31
|
static void serde_free(void* ptr);
|
25
32
|
|
26
33
|
static const rb_data_type_t rb_cmetrics_serde_type = { "cmetrics/serde",
|
@@ -111,7 +118,11 @@ rb_cmetrics_serde_from_msgpack(int argc, VALUE *argv, VALUE self)
|
|
111
118
|
rb_raise(rb_eRuntimeError, "offset should be smaller than msgpack buffer size.");
|
112
119
|
}
|
113
120
|
|
114
|
-
|
121
|
+
if (!NIL_P(rb_msgpack_buffer)) {
|
122
|
+
ret = cmt_decode_msgpack_create(&cmt, StringValuePtr(rb_msgpack_buffer), msgpack_length, &offset);
|
123
|
+
} else {
|
124
|
+
rb_raise(rb_eArgError, "nil is not valid value for buffer");
|
125
|
+
}
|
115
126
|
|
116
127
|
if (ret == 0) {
|
117
128
|
cmetricsSerde->instance = cmt;
|
@@ -129,13 +140,14 @@ rb_cmetrics_serde_from_msgpack_feed_each_impl(VALUE self, VALUE rb_msgpack_buffe
|
|
129
140
|
struct CMetricsSerde* cmetricsSerde;
|
130
141
|
struct cmt *cmt = NULL;
|
131
142
|
int ret = 0;
|
143
|
+
size_t offset = 0;
|
132
144
|
|
133
145
|
RETURN_ENUMERATOR(self, 0, 0);
|
134
146
|
|
135
147
|
TypedData_Get_Struct(
|
136
148
|
self, struct CMetricsSerde, &rb_cmetrics_serde_type, cmetricsSerde);
|
137
149
|
|
138
|
-
for (
|
150
|
+
for (offset = 0; offset <= msgpack_length; ) {
|
139
151
|
ret = cmt_decode_msgpack_create(&cmt, StringValuePtr(rb_msgpack_buffer), msgpack_length, &offset);
|
140
152
|
if (ret == 0) {
|
141
153
|
cmetricsSerde->instance = cmt;
|
@@ -154,8 +166,46 @@ static VALUE
|
|
154
166
|
rb_cmetrics_serde_from_msgpack_feed_each(VALUE self, VALUE rb_data)
|
155
167
|
{
|
156
168
|
RETURN_ENUMERATOR(self, 0, 0);
|
169
|
+
if (!NIL_P(rb_data)) {
|
170
|
+
return rb_cmetrics_serde_from_msgpack_feed_each_impl(self, rb_data, RSTRING_LEN(rb_data));
|
171
|
+
} else {
|
172
|
+
rb_raise(rb_eArgError, "nil is not valid value for buffer");
|
173
|
+
}
|
174
|
+
}
|
175
|
+
|
176
|
+
static VALUE
|
177
|
+
rb_cmetrics_serde_concat_metric(VALUE self, VALUE rb_data)
|
178
|
+
{
|
179
|
+
struct CMetricsSerde* cmetricsSerde = NULL;
|
180
|
+
struct CMetricsCounter* cmetricsCounter = NULL;
|
181
|
+
struct CMetricsGauge* cmetricsGauge = NULL;
|
182
|
+
struct CMetricsUntyped* cmetricsUntyped = NULL;
|
183
|
+
|
184
|
+
TypedData_Get_Struct(
|
185
|
+
self, struct CMetricsSerde, &rb_cmetrics_serde_type, cmetricsSerde);
|
186
|
+
|
187
|
+
if (!NIL_P(rb_data)) {
|
188
|
+
if (cmetricsSerde->instance == NULL) {
|
189
|
+
cmetricsSerde->instance = cmt_create();
|
190
|
+
}
|
191
|
+
|
192
|
+
if (rb_obj_is_kind_of(rb_data, rb_cCounter)) {
|
193
|
+
cmetricsCounter = (struct CMetricsCounter *)cmetrics_counter_get_ptr(rb_data);
|
194
|
+
cmt_cat(cmetricsSerde->instance, cmetricsCounter->instance);
|
195
|
+
} else if (rb_obj_is_kind_of(rb_data, rb_cGauge)) {
|
196
|
+
cmetricsGauge = (struct CMetricsGauge *)cmetrics_gauge_get_ptr(rb_data);
|
197
|
+
cmt_cat(cmetricsSerde->instance, cmetricsGauge->instance);
|
198
|
+
} else if (rb_obj_is_kind_of(rb_data, rb_cUntyped)) {
|
199
|
+
cmetricsUntyped = (struct CMetricsUntyped *)cmetrics_untyped_get_ptr(rb_data);
|
200
|
+
cmt_cat(cmetricsSerde->instance, cmetricsUntyped->instance);
|
201
|
+
} else {
|
202
|
+
rb_raise(rb_eArgError, "specified type of instance is not supported.");
|
203
|
+
}
|
204
|
+
} else {
|
205
|
+
rb_raise(rb_eArgError, "nil is not valid value for concatenating");
|
206
|
+
}
|
157
207
|
|
158
|
-
return
|
208
|
+
return Qnil;
|
159
209
|
}
|
160
210
|
|
161
211
|
static VALUE
|
@@ -237,6 +287,151 @@ rb_cmetrics_serde_to_text(VALUE self)
|
|
237
287
|
return text;
|
238
288
|
}
|
239
289
|
|
290
|
+
static VALUE
|
291
|
+
append_metric_value(struct cmt_map *map,
|
292
|
+
VALUE rbHash, struct cmt_metric *metric)
|
293
|
+
{
|
294
|
+
uint64_t ts;
|
295
|
+
double val;
|
296
|
+
struct cmt_opts *opts;
|
297
|
+
|
298
|
+
opts = map->opts;
|
299
|
+
|
300
|
+
/* Retrieve metric value */
|
301
|
+
val = cmt_metric_get_value(metric);
|
302
|
+
|
303
|
+
ts = cmt_metric_get_timestamp(metric);
|
304
|
+
|
305
|
+
rb_hash_aset(rbHash, rb_str_new2("name"), rb_str_new2(opts->name));
|
306
|
+
rb_hash_aset(rbHash, rb_str_new2("description"), rb_str_new2(opts->description));
|
307
|
+
rb_hash_aset(rbHash, rb_str_new2("value"), DBL2NUM(val));
|
308
|
+
rb_hash_aset(rbHash, rb_str_new2("timestamp"), DBL2NUM(ts/1000000000.0));
|
309
|
+
|
310
|
+
return rbHash;
|
311
|
+
}
|
312
|
+
|
313
|
+
static VALUE
|
314
|
+
format_metric(struct cmt *cmt, struct cmt_map *map,
|
315
|
+
struct cmt_metric *metric)
|
316
|
+
{
|
317
|
+
int n;
|
318
|
+
int static_labels = 0;
|
319
|
+
struct cmt_map_label *label_k;
|
320
|
+
struct cmt_map_label *label_v;
|
321
|
+
struct mk_list *head;
|
322
|
+
struct cmt_opts *opts;
|
323
|
+
struct cmt_label *slabel;
|
324
|
+
VALUE rb_hash = rb_hash_new();
|
325
|
+
VALUE shash = rb_hash_new();
|
326
|
+
VALUE lhash = rb_hash_new();
|
327
|
+
|
328
|
+
opts = map->opts;
|
329
|
+
|
330
|
+
/* Measurement */
|
331
|
+
rb_hash_aset(rb_hash, rb_str_new2("namespace"), rb_str_new2(opts->ns));
|
332
|
+
rb_hash_aset(rb_hash, rb_str_new2("subsystem"), rb_str_new2(opts->subsystem));
|
333
|
+
|
334
|
+
/* Static labels (tags) */
|
335
|
+
static_labels = cmt_labels_count(cmt->static_labels);
|
336
|
+
if (static_labels > 0) {
|
337
|
+
mk_list_foreach(head, &cmt->static_labels->list) {
|
338
|
+
slabel = mk_list_entry(head, struct cmt_label, _head);
|
339
|
+
rb_hash_aset(shash, rb_str_new2(slabel->key), rb_str_new2(slabel->val));
|
340
|
+
}
|
341
|
+
rb_hash_aset(rb_hash, rb_str_new2("static_labels"), shash);
|
342
|
+
}
|
343
|
+
|
344
|
+
/* Labels / Tags */
|
345
|
+
n = mk_list_size(&metric->labels);
|
346
|
+
if (n > 0) {
|
347
|
+
label_k = mk_list_entry_first(&map->label_keys, struct cmt_map_label, _head);
|
348
|
+
|
349
|
+
mk_list_foreach(head, &metric->labels) {
|
350
|
+
label_v = mk_list_entry(head, struct cmt_map_label, _head);
|
351
|
+
|
352
|
+
rb_hash_aset(lhash, rb_str_new2(label_k->name), rb_str_new2(label_v->name));
|
353
|
+
|
354
|
+
label_k = mk_list_entry_next(&label_k->_head, struct cmt_map_label,
|
355
|
+
_head, &map->label_keys);
|
356
|
+
}
|
357
|
+
rb_hash_aset(rb_hash, rb_str_new2("labels"), lhash);
|
358
|
+
}
|
359
|
+
|
360
|
+
rb_hash = append_metric_value(map, rb_hash, metric);
|
361
|
+
|
362
|
+
return rb_hash;
|
363
|
+
}
|
364
|
+
|
365
|
+
static VALUE
|
366
|
+
format_metrics(struct cmt *cmt,
|
367
|
+
struct cmt_map *map, int add_timestamp)
|
368
|
+
{
|
369
|
+
VALUE rbMetrics = rb_ary_new();
|
370
|
+
VALUE rbMetric;
|
371
|
+
struct mk_list *head;
|
372
|
+
struct cmt_metric *metric;
|
373
|
+
|
374
|
+
/* Simple metric, no labels */
|
375
|
+
if (map->metric_static_set == 1) {
|
376
|
+
rbMetric = format_metric(cmt, map, &map->metric);
|
377
|
+
rb_ary_push(rbMetrics, rbMetric);
|
378
|
+
}
|
379
|
+
|
380
|
+
mk_list_foreach(head, &map->metrics) {
|
381
|
+
metric = mk_list_entry(head, struct cmt_metric, _head);
|
382
|
+
rbMetric = format_metric(cmt, map, metric);
|
383
|
+
rb_ary_push(rbMetrics, rbMetric);
|
384
|
+
}
|
385
|
+
|
386
|
+
return rbMetrics;
|
387
|
+
}
|
388
|
+
|
389
|
+
static VALUE
|
390
|
+
rb_cmetrics_serde_get_metrics(VALUE self)
|
391
|
+
{
|
392
|
+
VALUE rbMetrics = rb_ary_new();
|
393
|
+
VALUE rbMetricsInner = rb_ary_new();
|
394
|
+
struct CMetricsSerde* cmetricsSerde;
|
395
|
+
struct mk_list *head;
|
396
|
+
struct cmt_gauge *gauge;
|
397
|
+
struct cmt_counter *counter;
|
398
|
+
struct cmt_untyped *untyped;
|
399
|
+
struct cmt *cmt;
|
400
|
+
int add_timestamp = CMT_TRUE;
|
401
|
+
|
402
|
+
TypedData_Get_Struct(
|
403
|
+
self, struct CMetricsSerde, &rb_cmetrics_serde_type, cmetricsSerde);
|
404
|
+
|
405
|
+
cmt = cmetricsSerde->instance;
|
406
|
+
|
407
|
+
if (cmt == NULL) {
|
408
|
+
rb_raise(rb_eRuntimeError, "Invalid cmt context");
|
409
|
+
}
|
410
|
+
|
411
|
+
/* Counters */
|
412
|
+
mk_list_foreach(head, &cmt->counters) {
|
413
|
+
counter = mk_list_entry(head, struct cmt_counter, _head);
|
414
|
+
rbMetricsInner = format_metrics(cmt, counter->map, add_timestamp);
|
415
|
+
rb_ary_push(rbMetrics, rbMetricsInner);
|
416
|
+
}
|
417
|
+
|
418
|
+
/* Gauges */
|
419
|
+
mk_list_foreach(head, &cmt->gauges) {
|
420
|
+
gauge = mk_list_entry(head, struct cmt_gauge, _head);
|
421
|
+
rbMetricsInner = format_metrics(cmt, gauge->map, add_timestamp);
|
422
|
+
rb_ary_push(rbMetrics, rbMetricsInner);
|
423
|
+
}
|
424
|
+
|
425
|
+
/* Untyped */
|
426
|
+
mk_list_foreach(head, &cmt->untypeds) {
|
427
|
+
untyped = mk_list_entry(head, struct cmt_untyped, _head);
|
428
|
+
rbMetricsInner = format_metrics(cmt, untyped->map, add_timestamp);
|
429
|
+
rb_ary_push(rbMetrics, rbMetricsInner);
|
430
|
+
}
|
431
|
+
|
432
|
+
return rbMetrics;
|
433
|
+
}
|
434
|
+
|
240
435
|
void Init_cmetrics_serde(VALUE rb_mCMetrics)
|
241
436
|
{
|
242
437
|
rb_cSerde = rb_define_class_under(rb_mCMetrics, "Serde", rb_cObject);
|
@@ -244,10 +439,13 @@ void Init_cmetrics_serde(VALUE rb_mCMetrics)
|
|
244
439
|
rb_define_alloc_func(rb_cSerde, rb_cmetrics_serde_alloc);
|
245
440
|
|
246
441
|
rb_define_method(rb_cSerde, "initialize", rb_cmetrics_serde_initialize, 0);
|
442
|
+
rb_define_method(rb_cSerde, "concat", rb_cmetrics_serde_concat_metric, 1);
|
247
443
|
rb_define_method(rb_cSerde, "from_msgpack", rb_cmetrics_serde_from_msgpack, -1);
|
248
444
|
rb_define_method(rb_cSerde, "to_prometheus", rb_cmetrics_serde_to_prometheus, 0);
|
249
445
|
rb_define_method(rb_cSerde, "to_influx", rb_cmetrics_serde_to_influx, 0);
|
250
446
|
rb_define_method(rb_cSerde, "to_msgpack", rb_cmetrics_serde_to_msgpack, 0);
|
251
447
|
rb_define_method(rb_cSerde, "feed_each", rb_cmetrics_serde_from_msgpack_feed_each, 1);
|
252
448
|
rb_define_method(rb_cSerde, "to_s", rb_cmetrics_serde_to_text, 0);
|
449
|
+
rb_define_method(rb_cSerde, "get_metrics", rb_cmetrics_serde_get_metrics, 0);
|
450
|
+
rb_define_method(rb_cSerde, "metrics", rb_cmetrics_serde_get_metrics, 0);
|
253
451
|
}
|
@@ -34,6 +34,22 @@ static const rb_data_type_t rb_cmetrics_untyped_type = { "cmetrics/untyped",
|
|
34
34
|
RUBY_TYPED_FREE_IMMEDIATELY };
|
35
35
|
|
36
36
|
|
37
|
+
const struct CMetricsUntyped *cmetrics_untyped_get_ptr(VALUE self)
|
38
|
+
{
|
39
|
+
struct CMetricsUntyped *cmetricsUntyped = NULL;
|
40
|
+
|
41
|
+
TypedData_Get_Struct(
|
42
|
+
self, struct CMetricsUntyped, &rb_cmetrics_untyped_type, cmetricsUntyped);
|
43
|
+
|
44
|
+
if (NIL_P(self)) {
|
45
|
+
rb_raise(rb_eRuntimeError, "Given CMetrics argument must not be nil");
|
46
|
+
}
|
47
|
+
if (!cmetricsUntyped->untyped) {
|
48
|
+
rb_raise(rb_eRuntimeError, "Create untyped with CMetrics::Untyped#create first.");
|
49
|
+
}
|
50
|
+
return cmetricsUntyped;
|
51
|
+
}
|
52
|
+
|
37
53
|
static void
|
38
54
|
untyped_free(void* ptr)
|
39
55
|
{
|
data/ext/cmetrics/extconf.rb
CHANGED
@@ -13,22 +13,40 @@ def windows?
|
|
13
13
|
RUBY_PLATFORM =~ /mingw|mswin/
|
14
14
|
end
|
15
15
|
|
16
|
+
def determine_preferred_command(bin, default_bin)
|
17
|
+
printf "checking for whether %s or %s is usable... ", bin, default_bin
|
18
|
+
STDOUT.flush
|
19
|
+
bin += RbConfig::CONFIG['EXEEXT']
|
20
|
+
path = ENV['PATH'].split(RbConfig::CONFIG['PATH_SEPARATOR'])
|
21
|
+
for dir in path
|
22
|
+
file = File.join(dir, bin)
|
23
|
+
if FileTest.executable?(file)
|
24
|
+
printf "%s\n", bin
|
25
|
+
return bin
|
26
|
+
else
|
27
|
+
next
|
28
|
+
end
|
29
|
+
end
|
30
|
+
printf "%s\n", default_bin
|
31
|
+
return default_bin
|
32
|
+
end
|
33
|
+
|
16
34
|
class BuildCMetrics
|
17
35
|
|
18
36
|
attr_reader :recipe
|
19
37
|
|
20
|
-
def initialize(version=nil)
|
38
|
+
def initialize(version=nil, **kwargs)
|
21
39
|
@version = if version
|
22
40
|
version
|
23
41
|
else
|
24
42
|
"master".freeze
|
25
43
|
end
|
26
|
-
@recipe = MiniPortileCMake.new("cmetrics", @version)
|
44
|
+
@recipe = MiniPortileCMake.new("cmetrics", @version, **kwargs)
|
27
45
|
@checkpoint = ".#{@recipe.name}-#{@recipe.version}.installed"
|
28
46
|
@recipe.target = File.join(ROOT, "ports")
|
29
47
|
@recipe.files << {
|
30
|
-
url: "
|
31
|
-
sha256sum: "
|
48
|
+
url: "https://codeload.github.com/calyptia/cmetrics/tar.gz/v#{version}",
|
49
|
+
sha256sum: "f0c79707ad4d18980bf0d1d64ed8cb73a40c586c36a4caf38233ae8d9a4c6cc7",
|
32
50
|
}
|
33
51
|
end
|
34
52
|
|
@@ -52,7 +70,7 @@ class BuildCMetrics
|
|
52
70
|
end
|
53
71
|
end
|
54
72
|
|
55
|
-
cmetrics = BuildCMetrics.new
|
73
|
+
cmetrics = BuildCMetrics.new("0.2.1", cmake_command: determine_preferred_command("cmake3", "cmake"))
|
56
74
|
cmetrics.build
|
57
75
|
|
58
76
|
libdir = RbConfig::CONFIG["libdir"]
|
@@ -63,8 +81,6 @@ find_library("xxhash", nil, __dir__)
|
|
63
81
|
find_library("mpack", nil, __dir__)
|
64
82
|
find_library("cmetrics", nil, __dir__)
|
65
83
|
|
66
|
-
$CFLAGS << " -std=c99 "
|
67
|
-
|
68
84
|
have_func("gmtime_s", "time.h")
|
69
85
|
|
70
86
|
create_makefile("cmetrics/cmetrics")
|
data/lib/cmetrics/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cmetrics
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hiroshi Hatake
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-09-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -66,20 +66,34 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '1.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: msgpack
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.4.2
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.4.2
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: mini_portile2
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
87
|
- - "~>"
|
74
88
|
- !ruby/object:Gem::Version
|
75
|
-
version: '2.
|
89
|
+
version: '2.7'
|
76
90
|
type: :runtime
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
94
|
- - "~>"
|
81
95
|
- !ruby/object:Gem::Version
|
82
|
-
version: '2.
|
96
|
+
version: '2.7'
|
83
97
|
description: C binding for cmetric library.
|
84
98
|
email:
|
85
99
|
- cosmo0920.oucc@gmail.com
|
@@ -88,9 +102,11 @@ extensions:
|
|
88
102
|
- ext/cmetrics/extconf.rb
|
89
103
|
extra_rdoc_files: []
|
90
104
|
files:
|
105
|
+
- ".github/workflows/apt.yml"
|
91
106
|
- ".github/workflows/linux.yml"
|
92
107
|
- ".github/workflows/macos.yml"
|
93
108
|
- ".github/workflows/windows.yml"
|
109
|
+
- ".github/workflows/yum.yml"
|
94
110
|
- ".gitignore"
|
95
111
|
- Gemfile
|
96
112
|
- LICENSE
|
@@ -98,8 +114,9 @@ files:
|
|
98
114
|
- Rakefile
|
99
115
|
- bin/console
|
100
116
|
- bin/setup
|
117
|
+
- ci/apt-test.sh
|
118
|
+
- ci/yum-test.sh
|
101
119
|
- cmetrics-ruby.gemspec
|
102
|
-
- ext/cmetrics-master.tar.gz
|
103
120
|
- ext/cmetrics/cmetrics.c
|
104
121
|
- ext/cmetrics/cmetrics_c.h
|
105
122
|
- ext/cmetrics/cmetrics_counter.c
|
@@ -115,7 +132,7 @@ licenses:
|
|
115
132
|
metadata:
|
116
133
|
homepage_uri: https://github.com/calyptia/cmetrics-ruby
|
117
134
|
changelog_uri: https://github.com/calyptia/cmetrics-ruby/blob/master/CHANGELOG.md
|
118
|
-
post_install_message:
|
135
|
+
post_install_message:
|
119
136
|
rdoc_options: []
|
120
137
|
require_paths:
|
121
138
|
- lib
|
@@ -130,8 +147,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
130
147
|
- !ruby/object:Gem::Version
|
131
148
|
version: '0'
|
132
149
|
requirements: []
|
133
|
-
rubygems_version: 3.
|
134
|
-
signing_key:
|
150
|
+
rubygems_version: 3.2.22
|
151
|
+
signing_key:
|
135
152
|
specification_version: 4
|
136
153
|
summary: C binding for cmetric library.
|
137
154
|
test_files: []
|
data/ext/cmetrics-master.tar.gz
DELETED
Binary file
|