pcp_easy 0.2.1 → 0.3.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 +4 -4
- data/ext/pcp_easy/agent.c +5 -65
- data/ext/pcp_easy/agent.h +1 -1
- data/ext/pcp_easy/exceptions.c +53 -53
- data/ext/pcp_easy/exceptions.h +1 -1
- data/ext/pcp_easy/metric.c +69 -52
- data/ext/pcp_easy/metric.h +2 -2
- data/ext/pcp_easy/metric_value.c +102 -0
- data/ext/pcp_easy/metric_value.h +28 -0
- metadata +19 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7b7da9cf7cc2a13ab9973f7c94b5d95eaf31c351
|
4
|
+
data.tar.gz: dd9a83a80fa8ee7614900ee4be39877d26d66682
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6527fe6f2b9fd4ce89a081db47b6b358cd0dbf4132543f76d1903313a8fe8849e4c440d6067f8e61ee5567396f67f290c6e903c22728b20f0d79de7293af31d7
|
7
|
+
data.tar.gz: 4eb8144063b44ad94807c7134331195913294f38573c3668462f3db3666ca477f2c29609076faf5a6cac533b0fc16a1afc561298d99645cc53fbc69d51586234
|
data/ext/pcp_easy/agent.c
CHANGED
@@ -60,73 +60,13 @@ static VALUE initialize(VALUE self, VALUE hostname_rb) {
|
|
60
60
|
return self;
|
61
61
|
}
|
62
62
|
|
63
|
-
static
|
64
|
-
int i;
|
65
|
-
for(i=0; i<maximum_instances; i++) {
|
66
|
-
if(instance_id == instance_ids[i]) {
|
67
|
-
return instance_names[i];
|
68
|
-
}
|
69
|
-
}
|
70
|
-
return NULL;
|
71
|
-
}
|
72
|
-
|
73
|
-
static VALUE decode_multiple_instances(pmDesc pm_desc, pmValueSet *pm_value_set, char *metric_name) {
|
74
|
-
int error, i;
|
75
|
-
int number_of_instances = pm_value_set->numval;
|
76
|
-
int *instances = NULL;
|
77
|
-
char **instance_names = NULL;
|
78
|
-
VALUE result = rb_ary_new2(number_of_instances);
|
79
|
-
|
80
|
-
|
81
|
-
if((error = pmGetInDom(pm_desc.indom, &instances, &instance_names)) < 0) {
|
82
|
-
pcpeasy_raise_from_pmapi_error(error);
|
83
|
-
}
|
84
|
-
|
85
|
-
for(i = 0; i < number_of_instances; i++) {
|
86
|
-
char *instance_name = get_name_from_instance_id(pm_value_set->vlist[i].inst, number_of_instances, instances, instance_names);
|
87
|
-
rb_ary_push(result, pcpeasy_metric_new(metric_name, instance_name, &pm_value_set->vlist[i], &pm_desc, pm_value_set->valfmt));
|
88
|
-
}
|
89
|
-
|
90
|
-
free(instances);
|
91
|
-
free(instance_names);
|
92
|
-
|
93
|
-
return result;
|
94
|
-
}
|
95
|
-
|
96
|
-
static VALUE decode_single_instance(pmDesc pm_desc, pmValueSet *pm_value_set, char *metric_name) {
|
97
|
-
return pcpeasy_metric_new(metric_name, NULL, &pm_value_set->vlist[0], &pm_desc, pm_value_set->valfmt);
|
98
|
-
}
|
99
|
-
|
100
|
-
static VALUE decode_single_metric(pmID pmid, pmValueSet *pm_value_set, char *metric_name) {
|
101
|
-
int error;
|
102
|
-
pmDesc pm_desc;
|
103
|
-
|
104
|
-
/* No values, bail out */
|
105
|
-
if(pm_value_set->numval == 0) {
|
106
|
-
return Qnil;
|
107
|
-
}
|
108
|
-
|
109
|
-
/* Find out how to decode the metric */
|
110
|
-
if((error = pmLookupDesc(pmid, &pm_desc))) {
|
111
|
-
pcpeasy_raise_from_pmapi_error(error);
|
112
|
-
}
|
113
|
-
|
114
|
-
/* Do we have instances? */
|
115
|
-
if(pm_desc.indom == PM_INDOM_NULL) {
|
116
|
-
return decode_single_instance(pm_desc, pm_value_set, metric_name);
|
117
|
-
} else {
|
118
|
-
return decode_multiple_instances(pm_desc, pm_value_set, metric_name);
|
119
|
-
}
|
120
|
-
|
121
|
-
}
|
122
|
-
|
123
|
-
static VALUE decode_pm_result(pmID pmid, pmResult *pm_result, char *metric_name) {
|
63
|
+
static VALUE decode_pm_result(pmResult *pm_result, char *metric_name) {
|
124
64
|
/* No values (or somehow more than 1) */
|
125
65
|
if (pm_result->numpmid != 1) {
|
126
66
|
return Qnil;
|
127
67
|
}
|
128
68
|
|
129
|
-
return
|
69
|
+
return pcpeasy_metric_new(metric_name, pm_result->vset[0]);
|
130
70
|
}
|
131
71
|
|
132
72
|
static VALUE metric(VALUE self, VALUE metric_string_rb) {
|
@@ -160,15 +100,15 @@ static VALUE metric(VALUE self, VALUE metric_string_rb) {
|
|
160
100
|
}
|
161
101
|
|
162
102
|
/* Decode the result */
|
163
|
-
result = decode_pm_result(
|
103
|
+
result = decode_pm_result(pm_result, metric_name);
|
164
104
|
pmFreeResult(pm_result);
|
165
105
|
|
166
106
|
return result;
|
167
107
|
}
|
168
108
|
|
169
109
|
|
170
|
-
void pcpeasy_agent_init(VALUE
|
171
|
-
pcpeasy_agent_class = rb_define_class_under(
|
110
|
+
void pcpeasy_agent_init(VALUE rb_cPCPEasy) {
|
111
|
+
pcpeasy_agent_class = rb_define_class_under(rb_cPCPEasy, "Agent", rb_cObject);
|
172
112
|
|
173
113
|
rb_define_alloc_func(pcpeasy_agent_class, allocate);
|
174
114
|
rb_define_method(pcpeasy_agent_class, "initialize", initialize, 1);
|
data/ext/pcp_easy/agent.h
CHANGED
data/ext/pcp_easy/exceptions.c
CHANGED
@@ -157,57 +157,57 @@ void pcpeasy_raise_from_pmapi_error(int error_number) {
|
|
157
157
|
}
|
158
158
|
|
159
159
|
|
160
|
-
void pcpeasy_exceptions_init(VALUE
|
161
|
-
pcpeasy_error = rb_define_class_under(
|
162
|
-
pcpeasy_pmns_error = rb_define_class_under(
|
163
|
-
pcpeasy_no_pmns_error = rb_define_class_under(
|
164
|
-
pcpeasy_dup_pmns_error = rb_define_class_under(
|
165
|
-
pcpeasy_text_error = rb_define_class_under(
|
166
|
-
pcpeasy_app_version_error = rb_define_class_under(
|
167
|
-
pcpeasy_value_error = rb_define_class_under(
|
168
|
-
pcpeasy_timeout_error = rb_define_class_under(
|
169
|
-
pcpeasy_no_data_error = rb_define_class_under(
|
170
|
-
pcpeasy_reset_error = rb_define_class_under(
|
171
|
-
pcpeasy_name_error = rb_define_class_under(
|
172
|
-
pcpeasy_pmid_error = rb_define_class_under(
|
173
|
-
pcpeasy_indom_error = rb_define_class_under(
|
174
|
-
pcpeasy_inst_error = rb_define_class_under(
|
175
|
-
pcpeasy_unit_error = rb_define_class_under(
|
176
|
-
pcpeasy_conv_error = rb_define_class_under(
|
177
|
-
pcpeasy_trunc_error = rb_define_class_under(
|
178
|
-
pcpeasy_sign_error = rb_define_class_under(
|
179
|
-
pcpeasy_profile_error = rb_define_class_under(
|
180
|
-
pcpeasy_ipc_error = rb_define_class_under(
|
181
|
-
pcpeasy_eof_error = rb_define_class_under(
|
182
|
-
pcpeasy_not_host_error = rb_define_class_under(
|
183
|
-
pcpeasy_eol_error = rb_define_class_under(
|
184
|
-
pcpeasy_mode_error = rb_define_class_under(
|
185
|
-
pcpeasy_label_error = rb_define_class_under(
|
186
|
-
pcpeasy_log_rec_error = rb_define_class_under(
|
187
|
-
pcpeasy_not_archive_error = rb_define_class_under(
|
188
|
-
pcpeasy_log_file_error = rb_define_class_under(
|
189
|
-
pcpeasy_no_context_error = rb_define_class_under(
|
190
|
-
pcpeasy_profile_spec_error = rb_define_class_under(
|
191
|
-
pcpeasy_pmid_log_error = rb_define_class_under(
|
192
|
-
pcpeasy_indom_log_error = rb_define_class_under(
|
193
|
-
pcpeasy_inst_log_error = rb_define_class_under(
|
194
|
-
pcpeasy_no_profile_error = rb_define_class_under(
|
195
|
-
pcpeasy_no_agent_error = rb_define_class_under(
|
196
|
-
pcpeasy_permission_error = rb_define_class_under(
|
197
|
-
pcpeasy_connlimit_error = rb_define_class_under(
|
198
|
-
pcpeasy_again_error = rb_define_class_under(
|
199
|
-
pcpeasy_is_conn_error = rb_define_class_under(
|
200
|
-
pcpeasy_not_conn_error = rb_define_class_under(
|
201
|
-
pcpeasy_need_port_error = rb_define_class_under(
|
202
|
-
pcpeasy_non_leaf_error = rb_define_class_under(
|
203
|
-
pcpeasy_type_error = rb_define_class_under(
|
204
|
-
pcpeasy_thread_error = rb_define_class_under(
|
205
|
-
pcpeasy_no_container_error = rb_define_class_under(
|
206
|
-
pcpeasy_bad_store_error = rb_define_class_under(
|
207
|
-
pcpeasy_too_small_error = rb_define_class_under(
|
208
|
-
pcpeasy_too_big_error = rb_define_class_under(
|
209
|
-
pcpeasy_fault_error = rb_define_class_under(
|
210
|
-
pcpeasy_pmda_ready_error = rb_define_class_under(
|
211
|
-
pcpeasy_pmda_not_ready_error = rb_define_class_under(
|
212
|
-
pcpeasy_nyi_error = rb_define_class_under(
|
160
|
+
void pcpeasy_exceptions_init(VALUE rb_cPCPEasy) {
|
161
|
+
pcpeasy_error = rb_define_class_under(rb_cPCPEasy, "Error", rb_eStandardError);
|
162
|
+
pcpeasy_pmns_error = rb_define_class_under(rb_cPCPEasy, "PMNSError", pcpeasy_error);
|
163
|
+
pcpeasy_no_pmns_error = rb_define_class_under(rb_cPCPEasy, "NoPMNSError", pcpeasy_error);
|
164
|
+
pcpeasy_dup_pmns_error = rb_define_class_under(rb_cPCPEasy, "DupPMNSError", pcpeasy_error);
|
165
|
+
pcpeasy_text_error = rb_define_class_under(rb_cPCPEasy, "TextError", pcpeasy_error);
|
166
|
+
pcpeasy_app_version_error = rb_define_class_under(rb_cPCPEasy, "AppVersionError", pcpeasy_error);
|
167
|
+
pcpeasy_value_error = rb_define_class_under(rb_cPCPEasy, "ValueError", pcpeasy_error);
|
168
|
+
pcpeasy_timeout_error = rb_define_class_under(rb_cPCPEasy, "TimeoutError", pcpeasy_error);
|
169
|
+
pcpeasy_no_data_error = rb_define_class_under(rb_cPCPEasy, "NoDataError", pcpeasy_error);
|
170
|
+
pcpeasy_reset_error = rb_define_class_under(rb_cPCPEasy, "ResetError", pcpeasy_error);
|
171
|
+
pcpeasy_name_error = rb_define_class_under(rb_cPCPEasy, "NameError", pcpeasy_error);
|
172
|
+
pcpeasy_pmid_error = rb_define_class_under(rb_cPCPEasy, "PMIDError", pcpeasy_error);
|
173
|
+
pcpeasy_indom_error = rb_define_class_under(rb_cPCPEasy, "InDomError", pcpeasy_error);
|
174
|
+
pcpeasy_inst_error = rb_define_class_under(rb_cPCPEasy, "InstError", pcpeasy_error);
|
175
|
+
pcpeasy_unit_error = rb_define_class_under(rb_cPCPEasy, "UnitError", pcpeasy_error);
|
176
|
+
pcpeasy_conv_error = rb_define_class_under(rb_cPCPEasy, "ConvError", pcpeasy_error);
|
177
|
+
pcpeasy_trunc_error = rb_define_class_under(rb_cPCPEasy, "TruncError", pcpeasy_error);
|
178
|
+
pcpeasy_sign_error = rb_define_class_under(rb_cPCPEasy, "SignError", pcpeasy_error);
|
179
|
+
pcpeasy_profile_error = rb_define_class_under(rb_cPCPEasy, "ProfileError", pcpeasy_error);
|
180
|
+
pcpeasy_ipc_error = rb_define_class_under(rb_cPCPEasy, "IPCError", pcpeasy_error);
|
181
|
+
pcpeasy_eof_error = rb_define_class_under(rb_cPCPEasy, "EOFError", pcpeasy_error);
|
182
|
+
pcpeasy_not_host_error = rb_define_class_under(rb_cPCPEasy, "NotHostError", pcpeasy_error);
|
183
|
+
pcpeasy_eol_error = rb_define_class_under(rb_cPCPEasy, "EOLError", pcpeasy_error);
|
184
|
+
pcpeasy_mode_error = rb_define_class_under(rb_cPCPEasy, "ModeError", pcpeasy_error);
|
185
|
+
pcpeasy_label_error = rb_define_class_under(rb_cPCPEasy, "LabelError", pcpeasy_error);
|
186
|
+
pcpeasy_log_rec_error = rb_define_class_under(rb_cPCPEasy, "LogRecError", pcpeasy_error);
|
187
|
+
pcpeasy_not_archive_error = rb_define_class_under(rb_cPCPEasy, "NotArchiveError", pcpeasy_error);
|
188
|
+
pcpeasy_log_file_error = rb_define_class_under(rb_cPCPEasy, "LogFileError", pcpeasy_error);
|
189
|
+
pcpeasy_no_context_error = rb_define_class_under(rb_cPCPEasy, "NoContextError", pcpeasy_error);
|
190
|
+
pcpeasy_profile_spec_error = rb_define_class_under(rb_cPCPEasy, "ProfileSpecError", pcpeasy_error);
|
191
|
+
pcpeasy_pmid_log_error = rb_define_class_under(rb_cPCPEasy, "PMIDLogError", pcpeasy_error);
|
192
|
+
pcpeasy_indom_log_error = rb_define_class_under(rb_cPCPEasy, "InDomLogError", pcpeasy_error);
|
193
|
+
pcpeasy_inst_log_error = rb_define_class_under(rb_cPCPEasy, "InstLogError", pcpeasy_error);
|
194
|
+
pcpeasy_no_profile_error = rb_define_class_under(rb_cPCPEasy, "NoProfileError", pcpeasy_error);
|
195
|
+
pcpeasy_no_agent_error = rb_define_class_under(rb_cPCPEasy, "NoAgentError", pcpeasy_error);
|
196
|
+
pcpeasy_permission_error = rb_define_class_under(rb_cPCPEasy, "PermissionError", pcpeasy_error);
|
197
|
+
pcpeasy_connlimit_error = rb_define_class_under(rb_cPCPEasy, "ConnLimitError", pcpeasy_error);
|
198
|
+
pcpeasy_again_error = rb_define_class_under(rb_cPCPEasy, "AgainError", pcpeasy_error);
|
199
|
+
pcpeasy_is_conn_error = rb_define_class_under(rb_cPCPEasy, "IsConnError", pcpeasy_error);
|
200
|
+
pcpeasy_not_conn_error = rb_define_class_under(rb_cPCPEasy, "NotConnError", pcpeasy_error);
|
201
|
+
pcpeasy_need_port_error = rb_define_class_under(rb_cPCPEasy, "NeedPortError", pcpeasy_error);
|
202
|
+
pcpeasy_non_leaf_error = rb_define_class_under(rb_cPCPEasy, "NonLeafError", pcpeasy_error);
|
203
|
+
pcpeasy_type_error = rb_define_class_under(rb_cPCPEasy, "TypeError", pcpeasy_error);
|
204
|
+
pcpeasy_thread_error = rb_define_class_under(rb_cPCPEasy, "ThreadError", pcpeasy_error);
|
205
|
+
pcpeasy_no_container_error = rb_define_class_under(rb_cPCPEasy, "NoContainerError", pcpeasy_error);
|
206
|
+
pcpeasy_bad_store_error = rb_define_class_under(rb_cPCPEasy, "BadStoreError", pcpeasy_error);
|
207
|
+
pcpeasy_too_small_error = rb_define_class_under(rb_cPCPEasy, "TooSmallError", pcpeasy_error);
|
208
|
+
pcpeasy_too_big_error = rb_define_class_under(rb_cPCPEasy, "TooBigError", pcpeasy_error);
|
209
|
+
pcpeasy_fault_error = rb_define_class_under(rb_cPCPEasy, "FaultError", pcpeasy_error);
|
210
|
+
pcpeasy_pmda_ready_error = rb_define_class_under(rb_cPCPEasy, "PMDAReadyError", pcpeasy_error);
|
211
|
+
pcpeasy_pmda_not_ready_error = rb_define_class_under(rb_cPCPEasy, "PMDANotReadyError", pcpeasy_error);
|
212
|
+
pcpeasy_nyi_error = rb_define_class_under(rb_cPCPEasy, "NYIError", pcpeasy_error);
|
213
213
|
}
|
data/ext/pcp_easy/exceptions.h
CHANGED
data/ext/pcp_easy/metric.c
CHANGED
@@ -20,17 +20,17 @@
|
|
20
20
|
#include <pcp/pmapi.h>
|
21
21
|
|
22
22
|
#include "exceptions.h"
|
23
|
+
#include "metric_value.h"
|
23
24
|
|
24
25
|
#define READ_ONLY 1, 0
|
25
|
-
#define CONSTRUCTOR_ARGS
|
26
|
+
#define CONSTRUCTOR_ARGS 5
|
26
27
|
#define rb_symbol_new(name) ID2SYM(rb_intern(name))
|
27
28
|
|
28
29
|
VALUE pcpeasy_metric_class;
|
29
30
|
|
30
|
-
static VALUE initialize(VALUE self, VALUE name, VALUE
|
31
|
+
static VALUE initialize(VALUE self, VALUE name, VALUE values, VALUE semantics, VALUE type, VALUE units) {
|
31
32
|
rb_iv_set(self, "@name", name);
|
32
|
-
rb_iv_set(self, "@
|
33
|
-
rb_iv_set(self, "@instance", instance);
|
33
|
+
rb_iv_set(self, "@values", values);
|
34
34
|
rb_iv_set(self, "@semantics", semantics);
|
35
35
|
rb_iv_set(self, "@type", type);
|
36
36
|
rb_iv_set(self, "@units", units);
|
@@ -51,41 +51,6 @@ static VALUE semantics_symbol(int semantics) {
|
|
51
51
|
}
|
52
52
|
}
|
53
53
|
|
54
|
-
static VALUE instance_name(char *instance) {
|
55
|
-
if(instance == NULL) {
|
56
|
-
return Qnil;
|
57
|
-
}
|
58
|
-
return rb_tainted_str_new_cstr(instance);
|
59
|
-
}
|
60
|
-
|
61
|
-
static VALUE value(int value_format, pmValue *pm_value, int type) {
|
62
|
-
pmAtomValue pm_atom_value;
|
63
|
-
int error;
|
64
|
-
|
65
|
-
if((error = pmExtractValue(value_format, pm_value, type, &pm_atom_value, type)) < 0) {
|
66
|
-
pcpeasy_raise_from_pmapi_error(error);
|
67
|
-
}
|
68
|
-
|
69
|
-
switch(type) {
|
70
|
-
case PM_TYPE_32:
|
71
|
-
return LONG2NUM(pm_atom_value.l);
|
72
|
-
case PM_TYPE_U32:
|
73
|
-
return ULONG2NUM(pm_atom_value.ul);
|
74
|
-
case PM_TYPE_64:
|
75
|
-
return LL2NUM(pm_atom_value.ll);
|
76
|
-
case PM_TYPE_U64:
|
77
|
-
return ULL2NUM(pm_atom_value.ull);
|
78
|
-
case PM_TYPE_FLOAT:
|
79
|
-
return DBL2NUM(pm_atom_value.f);
|
80
|
-
case PM_TYPE_DOUBLE:
|
81
|
-
return DBL2NUM(pm_atom_value.d);
|
82
|
-
case PM_TYPE_STRING:
|
83
|
-
return rb_tainted_str_new_cstr(pm_atom_value.vbp->vbuf);
|
84
|
-
default:
|
85
|
-
rb_raise(pcpeasy_error, "Metric type %d not supported", type);
|
86
|
-
}
|
87
|
-
}
|
88
|
-
|
89
54
|
static int is_field_equal(const char *name, VALUE self, VALUE other) {
|
90
55
|
return TYPE(rb_funcall(rb_iv_get(self, name), rb_intern("=="), 1, rb_iv_get(other, name))) == T_TRUE;
|
91
56
|
}
|
@@ -95,9 +60,7 @@ static VALUE equal(VALUE self, VALUE other) {
|
|
95
60
|
return Qfalse;
|
96
61
|
if(!is_field_equal("@name", self, other))
|
97
62
|
return Qfalse;
|
98
|
-
if(!is_field_equal("@
|
99
|
-
return Qfalse;
|
100
|
-
if(!is_field_equal("@instance", self, other))
|
63
|
+
if(!is_field_equal("@values", self, other))
|
101
64
|
return Qfalse;
|
102
65
|
if(!is_field_equal("@semantics", self, other))
|
103
66
|
return Qfalse;
|
@@ -230,26 +193,80 @@ static VALUE units(pmUnits pm_units) {
|
|
230
193
|
return units;
|
231
194
|
}
|
232
195
|
|
233
|
-
|
196
|
+
|
197
|
+
static char* get_name_from_instance_id(int instance_id, int maximum_instances, int *instance_ids, char **instance_names) {
|
198
|
+
int i;
|
199
|
+
for(i=0; i<maximum_instances; i++) {
|
200
|
+
if(instance_id == instance_ids[i]) {
|
201
|
+
return instance_names[i];
|
202
|
+
}
|
203
|
+
}
|
204
|
+
return NULL;
|
205
|
+
}
|
206
|
+
|
207
|
+
static VALUE build_metric_values_for_multiple_instances(pmValueSet *pm_value_set, pmDesc pm_desc) {
|
208
|
+
int error, i;
|
209
|
+
int number_of_instances = pm_value_set->numval;
|
210
|
+
int *instances = NULL;
|
211
|
+
char **instance_names = NULL;
|
212
|
+
VALUE result = rb_ary_new2(number_of_instances);
|
213
|
+
|
214
|
+
|
215
|
+
if((error = pmGetInDom(pm_desc.indom, &instances, &instance_names)) < 0) {
|
216
|
+
pcpeasy_raise_from_pmapi_error(error);
|
217
|
+
}
|
218
|
+
|
219
|
+
for(i = 0; i < number_of_instances; i++) {
|
220
|
+
char *instance_name = get_name_from_instance_id(pm_value_set->vlist[i].inst, number_of_instances, instances, instance_names);
|
221
|
+
rb_ary_push(result, pcpeasy_metric_value_new(instance_name, pm_value_set->valfmt, &pm_value_set->vlist[i], pm_desc.type));
|
222
|
+
}
|
223
|
+
|
224
|
+
free(instances);
|
225
|
+
free(instance_names);
|
226
|
+
|
227
|
+
return result;
|
228
|
+
}
|
229
|
+
|
230
|
+
static VALUE build_metrics_values(pmValueSet *pm_value_set, pmDesc pm_desc) {
|
231
|
+
VALUE result = rb_ary_new2(pm_value_set->numval);
|
232
|
+
|
233
|
+
if(pm_value_set->numval > 0) {
|
234
|
+
if (pm_desc.indom != PM_INDOM_NULL) {
|
235
|
+
rb_ary_concat(result, build_metric_values_for_multiple_instances(pm_value_set, pm_desc));
|
236
|
+
} else {
|
237
|
+
return rb_ary_push(result, pcpeasy_metric_value_new(NULL, pm_value_set->valfmt, &pm_value_set->vlist[0], pm_desc.type));
|
238
|
+
}
|
239
|
+
}
|
240
|
+
return result;
|
241
|
+
}
|
242
|
+
|
243
|
+
VALUE pcpeasy_metric_new(char *metric_name, pmValueSet *pm_value_set) {
|
234
244
|
VALUE args[CONSTRUCTOR_ARGS];
|
245
|
+
int error;
|
246
|
+
pmDesc pm_desc;
|
247
|
+
|
248
|
+
/* Find out how to decode the metric */
|
249
|
+
if((error = pmLookupDesc(pm_value_set->pmid, &pm_desc))) {
|
250
|
+
pcpeasy_raise_from_pmapi_error(error);
|
251
|
+
}
|
252
|
+
|
235
253
|
args[0] = rb_tainted_str_new_cstr(metric_name);
|
236
|
-
args[1] =
|
237
|
-
args[2] =
|
238
|
-
args[3] =
|
239
|
-
args[4] =
|
240
|
-
args[5] = units(pm_desc->units);
|
254
|
+
args[1] = build_metrics_values(pm_value_set, pm_desc);
|
255
|
+
args[2] = semantics_symbol(pm_desc.sem);
|
256
|
+
args[3] = type(pm_desc.type);
|
257
|
+
args[4] = units(pm_desc.units);
|
241
258
|
|
242
259
|
return rb_class_new_instance(CONSTRUCTOR_ARGS, args, pcpeasy_metric_class);
|
243
260
|
}
|
244
261
|
|
245
|
-
void pcpeasy_metric_init(VALUE
|
246
|
-
pcpeasy_metric_class = rb_define_class_under(
|
262
|
+
void pcpeasy_metric_init(VALUE rb_cPCPEasy) {
|
263
|
+
pcpeasy_metric_class = rb_define_class_under(rb_cPCPEasy, "Metric", rb_cObject);
|
264
|
+
pcpeasy_metric_value_init(pcpeasy_metric_class);
|
247
265
|
|
248
266
|
rb_define_method(pcpeasy_metric_class, "initialize", initialize, CONSTRUCTOR_ARGS);
|
249
267
|
rb_define_method(pcpeasy_metric_class, "==", equal, 1);
|
250
268
|
rb_define_attr(pcpeasy_metric_class, "name", READ_ONLY);
|
251
|
-
rb_define_attr(pcpeasy_metric_class, "
|
252
|
-
rb_define_attr(pcpeasy_metric_class, "instance", READ_ONLY);
|
269
|
+
rb_define_attr(pcpeasy_metric_class, "values", READ_ONLY);
|
253
270
|
rb_define_attr(pcpeasy_metric_class, "semantics", READ_ONLY);
|
254
271
|
rb_define_attr(pcpeasy_metric_class, "type", READ_ONLY);
|
255
272
|
rb_define_attr(pcpeasy_metric_class, "units", READ_ONLY);
|
data/ext/pcp_easy/metric.h
CHANGED
@@ -22,7 +22,7 @@
|
|
22
22
|
#include <ruby.h>
|
23
23
|
#include <pcp/pmapi.h>
|
24
24
|
|
25
|
-
void pcpeasy_metric_init(VALUE
|
26
|
-
VALUE pcpeasy_metric_new(char *metric_name,
|
25
|
+
void pcpeasy_metric_init(VALUE rb_cPCPEasy);
|
26
|
+
VALUE pcpeasy_metric_new(char *metric_name, pmValueSet *pm_value_set);
|
27
27
|
|
28
28
|
#endif
|
@@ -0,0 +1,102 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) 2016 Ryan Doyle
|
3
|
+
*
|
4
|
+
* This program is free software: you can redistribute it and/or modify
|
5
|
+
* it under the terms of the GNU General Public License as published by
|
6
|
+
* the Free Software Foundation, either version 3 of the License, or
|
7
|
+
* (at your option) any later version.
|
8
|
+
*
|
9
|
+
* This program is distributed in the hope that it will be useful,
|
10
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
* GNU General Public License for more details.
|
13
|
+
*
|
14
|
+
* You should have received a copy of the GNU General Public License
|
15
|
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
16
|
+
*
|
17
|
+
*/
|
18
|
+
|
19
|
+
#include <ruby.h>
|
20
|
+
#include <pcp/pmapi.h>
|
21
|
+
#include "exceptions.h"
|
22
|
+
|
23
|
+
#define CONSTRUCTOR_ARGS 2
|
24
|
+
#define READ_ONLY 1, 0
|
25
|
+
|
26
|
+
|
27
|
+
VALUE easy_metric_value_class;
|
28
|
+
|
29
|
+
|
30
|
+
static VALUE instance_name(char *instance) {
|
31
|
+
if(instance == NULL) {
|
32
|
+
return Qnil;
|
33
|
+
}
|
34
|
+
return rb_tainted_str_new_cstr(instance);
|
35
|
+
}
|
36
|
+
|
37
|
+
static VALUE value(int value_format, pmValue *pm_value, int type) {
|
38
|
+
pmAtomValue pm_atom_value;
|
39
|
+
int error;
|
40
|
+
|
41
|
+
if((error = pmExtractValue(value_format, pm_value, type, &pm_atom_value, type)) < 0) {
|
42
|
+
pcpeasy_raise_from_pmapi_error(error);
|
43
|
+
}
|
44
|
+
|
45
|
+
switch(type) {
|
46
|
+
case PM_TYPE_32:
|
47
|
+
return LONG2NUM(pm_atom_value.l);
|
48
|
+
case PM_TYPE_U32:
|
49
|
+
return ULONG2NUM(pm_atom_value.ul);
|
50
|
+
case PM_TYPE_64:
|
51
|
+
return LL2NUM(pm_atom_value.ll);
|
52
|
+
case PM_TYPE_U64:
|
53
|
+
return ULL2NUM(pm_atom_value.ull);
|
54
|
+
case PM_TYPE_FLOAT:
|
55
|
+
return DBL2NUM(pm_atom_value.f);
|
56
|
+
case PM_TYPE_DOUBLE:
|
57
|
+
return DBL2NUM(pm_atom_value.d);
|
58
|
+
case PM_TYPE_STRING:
|
59
|
+
return rb_tainted_str_new_cstr(pm_atom_value.vbp->vbuf);
|
60
|
+
default:
|
61
|
+
rb_raise(pcpeasy_error, "Metric type %d not supported", type);
|
62
|
+
}
|
63
|
+
}
|
64
|
+
|
65
|
+
static int is_field_equal(const char *name, VALUE self, VALUE other) {
|
66
|
+
return TYPE(rb_funcall(rb_iv_get(self, name), rb_intern("=="), 1, rb_iv_get(other, name))) == T_TRUE;
|
67
|
+
}
|
68
|
+
|
69
|
+
static VALUE initialize(VALUE self, VALUE value, VALUE instance) {
|
70
|
+
rb_iv_set(self, "@value", value);
|
71
|
+
rb_iv_set(self, "@instance", instance);
|
72
|
+
|
73
|
+
return self;
|
74
|
+
}
|
75
|
+
|
76
|
+
static VALUE equal(VALUE self, VALUE other) {
|
77
|
+
if(rb_class_of(other) != easy_metric_value_class)
|
78
|
+
return Qfalse;
|
79
|
+
if(!is_field_equal("@value", self, other))
|
80
|
+
return Qfalse;
|
81
|
+
if(!is_field_equal("@instance", self, other))
|
82
|
+
return Qfalse;
|
83
|
+
|
84
|
+
return Qtrue;
|
85
|
+
}
|
86
|
+
|
87
|
+
VALUE pcpeasy_metric_value_new(char *instance, int value_format, pmValue *pm_value, int type) {
|
88
|
+
VALUE args[CONSTRUCTOR_ARGS];
|
89
|
+
args[0] = value(value_format, pm_value, type);
|
90
|
+
args[1] = instance_name(instance);
|
91
|
+
|
92
|
+
return rb_class_new_instance(CONSTRUCTOR_ARGS, args, easy_metric_value_class);
|
93
|
+
}
|
94
|
+
|
95
|
+
void pcpeasy_metric_value_init(VALUE rb_cPCPEasyMetric) {
|
96
|
+
easy_metric_value_class = rb_define_class_under(rb_cPCPEasyMetric, "Value", rb_cObject);
|
97
|
+
|
98
|
+
rb_define_method(easy_metric_value_class, "initialize", initialize, CONSTRUCTOR_ARGS);
|
99
|
+
rb_define_method(easy_metric_value_class, "==", equal, 1);
|
100
|
+
rb_define_attr(easy_metric_value_class, "value", READ_ONLY);
|
101
|
+
rb_define_attr(easy_metric_value_class, "instance", READ_ONLY);
|
102
|
+
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (C) 2016 Ryan Doyle
|
3
|
+
*
|
4
|
+
* This program is free software: you can redistribute it and/or modify
|
5
|
+
* it under the terms of the GNU General Public License as published by
|
6
|
+
* the Free Software Foundation, either version 3 of the License, or
|
7
|
+
* (at your option) any later version.
|
8
|
+
*
|
9
|
+
* This program is distributed in the hope that it will be useful,
|
10
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
* GNU General Public License for more details.
|
13
|
+
*
|
14
|
+
* You should have received a copy of the GNU General Public License
|
15
|
+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
16
|
+
*
|
17
|
+
*/
|
18
|
+
|
19
|
+
#ifndef PCPEZ_RUBY_METRIC_VALUE_H
|
20
|
+
#define PCPEZ_RUBY_METRIC_VALUE_H 1
|
21
|
+
|
22
|
+
#include <ruby.h>
|
23
|
+
#include <pcp/pmapi.h>
|
24
|
+
|
25
|
+
VALUE pcpeasy_metric_value_new(char *instance_name, int value_format, pmValue *pm_value, int type);
|
26
|
+
void pcpeasy_metric_value_init(VALUE rb_cPCPEasyMetric);
|
27
|
+
|
28
|
+
#endif
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pcp_easy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Doyle
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-04-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: yard
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
description:
|
42
56
|
email:
|
43
57
|
executables: []
|
@@ -52,6 +66,8 @@ files:
|
|
52
66
|
- ext/pcp_easy/extconf.rb
|
53
67
|
- ext/pcp_easy/metric.c
|
54
68
|
- ext/pcp_easy/metric.h
|
69
|
+
- ext/pcp_easy/metric_value.c
|
70
|
+
- ext/pcp_easy/metric_value.h
|
55
71
|
- ext/pcp_easy/pcp_easy.c
|
56
72
|
homepage:
|
57
73
|
licenses: []
|
@@ -77,3 +93,4 @@ signing_key:
|
|
77
93
|
specification_version: 4
|
78
94
|
summary: Simple query interface for Performance Co-Pilot
|
79
95
|
test_files: []
|
96
|
+
has_rdoc:
|