sq_detailed_metrics 0.1.0
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/extconf.rb +26 -0
- data/include/half.hpp +4575 -0
- data/include/msgpack.h +24 -0
- data/include/msgpack/fbuffer.h +42 -0
- data/include/msgpack/gcc_atomic.h +25 -0
- data/include/msgpack/object.h +118 -0
- data/include/msgpack/pack.h +174 -0
- data/include/msgpack/pack_define.h +18 -0
- data/include/msgpack/pack_template.h +952 -0
- data/include/msgpack/sbuffer.h +115 -0
- data/include/msgpack/sysdep.h +221 -0
- data/include/msgpack/timestamp.h +58 -0
- data/include/msgpack/unpack.h +281 -0
- data/include/msgpack/unpack_define.h +89 -0
- data/include/msgpack/unpack_template.h +471 -0
- data/include/msgpack/util.h +15 -0
- data/include/msgpack/version.h +38 -0
- data/include/msgpack/version_master.h +3 -0
- data/include/msgpack/vrefbuffer.h +144 -0
- data/include/msgpack/zbuffer.h +205 -0
- data/include/msgpack/zone.h +163 -0
- data/include/rapidjson/allocators.h +271 -0
- data/include/rapidjson/document.h +2575 -0
- data/include/rapidjson/encodedstream.h +299 -0
- data/include/rapidjson/encodings.h +716 -0
- data/include/rapidjson/error/en.h +74 -0
- data/include/rapidjson/error/error.h +155 -0
- data/include/rapidjson/filereadstream.h +99 -0
- data/include/rapidjson/filewritestream.h +104 -0
- data/include/rapidjson/fwd.h +151 -0
- data/include/rapidjson/internal/biginteger.h +290 -0
- data/include/rapidjson/internal/diyfp.h +258 -0
- data/include/rapidjson/internal/dtoa.h +245 -0
- data/include/rapidjson/internal/ieee754.h +78 -0
- data/include/rapidjson/internal/itoa.h +304 -0
- data/include/rapidjson/internal/meta.h +181 -0
- data/include/rapidjson/internal/pow10.h +55 -0
- data/include/rapidjson/internal/regex.h +701 -0
- data/include/rapidjson/internal/stack.h +230 -0
- data/include/rapidjson/internal/strfunc.h +55 -0
- data/include/rapidjson/internal/strtod.h +269 -0
- data/include/rapidjson/internal/swap.h +46 -0
- data/include/rapidjson/istreamwrapper.h +115 -0
- data/include/rapidjson/memorybuffer.h +70 -0
- data/include/rapidjson/memorystream.h +71 -0
- data/include/rapidjson/msinttypes/inttypes.h +316 -0
- data/include/rapidjson/msinttypes/stdint.h +300 -0
- data/include/rapidjson/ostreamwrapper.h +81 -0
- data/include/rapidjson/pointer.h +1358 -0
- data/include/rapidjson/prettywriter.h +255 -0
- data/include/rapidjson/rapidjson.h +615 -0
- data/include/rapidjson/reader.h +1879 -0
- data/include/rapidjson/schema.h +2006 -0
- data/include/rapidjson/stream.h +179 -0
- data/include/rapidjson/stringbuffer.h +117 -0
- data/include/rapidjson/writer.h +610 -0
- data/include/xxhash.h +328 -0
- data/json_conv.cpp +284 -0
- data/json_conv.hpp +17 -0
- data/metrics.cpp +239 -0
- data/metrics.hpp +84 -0
- data/msgpack/objectc.c +482 -0
- data/msgpack/unpack.c +703 -0
- data/msgpack/version.c +22 -0
- data/msgpack/vrefbuffer.c +250 -0
- data/msgpack/zone.c +222 -0
- data/sq_detailed_metrics.cpp +248 -0
- metadata +199 -0
@@ -0,0 +1,248 @@
|
|
1
|
+
extern "C" {
|
2
|
+
#include <ruby.h>
|
3
|
+
#include <ruby/version.h>
|
4
|
+
#include <ruby/encoding.h>
|
5
|
+
#include "extconf.h"
|
6
|
+
}
|
7
|
+
|
8
|
+
#include <sstream>
|
9
|
+
#include "metrics.hpp"
|
10
|
+
#include "json_conv.hpp"
|
11
|
+
|
12
|
+
using namespace sq_detailed_metrics;
|
13
|
+
|
14
|
+
namespace sq_detailed_metrics {
|
15
|
+
MetricsIndex *metrics_index;
|
16
|
+
}
|
17
|
+
|
18
|
+
static void request_free(void *ptr);
|
19
|
+
static size_t request_dsize(const void *ptr);
|
20
|
+
|
21
|
+
#if RUBY_API_VERSION_CODE < 20200
|
22
|
+
static inline VALUE rb_utf8_str_new(const char *ptr, long len)
|
23
|
+
{
|
24
|
+
return rb_enc_str_new(ptr, len, rb_utf8_encoding());
|
25
|
+
}
|
26
|
+
#endif
|
27
|
+
|
28
|
+
static const rb_data_type_t request_type = {
|
29
|
+
"SqDetailedMetrics::Request",
|
30
|
+
{
|
31
|
+
nullptr, // dmark
|
32
|
+
request_free,
|
33
|
+
request_dsize
|
34
|
+
},
|
35
|
+
nullptr,
|
36
|
+
nullptr
|
37
|
+
#ifdef RUBY_TYPED_FREE_IMMEDIATELY
|
38
|
+
, RUBY_TYPED_FREE_IMMEDIATELY
|
39
|
+
#endif
|
40
|
+
};
|
41
|
+
|
42
|
+
// RequestCollection
|
43
|
+
|
44
|
+
static void request_collection_free(void *ptr);
|
45
|
+
static size_t request_collection_dsize(const void *ptr);
|
46
|
+
|
47
|
+
static const rb_data_type_t request_collection_type = {
|
48
|
+
"SqDetailedMetrics::RequestCollection",
|
49
|
+
{
|
50
|
+
nullptr, // dmark
|
51
|
+
request_collection_free,
|
52
|
+
request_collection_dsize
|
53
|
+
},
|
54
|
+
nullptr, // parent
|
55
|
+
nullptr // arbitrary data
|
56
|
+
#ifdef RUBY_TYPED_FREE_IMMEDIATELY
|
57
|
+
, RUBY_TYPED_FREE_IMMEDIATELY
|
58
|
+
#endif
|
59
|
+
};
|
60
|
+
|
61
|
+
static void request_collection_free(void *ptr) {
|
62
|
+
RequestCollection *coll = static_cast<RequestCollection*>(ptr);
|
63
|
+
delete coll;
|
64
|
+
}
|
65
|
+
|
66
|
+
static size_t request_collection_dsize(const void *ptr) {
|
67
|
+
RequestCollection const* coll = static_cast<RequestCollection const*>(ptr);
|
68
|
+
return coll->mem_size();
|
69
|
+
}
|
70
|
+
|
71
|
+
static VALUE request_collection_alloc(VALUE klass) {
|
72
|
+
RequestCollection *coll = new RequestCollection();
|
73
|
+
VALUE obj = TypedData_Wrap_Struct(klass, &request_collection_type, coll);
|
74
|
+
|
75
|
+
return obj;
|
76
|
+
}
|
77
|
+
|
78
|
+
static VALUE request_collection_serialize(VALUE self) {
|
79
|
+
RequestCollection *coll;
|
80
|
+
TypedData_Get_Struct(self, RequestCollection,
|
81
|
+
&request_collection_type, coll);
|
82
|
+
std::string str;
|
83
|
+
bool res = coll->flush(str);
|
84
|
+
if (!res) {
|
85
|
+
return Qnil;
|
86
|
+
}
|
87
|
+
return rb_enc_str_new(&str[0], static_cast<long>(str.length()),
|
88
|
+
rb_ascii8bit_encoding());
|
89
|
+
}
|
90
|
+
|
91
|
+
static VALUE request_collection_add(VALUE self, VALUE req_arg) {
|
92
|
+
RequestCollection *coll;
|
93
|
+
TypedData_Get_Struct(self, RequestCollection,
|
94
|
+
&request_collection_type, coll);
|
95
|
+
|
96
|
+
Request *req;
|
97
|
+
TypedData_Get_Struct(req_arg, Request,
|
98
|
+
&request_type, req);
|
99
|
+
|
100
|
+
coll->operator<<(std::move(*req));
|
101
|
+
|
102
|
+
return Qnil;
|
103
|
+
}
|
104
|
+
|
105
|
+
// Request
|
106
|
+
|
107
|
+
static void request_free(void *ptr) {
|
108
|
+
Request *req = static_cast<Request*>(ptr);
|
109
|
+
delete req;
|
110
|
+
}
|
111
|
+
|
112
|
+
static size_t request_dsize(const void *ptr) {
|
113
|
+
Request const *req = static_cast<Request const*>(ptr);
|
114
|
+
return req->mem_size();
|
115
|
+
}
|
116
|
+
|
117
|
+
static VALUE request_alloc(VALUE klass) {
|
118
|
+
Request *req = new Request();
|
119
|
+
VALUE obj = TypedData_Wrap_Struct(klass, &request_type, req);
|
120
|
+
|
121
|
+
return obj;
|
122
|
+
}
|
123
|
+
|
124
|
+
static VALUE request_set_route(VALUE self, VALUE route_arg) {
|
125
|
+
Request *req;
|
126
|
+
TypedData_Get_Struct(self, Request,
|
127
|
+
&request_type, req);
|
128
|
+
|
129
|
+
if (route_arg == Qnil) {
|
130
|
+
req->set_route({});
|
131
|
+
return Qnil;
|
132
|
+
}
|
133
|
+
|
134
|
+
Check_Type(route_arg, T_STRING);
|
135
|
+
|
136
|
+
long route_arg_len = RSTRING_LEN(route_arg);
|
137
|
+
std::string route{
|
138
|
+
RSTRING_PTR(route_arg),
|
139
|
+
static_cast<size_t>(route_arg_len)};
|
140
|
+
|
141
|
+
req->set_route(std::move(route));
|
142
|
+
|
143
|
+
return Qnil;
|
144
|
+
}
|
145
|
+
|
146
|
+
static VALUE request_set_overtime_cb(VALUE self, VALUE cb_arg) {
|
147
|
+
Request *req;
|
148
|
+
TypedData_Get_Struct(self, Request,
|
149
|
+
&request_type, req);
|
150
|
+
|
151
|
+
if (cb_arg == Qnil) {
|
152
|
+
req->set_overtime_cb({});
|
153
|
+
return Qnil;
|
154
|
+
}
|
155
|
+
|
156
|
+
Check_Type(cb_arg, T_STRING);
|
157
|
+
|
158
|
+
long cb_arg_len = RSTRING_LEN(cb_arg);
|
159
|
+
std::string cb{
|
160
|
+
RSTRING_PTR(cb_arg),
|
161
|
+
static_cast<size_t>(cb_arg_len)};
|
162
|
+
|
163
|
+
req->set_overtime_cb(cb);
|
164
|
+
|
165
|
+
return Qnil;
|
166
|
+
}
|
167
|
+
|
168
|
+
static VALUE request_add_measurement(VALUE self,
|
169
|
+
VALUE category_arg,
|
170
|
+
VALUE flowt_arg) {
|
171
|
+
Check_Type(category_arg, T_STRING);
|
172
|
+
Check_Type(flowt_arg, T_FLOAT);
|
173
|
+
|
174
|
+
Request *req;
|
175
|
+
TypedData_Get_Struct(self, Request,
|
176
|
+
&request_type, req);
|
177
|
+
|
178
|
+
long categ_arg_len = RSTRING_LEN(category_arg);
|
179
|
+
std::string category{
|
180
|
+
RSTRING_PTR(category_arg),
|
181
|
+
static_cast<size_t>(categ_arg_len)};
|
182
|
+
|
183
|
+
req->add(category, NUM2DBL(flowt_arg));
|
184
|
+
|
185
|
+
return Qnil;
|
186
|
+
}
|
187
|
+
|
188
|
+
static VALUE to_json(VALUE self, VALUE data) {
|
189
|
+
(void)self;
|
190
|
+
|
191
|
+
Check_Type(data, T_STRING);
|
192
|
+
|
193
|
+
VALUE err_msg = Qnil;
|
194
|
+
|
195
|
+
{
|
196
|
+
std::ostringstream stream;
|
197
|
+
JsonConv conv{stream};
|
198
|
+
|
199
|
+
long data_len = RSTRING_LEN(data);
|
200
|
+
try {
|
201
|
+
conv.parse(RSTRING_PTR(data), static_cast<size_t>(data_len));
|
202
|
+
std::string s = stream.str();
|
203
|
+
return rb_utf8_str_new(&s[0], static_cast<long>(s.size()));
|
204
|
+
} catch (const std::exception& e) {
|
205
|
+
err_msg = rb_str_buf_new_cstr(e.what());
|
206
|
+
}
|
207
|
+
} // all C++ objects must be destroyed before rb_raise is called
|
208
|
+
|
209
|
+
if (err_msg != Qnil) {
|
210
|
+
rb_raise(rb_eRuntimeError, "%s", RSTRING_PTR(err_msg));
|
211
|
+
}
|
212
|
+
return Qnil; // never reached
|
213
|
+
}
|
214
|
+
|
215
|
+
extern "C" void Init_sq_detailed_metrics(void);
|
216
|
+
extern "C" void Init_sq_detailed_metrics()
|
217
|
+
{
|
218
|
+
metrics_index = MetricsIndex_create();
|
219
|
+
|
220
|
+
VALUE mSqlDetailedMetrics = rb_define_module("SqDetailedMetrics");
|
221
|
+
VALUE cRequestCollection = rb_define_class_under(
|
222
|
+
mSqlDetailedMetrics, "RequestCollection", rb_cData);
|
223
|
+
rb_define_alloc_func(cRequestCollection, request_collection_alloc);
|
224
|
+
rb_define_method(cRequestCollection, "serialize",
|
225
|
+
reinterpret_cast<VALUE (*)(...)>(request_collection_serialize),
|
226
|
+
0);
|
227
|
+
rb_define_method(cRequestCollection, "<<",
|
228
|
+
reinterpret_cast<VALUE (*)(...)>(request_collection_add),
|
229
|
+
1);
|
230
|
+
|
231
|
+
VALUE cRequest = rb_define_class_under(
|
232
|
+
mSqlDetailedMetrics, "Request", rb_cData);
|
233
|
+
rb_define_alloc_func(cRequest, request_alloc);
|
234
|
+
|
235
|
+
rb_define_method(cRequest, "route=",
|
236
|
+
reinterpret_cast<VALUE (*)(...)>(request_set_route),
|
237
|
+
1);
|
238
|
+
rb_define_method(cRequest, "overtime_cb=",
|
239
|
+
reinterpret_cast<VALUE (*)(...)>(request_set_overtime_cb),
|
240
|
+
1);
|
241
|
+
rb_define_method(cRequest, "add_measurement",
|
242
|
+
reinterpret_cast<VALUE (*)(...)>(request_add_measurement),
|
243
|
+
2);
|
244
|
+
|
245
|
+
rb_define_singleton_method(mSqlDetailedMetrics, "to_json",
|
246
|
+
reinterpret_cast<VALUE (*)(...)>(to_json),
|
247
|
+
1);
|
248
|
+
}
|
metadata
ADDED
@@ -0,0 +1,199 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sq_detailed_metrics
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Gustavo Lopes
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-09-10 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: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '5.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '5.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: minitest-junit
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.2.0
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.2.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake-compiler
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: hashdiff
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1.0'
|
97
|
+
description: Detailed per-request metrics for Sqreen
|
98
|
+
email:
|
99
|
+
- gustavo@sqreen.io
|
100
|
+
executables: []
|
101
|
+
extensions:
|
102
|
+
- extconf.rb
|
103
|
+
extra_rdoc_files: []
|
104
|
+
files:
|
105
|
+
- extconf.rb
|
106
|
+
- include/half.hpp
|
107
|
+
- include/msgpack.h
|
108
|
+
- include/msgpack/fbuffer.h
|
109
|
+
- include/msgpack/gcc_atomic.h
|
110
|
+
- include/msgpack/object.h
|
111
|
+
- include/msgpack/pack.h
|
112
|
+
- include/msgpack/pack_define.h
|
113
|
+
- include/msgpack/pack_template.h
|
114
|
+
- include/msgpack/sbuffer.h
|
115
|
+
- include/msgpack/sysdep.h
|
116
|
+
- include/msgpack/timestamp.h
|
117
|
+
- include/msgpack/unpack.h
|
118
|
+
- include/msgpack/unpack_define.h
|
119
|
+
- include/msgpack/unpack_template.h
|
120
|
+
- include/msgpack/util.h
|
121
|
+
- include/msgpack/version.h
|
122
|
+
- include/msgpack/version_master.h
|
123
|
+
- include/msgpack/vrefbuffer.h
|
124
|
+
- include/msgpack/zbuffer.h
|
125
|
+
- include/msgpack/zone.h
|
126
|
+
- include/rapidjson/allocators.h
|
127
|
+
- include/rapidjson/document.h
|
128
|
+
- include/rapidjson/encodedstream.h
|
129
|
+
- include/rapidjson/encodings.h
|
130
|
+
- include/rapidjson/error/en.h
|
131
|
+
- include/rapidjson/error/error.h
|
132
|
+
- include/rapidjson/filereadstream.h
|
133
|
+
- include/rapidjson/filewritestream.h
|
134
|
+
- include/rapidjson/fwd.h
|
135
|
+
- include/rapidjson/internal/biginteger.h
|
136
|
+
- include/rapidjson/internal/diyfp.h
|
137
|
+
- include/rapidjson/internal/dtoa.h
|
138
|
+
- include/rapidjson/internal/ieee754.h
|
139
|
+
- include/rapidjson/internal/itoa.h
|
140
|
+
- include/rapidjson/internal/meta.h
|
141
|
+
- include/rapidjson/internal/pow10.h
|
142
|
+
- include/rapidjson/internal/regex.h
|
143
|
+
- include/rapidjson/internal/stack.h
|
144
|
+
- include/rapidjson/internal/strfunc.h
|
145
|
+
- include/rapidjson/internal/strtod.h
|
146
|
+
- include/rapidjson/internal/swap.h
|
147
|
+
- include/rapidjson/istreamwrapper.h
|
148
|
+
- include/rapidjson/memorybuffer.h
|
149
|
+
- include/rapidjson/memorystream.h
|
150
|
+
- include/rapidjson/msinttypes/inttypes.h
|
151
|
+
- include/rapidjson/msinttypes/stdint.h
|
152
|
+
- include/rapidjson/ostreamwrapper.h
|
153
|
+
- include/rapidjson/pointer.h
|
154
|
+
- include/rapidjson/prettywriter.h
|
155
|
+
- include/rapidjson/rapidjson.h
|
156
|
+
- include/rapidjson/reader.h
|
157
|
+
- include/rapidjson/schema.h
|
158
|
+
- include/rapidjson/stream.h
|
159
|
+
- include/rapidjson/stringbuffer.h
|
160
|
+
- include/rapidjson/writer.h
|
161
|
+
- include/xxhash.h
|
162
|
+
- json_conv.cpp
|
163
|
+
- json_conv.hpp
|
164
|
+
- metrics.cpp
|
165
|
+
- metrics.hpp
|
166
|
+
- msgpack/objectc.c
|
167
|
+
- msgpack/unpack.c
|
168
|
+
- msgpack/version.c
|
169
|
+
- msgpack/vrefbuffer.c
|
170
|
+
- msgpack/zone.c
|
171
|
+
- sq_detailed_metrics.cpp
|
172
|
+
homepage:
|
173
|
+
licenses:
|
174
|
+
- Proprietary
|
175
|
+
metadata:
|
176
|
+
homepage_uri: https://sqreen.com
|
177
|
+
documentation_uri: https://docs.sqreen.com/
|
178
|
+
changelog_uri: https://docs.sqreen.com/ruby/release-notes/
|
179
|
+
post_install_message:
|
180
|
+
rdoc_options: []
|
181
|
+
require_paths:
|
182
|
+
- lib
|
183
|
+
- ext
|
184
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
185
|
+
requirements:
|
186
|
+
- - ">="
|
187
|
+
- !ruby/object:Gem::Version
|
188
|
+
version: 1.9.3
|
189
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
190
|
+
requirements:
|
191
|
+
- - ">="
|
192
|
+
- !ruby/object:Gem::Version
|
193
|
+
version: '0'
|
194
|
+
requirements: []
|
195
|
+
rubygems_version: 3.1.2
|
196
|
+
signing_key:
|
197
|
+
specification_version: 4
|
198
|
+
summary: Detailed per-request metrics for Sqreen
|
199
|
+
test_files: []
|